Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 0000: F3 di
- 0001: C3 D5 01 jp $01D5
- ;sends d to port 4, e to port 5
- 0004: F5 push af
- 0005: 00 nop
- 0006: 00 nop
- 0007: 7A ld a,d
- 0008: D3 04 out ($04),a
- 000A: 7B ld a,e
- 000B: D3 05 out ($05),a
- 000D: F1 pop af
- 000E: 00 nop
- 000F: 00 nop
- 0010: C9 ret
- ;sends d to port 6, e to port 7
- 0011: 00 nop
- 0012: 00 nop
- 0013: F5 push af
- 0014: 7A ld a,d
- 0015: D3 06 out ($06),a
- 0017: 7B ld a,e
- 0018: D3 07 out ($07),a
- 001A: F1 pop af
- 001B: 00 nop
- 001C: 00 nop
- 001D: C9 ret
- 001E: 00 nop
- ;nops
- 0037: 00 nop
- 0038: ED 4D reti ;IRQ
- 003A: 00 nop
- 003B: 00 nop
- 003C: 00 nop
- 003D: 00 nop
- 003E: 00 nop
- 003F: 00 nop
- ;"LeCorTHX v9.05c\0"
- 0040: 4C 65 43 6F 72 54 48 58 20 76 39 2E 30 35 63 00
- 0050: 00 nop
- ;nops
- 0065: 00 nop
- ;command from 68k
- 0066: F5 push af
- 0067: 3E FF ld a,$FF
- 0069: D3 0C out ($0C),a ;reply 0xff to 68k
- 006B: C5 push bc
- 006C: D5 push de
- 006D: E5 push hl
- 006E: DB 00 in a,($00) ;get the cmd # (after answering it, lulz)
- 0070: FE 01 cp $01
- 0072: 28 76 jr z,$00EA ;slot switch CMD
- 0074: FE 03 cp $03
- 0076: CA F4 00 jp z,$00F4 ;reset z80
- 0079: 47 ld b,a ;b=CMD
- 007A: 21 00 F8 ld hl,$F800 ;hl=0xf800 (queue base)
- 007D: 3A 29 F8 ld a,($F829) ;a=$f829 (queue ptr)
- 0080: 6F ld l,a ;add ptr to base
- 0081: 70 ld (hl),b ;write cmd into queue
- 0082: 3C inc a
- 0083: E6 1F and $1F
- 0085: 32 29 F8 ld ($F829),a ;inc queue ptr, crop to 0x1f (32 slots queue)
- 0088: E1 pop hl
- 0089: D1 pop de
- 008A: C1 pop bc
- 008B: 3E 01 ld a,$01
- 008D: D3 0C out ($0C),a ;answer 01
- 008F: F1 pop af
- 0090: ED 45 retn
- 0092: 00 nop
- ;nops
- 00CF: 00 nop
- ;seems unused
- 00D0: F5 push af
- 00D1: C5 push bc
- 00D2: DB 06 in a,($06)
- 00D4: 06 30 ld b,$30
- 00D6: 10 FE djnz $00D6
- 00D8: DB 04 in a,($04)
- 00DA: 06 30 ld b,$30
- 00DC: 10 FE djnz $00DC
- 00DE: C1 pop bc
- 00DF: F1 pop af
- 00E0: FB ei
- 00E1: ED 4D reti
- 00E3: DB 04 in a,($04)
- 00E5: A7 and a
- 00E6: FA E3 00 jp m,$00E3
- 00E9: C9 ret
- ;CMD 01 (slot switch)
- 00EA: F3 di
- 00EB: 3E 01 ld a,$01
- 00ED: D3 0C out ($0C),a ;answer 01
- 00EF: D3 00 out ($00),a
- 00F1: C3 00 00 jp $0000 ;let's reboot! (lolwut?)
- ;CMD 03 (z80 reset)
- 00F4: AF xor a
- 00F5: D3 0C out ($0C),a ;answer 0
- 00F7: D3 00 out ($00),a
- 00F9: C3 00 00 jp $0000 ;reboot
- ;play CMD (#in a)
- 00FC: CB 7F bit 7,a
- 00FE: 20 18 jr nz,$0118 ;bit7 set? => 0x118
- 0100: FE 10 cp $10 ;cmd==0x10?
- 0102: 28 01 jr z,$0105 ;yes => 105
- 0104: C9 ret
- ;cmd 0x10
- 0105: 11 01 10 ld de,$1001 ;stops ADPCM-B
- 0108: CD 04 00 call $0004
- 010B: 11 00 10 ld de,$1000 ;nothing
- 010E: CD 04 00 call $0004
- 0111: 11 00 11 ld de,$1100 ;clears L+R channel. useless.
- 0114: CD 04 00 call $0004
- 0117: C9 ret
- ;execute CMD with bit 7 set
- 0118: E6 7F and $7F ;clear bit7 from CMD#
- 011A: 32 27 F8 ld ($F827),a ;$f827=cmd
- 011D: CD 58 02 call $0258 ;ix=cmd data ptr
- 0120: DD 7E 04 ld a,(ix+$04) ;a=data[4]
- 0123: CB 47 bit 0,a
- 0125: C2 77 01 jp nz,$0177 ;bit 0 set => ADPCM-B
- 0128: 3A 27 F8 ld a,($F827) ;get back masked cmd#
- 012B: CD 6D 02 call $026D ;get a "free" ADPCM-A channel
- 012E: 11 3F 01 ld de,$013F ;master volume
- 0131: CD 11 00 call $0011
- 0134: 78 ld a,b
- 0135: C6 08 add a,$08
- 0137: 57 ld d,a
- 0138: 1E DF ld e,$DF ;L+R channel, full volume on channel (a)
- 013A: CD 11 00 call $0011
- 013D: 78 ld a,b
- 013E: C6 10 add a,$10
- 0140: 57 ld d,a
- 0141: DD 5E 00 ld e,(ix+$00) ;channel start address LSB
- 0144: CD 11 00 call $0011
- 0147: C6 08 add a,$08
- 0149: 57 ld d,a
- 014A: DD 5E 01 ld e,(ix+$01) ;channel start address MSB
- 014D: CD 11 00 call $0011
- 0150: C6 08 add a,$08
- 0152: 57 ld d,a
- 0153: DD 5E 02 ld e,(ix+$02) ;channel end address LSB
- 0156: CD 11 00 call $0011
- 0159: C6 08 add a,$08
- 015B: 57 ld d,a
- 015C: DD 5E 03 ld e,(ix+$03) ;channel end address MSB
- 015F: CD 11 00 call $0011
- 0162: 78 ld a,b
- 0163: 6F ld l,a
- 0164: 26 00 ld h,$00 ;hl=00channel
- 0166: 11 71 01 ld de,$0171 ;de=0x0171
- 0169: 19 add hl,de
- 016A: 5E ld e,(hl)
- 016B: 16 00 ld d,$00 ;play the channel
- 016D: CD 11 00 call $0011
- 0170: C9 ret
- ;data, ADPCM-A channel flags
- 0171: 01 02 04 08 10 20
- ;sends stuff + CMD data to ports 4&5, done the shitty way - ADPCM-B stuff
- 0177: 11 01 10 ld de,$1001 ;resets ADPMC-B
- 017A: CD 04 00 call $0004
- 017D: 11 00 10 ld de,$1000 ;let's do nothing!
- 0180: CD 04 00 call $0004
- 0183: 11 00 1C ld de,$1C00 ;reset flags
- 0186: CD 04 00 call $0004
- 0189: 11 C0 11 ld de,$11C0 ;L+R channels
- 018C: CD 04 00 call $0004
- 018F: 11 21 19 ld de,$1921 ;frequency
- 0192: CD 04 00 call $0004
- 0195: 11 55 1A ld de,$1A55 ;frequency (18.050 KHz)
- 0198: CD 04 00 call $0004
- 019B: 11 00 12 ld de,$1200
- 019E: DD 5E 00 ld e,(ix+$00) ;sets start & end address from data
- 01A1: CD 04 00 call $0004
- 01A4: 11 00 13 ld de,$1300
- 01A7: DD 5E 01 ld e,(ix+$01) ;"
- 01AA: CD 04 00 call $0004
- 01AD: 11 00 14 ld de,$1400
- 01B0: DD 5E 02 ld e,(ix+$02) ;"
- 01B3: CD 04 00 call $0004
- 01B6: 11 00 15 ld de,$1500
- 01B9: DD 5E 03 ld e,(ix+$03) ;"
- 01BC: CD 04 00 call $0004
- 01BF: 11 7F 1B ld de,$1B7F ;half volume
- 01C2: CD 04 00 call $0004
- 01C5: 11 80 10 ld de,$1080 ;de=play command
- 01C8: DD 7E 04 ld a,(ix+$04)
- 01CB: CB 4F bit 1,a
- 01CD: 28 02 jr z,$01D1 ;needs repeat? (data[4] bit 1)
- 01CF: CB E3 set 4,e ;yes => adds it to play cmd
- 01D1: CD 04 00 call $0004 ;play!
- 01D4: C9 ret
- ;entry point
- 01D5: 31 F0 FF ld sp,$FFF0 ;stack ptr
- 01D8: ED 56 im 1 ;interrupt mode 1
- 01DA: AF xor a ;a=0
- 01DB: 32 26 F8 ld ($F826),a ;$f826=0
- 01DE: 32 28 F8 ld ($F828),a ;$f828=0
- 01E1: 32 29 F8 ld ($F829),a ;$f829=0
- ; sends 2801 2802 2805 2806 0800 0900 0a00 1001 1c00 1000 2730 to ports 4&5 (setup YM2610), done the shitty way.
- ;ADPCM-A better be silent because we ain't reseting it!
- 01E4: 11 01 28 ld de,$2801 ;silence FM channel 1
- 01E7: CD 04 00 call $0004
- 01EA: 11 02 28 ld de,$2802 ;silence FM channel 2
- 01ED: CD 04 00 call $0004
- 01F0: 11 05 28 ld de,$2805 ;silence FM channel 3
- 01F3: CD 04 00 call $0004
- 01F6: 11 06 28 ld de,$2806 ;silence FM channel 4
- 01F9: CD 04 00 call $0004
- 01FC: 11 00 08 ld de,$0800 ;silence SSG channel A
- 01FF: CD 04 00 call $0004
- 0202: 11 00 09 ld de,$0900 ;silence SSG channel B
- 0205: CD 04 00 call $0004
- 0208: 11 00 0A ld de,$0A00 ;silence SSG channel C
- 020B: CD 04 00 call $0004
- 020E: 11 01 10 ld de,$1001 ;resets ADPCM-B
- 0211: CD 04 00 call $0004
- 0214: 11 00 1C ld de,$1C00 ;clears ADPCM-B flags
- 0217: CD 04 00 call $0004
- 021A: 11 00 10 ld de,$1000 ;nothing!
- 021D: CD 04 00 call $0004
- 0220: 11 30 27 ld de,$2730 ;reset timers
- 0223: CD 04 00 call $0004
- 0226: 3E 1E ld a,$1E ;important banks setup for this 827 bytes driver
- 0228: DB 08 in a,($08)
- 022A: 3E 0E ld a,$0E
- 022C: DB 09 in a,($09)
- 022E: 3E 06 ld a,$06
- 0230: DB 0A in a,($0A)
- 0232: 3E 02 ld a,$02
- 0234: DB 0B in a,($0B)
- 0236: D3 08 out ($08),a
- 0238: FB ei ;enable interrupts
- 0239: 3E 55 ld a,$55
- 023B: D3 0C out ($0C),a ;let's say 0x55 to 68k
- ;main loop
- 023D: 3A 29 F8 ld a,($F829)
- 0240: 47 ld b,a ;b=exectuted queue ptr
- 0241: 3A 28 F8 ld a,($F828) ;a=queue ptr
- 0244: B8 cp b
- 0245: 28 F6 jr z,$023D ;up to date with last cmd? yes => loop
- 0247: 21 00 F8 ld hl,$F800
- 024A: 6F ld l,a
- 024B: 46 ld b,(hl) ;b=cmd in queue
- 024C: 3C inc a
- 024D: E6 1F and $1F
- 024F: 32 28 F8 ld ($F828),a ;inc executed queue ptr, crop to 0x1f
- 0252: 78 ld a,b ;a=cmd
- 0253: CD FC 00 call $00FC ;let's play it
- 0256: 18 E5 jr $023D ;loop
- ;gets cmd data ptr in ix
- 0258: F5 push af
- 0259: E6 7F and $7F ;clears bit 7 again, better safe than sorry
- 025B: 6F ld l,a
- 025C: 26 00 ld h,$00
- 025E: 29 add hl,hl
- 025F: 29 add hl,hl
- 0260: 16 00 ld d,$00
- 0262: 5F ld e,a ;de=0x00CMD
- 0263: 19 add hl,de ;hl=cmd#*5
- 0264: 11 9B 02 ld de,$029B ;de=data ptr
- 0267: 19 add hl,de ;adds it
- 0268: E5 push hl
- 0269: DD E1 pop ix ;ix=data ptr
- 026B: F1 pop af
- 026C: C9 ret
- ;gets a "free" ADPCM-A channel, returns it in a
- ;free as in let's cycle them, not check if they are done with playing sample
- 026D: 21 20 F8 ld hl,$F820 ;hl=0xf820
- 0270: 06 00 ld b,$00 ;b=0
- 0272: 3A 27 F8 ld a,($F827) ;get back masked cmd#
- 0275: 5E ld e,(hl)
- 0276: BB cp e ;compare $f820 with current cmd#
- 0277: CA 8F 02 jp z,$028F ;same => 028f
- 027A: 23 inc hl ;hl++
- 027B: 04 inc b ;b++
- 027C: 78 ld a,b ;a=b
- 027D: FE 06 cp $06 ;==06?
- 027F: C2 72 02 jp nz,$0272 ;no => loop
- 0282: 3A 26 F8 ld a,($F826)
- 0285: 47 ld b,a
- 0286: 3C inc a
- 0287: FE 06 cp $06
- 0289: 20 01 jr nz,$028C
- 028B: AF xor a
- 028C: 32 26 F8 ld ($F826),a ;increase $f826, back to 0 if ==6
- 028F: 21 20 F8 ld hl,$F820
- 0292: 16 00 ld d,$00
- 0294: 58 ld e,b
- 0295: 19 add hl,de
- 0296: 3A 27 F8 ld a,($F827)
- 0299: 77 ld (hl),a
- 029A: C9 ret
- ;commands data, 5bytes blocks, everything is eiher ADPCM-A or ADPCM-B
- ;start address (2 bytes, swapped), end address (2 bytes, swapped), control (bit0=A/B type ADPCM, bit1=repeat flag for B type)
- 029B: 00 00 06 09 03 ;start 0x000000, end 0x090600, B type, repeat
- 02A0: 07 09 CD 0F 03
- 02A5: CE 0F F9 0F 00
- 02AA: FA 0F FD 0F 00
- 02AF: 00 10 A0 18 03
- 02B4: A1 18 63 1F 03
- 02B9: 64 1F F7 1F 01
- 02BE: F8 1F FF 1F 00
- 02C3: 00 20 55 28 03
- 02C8: 56 28 17 2F 03
- 02CD: 18 2F F3 2F 01
- 02D2: F4 2F FB 2F 00
- 02D7: 00 30 6A 35 03
- 02DC: 6B 35 57 3A 03
- 02E1: 58 3A 68 3E 03
- 02E6: 69 3E 7C 3F 01
- 02EB: 7D 3F E4 3F 00
- 02F0: E5 3F FC 3F 00
- 02F5: 00 40 41 42 03
- 02FA: 42 42 83 44 03
- 02FF: 84 44 35 46 03
- 0304: 36 46 E9 46 01
- 0309: EA 46 9D 47 01
- 030E: 9E 47 31 48 01
- 0313: 32 48 C2 48 03
- 0318: C3 48 4A 49 01
- 031D: 4B 49 82 49 00
- 0322: 83 49 B7 49 00
- 0327: B8 49 D3 49 00
- 032C: D4 49 EF 49 00
- 0331: F0 49 03 4A 00
- 0336: 04 4A 13 4A 00
- ;last sample end addr=4a1300
Advertisement
Add Comment
Please, Sign In to add comment