<commit_before>package org.parisoft.noop.generator.mapper

import org.parisoft.noop.generator.AllocContext
import com.google.inject.Inject
import org.parisoft.noop.^extension.Classes
import org.parisoft.noop.^extension.Members
import org.parisoft.noop.^extension.Statements
import org.parisoft.noop.^extension.Collections
import org.parisoft.noop.^extension.Expressions
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.parisoft.noop.generator.CompileContext

class Mmc3 extends Mapper {

	@Inject extension Classes
	@Inject extension Members
	@Inject extension Statements
	@Inject extension Collections
	@Inject extension Expressions
	@Inject extension IQualifiedNameProvider

	override compile(AllocContext ctx) '''
		«val inesPrg = ctx.constants.values.findFirst[INesPrg]?.valueOf as Integer ?: 32»
		«val inesChr = ctx.constants.values.findFirst[INesChr]?.valueOf as Integer ?: 32»
		«val prgBanks = inesPrg / 8 - 1»
		«val chrBanks = inesChr / 8»
		«val fixedBank = prgBanks - 1»
		«FOR bank : 0 ..< prgBanks»
			;----------------------------------------------------------------
			; PRG-ROM Bank #«bank»«IF bank >= fixedBank» FIXED«ENDIF»
			;----------------------------------------------------------------
				.base «IF bank == fixedBank»$C000«ELSEIF bank % 2 != 0»$A000«ELSE»$8000«ENDIF» 
			
			«FOR rom : ctx.prgRoms.values.filter[nonDMC].filter[(storageOf ?: fixedBank) == bank]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
			«IF ctx.methods.values.exists[objectSize] && ctx.constructors.size > 0 && bank == fixedBank»
				Object.$sizes:
					.db «ctx.constructors.values.sortBy[type.name].map[type.rawSizeOf].join(', ', [toHexString])»
			«ENDIF»
			«val methods = ctx.methods.values.filter[(storageOf ?: fixedBank) == bank].sortBy[fullyQualifiedName]»
			«IF methods.isNotEmpty»
				«noop»
				
				;-- Methods -----------------------------------------------------
				«FOR method : methods»
					«method.compile(new CompileContext => [allocation = ctx])»
					
				«ENDFOR»
			«ENDIF»
			«IF bank == fixedBank»
				«val constructors = ctx.constructors.values.sortBy[type.name]»
				«IF constructors.isNotEmpty»
					;-- Constructors ------------------------------------------------
					«FOR constructor : constructors»
						«constructor.compile(null)»
						
					«ENDFOR»
				«ENDIF»
			«ENDIF»
			«val dmcList = ctx.prgRoms.values.filter[DMC].filter[(storageOf ?: fixedBank) == bank].toList»
			«IF dmcList.isNotEmpty»
				;-- DMC sound data-----------------------------------------------
					.org «Members::FT_DPCM_OFF»
				«FOR dmcRom : dmcList»
					«dmcRom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
			«noop»
				«IF bank != fixedBank && bank % 2 != 0»
					.org $C000
				«ELSEIF bank != fixedBank»
					.org $A000
				«ENDIF»
		«ENDFOR»
		
		;----------------------------------------------------------------
		; Interrupt vectors
		;----------------------------------------------------------------
			.org $FFFA     
		
		 	.dw «ctx.methods.values.findFirst[nmi]?.nameOf ?: 0»
		 	.dw «ctx.methods.values.findFirst[reset]?.nameOf ?: 0»
		 	.dw «ctx.methods.values.findFirst[irq]?.nameOf ?: 0»
		
		«FOR bank : 0 ..< chrBanks»
			;----------------------------------------------------------------
			; CHR-ROM bank #«bank * 6»
			;----------------------------------------------------------------
				.base $0000
			«FOR rom : ctx.chrRoms.values.filter[(storageOf ?: 0) == bank * 6]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
			;----------------------------------------------------------------
			; CHR-ROM bank #«bank * 6 + 1»
			;----------------------------------------------------------------
				.base $0800
			«FOR rom : ctx.chrRoms.values.filter[(storageOf ?: 0) == bank * 6 + 1]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
			;----------------------------------------------------------------
			; CHR-ROM bank #«bank * 6 + 2»
			;----------------------------------------------------------------
				.base $1000
			«FOR rom : ctx.chrRoms.values.filter[(storageOf ?: 0) == bank * 6 + 2]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
			;----------------------------------------------------------------
			; CHR-ROM bank #«bank * 6 + 3»
			;----------------------------------------------------------------
				.base $1400
			«FOR rom : ctx.chrRoms.values.filter[(storageOf ?: 0) == bank * 6 + 3]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
			;----------------------------------------------------------------
			; CHR-ROM bank #«bank * 6 + 4»
			;----------------------------------------------------------------
				.base $1800
			«FOR rom : ctx.chrRoms.values.filter[(storageOf ?: 0) == bank * 6 + 4]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
			;----------------------------------------------------------------
			; CHR-ROM bank #«bank * 6 + 5»
			;----------------------------------------------------------------
				.base $1C00
			«FOR rom : ctx.chrRoms.values.filter[(storageOf ?: 0) == bank * 6 + 5]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
		«ENDFOR»
	'''
<commit_msg>compile - mmc3<commit_after>package org.parisoft.noop.generator.mapper

import org.parisoft.noop.generator.AllocContext
import com.google.inject.Inject
import org.parisoft.noop.^extension.Classes
import org.parisoft.noop.^extension.Members
import org.parisoft.noop.^extension.Statements
import org.parisoft.noop.^extension.Collections
import org.parisoft.noop.^extension.Expressions
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.parisoft.noop.generator.CompileContext

class Mmc3 extends Mapper {

