mads 2.1.0
Source: source/SuperKernel/main.xasm
     1 				;	Altirra - Atari 800/800XL/5200 emulator
     2 				;	5200 OS ROM replacement
     3 				;	Copyright (C) 2008-2010 Avery Lee
     4 				;
     5 				;	Copying and distribution of this file, with or without modification,
     6 				;	are permitted in any medium without royalty provided the copyright
     7 				;	notice and this notice are preserved.  This file is offered as-is,
     8 				;	without any warranty.
     9
    10 						opt		h-o+f+
    11
    12 						icl		'includes.xasm'
Source: source/SuperKernel/includes.xasm
     1 				;	Altirra - Atari 800/800XL/5200 emulator
     2 				;	5200 OS ROM replacement
     3 				;	Copyright (C) 2008-2016 Avery Lee
     4 				;
     5 				;	Copying and distribution of this file, with or without modification,
     6 				;	are permitted in any medium without royalty provided the copyright
     7 				;	notice and this notice are preserved.  This file is offered as-is,
     8 				;	without any warranty.
     9
    10 = C010			trig0	equ	$c010
    11 = C011			trig1	equ	$c011
    12 = C012			trig2	equ	$c012
    13 = C012			colpm0	equ	$c012
    14 = C013			trig3	equ	$c013
    15 = C013			colpm1	equ	$c013
    16 = C014			colpm2	equ	$c014
    17 = C015			colpm3	equ	$c015
    18 = C016			colpf0	equ	$c016
    19 = C017			colpf1	equ	$c017
    20 = C018			colpf2	equ	$c018
    21 = C019			colpf3	equ	$c019
    22 = C01A			colbk	equ	$c01a
    23 = C01B			prior	equ	$c01b
    24 = C01F			consol	equ	$c01f
    25 = E800			pot0	equ	$e800
    26 = E800			audf1	equ	$e800
    27 = E801			pot1	equ	$e801
    28 = E801			audc1	equ	$e801
    29 = E802			pot2	equ	$e802
    30 = E802			audf2	equ	$e802
    31 = E803			pot3	equ	$e803
    32 = E803			audc2	equ	$e803
    33 = E804			pot4	equ	$e804
    34 = E804			audf3	equ	$e804
    35 = E805			pot5	equ	$e805
    36 = E805			audc3	equ	$e805
    37 = E806			pot6	equ	$e806
    38 = E806			audf4	equ	$e806
    39 = E807			pot7	equ	$e807
    40 = E807			audc4	equ	$e807
    41 = E808			audctl	equ	$e808
    42 = E809			kbcode	equ	$e809
    43 = E80A			skres	equ	$e80a
    44 = E80B			potgo	equ	$e80b
    45 = E80D			serin	equ	$e80d
    46 = E80D			serout	equ	$e80d
    47 = E80E			irqen	equ	$e80e
    48 = E80E			irqst	equ	$e80e
    49 = E80F			skctl	equ	$e80f
    50 = D400			dmactl	equ	$d400
    51 = D401			chactl	equ	$d401
    52 = D402			dlistl	equ	$d402
    53 = D403			dlisth	equ	$d403
    54 = D404			hscrol	equ	$d404
    55 = D405			vscrol	equ	$d405
    56 = D409			chbase	equ	$d409
    57 = D40A			wsync	equ	$d40a
    58 = D40E			nmien	equ	$d40e
    59 = D40F			nmist	equ	$d40f
    60 = D40F			nmires	equ	$d40f
    61
    62 = 0000			pokmsk	equ		$00
    63 = 0001			rtclok	equ		$01
    64 				;		equ		$02
    65 = 0003			critic	equ		$03
    66 = 0004			atract	equ		$04
    67 = 0005			sdlstl	equ		$05
    68 = 0006			sdlsth	equ		$06
    69 = 0007			sdmctl	equ		$07
    70 = 0008			pcolr0	equ		$08
    71 = 0009			pcolr1	equ		$09
    72 = 000A			pcolr2	equ		$0a
    73 = 000B			pcolr3	equ		$0b
    74 = 000C			color0	equ		$0c
    75 = 000D			color1	equ		$0d
    76 = 000E			color2	equ		$0e
    77 = 000F			color3	equ		$0f
    78 = 0010			color4	equ		$10
    79 = 0011			paddl0	equ		$11
    80 = 0012			paddl1	equ		$12
    81 = 0013			paddl2	equ		$13
    82 = 0014			paddl3	equ		$14
    83 = 0015			paddl4	equ		$15
    84 = 0016			paddl5	equ		$16
    85 = 0017			paddl6	equ		$17
    86 = 0018			paddl7	equ		$18
    87 				 
    88 = 0200			vimirq	equ		$0200		;IRQ immediate vector
    89 = 0202			vvblki	equ		$0202		;VBI immediate vector
    90 = 0204			vvblkd	equ		$0204		;VBI deferred vector
    91 = 0206			vdslst	equ		$0206		;display list vector
    92 = 0208			vkybdi	equ		$0208		;keyboard immediate vector
    93 = 020A			vkybdf	equ		$020a		;keyboard deferred vector
    94 = 020C			vtrigr	equ		$020c		;soft-trigger vector (BREAK key)
    95 = 020E			vbrkop	equ		$020e		;BRK opcode vector
    96 = 0210			vserin	equ		$0210		;serial input ready vector
    97 = 0212			vseror	equ		$0212		;serial output ready vector
    98 = 0214			vseroc	equ		$0214		;serial output complete vector
    99 = 0216			vtimr1	equ		$0216		;POKEY timer #1 vector
   100 = 0218			vtimr2	equ		$0218		;POKEY timer #2 vector
   101 = 021A			vtimr4	equ		$021a		;POKEY timer #4 vector
   102
   103 = 021E			jveck	equ		$021e
    13
    14 						org		$f800
    15 F800 00 00 00 00 00 00 + 		ins		'atarifont.bin',$0,$400
    16
    17 				;=========================================================================
    18 FC00			.proc	irq
    19 FC00 6C 00 02				jmp		(vimirq)
    20 				.endp
    21
    22 				;=========================================================================
    23 				;Must be at $FC03 for Montezuma's Revenge to work.
    24 FC03					org		$fc03
    25 FC03			.proc	sysirq
    26 FC03 48					pha
    27 						
    28 						;We test interrupts in this order:
    29 						;	20 -> VSERIN
    30 						;	80 -> VTRIGR
    31 						;	40 -> VKYBDI
    32 						;	10 -> VSEROR
    33 						;	08 -> VSEROC
    34 						;	01 -> VTIMR1
    35 						;	02 -> VTIMR2
    36 						;	04 -> VTIMR4
    37 						;	VBRKOP
    38 						;
    39 						;Note that there is a complication with VSEROC, since it is not
    40 						;masked by POKEY. We must only dispatch it if it is enabled in
    41 						;POKMSK.
    42 FC04 A9 20				lda		#$20
    43 FC06 2C 0E E8				bit		irqst
    44 FC09 D0 0D				bne		not_serin
    45 FC0B 45 00				eor		pokmsk
    46 FC0D 8D 0E E8				sta		irqen
    47 FC10 A5 00				lda		pokmsk
    48 FC12 8D 0E E8				sta		irqen
    49 FC15 6C 10 02				jmp		(vserin)
    50 FC18			not_serin:
    51 FC18 30 0F				bmi		not_trigr
    52 FC1A A9 80				lda		#$80
    53 FC1C 45 00				eor		pokmsk
    54 FC1E 8D 0E E8				sta		irqen
    55 FC21 A5 00				lda		pokmsk
    56 FC23 8D 0E E8				sta		irqen
    57 FC26 6C 0C 02				jmp		(vtrigr)
    58 FC29			not_trigr:
    59 FC29 70 0F				bvs		not_kybd
    60 FC2B A9 40				lda		#$40
    61 FC2D 45 00				eor		pokmsk
    62 FC2F 8D 0E E8				sta		irqen
    63 FC32 A5 00				lda		pokmsk
    64 FC34 8D 0E E8				sta		irqen
    65 FC37 6C 08 02				jmp		(vkybdi)
    66 FC3A			not_kybd:
    67 FC3A 6A					ror
    68 FC3B 2C 0E E8				bit		irqen
    69 FC3E F0 0D				beq		not_seror
    70 FC40 45 00				eor		pokmsk
    71 FC42 8D 0E E8				sta		irqen
    72 FC45 A5 00				lda		pokmsk
    73 FC47 8D 0E E8				sta		irqen
    74 FC4A 6C 12 02				jmp		(vseror)
    75 FC4D			not_seror:
    76 FC4D 6A					ror
    77 FC4E 24 00				bit		pokmsk
    78 FC50 F0 12				beq		not_seroc
    79 FC52 2C 0E E8				bit		irqen
    80 FC55 D0 0D				bne		not_seroc
    81 FC57 45 00				eor		pokmsk
    82 FC59 8D 0E E8				sta		irqen
    83 FC5C A5 00				lda		pokmsk
    84 FC5E 8D 0E E8				sta		irqen
    85 FC61 6C 14 02				jmp		(vseroc)
    86 FC64			not_seroc:
    87 FC64 A9 01				lda		#$01
    88 FC66 2C 0E E8				bit		irqst
    89 FC69 D0 0D				bne		not_timr1
    90 FC6B 45 00				eor		pokmsk
    91 FC6D 8D 0E E8				sta		irqen
    92 FC70 A5 00				lda		pokmsk
    93 FC72 8D 0E E8				sta		irqen
    94 FC75 6C 16 02				jmp		(vtimr1)
    95 FC78			not_timr1:
    96 FC78 2A					rol
    97 FC79 2C 0E E8				bit		irqst
    98 FC7C D0 0D				bne		not_timr2
    99 FC7E 45 00				eor		pokmsk
   100 FC80 8D 0E E8				sta		irqen
   101 FC83 A5 00				lda		pokmsk
   102 FC85 8D 0E E8				sta		irqen
   103 FC88 6C 18 02				jmp		(vtimr2)
   104 FC8B			not_timr2:
   105 FC8B 2A					rol
   106 FC8C 2C 0E E8				bit		irqst
   107 FC8F D0 0D				bne		not_timr4
   108 FC91 45 00				eor		pokmsk
   109 FC93 8D 0E E8				sta		irqen
   110 FC96 A5 00				lda		pokmsk
   111 FC98 8D 0E E8				sta		irqen
   112 FC9B 6C 1A 02				jmp		(vtimr4)
   113 FC9E			not_timr4:
   114 FC9E 8A					txa
   115 FC9F 48					pha
   116 FCA0 BA					tsx
   117 FCA1 BD 01 01				lda		$0101,x
   118 FCA4 29 10				and		#$10
   119 FCA6 D0 03				bne		wtf
   120 FCA8 6C 0E 02				jmp		(vbrkop)
   121 FCAB			wtf:
   122 FCAB 68					pla
   123 FCAC AA					tax
   124 FCAD 68					pla
   125 FCAE 40					rti
   126 				.endp
   127
   128 				;=========================================================================
   129 				;Must be at $FCB2 for Congo Bongo to work (grrr... damn SEGA)
   130 FCAF					org		$fcb2
   131 FCB2			.proc	xitvbl
   132 FCB2 68					pla
   133 FCB3 A8					tay
   134 FCB4 68					pla
   135 FCB5 AA					tax
   136 FCB6 68					pla
   137 FCB7 40					rti
   138 				.endp
   139
   140 				;=========================================================================
   141 				;Must be at $FCB8 for Montezuma's Revenge to work.
   142 FCB8					org		$fcb8
   143 FCB8			.proc	sysvbl
   144 FCB8 48					pha
   145 FCB9 8A					txa
   146 FCBA 48					pha
   147 FCBB 98					tya
   148 FCBC 48					pha
   149 						
   150 FCBD E6 02				inc		rtclok+1
   151 FCBF D0 08				bne		rtnocarry
   152 FCC1 E6 01				inc		rtclok
   153 FCC3 A5 04				lda		atract
   154 FCC5 30 02				bmi		rtnocarry
   155 FCC7 E6 04				inc		atract
   156 FCC9			rtnocarry:
   157
   158 FCC9 A5 03				lda		critic
   159 FCCB D0 E5				bne		xitvbl
   160
   161 FCCD A5 05 8D 02 D4			mva		sdlstl	dlistl
   162 FCD2 A5 06 8D 03 D4			mva		sdlsth	dlisth
   163 FCD7 A5 07 8D 00 D4			mva		sdmctl	dmactl
   164
   165 						;copy and attract colors
   166 FCDC A0 00				ldy		#0
   167 FCDE 24 04				bit		atract
   168 FCE0 10 02 A4 01				spl:ldy	rtclok
   169 						
   170 FCE4 A2 08				ldx		#8
   171 FCE6			colorloop:
   172 FCE6 98					tya
   173 FCE7 55 08				eor		pcolr0,x
   174 FCE9 9D 12 C0				sta		colpm0,x
   175 FCEC CA					dex
   176 FCED 10 F7				bpl		colorloop
   177 						
   178 						;update pots
   179 FCEF A2 07				ldx		#7
   180 FCF1			potloop:
   181 FCF1 BD 00 E8				lda		pot0,x
   182 FCF4 95 11				sta		paddl0,x
   183 FCF6 CA					dex
   184 FCF7 10 F8				bpl		potloop
   185 FCF9 8D 0B E8				sta		potgo
   186 						
   187 						;run deferred
   188 FCFC 6C 04 02				jmp		(vvblkd)
   189 				.endp
   190
   191 				;=========================================================================
   192 				; System keyboard handler
   193 				;
   194 				; MUST be at $FD02 for Blueprint to work.
   195 				;
   196 FCFF					org		$fd02
   197 FD02			.proc	syskbd
   198 FD02 8A					txa
   199 FD03 48					pha
   200 FD04 98					tya
   201 FD05 48					pha
   202 FD06 AD 09 E8				lda		kbcode
   203 FD09 4A					lsr
   204 FD0A 29 0F				and		#$0f
   205 FD0C AA					tax
   206 FD0D BD 13 FD				lda		keytable,x
   207 FD10 6C 0A 02				jmp		(vkybdf)
   208 				.endp
   209
   210 				;=========================================================================
   211 				;Keyboard translation table
   212 				;
   213 				;MUST be at $FD13 for Congo Bongo to work.
   214 				;
   215 FD13					org		$fd13
   216 FD13			keytable:
   217 FD13 FF 0B 00 0A 0E 09 + 		dta		$ff,$0b,$00,$0a,$0e,$09,$08,$07,$0d,$06,$05,$04,$0c,$03,$02,$01
   218
   219 				;=========================================================================
   220 				; NMI handler
   221 				;
   222 FD23			.proc	nmi
   223 FD23 2C 0F D4				bit		nmist
   224 						
   225 						;This is pretty useless, but the stock 5200 OS does it, and it
   226 						;affects DLI timing -- in particular, it can cause DLIs ported
   227 						;from the 400/800 OS to fail.
   228 FD26 8D 0F D4				sta		nmires
   229 						
   230 FD29 10 03 6C 06 02			spl:jmp	(vdslst)
   231 FD2E 6C 02 02				jmp		(vvblki)
   232 				.endp
   233
   234 				;=========================================================================
   235 				; RESET handler
   236 				;
   237 FD31			.proc	reset
   238 						;initialize CPU
   239 FD31 78					sei
   240 FD32 D8					cld
   241 FD33 A2 FF				ldx		#$ff
   242 FD35 9A					txs
   243 						
   244 						;check for diagnostic cartridge
   245 FD36 AD FD BF				lda		$bffd
   246 FD39 C9 FF				cmp		#$ff
   247 FD3B D0 03				bne		notdiag
   248 FD3D 6C FE BF				jmp		($bffe)
   249 FD40			notdiag:
   250
   251 						;zero hardware registers and page zero
   252 FD40 A2 00				ldx		#0
   253 FD42 A9 00				lda		#0
   254 FD44			zeroloop:
   255 FD44 95 00				sta		$00,x
   256 FD46 9D 00 C0				sta		$c000,x
   257 FD49 9D 00 D4				sta		$d400,x
   258 FD4C 9D 00 E8				sta		$e800,x
   259 FD4F E8					inx
   260 FD50 D0 F2				bne		zeroloop
   261 						
   262 						;init hardware display
   263 FD52 A9 F8 8D 09 D4			mva		#$f8 chbase
   264 						
   265 						;initialize vectors
   266 FD57 A2 0B				ldx		#$0b
   267 FD59			vecloop:
   268 FD59 BD 95 FE				lda		irqtable,x
   269 FD5C 9D 00 02				sta		$0200,x
   270 FD5F CA					dex
   271 FD60 10 F7				bpl		vecloop
   272 						
   273 						;set up default display
   274 FD62 A2 4F				ldx		#79
   275 FD64			pfcopyloop:
   276 FD64 BD CD FD				lda		playfield,x
   277 FD67 9D 00 10				sta		$1000,x
   278 FD6A CA					dex
   279 FD6B 10 F7				bpl		pfcopyloop
   280 						
   281 FD6D A2 13				ldx		#19
   282 FD6F			namecopyloop:
   283 FD6F BD E8 BF				lda		$bfe8,x
   284 FD72 9D 50 10				sta		$1050,x
   285 FD75 CA					dex
   286 FD76 10 F7				bpl		namecopyloop
   287 						
   288 						;PF0 is the flashing color, while PF1 is white. PF2 and PF3 are black.
   289 						;In fact, PF3 must be black in order for the Defender title to appear
   290 						;properly.
   291 FD78 A9 10 85 0C				mva		#$10 color0
   292 FD7C A9 0F 85 0D				mva		#$0F color1
   293 FD80 A9 00 85 0E				mva		#$00 color2
   294 FD84 A9 00 85 0F				mva		#$00 color3
   295 FD88 A9 00 85 10				mva		#$00 color4
   296 FD8C A9 04 8D 1B C0			mva		#$04 prior
   297 						
   298 						;move display list; must be at $2000 for Miniature Golf to work
   299 FD91 A2 0A				ldx		#playfield-dlist-1
   300 FD93			dlcopy:
   301 FD93 BD C2 FD				lda		dlist,x
   302 FD96 9D 00 20				sta		$2000,x
   303 FD99 CA					dex
   304 FD9A 10 F7				bpl		dlcopy
   305 						
   306 FD9C A9 22 85 07				mva		#$22 sdmctl
   307 FDA0 A9 C0 8D 0E D4			mva		#$c0 nmien
   308 FDA5 A9 00 85 05 A9 20 + 		mwa		#$2000 sdlstl
   309 						
   310 						;enable key input
   311 FDAD A9 02 8D 0F E8			mva		#$02 skctl
   312 FDB2 A9 C0				lda		#$c0
   313 FDB4 85 00				sta		pokmsk
   314 FDB6 8D 0E E8				sta		irqen
   315 						
   316 						;wait two seconds (four is too long)
   317 FDB9 A9 78				lda		#120
   318 FDBB C5 02 D0 FC				cmp:rne	rtclok+1
   319 						
   320 						;invoke cartridge
   321 FDBF 6C FE BF				jmp		($bffe)
   322 						
   323 FDC2			dlist:
   324 FDC2 70					dta		$70
   325 FDC3 70					dta		$70
   326 FDC4 70					dta		$70
   327 FDC5 42 00 10				dta		$42,a($1000)
   328 FDC8 82					dta		$82
   329 FDC9 07					dta		$07
   330 FDCA 41 C2 FD				dta		$41,a(dlist)
   331 						
   332 FDCD			playfield:
   333 				;				  0123456789012345678901234567890123456789
   334 FDCD 21 6C 74 69 72 72 + 		dta		d"Altirra 5200 ROM Kernel                 "
   335 FDF5 2E 6F 77 00 70 6C + 		dta		d"Now playing:                            "
   336 				.endp
   337
   338 				;=========================================================================
   339 				; Default IRQ table
   340 				;
   341 				; MUST be at $FE95 for Pitfall! to work.
   342 				;
   343 FE1D					org		$fe95
   344 FE95			irqtable:
   345 FE95 03 FC				dta		a(sysirq)	;vimirq = $fc03
   346 FE97 B8 FC				dta		a(sysvbl)	;vvblki = $fcb8
   347 FE99 B2 FC				dta		a(xitvbl)	;vvblkd
   348 FE9B A1 FE				dta		a(sysdli)	;vdslst = $fea1
   349 FE9D 02 FD				dta		a(syskbd)	;vkybdi
   350 FE9F B2 FC				dta		a(xitvbl)	;vkybdf
   351
   352 				;=========================================================================
   353 				;Must be at $FEA1 for A.E.
   354 FEA1					org		$fea1
   355 FEA1			.proc	sysdli
   356 FEA1 48					pha
   357 						
   358 						;cycle color PF0, but avoid going through grayscales
   359 FEA2 E6 0C				inc		color0
   360 FEA4 D0 04				bne		noroll
   361 FEA6 A9 10				lda		#$10
   362 FEA8 85 0C				sta		color0
   363 FEAA			noroll:
   364 FEAA 68					pla
   365 FEAB 40					rti
   366 				.endp
   367
   368 				;=========================================================================
   369
   370 FEAC					org		$fffa
   371 FFFA 23 FD				dta		a(nmi)
   372 FFFC 31 FD				dta		a(reset)
   373 FFFE 00 FC				dta		a(irq)
