; ; Disassembly of CD System card - bank 0 ; e000: 4c f3 e0 JMP $e0f3 ; CD_BOOT e003: 4c e3 e8 JMP $e8e3 ; CD_RESET e006: 4c 8f eb JMP $eb8f ; CD_BASE e009: 4c 05 ec JMP $ec05 ; CD_READ e00c: 4c cb ed JMP $edcb ; CD_SEEK e00f: 4c ec eb JMP $ebec ; CD_EXEC e012: 4c 10 ee JMP $ee10 ; CD_PLAY e015: 4c 34 ef JMP $ef34 ; CD_SEARCH e018: 4c 94 ef JMP $ef94 ; CD_PAUSE e01b: 4c 47 f3 JMP $f347 ; CD_STAT e01e: 4c bf ef JMP $efbf ; CD_SUBQ e021: 4c f1 ef JMP $eff1 ; CD_DINFO e024: 4c a9 f0 JMP $f0a9 ; CD_CONTNTS e027: 4c 54 f3 JMP $f354 ; CD_SUBRD e02a: 4c 64 f3 JMP $f364 ; CD_PCMRD e02d: 4c 79 f3 JMP $f379 ; CD_FADE e030: 4c 7f f3 JMP $f37f ; AD_RESET e033: 4c 93 f3 JMP $f393 ; AD_TRANS e036: 4c 07 f4 JMP $f407 ; AD_READ e039: 4c d8 f4 JMP $f4d8 ; AD_WRITE e03c: 4c c6 f5 JMP $f5c6 ; AD_PLAY e03f: 4c 1f f6 JMP $f61f ; AD_CPLAY e042: 4c c1 f6 JMP $f6c1 ; AD_STOP e045: 4c db f6 JMP $f6db ; AD_STAT e048: 4c 58 f8 JMP $f858 ; BM_FORMAT e04b: 4c b8 f8 JMP $f8b8 ; BM_FREE e04e: 4c e3 f8 JMP $f8e3 ; BM_READ e051: 4c 55 f9 JMP $f955 ; BM_WRITE e054: 4c 1a fa JMP $fa1a ; BM_DELETE e057: 4c 72 fa JMP $fa72 ; BM_FILES e05a: 4c 2d f0 JMP $f02d ; EX_GETVER e05d: 4c 34 f0 JMP $f034 ; EX_SETVEC e060: 4c 24 f1 JMP $f124 ; EX_GETFNT e063: 4c 9a e4 JMP $e49a ; EX_JOYSNS e066: 4c 75 e1 JMP $e175 ; EX_JOYREP e069: 4c 67 e2 JMP $e267 ; EX_SCRSIZ e06c: 4c 72 e2 JMP $e272 ; EX_DOTMOD e06f: 4c 9d e2 JMP $e29d ; EX_SCRMOD e072: 4c 82 e3 JMP $e382 ; EX_IMODE e075: 4c 91 e3 JMP $e391 ; EX_VMODE e078: 4c a4 e3 JMP $e3a4 ; EX_HMODE e07b: 4c b5 e3 JMP $e3b5 ; EX_VSYNC e07e: 4c c7 e3 JMP $e3c7 ; EX_RCRON e081: 4c cb e3 JMP $e3cb ; EX_RCROFF e084: 4c cf e3 JMP $e3cf ; EX_IRQON e087: 4c d3 e3 JMP $e3d3 ; EX_IRQOFF e08a: 4c e2 e3 JMP $e3e2 ; EX_BGON e08d: 4c e5 e3 JMP $e3e5 ; EX_BGOFF e090: 4c e8 e3 JMP $e3e8 ; EX_SPRON e093: 4c eb e3 JMP $e3eb ; EX_SPROFF e096: 4c ee e3 JMP $e3ee ; EX_DSPON e099: 4c f3 e3 JMP $e3f3 ; EX_DSPOFF e09c: 4c f8 e3 JMP $e3f8 ; EX_DMAMOD e09f: 4c 0b e4 JMP $e40b ; EX_SPRDMA e0a2: 4c da e5 JMP $e5da ; EX_SATCLR e0a5: 4c 3c e6 JMP $e63c ; EX_SPRPUT e0a8: 4c 1f e4 JMP $e41f ; EX_SETRCR e0ab: 4c 2f e4 JMP $e42f ; EX_SETRED e0ae: 4c 46 e4 JMP $e446 ; EX_SETWRT e0b1: 4c 5d e4 JMP $e45d ; EX_SETDMA e0b4: 4c 21 e6 JMP $e621 ; EX_BINBCD e0b7: 4c 00 e6 JMP $e600 ; EX_BCDBIN e0ba: 4c 7e e6 JMP $e67e ; EX_RND e0bd: 4c c6 fd JMP $fdc6 ; MA_MUL8U e0c0: 4c bf fd JMP $fdbf ; MA_MUL8S e0c3: 4c d4 fd JMP $fdd4 ; MA_MUL16U e0c6: 4c e2 fd JMP $fde2 ; MA_DIV16U? e0c9: 4c e9 fd JMP $fde9 ; MA_DIV16S? e0cc: 4c f0 fd JMP $fdf0 ; MA_SQRT e0cf: 4c fe fd JMP $fdfe ; MA_SIN e0d2: 4c f7 fd JMP $fdf7 ; MA_COS e0d5: 4c 05 fe JMP $fe05 ; MA_ATNI e0d8: 4c 0c fe JMP $fe0c ; PSG_BIOS e0db: 4c 57 fe JMP $fe57 ; GRP_BIOS e0de: 4c 92 fe JMP $fe92 ; EX_MEMOPEN e0e1: 4c cf e6 JMP $e6cf ; something PSG-related e0e4: 4c 09 e5 JMP $e509 ; EX_COLORCMD e0e7: 4c 30 f7 JMP $f730 e0ea: 4c 6c f7 JMP $f76c e0ed: 4c cd fd JMP $fdcd ; MA_MUL16S e0f0: 4c db fd JMP $fddb ; MA_CBASIS CD_BOOT: e0f3: 78 SEI ; disable interruptions e0f4: d4 CSH ; set hi speed for cpu e0f5: d8 CLD ; clear decimal flag e0f6: a2 ff LDX #$ff ; X = $ff e0f8: 9a TXS ; S = $ff e0f9: 8a TXA ; A = $ff e0fa: 53 01 TAM #$01 ; MMR1 = $ff, hardware e0fc: a9 f8 LDA #$f8 e0fe: 53 02 TAM #$02 ; MMR2 = $f8, 8kb scratch pad e100: 44 38 BSR $e13a ; init_mmap e102: a9 01 LDA #$01 e104: 53 40 TAM #$40 ; MMR7 = $01 e106: 20 0f cb JSR $cb0f ; 01:proc_01 ; this function inits cd, adpcm, io stuff and display ; the main picture e109: 20 60 c8 JSR $c860 ; 01:proc_02 e10c: aa TAX e10d: f0 09 BEQ $e118 e10f: 44 29 BSR $e13a ; init_mmap e111: a9 03 LDA #$03 e113: 53 40 TAM #$40 e115: 4c 78 cf JMP $cf78 e118: 20 a9 f0 JSR $f0a9 ; CD_CONTNTS e11b: 44 2f BSR $e14c ; search for Code track e11d: 90 0d BCC $e12c ; if carry cleared, we've not found a code track ; so let's fire the Cd player e11f: a9 01 LDA #$01 e121: 53 40 TAM #$40 ; display load error message? e123: 20 03 cb JSR $cb03 ; 01:proc_03 ; reset system? e126: 20 54 cb JSR $cb54 ; 01:proc_04 e129: 4c 09 e1 JMP $e109 ; this is probably the entry point for the CD ; audio player. e12c: a9 04 LDA #$04 e12e: 44 0d BSR $e13d e130: 4c 00 40 JMP $4000 e133: a9 17 LDA #$17 e135: 44 06 BSR $e13d e137: 4c 00 40 JMP $4000 init_mmap: ; sets up some memory mapping e13a: ad f5 ff LDA $fff5 ; A = #$80 e13d: 53 04 TAM #$04 e13f: 1a INC a e140: 53 08 TAM #$08 e142: 1a INC a e143: 53 10 TAM #$10 e145: 1a INC a e146: 53 20 TAM #$20 e148: 1a INC a e149: 53 40 TAM #$40 e14b: 60 RTS ; this routine appears to loop through each ; track on the CD looking for the first data ; track. e14c: ad 6a 22 LDA $226a ; first Cd track (BCD) e14f: 48 PHA e150: 85 f9 STA $f9 ; _ah = # of track to check e152: a9 02 LDA #$02 e154: 85 f8 STA $f8 ; _al = 2, mode check track info e156: a9 56 LDA #$56 e158: 85 fa STA $fa e15a: a9 22 LDA #$22 e15c: 85 fb STA $fb ; set BX to $2256 ; buffer containing result e15e: 20 f1 ef JSR $eff1 ; CD_DINFO e161: 68 PLA ; check for data track? e162: 93 04 59 22 TST #$04, $2259 e166: d0 0e BNE $e176 e168: cd 6b 22 CMP $226b ; compare the current track number witht ; last track number e16b: b0 07 BCS $e174 ; if we've checked the last track, go on e16d: f8 SED ; else, add one in BCD mode and go on e16e: 18 CLC e16f: 69 01 ADC #$01 e171: d8 CLD e172: 80 db BRA $e14f ; almost beginning of this routine (w/o init) e174: 18 CLC ; No code track found value EX_JOYREP: ; it's an RTS??? e175: 60 RTS ; zeo : YES !!! ; I'd would tend to say there were a ; misconception. Maybe this would have done what's ; integrated to hardware now, who knows ? ; this routine appears to start a game CD ; zeo: it's called when a code track is encountered e176: 8d 69 22 STA $2269 ; store the current track number (containing code) ; in ($2269) ; does weird stuff (CD address calculation?) e179: 20 17 cc JSR $cc17 ; zeo : I cut one of my balls if this is not ; a routine that convert MSF value in lba one ; convert the value at ($2256-$2258) ; I think the result is in ($20F8-$20FA) e17c: 73 f8 20 74 22 03 00 TII $20f8, $2274, $0003 ; store the address of the first sector of ; code track to ($2274) (zeo, ?) e183: 73 f8 20 77 22 03 00 TII $20f8, $2277, $0003 ; also store the same value at ($2277) e18a: 64 fc STZ $fc e18c: 64 fd STZ $fd e18e: 64 fe STZ $fe ; ($fc-$fe) = 0 e190: a9 00 LDA #$00 e192: 85 fa STA $fa e194: a9 28 LDA #$28 e196: 85 fb STA $fb ; _BX = $2800 e198: a9 01 LDA #$01 e19a: 85 ff STA $ff ; _dh = 1 e19c: 1a INC a e19d: 85 f8 STA $f8 e19f: 64 f9 STZ $f9 ; _AX = 2 e1a1: 20 05 ec JSR $ec05 ; CD_READ ; read two sectors from beginning of code ; track, and store them at $2800 ; this block appears to check some sort of ; signature. ; (DAVE) Note: the two sectors from CDROM are the ; 'boot' sectors with startup information. ; This block of code compares that a key signature ; matches between the CDROM sectors and something ; inside the system card. ; In fact, this information is the 'copyright message' ; stored inside the card. The card will refuse to ; boot any CDROM which doesn't contain the copyright ; information. ; Boot card (block $1f:)$1ae1-$1fb5 (length $04d5) ; is compared against first CD sector. e1a4: a9 1f LDA #$1f e1a6: 53 40 TAM #$40 ; from the CD boot block e1a8: a9 00 LDA #$00 e1aa: 85 ec STA $ec e1ac: a9 28 LDA #$28 e1ae: 85 ed STA $ed ; ($ec-$ed) = $2800 ; place where sectors have been read ; with what? e1b0: a9 e1 LDA #$e1 e1b2: 85 ee STA $ee e1b4: a9 da LDA #$da e1b6: 85 ef STA $ef ; ($ee-ef) = $dae1 ; constant array in Cd system ; some 0x04d5 bytes long? e1b8: a9 d5 LDA #$d5 e1ba: 85 fc STA $fc e1bc: a9 04 LDA #$04 e1be: 85 fd STA $fd ; _CX = $4D5 e1c0: b2 ec LDA ($ec) e1c2: d2 ee CMP ($ee) e1c4: d0 43 BNE $e209 ; compare read sector and signature, ; go to $e209 on failure e1c6: e6 ec INC $ec e1c8: d0 02 BNE $e1cc e1ca: e6 ed INC $ed ; ($ec-$ed) ++ e1cc: e6 ee INC $ee e1ce: d0 02 BNE $e1d2 e1d0: e6 ef INC $ef ; ($ee-$ef) ++ e1d2: a5 fc LDA $fc e1d4: d0 02 BNE $e1d8 e1d6: c6 fd DEC $fd e1d8: c6 fc DEC $fc ; _CX -- e1da: a5 fc LDA $fc e1dc: 05 fd ORA $fd e1de: d0 e0 BNE $e1c0 ; if _CX!=0 continue checking signature ; at this point the signature appears okay. ; this makes sure that the next 0x4a ; bytes are zero e1e0: a9 4a LDA #$4a e1e2: 85 fc STA $fc e1e4: a9 00 LDA #$00 e1e6: 85 fd STA $fd ; _CX = $4A e1e8: b2 ec LDA ($ec) e1ea: d0 1d BNE $e209 ; is this byte nul ? ; if not, quit with error value in carry e1ec: e6 ec INC $ec e1ee: d0 02 BNE $e1f2 e1f0: e6 ed INC $ed ; ($ec-$ed) ++ e1f2: e6 ee INC $ee e1f4: d0 02 BNE $e1f8 e1f6: e6 ef INC $ef ; ($ee-$ef) ++ (zeo : useless ?) e1f8: a5 fc LDA $fc e1fa: d0 02 BNE $e1fe e1fc: c6 fd DEC $fd e1fe: c6 fc DEC $fc ; _CX -- e200: a5 fc LDA $fc e202: 05 fd ORA $fd e204: d0 e2 BNE $e1e8 ; if _CX != 0, continue checking nullity ; ??? this is an address in the CD boot block e206: 20 26 2b JSR $2b26 ; zeo : certainly execute boot code ; DAVE - offset $326 from beginning of sector. ; check syscard block $1f, offset $1e07 (key ; signature in syscard) to verify what it does e209: 38 SEC ; signal we've found a Code track ; or that signature is incorrect (zeo) e20a: 60 RTS ; an error handler, perhaps? ; this looks like it decides if an error ; condition is fatal e20b: c9 06 CMP #$06 e20d: f0 54 BEQ $e263 ; => ret_loc with success return value e20f: c9 02 CMP #$02 e211: d0 50 BNE $e263 ; => ret_loc with success return value ; copies command buffer to a backup buffer? e213: a0 09 LDY #$09 e215: b9 4c 22 LDA $224c, Y e218: 99 91 22 STA $2291, Y e21b: 88 DEY e21c: 10 f7 BPL $e215 e21e: 20 53 f0 JSR $f053 ; load ($227c) and ($227d) with info bufer[2] & [9] ; from command 0x03 e221: ad 7c 22 LDA $227c ; $227c = unknown (result code?) e224: f0 3d BEQ $e263 ; ($227c) = 0 e.g. when command 3 not implemented ; or when error issuing command e226: c9 04 CMP #$04 e228: d0 05 BNE $e22f e22a: 8d 47 22 STA $2247 ; ($2247) = ($227c) e22d: 80 34 BRA $e263 e22f: c9 0b CMP #$0b e231: f0 32 BEQ $e265 e233: c9 0d CMP #$0d e235: f0 2e BEQ $e265 e237: c9 11 CMP #$11 e239: f0 28 BEQ $e263 e23b: c9 15 CMP #$15 e23d: f0 24 BEQ $e263 e23f: c9 16 CMP #$16 e241: f0 20 BEQ $e263 e243: c9 1c CMP #$1c e245: f0 1e BEQ $e265 e247: c9 1d CMP #$1d e249: f0 1a BEQ $e265 e24b: c9 20 CMP #$20 e24d: f0 16 BEQ $e265 e24f: c9 21 CMP #$21 e251: f0 12 BEQ $e265 e253: c9 22 CMP #$22 e255: f0 0e BEQ $e265 e257: c9 25 CMP #$25 e259: f0 0a BEQ $e265 e25b: c9 2a CMP #$2a e25d: f0 06 BEQ $e265 e25f: c9 2c CMP #$2c e261: f0 02 BEQ $e265 e263: 18 CLC e264: 60 RTS e265: 38 SEC e266: 60 RTS EX_SCRSIZ: e267: 29 07 AND #$07 e269: 0a ASL a e26a: 0a ASL a e26b: 0a ASL a e26c: 0a ASL a e26d: a8 TAY ; Y = (A&7) << 4 e26e: a9 8f LDA #$8f ; A = $8f e270: 80 05 BRA $e277 EX_DOTMOD: e272: 29 8f AND #$8f e274: a8 TAY ; Y = (A & $8f) e275: a9 70 LDA #$70 ; A = $70 e277: 2d 42 22 AND $2242 e27a: 8d 42 22 STA $2242 ; ($2242) &= A e27d: 98 TYA ; Y = A, maybe A recover 'initial' value e27e: 0d 42 22 ORA $2242 e281: 8d 42 22 STA $2242 ; ($2242) |= A e284: a9 09 LDA #$09 e286: 85 f7 STA $f7 e288: 8d 00 00 STA $0000 ; set VDC mode 9 (don't remember what is for, [zeo] ) e28b: ad 42 22 LDA $2242 e28e: 8d 02 00 STA $0002 ; send the 'cooked' byte as data e291: 60 RTS e292: 62 CLA e293: a2 20 LDX #$20 e295: a0 1e LDY #$1e e297: 44 04 BSR $e29d e299: a9 01 LDA #$01 e29b: 38 SEC e29c: 60 RTS EX_SCRMOD: e29d: 8d 44 22 STA $2244 e2a0: 29 05 AND #$05 e2a2: 8d 44 22 STA $2244 e2a5: 8e 45 22 STX $2245 e2a8: 8c 46 22 STY $2246 e2ab: ad 46 22 LDA $2246 e2ae: c9 0a CMP #$0a e2b0: 90 e0 BCC $e292 e2b2: c9 1f CMP #$1f e2b4: b0 dc BCS $e292 e2b6: 93 01 44 22 TST #$01, $2244 e2ba: d0 42 BNE $e2fe e2bc: ad 45 22 LDA $2245 e2bf: c9 0a CMP #$0a e2c1: 90 cf BCC $e292 e2c3: c9 23 CMP #$23 e2c5: b0 cb BCS $e292 e2c7: 44 78 BSR $e341 e2c9: a9 0a LDA #$0a e2cb: 85 f7 STA $f7 e2cd: 8d 00 00 STA $0000 e2d0: 13 02 ST1 #$02 e2d2: ad 45 22 LDA $2245 e2d5: aa TAX e2d6: ca DEX e2d7: 4a LSR a e2d8: 49 ff EOR #$ff e2da: 18 CLC e2db: 69 13 ADC #$13 e2dd: 8d 03 00 STA $0003 e2e0: 18 CLC e2e1: 6d 45 22 ADC $2245 e2e4: 49 ff EOR #$ff e2e6: a8 TAY e2e7: a9 0b LDA #$0b e2e9: 85 f7 STA $f7 e2eb: 8d 00 00 STA $0000 e2ee: 8e 02 00 STX $0002 e2f1: 98 TYA e2f2: 18 CLC e2f3: 69 27 ADC #$27 e2f5: 8d 03 00 STA $0003 e2f8: 62 CLA e2f9: 20 72 e2 JSR $e272 e2fc: 18 CLC e2fd: 60 RTS e2fe: ad 45 22 LDA $2245 e301: c9 10 CMP #$10 e303: 90 8d BCC $e292 e305: c9 2d CMP #$2d e307: b0 89 BCS $e292 e309: 44 36 BSR $e341 e30b: a9 0a LDA #$0a e30d: 85 f7 STA $f7 e30f: 8d 00 00 STA $0000 e312: 13 03 ST1 #$03 e314: ad 45 22 LDA $2245 e317: aa TAX e318: ca DEX e319: 4a LSR a e31a: 49 ff EOR #$ff e31c: 18 CLC e31d: 69 19 ADC #$19 e31f: 8d 03 00 STA $0003 e322: 18 CLC e323: 6d 45 22 ADC $2245 e326: 49 ff EOR #$ff e328: a8 TAY e329: a9 0b LDA #$0b e32b: 85 f7 STA $f7 e32d: 8d 00 00 STA $0000 e330: 8e 02 00 STX $0002 e333: 98 TYA e334: 18 CLC e335: 69 35 ADC #$35 e337: 8d 03 00 STA $0003 e33a: a9 0a LDA #$0a e33c: 20 72 e2 JSR $e272 e33f: 18 CLC e340: 60 RTS e341: a9 0c LDA #$0c e343: 85 f7 STA $f7 e345: 8d 00 00 STA $0000 e348: 13 02 ST1 #$02 e34a: ad 46 22 LDA $2246 e34d: 0a ASL a e34e: 0a ASL a e34f: 0a ASL a e350: aa TAX e351: ca DEX e352: 4a LSR a e353: 49 ff EOR #$ff e355: 18 CLC e356: 69 88 ADC #$88 e358: 8d 03 00 STA $0003 e35b: a9 0d LDA #$0d e35d: 85 f7 STA $f7 e35f: 8d 00 00 STA $0000 e362: 8e 02 00 STX $0002 e365: 23 00 ST2 #$00 e367: a9 0e LDA #$0e e369: 85 f7 STA $f7 e36b: 8d 00 00 STA $0000 e36e: 8a TXA e36f: 1a INC a e370: 1a INC a e371: 4a LSR a e372: 69 7d ADC #$7d e374: 8d 02 00 STA $0002 e377: 23 00 ST2 #$00 e379: ad 44 22 LDA $2244 e37c: 49 04 EOR #$04 e37e: 8d 00 04 STA $0400 e381: 60 RTS EX_IMODE: ; set R/W auto increment value ; A = $00, increment by 1 ; $01, 32 ; $02, 64 ; $03, 128 e382: 37 f4 RMB3 $f4 e384: 47 f4 RMB4 $f4 ; ($f4) |= 0x18 e386: 0a ASL a e387: 0a ASL a e388: 0a ASL a e389: 29 18 AND #$18 e38b: 05 f4 ORA $f4 e38d: 85 f4 STA $f4 ; ($f4) |= A << 3; e38f: 80 17 BRA $e3a8 EX_VMODE: e391: b7 f4 SMB3 $f4 e393: ad 42 22 LDA $2242 e396: 29 30 AND #$30 e398: f0 0c BEQ $e3a6 e39a: c7 f4 SMB4 $f4 e39c: 29 01 AND #$01 e39e: d0 08 BNE $e3a8 e3a0: 37 f4 RMB3 $f4 e3a2: 80 04 BRA $e3a8 EX_HMODE: e3a4: 37 f4 RMB3 $f4 e3a6: 47 f4 RMB4 $f4 e3a8: a9 05 LDA #$05 e3aa: 85 f7 STA $f7 e3ac: 8d 00 00 STA $0000 e3af: a5 f4 LDA $f4 e3b1: 8d 03 00 STA $0003 e3b4: 60 RTS EX_VSYNC: e3b5: 9f f5 0e BBS1 $f5, $e3c6 ; if ($f5 & 0x02), exit e3b8: 58 CLI ; enable interrupt ? e3b9: bf f3 02 BBS3 $f3, $e3be ; if ($f3 & 0x08), don't enable IRQ e3bc: 44 11 BSR $e3cf ; EX_IRQON e3be: ad 41 22 LDA $2241 ; A = ($2241) e3c1: cd 41 22 CMP $2241 e3c4: f0 fb BEQ $e3c1 ; while (A==($2241=)) do ; e3c6: 60 RTS EX_RCRON: e3c7: a7 f3 SMB2 $f3 ; ($f3) |= 0x04 e3c9: 80 0a BRA $e3d5 EX_RCROFF: e3cb: 27 f3 RMB2 $f3 ; ($f3) &= ~0x04 e3cd: 80 06 BRA $e3d5 EX_IRQON: e3cf: b7 f3 SMB3 $f3 ; ($f3) |= 0x04 e3d1: 80 02 BRA $e3d5 EX_IRQOFF: e3d3: 37 f3 RMB3 $f3 ; ($f3) &= ~ 0x04 e3d5: a9 05 LDA #$05 e3d7: 85 f7 STA $f7 e3d9: 8d 00 00 STA $0000 ; set VDC mode 5 (?) e3dc: a5 f3 LDA $f3 ; send data byte e3de: 8d 02 00 STA $0002 e3e1: 60 RTS EX_BGON: e3e2: f7 f3 SMB7 $f3 ; ($f3) |= 128 e3e4: 60 RTS EX_BGOFF: e3e5: 77 f3 RMB7 $f3 ; ($f3) &= ~128 e3e7: 60 RTS EX_SPRON: e3e8: e7 f3 SMB6 $f3 e3ea: 60 RTS EX_SPROFF: e3eb: 67 f3 RMB6 $f3 e3ed: 60 RTS EX_DSPON: e3ee: e7 f3 SMB6 $f3 e3f0: f7 f3 SMB7 $f3 e3f2: 60 RTS EX_DSPOFF: e3f3: 67 f3 RMB6 $f3 e3f5: 77 f3 RMB7 $f3 e3f7: 60 RTS EX_DMAMOD: e3f8: 29 1f AND #$1f e3fa: 8d 43 22 STA $2243 e3fd: a9 0f LDA #$0f e3ff: 85 f7 STA $f7 e401: 8d 00 00 STA $0000 e404: ad 43 22 LDA $2243 e407: 8d 02 00 STA $0002 e40a: 60 RTS EX_SPRDMA: e40b: a9 13 LDA #$13 e40d: 85 f7 STA $f7 e40f: 8d 00 00 STA $0000 e412: ad 14 22 LDA $2214 e415: 8d 02 00 STA $0002 e418: ad 15 22 LDA $2215 e41b: 8d 03 00 STA $0003 e41e: 60 RTS EX_SETRCR: e41f: 48 PHA e420: a9 06 LDA #$06 e422: 85 f7 STA $f7 e424: 8d 00 00 STA $0000 e427: 68 PLA e428: 8d 02 00 STA $0002 e42b: 8e 03 00 STX $0003 e42e: 60 RTS EX_SETRED: e42f: 48 PHA e430: a9 01 LDA #$01 e432: 85 f7 STA $f7 e434: 8d 00 00 STA $0000 e437: 68 PLA e438: 8d 02 00 STA $0002 e43b: 8e 03 00 STX $0003 e43e: a9 02 LDA #$02 e440: 85 f7 STA $f7 e442: 8d 00 00 STA $0000 e445: 60 RTS EX_SETWRT: e446: 48 PHA e447: a9 00 LDA #$00 e449: 85 f7 STA $f7 e44b: 8d 00 00 STA $0000 e44e: 68 PLA e44f: 8d 02 00 STA $0002 e452: 8e 03 00 STX $0003 e455: a9 02 LDA #$02 e457: 85 f7 STA $f7 e459: 8d 00 00 STA $0000 e45c: 60 RTS EX_SETDMA: e45d: a5 f7 LDA $f7 e45f: 48 PHA e460: a9 10 LDA #$10 e462: 85 f7 STA $f7 e464: 8d 00 00 STA $0000 e467: a5 fa LDA $fa e469: 8d 02 00 STA $0002 e46c: a5 fb LDA $fb e46e: 8d 03 00 STA $0003 e471: a9 11 LDA #$11 e473: 85 f7 STA $f7 e475: 8d 00 00 STA $0000 e478: a5 fe LDA $fe e47a: 8d 02 00 STA $0002 e47d: a5 ff LDA $ff e47f: 8d 03 00 STA $0003 e482: a9 12 LDA #$12 e484: 85 f7 STA $f7 e486: 8d 00 00 STA $0000 e489: a5 fc LDA $fc e48b: 8d 02 00 STA $0002 e48e: a5 fd LDA $fd e490: 8d 03 00 STA $0003 e493: 68 PLA e494: 85 f7 STA $f7 e496: 8d 00 00 STA $0000 e499: 60 RTS EX_JOYSNS: e49a: a9 01 LDA #$01 ; reset hardware to joypad #1 e49c: 8d 00 10 STA $1000 e49f: a9 03 LDA #$03 e4a1: 8d 00 10 STA $1000 e4a4: c2 CLY ; counter for 5 joypads e4a5: a9 01 LDA #$01 ; set to read first nybble e4a7: 8d 00 10 STA $1000 e4aa: 48 PHA ; delay for a few cycles (~11) e4ab: 68 PLA e4ac: ea NOP e4ad: ea NOP e4ae: b9 28 22 LDA $2228, Y ; move previous value to 'old' e4b1: 99 32 22 STA $2232, Y e4b4: ad 00 10 LDA $1000 ; get new value e4b7: 0a ASL a ; move to high nybble position e4b8: 0a ASL a e4b9: 0a ASL a e4ba: 0a ASL a e4bb: 99 28 22 STA $2228, Y ; store as new value e4be: 9c 00 10 STZ $1000 ; set to read next nybble e4c1: 48 PHA ; another delay e4c2: 68 PLA e4c3: ea NOP e4c4: ea NOP e4c5: ad 00 10 LDA $1000 ; get next nybble e4c8: 29 0f AND #$0f e4ca: 19 28 22 ORA $2228, Y ; place with other nybble e4cd: 49 ff EOR #$ff e4cf: 99 28 22 STA $2228, Y ; put back in 'new' joypad place e4d2: 59 32 22 EOR $2232, Y ; check for keypress changes e4d5: 39 28 22 AND $2228, Y e4d8: 99 2d 22 STA $222d, Y ; 'new keys pressed' e4db: c8 INY e4dc: c0 05 CPY #$05 e4de: 90 c5 BCC $e4a5 ; go do next joypad until 5 e4e0: c2 CLY ; reset counter e4e1: ad 27 22 LDA $2227 ; this byte contains bitmap of ; which joypads are allowed to ; perform (RUN+SELECT) soft reset e4e4: 39 04 e5 AND $e504, Y e4e7: f0 15 BEQ $e4fe ; not significant e4e9: b9 2d 22 LDA $222d, Y ; check whether key sequence was hit e4ec: c9 04 CMP #$04 e4ee: d0 0e BNE $e4fe e4f0: b9 28 22 LDA $2228, Y e4f3: c9 0c CMP #$0c e4f5: d0 07 BNE $e4fe e4f7: a9 80 LDA #$80 e4f9: 85 e7 STA $e7 e4fb: 6c 84 22 JMP ($2284) ; soft reset e4fe: c8 INY ; otherwise check next joypad e4ff: c0 05 CPY #$05 e501: 90 de BCC $e4e1 e503: 60 RTS e504: 01 02 ; data: bits correspond to joypad #, to indicate e506: 04 08 ; which joypads are allowed to perform soft reset e508: 10 ; by pressing (RUN+SELECT) combination EX_COLORCMD: e509: ad 1f 22 LDA $221f e50c: d0 01 BNE $e50f e50e: 60 RTS e50a: 1f 22 d0 BBR1 $22, $e4dd e50d: 01 60 ORA ($60, X) e50f: 29 01 AND #$01 e511: f0 02 BEQ $e515 e513: d0 64 BNE $e579 e515: a9 e3 LDA #$e3 e517: 8d 86 22 STA $2286 e51a: a9 04 LDA #$04 e51c: 8d 89 22 STA $2289 e51f: 8d 8a 22 STA $228a e522: a9 60 LDA #$60 e524: 8d 8d 22 STA $228d e527: ad 22 22 LDA $2222 e52a: f0 21 BEQ $e54d e52c: 9c 8c 22 STZ $228c e52f: 0a ASL a e530: 0a ASL a e531: 0a ASL a e532: 0a ASL a e533: 2e 8c 22 ROL $228c e536: 0a ASL a e537: 2e 8c 22 ROL $228c e53a: 8d 8b 22 STA $228b e53d: 73 20 22 87 22 02 00 TII $2220, $2287, $0002 e544: 9c 02 04 STZ $0402 e547: 9c 03 04 STZ $0403 e54a: 20 86 22 JSR $2286 e54d: ad 25 22 LDA $2225 e550: f0 23 BEQ $e575 e552: 9c 8c 22 STZ $228c e555: 0a ASL a e556: 0a ASL a e557: 0a ASL a e558: 0a ASL a e559: 2e 8c 22 ROL $228c e55c: 0a ASL a e55d: 2e 8c 22 ROL $228c e560: 8d 8b 22 STA $228b e563: 73 23 22 87 22 02 00 TII $2223, $2287, $0002 e56a: 9c 02 04 STZ $0402 e56d: a9 01 LDA #$01 e56f: 8d 03 04 STA $0403 e572: 20 86 22 JSR $2286 e575: 9c 1f 22 STZ $221f e578: 60 RTS e579: 73 d7 e5 86 22 03 00 TII $e5d7, $2286, $0003 e580: a9 60 LDA #$60 e582: 8d 8d 22 STA $228d e585: ad 22 22 LDA $2222 e588: f0 21 BEQ $e5ab e58a: 9c 8c 22 STZ $228c e58d: 0a ASL a e58e: 0a ASL a e58f: 0a ASL a e590: 0a ASL a e591: 2e 8c 22 ROL $228c e594: 0a ASL a e595: 2e 8c 22 ROL $228c e598: 8d 8b 22 STA $228b e59b: 73 20 22 89 22 02 00 TII $2220, $2289, $0002 e5a2: 9c 02 04 STZ $0402 e5a5: 9c 03 04 STZ $0403 e5a8: 20 86 22 JSR $2286 e5ab: ad 25 22 LDA $2225 e5ae: f0 23 BEQ $e5d3 e5b0: 9c 8c 22 STZ $228c e5b3: 0a ASL a e5b4: 0a ASL a e5b5: 0a ASL a e5b6: 0a ASL a e5b7: 2e 8c 22 ROL $228c e5ba: 0a ASL a e5bb: 2e 8c 22 ROL $228c e5be: 8d 8b 22 STA $228b e5c1: 73 23 22 89 22 02 00 TII $2223, $2289, $0002 e5c8: 9c 02 04 STZ $0402 e5cb: a9 01 LDA #$01 e5cd: 8d 03 04 STA $0403 e5d0: 20 86 22 JSR $2286 e5d3: 9c 1f 22 STZ $221f e5d6: 60 RTS e5d7: f3 04 04 ?? ?? ?? ?? TAI $0404, $????, $???? EX_SATCLR: e5da: a9 00 LDA #$00 e5dc: 85 f7 STA $f7 e5de: 8d 00 00 STA $0000 e5e1: ad 14 22 LDA $2214 e5e4: 8d 02 00 STA $0002 e5e7: ad 15 22 LDA $2215 e5ea: 8d 03 00 STA $0003 e5ed: a9 02 LDA #$02 e5ef: 85 f7 STA $f7 e5f1: 8d 00 00 STA $0000 e5f4: 82 CLX e5f5: 13 00 ST1 #$00 e5f7: 23 00 ST2 #$00 e5f9: ca DEX e5fa: d0 f9 BNE $e5f5 e5fc: 9c 16 22 STZ $2216 e5ff: 60 RTS EX_BCDBIN: e600: da PHX ; push X e601: aa TAX ; save A value in X e602: 29 f0 AND #$f0 ; take care of the higher digit e604: c9 a0 CMP #$a0 ; check if it can be a BCD number e606: b0 16 BCS $e61e ; if not, exit e608: 4a LSR a ; A <<= 1 e609: 85 ec STA $ec ; ($ec) = A e60b: 4a LSR a e60c: 4a LSR a ; A <<= 2 e60d: 18 CLC e60e: 65 ec ADC $ec e610: 85 ec STA $ec ; ($ec) = (Hi digit)*2+(Hi digit)*8 ; => ($ec) = (Hi digit) * 10 e612: 8a TXA ; A = initial argument e613: 29 0f AND #$0f ; consider only lower digit e615: c9 0a CMP #$0a e617: b0 05 BCS $e61e ; if not BCD number, exit e619: 18 CLC ; else e61a: 65 ec ADC $ec ; add previous result with this digit e61c: aa TAX ; and store the result as the returning value e61d: 18 CLC e61e: 8a TXA ; restore A value e61f: fa PLX ; restore X value e620: 60 RTS EX_BINBCD: e621: c9 64 CMP #$64 ; compare argument with 100d e623: b0 16 BCS $e63b ; if not BCD convertible, exit e625: da PHX ; save X value e626: a2 ff LDX #$ff ; X = 255 e628: 38 SEC ; set carrry flag e629: e8 INX ; X++ e62a: e9 0a SBC #$0a ; A -= 10 e62c: b0 fb BCS $e629 ; while A>=0, continue ; so that X contain A / 10 e62e: 69 0a ADC #$0a ; reajust A 'coz we've gone too far e630: 22 SAX ; A <-> X e631: 0a ASL a e632: 0a ASL a e633: 0a ASL a e634: 0a ASL a ; A <<=4, the number of 'dizaine' (french word) ; is placed in higher nibble e635: 86 ec STX $ec ; place the lower digit in ($ec) e637: 65 ec ADC $ec ; and add this result to A (that contains the ; higher digit) e639: fa PLX ; restore value for X e63a: 18 CLC ; np e63b: 60 RTS EX_SPRPUT: e63c: ad 16 22 LDA $2216 e63f: c9 40 CMP #$40 e641: b0 3a BCS $e67d e643: 5a PHY e644: a9 00 LDA #$00 e646: 85 f7 STA $f7 e648: 8d 00 00 STA $0000 e64b: ad 16 22 LDA $2216 e64e: 0a ASL a e64f: 0a ASL a e650: 18 CLC e651: 6d 14 22 ADC $2214 e654: 8d 02 00 STA $0002 e657: ad 15 22 LDA $2215 e65a: 69 00 ADC #$00 e65c: 8d 03 00 STA $0003 e65f: a9 02 LDA #$02 e661: 85 f7 STA $f7 e663: 8d 00 00 STA $0000 e666: c2 CLY e667: b9 17 22 LDA $2217, Y e66a: 8d 02 00 STA $0002 e66d: c8 INY e66e: b9 17 22 LDA $2217, Y e671: 8d 03 00 STA $0003 e674: c8 INY e675: c0 08 CPY #$08 e677: d0 ee BNE $e667 e679: ee 16 22 INC $2216 e67c: 7a PLY e67d: 60 RTS EX_RND: e67e: ad 4a 22 LDA $224a e681: 2a ROL a e682: 2a ROL a e683: 2a ROL a e684: 4d 49 22 EOR $2249 e687: 6a ROR a e688: 08 PHP e689: ad 4a 22 LDA $224a e68c: 4d 49 22 EOR $2249 e68f: 8d 4a 22 STA $224a e692: ad 4b 22 LDA $224b e695: 4d 49 22 EOR $2249 e698: 8d 49 22 STA $2249 e69b: 28 PLP e69c: 2e 49 22 ROL $2249 e69f: 2e 4a 22 ROL $224a e6a2: ad 4a 22 LDA $224a e6a5: 4d 49 22 EOR $2249 e6a8: 60 RTS NMI: e6a9: bf f5 01 BBS3 $f5, $e6ad ; $f5 = some sort of irq enable flag? ; (DAVE) $f5 is a bit-map of flags to enable ; alternate interrupt handlers than the default ; ; They associate with jump-vectors in the low ; area of the $2200 range. e6ac: 40 RTI e6ad: 6c 06 22 JMP ($2206) e6b0: 6c 04 22 JMP ($2204) TIMER: e6b3: af f5 fa BBS2 $f5, $e6b0 ; if ($f5 & 0x04), go to $e6b0 ? e6b6: 48 PHA ; store A, X, Y value e6b7: da PHX e6b8: 5a PHY e6b9: 8d 03 14 STA $1403 ; set IRQ status but what does A is egal to ? e6bc: a5 e6 LDA $e6 e6be: d0 0b BNE $e6cb ; if ($e6) != 0, exist right now e6c0: e6 e6 INC $e6 ; ($e6) ++ e6c2: 58 CLI ; reenable IRQ processing e6c3: a5 e7 LDA $e7 e6c5: d0 02 BNE $e6c9 ; if ($e7) != 0, zeroes ($e6) then exits e6c7: 44 06 BSR $e6cf e6c9: 64 e6 STZ $e6 e6cb: 7a PLY ; restore A, X, Y value e6cc: fa PLX e6cd: 68 PLA e6ce: 40 RTI ; an unknown entry point via the jump table ; also called in the Timer method ; (DAVE): this is the music player e6cf: 43 10 TMA #$10 e6d1: 48 PHA ; push bank number of MMR4 e6d2: 43 20 TMA #$20 e6d4: 48 PHA ; push bank number of MMR5 e6d5: 43 40 TMA #$40 e6d7: 48 PHA ; push bank number of MMR6 e6d8: ad eb 22 LDA $22eb e6db: 53 10 TAM #$10 ; set MMR4 to ($22eb) (set in PSG_BANK) e6dd: ad ec 22 LDA $22ec e6e0: 53 20 TAM #$20 ; set MMR5 to ($22ec) (set in PSG_BANK) e6e2: a9 02 LDA #$02 e6e4: 53 40 TAM #$40 ; set MMR6 to 2 e6e6: ad df 22 LDA $22df e6e9: f0 0f BEQ $e6fa ; if ($22df) == 0, skip a small part ; can be "no sound" or such e6eb: 20 12 cd JSR $cd12 e6ee: c9 00 CMP #$00 e6f0: d0 08 BNE $e6fa ; if returned value is null, perform ($22de) |= 0x40 else not e6f2: ad de 22 LDA $22de e6f5: 09 40 ORA #$40 e6f7: 8d de 22 STA $22de ; ($22de) |= 0x40 e6fa: ad df 22 LDA $22df e6fd: c9 01 CMP #$01 e6ff: f0 0f BEQ $e710 ; if ($22df & 1), skip another small part e701: 20 ef c2 JSR $c2ef e704: c9 00 CMP #$00 e706: d0 08 BNE $e710 ; if returned value is null, perform ($22de) |= 0x80 else not e708: ad de 22 LDA $22de e70b: 09 80 ORA #$80 e70d: 8d de 22 STA $22de ; ($22de) |= 0x80 e710: a5 e7 LDA $e7 e712: 29 01 AND #$01 e714: d0 0d BNE $e723 e716: ad d4 22 LDA $22d4 e719: 30 08 BMI $e723 e71b: 8d 00 0c STA $0c00 ; if ($22d4) & 0x80 != 0, ; set time reload to ($22d4) and ; ($22d4) |= 0x80 e71e: 09 80 ORA #$80 e720: 8d d4 22 STA $22d4 e723: 68 PLA e724: 53 40 TAM #$40 e726: 68 PLA e727: 53 20 TAM #$20 ; restore all banks that have been re for PSG purposes e729: 68 PLA e72a: 53 10 TAM #$10 e72c: ad ed 22 LDA $22ed e72f: 8d 00 08 STA $0800 e732: 60 RTS e733: 6c 00 22 JMP ($2200) IRQ2/BRK: e736: 8f f5 fa BBS0 $f5, $e733 ; $f5 = some sort of irq enable flag? ; if ($f5 & 1), exit e739: 48 PHA e73a: da PHX e73b: 5a PHY e73c: 44 04 BSR $e742 e73e: 7a PLY e73f: fa PLX e740: 68 PLA e741: 40 RTI e742: ad 02 18 LDA $1802 e745: 2d 03 18 AND $1803 e748: 05 f2 ORA $f2 e74a: 85 f2 STA $f2 ; something to do with ADPCM? e74c: 2f f2 64 BBR2 $f2, $e7b3 ; something to do with ADPCM? e74f: a9 04 LDA #$04 e751: 1c 02 18 TRB $1802 e754: a9 04 LDA #$04 e756: 14 f2 TRB $f2 e758: 58 CLI e759: ad 9e 22 LDA $229e e75c: 0d 9f 22 ORA $229f e75f: 0d a0 22 ORA $22a0 e762: f0 4f BEQ $e7b3 e764: ad 00 18 LDA $1800 e767: 29 80 AND #$80 e769: f0 08 BEQ $e773 e76b: 9c a4 22 STZ $22a4 e76e: 20 ce f6 JSR $f6ce e771: 80 40 BRA $e7b3 e773: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0x08: read sectors e776: a9 08 LDA #$08 e778: 8d 4c 22 STA $224c e77b: ad a1 22 LDA $22a1 e77e: 8d 4d 22 STA $224d e781: ad a2 22 LDA $22a2 e784: 8d 4e 22 STA $224e e787: ad a3 22 LDA $22a3 e78a: 8d 4f 22 STA $224f e78d: a2 10 LDX #$10 e78f: ad 9f 22 LDA $229f e792: 0d a0 22 ORA $22a0 e795: d0 08 BNE $e79f e797: ad 9e 22 LDA $229e e79a: c9 10 CMP #$10 e79c: b0 01 BCS $e79f e79e: aa TAX e79f: 8a TXA e7a0: 8d 9d 22 STA $229d e7a3: 8d 50 22 STA $2250 e7a6: a9 01 LDA #$01 e7a8: 8d a4 22 STA $22a4 ; cd mutex e7ab: 20 05 e9 JSR $e905 e7ae: a9 60 LDA #$60 e7b0: 0c 02 18 TSB $1802 e7b3: 6f f2 0f BBR6 $f2, $e7c5 e7b6: a9 40 LDA #$40 e7b8: 1c 02 18 TRB $1802 e7bb: a9 40 LDA #$40 e7bd: 14 f2 TRB $f2 e7bf: 58 CLI e7c0: a9 02 LDA #$02 e7c2: 8d 0b 18 STA $180b e7c5: 5f f2 65 BBR5 $f2, $e82d ; something to do with CD data? e7c8: a9 20 LDA #$20 e7ca: 1c 02 18 TRB $1802 e7cd: a9 20 LDA #$20 e7cf: 14 f2 TRB $f2 e7d1: 58 CLI e7d2: ad a4 22 LDA $22a4 e7d5: f0 03 BEQ $e7da e7d7: 9c 0b 18 STZ $180b e7da: ad 01 18 LDA $1801 e7dd: 8d 7b 22 STA $227b e7e0: f0 06 BEQ $e7e8 e7e2: 9c a4 22 STZ $22a4 e7e5: 20 ce f6 JSR $f6ce e7e8: a9 80 LDA #$80 e7ea: 0c 02 18 TSB $1802 e7ed: 93 40 00 18 TST #$40, $1800 e7f1: d0 fa BNE $e7ed e7f3: a9 80 LDA #$80 e7f5: 1c 02 18 TRB $1802 e7f8: ad 00 18 LDA $1800 e7fb: 29 f8 AND #$f8 e7fd: c9 f8 CMP #$f8 e7ff: d0 f7 BNE $e7f8 e801: ad 01 18 LDA $1801 e804: a9 80 LDA #$80 e806: 0c 02 18 TSB $1802 e809: 93 40 00 18 TST #$40, $1800 e80d: d0 fa BNE $e809 e80f: a9 80 LDA #$80 e811: 1c 02 18 TRB $1802 e814: 93 80 00 18 TST #$80, $1800 e818: d0 fa BNE $e814 e81a: ad a4 22 LDA $22a4 e81d: f0 0e BEQ $e82d e81f: 9c a4 22 STZ $22a4 e822: 20 8c f6 JSR $f68c e825: 9c 9d 22 STZ $229d e828: a9 04 LDA #$04 e82a: 0c 02 18 TSB $1802 e82d: 4f f2 12 BBR4 $f2, $e842 e830: a9 10 LDA #$10 e832: 1c 02 18 TRB $1802 e835: a9 10 LDA #$10 e837: 14 f2 TRB $f2 e839: 58 CLI e83a: 20 5a f3 JSR $f35a e83d: a9 10 LDA #$10 e83f: 0c 02 18 TSB $1802 e842: 3f f2 21 BBR3 $f2, $e866 e845: a9 0c LDA #$0c e847: 1c 02 18 TRB $1802 e84a: a9 08 LDA #$08 e84c: 14 f2 TRB $f2 e84e: a9 60 LDA #$60 e850: 1c 0d 18 TRB $180d e853: 20 ce f6 JSR $f6ce e856: 58 CLI e857: ad a5 22 LDA $22a5 e85a: f0 0a BEQ $e866 e85c: ad 0c 18 LDA $180c e85f: 29 08 AND #$08 e861: d0 f9 BNE $e85c e863: 20 f5 f5 JSR $f5f5 e866: 60 RTS e867: 6c 0a 22 JMP ($220a) e86a: 6c 08 22 JMP ($2208) e86d: 6c 02 22 JMP ($2202) IRQ1: e870: 9f f5 fa BBS1 $f5, $e86d ; $f5 = some sort of irq enable flag? ; if ($f5 & 2), goto ($2202) e873: 48 PHA ; save value of A, X, Y e874: da PHX e875: 5a PHY e876: ad 00 00 LDA $0000 e879: 85 f6 STA $f6 e87b: 5f f6 3b BBR5 $f6, $e8b9 e87e: 03 05 ST0 #$05 e880: a5 f3 LDA $f3 e882: 8d 02 00 STA $0002 e885: a5 f4 LDA $f4 e887: 8d 03 00 STA $0003 e88a: ee 41 22 INC $2241 e88d: df f5 24 BBS5 $f5, $e8b4 e890: 03 07 ST0 #$07 e892: 73 0c 22 02 00 02 00 TII $220c, $0002, $0002 e899: 03 08 ST0 #$08 e89b: 73 10 22 02 00 02 00 TII $2210, $0002, $0002 e8a2: 20 09 e5 JSR $e509 e8a5: ee 49 22 INC $2249 e8a8: a5 e7 LDA $e7 e8aa: c9 01 CMP #$01 e8ac: d0 03 BNE $e8b1 e8ae: 20 cf e6 JSR $e6cf e8b1: 20 9a e4 JSR $e49a e8b4: 4f f5 02 BBR4 $f5, $e8b9 e8b7: 44 b1 BSR $e86a e8b9: 2f f6 1e BBR2 $f6, $e8da e8bc: ff f5 16 BBS7 $f5, $e8d5 e8bf: 44 a5 BSR $e866 e8c1: 44 a3 BSR $e866 e8c3: 03 07 ST0 #$07 e8c5: 73 0e 22 02 00 02 00 TII $220e, $0002, $0002 e8cc: 03 08 ST0 #$08 e8ce: 73 12 22 02 00 02 00 TII $2212, $0002, $0002 e8d5: 6f f5 02 BBR6 $f5, $e8da e8d8: 44 8d BSR $e867 e8da: a5 f7 LDA $f7 e8dc: 8d 00 00 STA $0000 e8df: 7a PLY ; restore value of A, X, Y e8e0: fa PLX e8e1: 68 PLA e8e2: 40 RTI CD_RESET: ; $1804 |= 0x02? e8e3: a9 02 LDA #$02 e8e5: 0c 04 18 TSB $1804 ; delay for a while e8e8: a0 0a LDY #$0a e8ea: a2 3b LDX #$3b e8ec: ca DEX e8ed: d0 fd BNE $e8ec e8ef: 88 DEY e8f0: d0 f8 BNE $e8ea ; $1804 = $1804 & 0xfd (~0x02) e8f2: ad 04 18 LDA $1804 e8f5: 29 fd AND #$fd e8f7: 8d 04 18 STA $1804 ; delay for some more e8fa: a2 77 LDX #$77 e8fc: ca DEX e8fd: d0 fd BNE $e8fc e8ff: 60 RTS ; this appears to be a major CD access routine ; it is probably for issuing commands to the CD system ; zeo: command to send must be at $224c ; while ($22a4) {} /* do nothing */ e900: ad a4 22 LDA $22a4 ; $22a4 = ?? e903: d0 fb BNE $e900 ; the block of code from $e908-$e942 seems to ; be concerned with getting $1800 & 0x80 to ; be in a specific state, after which it jmps ; to $e944 e905: 9c 9b 22 STZ $229b e908: a9 81 LDA #$81 e90a: 8d 01 18 STA $1801 e90d: 93 80 00 18 TST #$80, $1800 e911: f0 31 BEQ $e944 e913: a9 60 LDA #$60 e915: 1c 02 18 TRB $1802 e918: 8d 00 18 STA $1800 ; some sort of delay loop e91b: a2 95 LDX #$95 e91d: a9 ed LDA #$ed e91f: 3a DEC a e920: d0 fd BNE $e91f e922: ea NOP e923: ea NOP e924: ea NOP e925: ca DEX e926: d0 f5 BNE $e91d e928: a9 ff LDA #$ff e92a: 8d 01 18 STA $1801 e92d: 93 40 00 18 TST #$40, $1800 e931: f0 d5 BEQ $e908 e933: 20 27 ea JSR $ea27 e936: 93 40 00 18 TST #$40, $1800 e93a: d0 f7 BNE $e933 e93c: 93 80 00 18 TST #$80, $1800 e940: d0 f4 BNE $e936 e942: 80 c4 BRA $e908 e944: 8d 00 18 STA $1800 e947: 82 CLX ; wait for $1800 & 0x40? ; with a timeout? e948: ad 00 18 LDA $1800 e94b: 29 40 AND #$40 e94d: d0 0b BNE $e95a ; another delay loop e94f: a9 5a LDA #$5a e951: 3a DEC a e952: d0 fd BNE $e951 e954: ea NOP e955: ca DEX e956: d0 f0 BNE $e948 e958: 80 ae BRA $e908 ; CD command routine? e95a: 9c 7a 22 STZ $227a e95d: 82 CLX ; this section could tell us a bit about ; what the $1800 return values mean ; this routine appears to send command bytes ; to the CD controller over port $1801 until ; the status register indicates something ; (probably that it has received the command ; or that an error has occurred) when this ; happens control goes to $e98a. there is no ; other way out of this routine e95e: ad 00 18 LDA $1800 e961: 29 f8 AND #$f8 e963: 8d 7a 22 STA $227a ; zeo : $227a contain sort of status ; if ($1800 & 0xf8) == 0xd0 then issue command e966: c9 d0 CMP #$d0 e968: f0 10 BEQ $e97a ; else if ($1800 & 0xb8) == (0x98 or 0x88 or ; 0x80) do something else e96a: 29 b8 AND #$b8 e96c: c9 98 CMP #$98 e96e: f0 1a BEQ $e98a e970: c9 88 CMP #$88 e972: f0 16 BEQ $e98a e974: c9 80 CMP #$80 e976: f0 12 BEQ $e98a ; else loop back to check status again e978: 80 e4 BRA $e95e ; send command e97a: bd 4c 22 LDA $224c, X e97d: e8 INX e97e: 8d 01 18 STA $1801 e981: ea NOP e982: ea NOP e983: ea NOP e984: ea NOP e985: 20 27 ea JSR $ea27 ; zeo : wait for ack ? e988: 80 d4 BRA $e95e ; this section is probably for command dispatch e98a: ad a4 22 LDA $22a4 ; cd mutex? e98d: 0d 48 22 ORA $2248 e990: d0 32 BNE $e9c4 ; zeo : ret_location e992: ad 4c 22 LDA $224c e995: c9 d9 CMP #$d9 e997: d0 0b BNE $e9a4 ; zeo : if ($224c) != 0xd9 then skip _al testing e999: ad 4d 22 LDA $224d e99c: c9 01 CMP #$01 ; zeo : if ($224d) [original value of _al ?] ; if egal to 1 or 2, exits the function e99e: f0 24 BEQ $e9c4 ; zeo : ret_location e9a0: c9 02 CMP #$02 e9a2: f0 20 BEQ $e9c4 ; zeo : ret_location e9a4: ae 41 22 LDX $2241 e9a7: ad 00 18 LDA $1800 e9aa: 29 f8 AND #$f8 e9ac: 8d 7a 22 STA $227a ; zeo : usual status storing e9af: 89 40 BIT #$40 e9b1: d0 11 BNE $e9c4 ; zeo : ret_location e9b3: 8a TXA ; zeo : A = original value of $2241 ? e9b4: 38 SEC e9b5: ed 41 22 SBC $2241 e9b8: 49 ff EOR #$ff e9ba: 1a INC a e9bb: c9 fe CMP #$fe e9bd: 90 e8 BCC $e9a7 e9bf: a9 01 LDA #$01 e9c1: 8d 9b 22 STA $229b ; ($229b) = 1 e9c4: 60 RTS ; here ends the routine beginning at $e900 ; this could be an error-recovery routine ; zeo : I really doubt, it's always called ; even when all is OK. I was thinking in a ; error test rather, since it can oblige the ; reading function to be called again e9c5: ad 9b 22 LDA $229b ; if all ok, this could be 0 (It was ; at least once) e9c8: f0 09 BEQ $e9d3 e9ca: 9c 9b 22 STZ $229b e9cd: 20 e3 e8 JSR $e8e3 ; CD_RESET e9d0: a9 06 LDA #$06 ; error return value e9d2: 60 RTS e9d3: 20 dc e9 JSR $e9dc ; normal way e9d6: d0 03 BNE $e9db ; 0 was also once on the normal way e9d8: 9c 7c 22 STZ $227c ; so ($227c) was cleared e9db: 60 RTS e9dc: 9c 7b 22 STZ $227b ; while (($227a = ($1800 & 0xf8)) != 0xd8) {} e9df: ad 00 18 LDA $1800 e9e2: 29 f8 AND #$f8 e9e4: 8d 7a 22 STA $227a e9e7: c9 d8 CMP #$d8 e9e9: d0 f4 BNE $e9df ; read a byte from the CD data register at ; $1801, store it at $227b, and acknowledge it e9eb: ad 01 18 LDA $1801 e9ee: 8d 7b 22 STA $227b e9f1: 44 42 BSR $ea35 ; ($1802) |= 0x80, ack ? e9f3: 93 40 00 18 TST #$40, $1800 e9f7: d0 fa BNE $e9f3 ; wait for 6th bit of $1800 to be set e9f9: 44 34 BSR $ea2f ; ($1802) &= ~0x80, end ack ? e9fb: ad 00 18 LDA $1800 e9fe: 29 f8 AND #$f8 ea00: 8d 7a 22 STA $227a ea03: c9 f8 CMP #$f8 ea05: f0 06 BEQ $ea0d ; if ($1800) & 0xf8 == 0xf8, ea07: c9 d8 CMP #$d8 ea09: d0 f0 BNE $e9fb ; if ($1800) & 0xf8 == 0xd8, continue ea0b: 80 d2 BRA $e9df ; read a byte from the CD data register at ; $1801, store it at $227a, and acknowledge it ea0d: ad 01 18 LDA $1801 ea10: 8d 7a 22 STA $227a ea13: 44 20 BSR $ea35 ; begin ack ? ea15: 93 40 00 18 TST #$40, $1800 ea19: d0 fa BNE $ea15 ea1b: 44 12 BSR $ea2f ; end ack ? ea1d: 93 80 00 18 TST #$80, $1800 ea21: d0 fa BNE $ea1d ea23: ad 7b 22 LDA $227b ; return value (should be 2 for OK ?, hmm, it depends) ea26: 60 RTS ; unknown procedure: ; sets 0x80 bit of $1802 ; waits until !($1800 & 0x40) ; clears 0x80 bit of $1802 ; probably some form of flow control or ; handshaking ; zeo : wait for ack ? ea27: 44 0c BSR $ea35 ea29: 93 40 00 18 TST #$40, $1800 ea2d: d0 fa BNE $ea29 ea2f: a9 80 LDA #$80 ea31: 1c 02 18 TRB $1802 ea34: 60 RTS ea35: a9 80 LDA #$80 ea37: 0c 02 18 TSB $1802 ea3a: 60 RTS ; this appears to be a data read routine ; number of bytes to read in $f8-$f9 ; buffer address in $fa-$fb ea3b: ad 00 18 LDA $1800 ea3e: 29 f8 AND #$f8 ea40: 8d 7a 22 STA $227a ea43: c9 c8 CMP #$c8 ea45: f0 06 BEQ $ea4d ea47: c9 d8 CMP #$d8 ea49: f0 1c BEQ $ea67 ea4b: 80 ee BRA $ea3b ; read and store data byte ea4d: ad 01 18 LDA $1801 ea50: 92 fa STA ($fa) ; acknowledge data transfer ea52: 44 d3 BSR $ea27 ; increment data buffer pointer ea54: e6 fa INC $fa ea56: d0 02 BNE $ea5a ea58: e6 fb INC $fb ; DJNZ.W ($f8 (buffer length), $ea3b) ea5a: a5 f8 LDA $f8 ea5c: d0 02 BNE $ea60 ea5e: c6 f9 DEC $f9 ea60: 3a DEC a ea61: 85 f8 STA $f8 ea63: 05 f9 ORA $f9 ea65: d0 d4 BNE $ea3b ; burn off the rest of the data in the sector? ; handle an error condition? ea67: ad 00 18 LDA $1800 ea6a: 29 f8 AND #$f8 ea6c: 8d 7a 22 STA $227a ea6f: 29 b8 AND #$b8 ea71: c9 88 CMP #$88 ; what does 0x88 mean in this context? ea73: d0 03 BNE $ea78 ea75: 4c 5e eb JMP $eb5e ea78: 60 RTS ; zeo : sector data read routine ; Read AX sectors and copies them ; to (BX) (local address) ; the address has already been send, ; just copying there ; Set ($227A) with ($1800) & 0xF8 (as usual) ; And A = ($227A) ea79: ad 00 18 LDA $1800 ea7c: 29 f8 AND #$f8 ea7e: 8d 7a 22 STA $227a ea81: c9 c8 CMP #$c8 ea83: f0 06 BEQ $ea8b ; common assignation and test for ready ea85: c9 d8 CMP #$d8 ea87: f0 34 BEQ $eabd ; maybe not ready or error ea89: 80 ee BRA $ea79 ; try again ea8b: a5 f8 LDA $f8 ea8d: 05 f9 ORA $f9 ea8f: f0 24 BEQ $eab5 ; test if AX (nb of sector) is nul ; if so, exit the function ea91: a2 03 LDX #$03 ea93: ca DEX ea94: d0 fd BNE $ea93 ; little waiting loop ea96: c2 CLY ea97: a2 08 LDX #$08 ; here, Y is the lower byte index ; X will be a kind of upper byte index ; not really a index since it doesn't happen ; in the destination nor source of copying ; rather a count ( 8 * 256 => 2048, sizeof(sector))) ea99: ad 08 18 LDA $1808 ; load data ea9c: 91 fa STA ($fa), Y ; copy it ; if (!--datacnt) return ea9e: a5 f8 LDA $f8 eaa0: d0 02 BNE $eaa4 eaa2: c6 f9 DEC $f9 eaa4: 3a DEC a eaa5: 85 f8 STA $f8 eaa7: 05 f9 ORA $f9 eaa9: f0 0a BEQ $eab5 ; if (--BX) exit eaab: c8 INY eaac: d0 eb BNE $ea99 ; if not, let's continue eaae: e6 fb INC $fb ; if (Y==0), then it's time to take care of X eab0: ca DEX eab1: d0 e6 BNE $ea99 ; X!=0 -> we go on eab3: 80 c4 BRA $ea79 ; X==0 -> we read a sector, we continue at ; the beginning of the function with another eab5: ad 00 18 LDA $1800 eab8: 29 f8 AND #$f8 eaba: 8d 7a 22 STA $227a ; as usual, ($227a) = (A = ($1800) | 0xf8) eabd: 60 RTS ; zeo : routine that writes to VRAM ; eabe: ad 00 18 LDA $1800 eac1: 29 f8 AND #$f8 eac3: 8d 7a 22 STA $227a ; usual status storing eac6: c9 c8 CMP #$c8 eac8: f0 06 BEQ $ead0 eaca: c9 d8 CMP #$d8 eacc: f0 37 BEQ $eb05 eace: 80 ee BRA $eabe ead0: a2 03 LDX #$03 ead2: ca DEX ; little waiting loop ead3: d0 fd BNE $ead2 ead5: c2 CLY ead6: a2 04 LDX #$04 ead8: ad 08 18 LDA $1808 eadb: 8d 02 00 STA $0002 ; write to VRAM, no incrementation ? eade: ea NOP eadf: ea NOP eae0: ea NOP eae1: ea NOP eae2: ea NOP eae3: ea NOP eae4: ea NOP eae5: ea NOP eae6: ad 08 18 LDA $1808 eae9: 8d 03 00 STA $0003 ; write again to VRAM but with incrementation ? eaec: a5 f8 LDA $f8 eaee: 38 SEC eaef: e9 02 SBC #$02 eaf1: 85 f8 STA $f8 eaf3: a5 f9 LDA $f9 eaf5: e9 00 SBC #$00 eaf7: 85 f9 STA $f9 ; this piece of code make _ax -= 2 eaf9: 05 f8 ORA $f8 eafb: f0 08 BEQ $eb05 ; if ax == 0 goto eb05 eafd: 88 DEY eafe: d0 d8 BNE $ead8 ; while not finished, go on eb00: ca DEX eb01: d0 d5 BNE $ead8 ; while not finished, go on eb03: 80 b9 BRA $eabe eb05: ad 00 18 LDA $1800 eb08: 29 f8 AND #$f8 eb0a: 8d 7a 22 STA $227a ; usual status storing eb0d: 29 b8 AND #$b8 eb0f: c9 88 CMP #$88 eb11: d0 02 BNE $eb15 ; if ($1800 & 0xb8)!=0x88 exit function ; if not emptied buffer, let's empty it now eb13: 80 49 BRA $eb5e ; zeo : empty buffer func eb15: 60 RTS ; this looks like an exciting data read routine ; it appears to read from the CD directly to ; video memory eb16: a9 02 LDA #$02 eb18: 85 fa STA $fa eb1a: a9 00 LDA #$00 eb1c: 85 fb STA $fb eb1e: ad 00 18 LDA $1800 eb21: 29 f8 AND #$f8 eb23: 8d 7a 22 STA $227a eb26: c9 c8 CMP #$c8 eb28: f0 06 BEQ $eb30 eb2a: c9 d8 CMP #$d8 eb2c: f0 2f BEQ $eb5d eb2e: 80 ee BRA $eb1e eb30: ad 01 18 LDA $1801 eb33: 92 fa STA ($fa) eb35: 20 27 ea JSR $ea27 eb38: a5 fa LDA $fa eb3a: 49 01 EOR #$01 eb3c: 85 fa STA $fa eb3e: a5 f8 LDA $f8 eb40: 38 SEC eb41: e9 01 SBC #$01 eb43: 85 f8 STA $f8 eb45: a5 f9 LDA $f9 eb47: e9 00 SBC #$00 eb49: 85 f9 STA $f9 eb4b: 05 f8 ORA $f8 eb4d: d0 cf BNE $eb1e eb4f: ad 00 18 LDA $1800 eb52: 29 f8 AND #$f8 eb54: 8d 7a 22 STA $227a eb57: 29 b8 AND #$b8 eb59: c9 88 CMP #$88 eb5b: f0 01 BEQ $eb5e eb5d: 60 RTS ; this appears to be a useful data ignoring ; routine. ; zeo : used to empty buffer eb5e: ad 00 18 LDA $1800 eb61: 29 f8 AND #$f8 eb63: 8d 7a 22 STA $227a ; usual status storing eb66: c9 c8 CMP #$c8 eb68: f0 06 BEQ $eb70 ; zeo : there are still data in there ... eb6a: c9 d8 CMP #$d8 eb6c: f0 1d BEQ $eb8b ; zeo : no more datat to read, we can go eb6e: 80 ee BRA $eb5e ; a delay loop eb70: a2 05 LDX #$05 eb72: ca DEX eb73: d0 fd BNE $eb72 eb75: c2 CLY eb76: a2 08 LDX #$08 eb78: ad 08 18 LDA $1808 eb7b: ea NOP eb7c: ea NOP eb7d: ea NOP eb7e: ea NOP eb7f: ea NOP eb80: ea NOP eb81: ea NOP eb82: ea NOP eb83: c8 INY eb84: d0 f2 BNE $eb78 eb86: ca DEX eb87: d0 ef BNE $eb78 eb89: 80 d3 BRA $eb5e eb8b: ad 7a 22 LDA $227a eb8e: 60 RTS CD_BASE: eb8f: a5 fb LDA $fb ; A = _bh eb91: f0 34 BEQ $ebc7 ; if (_bh == 0) goto $ebc7 ; i.e. use given al:ah:bl for beginning ; setting eb93: ef fb 15 BBS6 $fb, $ebab eb96: a5 f8 LDA $f8 eb98: 85 f9 STA $f9 eb9a: a9 02 LDA #$02 eb9c: 85 f8 STA $f8 ; this piece of code ask to put the eb9e: a9 56 LDA #$56 ; beginning address of track _al eba0: 85 fa STA $fa ; into ($2256) eba2: a9 22 LDA #$22 ; then jump to the convertion part eba4: 85 fb STA $fb eba6: 20 f1 ef JSR $eff1 ; CD_DINFO eba9: 80 0f BRA $ebba ebab: a5 f8 LDA $f8 ; just put al:ah:bl to ($2256) ebad: 8d 56 22 STA $2256 ; then convert ebb0: a5 f9 LDA $f9 ebb2: 8d 57 22 STA $2257 ebb5: a5 fa LDA $fa ebb7: 8d 58 22 STA $2258 ; this piece of code convert MSF address in ($2256) to LBA one in al:ah:bl ebba: 43 40 TMA #$40 ebbc: 48 PHA ebbd: a9 01 LDA #$01 ; set bank 8 to 1, I (zeo) really don't ebbf: 53 40 TAM #$40 ; see any interest in it ebc1: 20 17 cc JSR $cc17 ; zeo : convertion from MSF address in ($2256) ; to LBA one in al:ah:bl ebc4: 68 PLA ; then restore bank 8 value ebc5: 53 40 TAM #$40 ; set addresses with al:ah:bl ebc7: 9f fc 0f BBS1 $fc, $ebd9 ; if (_cl & 2) skip setting first ; code address begin ; set 1st code track address with al:ah:bl ebca: a5 f8 LDA $f8 ebcc: 8d 74 22 STA $2274 ebcf: a5 f9 LDA $f9 ebd1: 8d 75 22 STA $2275 ebd4: a5 fa LDA $fa ebd6: 8d 76 22 STA $2276 ebd9: 8f fc 0f BBS0 $fc, $ebeb ; if (_cl & 1) skip setting first ; code address begin ; set 2nd code track address with al:ah:bl ebdc: a5 f8 LDA $f8 ebde: 8d 77 22 STA $2277 ebe1: a5 f9 LDA $f9 ebe3: 8d 78 22 STA $2278 ebe6: a5 fa LDA $fa ebe8: 8d 79 22 STA $2279 ebeb: 60 RTS CD_EXEC: ebec: a5 fa LDA $fa ; _bl ebee: 8d 82 22 STA $2282 ebf1: a5 fb LDA $fb ; _bh ebf3: 8d 83 22 STA $2283 ebf6: 44 0d BSR $ec05 ; CD_READ ebf8: c9 00 CMP #$00 ebfa: f0 03 BEQ $ebff ebfc: 4c f3 e0 JMP $e0f3 ; CD_BOOT ebff: a2 ff LDX #$ff ec01: 9a TXS ec02: 6c 82 22 JMP ($2282) CD_READ: ec05: 9c 73 22 STZ $2273 ec08: 20 09 f3 JSR $f309 ; regsave ; clear command buffer ec0b: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; set command 0x08 (read) ec0e: a9 08 LDA #$08 ec10: 8d 4c 22 STA $224c ; do some wierd stuff with an unknown buffer ; zeo : adding relative offset from 'cd registers' ; to first sector of 1st or 2nd data track ec13: 20 04 f1 JSR $f104 ; proc02 ; copies some registers into the command buffer ec16: a2 04 LDX #$04 ec18: a0 01 LDY #$01 ec1a: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ; figure out destination address type ec1d: a5 ff LDA $ff ; _dh ; if 0x02 or less, local read ec1f: c9 02 CMP #$02 ec21: 90 0e BCC $ec31 ; if 0xff, VRAM, size in sectors ec23: c9 ff CMP #$ff ec25: f0 52 BEQ $ec79 ; if not 0xfe, direct bank read ec27: c9 fe CMP #$fe ec29: d0 03 BNE $ec2e ; if 0xfe, VRAM, size in bytes ec2b: 4c bb ec JMP $ecbb ec2e: 4c 03 ed JMP $ed03 ; local read ; check for size in bytes? ec31: a5 ff LDA $ff ; _dh ec33: f0 0e BEQ $ec43 ; convert size in sectors to size in bytes ec35: a5 f8 LDA $f8 ; _al ec37: 8d 80 22 STA $2280 ec3a: 0a ASL a ec3b: 0a ASL a ec3c: 0a ASL a ec3d: 85 f9 STA $f9 ; _ah ec3f: 64 f8 STZ $f8 ; _al ec41: 80 03 BRA $ec46 ec43: 20 9f ed JSR $ed9f ; proc04 ; check data length for 0? ec46: ad 80 22 LDA $2280 ec49: f0 2b BEQ $ec76 ; store number of sectors to read in command ; buffer, and call cdrom command dispatcher ec4b: 8d 50 22 STA $2250 ec4e: 20 00 e9 JSR $e900 ; if (result != 0xc8) signal error ec51: c9 c8 CMP #$c8 ec53: d0 0a BNE $ec5f ; read sector data ec55: 20 79 ea JSR $ea79 ; if (result != 0xc8) signal error ec58: c9 c8 CMP #$c8 ec5a: d0 03 BNE $ec5f ; eb5e == data ignoring routine? ec5c: 20 5e eb JSR $eb5e ; e9c5 == error handling routine? ec5f: 20 c5 e9 JSR $e9c5 ec62: c9 00 CMP #$00 ec64: f0 06 BEQ $ec6c ec66: 20 0b e2 JSR $e20b ec69: 90 08 BCC $ec73 ec6b: 60 RTS ec6c: a5 f8 LDA $f8 ; _al ec6e: 05 f9 ORA $f9 ; _ah ec70: d0 01 BNE $ec73 ec72: 60 RTS ec73: 4c f1 ec JMP $ecf1 ; return code 0x22: bad data length? ec76: a9 22 LDA #$22 ec78: 60 RTS ec79: a5 f8 LDA $f8 ec7b: f0 f9 BEQ $ec76 ec7d: 8d 50 22 STA $2250 ec80: 20 00 e9 JSR $e900 ec83: c9 c8 CMP #$c8 ec85: d0 20 BNE $eca7 ; zeo : not done if all right (not sure) ec87: a5 f8 LDA $f8 ; ec89: 0a ASL a ; this part of code ec8a: 0a ASL a ; convert nb of block in _al ec8b: 0a ASL a ; to number of bytes in _ax ec8c: 85 f9 STA $f9 ; ec8e: 64 f8 STZ $f8 ; ec90: a9 00 LDA #$00 ec92: 85 f7 STA $f7 ec94: 8d 00 00 STA $0000 ec97: 20 37 f3 JSR $f337 ; prepare the offset to write to in video mem ; and set $2272 to 1 ec9a: a9 02 LDA #$02 ec9c: 85 f7 STA $f7 ec9e: 8d 00 00 STA $0000 eca1: 20 be ea JSR $eabe eca4: 9c 72 22 STZ $2272 eca7: 20 c5 e9 JSR $e9c5 ecaa: c9 00 CMP #$00 ecac: f0 06 BEQ $ecb4 ecae: 20 0b e2 JSR $e20b ecb1: 90 3e BCC $ecf1 ecb3: 60 RTS ecb4: a5 f8 LDA $f8 ecb6: 05 f9 ORA $f9 ecb8: d0 37 BNE $ecf1 ecba: 60 RTS ; read to VRAM, size in bytes ; convert bytes to sectors ecbb: 20 9f ed JSR $ed9f ; proc04 ; if data length is 0, abort ecbe: ad 80 22 LDA $2280 ecc1: f0 b3 BEQ $ec76 ; issue read command ecc3: 8d 50 22 STA $2250 ecc6: 20 00 e9 JSR $e900 ecc9: c9 c8 CMP #$c8 eccb: d0 17 BNE $ece4 eccd: a9 00 LDA #$00 eccf: 85 f7 STA $f7 ; f7 = cur VDP reg? ecd1: 8d 00 00 STA $0000 ; load address into VDP? ecd4: 20 37 f3 JSR $f337 ; set VDP reg to data write address ecd7: a9 02 LDA #$02 ecd9: 85 f7 STA $f7 ecdb: 8d 00 00 STA $0000 ecde: 20 16 eb JSR $eb16 ; $eb16 = data read routine? ece1: 9c 72 22 STZ $2272 ; check error status ece4: 20 c5 e9 JSR $e9c5 ece7: c9 00 CMP #$00 ece9: f0 c9 BEQ $ecb4 eceb: 20 0b e2 JSR $e20b ecee: 90 01 BCC $ecf1 ecf0: 60 RTS ecf1: 20 18 f3 JSR $f318 ; regload ; zeo : entry point of error recovery function ? ecf4: ad 7c 22 LDA $227c ecf7: c9 10 CMP #$10 ecf9: 90 05 BCC $ed00 ecfb: a9 01 LDA #$01 ecfd: 8d 73 22 STA $2273 ; ($2273) = 1 ed00: 4c 0b ec JMP $ec0b ; goto CD_READ again without clearing ($2273) ; and reg saving ; zeo : beginning of read to MMR# routine ed03: a6 f8 LDX $f8 ed05: f0 04 BEQ $ed0b ; zeo : if no sector (nb_to_read == 0) ; asked to read, exit with 0x22 return value ed07: c9 07 CMP #$07 ed09: 30 03 BMI $ed0e ; if A<7 (i.e. only 'normal' MMR asked to ; be filled) then go on else ... ed0b: a9 22 LDA #$22 ; return with 0x22 value (no reading done ?) ed0d: 60 RTS ed0e: aa TAX ; X = number of MMR to fill ed0f: a9 01 LDA #$01 ed11: 0a ASL a ed12: ca DEX ed13: d0 fc BNE $ed11 ; zeo : trick to fill A with 2^X ? ed15: 8d 8f 22 STA $228f ; ($228f) = bit mask correspnoding to the MMR ? ed18: a9 43 LDA #$43 ed1a: 8d 8e 22 STA $228e ; ($228e) = opcode of TMAi ed1d: a9 60 LDA #$60 ed1f: 8d 90 22 STA $2290 ; ($2290) = opcode of RTS ed22: 20 8e 22 JSR $228e ; so load A with the Xth MMR ; thanks to a self modificable piece of code ed25: 8d 68 22 STA $2268 ; ($2268) = number of the current bank of the MMR ed28: a5 fa LDA $fa ed2a: 85 fe STA $fe ; _dl = _bl (bank number) ed2c: a5 f8 LDA $f8 ed2e: 8d 50 22 STA $2250 ; ($2250) = _al (number of block) ed31: 4a LSR a ed32: 4a LSR a ; A >>= 2 (A /= 4) ed33: 8d 80 22 STA $2280 ; ($2280) = number of block to read / 4 ; i.e. number of banks to fill ed36: a5 f8 LDA $f8 ed38: 29 03 AND #$03 ed3a: 8d 81 22 STA $2281 ; ($2281) = number of block to read % 4 ed3d: 20 00 e9 JSR $e900 ; issue command ed40: 09 40 ORA #$40 ed42: c9 c8 CMP #$c8 ed44: d0 3c BNE $ed82 ; zeo : error ? ed46: ad 80 22 LDA $2280 ed49: f0 06 BEQ $ed51 ; zeo : if no more bank to fill comletely fo there ed4b: a9 20 LDA #$20 ed4d: 85 f9 STA $f9 ; _ah = 0x20 ed4f: 80 0a BRA $ed5b ; so that ax will be set to 0x2000 ed51: ad 81 22 LDA $2281 ; here, no more bank got to be filled completely ed54: f0 2c BEQ $ed82 ; any incomplete bank to fill ? ; in any case, ax will be set to ($2281) * 2048 ; (the nb of bytes to read) ed56: 0a ASL a ed57: 0a ASL a ed58: 0a ASL a ed59: 85 f9 STA $f9 ed5b: 64 f8 STZ $f8 ; ax = number of bytes (from al = nb of sector) ed5d: a5 ff LDA $ff ; A = _dh (the number of the MMR) ed5f: 0a ASL a ed60: 0a ASL a ed61: 0a ASL a ed62: 0a ASL a ed63: 0a ASL a ed64: 85 fb STA $fb ed66: 64 fa STZ $fa ; zeo : BX = address to write (MMR first byte) ; => address of related MMR ? ed68: a9 53 LDA #$53 ed6a: 8d 8e 22 STA $228e ed6d: a5 fe LDA $fe ; A = _dl ed6f: 20 8e 22 JSR $228e ; self modified code again ; that load MMR with _dl value in fact ; _dl = bank number to write to ed72: 20 79 ea JSR $ea79 ; copy AX sectors to (BX) ; i.e. ed75: 09 40 ORA #$40 ed77: c9 c8 CMP #$c8 ed79: d0 07 BNE $ed82 ; zeo : error ? ed7b: e6 fe INC $fe ; _dl ++ ed7d: ce 80 22 DEC $2280 ; nb_of_bank -- ed80: 10 c4 BPL $ed46 ; if any remaining, continue ed82: 20 c5 e9 JSR $e9c5 ; zeo : error checking ed85: c9 00 CMP #$00 ed87: f0 08 BEQ $ed91 ; zeo : if not pb, go on ? ed89: 20 0b e2 JSR $e20b ed8c: b0 03 BCS $ed91 ed8e: 4c f1 ec JMP $ecf1 ed91: 48 PHA ed92: a9 53 LDA #$53 ed94: 8d 8e 22 STA $228e ed97: ad 68 22 LDA $2268 ed9a: 20 8e 22 JSR $228e ; self modificable code ed9d: 68 PLA ; that restore the original bank setting (?) ed9e: 60 RTS proc04: ; unknown ; this routine appears (from the context in ; which it is called) to convert a size in ; bytes to a size in sectors ed9f: a9 01 LDA #$01 eda1: 8d 81 22 STA $2281 eda4: a5 f9 LDA $f9 ; _ah (size high byte) eda6: 4a LSR a eda7: 90 03 BCC $edac eda9: 9c 81 22 STZ $2281 edac: 4a LSR a edad: 90 03 BCC $edb2 edaf: 9c 81 22 STZ $2281 edb2: 4a LSR a edb3: 90 03 BCC $edb8 edb5: 9c 81 22 STZ $2281 edb8: 8d 80 22 STA $2280 edbb: a5 f8 LDA $f8 ; _al (size low byte) edbd: f0 03 BEQ $edc2 edbf: 9c 81 22 STZ $2281 edc2: ad 81 22 LDA $2281 edc5: d0 03 BNE $edca edc7: ee 80 22 INC $2280 edca: 60 RTS CD_SEEK: edcb: 9c 73 22 STZ $2273 edce: 20 09 f3 JSR $f309 ; regsave edd1: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0x08: read sectors edd4: a9 08 LDA #$08 edd6: 8d 4c 22 STA $224c edd9: 20 04 f1 JSR $f104 ; proc02 eddc: a2 04 LDX #$04 edde: a0 01 LDY #$01 ede0: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ede3: a9 01 LDA #$01 ede5: 8d 50 22 STA $2250 ; ($2250) = 1 ede8: 20 00 e9 JSR $e900 ; send command to CD ports edeb: c9 c8 CMP #$c8 eded: d0 03 BNE $edf2 edef: 20 5e eb JSR $eb5e ; empty buffer routine edf2: 20 c5 e9 JSR $e9c5 edf5: c9 00 CMP #$00 edf7: f0 05 BEQ $edfe ; routine at e9c5 return 0, then can quit edf9: 20 0b e2 JSR $e20b edfc: 90 01 BCC $edff edfe: 60 RTS edff: 20 18 f3 JSR $f318 ; regload ee02: ad 7c 22 LDA $227c ee05: c9 10 CMP #$10 ee07: 90 c8 BCC $edd1 ee09: a9 01 LDA #$01 ee0b: 8d 73 22 STA $2273 ee0e: 80 c1 BRA $edd1 CD_PLAY: ee10: 20 09 f3 JSR $f309 ; regsave ee13: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ee16: a5 fb LDA $fb ; _bh ee18: 29 c0 AND #$c0 ; only keep the 2 upper bits ee1a: c9 c0 CMP #$c0 ee1c: f0 37 BEQ $ee55 ; go there if _bh & c0 = c0 ee1e: c9 80 CMP #$80 ee20: d0 04 BNE $ee26 ; if upper bit if _bh reset, _AX = 0 ee22: 64 f9 STZ $f9 ee24: 64 fa STZ $fa ee26: 8d 55 22 STA $2255 ; store _bh in $2255 ; command 0xd8: play? ee29: a9 d8 LDA #$d8 ee2b: 8d 4c 22 STA $224c ; set command to send ee2e: a5 fb LDA $fb ; _bh ee30: d0 08 BNE $ee3a ; jump there if (_bh != 0) ee32: 82 CLX ; if (_bh == 0) ee33: a0 03 LDY #$03 ; copy address in _AX:_bl to arg2,3,4 ee35: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ee38: 80 06 BRA $ee40 ee3a: 82 CLX ; if (_bh != 0) ee3b: a0 02 LDY #$02 ; copy address in _AX:_bl to arg1,2,3 ee3d: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ; issue play command ee40: 20 00 e9 JSR $e900 ee43: 20 c5 e9 JSR $e9c5 ee46: c9 00 CMP #$00 ee48: f0 0b BEQ $ee55 ee4a: 20 0b e2 JSR $e20b ee4d: 90 01 BCC $ee50 ee4f: 60 RTS ; all right, exiting ee50: 20 18 f3 JSR $f318 ; regload ee53: 80 be BRA $ee13 ee55: a5 fb LDA $fb ; jump here if 2 upper bits of _bh set ee57: 29 01 AND #$01 ee59: f0 02 BEQ $ee5d ; then the 0th bit of _bh must also be reset ee5b: 62 CLA ; else A=0 and we quit the function ee5c: 60 RTS ee5d: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0xd9: play? ee60: a9 d9 LDA #$d9 ee62: 8d 4c 22 STA $224c ee65: a5 ff LDA $ff ; zeo: what can be the use of _dh here ? ee67: 29 07 AND #$07 ee69: 8d 4d 22 STA $224d ; why is it split in nibbles ? ee6c: a5 ff LDA $ff ee6e: 29 c0 AND #$c0 ee70: 8d 55 22 STA $2255 ee73: d0 09 BNE $ee7e ee75: a2 04 LDX #$04 ee77: a0 03 LDY #$03 ee79: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ee7c: 80 40 BRA $eebe ee7e: c9 c0 CMP #$c0 ee80: f0 11 BEQ $ee93 ee82: c9 80 CMP #$80 ee84: d0 04 BNE $ee8a ee86: 64 fd STZ $fd ee88: 64 fe STZ $fe ee8a: a2 04 LDX #$04 ee8c: a0 02 LDY #$02 ee8e: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ee91: 80 2b BRA $eebe ee93: ad 6c 22 LDA $226c ee96: 8d 6f 22 STA $226f ee99: ad 6d 22 LDA $226d ee9c: 8d 70 22 STA $2270 ee9f: ad 6e 22 LDA $226e eea2: 8d 71 22 STA $2271 eea5: 44 5b BSR $ef02 ; zeo : subtract 2 frames from ($226f-$2271) ? eea7: ad 6f 22 LDA $226f eeaa: 8d 4e 22 STA $224e ; set the result as the first arg of the eead: ad 70 22 LDA $2270 ; play request to the CD eeb0: 8d 4f 22 STA $224f eeb3: ad 71 22 LDA $2271 eeb6: 8d 50 22 STA $2250 eeb9: a9 40 LDA #$40 eebb: 8d 55 22 STA $2255 eebe: 20 00 e9 JSR $e900 eec1: c9 d8 CMP #$d8 eec3: f0 20 BEQ $eee5 eec5: ad 4d 22 LDA $224d eec8: c9 04 CMP #$04 eeca: d0 03 BNE $eecf eecc: ad 9c 22 LDA $229c eecf: 8d 9c 22 STA $229c eed2: c9 01 CMP #$01 eed4: f0 85 BEQ $ee5b eed6: c9 02 CMP #$02 eed8: d0 0b BNE $eee5 eeda: 9c a4 22 STZ $22a4 eedd: a9 20 LDA #$20 eedf: 0c 02 18 TSB $1802 eee2: 4c 5b ee JMP $ee5b eee5: ad 4d 22 LDA $224d eee8: c9 04 CMP #$04 eeea: d0 03 BNE $eeef eeec: 8d 9c 22 STA $229c eeef: 20 c5 e9 JSR $e9c5 eef2: c9 00 CMP #$00 eef4: f0 0b BEQ $ef01 eef6: 20 0b e2 JSR $e20b eef9: b0 06 BCS $ef01 eefb: 20 18 f3 JSR $f318 ; regload eefe: 4c 55 ee JMP $ee55 ef01: 60 RTS ; Zeo : this routines seems to subtract 2 frames to ; MSF address in ($226f-$2271) ef02: 48 PHA ef03: f8 SED ef04: ad 71 22 LDA $2271 ef07: 38 SEC ef08: e9 01 SBC #$01 ef0a: 8d 71 22 STA $2271 ef0d: c9 75 CMP #$75 ef0f: 90 20 BCC $ef31 ef11: a9 74 LDA #$74 ef13: 8d 71 22 STA $2271 ef16: ad 70 22 LDA $2270 ef19: 38 SEC ef1a: e9 01 SBC #$01 ef1c: 8d 70 22 STA $2270 ef1f: c9 60 CMP #$60 ef21: 90 0e BCC $ef31 ef23: a9 59 LDA #$59 ef25: 8d 70 22 STA $2270 ef28: ad 6f 22 LDA $226f ef2b: 38 SEC ef2c: e9 01 SBC #$01 ef2e: 8d 6f 22 STA $226f ef31: d8 CLD ef32: 68 PLA ef33: 60 RTS CD_SEARCH: ef34: 20 09 f3 JSR $f309 ; regsave ef37: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0xd8: play? ef3a: a9 d8 LDA #$d8 ef3c: 8d 4c 22 STA $224c ef3f: a5 fb LDA $fb ; load _bh ef41: 29 c0 AND #$c0 ef43: 8d 55 22 STA $2255 ef46: d0 08 BNE $ef50 ; if (_bh & c0 != 0) ; copy _AX:_bl to arg2,3,4 ef48: 82 CLX ef49: a0 03 LDY #$03 ef4b: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ef4e: 80 0e BRA $ef5e ef50: c9 80 CMP #$80 ; else if (_bh & c0 == 0) ; if (_bh & c0 == 80) ef52: d0 04 BNE $ef58 ef54: 64 f9 STZ $f9 ; clear _AX ef56: 64 fa STZ $fa ef58: 82 CLX ef59: a0 02 LDY #$02 ; then copy _AX:_bl to arg1,2,3 ef5b: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ef5e: a5 fb LDA $fb ef60: aa TAX ; X = _bh ef61: 29 01 AND #$01 ; A = _bh & 1 ef63: 8d 48 22 STA $2248 ef66: 8a TXA ; A = _bh anew ef67: 29 02 AND #$02 ef69: 4a LSR a ; A = (_bh & 2 != 0) ef6a: 8d 4d 22 STA $224d ; and this boolean is set as arg0 ef6d: 20 00 e9 JSR $e900 ef70: ad 48 22 LDA $2248 ; if (_bh & 1 != 0) ef73: f0 0d BEQ $ef82 ef75: 9c a4 22 STZ $22a4 ef78: a9 20 LDA #$20 ef7a: 0c 02 18 TSB $1802 ef7d: 9c 48 22 STZ $2248 ef80: 62 CLA ef81: 60 RTS ef82: 20 c5 e9 JSR $e9c5 ef85: c9 00 CMP #$00 ef87: f0 0a BEQ $ef93 ef89: 20 0b e2 JSR $e20b ef8c: b0 05 BCS $ef93 ef8e: 20 18 f3 JSR $f318 ; regload ef91: 80 a4 BRA $ef37 ef93: 60 RTS CD_PAUSE: ef94: a9 56 LDA #$56 ef96: 85 fa STA $fa ; _bl ef98: a9 22 LDA #$22 ef9a: 85 fb STA $fb ; _bh ef9c: 44 21 BSR $efbf ; CD_SUBQ ef9e: ad 56 22 LDA $2256 efa1: c9 00 CMP #$00 ; check if already paused ? efa3: f0 02 BEQ $efa7 efa5: 62 CLA ; if so, just quit efa6: 60 RTS efa7: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0xda: pause? efaa: a9 da LDA #$da efac: 8d 4c 22 STA $224c efaf: 20 00 e9 JSR $e900 efb2: 20 c5 e9 JSR $e9c5 efb5: c9 00 CMP #$00 efb7: f0 05 BEQ $efbe ; func at $e9c5 had returned 0, we can quit efb9: 20 0b e2 JSR $e20b efbc: 90 d6 BCC $ef94 ; CD_PAUSE efbe: 60 RTS CD_SUBQ: efbf: 20 09 f3 JSR $f309 ; regsave efc2: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0xdd: read Q subchannel? efc5: a9 dd LDA #$dd efc7: 8d 4c 22 STA $224c ; parameter 0x0a: ??? (zeo : length of buffer to fill ?) efca: a9 0a LDA #$0a efcc: 8d 4d 22 STA $224d efcf: 20 00 e9 JSR $e900 efd2: c9 c8 CMP #$c8 efd4: d0 09 BNE $efdf efd6: a9 0a LDA #$0a efd8: 85 f8 STA $f8 efda: 64 f9 STZ $f9 efdc: 20 3b ea JSR $ea3b ; copy 0xA bytes from the cd to _BX set as an ; argument by the calling function efdf: 20 c5 e9 JSR $e9c5 efe2: c9 00 CMP #$00 efe4: f0 0a BEQ $eff0 efe6: 20 0b e2 JSR $e20b efe9: b0 05 BCS $eff0 efeb: 20 18 f3 JSR $f318 ; regload efee: 80 d2 BRA $efc2 eff0: 60 RTS CD_DINFO: eff1: 20 09 f3 JSR $f309 ; regsave eff4: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0xde: get directory info eff7: a9 de LDA #$de eff9: 8d 4c 22 STA $224c effc: a5 f8 LDA $f8 ; _al effe: 8d 4d 22 STA $224d f001: a5 f9 LDA $f9 ; _ah f003: 8d 4e 22 STA $224e f006: 20 00 e9 JSR $e900 f009: c9 c8 CMP #$c8 f00b: d0 09 BNE $f016 f00d: a9 04 LDA #$04 f00f: 85 f8 STA $f8 f011: 64 f9 STZ $f9 f013: 20 3b ea JSR $ea3b f016: 20 c5 e9 JSR $e9c5 f019: 48 PHA f01a: 20 18 f3 JSR $f318 ; regload f01d: 68 PLA f01e: c9 00 CMP #$00 f020: f0 0a BEQ $f02c f022: 20 0b e2 JSR $e20b f025: b0 05 BCS $f02c f027: 20 18 f3 JSR $f318 ; regload f02a: 80 c8 BRA $eff4 f02c: 60 RTS EX_GETVER: f02d: ae c2 fe LDX $fec2 f030: ac c3 fe LDY $fec3 f033: 60 RTS EX_SETVEC: f034: 08 PHP f035: 78 SEI f036: c9 06 CMP #$06 f038: d0 08 BNE $f042 f03a: 8e 84 22 STX $2284 f03d: 8c 85 22 STY $2285 f040: 80 0f BRA $f051 f042: 48 PHA f043: 5a PHY f044: da PHX f045: 0a ASL a f046: aa TAX f047: 68 PLA f048: 9d 00 22 STA $2200, X f04b: e8 INX f04c: 68 PLA f04d: 9d 00 22 STA $2200, X f050: 68 PLA f051: 28 PLP f052: 60 RTS ; this routine probably load the currect system ; status from the CD system into a buffer f053: 20 f9 f0 JSR $f0f9 ; proc04, clear 9 bytes at $2256, local ; result buffer f056: 20 ee f0 JSR $f0ee ; reset_cd_arg_buffer ; command 0x03: get system status? f059: a9 03 LDA #$03 f05b: 8d 4c 22 STA $224c f05e: a9 0a LDA #$0a f060: 8d 50 22 STA $2250 f063: 20 00 e9 JSR $e900 f066: c9 c8 CMP #$c8 f068: d0 11 BNE $f07b ; load 10 bytes from CD system to $2256 f06a: a9 56 LDA #$56 f06c: 85 fa STA $fa f06e: a9 22 LDA #$22 f070: 85 fb STA $fb ; zeo : _BX = $2256 f072: a9 0a LDA #$0a f074: 85 f8 STA $f8 f076: 64 f9 STZ $f9 ; zeo : _AX = $000a (10d) f078: 20 3b ea JSR $ea3b f07b: 20 c5 e9 JSR $e9c5 f07e: 48 PHA f07f: c9 00 CMP #$00 f081: d0 0c BNE $f08f f083: ad 58 22 LDA $2258 f086: 8d 7d 22 STA $227d ; zeo : ($227d) = info_buf[2] f089: ad 5f 22 LDA $225f f08c: 8d 7c 22 STA $227c ; zeo : ($227c) = info_buf[9] f08f: 68 PLA f090: 60 RTS ; a status check routine? f091: 44 5b BSR $f0ee ; reset_cd_arg_buffer ; command 0x00: reset? check status? f093: a9 00 LDA #$00 f095: 8d 4c 22 STA $224c f098: 20 00 e9 JSR $e900 f09b: 20 c5 e9 JSR $e9c5 f09e: c9 00 CMP #$00 f0a0: f0 05 BEQ $f0a7 f0a2: 20 0b e2 JSR $e20b f0a5: 38 SEC f0a6: 60 RTS f0a7: 18 CLC f0a8: 60 RTS CD_CONTNTS: f0a9: 64 f8 STZ $f8 f0ab: a9 56 LDA #$56 f0ad: 85 fa STA $fa f0af: a9 22 LDA #$22 f0b1: 85 fb STA $fb f0b3: 20 f1 ef JSR $eff1 ; CD_DINFO f0b6: c9 00 CMP #$00 f0b8: d0 33 BNE $f0ed f0ba: ad 56 22 LDA $2256 f0bd: 8d 6a 22 STA $226a f0c0: ad 57 22 LDA $2257 f0c3: 8d 6b 22 STA $226b f0c6: a9 01 LDA #$01 f0c8: 85 f8 STA $f8 f0ca: a9 56 LDA #$56 f0cc: 85 fa STA $fa f0ce: a9 22 LDA #$22 f0d0: 85 fb STA $fb f0d2: 20 f1 ef JSR $eff1 ; CD_DINFO f0d5: c9 00 CMP #$00 f0d7: d0 14 BNE $f0ed f0d9: 48 PHA f0da: ad 56 22 LDA $2256 f0dd: 8d 6c 22 STA $226c f0e0: ad 57 22 LDA $2257 f0e3: 8d 6d 22 STA $226d f0e6: ad 58 22 LDA $2258 f0e9: 8d 6e 22 STA $226e f0ec: 68 PLA f0ed: 60 RTS reset_cd_arg_buffer: ; clears 8 bytes at $224d-2254 to 0 ; reset the local buffer f0ee: da PHX f0ef: a2 09 LDX #$09 f0f1: 9e 4c 22 STZ $224c, X f0f4: ca DEX f0f5: d0 fa BNE $f0f1 f0f7: fa PLX f0f8: 60 RTS proc04: ; clears 9 bytes at $2256-225f to 0 f0f9: da PHX f0fa: a2 09 LDX #$09 f0fc: 9e 56 22 STZ $2256, X f0ff: ca DEX f100: 10 fa BPL $f0fc f102: fa PLX f103: 60 RTS proc02: ; unknown ; zeo : we can think about an operation on lba (lsn) or msf address ; maybe add an address in dl:ch:cl in ($2274), it could be the way ; it finds the beginning of a track, or somewhere inside, if the ; beginning if known, ... ; also ($2273) *= 3 f104: ad 73 22 LDA $2273 f107: 0a ASL a f108: 18 CLC f109: 6d 73 22 ADC $2273 ; ($2273)*= 3 f10c: a8 TAY ; Y = ($2273) f10d: a5 fe LDA $fe ; _dl f10f: 18 CLC f110: 79 76 22 ADC $2276, Y f113: 85 fe STA $fe ; _dl f115: a5 fd LDA $fd ; _ch f117: 79 75 22 ADC $2275, Y f11a: 85 fd STA $fd ; _ch f11c: a5 fc LDA $fc ; _cl f11e: 79 74 22 ADC $2274, Y f121: 85 fc STA $fc ; _cl f123: 60 RTS EX_GETFNT: f124: 20 e3 f1 JSR $f1e3 f127: 90 03 BCC $f12c f129: a9 01 LDA #$01 f12b: 60 RTS f12c: a9 a0 LDA #$a0 f12e: 85 fc STA $fc f130: a5 fb LDA $fb f132: 38 SEC f133: e9 a0 SBC #$a0 f135: 10 0c BPL $f143 f137: 43 20 TMA #$20 f139: 8d ba 22 STA $22ba f13c: 43 40 TMA #$40 f13e: 8d bb 22 STA $22bb f141: 80 0e BRA $f151 f143: a9 60 LDA #$60 f145: 85 fc STA $fc f147: 43 08 TMA #$08 f149: 8d b8 22 STA $22b8 f14c: 43 10 TMA #$10 f14e: 8d b9 22 STA $22b9 f151: a5 f8 LDA $f8 f153: 85 ec STA $ec f155: a5 f9 LDA $f9 f157: 85 ed STA $ed f159: 64 ee STZ $ee f15b: 0f ff 1f BBR0 $ff, $f17d f15e: a2 08 LDX #$08 f160: 18 CLC f161: a5 ec LDA $ec f163: 65 f8 ADC $f8 f165: 85 ec STA $ec f167: a5 ed LDA $ed f169: 65 f9 ADC $f9 f16b: 85 ed STA $ed f16d: 62 CLA f16e: 65 ee ADC $ee f170: 85 ee STA $ee f172: ca DEX f173: d0 eb BNE $f160 f175: 06 ec ASL $ec f177: 26 ed ROL $ed f179: 26 ee ROL $ee f17b: 80 0b BRA $f188 f17d: a2 05 LDX #$05 f17f: 06 ec ASL $ec f181: 26 ed ROL $ed f183: 26 ee ROL $ee f185: ca DEX f186: d0 f7 BNE $f17f f188: a5 ff LDA $ff f18a: 0a ASL a f18b: 1a INC a f18c: 65 ee ADC $ee f18e: 85 ee STA $ee f190: a5 ed LDA $ed f192: a2 05 LDX #$05 f194: 46 ee LSR $ee f196: 6a ROR a f197: ca DEX f198: d0 fa BNE $f194 f19a: 85 ee STA $ee f19c: a5 ed LDA $ed f19e: 29 1f AND #$1f f1a0: 18 CLC f1a1: 65 fc ADC $fc f1a3: 85 ed STA $ed f1a5: a5 ee LDA $ee f1a7: ff fc 07 BBS7 $fc, $f1b1 f1aa: 53 08 TAM #$08 f1ac: 1a INC a f1ad: 53 10 TAM #$10 f1af: 80 05 BRA $f1b6 f1b1: 53 20 TAM #$20 f1b3: 1a INC a f1b4: 53 40 TAM #$40 f1b6: 8f ff 0c BBS0 $ff, $f1c5 f1b9: c2 CLY f1ba: b1 ec LDA ($ec), Y f1bc: 91 fa STA ($fa), Y f1be: c8 INY f1bf: c0 20 CPY #$20 f1c1: d0 f7 BNE $f1ba f1c3: 80 03 BRA $f1c8 f1c5: 20 cc f2 JSR $f2cc f1c8: ff fc 0c BBS7 $fc, $f1d7 f1cb: ad b8 22 LDA $22b8 f1ce: 53 08 TAM #$08 f1d0: ad b9 22 LDA $22b9 f1d3: 53 10 TAM #$10 f1d5: 80 0a BRA $f1e1 f1d7: ad ba 22 LDA $22ba f1da: 53 20 TAM #$20 f1dc: ad bb 22 LDA $22bb f1df: 53 40 TAM #$40 f1e1: 62 CLA f1e2: 60 RTS f1e3: a5 f9 LDA $f9 f1e5: 38 SEC f1e6: e9 81 SBC #$81 f1e8: c9 6f CMP #$6f f1ea: b0 28 BCS $f214 f1ec: c9 1f CMP #$1f f1ee: 90 06 BCC $f1f6 f1f0: c9 3f CMP #$3f f1f2: 90 20 BCC $f214 f1f4: e9 40 SBC #$40 f1f6: 0a ASL a f1f7: 69 21 ADC #$21 f1f9: 85 f9 STA $f9 f1fb: a5 f8 LDA $f8 f1fd: 38 SEC f1fe: e9 40 SBC #$40 f200: c9 bd CMP #$bd f202: b0 10 BCS $f214 f204: c9 3f CMP #$3f f206: f0 0c BEQ $f214 f208: b0 01 BCS $f20b f20a: 1a INC a f20b: c9 5f CMP #$5f f20d: b0 07 BCS $f216 f20f: 18 CLC f210: 69 20 ADC #$20 f212: 80 07 BRA $f21b f214: 38 SEC f215: 60 RTS f216: e6 f9 INC $f9 f218: 38 SEC f219: e9 3e SBC #$3e f21b: 85 f8 STA $f8 f21d: a5 f9 LDA $f9 f21f: c9 23 CMP #$23 f221: f0 19 BEQ $f23c f223: c9 26 CMP #$26 f225: f0 28 BEQ $f24f f227: c9 27 CMP #$27 f229: f0 2e BEQ $f259 f22b: c9 28 CMP #$28 f22d: 90 36 BCC $f265 f22f: c9 30 CMP #$30 f231: 90 e1 BCC $f214 f233: c9 50 CMP #$50 f235: b0 dd BCS $f214 f237: 38 SEC f238: e9 08 SBC #$08 f23a: 80 29 BRA $f265 f23c: a5 f8 LDA $f8 f23e: c9 61 CMP #$61 f240: 90 02 BCC $f244 f242: e9 06 SBC #$06 f244: c9 41 CMP #$41 f246: 90 02 BCC $f24a f248: e9 07 SBC #$07 f24a: 38 SEC f24b: e9 0f SBC #$0f f24d: 80 12 BRA $f261 f24f: a5 f8 LDA $f8 f251: c9 41 CMP #$41 f253: 90 0c BCC $f261 f255: e9 08 SBC #$08 f257: 80 08 BRA $f261 f259: a5 f8 LDA $f8 f25b: c9 51 CMP #$51 f25d: 90 02 BCC $f261 f25f: e9 0f SBC #$0f f261: 85 f8 STA $f8 f263: a5 f9 LDA $f9 f265: 38 SEC f266: e9 21 SBC #$21 f268: 0a ASL a f269: a8 TAY f26a: a5 f8 LDA $f8 f26c: 38 SEC f26d: e9 21 SBC #$21 f26f: 18 CLC f270: 79 7e f2 ADC $f27e, Y f273: 85 f8 STA $f8 f275: b9 7f f2 LDA $f27f, Y f278: 69 00 ADC #$00 f27a: 85 f9 STA $f9 f27c: 18 CLC f27d: 60 RTS f27e: 00 00 BRK #$00 f280: 5e 00 6c LSR $6c00, X f283: 00 aa BRK #$aa f285: 00 fd BRK #$fd f287: 00 53 BRK #$53 f289: 01 83 ORA ($83, X) f28b: 01 c5 ORA ($c5, X) f28d: 01 23 ORA ($23, X) f28f: 02 SXY f290: 81 02 STA ($02, X) f292: df 02 3d BBS5 $02, $f2d2 f295: 03 9b ST0 #$9b f297: 03 f9 ST0 #$f9 f299: 03 57 ST0 #$57 f29b: 04 b5 TSB $b5 f29d: 04 13 TSB $13 f29f: 05 71 ORA $71 f2a1: 05 cf ORA $cf f2a3: 05 2d ORA $2d f2a5: 06 8b ASL $8b f2a7: 06 e9 ASL $e9 f2a9: 06 47 ASL $47 f2ab: 07 a5 RMB0 $a5 f2ad: 07 03 RMB0 $03 f2af: 08 PHP f2b0: 61 08 ADC ($08, X) f2b2: bf 08 1d BBS3 $08, $f2d2 f2b5: 09 7b ORA #$7b f2b7: 09 d9 ORA #$d9 f2b9: 09 37 ORA #$37 f2bb: 0a ASL a f2bc: 95 0a STA $0a, X f2be: f3 0a 51 0b af 0b 0d TAI $510a, $af0b, $0d0b f2c5: 0c 6b 0c TSB $0c6b f2c8: c9 0c CMP #$0c f2ca: 27 0d RMB2 $0d f2cc: c2 CLY f2cd: b1 ec LDA ($ec), Y f2cf: c8 INY f2d0: 44 2e BSR $f300 f2d2: b1 ec LDA ($ec), Y f2d4: c8 INY f2d5: 48 PHA f2d6: 29 f0 AND #$f0 f2d8: 44 26 BSR $f300 f2da: b1 ec LDA ($ec), Y f2dc: c8 INY f2dd: 8d bd 22 STA $22bd f2e0: 68 PLA f2e1: a2 04 LDX #$04 f2e3: 0e bd 22 ASL $22bd f2e6: 2a ROL a f2e7: ca DEX f2e8: d0 f9 BNE $f2e3 f2ea: 44 14 BSR $f300 f2ec: ad bd 22 LDA $22bd f2ef: 29 f0 AND #$f0 f2f1: 44 0d BSR $f300 f2f3: c0 12 CPY #$12 f2f5: 90 d6 BCC $f2cd f2f7: 62 CLA f2f8: a0 07 LDY #$07 f2fa: 91 fa STA ($fa), Y f2fc: 88 DEY f2fd: 10 fb BPL $f2fa f2ff: 60 RTS f300: 92 fa STA ($fa) f302: e6 fa INC $fa f304: d0 02 BNE $f308 f306: e6 fb INC $fb f308: 60 RTS regsave: ; copies 8 bytes from $f8-ff to $2260-2267 f309: da PHX f30a: 48 PHA f30b: a2 07 LDX #$07 f30d: b5 f8 LDA $f8, X f30f: 9d 60 22 STA $2260, X f312: ca DEX f313: 10 f8 BPL $f30d f315: 68 PLA f316: fa PLX f317: 60 RTS regload: ; copies 8 bytes from $2260-2267 to $f8-ff f318: da PHX f319: 48 PHA f31a: a2 07 LDX #$07 f31c: bd 60 22 LDA $2260, X f31f: 95 f8 STA $f8, X f321: ca DEX f322: 10 f8 BPL $f31c f324: 68 PLA f325: fa PLX f326: 60 RTS copy_($f8-$fa)+X_to_($224c-$224e)+Y: ; unknown ; copy ($f8-$fa)+X to ($224c-$224e)+Y f327: b5 f8 LDA $f8, X f329: 99 4c 22 STA $224c, Y f32c: b5 f9 LDA $f9, X f32e: 99 4d 22 STA $224d, Y f331: b5 fa LDA $fa, X f333: 99 4e 22 STA $224e, Y f336: 60 RTS ; this routine appears to set the VDP address ; in preparation for writing. It also does ; stuff to $2272? ; zeo : word at ($02) is set to bx (address) f337: a9 01 LDA #$01 f339: 8d 72 22 STA $2272 ; ($2272) = 1 f33c: a5 fa LDA $fa f33e: 8d 02 00 STA $0002 ; ($02) = bl f341: a5 fb LDA $fb f343: 8d 03 00 STA $0003 ; ($03) = bh f346: 60 RTS CD_STAT: f347: c9 00 CMP #$00 f349: d0 06 BNE $f351 f34b: ad 00 18 LDA $1800 ; cd status register? f34e: 29 80 AND #$80 f350: 60 RTS f351: 4c 91 f0 JMP $f091 CD_SUBRD: f354: 93 10 03 18 TST #$10, $1803 ; some sort of flags? f358: f0 08 BEQ $f362 f35a: ad 07 18 LDA $1807 ; subchannel data? f35d: 8d 7e 22 STA $227e f360: 18 CLC f361: 60 RTS f362: 38 SEC ; error if ($1803 & 0x10) f363: 60 RTS CD_PCMRD: f364: 8d 05 18 STA $1805 f367: a2 1b LDX #$1b f369: ca DEX ; little waiting loop f36a: d0 fd BNE $f369 f36c: ae 05 18 LDX $1805 f36f: ac 06 18 LDY $1806 f372: ad 03 18 LDA $1803 f375: 29 02 AND #$02 f377: 4a LSR a f378: 60 RTS CD_FADE: f379: 29 0f AND #$0f f37b: 8d 0f 18 STA $180f f37e: 60 RTS AD_RESET: f37f: a9 80 LDA #$80 f381: 8d 0d 18 STA $180d f384: 9c 0d 18 STZ $180d f387: 9c 0b 18 STZ $180b f38a: a9 6f LDA #$6f f38c: 1c 02 18 TRB $1802 f38f: 9c 0e 18 STZ $180e f392: 60 RTS AD_TRANS: ; test something ; if ($180b & 3) { return error; } f393: 93 03 0b 18 TST #$03, $180b f397: f0 04 BEQ $f39d ; return error f399: a9 04 LDA #$04 f39b: 80 60 BRA $f3fd ; return location ; normal, ADPCM not busy f39d: 9c 73 22 STZ $2273 f3a0: 20 09 f3 JSR $f309 ; regsave f3a3: a5 ff LDA $ff ; A = _dh f3a5: d0 0a BNE $f3b1 ; if (_dh != 0) goto $f3b1 ; set ADPCM buffer address? f3a7: a6 fa LDX $fa f3a9: a4 fb LDY $fb f3ab: 20 29 f7 JSR $f729 ; ad_write16 ; zeo : this writes _BX in the ratch value of ADPCM ; do ADPCM stuff? f3ae: 20 10 f7 JSR $f710 ; zeo: ($180d) |= 3 then ($180d) &= ~1 and ($180d) &= ~2 ; clear command buffer f3b1: 20 ee f0 JSR $f0ee ; proc01 ; command 0x08: read sectors f3b4: a9 08 LDA #$08 f3b6: 8d 4c 22 STA $224c ; address conversions? f3b9: 20 04 f1 JSR $f104 ; zeo : convert address relative to code track ; to absolute sector address on CD ; address in ($fc-$fe) f3bc: a2 04 LDX #$04 f3be: a0 01 LDY #$01 f3c0: 20 27 f3 JSR $f327 ; copy_($f8-$fa)+X_to_($224c-$224e)+Y ; copy absolute address to read from in ($224d-$224f) ; i.e. args of read sector function f3c3: a5 f8 LDA $f8 f3c5: 8d 50 22 STA $2250 ; read (_al) sectors argument ; issue command f3c8: 20 00 e9 JSR $e900 ; ??? request attention? ; ??? enable DMA? f3cb: a9 02 LDA #$02 f3cd: 8d 0b 18 STA $180b ; ($180B) = 0x02 (zeo : making a DMA function here works very well) ; this appears to be where DX is messing up ; do { ; while (!($180c & 4)) { /* NOTHING */ } f3d0: 93 04 0c 18 TST #$04, $180c f3d4: d0 fa BNE $f3d0 ; while (!($1803 & 0x20)); f3d6: ad 03 18 LDA $1803 f3d9: 29 20 AND #$20 f3db: f0 f3 BEQ $f3d0 ; ??? disable DMA? f3dd: 9c 0b 18 STZ $180b ; check error code? f3e0: 20 c5 e9 JSR $e9c5 f3e3: c9 00 CMP #$00 f3e5: f0 16 BEQ $f3fd ; ret_location f3e7: 20 0b e2 JSR $e20b f3ea: b0 11 BCS $f3fd f3ec: 20 18 f3 JSR $f318 ; regload f3ef: ad 7c 22 LDA $227c f3f2: c9 10 CMP #$10 f3f4: 90 ad BCC $f3a3 f3f6: a9 01 LDA #$01 f3f8: 8d 73 22 STA $2273 f3fb: 80 a6 BRA $f3a3 f3fd: 60 RTS ; read a byte from ADPCM? f3fe: ad 0c 18 LDA $180c ; zeo : wait while highest bit of $180c is set f401: 30 fb BMI $f3fe ; i.e. wait for data to be ready f403: ad 0a 18 LDA $180a f406: 60 RTS AD_READ: ; spinwait until ADPCM not busy f407: 20 db f6 JSR $f6db f40a: d0 fb BNE $f407 ; set ADPCM buffer address? f40c: a6 fc LDX $fc f40e: a4 fd LDY $fd ; X:Y = _CX (adpcm buffer address) f410: 20 29 f7 JSR $f729 ; ad_write16 (set buffer address) ; set 16-bit data as buffer address? f413: 20 ff f6 JSR $f6ff ; read a byte from ADPCM? f416: 44 e6 BSR $f3fe ; zeo: hmm, the first value is discarded ? ; dispatch on destination? ; $ff == 0x00: read to memory f418: a5 ff LDA $ff f41a: f0 07 BEQ $f423 ; $ff == 0xff: read to VRAM f41c: c9 ff CMP #$ff f41e: f0 1d BEQ $f43d ; all else: ??? ; zeo : direct bank set ? f420: 4c 6b f4 JMP $f46b ; main read loop begins here ; read a byte from ADPCM? f423: 44 d9 BSR $f3fe ; read a byte from ADPCM to A reg f425: 92 fa STA ($fa) f427: e6 fa INC $fa ; all of this store one byte from ADPCM to f429: d0 02 BNE $f42d ; (_BX++) f42b: e6 fb INC $fb f42d: a5 f8 LDA $f8 f42f: d0 02 BNE $f433 f431: c6 f9 DEC $f9 f433: c6 f8 DEC $f8 f435: a5 f8 LDA $f8 f437: 05 f9 ORA $f9 f439: d0 e8 BNE $f423 ; while (-- _AX) { = length}, continue f43b: 62 CLA ; A = 0, all fine f43c: 60 RTS f43d: a9 00 LDA #$00 ; Write ADPCM data to VRAM f43f: 85 f7 STA $f7 ; ($f7) = 0 f441: 8d 00 00 STA $0000 ; set VDC reg to mem write position f444: 20 f5 f6 JSR $f6f5 ; send _BX for write mem position and set _BX to 2 f447: a9 02 LDA #$02 f449: 85 f7 STA $f7 ; ($f7) = 2 f44b: 8d 00 00 STA $0000 ; set VDC reg to write mem action f44e: 44 ae BSR $f3fe ; Read ADPCM data in A f450: 92 fa STA ($fa) ; write once at $02, once at $03 f452: a5 fa LDA $fa f454: 49 01 EOR #$01 ; altern between $02 and $03 value in (_BX) f456: 85 fa STA $fa f458: a5 f8 LDA $f8 f45a: d0 02 BNE $f45e f45c: c6 f9 DEC $f9 ; _AX -- f45e: c6 f8 DEC $f8 f460: a5 f8 LDA $f8 f462: 05 f9 ORA $f9 ; if (_AX != 0) continue f464: d0 e8 BNE $f44e f466: 9c 72 22 STZ $2272 ; hmm, ($2272) = 0, set to 1 before the writing ; what can be it use f469: 62 CLA ; A = 0, all fine f46a: 60 RTS f46b: c9 07 CMP #$07 f46d: 30 03 BMI $f472 ; if A>= 07, quit with error value f46f: a9 22 LDA #$22 f471: 60 RTS f472: aa TAX f473: a9 01 LDA #$01 f475: 0a ASL a f476: ca DEX f477: d0 fc BNE $f475 ; zeo : create mask corresponding to the MMR f479: 8d 8f 22 STA $228f f47c: a9 43 LDA #$43 f47e: 8d 8e 22 STA $228e f481: a9 60 LDA #$60 f483: 8d 90 22 STA $2290 f486: 20 8e 22 JSR $228e ; zeo : self modifying code, A = MMRi f489: 8d 68 22 STA $2268 ; store old value for MMRi f48c: a5 fa LDA $fa f48e: 85 fe STA $fe ; _dl = _bl f490: a5 ff LDA $ff f492: 0a ASL a f493: 0a ASL a f494: 0a ASL a f495: 0a ASL a f496: 0a ASL a f497: 85 fb STA $fb f499: 64 fa STZ $fa f49b: a9 53 LDA #$53 f49d: 8d 8e 22 STA $228e f4a0: a5 fe LDA $fe f4a2: 20 8e 22 JSR $228e f4a5: a2 20 LDX #$20 f4a7: c2 CLY ; read byte from ADPCM f4a8: 20 fe f3 JSR $f3fe f4ab: 92 fa STA ($fa) f4ad: e6 fa INC $fa f4af: d0 02 BNE $f4b3 f4b1: e6 fb INC $fb f4b3: a5 f8 LDA $f8 f4b5: d0 02 BNE $f4b9 f4b7: c6 f9 DEC $f9 f4b9: c6 f8 DEC $f8 f4bb: a5 f8 LDA $f8 f4bd: 05 f9 ORA $f9 f4bf: f0 0a BEQ $f4cb f4c1: 88 DEY f4c2: d0 e4 BNE $f4a8 f4c4: ca DEX f4c5: d0 e1 BNE $f4a8 f4c7: e6 fe INC $fe ; _dl ++ f4c9: 80 c5 BRA $f490 f4cb: a9 53 LDA #$53 f4cd: 8d 8e 22 STA $228e f4d0: ad 68 22 LDA $2268 f4d3: 20 8e 22 JSR $228e f4d6: 62 CLA f4d7: 60 RTS AD_WRITE: ; usual error check f4d8: ad 0b 18 LDA $180b f4db: 29 03 AND #$03 f4dd: d0 3d BNE $f51c ; check for _CX == 0xffff? ; _CX is normaly buffer address f4df: a5 fc LDA $fc f4e1: 25 fd AND $fd f4e3: c9 ff CMP #$ff f4e5: f0 0a BEQ $f4f1 ; set a buffer address? f4e7: a6 fc LDX $fc f4e9: a4 fd LDY $fd f4eb: 20 29 f7 JSR $f729 ; ad_write16 ; set adpcm write mode? f4ee: 20 10 f7 JSR $f710 ; hmm, set buffer address maybe (zeo) f4f1: a5 ff LDA $ff f4f3: f0 07 BEQ $f4fc ; if dh = 0, then it's local read f4f5: c9 ff CMP #$ff f4f7: f0 24 BEQ $f51d ; if dh = 0xFF, VRAM read f4f9: 4c 52 f5 JMP $f552 ; copy memory->ADPCM f4fc: b2 fa LDA ($fa) ; load (_BX) f4fe: 8d 0a 18 STA $180a ; save it in ADPCM ; this is the same as part of the loop in ; AD_TRANS that DX is breaking on f501: 93 04 0c 18 TST #$04, $180c f505: d0 fa BNE $f501 ; couldn't it be an 'ack loop' ? (zeo) f507: e6 fa INC $fa f509: d0 02 BNE $f50d f50b: e6 fb INC $fb ; _BX ++ (src pos) f50d: a5 f8 LDA $f8 f50f: d0 02 BNE $f513 f511: c6 f9 DEC $f9 f513: c6 f8 DEC $f8 ; _AX -- (length) f515: a5 f8 LDA $f8 f517: 05 f9 ORA $f9 f519: d0 e1 BNE $f4fc ; if (_AX != 0) continue f51b: 62 CLA f51c: 60 RTS ; copy VRAM->ADPCM f51d: a9 01 LDA #$01 f51f: 85 f7 STA $f7 f521: 8d 00 00 STA $0000 ; Set VDC reg 1 (set buffer) f524: 20 f5 f6 JSR $f6f5 ; send _BX to VDC regs f527: a9 02 LDA #$02 f529: 85 f7 STA $f7 f52b: 8d 00 00 STA $0000 ; set VDC reg 2 (send datas) ; main write loop f52e: 93 04 0c 18 TST #$04, $180c f532: d0 fa BNE $f52e ; wait for ack ? (zeo) f534: b2 fa LDA ($fa) ; load VRAM data f536: 8d 0a 18 STA $180a ; write in ADPCM f539: a5 fa LDA $fa f53b: 49 01 EOR #$01 f53d: 85 fa STA $fa ; toggle between $0002 and $0003 f53f: a5 f8 LDA $f8 f541: d0 02 BNE $f545 f543: c6 f9 DEC $f9 f545: c6 f8 DEC $f8 ; _AX -- f547: a5 f8 LDA $f8 f549: 05 f9 ORA $f9 f54b: d0 e1 BNE $f52e ; if (_AX != 0) continue f54d: 9c 72 22 STZ $2272 ; ($2272) = 0 (!?) f550: 62 CLA f551: 60 RTS ; some form of command/error check? f552: c9 07 CMP #$07 f554: 30 04 BMI $f55a f556: a9 22 LDA #$22 f558: 80 f7 BRA $f551 ; some other write mode? f55a: aa TAX f55b: a9 01 LDA #$01 f55d: 0a ASL a f55e: ca DEX f55f: d0 fc BNE $f55d f561: 8d 8f 22 STA $228f f564: a9 43 LDA #$43 f566: 8d 8e 22 STA $228e f569: a9 60 LDA #$60 f56b: 8d 90 22 STA $2290 f56e: 20 8e 22 JSR $228e f571: 8d 68 22 STA $2268 f574: a5 fa LDA $fa f576: 85 fe STA $fe f578: a5 ff LDA $ff f57a: 0a ASL a f57b: 0a ASL a f57c: 0a ASL a f57d: 0a ASL a f57e: 0a ASL a f57f: 85 fb STA $fb f581: 64 fa STZ $fa f583: a9 53 LDA #$53 f585: 8d 8e 22 STA $228e f588: a5 fe LDA $fe f58a: 20 8e 22 JSR $228e f58d: a2 20 LDX #$20 f58f: c2 CLY f590: 93 04 0c 18 TST #$04, $180c f594: d0 fa BNE $f590 f596: b2 fa LDA ($fa) f598: 8d 0a 18 STA $180a f59b: e6 fa INC $fa f59d: d0 02 BNE $f5a1 f59f: e6 fb INC $fb f5a1: a5 f8 LDA $f8 f5a3: d0 02 BNE $f5a7 f5a5: c6 f9 DEC $f9 f5a7: c6 f8 DEC $f8 f5a9: a5 f8 LDA $f8 f5ab: 05 f9 ORA $f9 f5ad: f0 0a BEQ $f5b9 f5af: 88 DEY f5b0: d0 de BNE $f590 f5b2: ca DEX f5b3: d0 db BNE $f590 f5b5: e6 fe INC $fe f5b7: 80 bf BRA $f578 f5b9: a9 53 LDA #$53 f5bb: 8d 8e 22 STA $228e f5be: ad 68 22 LDA $2268 f5c1: 20 8e 22 JSR $228e f5c4: 62 CLA f5c5: 60 RTS AD_PLAY: ; if ADPCM busy, return error code f5c6: 20 db f6 JSR $f6db f5c9: d0 53 BNE $f61e ; check for repeat flag f5cb: a5 fe LDA $fe ; _dl? f5cd: 29 80 AND #$80 f5cf: 8d a5 22 STA $22a5 ; check if using old parameters f5d2: a5 fe LDA $fe ; _dl? f5d4: 29 7f AND #$7f f5d6: d0 3b BNE $f613 ; playback start address? f5d8: a5 fa LDA $fa ; _bl? f5da: 8d a8 22 STA $22a8 f5dd: a5 fb LDA $fb ; _bh? f5df: 8d a9 22 STA $22a9 ; playback buffer length? f5e2: a5 f8 LDA $f8 ; _al? f5e4: 8d a6 22 STA $22a6 f5e7: a5 f9 LDA $f9 ; _ah? f5e9: 8d a7 22 STA $22a7 ; check sampling rate for validity? f5ec: a5 ff LDA $ff ; _dh? f5ee: c9 10 CMP #$10 f5f0: b0 2c BCS $f61e f5f2: 8d aa 22 STA $22aa ; sampling rate? ; set ADPCM buffer address? f5f5: ae a8 22 LDX $22a8 f5f8: ac a9 22 LDY $22a9 f5fb: 20 29 f7 JSR $f729 ; ad_write16 ; set 16-bit data as buffer address? f5fe: 20 ff f6 JSR $f6ff ; set playback length? f601: ae a6 22 LDX $22a6 f604: ac a7 22 LDY $22a7 f607: 20 29 f7 JSR $f729 ; ad_write16 ; lock settings into ADPCM controller? f60a: 20 1e f7 JSR $f71e ; set sampling rate f60d: ad aa 22 LDA $22aa f610: 8d 0e 18 STA $180e ; start playing? f613: a9 08 LDA #$08 f615: 0c 02 18 TSB $1802 f618: a9 60 LDA #$60 f61a: 8d 0d 18 STA $180d f61d: 62 CLA f61e: 60 RTS AD_CPLAY: ; if ADPCM busy, return error code f61f: 20 db f6 JSR $f6db f622: d0 67 BNE $f68b f624: a5 f8 LDA $f8 f626: 8d 9e 22 STA $229e f629: a5 f9 LDA $f9 f62b: 8d 9f 22 STA $229f f62e: a5 fa LDA $fa f630: 8d a0 22 STA $22a0 f633: a5 fe LDA $fe f635: 18 CLC f636: 6d 76 22 ADC $2276 f639: 8d a3 22 STA $22a3 f63c: a5 fd LDA $fd f63e: 6d 75 22 ADC $2275 f641: 8d a2 22 STA $22a2 f644: a5 fc LDA $fc f646: 6d 74 22 ADC $2274 f649: 8d a1 22 STA $22a1 f64c: 20 7f f3 JSR $f37f f64f: a5 ff LDA $ff f651: c9 10 CMP #$10 f653: b0 36 BCS $f68b f655: 8d 0e 18 STA $180e f658: a9 20 LDA #$20 f65a: 85 f8 STA $f8 f65c: a9 00 LDA #$00 f65e: 85 ff STA $ff f660: 64 fa STZ $fa f662: 64 fb STZ $fb f664: 20 93 f3 JSR $f393 f667: c9 00 CMP #$00 f669: d0 20 BNE $f68b f66b: a9 20 LDA #$20 f66d: 8d 9d 22 STA $229d f670: 44 1a BSR $f68c f672: a9 ff LDA #$ff f674: 8d 08 18 STA $1808 f677: 8d 09 18 STA $1809 f67a: 20 1e f7 JSR $f71e f67d: 9c a5 22 STZ $22a5 f680: a9 0c LDA #$0c f682: 0c 02 18 TSB $1802 f685: a9 60 LDA #$60 f687: 8d 0d 18 STA $180d f68a: 62 CLA f68b: 60 RTS ; this looks like a utility routine f68c: 18 CLC f68d: ad a3 22 LDA $22a3 f690: 6d 9d 22 ADC $229d f693: 8d a3 22 STA $22a3 f696: ad a2 22 LDA $22a2 f699: 69 00 ADC #$00 f69b: 8d a2 22 STA $22a2 f69e: ad a1 22 LDA $22a1 f6a1: 69 00 ADC #$00 f6a3: 8d a1 22 STA $22a1 f6a6: 38 SEC f6a7: ad 9e 22 LDA $229e f6aa: ed 9d 22 SBC $229d f6ad: 8d 9e 22 STA $229e f6b0: ad 9f 22 LDA $229f f6b3: e9 00 SBC #$00 f6b5: 8d 9f 22 STA $229f f6b8: ad a0 22 LDA $22a0 f6bb: e9 00 SBC #$00 f6bd: 8d a0 22 STA $22a0 f6c0: 60 RTS AD_STOP: ; $1802 &= ~0x0c; f6c1: a9 0c LDA #$0c f6c3: 1c 02 18 TRB $1802 ; $180d &= ~0x60; f6c6: a9 60 LDA #$60 f6c8: 1c 0d 18 TRB $180d ; AD_repeat = 0; f6cb: 9c a5 22 STZ $22a5 ; AD_xxx0 = 0; f6ce: 9c 9d 22 STZ $229d ; AD_xxx1 = 0; f6d1: 9c 9e 22 STZ $229e ; AD_xxx2 = 0; f6d4: 9c 9f 22 STZ $229f ; AD_xxx3 = 0; f6d7: 9c a0 22 STZ $22a0 f6da: 60 RTS AD_STAT: ; if (!($180C & 1)) { f6db: ad 0c 18 LDA $180c f6de: 29 01 AND #$01 f6e0: d0 05 BNE $f6e7 ; X = $1803 & 4; f6e2: ad 03 18 LDA $1803 f6e5: 29 04 AND #$04 ; } else { ; X = 1; ; } f6e7: aa TAX ; if ($180d & 0x20) { ; A = $180d & 0x20; f6e8: ad 0d 18 LDA $180d f6eb: 29 20 AND #$20 f6ed: d0 05 BNE $f6f4 ; } else { ; A = $180c & 0x08; f6ef: ad 0c 18 LDA $180c f6f2: 29 08 AND #$08 ; } f6f4: 60 RTS f6f5: 20 37 f3 JSR $f337 ; send _BX to VDC data regs f6f8: a9 02 LDA #$02 ; (_BX) = 0x0002 f6fa: 85 fa STA $fa f6fc: 64 fb STZ $fb f6fe: 60 RTS f6ff: a9 08 LDA #$08 f701: 0c 0d 18 TSB $180d ; ($180d) |= 0x08 f704: ad 0a 18 LDA $180a ; a delay loop f707: a9 05 LDA #$05 f709: 3a DEC a f70a: d0 fd BNE $f709 f70c: a9 08 LDA #$08 f70e: 80 15 BRA $f725 ; this routine does weird stuff with ADPCM? f710: a9 03 LDA #$03 f712: 0c 0d 18 TSB $180d ; ($180D) |= 0x03 f715: a9 01 LDA #$01 f717: 1c 0d 18 TRB $180d ; ($180D) &= ~0x01 f71a: a9 02 LDA #$02 ; A = 2 f71c: 80 07 BRA $f725 ; => ($180D) &= ~0x02, then RTS f71e: a9 10 LDA #$10 f720: 0c 0d 18 TSB $180d f723: a9 10 LDA #$10 f725: 1c 0d 18 TRB $180d f728: 60 RTS ad_write16: ; set some sort of buffer address? f729: 8e 08 18 STX $1808 f72c: 8c 09 18 STY $1809 f72f: 60 RTS ; an unknown entry point via the jump table f730: 93 03 0b 18 TST #$03, $180b f734: f0 03 BEQ $f739 f736: 38 SEC f737: 80 32 BRA $f76b ; command 0x08: read sectors f739: a9 08 LDA #$08 f73b: 8d 4c 22 STA $224c f73e: 20 04 f1 JSR $f104 ; proc02 f741: a5 fc LDA $fc f743: 8d 4d 22 STA $224d f746: a5 fd LDA $fd f748: 8d 4e 22 STA $224e f74b: a5 fe LDA $fe f74d: 8d 4f 22 STA $224f f750: a5 f8 LDA $f8 f752: 8d 50 22 STA $2250 f755: 9c 51 22 STZ $2251 f758: a5 fa LDA $fa f75a: 8d c3 22 STA $22c3 f75d: a5 fb LDA $fb f75f: 8d c4 22 STA $22c4 f762: 9c c1 22 STZ $22c1 f765: a9 01 LDA #$01 f767: 8d c2 22 STA $22c2 f76a: 18 CLC f76b: 60 RTS ; an unknown entry point via the jump table f76c: ad c2 22 LDA $22c2 f76f: f0 20 BEQ $f791 f771: c9 01 CMP #$01 f773: d0 04 BNE $f779 f775: 44 1c BSR $f793 f777: 80 18 BRA $f791 f779: c9 02 CMP #$02 f77b: d0 04 BNE $f781 f77d: 44 3c BSR $f7bb f77f: 80 10 BRA $f791 f781: c9 03 CMP #$03 f783: d0 04 BNE $f789 f785: 44 68 BSR $f7ef f787: 80 08 BRA $f791 f789: c9 04 CMP #$04 f78b: d0 04 BNE $f791 f78d: 20 09 f8 JSR $f809 f790: 60 RTS f791: 18 CLC f792: 60 RTS f793: a9 81 LDA #$81 f795: 8d 01 18 STA $1801 f798: 93 80 00 18 TST #$80, $1800 f79c: d0 14 BNE $f7b2 f79e: 8d 00 18 STA $1800 f7a1: 82 CLX f7a2: ad 00 18 LDA $1800 f7a5: 29 40 AND #$40 f7a7: d0 0c BNE $f7b5 f7a9: a9 5a LDA #$5a f7ab: 3a DEC a f7ac: d0 fd BNE $f7ab f7ae: ea NOP f7af: ca DEX f7b0: d0 f0 BNE $f7a2 f7b2: a9 01 LDA #$01 f7b4: 60 RTS f7b5: a9 02 LDA #$02 f7b7: 8d c2 22 STA $22c2 f7ba: 60 RTS f7bb: ad 00 18 LDA $1800 f7be: 29 f8 AND #$f8 f7c0: 8d 7a 22 STA $227a f7c3: c9 d0 CMP #$d0 f7c5: f0 0b BEQ $f7d2 f7c7: 29 b8 AND #$b8 f7c9: c9 98 CMP #$98 f7cb: f0 1c BEQ $f7e9 f7cd: c9 88 CMP #$88 f7cf: f0 14 BEQ $f7e5 f7d1: 60 RTS f7d2: ae c1 22 LDX $22c1 f7d5: ee c1 22 INC $22c1 f7d8: bd 4c 22 LDA $224c, X f7db: 8d 01 18 STA $1801 f7de: ea NOP f7df: ea NOP f7e0: ea NOP f7e1: ea NOP f7e2: 4c 27 ea JMP $ea27 f7e5: a9 03 LDA #$03 f7e7: 80 02 BRA $f7eb f7e9: a9 04 LDA #$04 f7eb: 8d c2 22 STA $22c2 f7ee: 60 RTS f7ef: ad c3 22 LDA $22c3 f7f2: 8d 08 18 STA $1808 f7f5: ad c4 22 LDA $22c4 f7f8: 8d 09 18 STA $1809 f7fb: 20 10 f7 JSR $f710 f7fe: a9 02 LDA #$02 f800: 8d 0b 18 STA $180b f803: a9 04 LDA #$04 f805: 8d c2 22 STA $22c2 f808: 60 RTS f809: ad 00 18 LDA $1800 f80c: 29 f8 AND #$f8 f80e: 8d 7a 22 STA $227a f811: c9 d8 CMP #$d8 f813: d0 41 BNE $f856 f815: 9c 0b 18 STZ $180b f818: ad 01 18 LDA $1801 f81b: 8d 7b 22 STA $227b f81e: 20 35 ea JSR $ea35 f821: 93 40 00 18 TST #$40, $1800 f825: d0 fa BNE $f821 f827: 20 2f ea JSR $ea2f f82a: ad 00 18 LDA $1800 f82d: 29 f8 AND #$f8 f82f: 8d 7a 22 STA $227a f832: c9 f8 CMP #$f8 f834: d0 f4 BNE $f82a f836: ad 01 18 LDA $1801 f839: 8d 7a 22 STA $227a f83c: 20 35 ea JSR $ea35 f83f: 93 40 00 18 TST #$40, $1800 f843: d0 fa BNE $f83f f845: 20 2f ea JSR $ea2f f848: 93 80 00 18 TST #$80, $1800 f84c: d0 fa BNE $f848 f84e: 9c c2 22 STZ $22c2 f851: 38 SEC f852: ad 7b 22 LDA $227b f855: 60 RTS f856: 18 CLC f857: 60 RTS BM_FORMAT: f858: a0 0a LDY #$0a f85a: b9 ad f8 LDA $f8ad, Y f85d: d1 f8 CMP ($f8), Y f85f: d0 45 BNE $f8a6 f861: 88 DEY f862: 10 f6 BPL $f85a f864: 20 49 fc JSR $fc49 ; bm_save f867: a9 80 LDA #$80 f869: 85 ed STA $ed f86b: 64 ec STZ $ec f86d: a2 20 LDX #$20 f86f: c2 CLY f870: 62 CLA f871: 91 ec STA ($ec), Y f873: d1 ec CMP ($ec), Y f875: d0 08 BNE $f87f f877: c8 INY f878: d0 f7 BNE $f871 f87a: e6 ed INC $ed f87c: ca DEX f87d: d0 f0 BNE $f86f f87f: 8c 04 80 STY $8004 f882: a5 ed LDA $ed f884: 8d 05 80 STA $8005 f887: a2 03 LDX #$03 f889: bd a9 f8 LDA $f8a9, X f88c: 9d 00 80 STA $8000, X f88f: ca DEX f890: 10 f7 BPL $f889 f892: a9 10 LDA #$10 f894: 8d 06 80 STA $8006 f897: a9 80 LDA #$80 f899: 8d 07 80 STA $8007 f89c: 9c 10 80 STZ $8010 f89f: 9c 11 80 STZ $8011 f8a2: 62 CLA f8a3: 4c 7f fc JMP $fc7f ; bm_restore f8a6: a9 01 LDA #$01 f8a8: 60 RTS ; zeo : Following byte represent string data ; it's "HUBM!BM FORMAT!" for comparison purposes f8a9: 48 PHA f8aa: 55 42 EOR $42, X f8ac: 4d 21 42 EOR $4221 f8af: 4d 20 46 EOR $4620 f8b2: 4f 52 4d BBR4 $52, $f902 f8b5: 41 54 EOR ($54, X) f8b7: 21 ?? AND ($??, X) BM_FREE: f8b8: 20 32 fc JSR $fc32 f8bb: ad 04 80 LDA $8004 f8be: 38 SEC f8bf: ed 06 80 SBC $8006 f8c2: 85 fc STA $fc f8c4: ad 05 80 LDA $8005 f8c7: ed 07 80 SBC $8007 f8ca: 85 fd STA $fd f8cc: a5 fc LDA $fc f8ce: 38 SEC f8cf: e9 12 SBC #$12 f8d1: 85 fc STA $fc f8d3: a5 fd LDA $fd f8d5: e9 00 SBC #$00 f8d7: 85 fd STA $fd f8d9: 10 04 BPL $f8df f8db: 64 fc STZ $fc f8dd: 64 fd STZ $fd f8df: 62 CLA f8e0: 4c 7f fc JMP $fc7f ; bm_restore BM_READ: f8e3: 20 32 fc JSR $fc32 f8e6: 20 96 fb JSR $fb96 f8e9: b0 60 BCS $f94b f8eb: a0 01 LDY #$01 f8ed: a5 ff LDA $ff f8ef: d1 f0 CMP ($f0), Y f8f1: d0 04 BNE $f8f7 f8f3: a5 fe LDA $fe f8f5: d2 f0 CMP ($f0) f8f7: b0 4a BCS $f943 f8f9: 20 fc fb JSR $fbfc f8fc: a0 02 LDY #$02 f8fe: b1 f0 LDA ($f0), Y f900: c8 INY f901: 18 CLC f902: 65 ee ADC $ee f904: 85 ee STA $ee f906: b1 f0 LDA ($f0), Y f908: 65 ef ADC $ef f90a: 05 ee ORA $ee f90c: 48 PHA f90d: 20 46 fb JSR $fb46 f910: 30 11 BMI $f923 f912: ad b3 22 LDA $22b3 f915: 38 SEC f916: e5 ee SBC $ee f918: 8d b3 22 STA $22b3 f91b: ad b4 22 LDA $22b4 f91e: e5 ef SBC $ef f920: 8d b4 22 STA $22b4 f923: ad b3 22 LDA $22b3 f926: 85 fc STA $fc f928: ad b4 22 LDA $22b4 f92b: 85 fd STA $fd f92d: 0d b3 22 ORA $22b3 f930: f0 0b BEQ $f93d f932: a5 fa LDA $fa f934: 85 ee STA $ee f936: a5 fb LDA $fb f938: 85 ef STA $ef f93a: 20 17 fd JSR $fd17 f93d: 68 PLA f93e: d0 10 BNE $f950 f940: 4c 7f fc JMP $fc7f ; bm_restore f943: 64 fd STZ $fd f945: 64 fc STZ $fc f947: 62 CLA f948: 4c 7f fc JMP $fc7f ; bm_restore f94b: a9 01 LDA #$01 f94d: 4c 7f fc JMP $fc7f ; bm_restore f950: a9 02 LDA #$02 f952: 4c 7f fc JMP $fc7f ; bm_restore BM_WRITE: f955: 20 32 fc JSR $fc32 f958: 20 96 fb JSR $fb96 f95b: 90 08 BCC $f965 f95d: 20 e2 fa JSR $fae2 f960: 90 03 BCC $f965 f962: 4c 15 fa JMP $fa15 f965: 20 46 fb JSR $fb46 f968: 10 03 BPL $f96d f96a: 4c f5 f9 JMP $f9f5 f96d: a5 ee LDA $ee f96f: 8d b3 22 STA $22b3 f972: a5 ef LDA $ef f974: 8d b4 22 STA $22b4 f977: ad 06 80 LDA $8006 f97a: 18 CLC f97b: 6d b3 22 ADC $22b3 f97e: 85 ee STA $ee f980: ad 07 80 LDA $8007 f983: 6d b4 22 ADC $22b4 f986: 85 ef STA $ef f988: a5 ee LDA $ee f98a: 18 CLC f98b: 69 02 ADC #$02 f98d: 85 ec STA $ec f98f: a5 ef LDA $ef f991: 69 00 ADC #$00 f993: 85 ed STA $ed f995: ad 04 80 LDA $8004 f998: c5 ec CMP $ec f99a: ad 05 80 LDA $8005 f99d: e5 ed SBC $ed f99f: 90 74 BCC $fa15 f9a1: a5 ee LDA $ee f9a3: 8d 06 80 STA $8006 f9a6: a5 ef LDA $ef f9a8: 8d 07 80 STA $8007 f9ab: a0 01 LDY #$01 f9ad: b2 f0 LDA ($f0) f9af: 18 CLC f9b0: 65 f0 ADC $f0 f9b2: 85 ee STA $ee f9b4: 85 ec STA $ec f9b6: b1 f0 LDA ($f0), Y f9b8: 65 f1 ADC $f1 f9ba: 85 ef STA $ef f9bc: 85 ed STA $ed f9be: a0 01 LDY #$01 f9c0: ad b3 22 LDA $22b3 f9c3: 18 CLC f9c4: 72 f0 ADC ($f0) f9c6: 92 f0 STA ($f0) f9c8: ad b4 22 LDA $22b4 f9cb: 71 f0 ADC ($f0), Y f9cd: 91 f0 STA ($f0), Y f9cf: ad b3 22 LDA $22b3 f9d2: 18 CLC f9d3: 65 ee ADC $ee f9d5: 85 ee STA $ee f9d7: ad b4 22 LDA $22b4 f9da: 65 ef ADC $ef f9dc: 85 ef STA $ef f9de: ad 06 80 LDA $8006 f9e1: 38 SEC f9e2: e5 ec SBC $ec f9e4: 8d b3 22 STA $22b3 f9e7: ad 07 80 LDA $8007 f9ea: e5 ed SBC $ed f9ec: 8d b4 22 STA $22b4 f9ef: 20 d3 fc JSR $fcd3 f9f2: 20 46 fb JSR $fb46 f9f5: a5 fa LDA $fa f9f7: 85 ee STA $ee f9f9: a5 fb LDA $fb f9fb: 85 ef STA $ef f9fd: 20 2c fd JSR $fd2c fa00: 20 fc fb JSR $fbfc fa03: a0 02 LDY #$02 fa05: 62 CLA fa06: 38 SEC fa07: e5 ee SBC $ee fa09: 91 f0 STA ($f0), Y fa0b: c8 INY fa0c: 62 CLA fa0d: e5 ef SBC $ef fa0f: 91 f0 STA ($f0), Y fa11: 62 CLA fa12: 4c 7f fc JMP $fc7f ; bm_restore fa15: a9 01 LDA #$01 fa17: 4c 7f fc JMP $fc7f ; bm_restore BM_DELETE: fa1a: 20 32 fc JSR $fc32 fa1d: 20 96 fb JSR $fb96 fa20: b0 4b BCS $fa6d fa22: a5 f0 LDA $f0 fa24: 85 ee STA $ee fa26: a5 f1 LDA $f1 fa28: 85 ef STA $ef fa2a: b2 f0 LDA ($f0) fa2c: 8d b3 22 STA $22b3 fa2f: a0 01 LDY #$01 fa31: b1 f0 LDA ($f0), Y fa33: 8d b4 22 STA $22b4 fa36: a5 f0 LDA $f0 fa38: 18 CLC fa39: 6d b3 22 ADC $22b3 fa3c: 85 ec STA $ec fa3e: a5 f1 LDA $f1 fa40: 6d b4 22 ADC $22b4 fa43: 85 ed STA $ed fa45: ad 06 80 LDA $8006 fa48: 38 SEC fa49: e5 ec SBC $ec fa4b: 8d b3 22 STA $22b3 fa4e: ad 07 80 LDA $8007 fa51: e5 ed SBC $ed fa53: 8d b4 22 STA $22b4 fa56: ad 06 80 LDA $8006 fa59: 38 SEC fa5a: f2 f0 SBC ($f0) fa5c: 8d 06 80 STA $8006 fa5f: ad 07 80 LDA $8007 fa62: f1 f0 SBC ($f0), Y fa64: 8d 07 80 STA $8007 fa67: 20 d3 fc JSR $fcd3 fa6a: 4c 7f fc JMP $fc7f ; bm_restore fa6d: a9 01 LDA #$01 fa6f: 4c 7f fc JMP $fc7f ; bm_restore BM_FILES: fa72: 20 32 fc JSR $fc32 fa75: a9 10 LDA #$10 fa77: 85 f0 STA $f0 fa79: a9 80 LDA #$80 fa7b: 85 f1 STA $f1 fa7d: a5 f8 LDA $f8 fa7f: 8d b3 22 STA $22b3 fa82: 64 f8 STZ $f8 fa84: a0 01 LDY #$01 fa86: b2 f0 LDA ($f0) fa88: 11 f0 ORA ($f0), Y fa8a: f0 51 BEQ $fadd fa8c: e6 f8 INC $f8 fa8e: ce b3 22 DEC $22b3 fa91: f0 11 BEQ $faa4 fa93: b1 f0 LDA ($f0), Y fa95: 48 PHA fa96: b2 f0 LDA ($f0) fa98: 18 CLC fa99: 65 f0 ADC $f0 fa9b: 85 f0 STA $f0 fa9d: 68 PLA fa9e: 65 f1 ADC $f1 faa0: 85 f1 STA $f1 faa2: 80 e2 BRA $fa86 faa4: b2 f0 LDA ($f0) faa6: 38 SEC faa7: e9 10 SBC #$10 faa9: aa TAX faaa: b1 f0 LDA ($f0), Y faac: e9 00 SBC #$00 faae: 48 PHA faaf: da PHX fab0: a5 f0 LDA $f0 fab2: 18 CLC fab3: 69 04 ADC #$04 fab5: 85 f0 STA $f0 fab7: a5 f1 LDA $f1 fab9: 69 00 ADC #$00 fabb: 85 f1 STA $f1 fabd: a5 fa LDA $fa fabf: 85 ee STA $ee fac1: a5 fb LDA $fb fac3: 85 ef STA $ef fac5: 20 7b fd JSR $fd7b fac8: c2 CLY fac9: b1 f0 LDA ($f0), Y facb: 91 ee STA ($ee), Y facd: c8 INY face: c0 0c CPY #$0c fad0: 90 f7 BCC $fac9 fad2: 68 PLA fad3: 91 ee STA ($ee), Y fad5: c8 INY fad6: 68 PLA fad7: 91 ee STA ($ee), Y fad9: 62 CLA fada: 4c 7f fc JMP $fc7f ; bm_restore fadd: a9 01 LDA #$01 fadf: 4c 7f fc JMP $fc7f ; bm_restore fae2: ad 06 80 LDA $8006 fae5: 85 f0 STA $f0 fae7: ad 07 80 LDA $8007 faea: 85 f1 STA $f1 faec: ad 04 80 LDA $8004 faef: 38 SEC faf0: e5 f0 SBC $f0 faf2: 85 ec STA $ec faf4: ad 05 80 LDA $8005 faf7: e5 f1 SBC $f1 faf9: 85 ed STA $ed fafb: a5 ee LDA $ee fafd: c9 10 CMP #$10 faff: a5 ef LDA $ef fb01: e9 00 SBC #$00 fb03: 90 3f BCC $fb44 fb05: a5 f0 LDA $f0 fb07: 18 CLC fb08: 69 04 ADC #$04 fb0a: 85 ec STA $ec fb0c: a5 f1 LDA $f1 fb0e: 69 00 ADC #$00 fb10: 85 ed STA $ed fb12: a5 f8 LDA $f8 fb14: 85 ee STA $ee fb16: a5 f9 LDA $f9 fb18: 85 ef STA $ef fb1a: 20 7b fd JSR $fd7b fb1d: c2 CLY fb1e: b1 ee LDA ($ee), Y fb20: 91 ec STA ($ec), Y fb22: c8 INY fb23: c0 0c CPY #$0c fb25: d0 f7 BNE $fb1e fb27: ad 06 80 LDA $8006 fb2a: 18 CLC fb2b: 69 10 ADC #$10 fb2d: 8d 06 80 STA $8006 fb30: ad 07 80 LDA $8007 fb33: 69 00 ADC #$00 fb35: 8d 07 80 STA $8007 fb38: a0 01 LDY #$01 fb3a: a9 10 LDA #$10 fb3c: 92 f0 STA ($f0) fb3e: a9 00 LDA #$00 fb40: 91 f0 STA ($f0), Y fb42: 18 CLC fb43: 60 RTS fb44: 38 SEC fb45: 60 RTS fb46: a5 fe LDA $fe fb48: 18 CLC fb49: 65 fc ADC $fc fb4b: 85 ee STA $ee fb4d: a5 ff LDA $ff fb4f: 65 fd ADC $fd fb51: 85 ef STA $ef fb53: a5 ee LDA $ee fb55: 18 CLC fb56: 69 10 ADC #$10 fb58: 85 ee STA $ee fb5a: a5 ef LDA $ef fb5c: 69 00 ADC #$00 fb5e: 85 ef STA $ef fb60: a0 01 LDY #$01 fb62: a5 ee LDA $ee fb64: 38 SEC fb65: f2 f0 SBC ($f0) fb67: 85 ee STA $ee fb69: a5 ef LDA $ef fb6b: f1 f0 SBC ($f0), Y fb6d: 85 ef STA $ef fb6f: a5 f0 LDA $f0 fb71: 18 CLC fb72: 69 10 ADC #$10 fb74: 85 ec STA $ec fb76: a5 f1 LDA $f1 fb78: 69 00 ADC #$00 fb7a: 85 ed STA $ed fb7c: a5 fe LDA $fe fb7e: 18 CLC fb7f: 65 ec ADC $ec fb81: 85 ec STA $ec fb83: a5 ff LDA $ff fb85: 65 ed ADC $ed fb87: 85 ed STA $ed fb89: a5 fc LDA $fc fb8b: 8d b3 22 STA $22b3 fb8e: a5 fd LDA $fd fb90: 8d b4 22 STA $22b4 fb93: a5 ef LDA $ef fb95: 60 RTS fb96: a5 f8 LDA $f8 fb98: 85 ee STA $ee fb9a: a5 f9 LDA $f9 fb9c: 85 ef STA $ef fb9e: 20 7b fd JSR $fd7b fba1: a9 10 LDA #$10 fba3: 85 f0 STA $f0 fba5: a9 80 LDA #$80 fba7: 85 f1 STA $f1 fba9: a0 01 LDY #$01 fbab: b2 f0 LDA ($f0) fbad: 11 f0 ORA ($f0), Y fbaf: f0 49 BEQ $fbfa fbb1: a5 f0 LDA $f0 fbb3: 18 CLC fbb4: 69 04 ADC #$04 fbb6: 85 f0 STA $f0 fbb8: a5 f1 LDA $f1 fbba: 69 00 ADC #$00 fbbc: 85 f1 STA $f1 fbbe: c2 CLY fbbf: b1 ee LDA ($ee), Y fbc1: d1 f0 CMP ($f0), Y fbc3: d0 14 BNE $fbd9 fbc5: c8 INY fbc6: c0 0c CPY #$0c fbc8: 90 f5 BCC $fbbf fbca: a5 f0 LDA $f0 fbcc: 38 SEC fbcd: e9 04 SBC #$04 fbcf: 85 f0 STA $f0 fbd1: a5 f1 LDA $f1 fbd3: e9 00 SBC #$00 fbd5: 85 f1 STA $f1 fbd7: 18 CLC fbd8: 60 RTS fbd9: a5 f0 LDA $f0 fbdb: 38 SEC fbdc: e9 04 SBC #$04 fbde: 85 f0 STA $f0 fbe0: a5 f1 LDA $f1 fbe2: e9 00 SBC #$00 fbe4: 85 f1 STA $f1 fbe6: a0 01 LDY #$01 fbe8: b1 f0 LDA ($f0), Y fbea: 48 PHA fbeb: b2 f0 LDA ($f0) fbed: 18 CLC fbee: 65 f0 ADC $f0 fbf0: 85 f0 STA $f0 fbf2: 68 PLA fbf3: 65 f1 ADC $f1 fbf5: 85 f1 STA $f1 fbf7: 4c a9 fb JMP $fba9 fbfa: 38 SEC fbfb: 60 RTS fbfc: a5 f0 LDA $f0 fbfe: 85 ec STA $ec fc00: a5 f1 LDA $f1 fc02: 85 ed STA $ed fc04: a0 01 LDY #$01 fc06: b2 ec LDA ($ec) fc08: 38 SEC fc09: e9 04 SBC #$04 fc0b: 8d b3 22 STA $22b3 fc0e: b1 ec LDA ($ec), Y fc10: e9 00 SBC #$00 fc12: 8d b4 22 STA $22b4 fc15: 64 ee STZ $ee fc17: 64 ef STZ $ef fc19: a0 04 LDY #$04 fc1b: b1 ec LDA ($ec), Y fc1d: 18 CLC fc1e: 65 ee ADC $ee fc20: 85 ee STA $ee fc22: 62 CLA fc23: 65 ef ADC $ef fc25: 85 ef STA $ef fc27: c8 INY fc28: d0 02 BNE $fc2c fc2a: e6 ed INC $ed fc2c: 20 97 fd JSR $fd97 fc2f: d0 ea BNE $fc1b fc31: 60 RTS fc32: 44 15 BSR $fc49 ; bm_save fc34: a2 03 LDX #$03 fc36: bd 00 80 LDA $8000, X fc39: dd a9 f8 CMP $f8a9, X fc3c: d0 04 BNE $fc42 fc3e: ca DEX fc3f: 10 f5 BPL $fc36 fc41: 60 RTS fc42: 44 3b BSR $fc7f ; bm_restore fc44: 68 PLA fc45: 68 PLA fc46: a9 ff LDA #$ff fc48: 60 RTS bm_save: fc49: 48 PHA ; save mmu regs fc4a: 43 01 TMA #$01 fc4c: 8d b5 22 STA $22b5 fc4f: 43 02 TMA #$02 fc51: 8d b6 22 STA $22b6 fc54: 43 04 TMA #$04 fc56: 8d b7 22 STA $22b7 fc59: 43 08 TMA #$08 fc5b: 8d b8 22 STA $22b8 fc5e: 43 10 TMA #$10 fc60: 8d b9 22 STA $22b9 fc63: 43 20 TMA #$20 fc65: 8d ba 22 STA $22ba fc68: 43 40 TMA #$40 fc6a: 8d bb 22 STA $22bb fc6d: 43 80 TMA #$80 fc6f: 8d bc 22 STA $22bc ; load battery ram to $8000-9fff fc72: a9 f7 LDA #$f7 fc74: 53 10 TAM #$10 ; sets the speed to "low". why? fc76: 54 CSL ; play with $1807. why? fc77: 78 SEI fc78: a9 80 LDA #$80 fc7a: 8d 07 18 STA $1807 fc7d: 68 PLA fc7e: 60 RTS bm_restore: fc7f: 48 PHA ; restore saved mmu regs fc80: ad b5 22 LDA $22b5 fc83: 53 01 TAM #$01 fc85: ad b6 22 LDA $22b6 fc88: 53 02 TAM #$02 fc8a: ad b7 22 LDA $22b7 fc8d: 53 04 TAM #$04 fc8f: ad b8 22 LDA $22b8 fc92: 53 08 TAM #$08 fc94: ad b9 22 LDA $22b9 fc97: 53 10 TAM #$10 fc99: ad ba 22 LDA $22ba fc9c: 53 20 TAM #$20 fc9e: ad bb 22 LDA $22bb fca1: 53 40 TAM #$40 fca3: ad bc 22 LDA $22bc fca6: 53 80 TAM #$80 fca8: ad 03 18 LDA $1803 ; sets the speed to "high". fcab: d4 CSH ; plays around with the VDP. why? fcac: a9 05 LDA #$05 fcae: 8d 00 00 STA $0000 fcb1: a5 f3 LDA $f3 fcb3: 09 08 ORA #$08 fcb5: 8d 02 00 STA $0002 fcb8: ad 00 00 LDA $0000 fcbb: 29 20 AND #$20 fcbd: d0 f9 BNE $fcb8 fcbf: ad 00 00 LDA $0000 fcc2: 29 20 AND #$20 fcc4: f0 f9 BEQ $fcbf fcc6: a5 f3 LDA $f3 fcc8: 8d 02 00 STA $0002 fccb: a5 f7 LDA $f7 fccd: 8d 00 00 STA $0000 fcd0: 68 PLA fcd1: 58 CLI fcd2: 60 RTS fcd3: ad b3 22 LDA $22b3 fcd6: 0d b4 22 ORA $22b4 fcd9: f0 2a BEQ $fd05 fcdb: 20 41 fd JSR $fd41 fcde: c2 CLY fcdf: 8a TXA fce0: d0 13 BNE $fcf5 fce2: b1 ec LDA ($ec), Y fce4: 91 ee STA ($ee), Y fce6: 98 TYA fce7: d0 04 BNE $fced fce9: c6 ed DEC $ed fceb: c6 ef DEC $ef fced: 88 DEY fcee: 20 97 fd JSR $fd97 fcf1: d0 ef BNE $fce2 fcf3: f0 10 BEQ $fd05 fcf5: b1 ec LDA ($ec), Y fcf7: 91 ee STA ($ee), Y fcf9: c8 INY fcfa: d0 04 BNE $fd00 fcfc: e6 ed INC $ed fcfe: e6 ef INC $ef fd00: 20 97 fd JSR $fd97 fd03: d0 f0 BNE $fcf5 fd05: ad 06 80 LDA $8006 fd08: 85 ec STA $ec fd0a: ad 07 80 LDA $8007 fd0d: 85 ed STA $ed fd0f: a0 01 LDY #$01 fd11: 62 CLA fd12: 92 ec STA ($ec) fd14: 91 ec STA ($ec), Y fd16: 60 RTS fd17: 20 7b fd JSR $fd7b fd1a: c2 CLY fd1b: b1 ec LDA ($ec), Y fd1d: 91 ee STA ($ee), Y fd1f: c8 INY fd20: d0 04 BNE $fd26 fd22: e6 ed INC $ed fd24: e6 ef INC $ef fd26: 20 97 fd JSR $fd97 fd29: d0 f0 BNE $fd1b fd2b: 60 RTS fd2c: 20 7b fd JSR $fd7b fd2f: c2 CLY fd30: b1 ee LDA ($ee), Y fd32: 91 ec STA ($ec), Y fd34: c8 INY fd35: d0 04 BNE $fd3b fd37: e6 ed INC $ed fd39: e6 ef INC $ef fd3b: 20 97 fd JSR $fd97 fd3e: d0 f0 BNE $fd30 fd40: 60 RTS fd41: a5 ec LDA $ec fd43: 38 SEC fd44: e5 ee SBC $ee fd46: a5 ed LDA $ed fd48: e5 ef SBC $ef fd4a: b0 2c BCS $fd78 fd4c: 20 97 fd JSR $fd97 fd4f: a5 ec LDA $ec fd51: 18 CLC fd52: 6d b3 22 ADC $22b3 fd55: 85 ec STA $ec fd57: a5 ed LDA $ed fd59: 6d b4 22 ADC $22b4 fd5c: 85 ed STA $ed fd5e: a5 ee LDA $ee fd60: 18 CLC fd61: 6d b3 22 ADC $22b3 fd64: 85 ee STA $ee fd66: a5 ef LDA $ef fd68: 6d b4 22 ADC $22b4 fd6b: 85 ef STA $ef fd6d: ee b3 22 INC $22b3 fd70: d0 03 BNE $fd75 fd72: ee b4 22 INC $22b4 fd75: a2 00 LDX #$00 fd77: 60 RTS fd78: a2 02 LDX #$02 fd7a: 60 RTS fd7b: a5 ef LDA $ef fd7d: 2a ROL a fd7e: 2a ROL a fd7f: 2a ROL a fd80: 2a ROL a fd81: 29 07 AND #$07 fd83: aa TAX fd84: bd b5 22 LDA $22b5, X fd87: 53 20 TAM #$20 fd89: bd b6 22 LDA $22b6, X fd8c: 53 40 TAM #$40 fd8e: a5 ef LDA $ef fd90: 29 1f AND #$1f fd92: 09 a0 ORA #$a0 fd94: 85 ef STA $ef fd96: 60 RTS fd97: ad b3 22 LDA $22b3 fd9a: d0 03 BNE $fd9f fd9c: ce b4 22 DEC $22b4 fd9f: ce b3 22 DEC $22b3 fda2: ad b3 22 LDA $22b3 fda5: 0d b4 22 ORA $22b4 fda8: 60 RTS ; ; map bank 3 to $c000 ; and keep old bank value in ($22bb) ; fda9: 48 PHA fdaa: 43 40 TMA #$40 fdac: 8d bb 22 STA $22bb fdaf: a9 03 LDA #$03 fdb1: 53 40 TAM #$40 fdb3: 68 PLA fdb4: 60 RTS ; ; restore the old value for the bank to map $c000 ; fdb5: 08 PHP fdb6: 48 PHA fdb7: ad bb 22 LDA $22bb fdba: 53 40 TAM #$40 fdbc: 68 PLA fdbd: 28 PLP fdbe: 60 RTS MA_MUL8S: fdbf: 44 e8 BSR $fda9 fdc1: 20 10 cd JSR $cd10 fdc4: 80 ef BRA $fdb5 MA_MUL8U: fdc6: 44 e1 BSR $fda9 fdc8: 20 3a cd JSR $cd3a fdcb: 80 e8 BRA $fdb5 MA_MUL16S: fdcd: 44 da BSR $fda9 fdcf: 20 57 cd JSR $cd57 fdd2: 80 e1 BRA $fdb5 MA_MUL16U: fdd4: 44 d3 BSR $fda9 fdd6: 20 92 cd JSR $cd92 fdd9: 80 da BRA $fdb5 MA_CBASIS: ; zeo : not real name, find me a develo book and I'll tell you :) fddb: 44 cc BSR $fda9 fddd: 20 c3 cd JSR $cdc3 fde0: 80 d3 BRA $fdb5 MA_DIV16U: fde2: 44 c5 BSR $fda9 fde4: 20 db cd JSR $cddb fde7: 80 cc BRA $fdb5 MA_DIV16S: fde9: 44 be BSR $fda9 fdeb: 20 2e ce JSR $ce2e fdee: 80 c5 BRA $fdb5 MA_SQRT: fdf0: 44 b7 BSR $fda9 fdf2: 20 75 ce JSR $ce75 fdf5: 80 be BRA $fdb5 MA_COS: fdf7: 44 b0 BSR $fda9 fdf9: 20 c3 ce JSR $cec3 fdfc: 80 b7 BRA $fdb5 MA_SIN: fdfe: 44 a9 BSR $fda9 fe00: 20 c8 ce JSR $cec8 fe03: 80 b0 BRA $fdb5 MA_ATNI: fe05: 44 a2 BSR $fda9 fe07: 20 d2 ce JSR $ced2 fe0a: 80 a9 BRA $fdb5 PSG_BIOS: fe0c: da PHX fe0d: 5a PHY fe0e: 43 40 TMA #$40 fe10: 48 PHA fe11: a9 02 LDA #$02 fe13: 53 40 TAM #$40 fe15: a5 ff LDA $ff fe17: c9 15 CMP #$15 fe19: b0 07 BCS $fe22 fe1b: 0a ASL a fe1c: aa TAX fe1d: a5 f8 LDA $f8 fe1f: 20 2a fe JSR $fe2a fe22: a8 TAY fe23: 68 PLA fe24: 53 40 TAM #$40 fe26: 98 TYA fe27: 7a PLY fe28: fa PLX fe29: 60 RTS fe2a: 7c 2d fe JMP ($fe2d, X) ; this is data to implement a piece of code that looks like a switch() ; statement ... fe2d: 00 c0 .dw $c000 ; PSG_ON (0) fe2f: 19 c0 .dw $c019 ; PSG_OFF (1) fe31: 43 c0 .dw $c043 ; PSG_INIT (2) fe33: db c0 .dw $c0db ; PSG_BANK (3) fe35: e6 c0 .dw $c0e6 ; PSG_TRACK (4) fe37: f1 c0 .dw $c0f1 ; PSG_FUNC5 (5) fe39: fc c0 .dw $c0fc ; PSG_FUNC6 (6) fe3b: 07 c1 .dw $c107 ; PSG_FUNC7 (7) fe3d: 12 c1 .dw $c112 ; PSG_FUNC8 (8) fe3f: 1d c1 .dw $c11d ; PSG_FUNC9 (9) fe41: 28 c1 .dw $c128 ; PSG_FUNCA (A) fe43: 42 c1 .dw $c142 ; PSG_PLAY (B) fe45: 51 c1 .dw $c151 ; PSG_MSTAT (C) fe47: 6c c1 .dw $c16c ; PSG_STAT2 (D) fe49: 85 c1 .dw $c185 ; PSG_FUNCE (E) fe4b: ca c1 .dw $c1ca ; PSG_FUNCF (F) fe4d: 21 c2 .dw $c221 ; PSG_ASTOP (10) fe4e: 4a c2 .dw $c24a ; PSG_FUNC11 (11) fe51: 7c c2 .dw $c27c ; PSG_FUNC12 (12) fe53: cd c2 .dw $c2cd ; PSG_FDOUT (13) fe55: e9 c2 .dw $c2e9 ; PSG_FUNC14 (14) GRP_BIOS: fe57: 43 40 TMA #$40 fe59: 48 PHA fe5a: a9 03 LDA #$03 ; map bank 3 at $c000 fe5c: 53 40 TAM #$40 fe5e: a5 ff LDA $ff fe60: c9 11 CMP #$11 fe62: b0 05 BCS $fe69 fe64: 0a ASL a fe65: aa TAX fe66: 20 6d fe JSR $fe6d ; implement a switch with #$11 different functions ; function number is in (_dh) fe69: 68 PLA fe6a: 53 40 TAM #$40 ; restore old mapping fe6c: 60 RTS fe6d: 7c 70 fe JMP ($fe70, X) ; Once more, an address jump table to implement switch() fe70: f3 ca .dw $caf3 ; VI_GINIT (0) fe72: 07 cb .dw $cb07 ; VI_CASHCLR (1) fe74: ed cb .dw $cbed ; VI_STRTADR (2) fe76: b2 ca .dw $cab2 ; VI_GETADRS (3) fe78: 29 c5 .dw $c529 ; VI_CLS (4) fe7a: a8 c1 .dw $c1a8 ; VI_PSET (5) fe7c: a2 c2 .dw $c2a2 ; VI_POINT (6) fe7e: 85 c0 .dw $c085 ; VI_LINE (7) fe80: 3c c0 .dw $c03c ; VI_BOX (8) fe82: 67 c0 .dw $c067 ; VI_BOXF (9) fe84: 90 c3 .dw $c390 ; VI_FLOOD (A) fe86: 48 c4 .dw $c448 ; VI_PAINT (B) fe88: 14 cb .dw $cb14 ; VI_GWINDOW (C) fe8a: 0e cb .dw $cb0e ; VI_GFONT (D) fe8c: f4 c7 .dw $c7f4 ; VI_PUTFONT (E) fe8e: f0 c6 .dw $c6f0 ; VI_SYMBOL (F) fe90: 71 cc .dw $cc71 ; GRP_FUNC10(10) EX_MEMOPEN: fe92: ad c5 18 LDA $18c5 ; Check for super system fe95: c9 aa CMP #$aa fe97: d0 0c BNE $fea5 fe99: ad c6 18 LDA $18c6 fe9c: c9 55 CMP #$55 fe9e: d0 05 BNE $fea5 fea0: ae c7 18 LDX $18c7 fea3: 80 15 BRA $feba fea5: ad c1 18 LDA $18c1 fea8: c9 aa CMP #$aa feaa: d0 13 BNE $febf feac: ad c2 18 LDA $18c2 feaf: c9 55 CMP #$55 feb1: d0 0c BNE $febf feb3: ae c3 18 LDX $18c3 ; X = ($18C3) feb6: 22 SAX feb7: 09 80 ORA #$80 ; => X |= 0x80 feb9: 22 SAX feba: ad f4 ff LDA $fff4 ; A = ($fff4) febd: 18 CLC febe: 60 RTS febf: 82 CLX fec0: 38 SEC fec1: 60 RTS fec2: 03 00 dw 0x3000 ; version of the card, here 3.0 fec4: ff ff ff BBS7 $ff, $fec6 fec7: ff ff ff BBS7 $ff, $fec9 feca: ff ff ff BBS7 $ff, $fecc fecd: ff ff ff BBS7 $ff, $fecf fed0: ff ff ff BBS7 $ff, $fed2 fed3: ff ff ff BBS7 $ff, $fed5 fed6: ff ff ff BBS7 $ff, $fed8 fed9: ff ff ff BBS7 $ff, $fedb fedc: ff ff ff BBS7 $ff, $fede fedf: ff ff ff BBS7 $ff, $fee1 fee2: ff ff ff BBS7 $ff, $fee4 fee5: ff ff ff BBS7 $ff, $fee7 fee8: ff ff ff BBS7 $ff, $feea feeb: ff ff ff BBS7 $ff, $feed feee: ff ff ff BBS7 $ff, $fef0 fef1: ff ff ff BBS7 $ff, $fef3 fef4: ff ff ff BBS7 $ff, $fef6 fef7: ff ff ff BBS7 $ff, $fef9 fefa: ff ff ff BBS7 $ff, $fefc fefd: ff ff ff BBS7 $ff, $feff ff00: ff ff ff BBS7 $ff, $ff02 ff03: ff ff ff BBS7 $ff, $ff05 ff06: ff ff ff BBS7 $ff, $ff08 ff09: ff ff ff BBS7 $ff, $ff0b ff0c: ff ff ff BBS7 $ff, $ff0e ff0f: ff ff ff BBS7 $ff, $ff11 ff12: ff ff ff BBS7 $ff, $ff14 ff15: ff ff ff BBS7 $ff, $ff17 ff18: ff ff ff BBS7 $ff, $ff1a ff1b: ff ff ff BBS7 $ff, $ff1d ff1e: ff ff ff BBS7 $ff, $ff20 ff21: ff ff ff BBS7 $ff, $ff23 ff24: ff ff ff BBS7 $ff, $ff26 ff27: ff ff ff BBS7 $ff, $ff29 ff2a: ff ff ff BBS7 $ff, $ff2c ff2d: ff ff ff BBS7 $ff, $ff2f ff30: ff ff ff BBS7 $ff, $ff32 ff33: ff ff ff BBS7 $ff, $ff35 ff36: ff ff ff BBS7 $ff, $ff38 ff39: ff ff ff BBS7 $ff, $ff3b ff3c: ff ff ff BBS7 $ff, $ff3e ff3f: ff ff ff BBS7 $ff, $ff41 ff42: ff ff ff BBS7 $ff, $ff44 ff45: ff ff ff BBS7 $ff, $ff47 ff48: ff ff ff BBS7 $ff, $ff4a ff4b: ff ff ff BBS7 $ff, $ff4d ff4e: ff ff ff BBS7 $ff, $ff50 ff51: ff ff ff BBS7 $ff, $ff53 ff54: ff ff ff BBS7 $ff, $ff56 ff57: ff ff ff BBS7 $ff, $ff59 ff5a: ff ff ff BBS7 $ff, $ff5c ff5d: ff ff ff BBS7 $ff, $ff5f ff60: ff ff ff BBS7 $ff, $ff62 ff63: ff ff ff BBS7 $ff, $ff65 ff66: ff ff ff BBS7 $ff, $ff68 ff69: ff ff ff BBS7 $ff, $ff6b ff6c: ff ff ff BBS7 $ff, $ff6e ff6f: ff ff ff BBS7 $ff, $ff71 ff72: ff ff ff BBS7 $ff, $ff74 ff75: ff ff ff BBS7 $ff, $ff77 ff78: ff ff ff BBS7 $ff, $ff7a ff7b: ff ff ff BBS7 $ff, $ff7d ff7e: ff ff ff BBS7 $ff, $ff80 ff81: ff ff ff BBS7 $ff, $ff83 ff84: ff ff ff BBS7 $ff, $ff86 ff87: ff ff ff BBS7 $ff, $ff89 ff8a: ff ff ff BBS7 $ff, $ff8c ff8d: ff ff ff BBS7 $ff, $ff8f ff90: ff ff ff BBS7 $ff, $ff92 ff93: ff ff ff BBS7 $ff, $ff95 ff96: ff ff ff BBS7 $ff, $ff98 ff99: ff ff ff BBS7 $ff, $ff9b ff9c: ff ff ff BBS7 $ff, $ff9e ff9f: ff ff ff BBS7 $ff, $ffa1 ffa2: ff ff ff BBS7 $ff, $ffa4 ffa5: ff ff ff BBS7 $ff, $ffa7 ffa8: ff ff ff BBS7 $ff, $ffaa ffab: ff ff ff BBS7 $ff, $ffad ffae: ff ff ff BBS7 $ff, $ffb0 ffb1: ff ff ff BBS7 $ff, $ffb3 ffb4: ff ff ff BBS7 $ff, $ffb6 ffb7: ff ff ff BBS7 $ff, $ffb9 ffba: ff ff ff BBS7 $ff, $ffbc ffbd: ff ff ff BBS7 $ff, $ffbf ffc0: ff ff ff BBS7 $ff, $ffc2 ffc3: ff ff ff BBS7 $ff, $ffc5 ffc6: ff ff ff BBS7 $ff, $ffc8 ffc9: ff ff ff BBS7 $ff, $ffcb ffcc: ff ff ff BBS7 $ff, $ffce ffcf: ff ff ff BBS7 $ff, $ffd1 ffd2: ff ff ff BBS7 $ff, $ffd4 ffd5: ff ff ff BBS7 $ff, $ffd7 ffd8: ff ff ff BBS7 $ff, $ffda ffdb: ff ?? ?? BBS7 $??, $???? ffdc: 4c 00 e9 JMP $e900 ffdf: 4c 3b ea JMP $ea3b ffe2: 4c 79 ea JMP $ea79 ffe5: 4c be ea JMP $eabe ffe8: 4c 16 eb JMP $eb16 ffeb: 4c 5e eb JMP $eb5e ffee: 4c c5 e9 JMP $e9c5 fff1: 4c dc e9 JMP $e9dc fff4: 68 .db 68 ; return value for mem_open fff5: 80 .db 80 ; init mapping bank fff6: 36 e7 DW $e736 ; IRQ2/BRK vector fff8: 70 e8 DW $e870 ; IRQ1 vector fffa: b3 e6 DW $e6b3 ; TIMER vector fffc: a9 e6 DW $e6a9 ; NMI vector fffe: f3 e0 DW $e0f3 ; RESET vector