	@Inject extension Classes
	@Inject extension Members
	@Inject extension Statements
	@Inject extension Collections
	@Inject extension Expressions
	@Inject extension IQualifiedNameProvider

	override compile(AllocContext ctx) '''
		«val inesPrg = ctx.constants.values.findFirst[INesPrg]?.valueOf as Integer ?: 32»
		«val inesChr = ctx.constants.values.findFirst[INesChr]?.valueOf as Integer ?: 32»
		«val prgBanks = inesPrg / 8 - 1»
		«val chrBanks = inesChr / 8»
		«val fixedBank = prgBanks - 1»
		«FOR bank : 0 ..< prgBanks»
			;----------------------------------------------------------------
			; PRG-ROM Bank #«bank»«IF bank >= fixedBank» FIXED«ENDIF»
			;----------------------------------------------------------------
				.base «IF bank == fixedBank»$C000«ELSEIF bank % 2 != 0»$A000«ELSE»$8000«ENDIF» 
			
			«FOR rom : ctx.prgRoms.values.filter[nonDMC].filter[(storageOf ?: fixedBank) == bank]»
				«rom.compile(new CompileContext)»
			«ENDFOR»
			«IF ctx.methods.values.exists[objectSize] && ctx.constructors.size > 0 && bank == fixedBank»
				Object.$sizes:
					.db «ctx.constructors.values.sortBy[type.name].map[type.rawSizeOf].join(', ', [toHexString])»
			«ENDIF»
			«val methods = ctx.methods.values.filter[(storageOf ?: fixedBank) == bank].sortBy[fullyQualifiedName]»
			«IF methods.isNotEmpty»
				«noop»
				
				;-- Methods -----------------------------------------------------
				«FOR method : methods»
					«method.compile(new CompileContext => [allocation = ctx])»
					
				«ENDFOR»
			«ENDIF»
			«IF bank == fixedBank»
				«val constructors = ctx.constructors.values.sortBy[type.name]»
				«IF constructors.isNotEmpty»
					;-- Constructors ------------------------------------------------
					«FOR constructor : constructors»
						«constructor.compile(null)»
						
					«ENDFOR»
				«ENDIF»
			«ENDIF»
			«val dmcList = ctx.prgRoms.values.filter[DMC].filter[(storageOf ?: fixedBank) == bank].toList»
			«IF dmcList.isNotEmpty»
				;-- DMC sound data-----------------------------------------------
					.org «Members::FT_DPCM_OFF»
				«FOR dmcRom : dmcList»
					«dmcRom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
			«noop»
				«IF bank != fixedBank && bank % 2 != 0»
					.org $C000
				«ELSEIF bank != fixedBank»
					.org $A000
				«ENDIF»
		«ENDFOR»
		
		;----------------------------------------------------------------
		; Interrupt vectors
		;----------------------------------------------------------------
			.org $FFFA     
		
		 	.dw «ctx.methods.values.findFirst[nmi]?.nameOf ?: 0»
		 	.dw «ctx.methods.values.findFirst[reset]?.nameOf ?: 0»
		 	.dw «ctx.methods.values.findFirst[irq]?.nameOf ?: 0»
		
		«FOR bank : 0 ..< chrBanks»
			«val bank0 = bank * 8»
			«var roms = ctx.chrRoms.values.filter[(storageOf ?: 0) == bank0]»
			«IF roms.isNotEmpty»
				;----------------------------------------------------------------
				; CHR-ROM bank #«bank0»
				;----------------------------------------------------------------
					.base $0000
				«FOR rom : roms»
					«rom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
			«val bank2 = bank0 + 2»
			«IF (roms = ctx.chrRoms.values.filter[(storageOf ?: 0) == bank2]).isNotEmpty»
				;----------------------------------------------------------------
				; CHR-ROM bank #«bank2»
				;----------------------------------------------------------------
					.base $0800
				«FOR rom : roms»
					«rom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
			«val bank4 = bank2 + 2»
			«IF (roms = ctx.chrRoms.values.filter[(storageOf ?: 0) == bank4]).isNotEmpty»
				;----------------------------------------------------------------
				; CHR-ROM bank #«bank4»
				;----------------------------------------------------------------
					.base $1000
				«FOR rom : roms»
					«rom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
			«val bank5 = bank4 + 1»
			«IF (roms = ctx.chrRoms.values.filter[(storageOf ?: 0) == bank5]).isNotEmpty»
				;----------------------------------------------------------------
				; CHR-ROM bank #«bank5»
				;----------------------------------------------------------------
					.base $1400
				«FOR rom : roms»
					«rom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
			«val bank6 = bank5 + 1»
			«IF (roms = ctx.chrRoms.values.filter[(storageOf ?: 0) == bank6]).isNotEmpty»
				;----------------------------------------------------------------
				; CHR-ROM bank #«bank6»
				;----------------------------------------------------------------
					.base $1800
				«FOR rom : roms»
					«rom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
			«val bank7 = bank6 + 1»
			«IF (roms = ctx.chrRoms.values.filter[(storageOf ?: 0) == bank7]).isNotEmpty»
				;----------------------------------------------------------------
				; CHR-ROM bank #«bank7»
				;----------------------------------------------------------------
					.base $1C00
				«FOR rom : roms»
					«rom.compile(new CompileContext)»
				«ENDFOR»
			«ENDIF»
		«ENDFOR»
	'''

{'fraction_non_alphanumeric': 0.33853575482406356, 'fraction_numerical': 0.0170261066969353, 'mean_word_length': 1.4067835192351468, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '16511', 'n_tokens_mistral': 3917, 'n_tokens_neox': 3142, 'n_words': 969}