From 6482429a8148f1acdfd5a1440bb6efcc7f265115 Mon Sep 17 00:00:00 2001 From: Brendan Fletcher Date: Wed, 4 Mar 2020 02:05:06 -0500 Subject: [PATCH] Initial commit --- .gitignore | 16 + .gitmodules | 3 + app.inc | 92 + hardware.z80 | 1780 ++++++ opcodes_crazy.z80 | 7828 +++++++++++++++++++++++ render.z80 | 2767 ++++++++ render_ram.z80 | 136 + setup.z80 | 195 + splash.bmp | Bin 0 -> 830 bytes ti83small.inc | 35 + tiboyse.z80 | 1554 +++++ tiboyse_makeapp/makeapp.cpp | 212 + tiboyse_makeapp/rabbitsign | 1 + tiboyse_makeapp/rabbitsign.vcxproj | 195 + tiboyse_makeapp/resource.h | 2 + tiboyse_makeapp/tiboyse.rc | Bin 0 -> 126 bytes tiboyse_makeapp/tiboyse_makeapp.sln | 41 + tiboyse_makeapp/tiboyse_makeapp.vcxproj | 178 + 18 files changed, 15035 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 app.inc create mode 100644 hardware.z80 create mode 100644 opcodes_crazy.z80 create mode 100644 render.z80 create mode 100644 render_ram.z80 create mode 100644 setup.z80 create mode 100644 splash.bmp create mode 100644 ti83small.inc create mode 100644 tiboyse.z80 create mode 100644 tiboyse_makeapp/makeapp.cpp create mode 160000 tiboyse_makeapp/rabbitsign create mode 100644 tiboyse_makeapp/rabbitsign.vcxproj create mode 100644 tiboyse_makeapp/resource.h create mode 100644 tiboyse_makeapp/tiboyse.rc create mode 100644 tiboyse_makeapp/tiboyse_makeapp.sln create mode 100644 tiboyse_makeapp/tiboyse_makeapp.vcxproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fcc412b --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.8xp +*.8xk +*.8xv +*.bin +*.lab +*.gb +*.gbc +*.sav +*.exe +*.lst +*.aps +*.vcxproj.* +.vs/ +.DS_Store +Debug/ +Release/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..976f306 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "tiboyse_makeapp/rabbitsign"] + path = tiboyse_makeapp/rabbitsign + url = https://github.com/abbrev/rabbitsign diff --git a/app.inc b/app.inc new file mode 100644 index 0000000..6eea145 --- /dev/null +++ b/app.inc @@ -0,0 +1,92 @@ +; Fatal error macro. Displays message prefixed with "error" +; and returns with error code +#define fatal(str,return) .error str +#macro defpage(page, appname) +#if page = 0 + #ifndef gpage + #define free_space 0 + #define gpage 0 + #ifndef appname + .echo "Warning: No name given, using \"Default\"" + #define appname "Default" + #endif + .org $4000 + .db $80,$0F,0,0,0,0 + .db $80,$12,1,4 + .db $80,$21,1 + .db $80,$31,1 + .db $80,$48 + + #define gappname eval(appname) + +_ .db appname + #define apnamlen eval($ - -_) + echo_fill(apnamlen,"-","------------------------------------------") + .echo "Beginning APP \"",appname,"\", courtesy of SPASM macros" + echo_fill(apnamlen,"-","------------------------------------------") + + #if apnamlen <= 8 + .fill 8-apnamlen,' ' + #else + #define err "App name is ",apnamlen-8," character(s) too long." + fatal(err,1) + #endif + + .db $80,$81,0 + .db $80,$90 + .db $03,$26,$09,$04,$04,$06f,$1b,$80 + .db $02,$0d,$40 + .db $a1,$6b,$99,$f6,$59,$bc,$67 + .db $f5,$85,$9c,$09,$6c,$0f,$b4,$03,$9b,$c9 + .db $03,$32,$2c,$e0,$03,$20,$e3,$2c,$f4,$2d + .db $73,$b4,$27,$c4,$a0,$72,$54,$b9,$ea,$7c + .db $3b,$aa,$16,$f6,$77,$83,$7a,$ee,$1a,$d4 + .db $42,$4c,$6b,$8b,$13,$1f,$bb,$93,$8b,$fc + .db $19,$1c,$3c,$ec,$4d,$e5,$75 + .db $80,$7F,0,0,0,0 + .dw 0,0,0,0,0,0,0,0 + #else + fatal("There was already a page 0.",1) + #endif +#else + #if ($ & $0000FFFF) > $8000 + #define err "Page ",gpage," went over bounds by ",$-$8000," bytes." + fatal(err, 1) + #endif + #if page <= gpage + fatal("Your page numbers must increase.") + #endif + #if page > gpage+1 + .echo "Warning: Skipping page ",gpage+1," at user request." + #endif + #define free_space eval(free_space + $8000-($ & $0000FFFF)) + .echo "Page ",gpage," free space: ",$8000-($ & $0000FFFF) + .block ($8000-($ & $0000FFFF) + ((page-gpage-1)*$4000)) + #define gpage eval(page) + .org $4000+(gpage*$10000) +#endif +#endmacro + +#macro validate +#if ($ & $0000FFFF) > $8000 + #define err "Page ",gpage," went over bounds by ",$-$8000," bytes." + fatal(err, 1) +#else + .echo "Page ",gpage," free space: ",$8000-($ & $0000FFFF) + #define free_space eval(free_space + $8000 - ($ & $0000FFFF)) + .echo "Success: Page sizes validated and \"",gappname,"\" is ready for signing." + .echo " In ",gpage+1," page(s), ",free_space," bytes are available." +#endif +#endmacro + +#macro echo_fill(times, char, base) +#if times > 0 + #define base base,char + echo_fill(eval(times-1), char, base) +#else + .echo base +#endif +#endmacro + +#define .defpage defpage( +#define .validate validate \ No newline at end of file diff --git a/hardware.z80 b/hardware.z80 new file mode 100644 index 0000000..183b8ac --- /dev/null +++ b/hardware.z80 @@ -0,0 +1,1780 @@ +MAX_FREQ = $F8 +LOOP_MAX_SIZE = 16 +loop_page = $FF73 +loop_negptr = $FF74 +loop_size = $FF76 +soundOutputs = $FF78 +NR10_backup = $FF7A +NR43_backup = $FF7B +NR12_backup = $FF7C +NR22_backup = $FF7D +NR42_backup = $FF7E +NR52_backup = $FF7F + +bufferBase = $C200 + +rompage3code: + .org $4000 + + .block (-$-8) & $FF + ; D_L_DD_L, D_D_LD_D, L_D_DL_D, D_L_DD_L, D_D_LD_D + .db %10001100,%10100101,%00101001,%10001100,%10100101 + ; _L_D_D_L, _D_L_D_D, _D_D_L_D + .db %00010100,%01000101,%01010001 + +graydithers: + .db 0,%11011011,%10110110,%01101101 + +toggleSound: + di + ld hl,channelSelect + ld a,(hl) + or a + jr nz,turnSoundOff + + inc (hl) + ld a,$A0 + out ($30),a + out ($33),a + ld a,2 + out ($31),a + out ($34),a + dec a + out ($32),a + out ($35),a + + ld a,$82 + out ($36),a + ld a,$FF + out ($37),a + out ($38),a + + ld a,5 + out (3),a + + push bc + push de + ;ld hl,(bufferHeight) + ;push hl + + ld hl,$E000-1 + ld de,page3code + ld bc,vars-$E000-bytes_skipped_1 + 1 + scf + call decompressRAM + + ;ld hl,opcodeFB_B-1 + ;ld de,page3code + (opcodeFB_B-$E000-bytes_skipped_2) + ;ld bc,$FE00-opcodeFB_B-(bytes_skipped-bytes_skipped_2) + 1 + ;scf + ;call decompressRAM + + ;pop hl + ;ld (bufferHeight),hl + pop de + pop bc + + in a,(1) + rla + jr nc,$-3 + ret + +turnSoundOff: + xor a + ld (hl),a + out ($31),a + out ($34),a + out ($37),a + inc a + out (3),a + ld a,$44 + out ($36),a + ld a,2 + out ($37),a + dec a + out ($38),a + + push bc + push de + ;ld hl,(bufferHeight) + ;push hl + + ld hl,$E000-1 + ld de,page3code + ld bc,vars-$E000-bytes_skipped_1 + 1 + or a + call decompressRAM + + ;ld hl,opcodeFB_B-1 + ;ld de,page3code + (opcodeFB_B-$E000-bytes_skipped_2) + ;ld bc,$FE00-opcodeFB_B-(bytes_skipped-bytes_skipped_2) + 1 + ;or a + ;call decompressRAM + + ld hl,irq + ld ($FDFE),hl + + ;pop hl + ;ld (bufferHeight),hl + pop de + pop bc + + in a,(1) + rla + jr nc,$-3 + ret + +handleSound: + ld a,1 + out (3),a + ld a,5 + out (3),a + ld hl,channelSelect + dec (hl) + jp nz,maybeChannel2 + ld (hl),4 + ld hl,NR14 + ld a,(hl) + rla + jr nc,_ + res 7,(hl) + ld l,$FF + ld (chan1cnt),hl + ld l,NR52 & $FF + set 0,(hl) + ld l,NR52_backup & $FF + set 0,(hl) +_ + ld l,NR52 & $FF + bit 0,(hl) + ret z + + rla + jr nc,_ + ld l,NR11 & $FF + ld a,(hl) + rlca + rlca + add a,4 + rrca + rrca + ld (hl),a + jr nc,_ + ld l,NR52 & $FF + res 0,(hl) +channel1mute: + ld l,NR52_backup & $FF + res 0,(hl) + ld l,soundOutputs & $FF + res 1,(hl) + ld hl,0 + ld (chan1div0),hl + ld (chan1div1),hl + ret +_ + + ld a,(NR51) + and %00010001 + jr z,channel1mute + ld l,NR12 & $FF + ld a,(hl) + and $F0 + jr z,channel1mute + ld a,(hl) + and 7 + jr z,++_ + bit 3,(hl) + jr nz,++_ + ld a,(NR12_backup) + or a + jr nz,_ + ld a,(hl) + and 7 + add a,a + add a,a +_ + dec a + ld (NR12_backup),a + jr nz,_ + ld a,(hl) + sub $10 + ld (hl),a +_ + + push de + ld l,NR10 & $FF + ld a,(hl) + and %01110000 + jr z,++_ + ld e,a + ld l,NR10_backup & $FF + ld a,(hl) + or a + jr nz,_ + ld a,e + rrca + rrca + rrca +_ + dec a + ld (hl),a + jr nz,_ + ld hl,(NR13) + ld a,h + and 7 + ld h,a + ld d,h + ld e,l + ld a,(NR10) + and 7 + jr z,$+9 + srl d + rr e + dec a + jr nz,$-5 + ld a,(NR10) + and 8 + jr nz,$+5 + add hl,de + jr $+4 + sbc hl,de + ld a,(NR14) + xor h + and $F8 + xor h + ld h,a + ld (NR13),hl +_ + + ld hl,(NR13) + ld a,h + or $F8 + ld h,a + inc a + jr nz,_ + ld a,MAX_FREQ + cp l + jr nc,_ + ld l,a +_ + ld d,h + ld e,l + ld a,(NR11) + cp $40 + jp pe,++_ + jr nc,_ + sra d + rr e +_ + sra d + rr e + add hl,hl + sbc hl,de +_ + inc hl + res 0,l + res 0,e + ld (chan1div1),de + ld (chan1div0),hl + pop de + ret + +maybeChannel2: + ld a,(hl) + dec a + jp nz,maybeChannel3 + ld hl,NR24 + ld a,(hl) + rla + jr nc,_ + res 7,(hl) + ld l,$FF + ld (chan2cnt),hl + ld l,NR52 & $FF + set 1,(hl) + ld l,NR52_backup & $FF + set 1,(hl) +_ + ld l,NR52 & $FF + bit 1,(hl) + ret z + + rla + jr nc,_ + ld l,NR21 & $FF + ld a,(hl) + rlca + rlca + add a,4 + rrca + rrca + ld (hl),a + jr nc,_ + ld l,NR52 & $FF + res 1,(hl) +channel2mute: + ld l,NR52_backup & $FF + res 1,(hl) + ld l,soundOutputs+1 & $FF + res 0,(hl) + ld hl,0 + ld (chan2div0),hl + ld (chan2div1),hl + ret +_ + + ld a,(NR51) + and %00100010 + jr z,channel2mute + ld l,NR22 & $FF + ld a,(hl) + and $F0 + jr z,channel2mute + ld a,(hl) + and 7 + jr z,++_ + bit 3,(hl) + jr nz,++_ + ld a,(NR22_backup) + or a + jr nz,_ + ld a,(hl) + and 7 + add a,a + add a,a +_ + dec a + ld (NR22_backup),a + jr nz,_ + ld a,(hl) + sub $10 + ld (hl),a +_ + + push de + ld hl,(NR23) + ld a,h + or $F8 + ld h,a + inc a + jr nz,_ + ld a,MAX_FREQ + cp l + jr nc,_ + ld l,a +_ + ld d,h + ld e,l + ld a,(NR21) + cp $40 + jp pe,++_ + jr nc,_ + sra d + rr e +_ + sra d + rr e + add hl,hl + sbc hl,de +_ + inc hl + res 0,l + res 0,e + ld (chan2div1),de + ld (chan2div0),hl + pop de + ret + +maybeChannel3: + dec a + jr nz,doChannel4 + ld hl,NR34 + ld a,(hl) + rla + jr nc,_ + res 7,(hl) + ld l,$FF + ld (chan3cnt),hl + ld l,NR52 & $FF + set 2,(hl) + ld l,NR52_backup & $FF + set 2,(hl) +_ + ld l,NR52 & $FF + bit 2,(hl) + ret z + + rla + jr nc,_ + ld l,NR31 & $FF + inc (hl) + jr nz,_ + ld l,NR52 & $FF + res 2,(hl) +channel3mute: + ld l,NR52_backup & $FF + res 2,(hl) + ld l,soundOutputs+1 & $FF + res 1,(hl) + ld hl,0 + ld (chan3div),hl + ret +_ + + ld a,(NR51) + and %01000100 + jr z,channel3mute + ld a,(NR30) + rla + jr nc,channel3mute + ld l,NR52_backup & $FF + set 2,(hl) + + ld hl,(NR33) + ld a,h + or $F8 + ld h,a + inc a + jr nz,_ + ld a,MAX_FREQ + cp l + jr nc,_ + ld l,a +_ + ld (chan3div),hl + ret + +doChannel4: + ld hl,NR44 + ld a,(hl) + rla + jr nc,_ + res 7,(hl) + ld l,$FF + ld (chan4cnt),hl + ld l,NR52 & $FF + set 3,(hl) + ld l,NR52_backup & $FF + set 3,(hl) + push af + ld a,(NR43) + inc a + ld (NR43_backup),a + pop af +_ + ld l,NR52 & $FF + bit 3,(hl) + ret z + + rla + jr nc,_ + ld l,NR41 & $FF + ld a,(hl) + inc a + and $3F + ld (hl),a + jr nz,_ + ld l,NR52 & $FF + res 3,(hl) +channel4mute: + ld l,NR52_backup & $FF + res 3,(hl) + ld l,soundOutputs & $FF + res 0,(hl) + ld h,a + ld l,a + ld (chan4div),hl + ret +_ + + ld a,(NR51) + and %10001000 + jr z,channel4mute + ld l,NR42 & $FF + ld a,(hl) + and $F0 + jr z,channel4mute + ld a,(hl) + and 7 + jr z,++_ + bit 3,(hl) + jr nz,++_ + ld a,(NR42_backup) + or a + jr nz,_ + ld a,(hl) + and 7 + add a,a + add a,a +_ + dec a + ld (NR42_backup),a + jr nz,_ + ld a,(hl) + sub $10 + ld (hl),a +_ + + ld a,(NR43) + ld l,NR43_backup & $FF + cp (hl) + ret z + ld (hl),a + ld h,a + and $F8 + sub h + rla + dec a + ld l,a + ld a,h + ld h,$FF + rlca + rlca + rlca + rlca + and $0F + jr z,++_ +_ + add hl,hl + dec a + jr nz,-_ +_ + ld a,l + add a,$80 + ld a,h + adc a,0 + jr nc,_ + ld hl,-$80 +_ + ld (chan4div),hl + ret + +#comment +loop_infinite: + ld a,(de) + cp $FE + jp z,loop_found_end + ret + +check_loop: + ld hl,LY + ld a,(hl) + cp 143 + ret nc + + ;Find loop jump and take it + ld b,LOOP_MAX_SIZE +loop_find_end: + ld a,(de) + inc de + cp $18 + jr z,loop_infinite + and %11100111 + cp $20 + jr z,take_jr + sub $C2 + jr z,take_jp + djnz loop_find_end + ret +take_jp: + ex de,hl + ld e,(hl) + inc hl + ld d,(hl) + sbc hl,de + cp h ;A is ZERO + ret z + ld a,l + cp LOOP_MAX_SIZE + jr c,loop_analyze + ret + +take_jr: + ld a,(de) + ld l,a + rla + ret nc + adc hl,de ;CARRY IS SET + ex de,hl + +loop_analyze: + ld (ix-vars+loop_analyzed),1 + ld hl,LY + ld a,(de) + ;cp $76 ;halt + ;jp z,loop_found_end + cp $18 + jr z,loop_infinite + cp $7e ;ld a,(hl) + jp z,loop_found_first + ;cp $1a ;ld a,(de) + ;jr z,loop_found_first + ;cp $0a ;ld a,(bc) + ;jr z,loop_found_first + cp $be ;cp (hl) + jp z,loop_found_second + cp $fa ;ld a,(nnnn) + jr z,loop_found_first_2 + cp $f0 ;ld a,($ff00+nn) + jr z,loop_found_first_1 + cp $cb + ret nz + inc de + ld a,(de) + ;Check for bit b,(hl) + and %11000111 + cp %01000110 + jp z,loop_found_second + ret + +loop_stat_1: + ld a,(de) + cp h + jr nz,loop_found_first +loop_stat: + ld a,(STAT) + ld e,a + and 3 + dec a + ret z + dec a + jr z,_ + inc a +_ + xor e + and 3 + xor e + ld (STAT),a + ld (ix-vars+loop_analyzed),0 + ret + +loop_found_first_2: + inc de + ld a,(de) + inc de + cp $41 + jr z,loop_stat + cp l + jr nz,loop_found_first + ld a,(de) + cp h + jr nz,loop_found_first +loop_ly: + inc de + ld a,(de) + cp $fe + ret nz + inc de + ld a,(de) + dec a + cp (hl) + jr c,loop_found_end + cp 144 + jr c,_ + ld a,143 +_ + inc l + cp (hl) + jr c,_ + ld iyl,a + dec l + ld a,(hl) + inc l + cp (hl) + ld a,iyl + jr nc,_ + ld a,(hl) + dec a +_ + dec l + ld (hl),a + inc de + ld a,(de) + and %00011000 + cp %00001000 + ret nz + inc (hl) + ret + +loop_found_first_1: + inc de + ld a,(de) + cp $41 + jr z,loop_stat + cp l + jr z,loop_ly +loop_found_first: + inc de + + ld a,(de) + cp $b7 ;or a + jr z,loop_found_second + cp $a7 ;and a + jr z,loop_found_second + cp $fe ;cp nn + jr z,loop_found_second_1 + cp $e6 ;and nn + jr z,loop_found_second_1 + and %11111000 + cp $b8 ;cp reg8 + jr z,loop_found_second + ;cp $a0 ;and reg8 + ;jr z,loop_found_second + ld a,(de) + cp $cb + ret nz + inc de + ld a,(de) + ;Check for bit b,a + and %11000111 + cp %01000111 + jr z,loop_found_second + ret +loop_found_second_1: + inc de +loop_found_second: + inc de + ld a,(de) + cp $b7 ;check for redundant "or a" in case of idiot programming (see: Harvest Moon GB) + jr z,loop_found_second + ;inc de + and $E7 + ;Check for jp f,nnnn + cp $C2 + jr z,loop_found_end + ;jr z,check_jp + ;Check for jr f,nn + cp $20 + ret nz + +;check_jr: +; ld a,(de) +; inc a +; add a,e +; cp (ix-vars+last_loop) +; jr z,loop_found_end +; ret + +;check_jp: +; ld a,(de) +; cp (ix-vars+last_loop) +; ret nz +; inc de +; ld a,(de) +; cp (ix-vars+last_loop+1) +; ret nz + +loop_found_end: + ld a,(hl) + inc l + cp (hl) + jr nc,_ + ld a,(hl) + dec a + cp 144 + jr nc,_ + dec l + ld (hl),a + ret +_ + dec l + ld (hl),143 + ret +#endcomment + +hardwaresound: + ld ix,irqflash + ld ($FDFE),ix + ld a,c + ex af,af' + push af + ei + call hardwarenormal + di + pop af + ex af,af' + ld c,a + ld a,(channelSelect) + or a + jr z,++_ +_ + ld hl,irq_sound + ld ($FDFE),hl + ld a,(LY) + cp 144 + ld ixl,1 + ret c + ld ixl,5 + ret + +hardwareflash: + ld a,(channelSelect) + or a + jr nz,hardwaresound + call hardwarenormal + ld a,(channelSelect) + or a + jr nz,-_ +_ + ld a,(LY) + cp 144 + ld a,2 + out ($37),a + dec a + jr c,_ + ld a,5 +_ + out ($38),a + ret + +waitloop_check: + ld e,1 + ld a,(hl) + cp $76 ;HALT + jp z,waitloop_found_end + + ld b,LOOP_MAX_SIZE +waitloop_loop: + ld a,(hl) + inc hl + cp $18 + jr z,waitloop_infinite + and %11100111 + cp $20 + jr z,waitloop_take_jr + cp $C2 + jr z,waitloop_take_jp + djnz waitloop_loop + ret + +waitloop_take_jr: + xor a + ld d,a + sub (hl) + ld e,a + add a,-LOOP_MAX_SIZE + ret c + sbc hl,de ;CARRY IS RESET + jr waitloop_start + +waitloop_take_jp: + ld e,(hl) + inc hl + ld d,(hl) + ld a,d + add a,$40 + jp po,$+4 \ ld d,a + xor a + sbc hl,de + ex de,hl + cp d + ret nz + ld a,e + cp LOOP_MAX_SIZE + ret nc + +waitloop_start: + inc hl + ld a,(hl) + cp $76 ;HALT + jr z,waitloop_start + cp $7E ;LD A,(HL) + jr z,waitloop_found_load + cp $1A ;LD A,(DE) + jr z,waitloop_found_load + cp $0A ;LD A,(BC) + jr z,waitloop_found_load + ;cp $BE ;CP (HL) + ;jr z,waitloop_found_test + inc hl + cp $FA ;LD A,(NNNN) + jr z,waitloop_found_load_imm16 + cp $F0 ;LD A,($FF00+NN) + jr z,waitloop_found_load_imm8 + cp $CB + ret nz + ;Check for BIT B,(HL) + ld a,(hl) + and %11000111 + cp %01000110 + jr z,waitloop_found_test + ret + +waitloop_infinite: + ld e,2 + ld a,(hl) + cp $FE + jr z,waitloop_found_end + ret + +waitloop_found_load_imm16: + ld a,(hl) + cp LY & $FF + inc hl + jr nz,waitloop_found_load + ld a,(hl) + inc a + jr nz,waitloop_found_load +waitloop_found_load_ly: + inc hl + ld a,(hl) + cp $FE + ret nz + inc hl + ld a,(hl) + cp 144 + jr nc,waitloop_found_test + ret + +waitloop_found_load_imm8: + ld a,(hl) + cp STAT & $FF + ret z + cp LY & $FF + jr z,waitloop_found_load_ly +waitloop_found_load: + inc hl + ld a,(hl) + cp $B7 ;OR A + jr z,waitloop_found_test + cp $A7 ;AND A + jr z,waitloop_found_test + cp $FE ;CP NN + jr z,waitloop_found_test_imm8 + cp $E6 ;AND NN + jr z,waitloop_found_test_imm8 + and %11111000 + cp $B8 ;CP REG8 + jr z,waitloop_found_test + ;cp $A0 ;AND REG8 + ;jr z,waitloop_found_test + ld a,(hl) + cp $CB + ret nz + inc hl + ld a,(hl) + ;Check for BIT B,A + and %11000111 + cp %01000111 + jr z,waitloop_found_test + ret +waitloop_found_test_imm8: + inc hl +waitloop_found_test: + inc hl + ld a,(hl) + cp $B7 ;check for redundant OR A in case of idiot programming (see: Harvest Moon GB) + jr z,waitloop_found_test + and $E7 + ;Check for JR F,NN + cp $20 + jr z,waitloop_found_end_imm8 + ;Check for JP F,NNNN + cp $C2 + ret nz +waitloop_found_end_imm16: + inc hl +waitloop_found_end_imm8: + inc hl +waitloop_found_end: + ld a,e + ld (loop_size),a + ld a,l + cpl + ld l,a + in a,($28) + or a + ld a,h + jr nz,$+4 \ sub $40 + cpl + ld h,a + ld (loop_negptr),hl + ld a,(pageA) + ld (loop_page),a + ret + +waitloop_analyze: + ld a,h + add a,$40 + jp po,_ + ld h,a + xor a + out ($28),a + ld a,(pageA) + out (7),a +_ + call waitloop_check + ld a,$80 + out ($28),a + ld a,(pageB) + out (7),a + jr waitloop_end + +hardwarenormal: + ld ix,vars + + ld a,(LY) + cp 143 + jr z,waitloop_analyze + jr nc,waitloop_end + ex de,hl + ;ld hl,STAT + ;ld a,(hl) + ;rrca + ;add a,a + ;jr c,_ + ;bit 1,a + ;res 1,a + ;jr nz,_ + ;add a,3 +_ + ;ld (hl),a + ld a,(LCDC) + ld hl,BGP; & $FF + xor (hl) + ld hl,(SCY) + xor l + xor h + ld hl,(WY) + xor l + xor h + ld hl,lcdchecksum + xor (hl) + jr z,_ + xor (hl) + ld (hl),a + ld a,l +_ + dec l + or (hl) + ld (hl),a + jr nz,waitloop_end + ld a,d + ld hl,(loop_negptr) + add hl,de + ld de,(loop_size) + add hl,de + jr nc,waitloop_end + add a,$40 ;Is PC in swappable ROM? + jp po,_ + ld a,(loop_page) + cp (ix-vars+pageA) + jr nz,waitloop_end +_ + ld hl,LYC + ld a,(hl) + dec a + dec l + cp 143 + jr nc,_ + cp (hl) + jr nc,++_ +_ + ld a,143 +_ + ld (hl),a +waitloop_end: + +#comment + ld a,(lcdchanged) + or a + jr nz,no_loop_check + ld a,(hl) + cp $76 + jr z,_ + ld de,(last_loop) + ld (last_loop),hl + sbc hl,de + ld a,h + rlca + cp h + jr nz,++_ + xor l + cp LOOP_MAX_SIZE + jr nc,++_ + ld a,(loop_analyzed) + or a + push iy + call z,check_loop + pop iy + jr +++_ +_ + ld hl,LY + ld a,(hl) + cp 143 + call c,loop_found_end +_ + xor a + ld (loop_analyzed),a +_ +no_loop_check: +#endcomment + +#comment + ld hl,$FF03 + ld a,(hl) + or a + jr z,notsending + dec (hl) + jr nz,serialend + dec l + res 7,(hl) + ld l,$0F + set 3,(hl) + jr serialassistoff +notsending: + dec l + bit 7,(hl) + jr z,serialoff + bit 0,(hl) + dec hl + jr z,slave + xor a + out (0),a + in a,(0) + rra + sbc a,a + jr c,received + ld a,2 + out (0),a +_ + in a,(0) + rra + jr nc,-_ + xor a + out (0),a + jr send +slave: + ld a,1 + out (0),a + in a,(0) + and 2 + jr nz,serialend + out (0),a +_ + in a,(0) + sub 3 + jr nz,-_ +send: + out (8),a + ld a,(hl) + out ($0D),a +_ + in a,(9) + bit 6,a + jr nz,++_ + bit 4,a + jr z,-_ +_ + in a,(9) + rla + jr c,-_ +_ + in a,($0A) +received: + ld (hl),a + ld l,3 + ld (hl),8 +serialassistoff: + ld a,$80 + out (8),a +serialoff: + xor a + out (0),a +serialend: +#endcomment + +#comment + ld hl,$FF03 + ld a,(hl) + or a + jr z,notsending + dec (hl) + jr nz,serialend + dec l + bit 0,(hl) + jr z,slaveeee + xor a + out (0),a + in a,(0) + rra + sbc a,a + jr c,received +_ + in a,(0) + rra + jr nc,-_ + xor a +send: + out (8),a + dec l + ld a,(hl) + out ($0D),a +_ + in a,(9) + bit 6,a + jr nz,received + bit 4,a + jr z,-_ +_ + in a,(9) + rla + jr c,-_ +received: + res 7,(hl) + dec l + ld (hl),a + ld l,$0F + set 3,(hl) + jr serialassistoff +slaveeee: + in a,(0) + and 2 + jr z,slaveeee + xor a + out (0),a + jr send +notsending: + dec l + bit 7,(hl) + jr z,serialoff + bit 0,(hl) + jr z,slave + ld a,2 + out (0),a + inc l + ld (hl),8 + jr serialend +slave: + in a,(0) + and 2 + jr nz,serialend + inc a + out (0),a + inc l + ld (hl),8 + jr serialend +serialassistoff: + ld a,$80 + out (8),a +serialoff: + xor a + out (0),a +serialend: +#endcomment + + ld hl,DIV + ld a,r + add a,(hl) + ld (hl),a + + ld a,(TAC) + bit 2,a + jr z,_ + dec a + and 3 + srl a + jr nz,$+4 \ ld a,16 + jr c,$+4 \ add a,a \ add a,a + ;add a,a + inc l ;ld l,TIMA & $FF + add a,(hl) + ld (hl),a + jr nc,_ + ld a,(TMA) + ld (hl),a + ld l,IF & $FF + set 2,(hl) +_ + + ld a,(STAT) + and %00101000 + jr z,_ + ld l,IF & $FF + set 1,(hl) +_ + + ld l,LCDC & $FF + bit 7,(hl) + ld l,LY & $FF + jr z,_ + ld a,(hl) + inc a + cp 154 + jr c,++_ +_ + xor a +_ + ld (hl),a + inc l + cp (hl) + ld l,STAT & $FF + res 2,(hl) + jr nz,not_lyc + set 2,(hl) + bit 6,(hl) + jr z,not_lyc + ld l,$0f + set 1,(hl) +not_lyc: + + cp 144 + jr z,vblank + jr nc,backup + ld a,(lcdchanged) + or a + jr z,check_vblank +vblank: + call render + xor a +backup: + ld (lcdchanged),a + ld hl,LCDC + ld de,LCDC_backup + ld bc,12 + ldir +check_vblank: + ld a,(LCDC) + or (ix-vars+sprite_detect) + ld (sprite_detect),a + + ld l,STAT & $FF + ld a,(LY) + or a + jr nz,_ + res 0,(hl) +_ + cp 144 + jr c,_ + set 0,(hl) + res 1,(hl) +_ + jr nz,no_lcd_update + bit 4,(hl) + ld l,IF & $FF + set 0,(hl) + jr z,no_lcd_update + set 1,(hl) +no_lcd_update: + ld de,(opcodetable_B & $FF00) + (opcodetable >> 8) + ret + +timer1flash: + push bc + push de + push hl + ld a,2 + out ($31),a + ld d,0 + in a,($32) + ld e,a + inc de + inc de + inc de + ld hl,(chan3cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 2,(hl) + jr z,_ + ld a,(NR32) + and %01100000 + jr z,_ + ld l,soundOutputs+1 & $FF + ld a,(hl) + xor 2 + ld (hl),a +_ + ld hl,(chan3div) + bit 1,a + jr z,$+3 + inc hl + res 0,l +_ + ld (chan3cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + ld b,a + + ld hl,(chan4cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 3,(hl) + jr z,_ + ld l,soundOutputs & $FF + ld a,r + xor (hl) + and 1 + xor (hl) + ld (hl),a +_ + ld hl,(chan4div) +_ + ld (chan4cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + cp b + jr c,_ + ld a,b +_ + out ($32),a + + ld hl,(soundOutputs) + ld a,h + xor l + ld (soundDiff1),a + ld (soundDiff2),a + ex af,af' + rla + ld a,l + jr nc,$+3 + ld a,h + ex af,af' + + pop hl + pop de + pop bc + pop af + ei + ret + +timer2flash: + push bc + push de + push hl + ld a,2 + out ($34),a + ld d,0 + in a,($35) + ld e,a + inc de + inc de + inc de + ld hl,(chan1cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 0,(hl) + jr z,_ + ld l,soundOutputs & $FF + ld a,(hl) + xor 2 + ld (hl),a + bit 1,a + ld hl,(chan1div1) + jr nz,++_ +_ + ld hl,(chan1div0) +_ + ld (chan1cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + ld b,a + + ld hl,(chan2cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 1,(hl) + jr z,_ + ld l,soundOutputs+1 & $FF + ld a,(hl) + xor 1 + ld (hl),a + rra + ld hl,(chan2div1) + jr c,++_ +_ + ld hl,(chan2div0) +_ + ld (chan2cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + cp b + jr c,_ + ld a,b +_ + out ($35),a + + ld hl,(soundOutputs) + ld a,h + xor l + ld (soundDiff1),a + ld (soundDiff2),a + ex af,af' + rla + ld a,l + jr nc,$+3 + ld a,h + ex af,af' + + pop hl + pop de + pop bc + pop af + ei + ret + +#comment +sndflash_chan3: + ld l,chan3cntMSB & $FF + inc (hl) + jr nz,sndflash_chan3end + ld l,linestate0 & $FF + bit 1,(hl) + jr z,_ + res 1,(hl) + ld hl,(chan3div1) + jr ++_ +_ + set 1,(hl) + ld hl,(chan3div2) +_ + ld a,h + ld (chan3cntMSB),a + ld a,l + ld hl,chan3cntLSB + ld (hl),a +sndflash_chan3end: + ld l,chan3cntLSB+1 & $FF + jr sndflash_chan3continue + +sndflash_intense: + ld a,3 + out ($34),a + push hl + ld hl,chan1cntLSB + inc (hl) + jr z,sndflash_chan1 + inc l +sndflash_chan1continue: + inc (hl) + jr z,sndflash_chan2 + inc l +sndflash_chan2continue: + inc (hl) + jr z,sndflash_chan3 + inc l +sndflash_chan3continue: + ld a,r + add a,$80 + ld r,a + jr nc,$+3 + inc l + ld a,(hl) + out (0),a + pop hl + pop af + ei + ret + +sndflash_chan1: + ld l,chan1cntMSB & $FF + inc (hl) + jr nz,sndflash_chan1end + ld l,linestate0 & $FF + bit 0,(hl) + jr z,_ + res 0,(hl) + ld hl,(chan1div1) + jr ++_ +_ + set 0,(hl) + ld hl,(chan1div2) +_ + ld a,h + ld (chan1cntMSB),a + ld a,l + ld hl,chan1cntLSB + ld (hl),a +sndflash_chan1end: + ld l,chan1cntLSB+1 & $FF + jr sndflash_chan1continue + + +sndflash_chan2: + ld l,chan2cntMSB & $FF + inc (hl) + jr nz,sndflash_chan2end + ld l,linestate1 & $FF + ld a,(hl) + xor 3 + ld (hl),a + jr z,_ + ld hl,(chan2div1) + jr ++_ +_ + ld hl,(chan2div2) +_ + ld a,h + ld (chan2cntMSB),a + ld a,l + ld hl,chan2cntLSB + ld (hl),a +sndflash_chan2end: + ld l,chan2cntLSB+1 & $FF + jr sndflash_chan2continue + +swaplinesflash: + push hl + bit 4,a + ld a,2 + jr nz,swapline1flash +swapline2flash: + out ($34),a + ld hl,(NR23) + ld a,h + xor l + and 3 + xor l + rrca + rrca + bit 2,h + jr nz,$+3 + xor a + xor $FF + jr nz,$+3 + inc a + out ($35),a + ld hl,linestate + ld a,(hl) + xor 2 + ld (hl),a + out (0),a + pop hl + pop af + ei + ret +swapline1flash: + out ($31),a + ld hl,(NR33) + ld a,h + xor l + and 3 + xor l + rrca + rrca + bit 2,h + jr nz,$+3 + xor a + xor $FF + jr nz,$+3 + inc a + out ($32),a + ld a,(NR30) + rla + jr nc,_ + ld a,(NR32) + and %01100000 + jr z,_ + ld hl,linestate + ld a,(hl) + xor 1 + ld (hl),a + out (0),a +_ + pop hl + pop af + ei + ret +#endcomment + +go_sleep_sound: + di + ld hl,irq_jump + ld (hl),$C9 + xor a + out ($31),a + out ($34),a + out ($37),a + inc a + out (3),a + ei + halt + ld a,3 + out ($10),a +_ + ld bc,0 +_ + ex (sp),hl + ex (sp),hl + ex (sp),hl + ex (sp),hl + in a,(4) + bit 3,a + jr z,--_ + dec bc + ld a,b + or c + jr nz,-_ + ld (hl),$C3 + out (3),a + ld a,5 + out (3),a + ld a,2 + out ($31),a + out ($34),a + dec a + out ($32),a + out ($35),a + ld a,$FF + out ($37),a + out ($38),a + ei + ret + +go_sleep: + ld a,(channelSelect) + or a + jr nz,go_sleep_sound + ld hl,irq_jump + ld (hl),$C9 + xor a + out ($37),a + ei + halt + ld a,3 + out ($10),a +_ + ld bc,0 +_ + ex (sp),hl + ex (sp),hl + ex (sp),hl + ex (sp),hl + in a,(4) + bit 3,a + jr z,--_ + dec bc + ld a,b + or c + jr nz,-_ + ld (hl),$C3 + out (3),a + inc a + out (3),a + ret + +#include "render.z80" + +rompage3codesize = $ - $4000 + .echo "ROM Page 3 code size: ",rompage3codesize + .echo "Left on ROM Page 3: ", $5A00 - $ + .org rompage3code + rompage3codesize \ No newline at end of file diff --git a/opcodes_crazy.z80 b/opcodes_crazy.z80 new file mode 100644 index 0000000..f79245b --- /dev/null +++ b/opcodes_crazy.z80 @@ -0,0 +1,7828 @@ +#define bytes_skipped 0 + +;Make sure LSB of address is not C7, CF, D7, DF +#macro FIX_LBL + #if $ & $E7 == $C7 + nop + #endif +#endmacro + +;Your typical NEXT routine where SP=GBPC. Puts the second byte in E and calls the _B opcode routine. +#macro NEXT + rst 00h + .org $+6 + #define bytes_skipped eval(bytes_skipped+6) + ;ei + ;pop hl ;10cc + ;di + ;ld b,h ;14cc + ;ld h,d ;18cc + ;ld h,(hl) ;25cc + ;jp (hl) ;29cc +#endmacro + +;Another typical NEXT routine where SP=GBPC+1, B=(GBPC). Calls the normal opcode routine. +#macro NEXT_B + rst 08h + .org $+3 + #define bytes_skipped eval(bytes_skipped+3) + ;ld l,b ;4cc + ;ld h,e ;8cc + ;ld h,(hl) ;15cc + ;jp (hl) ;19cc +#endmacro + +;An optimized NEXT routine where SP=GBPC+1, H=(GBPC). Calls the normal opcode routine. +#macro NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc +#endmacro + +;A NEXT routine which allows interrupts to trigger. +#macro NEXT_INT + rst 10h + .org $+6 + #define bytes_skipped eval(bytes_skipped+6) + ;ei ;4cc + ;pop hl ;14cc + ;di ;18cc + ;ld b,h ;22cc + ;ld h,d ;26cc + ;ld h,(hl) ;33cc + ;jp (hl) ;37cc +#endmacro + +#define opcodeC9_B opcodeC9 +#define opcodeD9_B opcodeD9 +#define opcodeE9_B opcodeE9 +#define opcodeF3 opcodeF3end +#define opcodeCB bitcodes +#define opcodeD3 invalid +#define opcodeD3_B invalid +#define opcodeDB invalid +#define opcodeDB_B invalid +#define opcodeDD invalid +#define opcodeDD_B invalid +#define opcodeE3 invalid +#define opcodeE3_B invalid +#define opcodeE4 invalid +#define opcodeE4_B invalid +#define opcodeEB invalid +#define opcodeEB_B invalid +#define opcodeEC invalid +#define opcodeEC_B invalid +#define opcodeED invalid +#define opcodeED_B invalid +#define opcodeF4 invalid +#define opcodeF4_B invalid +#define opcodeFC invalid +#define opcodeFC_B invalid +#define opcodeFD invalid +#define opcodeFD_B invalid + +#macro insert_op(address) + #if address&$FF == $00 + #ifndef opcode00 + fill_to(address) +#define opcode00 eval($) + ;nop + NEXT + #else + #ifndef opcode00_B + fill_to(address) +#define opcode00_B eval($) + ;nop + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $01 + #ifndef opcode01 + fill_to(address) +#define opcode01 eval($) + ;ld bc,NN + exx + pop bc + exx + NEXT + #else + #ifndef opcode01_B + fill_to(address) +#define opcode01_B eval($) + ;ld bc,NN + dec sp + exx + pop bc + exx + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $02 + #ifndef opcode02 + fill_to(address) +#define opcode02 eval($) + ;ld (bc),a + exx + ld (bc),a + exx + NEXT + #else + #ifndef opcode02_B + fill_to(address) +#define opcode02_B eval($) + ;ld (bc),a + exx + ld (bc),a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $03 + #ifndef opcode03 + fill_to(address) +#define opcode03 eval($) + ;inc bc + exx + inc bc + exx + NEXT + #else + #ifndef opcode03_B + fill_to(address) +#define opcode03_B eval($) + ;inc bc + exx + inc bc + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $04 + #ifndef opcode04 + fill_to(address) +#define opcode04 eval($) + ;inc b + exx + inc b + exx + NEXT + #else + #ifndef opcode04_B + fill_to(address) +#define opcode04_B eval($) + ;inc b + exx + inc b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $05 + #ifndef opcode05 + fill_to(address) +#define opcode05 eval($) + ;dec b + exx + dec b + exx + NEXT + #else + #ifndef opcode05_B + fill_to(address) +#define opcode05_B eval($) + ;dec b + exx + dec b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $06 + #ifndef opcode06 + fill_to(address) +#define opcode06 eval($) + ;ld b,N + ex af,af' + pop hl + ld a,l + exx + ld b,a + exx + ex af,af' + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode06_B + fill_to(address) +#define opcode06_B eval($) + ;ld b,N + ex af,af' + ld a,b + exx + ld b,a + exx + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $07 + #ifndef opcode07 + fill_to(address) +#define opcode07 eval($) + ;rlca + rlca + NEXT + #else + #ifndef opcode07_B + fill_to(address) +#define opcode07_B eval($) + ;rlca + rlca + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $08 + #ifndef opcode08 + fill_to(address) +#define opcode08 eval($) + ;ld (nnnn),sp + pop hl + ld (_+2),hl +_ + ld (0),iy + NEXT + #else + #ifndef opcode08_B + fill_to(address) +#define opcode08_B eval($) + ;ld (nnnn),sp + dec sp + pop hl + ld (_+2),hl +_ + ld (0),iy + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $09 + #ifndef opcode09 + fill_to(address) +#define opcode09 eval($) + ;add hl,bc + exx + add hl,bc + exx + NEXT + #else + #ifndef opcode09_B + fill_to(address) +#define opcode09_B eval($) + ;add hl,bc + exx + add hl,bc + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $0A + #ifndef opcode0A + fill_to(address) +#define opcode0A eval($) + ;ld a,(bc) + exx + ld a,(bc) + exx + NEXT + #else + #ifndef opcode0A_B + fill_to(address) +#define opcode0A_B eval($) + ;ld a,(bc) + exx + ld a,(bc) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $0B + #ifndef opcode0B + fill_to(address) +#define opcode0B eval($) + ;dec bc + exx + dec bc + exx + NEXT + #else + #ifndef opcode0B_B + fill_to(address) +#define opcode0B_B eval($) + ;dec bc + exx + dec bc + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $0C + #ifndef opcode0C + fill_to(address) +#define opcode0C eval($) + ;inc c + exx + inc c + exx + NEXT + #else + #ifndef opcode0C_B + fill_to(address) +#define opcode0C_B eval($) + ;inc c + exx + inc c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $0D + #ifndef opcode0D + fill_to(address) +#define opcode0D eval($) + ;dec c + exx + dec c + exx + NEXT + #else + #ifndef opcode0D_B + fill_to(address) +#define opcode0D_B eval($) + ;dec c + exx + dec c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $0E + #ifndef opcode0E + fill_to(address) +#define opcode0E eval($) + ;ld c,N + ex af,af' + pop hl + ld a,l + exx + ld c,a + exx + ex af,af' + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode0E_B + fill_to(address) +#define opcode0E_B eval($) + ;ld c,N + ex af,af' + ld a,b + exx + ld c,a + exx + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $0F + #ifndef opcode0F + fill_to(address) +#define opcode0F eval($) + ;rrca + rrca + NEXT + #else + #ifndef opcode0F_B + fill_to(address) +#define opcode0F_B eval($) + ;rrca + rrca + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $10 + #ifndef opcode10 + fill_to(address) +#define opcode10 eval($) + ;stop + pop hl + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode10_B + fill_to(address) +#define opcode10_B eval($) + ;stop + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $11 + #ifndef opcode11 + fill_to(address) +#define opcode11 eval($) + ;ld de,NN + exx + pop de + exx + NEXT + #else + #ifndef opcode11_B + fill_to(address) +#define opcode11_B eval($) + ;ld de,NN + dec sp + exx + pop de + exx + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $12 + #ifndef opcode12 + fill_to(address) +#define opcode12 eval($) + ;ld (de),a + exx + ld (de),a + exx + NEXT + #else + #ifndef opcode12_B + fill_to(address) +#define opcode12_B eval($) + ;ld (de),a + exx + ld (de),a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $13 + #ifndef opcode13 + fill_to(address) +#define opcode13 eval($) + ;inc de + exx + inc de + exx + NEXT + #else + #ifndef opcode13_B + fill_to(address) +#define opcode13_B eval($) + ;inc de + exx + inc de + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $14 + #ifndef opcode14 + fill_to(address) +#define opcode14 eval($) + ;inc d + exx + inc d + exx + NEXT + #else + #ifndef opcode14_B + fill_to(address) +#define opcode14_B eval($) + ;inc d + exx + inc d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $15 + #ifndef opcode15 + fill_to(address) +#define opcode15 eval($) + ;dec d + exx + dec d + exx + NEXT + #else + #ifndef opcode15_B + fill_to(address) +#define opcode15_B eval($) + ;dec d + exx + dec d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $16 + #ifndef opcode16 + fill_to(address) +#define opcode16 eval($) + ;ld d,N + ex af,af' + pop hl + ld a,l + exx + ld d,a + exx + ex af,af' + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode16_B + fill_to(address) +#define opcode16_B eval($) + ;ld d,N + ex af,af' + ld a,b + exx + ld d,a + exx + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $17 + #ifndef opcode17 + fill_to(address) +#define opcode17 eval($) + ;rla + rla + NEXT + #else + #ifndef opcode17_B + fill_to(address) +#define opcode17_B eval($) + ;rla + rla + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $18 + #ifndef opcode18 + fill_to(address) +#define opcode18 eval($) + ;jr N + ex af,af' + pop hl + dec sp + ld a,l + rla + sbc a,a + ld h,a + add hl,sp + ex af,af' + ld sp,hl + NEXT_INT + #else + #ifndef opcode18_B + fill_to(address) +#define opcode18_B eval($) + ;jr N + ex af,af' + ld l,b + ld a,l + rla + sbc a,a + ld h,a + add hl,sp + ex af,af' + ld sp,hl + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $19 + #ifndef opcode19 + fill_to(address) +#define opcode19 eval($) + ;add hl,de + exx + add hl,de + exx + NEXT + #else + #ifndef opcode19_B + fill_to(address) +#define opcode19_B eval($) + ;add hl,de + exx + add hl,de + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $1A + #ifndef opcode1A + fill_to(address) +#define opcode1A eval($) + ;ld a,(de) + exx + ld a,(de) + exx + NEXT + #else + #ifndef opcode1A_B + fill_to(address) +#define opcode1A_B eval($) + ;ld a,(de) + exx + ld a,(de) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $1B + #ifndef opcode1B + fill_to(address) +#define opcode1B eval($) + ;dec de + exx + dec de + exx + NEXT + #else + #ifndef opcode1B_B + fill_to(address) +#define opcode1B_B eval($) + ;dec de + exx + dec de + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $1C + #ifndef opcode1C + fill_to(address) +#define opcode1C eval($) + ;inc e + exx + inc e + exx + NEXT + #else + #ifndef opcode1C_B + fill_to(address) +#define opcode1C_B eval($) + ;inc e + exx + inc e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $1D + #ifndef opcode1D + fill_to(address) +#define opcode1D eval($) + ;dec e + exx + dec e + exx + NEXT + #else + #ifndef opcode1D_B + fill_to(address) +#define opcode1D_B eval($) + ;dec e + exx + dec e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $1E + #ifndef opcode1E + fill_to(address) +#define opcode1E eval($) + ;ld e,N + ex af,af' + pop hl + ld a,l + exx + ld e,a + exx + ex af,af' + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode1E_B + fill_to(address) +#define opcode1E_B eval($) + ;ld e,N + ex af,af' + ld a,b + exx + ld e,a + exx + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $1F + #ifndef opcode1F + fill_to(address) +#define opcode1F eval($) + ;rra + rra + NEXT + #else + #ifndef opcode1F_B + fill_to(address) +#define opcode1F_B eval($) + ;rra + rra + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $20 + #ifndef opcode20 + fill_to(address) +#define opcode20 eval($) + ;jr nz,N + jp nz,opcode18 + inc sp + NEXT_INT + #else + #ifndef opcode20_B + fill_to(address) +#define opcode20_B eval($) + ;jr nz,N + jp nz,opcode18_B + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $21 + #ifndef opcode21 + fill_to(address) +#define opcode21 eval($) + ;ld hl,NN + exx + pop hl + exx + NEXT + #else + #ifndef opcode21_B + fill_to(address) +#define opcode21_B eval($) + ;ld hl,NN + dec sp + exx + pop hl + exx + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $22 + #ifndef opcode22 + fill_to(address) +#define opcode22 eval($) + ;ld (hl+),a + exx + ld (hl),a + inc hl + exx + NEXT + #else + #ifndef opcode22_B + fill_to(address) +#define opcode22_B eval($) + ;ld (hl+),a + exx + ld (hl),a + inc hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $23 + #ifndef opcode23 + fill_to(address) +#define opcode23 eval($) + ;inc hl + exx + inc hl + exx + NEXT + #else + #ifndef opcode23_B + fill_to(address) +#define opcode23_B eval($) + ;inc hl + exx + inc hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $24 + #ifndef opcode24 + fill_to(address) +#define opcode24 eval($) + ;inc h + exx + inc h + exx + NEXT + #else + #ifndef opcode24_B + fill_to(address) +#define opcode24_B eval($) + ;inc h + exx + inc h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $25 + #ifndef opcode25 + fill_to(address) +#define opcode25 eval($) + ;dec h + exx + dec h + exx + NEXT + #else + #ifndef opcode25_B + fill_to(address) +#define opcode25_B eval($) + ;dec h + exx + dec h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $26 + #ifndef opcode26 + fill_to(address) +#define opcode26 eval($) + ;ld h,N + ex af,af' + pop hl + ld a,l + exx + ld h,a + exx + ex af,af' + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode26_B + fill_to(address) +#define opcode26_B eval($) + ;ld h,N + ex af,af' + ld a,b + exx + ld h,a + exx + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $27 + #ifndef opcode27 + fill_to(address) +#define opcode27 eval($) + ;daa + daa + NEXT + #else + #ifndef opcode27_B + fill_to(address) +#define opcode27_B eval($) + ;daa + daa + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $28 + #ifndef opcode28 + fill_to(address) +#define opcode28 eval($) + ;jr z,N + jp z,opcode18 + inc sp + NEXT_INT + #else + #ifndef opcode28_B + fill_to(address) +#define opcode28_B eval($) + ;jr z,N + jp z,opcode18_B + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $29 + #ifndef opcode29 + fill_to(address) +#define opcode29 eval($) + ;add hl,hl + exx + add hl,hl + exx + NEXT + #else + #ifndef opcode29_B + fill_to(address) +#define opcode29_B eval($) + ;add hl,hl + exx + add hl,hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $2A + #ifndef opcode2A + fill_to(address) +#define opcode2A eval($) + ;ld a,(hl+) + exx + ld a,(hl) + inc hl + exx + NEXT + #else + #ifndef opcode2A_B + fill_to(address) +#define opcode2A_B eval($) + ;ld a,(hl+) + exx + ld a,(hl) + inc hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $2B + #ifndef opcode2B + fill_to(address) +#define opcode2B eval($) + ;dec hl + exx + dec hl + exx + NEXT + #else + #ifndef opcode2B_B + fill_to(address) +#define opcode2B_B eval($) + ;dec hl + exx + dec hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $2C + #ifndef opcode2C + fill_to(address) +#define opcode2C eval($) + ;inc l + exx + inc l + exx + NEXT + #else + #ifndef opcode2C_B + fill_to(address) +#define opcode2C_B eval($) + ;inc l + exx + inc l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $2D + #ifndef opcode2D + fill_to(address) +#define opcode2D eval($) + ;dec l + exx + dec l + exx + NEXT + #else + #ifndef opcode2D_B + fill_to(address) +#define opcode2D_B eval($) + ;dec l + exx + dec l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $2E + #ifndef opcode2E + fill_to(address) +#define opcode2E eval($) + ;ld l,N + ex af,af' + pop hl + ld a,l + exx + ld l,a + exx + ex af,af' + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode2E_B + fill_to(address) +#define opcode2E_B eval($) + ;ld l,N + ex af,af' + ld a,b + exx + ld l,a + exx + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $2F + #ifndef opcode2F + fill_to(address) +#define opcode2F eval($) + ;cpl + cpl + NEXT + #else + #ifndef opcode2F_B + fill_to(address) +#define opcode2F_B eval($) + ;cpl + cpl + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $30 + #ifndef opcode30 + fill_to(address) +#define opcode30 eval($) + ;jr nc,N + jp nc,opcode18 + inc sp + NEXT_INT + #else + #ifndef opcode30_B + fill_to(address) +#define opcode30_B eval($) + ;jr nc,N + jp nc,opcode18_B + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $31 + #ifndef opcode31 + fill_to(address) +#define opcode31 eval($) + ;ld sp,NN + pop iy + NEXT + #else + #ifndef opcode31_B + fill_to(address) +#define opcode31_B eval($) + ;ld sp,NN + dec sp + pop iy + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $32 + #ifndef opcode32 + fill_to(address) +#define opcode32 eval($) + ;ld (hl-),a + exx + ld (hl),a + dec hl + exx + NEXT + #else + #ifndef opcode32_B + fill_to(address) +#define opcode32_B eval($) + ;ld (hl-),a + exx + ld (hl),a + dec hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $33 + #ifndef opcode33 + fill_to(address) +#define opcode33 eval($) + ;inc sp + inc iy + NEXT + #else + #ifndef opcode33_B + fill_to(address) +#define opcode33_B eval($) + ;inc sp + inc iy + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $34 + #ifndef opcode34 + fill_to(address) +#define opcode34 eval($) + ;inc (hl) + exx + inc (hl) + exx + NEXT + #else + #ifndef opcode34_B + fill_to(address) +#define opcode34_B eval($) + ;inc (hl) + exx + inc (hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $35 + #ifndef opcode35 + fill_to(address) +#define opcode35 eval($) + ;dec (hl) + exx + dec (hl) + exx + NEXT + #else + #ifndef opcode35_B + fill_to(address) +#define opcode35_B eval($) + ;dec (hl) + exx + dec (hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $36 + #ifndef opcode36 + fill_to(address) +#define opcode36 eval($) + ;ld (hl),N + ex af,af' + pop hl + ld a,l + exx + bit 7,h + jr z,_ + ld (hl),a + exx + ex af,af' + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc +_ + dec sp + ld a,h + exx + ld h,a + jp memcontrol + #else + #ifndef opcode36_B + fill_to(address) +#define opcode36_B eval($) + ;ld (hl),N + ex af,af' + ld a,b + exx + bit 7,h + jr z,_ + ld (hl),a + exx + ex af,af' + NEXT +_ + ld a,h + exx + ld h,a + ld l,b + jp memcontrol + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $37 + #ifndef opcode37 + fill_to(address) +#define opcode37 eval($) + ;scf + scf + NEXT + #else + #ifndef opcode37_B + fill_to(address) +#define opcode37_B eval($) + ;scf + scf + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $38 + #ifndef opcode38 + fill_to(address) +#define opcode38 eval($) + ;jr c,N + jp c,opcode18 + inc sp + NEXT_INT + #else + #ifndef opcode38_B + fill_to(address) +#define opcode38_B eval($) + ;jr c,N + jp c,opcode18_B + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $39 + #ifndef opcode39 + fill_to(address) +#define opcode39 eval($) + ;add hl,sp + ld hl,0 + add hl,sp + ld sp,iy + exx + add hl,sp + exx + ld sp,hl + NEXT + #else + #ifndef opcode39_B + fill_to(address) +#define opcode39_B eval($) + ;add hl,sp + ld hl,0 + add hl,sp + ld sp,iy + exx + add hl,sp + exx + ld sp,hl + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $3A + #ifndef opcode3A + fill_to(address) +#define opcode3A eval($) + ;ld a,(hl-) + exx + ld a,(hl) + dec hl + exx + NEXT + #else + #ifndef opcode3A_B + fill_to(address) +#define opcode3A_B eval($) + ;ld a,(hl-) + exx + ld a,(hl) + dec hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $3B + #ifndef opcode3B + fill_to(address) +#define opcode3B eval($) + ;dec sp + dec iy + NEXT + #else + #ifndef opcode3B_B + fill_to(address) +#define opcode3B_B eval($) + ;dec sp + dec iy + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $3C + #ifndef opcode3C + fill_to(address) +#define opcode3C eval($) + ;inc a + inc a + NEXT + #else + #ifndef opcode3C_B + fill_to(address) +#define opcode3C_B eval($) + ;inc a + inc a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $3D + #ifndef opcode3D + fill_to(address) +#define opcode3D eval($) + ;dec a + dec a + NEXT + #else + #ifndef opcode3D_B + fill_to(address) +#define opcode3D_B eval($) + ;dec a + dec a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $3E + #ifndef opcode3E + fill_to(address) +#define opcode3E eval($) + ;ld a,N + pop hl + ld a,l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcode3E_B + fill_to(address) +#define opcode3E_B eval($) + ;ld a,N + ld a,b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $3F + #ifndef opcode3F + fill_to(address) +#define opcode3F eval($) + ;ccf + ccf + NEXT + #else + #ifndef opcode3F_B + fill_to(address) +#define opcode3F_B eval($) + ;ccf + ccf + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $40 + #ifndef opcode40 + fill_to(address) +#define opcode40 eval($) + ;ld b,b + NEXT + #else + #ifndef opcode40_B + fill_to(address) +#define opcode40_B eval($) + ;ld b,b + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $41 + #ifndef opcode41 + fill_to(address) +#define opcode41 eval($) + ;ld b,c + exx + ld b,c + exx + NEXT + #else + #ifndef opcode41_B + fill_to(address) +#define opcode41_B eval($) + ;ld b,c + exx + ld b,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $42 + #ifndef opcode42 + fill_to(address) +#define opcode42 eval($) + ;ld b,d + exx + ld b,d + exx + NEXT + #else + #ifndef opcode42_B + fill_to(address) +#define opcode42_B eval($) + ;ld b,d + exx + ld b,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $43 + #ifndef opcode43 + fill_to(address) +#define opcode43 eval($) + ;ld b,e + exx + ld b,e + exx + NEXT + #else + #ifndef opcode43_B + fill_to(address) +#define opcode43_B eval($) + ;ld b,e + exx + ld b,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $44 + #ifndef opcode44 + fill_to(address) +#define opcode44 eval($) + ;ld b,h + exx + ld b,h + exx + NEXT + #else + #ifndef opcode44_B + fill_to(address) +#define opcode44_B eval($) + ;ld b,h + exx + ld b,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $45 + #ifndef opcode45 + fill_to(address) +#define opcode45 eval($) + ;ld b,l + exx + ld b,l + exx + NEXT + #else + #ifndef opcode45_B + fill_to(address) +#define opcode45_B eval($) + ;ld b,l + exx + ld b,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $46 + #ifndef opcode46 + fill_to(address) +#define opcode46 eval($) + ;ld b,(hl) + exx + ld b,(hl) + exx + NEXT + #else + #ifndef opcode46_B + fill_to(address) +#define opcode46_B eval($) + ;ld b,(hl) + exx + ld b,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $47 + #ifndef opcode47 + fill_to(address) +#define opcode47 eval($) + ;ld b,a + exx + ld b,a + exx + NEXT + #else + #ifndef opcode47_B + fill_to(address) +#define opcode47_B eval($) + ;ld b,a + exx + ld b,a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $48 + #ifndef opcode48 + fill_to(address) +#define opcode48 eval($) + ;ld c,b + exx + ld c,b + exx + NEXT + #else + #ifndef opcode48_B + fill_to(address) +#define opcode48_B eval($) + ;ld c,b + exx + ld c,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $49 + #ifndef opcode49 + fill_to(address) +#define opcode49 eval($) + ;ld c,c + NEXT + #else + #ifndef opcode49_B + fill_to(address) +#define opcode49_B eval($) + ;ld c,c + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $4A + #ifndef opcode4A + fill_to(address) +#define opcode4A eval($) + ;ld c,d + exx + ld c,d + exx + NEXT + #else + #ifndef opcode4A_B + fill_to(address) +#define opcode4A_B eval($) + ;ld c,d + exx + ld c,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $4B + #ifndef opcode4B + fill_to(address) +#define opcode4B eval($) + ;ld c,e + exx + ld c,e + exx + NEXT + #else + #ifndef opcode4B_B + fill_to(address) +#define opcode4B_B eval($) + ;ld c,e + exx + ld c,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $4C + #ifndef opcode4C + fill_to(address) +#define opcode4C eval($) + ;ld c,h + exx + ld c,h + exx + NEXT + #else + #ifndef opcode4C_B + fill_to(address) +#define opcode4C_B eval($) + ;ld c,h + exx + ld c,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $4D + #ifndef opcode4D + fill_to(address) +#define opcode4D eval($) + ;ld c,l + exx + ld c,l + exx + NEXT + #else + #ifndef opcode4D_B + fill_to(address) +#define opcode4D_B eval($) + ;ld c,l + exx + ld c,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $4E + #ifndef opcode4E + fill_to(address) +#define opcode4E eval($) + ;ld c,(hl) + exx + ld c,(hl) + exx + NEXT + #else + #ifndef opcode4E_B + fill_to(address) +#define opcode4E_B eval($) + ;ld c,(hl) + exx + ld c,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $4F + #ifndef opcode4F + fill_to(address) +#define opcode4F eval($) + ;ld c,a + exx + ld c,a + exx + NEXT + #else + #ifndef opcode4F_B + fill_to(address) +#define opcode4F_B eval($) + ;ld c,a + exx + ld c,a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $50 + #ifndef opcode50 + fill_to(address) +#define opcode50 eval($) + ;ld d,b + exx + ld d,b + exx + NEXT + #else + #ifndef opcode50_B + fill_to(address) +#define opcode50_B eval($) + ;ld d,b + exx + ld d,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $51 + #ifndef opcode51 + fill_to(address) +#define opcode51 eval($) + ;ld d,c + exx + ld d,c + exx + NEXT + #else + #ifndef opcode51_B + fill_to(address) +#define opcode51_B eval($) + ;ld d,c + exx + ld d,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $52 + #ifndef opcode52 + fill_to(address) +#define opcode52 eval($) + ;ld d,d + NEXT + #else + #ifndef opcode52_B + fill_to(address) +#define opcode52_B eval($) + ;ld d,d + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $53 + #ifndef opcode53 + fill_to(address) +#define opcode53 eval($) + ;ld d,e + exx + ld d,e + exx + NEXT + #else + #ifndef opcode53_B + fill_to(address) +#define opcode53_B eval($) + ;ld d,e + exx + ld d,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $54 + #ifndef opcode54 + fill_to(address) +#define opcode54 eval($) + ;ld d,h + exx + ld d,h + exx + NEXT + #else + #ifndef opcode54_B + fill_to(address) +#define opcode54_B eval($) + ;ld d,h + exx + ld d,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $55 + #ifndef opcode55 + fill_to(address) +#define opcode55 eval($) + ;ld d,l + exx + ld d,l + exx + NEXT + #else + #ifndef opcode55_B + fill_to(address) +#define opcode55_B eval($) + ;ld d,l + exx + ld d,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $56 + #ifndef opcode56 + fill_to(address) +#define opcode56 eval($) + ;ld d,(hl) + exx + ld d,(hl) + exx + NEXT + #else + #ifndef opcode56_B + fill_to(address) +#define opcode56_B eval($) + ;ld d,(hl) + exx + ld d,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $57 + #ifndef opcode57 + fill_to(address) +#define opcode57 eval($) + ;ld d,a + exx + ld d,a + exx + NEXT + #else + #ifndef opcode57_B + fill_to(address) +#define opcode57_B eval($) + ;ld d,a + exx + ld d,a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $58 + #ifndef opcode58 + fill_to(address) +#define opcode58 eval($) + ;ld e,b + exx + ld e,b + exx + NEXT + #else + #ifndef opcode58_B + fill_to(address) +#define opcode58_B eval($) + ;ld e,b + exx + ld e,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $59 + #ifndef opcode59 + fill_to(address) +#define opcode59 eval($) + ;ld e,c + exx + ld e,c + exx + NEXT + #else + #ifndef opcode59_B + fill_to(address) +#define opcode59_B eval($) + ;ld e,c + exx + ld e,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $5A + #ifndef opcode5A + fill_to(address) +#define opcode5A eval($) + ;ld e,d + exx + ld e,d + exx + NEXT + #else + #ifndef opcode5A_B + fill_to(address) +#define opcode5A_B eval($) + ;ld e,d + exx + ld e,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $5B + #ifndef opcode5B + fill_to(address) +#define opcode5B eval($) + ;ld e,e + NEXT + #else + #ifndef opcode5B_B + fill_to(address) +#define opcode5B_B eval($) + ;ld e,e + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $5C + #ifndef opcode5C + fill_to(address) +#define opcode5C eval($) + ;ld e,h + exx + ld e,h + exx + NEXT + #else + #ifndef opcode5C_B + fill_to(address) +#define opcode5C_B eval($) + ;ld e,h + exx + ld e,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $5D + #ifndef opcode5D + fill_to(address) +#define opcode5D eval($) + ;ld e,l + exx + ld e,l + exx + NEXT + #else + #ifndef opcode5D_B + fill_to(address) +#define opcode5D_B eval($) + ;ld e,l + exx + ld e,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $5E + #ifndef opcode5E + fill_to(address) +#define opcode5E eval($) + ;ld e,(hl) + exx + ld e,(hl) + exx + NEXT + #else + #ifndef opcode5E_B + fill_to(address) +#define opcode5E_B eval($) + ;ld e,(hl) + exx + ld e,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $5F + #ifndef opcode5F + fill_to(address) +#define opcode5F eval($) + ;ld e,a + exx + ld e,a + exx + NEXT + #else + #ifndef opcode5F_B + fill_to(address) +#define opcode5F_B eval($) + ;ld e,a + exx + ld e,a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $60 + #ifndef opcode60 + fill_to(address) +#define opcode60 eval($) + ;ld h,b + exx + ld h,b + exx + NEXT + #else + #ifndef opcode60_B + fill_to(address) +#define opcode60_B eval($) + ;ld h,b + exx + ld h,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $61 + #ifndef opcode61 + fill_to(address) +#define opcode61 eval($) + ;ld h,c + exx + ld h,c + exx + NEXT + #else + #ifndef opcode61_B + fill_to(address) +#define opcode61_B eval($) + ;ld h,c + exx + ld h,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $62 + #ifndef opcode62 + fill_to(address) +#define opcode62 eval($) + ;ld h,d + exx + ld h,d + exx + NEXT + #else + #ifndef opcode62_B + fill_to(address) +#define opcode62_B eval($) + ;ld h,d + exx + ld h,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $63 + #ifndef opcode63 + fill_to(address) +#define opcode63 eval($) + ;ld h,e + exx + ld h,e + exx + NEXT + #else + #ifndef opcode63_B + fill_to(address) +#define opcode63_B eval($) + ;ld h,e + exx + ld h,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $64 + #ifndef opcode64 + fill_to(address) +#define opcode64 eval($) + ;ld h,h + NEXT + #else + #ifndef opcode64_B + fill_to(address) +#define opcode64_B eval($) + ;ld h,h + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $65 + #ifndef opcode65 + fill_to(address) +#define opcode65 eval($) + ;ld h,l + exx + ld h,l + exx + NEXT + #else + #ifndef opcode65_B + fill_to(address) +#define opcode65_B eval($) + ;ld h,l + exx + ld h,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $66 + #ifndef opcode66 + fill_to(address) +#define opcode66 eval($) + ;ld h,(hl) + exx + ld h,(hl) + exx + NEXT + #else + #ifndef opcode66_B + fill_to(address) +#define opcode66_B eval($) + ;ld h,(hl) + exx + ld h,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $67 + #ifndef opcode67 + fill_to(address) +#define opcode67 eval($) + ;ld h,a + exx + ld h,a + exx + NEXT + #else + #ifndef opcode67_B + fill_to(address) +#define opcode67_B eval($) + ;ld h,a + exx + ld h,a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $68 + #ifndef opcode68 + fill_to(address) +#define opcode68 eval($) + ;ld l,b + exx + ld l,b + exx + NEXT + #else + #ifndef opcode68_B + fill_to(address) +#define opcode68_B eval($) + ;ld l,b + exx + ld l,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $69 + #ifndef opcode69 + fill_to(address) +#define opcode69 eval($) + ;ld l,c + exx + ld l,c + exx + NEXT + #else + #ifndef opcode69_B + fill_to(address) +#define opcode69_B eval($) + ;ld l,c + exx + ld l,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $6A + #ifndef opcode6A + fill_to(address) +#define opcode6A eval($) + ;ld l,d + exx + ld l,d + exx + NEXT + #else + #ifndef opcode6A_B + fill_to(address) +#define opcode6A_B eval($) + ;ld l,d + exx + ld l,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $6B + #ifndef opcode6B + fill_to(address) +#define opcode6B eval($) + ;ld l,e + exx + ld l,e + exx + NEXT + #else + #ifndef opcode6B_B + fill_to(address) +#define opcode6B_B eval($) + ;ld l,e + exx + ld l,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $6C + #ifndef opcode6C + fill_to(address) +#define opcode6C eval($) + ;ld l,h + exx + ld l,h + exx + NEXT + #else + #ifndef opcode6C_B + fill_to(address) +#define opcode6C_B eval($) + ;ld l,h + exx + ld l,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $6D + #ifndef opcode6D + fill_to(address) +#define opcode6D eval($) + ;ld l,l + NEXT + #else + #ifndef opcode6D_B + fill_to(address) +#define opcode6D_B eval($) + ;ld l,l + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $6E + #ifndef opcode6E + fill_to(address) +#define opcode6E eval($) + ;ld l,(hl) + exx + ld l,(hl) + exx + NEXT + #else + #ifndef opcode6E_B + fill_to(address) +#define opcode6E_B eval($) + ;ld l,(hl) + exx + ld l,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $6F + #ifndef opcode6F + fill_to(address) +#define opcode6F eval($) + ;ld l,a + exx + ld l,a + exx + NEXT + #else + #ifndef opcode6F_B + fill_to(address) +#define opcode6F_B eval($) + ;ld l,a + exx + ld l,a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $70 + #ifndef opcode70 + fill_to(address) +#define opcode70 eval($) + ;ld (hl),b + exx + ld (hl),b + exx + NEXT + #else + #ifndef opcode70_B + fill_to(address) +#define opcode70_B eval($) + ;ld (hl),b + exx + ld (hl),b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $71 + #ifndef opcode71 + fill_to(address) +#define opcode71 eval($) + ;ld (hl),c + exx + ld (hl),c + exx + NEXT + #else + #ifndef opcode71_B + fill_to(address) +#define opcode71_B eval($) + ;ld (hl),c + exx + ld (hl),c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $72 + #ifndef opcode72 + fill_to(address) +#define opcode72 eval($) + ;ld (hl),d + exx + ld (hl),d + exx + NEXT + #else + #ifndef opcode72_B + fill_to(address) +#define opcode72_B eval($) + ;ld (hl),d + exx + ld (hl),d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $73 + #ifndef opcode73 + fill_to(address) +#define opcode73 eval($) + ;ld (hl),e + exx + ld (hl),e + exx + NEXT + #else + #ifndef opcode73_B + fill_to(address) +#define opcode73_B eval($) + ;ld (hl),e + exx + ld (hl),e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $74 + #ifndef opcode74 + fill_to(address) +#define opcode74 eval($) + ;ld (hl),h + exx + ld (hl),h + exx + NEXT + #else + #ifndef opcode74_B + fill_to(address) +#define opcode74_B eval($) + ;ld (hl),h + exx + ld (hl),h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $75 + #ifndef opcode75 + fill_to(address) +#define opcode75 eval($) + ;ld (hl),l + exx + ld (hl),l + exx + NEXT + #else + #ifndef opcode75_B + fill_to(address) +#define opcode75_B eval($) + ;ld (hl),l + exx + ld (hl),l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $76 + #ifndef opcode76 + fill_to(address) +#define opcode76 eval($) + ;halt + ex af,af' + dec sp + jp hardware + #else + #ifndef opcode76_B + fill_to(address) +#define opcode76_B eval($) + ;halt + dec sp + jp opcode76 + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $77 + #ifndef opcode77 + fill_to(address) +#define opcode77 eval($) + ;ld (hl),a + exx + ld (hl),a + exx + NEXT + #else + #ifndef opcode77_B + fill_to(address) +#define opcode77_B eval($) + ;ld (hl),a + exx + ld (hl),a + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $78 + #ifndef opcode78 + fill_to(address) +#define opcode78 eval($) + ;ld a,b + exx + ld a,b + exx + NEXT + #else + #ifndef opcode78_B + fill_to(address) +#define opcode78_B eval($) + ;ld a,b + exx + ld a,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $79 + #ifndef opcode79 + fill_to(address) +#define opcode79 eval($) + ;ld a,c + exx + ld a,c + exx + NEXT + #else + #ifndef opcode79_B + fill_to(address) +#define opcode79_B eval($) + ;ld a,c + exx + ld a,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $7A + #ifndef opcode7A + fill_to(address) +#define opcode7A eval($) + ;ld a,d + exx + ld a,d + exx + NEXT + #else + #ifndef opcode7A_B + fill_to(address) +#define opcode7A_B eval($) + ;ld a,d + exx + ld a,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $7B + #ifndef opcode7B + fill_to(address) +#define opcode7B eval($) + ;ld a,e + exx + ld a,e + exx + NEXT + #else + #ifndef opcode7B_B + fill_to(address) +#define opcode7B_B eval($) + ;ld a,e + exx + ld a,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $7C + #ifndef opcode7C + fill_to(address) +#define opcode7C eval($) + ;ld a,h + exx + ld a,h + exx + NEXT + #else + #ifndef opcode7C_B + fill_to(address) +#define opcode7C_B eval($) + ;ld a,h + exx + ld a,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $7D + #ifndef opcode7D + fill_to(address) +#define opcode7D eval($) + ;ld a,l + exx + ld a,l + exx + NEXT + #else + #ifndef opcode7D_B + fill_to(address) +#define opcode7D_B eval($) + ;ld a,l + exx + ld a,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $7E + #ifndef opcode7E + fill_to(address) +#define opcode7E eval($) + ;ld a,(hl) + exx + ld a,(hl) + exx + NEXT + #else + #ifndef opcode7E_B + fill_to(address) +#define opcode7E_B eval($) + ;ld a,(hl) + exx + ld a,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $7F + #ifndef opcode7F + fill_to(address) +#define opcode7F eval($) + ;ld a,a + NEXT + #else + #ifndef opcode7F_B + fill_to(address) +#define opcode7F_B eval($) + ;ld a,a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $80 + #ifndef opcode80 + fill_to(address) +#define opcode80 eval($) + ;add a,b + exx + add a,b + exx + NEXT + #else + #ifndef opcode80_B + fill_to(address) +#define opcode80_B eval($) + ;add a,b + exx + add a,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $81 + #ifndef opcode81 + fill_to(address) +#define opcode81 eval($) + ;add a,c + exx + add a,c + exx + NEXT + #else + #ifndef opcode81_B + fill_to(address) +#define opcode81_B eval($) + ;add a,c + exx + add a,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $82 + #ifndef opcode82 + fill_to(address) +#define opcode82 eval($) + ;add a,d + exx + add a,d + exx + NEXT + #else + #ifndef opcode82_B + fill_to(address) +#define opcode82_B eval($) + ;add a,d + exx + add a,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $83 + #ifndef opcode83 + fill_to(address) +#define opcode83 eval($) + ;add a,e + exx + add a,e + exx + NEXT + #else + #ifndef opcode83_B + fill_to(address) +#define opcode83_B eval($) + ;add a,e + exx + add a,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $84 + #ifndef opcode84 + fill_to(address) +#define opcode84 eval($) + ;add a,h + exx + add a,h + exx + NEXT + #else + #ifndef opcode84_B + fill_to(address) +#define opcode84_B eval($) + ;add a,h + exx + add a,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $85 + #ifndef opcode85 + fill_to(address) +#define opcode85 eval($) + ;add a,l + exx + add a,l + exx + NEXT + #else + #ifndef opcode85_B + fill_to(address) +#define opcode85_B eval($) + ;add a,l + exx + add a,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $86 + #ifndef opcode86 + fill_to(address) +#define opcode86 eval($) + ;add a,(hl) + exx + add a,(hl) + exx + NEXT + #else + #ifndef opcode86_B + fill_to(address) +#define opcode86_B eval($) + ;add a,(hl) + exx + add a,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $87 + #ifndef opcode87 + fill_to(address) +#define opcode87 eval($) + ;add a,a + add a,a + NEXT + #else + #ifndef opcode87_B + fill_to(address) +#define opcode87_B eval($) + ;add a,a + add a,a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $88 + #ifndef opcode88 + fill_to(address) +#define opcode88 eval($) + ;adc a,b + exx + adc a,b + exx + NEXT + #else + #ifndef opcode88_B + fill_to(address) +#define opcode88_B eval($) + ;adc a,b + exx + adc a,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $89 + #ifndef opcode89 + fill_to(address) +#define opcode89 eval($) + ;adc a,c + exx + adc a,c + exx + NEXT + #else + #ifndef opcode89_B + fill_to(address) +#define opcode89_B eval($) + ;adc a,c + exx + adc a,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $8A + #ifndef opcode8A + fill_to(address) +#define opcode8A eval($) + ;adc a,d + exx + adc a,d + exx + NEXT + #else + #ifndef opcode8A_B + fill_to(address) +#define opcode8A_B eval($) + ;adc a,d + exx + adc a,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $8B + #ifndef opcode8B + fill_to(address) +#define opcode8B eval($) + ;adc a,e + exx + adc a,e + exx + NEXT + #else + #ifndef opcode8B_B + fill_to(address) +#define opcode8B_B eval($) + ;adc a,e + exx + adc a,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $8C + #ifndef opcode8C + fill_to(address) +#define opcode8C eval($) + ;adc a,h + exx + adc a,h + exx + NEXT + #else + #ifndef opcode8C_B + fill_to(address) +#define opcode8C_B eval($) + ;adc a,h + exx + adc a,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $8D + #ifndef opcode8D + fill_to(address) +#define opcode8D eval($) + ;adc a,l + exx + adc a,l + exx + NEXT + #else + #ifndef opcode8D_B + fill_to(address) +#define opcode8D_B eval($) + ;adc a,l + exx + adc a,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $8E + #ifndef opcode8E + fill_to(address) +#define opcode8E eval($) + ;adc a,(hl) + exx + adc a,(hl) + exx + NEXT + #else + #ifndef opcode8E_B + fill_to(address) +#define opcode8E_B eval($) + ;adc a,(hl) + exx + adc a,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $8F + #ifndef opcode8F + fill_to(address) +#define opcode8F eval($) + ;adc a,a + adc a,a + NEXT + #else + #ifndef opcode8F_B + fill_to(address) +#define opcode8F_B eval($) + ;adc a,a + adc a,a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $90 + #ifndef opcode90 + fill_to(address) +#define opcode90 eval($) + ;sub b + exx + sub b + exx + NEXT + #else + #ifndef opcode90_B + fill_to(address) +#define opcode90_B eval($) + ;sub b + exx + sub b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $91 + #ifndef opcode91 + fill_to(address) +#define opcode91 eval($) + ;sub c + exx + sub c + exx + NEXT + #else + #ifndef opcode91_B + fill_to(address) +#define opcode91_B eval($) + ;sub c + exx + sub c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $92 + #ifndef opcode92 + fill_to(address) +#define opcode92 eval($) + ;sub d + exx + sub d + exx + NEXT + #else + #ifndef opcode92_B + fill_to(address) +#define opcode92_B eval($) + ;sub d + exx + sub d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $93 + #ifndef opcode93 + fill_to(address) +#define opcode93 eval($) + ;sub e + exx + sub e + exx + NEXT + #else + #ifndef opcode93_B + fill_to(address) +#define opcode93_B eval($) + ;sub e + exx + sub e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $94 + #ifndef opcode94 + fill_to(address) +#define opcode94 eval($) + ;sub h + exx + sub h + exx + NEXT + #else + #ifndef opcode94_B + fill_to(address) +#define opcode94_B eval($) + ;sub h + exx + sub h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $95 + #ifndef opcode95 + fill_to(address) +#define opcode95 eval($) + ;sub l + exx + sub l + exx + NEXT + #else + #ifndef opcode95_B + fill_to(address) +#define opcode95_B eval($) + ;sub l + exx + sub l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $96 + #ifndef opcode96 + fill_to(address) +#define opcode96 eval($) + ;sub (hl) + exx + sub (hl) + exx + NEXT + #else + #ifndef opcode96_B + fill_to(address) +#define opcode96_B eval($) + ;sub (hl) + exx + sub (hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $97 + #ifndef opcode97 + fill_to(address) +#define opcode97 eval($) + ;sub a + sub a + NEXT + #else + #ifndef opcode97_B + fill_to(address) +#define opcode97_B eval($) + ;sub a + sub a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $98 + #ifndef opcode98 + fill_to(address) +#define opcode98 eval($) + ;sbc a,b + exx + sbc a,b + exx + NEXT + #else + #ifndef opcode98_B + fill_to(address) +#define opcode98_B eval($) + ;sbc a,b + exx + sbc a,b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $99 + #ifndef opcode99 + fill_to(address) +#define opcode99 eval($) + ;sbc a,c + exx + sbc a,c + exx + NEXT + #else + #ifndef opcode99_B + fill_to(address) +#define opcode99_B eval($) + ;sbc a,c + exx + sbc a,c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $9A + #ifndef opcode9A + fill_to(address) +#define opcode9A eval($) + ;sbc a,d + exx + sbc a,d + exx + NEXT + #else + #ifndef opcode9A_B + fill_to(address) +#define opcode9A_B eval($) + ;sbc a,d + exx + sbc a,d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $9B + #ifndef opcode9B + fill_to(address) +#define opcode9B eval($) + ;sbc a,e + exx + sbc a,e + exx + NEXT + #else + #ifndef opcode9B_B + fill_to(address) +#define opcode9B_B eval($) + ;sbc a,e + exx + sbc a,e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $9C + #ifndef opcode9C + fill_to(address) +#define opcode9C eval($) + ;sbc a,h + exx + sbc a,h + exx + NEXT + #else + #ifndef opcode9C_B + fill_to(address) +#define opcode9C_B eval($) + ;sbc a,h + exx + sbc a,h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $9D + #ifndef opcode9D + fill_to(address) +#define opcode9D eval($) + ;sbc a,l + exx + sbc a,l + exx + NEXT + #else + #ifndef opcode9D_B + fill_to(address) +#define opcode9D_B eval($) + ;sbc a,l + exx + sbc a,l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $9E + #ifndef opcode9E + fill_to(address) +#define opcode9E eval($) + ;sbc a,(hl) + exx + sbc a,(hl) + exx + NEXT + #else + #ifndef opcode9E_B + fill_to(address) +#define opcode9E_B eval($) + ;sbc a,(hl) + exx + sbc a,(hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $9F + #ifndef opcode9F + fill_to(address) +#define opcode9F eval($) + ;sbc a,a + sbc a,a + NEXT + #else + #ifndef opcode9F_B + fill_to(address) +#define opcode9F_B eval($) + ;sbc a,a + sbc a,a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A0 + #ifndef opcodeA0 + fill_to(address) +#define opcodeA0 eval($) + ;and b + exx + and b + exx + NEXT + #else + #ifndef opcodeA0_B + fill_to(address) +#define opcodeA0_B eval($) + ;and b + exx + and b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A1 + #ifndef opcodeA1 + fill_to(address) +#define opcodeA1 eval($) + ;and c + exx + and c + exx + NEXT + #else + #ifndef opcodeA1_B + fill_to(address) +#define opcodeA1_B eval($) + ;and c + exx + and c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A2 + #ifndef opcodeA2 + fill_to(address) +#define opcodeA2 eval($) + ;and d + exx + and d + exx + NEXT + #else + #ifndef opcodeA2_B + fill_to(address) +#define opcodeA2_B eval($) + ;and d + exx + and d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A3 + #ifndef opcodeA3 + fill_to(address) +#define opcodeA3 eval($) + ;and e + exx + and e + exx + NEXT + #else + #ifndef opcodeA3_B + fill_to(address) +#define opcodeA3_B eval($) + ;and e + exx + and e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A4 + #ifndef opcodeA4 + fill_to(address) +#define opcodeA4 eval($) + ;and h + exx + and h + exx + NEXT + #else + #ifndef opcodeA4_B + fill_to(address) +#define opcodeA4_B eval($) + ;and h + exx + and h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A5 + #ifndef opcodeA5 + fill_to(address) +#define opcodeA5 eval($) + ;and l + exx + and l + exx + NEXT + #else + #ifndef opcodeA5_B + fill_to(address) +#define opcodeA5_B eval($) + ;and l + exx + and l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A6 + #ifndef opcodeA6 + fill_to(address) +#define opcodeA6 eval($) + ;and (hl) + exx + and (hl) + exx + NEXT + #else + #ifndef opcodeA6_B + fill_to(address) +#define opcodeA6_B eval($) + ;and (hl) + exx + and (hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A7 + #ifndef opcodeA7 + fill_to(address) +#define opcodeA7 eval($) + ;and a + and a + NEXT + #else + #ifndef opcodeA7_B + fill_to(address) +#define opcodeA7_B eval($) + ;and a + and a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A8 + #ifndef opcodeA8 + fill_to(address) +#define opcodeA8 eval($) + ;xor b + exx + xor b + exx + NEXT + #else + #ifndef opcodeA8_B + fill_to(address) +#define opcodeA8_B eval($) + ;xor b + exx + xor b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $A9 + #ifndef opcodeA9 + fill_to(address) +#define opcodeA9 eval($) + ;xor c + exx + xor c + exx + NEXT + #else + #ifndef opcodeA9_B + fill_to(address) +#define opcodeA9_B eval($) + ;xor c + exx + xor c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $AA + #ifndef opcodeAA + fill_to(address) +#define opcodeAA eval($) + ;xor d + exx + xor d + exx + NEXT + #else + #ifndef opcodeAA_B + fill_to(address) +#define opcodeAA_B eval($) + ;xor d + exx + xor d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $AB + #ifndef opcodeAB + fill_to(address) +#define opcodeAB eval($) + ;xor e + exx + xor e + exx + NEXT + #else + #ifndef opcodeAB_B + fill_to(address) +#define opcodeAB_B eval($) + ;xor e + exx + xor e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $AC + #ifndef opcodeAC + fill_to(address) +#define opcodeAC eval($) + ;xor h + exx + xor h + exx + NEXT + #else + #ifndef opcodeAC_B + fill_to(address) +#define opcodeAC_B eval($) + ;xor h + exx + xor h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $AD + #ifndef opcodeAD + fill_to(address) +#define opcodeAD eval($) + ;xor l + exx + xor l + exx + NEXT + #else + #ifndef opcodeAD_B + fill_to(address) +#define opcodeAD_B eval($) + ;xor l + exx + xor l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $AE + #ifndef opcodeAE + fill_to(address) +#define opcodeAE eval($) + ;xor (hl) + exx + xor (hl) + exx + NEXT + #else + #ifndef opcodeAE_B + fill_to(address) +#define opcodeAE_B eval($) + ;xor (hl) + exx + xor (hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $AF + #ifndef opcodeAF + fill_to(address) +#define opcodeAF eval($) + ;xor a + xor a + NEXT + #else + #ifndef opcodeAF_B + fill_to(address) +#define opcodeAF_B eval($) + ;xor a + xor a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B0 + #ifndef opcodeB0 + fill_to(address) +#define opcodeB0 eval($) + ;or b + exx + or b + exx + NEXT + #else + #ifndef opcodeB0_B + fill_to(address) +#define opcodeB0_B eval($) + ;or b + exx + or b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B1 + #ifndef opcodeB1 + fill_to(address) +#define opcodeB1 eval($) + ;or c + exx + or c + exx + NEXT + #else + #ifndef opcodeB1_B + fill_to(address) +#define opcodeB1_B eval($) + ;or c + exx + or c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B2 + #ifndef opcodeB2 + fill_to(address) +#define opcodeB2 eval($) + ;or d + exx + or d + exx + NEXT + #else + #ifndef opcodeB2_B + fill_to(address) +#define opcodeB2_B eval($) + ;or d + exx + or d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B3 + #ifndef opcodeB3 + fill_to(address) +#define opcodeB3 eval($) + ;or e + exx + or e + exx + NEXT + #else + #ifndef opcodeB3_B + fill_to(address) +#define opcodeB3_B eval($) + ;or e + exx + or e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B4 + #ifndef opcodeB4 + fill_to(address) +#define opcodeB4 eval($) + ;or h + exx + or h + exx + NEXT + #else + #ifndef opcodeB4_B + fill_to(address) +#define opcodeB4_B eval($) + ;or h + exx + or h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B5 + #ifndef opcodeB5 + fill_to(address) +#define opcodeB5 eval($) + ;or l + exx + or l + exx + NEXT + #else + #ifndef opcodeB5_B + fill_to(address) +#define opcodeB5_B eval($) + ;or l + exx + or l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B6 + #ifndef opcodeB6 + fill_to(address) +#define opcodeB6 eval($) + ;or (hl) + exx + or (hl) + exx + NEXT + #else + #ifndef opcodeB6_B + fill_to(address) +#define opcodeB6_B eval($) + ;or (hl) + exx + or (hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B7 + #ifndef opcodeB7 + fill_to(address) +#define opcodeB7 eval($) + ;or a + or a + NEXT + #else + #ifndef opcodeB7_B + fill_to(address) +#define opcodeB7_B eval($) + ;or a + or a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B8 + #ifndef opcodeB8 + fill_to(address) +#define opcodeB8 eval($) + ;cp b + exx + cp b + exx + NEXT + #else + #ifndef opcodeB8_B + fill_to(address) +#define opcodeB8_B eval($) + ;cp b + exx + cp b + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $B9 + #ifndef opcodeB9 + fill_to(address) +#define opcodeB9 eval($) + ;cp c + exx + cp c + exx + NEXT + #else + #ifndef opcodeB9_B + fill_to(address) +#define opcodeB9_B eval($) + ;cp c + exx + cp c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $BA + #ifndef opcodeBA + fill_to(address) +#define opcodeBA eval($) + ;cp d + exx + cp d + exx + NEXT + #else + #ifndef opcodeBA_B + fill_to(address) +#define opcodeBA_B eval($) + ;cp d + exx + cp d + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $BB + #ifndef opcodeBB + fill_to(address) +#define opcodeBB eval($) + ;cp e + exx + cp e + exx + NEXT + #else + #ifndef opcodeBB_B + fill_to(address) +#define opcodeBB_B eval($) + ;cp e + exx + cp e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $BC + #ifndef opcodeBC + fill_to(address) +#define opcodeBC eval($) + ;cp h + exx + cp h + exx + NEXT + #else + #ifndef opcodeBC_B + fill_to(address) +#define opcodeBC_B eval($) + ;cp h + exx + cp h + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $BD + #ifndef opcodeBD + fill_to(address) +#define opcodeBD eval($) + ;cp l + exx + cp l + exx + NEXT + #else + #ifndef opcodeBD_B + fill_to(address) +#define opcodeBD_B eval($) + ;cp l + exx + cp l + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $BE + #ifndef opcodeBE + fill_to(address) +#define opcodeBE eval($) + ;cp (hl) + exx + cp (hl) + exx + NEXT + #else + #ifndef opcodeBE_B + fill_to(address) +#define opcodeBE_B eval($) + ;cp (hl) + exx + cp (hl) + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $BF + #ifndef opcodeBF + fill_to(address) +#define opcodeBF eval($) + ;cp a + cp a + NEXT + #else + #ifndef opcodeBF_B + fill_to(address) +#define opcodeBF_B eval($) + ;cp a + cp a + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C0 + #ifndef opcodeC0 + fill_to(address) +#define opcodeC0 eval($) + ;ret nz + jp nz,opcodeC9 + NEXT_INT + #else + #ifndef opcodeC0_B + fill_to(address) +#define opcodeC0_B eval($) + ;ret nz + jp nz,opcodeC9_B + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C1 + #ifndef opcodeC1 + fill_to(address) +#define opcodeC1 eval($) + ;pop bc + exx + ld c,(iy) + inc iy + ld b,(iy) + inc iy + exx + NEXT + #else + #ifndef opcodeC1_B + fill_to(address) +#define opcodeC1_B eval($) + ;pop bc + exx + ld c,(iy) + inc iy + ld b,(iy) + inc iy + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C2 + #ifndef opcodeC2 + fill_to(address) +#define opcodeC2 eval($) + ;jp nz,NN + jp nz,opcodeC3 + pop hl + NEXT_INT + #else + #ifndef opcodeC2_B + fill_to(address) +#define opcodeC2_B eval($) + ;jp nz,NN + jp nz,opcodeC3_B + inc sp + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C3 + #ifndef opcodeC3 + fill_to(address) +#define opcodeC3 eval($) + ;jp NN + pop hl + ld sp,hl + NEXT_INT + #else + #ifndef opcodeC3_B + fill_to(address) +#define opcodeC3_B eval($) + ;jp NN + dec sp + pop hl + ld sp,hl + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C4 + #ifndef opcodeC4 + fill_to(address) +#define opcodeC4 eval($) + ;call nz,NN + jp nz,opcodeCD + pop hl + NEXT_INT + #else + #ifndef opcodeC4_B + fill_to(address) +#define opcodeC4_B eval($) + ;call nz,NN + jp nz,opcodeCD_B + inc sp + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C5 + #ifndef opcodeC5 + fill_to(address) +#define opcodeC5 eval($) + ;push bc + exx + dec iy + ld (iy),b + dec iy + ld (iy),c + exx + NEXT + #else + #ifndef opcodeC5_B + fill_to(address) +#define opcodeC5_B eval($) + ;push bc + exx + dec iy + ld (iy),b + dec iy + ld (iy),c + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C6 + #ifndef opcodeC6 + fill_to(address) +#define opcodeC6 eval($) + ;add a,N + pop hl + add a,l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeC6_B + fill_to(address) +#define opcodeC6_B eval($) + ;add a,N + add a,b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C7 + #ifndef opcodeC7 + fill_to(address) +#define opcodeC7 eval($) + ;rst 00h + ld hl,$00 + jp do_call + #else + #ifndef opcodeC7_B + fill_to(address) +#define opcodeC7_B eval($) + ;rst 00h + dec sp + ld hl,$00 + jp do_call + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C8 + #ifndef opcodeC8 + fill_to(address) +#define opcodeC8 eval($) + ;ret z + jp z,opcodeC9 + NEXT_INT + #else + #ifndef opcodeC8_B + fill_to(address) +#define opcodeC8_B eval($) + ;ret z + jp z,opcodeC9_B + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $C9 + #ifndef opcodeC9 + fill_to(address) +#define opcodeC9 eval($) + ;ret + ld sp,iy + inc iy + inc iy + pop hl + ld sp,hl + NEXT_INT + #else + #ifndef opcodeC9_B + fill_to(address) +#define opcodeC9_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $CA + #ifndef opcodeCA + fill_to(address) +#define opcodeCA eval($) + ;jp z,NN + jp z,opcodeC3 + pop hl + NEXT_INT + #else + #ifndef opcodeCA_B + fill_to(address) +#define opcodeCA_B eval($) + ;jp z,NN + jp z,opcodeC3_B + inc sp + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $CB + #ifndef opcodeCB + fill_to(address) +#define opcodeCB eval($) + ;empty + #else + #ifndef opcodeCB_B + fill_to(address) +#define opcodeCB_B eval($) + ;CB-opcodes + ex af,af' + ld a,b + ld hl,bitcodes_B + jp (hl) + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $CC + #ifndef opcodeCC + fill_to(address) +#define opcodeCC eval($) + ;call z,NN + jp z,opcodeCD + pop hl + NEXT_INT + #else + #ifndef opcodeCC_B + fill_to(address) +#define opcodeCC_B eval($) + ;call z,NN + jp z,opcodeCD_B + inc sp + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $CD + #ifndef opcodeCD + fill_to(address) +#define opcodeCD eval($) + ;call NN + pop hl +do_call: + dec iy + dec iy + ld (_+2),iy +_ + ld (0),sp + ld sp,hl + NEXT_INT + #else + #ifndef opcodeCD_B + fill_to(address) +#define opcodeCD_B eval($) + ;call NN + dec sp + pop hl + dec iy + dec iy + ld (_+2),iy +_ + ld (0),sp + ld sp,hl + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $CE + #ifndef opcodeCE + fill_to(address) +#define opcodeCE eval($) + ;adc a,N + pop hl + adc a,l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeCE_B + fill_to(address) +#define opcodeCE_B eval($) + ;adc a,N + adc a,b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $CF + #ifndef opcodeCF + fill_to(address) +#define opcodeCF eval($) + ;rst 08h + ld hl,$08 + jp do_call + #else + #ifndef opcodeCF_B + fill_to(address) +#define opcodeCF_B eval($) + ;rst 08h + dec sp + ld hl,$08 + jp do_call + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D0 + #ifndef opcodeD0 + fill_to(address) +#define opcodeD0 eval($) + ;ret nc + jp nc,opcodeC9 + NEXT_INT + #else + #ifndef opcodeD0_B + fill_to(address) +#define opcodeD0_B eval($) + ;ret nc + jp nc,opcodeC9_B + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D1 + #ifndef opcodeD1 + fill_to(address) +#define opcodeD1 eval($) + ;pop de + exx + ld e,(iy) + inc iy + ld d,(iy) + inc iy + exx + NEXT + #else + #ifndef opcodeD1_B + fill_to(address) +#define opcodeD1_B eval($) + ;pop de + exx + ld e,(iy) + inc iy + ld d,(iy) + inc iy + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D2 + #ifndef opcodeD2 + fill_to(address) +#define opcodeD2 eval($) + ;jp nc,NN + jp nc,opcodeC3 + pop hl + NEXT_INT + #else + #ifndef opcodeD2_B + fill_to(address) +#define opcodeD2_B eval($) + ;jp nc,NN + jp nc,opcodeC3_B + inc sp + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D3 + #ifndef opcodeD3 + fill_to(address) +#define opcodeD3 eval($) + ;empty + #else + #ifndef opcodeD3_B + fill_to(address) +#define opcodeD3_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D4 + #ifndef opcodeD4 + fill_to(address) +#define opcodeD4 eval($) + ;call nc,NN + jp nc,opcodeCD + pop hl + NEXT_INT + #else + #ifndef opcodeD4_B + fill_to(address) +#define opcodeD4_B eval($) + ;call nc,NN + jp nc,opcodeCD_B + inc sp + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D5 + #ifndef opcodeD5 + fill_to(address) +#define opcodeD5 eval($) + ;push de + exx + dec iy + ld (iy),d + dec iy + ld (iy),e + exx + NEXT + #else + #ifndef opcodeD5_B + fill_to(address) +#define opcodeD5_B eval($) + ;push de + exx + dec iy + ld (iy),d + dec iy + ld (iy),e + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D6 + #ifndef opcodeD6 + fill_to(address) +#define opcodeD6 eval($) + ;sub N + pop hl + sub l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeD6_B + fill_to(address) +#define opcodeD6_B eval($) + ;sub N + sub b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D7 + #ifndef opcodeD7 + fill_to(address) +#define opcodeD7 eval($) + ;rst 10h + ld hl,$10 + jp do_call + #else + #ifndef opcodeD7_B + fill_to(address) +#define opcodeD7_B eval($) + ;rst 10h + dec sp + ld hl,$10 + jp do_call + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D8 + #ifndef opcodeD8 + fill_to(address) +#define opcodeD8 eval($) + ;ret c + jp c,opcodeC9 + NEXT_INT + #else + #ifndef opcodeD8_B + fill_to(address) +#define opcodeD8_B eval($) + ;ret c + jp c,opcodeC9_B + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $D9 + #ifndef opcodeD9 + fill_to(address) +#define opcodeD9 eval($) + ;reti + ld sp,iy + inc iy + inc iy + pop hl + ld sp,hl + jp opcodeFB + #else + #ifndef opcodeD9_B + fill_to(address) +#define opcodeD9_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $DA + #ifndef opcodeDA + fill_to(address) +#define opcodeDA eval($) + ;jp c,NN + jp c,opcodeC3 + pop hl + NEXT_INT + #else + #ifndef opcodeDA_B + fill_to(address) +#define opcodeDA_B eval($) + ;jp c,NN + jp c,opcodeC3_B + inc sp + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $DB + #ifndef opcodeDB + fill_to(address) +#define opcodeDB eval($) + ;empty + #else + #ifndef opcodeDB_B + fill_to(address) +#define opcodeDB_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $DC + #ifndef opcodeDC + fill_to(address) +#define opcodeDC eval($) + ;call c,NN + jp c,opcodeCD + pop hl + NEXT_INT + #else + #ifndef opcodeDC_B + fill_to(address) +#define opcodeDC_B eval($) + ;call c,NN + jp c,opcodeCD_B + inc sp + NEXT_INT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $DD + #ifndef opcodeDD + fill_to(address) +#define opcodeDD eval($) + ;empty + #else + #ifndef opcodeDD_B + fill_to(address) +#define opcodeDD_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $DE + #ifndef opcodeDE + fill_to(address) +#define opcodeDE eval($) + ;sbc a,N + pop hl + sbc a,l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeDE_B + fill_to(address) +#define opcodeDE_B eval($) + ;sbc a,N + sbc a,b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $DF + #ifndef opcodeDF + fill_to(address) +#define opcodeDF eval($) + ;rst 18h + ld hl,$18 + jp do_call + #else + #ifndef opcodeDF_B + fill_to(address) +#define opcodeDF_B eval($) + ;rst 18h + dec sp + ld hl,$18 + jp do_call + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E0 + #ifndef opcodeE0 + fill_to(address) +#define opcodeE0 eval($) + ;ld ($FF00+N),a + ex af,af' + dec sp + pop af + ld l,a + ld h,$FF + inc a + jp p,io_write + ex af,af' + ld (hl),a + NEXT + #else + #ifndef opcodeE0_B + fill_to(address) +#define opcodeE0_B eval($) + ;ld ($FF00+N),a + ex af,af' + ld a,b + ld l,a + ld h,$FF + inc a + jp p,io_write + ex af,af' + ld (hl),a + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E1 + #ifndef opcodeE1 + fill_to(address) +#define opcodeE1 eval($) + ;pop hl + ld (_+1),iy + exx +_ + ld hl,(0) + exx + inc iy + inc iy + NEXT + #else + #ifndef opcodeE1_B + fill_to(address) +#define opcodeE1_B eval($) + ;pop hl + ld (_+1),iy + exx +_ + ld hl,(0) + exx + inc iy + inc iy + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E2 + #ifndef opcodeE2 + fill_to(address) +#define opcodeE2 eval($) + ;ld ($FF00+c),a + ex af,af' + exx + ld a,c + exx + ld l,a + ld h,$FF + inc a + jp p,io_write + ex af,af' + ld (hl),a + NEXT + #else + #ifndef opcodeE2_B + fill_to(address) +#define opcodeE2_B eval($) + ;ld ($FF00+c),a + dec sp + jp opcodeE2 + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E3 + #ifndef opcodeE3 + fill_to(address) +#define opcodeE3 eval($) + ;empty + #else + #ifndef opcodeE3_B + fill_to(address) +#define opcodeE3_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E4 + #ifndef opcodeE4 + fill_to(address) +#define opcodeE4 eval($) + ;empty + #else + #ifndef opcodeE4_B + fill_to(address) +#define opcodeE4_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E5 + #ifndef opcodeE5 + fill_to(address) +#define opcodeE5 eval($) + ;push hl + dec iy + dec iy + ld (_+1),iy + exx +_ + ld (0),hl + exx + NEXT + #else + #ifndef opcodeE5_B + fill_to(address) +#define opcodeE5_B eval($) + ;push hl + dec iy + dec iy + ld (_+1),iy + exx +_ + ld (0),hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E6 + #ifndef opcodeE6 + fill_to(address) +#define opcodeE6 eval($) + ;and N + pop hl + and l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeE6_B + fill_to(address) +#define opcodeE6_B eval($) + ;and N + and b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E7 + #ifndef opcodeE7 + fill_to(address) +#define opcodeE7 eval($) + ;rst 20h + ld hl,$20 + jp do_call + #else + #ifndef opcodeE7_B + fill_to(address) +#define opcodeE7_B eval($) + ;rst 20h + dec sp + ld hl,$20 + jp do_call + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E8 + #ifndef opcodeE8 + fill_to(address) +#define opcodeE8 eval($) + ;add sp,N + ex af,af' + pop hl + ld b,h + ld a,l + rla + sbc a,a + ld h,a + ex de,hl + add iy,de + ex de,hl + ex af,af' + NEXT_B + #else + #ifndef opcodeE8_B + fill_to(address) +#define opcodeE8_B eval($) + ;add sp,N + ex af,af' + ld l,b + ld a,l + rla + sbc a,a + ld h,a + ex de,hl + add iy,de + ex de,hl + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $E9 + #ifndef opcodeE9 + fill_to(address) +#define opcodeE9 eval($) + ;jp (hl) + exx + ld sp,hl + exx + NEXT_INT + #else + #ifndef opcodeE9_B + fill_to(address) +#define opcodeE9_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $EA + #ifndef opcodeEA + fill_to(address) +#define opcodeEA eval($) + ;ld (NN),a + ex af,af' + pop hl + bit 7,h + jr z,_ + ex af,af' + ld (hl),a + NEXT +_ + ex af,af' + ld l,a + ex af,af' + jp memcontrol + #else + #ifndef opcodeEA_B + fill_to(address) +#define opcodeEA_B eval($) + ;ld (NN),a + ex af,af' + pop hl + ld a,l + ld l,b + ld b,h + ld h,a + rla + jr nc,_ + ex af,af' + ld (hl),a + NEXT_B +_ + dec sp + ex af,af' + ld l,a + ex af,af' + jp memcontrol + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $EB + #ifndef opcodeEB + fill_to(address) +#define opcodeEB eval($) + ;empty + #else + #ifndef opcodeEB_B + fill_to(address) +#define opcodeEB_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $EC + #ifndef opcodeEC + fill_to(address) +#define opcodeEC eval($) + ;empty + #else + #ifndef opcodeEC_B + fill_to(address) +#define opcodeEC_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $ED + #ifndef opcodeED + fill_to(address) +#define opcodeED eval($) + ;empty + #else + #ifndef opcodeED_B + fill_to(address) +#define opcodeED_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $EE + #ifndef opcodeEE + fill_to(address) +#define opcodeEE eval($) + ;xor N + pop hl + xor l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeEE_B + fill_to(address) +#define opcodeEE_B eval($) + ;xor N + xor b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $EF + #ifndef opcodeEF + fill_to(address) +#define opcodeEF eval($) + ;rst 28h + ld hl,$28 + jp do_call + #else + #ifndef opcodeEF_B + fill_to(address) +#define opcodeEF_B eval($) + ;rst 28h + dec sp + ld hl,$28 + jp do_call + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F0 + #ifndef opcodeF0 + fill_to(address) +#define opcodeF0 eval($) + ;ld a,($FF00+N) + pop hl + ld b,h + ld h,$FF + ld a,(hl) + NEXT_B + #else + #ifndef opcodeF0_B + fill_to(address) +#define opcodeF0_B eval($) + ;ld a,($FF00+N) + ld l,b + ld h,$FF + ld a,(hl) + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F1 + #ifndef opcodeF1 + fill_to(address) +#define opcodeF1 eval($) + ;pop af + ld hl,0 + add hl,sp + ld sp,iy + inc iy + inc iy + pop af + ld sp,hl + NEXT + #else + #ifndef opcodeF1_B + fill_to(address) +#define opcodeF1_B eval($) + ;pop af + ld hl,0 + add hl,sp + ld sp,iy + inc iy + inc iy + pop af + ld sp,hl + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F2 + #ifndef opcodeF2 + fill_to(address) +#define opcodeF2 eval($) + ;ld a,($FF00+C) + ex af,af' + exx + ld a,c + exx + ld l,a + ld h,$FF + ex af,af' + ld a,(hl) + NEXT + #else + #ifndef opcodeF2_B + fill_to(address) +#define opcodeF2_B eval($) + ;ld a,($FF00+C) + ex af,af' + exx + ld a,c + exx + ld l,a + ld h,$FF + ex af,af' + ld a,(hl) + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F3 + #ifndef opcodeF3 + fill_to(address) +#define opcodeF3 eval($) + ;empty + #else + #ifndef opcodeF3_B + fill_to(address) +#define opcodeF3_B eval($) + ;di + ex af,af' + xor a + ld (intstatus),a + ex af,af' + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F4 + #ifndef opcodeF4 + fill_to(address) +#define opcodeF4 eval($) + ;empty + #else + #ifndef opcodeF4_B + fill_to(address) +#define opcodeF4_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F5 + #ifndef opcodeF5 + fill_to(address) +#define opcodeF5 eval($) + ;push af + ld (_+1),sp + ld sp,iy + dec iy + dec iy + push af +_ + ld sp,0 + NEXT + #else + #ifndef opcodeF5_B + fill_to(address) +#define opcodeF5_B eval($) + ;push af + ld (_+1),sp + ld sp,iy + dec iy + dec iy + push af +_ + ld sp,0 + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F6 + #ifndef opcodeF6 + fill_to(address) +#define opcodeF6 eval($) + ;or N + pop hl + or l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeF6_B + fill_to(address) +#define opcodeF6_B eval($) + ;or N + or b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F7 + #ifndef opcodeF7 + fill_to(address) +#define opcodeF7 eval($) + ;rst 30h + ld hl,$30 + jp do_call + #else + #ifndef opcodeF7_B + fill_to(address) +#define opcodeF7_B eval($) + ;rst 30h + dec sp + ld hl,$30 + jp do_call + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F8 + #ifndef opcodeF8 + fill_to(address) +#define opcodeF8 eval($) + ;ld hl,sp+N + ex af,af' + ld hl,1 + add hl,sp + exx + pop hl + ld a,l + rla + sbc a,a + ld h,a + ld sp,iy + add hl,sp + exx + ld sp,hl + ex af,af' + NEXT + #else + #ifndef opcodeF8_B + fill_to(address) +#define opcodeF8_B eval($) + ;ld hl,sp+N + ex af,af' + ld hl,0 + add hl,sp + ld a,b + exx + ld l,a + rla + sbc a,a + ld h,a + ld sp,iy + add hl,sp + exx + ld sp,hl + ex af,af' + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $F9 + #ifndef opcodeF9 + fill_to(address) +#define opcodeF9 eval($) + ;ld sp,hl + exx + ex de,hl + ld iyh,d + ld iyl,e + ex de,hl + exx + NEXT + #else + #ifndef opcodeF9_B + fill_to(address) +#define opcodeF9_B eval($) + ;ld sp,hl + exx + ex de,hl + ld iyh,d + ld iyl,e + ex de,hl + exx + NEXT_B + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $FA + #ifndef opcodeFA + fill_to(address) +#define opcodeFA eval($) + ;ld a,(NN) + pop hl + ld a,(hl) + NEXT + #else + #ifndef opcodeFA_B + fill_to(address) +#define opcodeFA_B eval($) + ;ld a,(NN) + dec sp + pop hl + ld a,(hl) + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $FB + #ifndef opcodeFB + fill_to(address) +#define opcodeFB eval($) + ;ei + ex af,af' + ld a,1 + ld (intstatus),a +check_ints_2: + ld hl,0 + add hl,sp + ld sp,mystack + push hl + jp check_ints + #else + #ifndef opcodeFB_B + fill_to(address) +#define opcodeFB_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $FC + #ifndef opcodeFC + fill_to(address) +#define opcodeFC eval($) + ;empty + #else + #ifndef opcodeFC_B + fill_to(address) +#define opcodeFC_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $FD + #ifndef opcodeFD + fill_to(address) +#define opcodeFD eval($) + ;empty + #else + #ifndef opcodeFD_B + fill_to(address) +#define opcodeFD_B eval($) + ;empty + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $FE + #ifndef opcodeFE + fill_to(address) +#define opcodeFE eval($) + ;cp N + pop hl + cp l + ;NEXT_H + ld l,h ;4cc + ld h,e ;8cc + ld h,(hl) ;15cc + jp (hl) ;19cc + #else + #ifndef opcodeFE_B + fill_to(address) +#define opcodeFE_B eval($) + ;cp N + cp b + NEXT + #else + #define address eval(address+1) + #endif + #endif + #endif + + #if address&$FF == $FF + #ifndef opcodeFF + fill_to(address) +#define opcodeFF eval($) + ;rst 38h + ld hl,$38 + jp do_call + #else + #ifndef opcodeFF_B + fill_to(address) +#define opcodeFF_B eval($) + ;rst 38h + dec sp + ld hl,$38 + jp do_call + #else + #if address-$ < 256 + insert_op(address+1) + #endif + #endif + #endif + #endif +#endmacro + +#macro fill_to(address) + #if address == ($+1) + .db $FD + #else + #if address == ($+2) + .db $FD,$FD + #else + #if address > ($+2) + rst 18h + .db address-$-1 + #define bytes_skipped eval(bytes_skipped+address-$) + .org address + #else + #if address < $ + .echo "ERROR: NEGATIVE FILL AT ",$," TO ",address + #endif + #endif + #endif + #endif + ;.block address - $ +#endmacro + +#macro insert_opcodes(howmany) + #if howmany > 0 + insert_op($) + insert_opcodes(howmany-1) + #endif +#endmacro + +page3code: + .org $E000 +opcodetable: + .db opcode00 >> 8 + .db opcode01 >> 8 + .db opcode02 >> 8 + .db opcode03 >> 8 + .db opcode04 >> 8 + .db opcode05 >> 8 + .db opcode06 >> 8 + .db opcode07 >> 8 + .db opcode08 >> 8 + .db opcode09 >> 8 + .db opcode0A >> 8 + .db opcode0B >> 8 + .db opcode0C >> 8 + .db opcode0D >> 8 + .db opcode0E >> 8 + .db opcode0F >> 8 + .db opcode10 >> 8 + .db opcode11 >> 8 + .db opcode12 >> 8 + .db opcode13 >> 8 + .db opcode14 >> 8 + .db opcode15 >> 8 + .db opcode16 >> 8 + .db opcode17 >> 8 + .db opcode18 >> 8 + .db opcode19 >> 8 + .db opcode1A >> 8 + .db opcode1B >> 8 + .db opcode1C >> 8 + .db opcode1D >> 8 + .db opcode1E >> 8 + .db opcode1F >> 8 + .db opcode20 >> 8 + .db opcode21 >> 8 + .db opcode22 >> 8 + .db opcode23 >> 8 + .db opcode24 >> 8 + .db opcode25 >> 8 + .db opcode26 >> 8 + .db opcode27 >> 8 + .db opcode28 >> 8 + .db opcode29 >> 8 + .db opcode2A >> 8 + .db opcode2B >> 8 + .db opcode2C >> 8 + .db opcode2D >> 8 + .db opcode2E >> 8 + .db opcode2F >> 8 + .db opcode30 >> 8 + .db opcode31 >> 8 + .db opcode32 >> 8 + .db opcode33 >> 8 + .db opcode34 >> 8 + .db opcode35 >> 8 + .db opcode36 >> 8 + .db opcode37 >> 8 + .db opcode38 >> 8 + .db opcode39 >> 8 + .db opcode3A >> 8 + .db opcode3B >> 8 + .db opcode3C >> 8 + .db opcode3D >> 8 + .db opcode3E >> 8 + .db opcode3F >> 8 + .db opcode40 >> 8 + .db opcode41 >> 8 + .db opcode42 >> 8 + .db opcode43 >> 8 + .db opcode44 >> 8 + .db opcode45 >> 8 + .db opcode46 >> 8 + .db opcode47 >> 8 + .db opcode48 >> 8 + .db opcode49 >> 8 + .db opcode4A >> 8 + .db opcode4B >> 8 + .db opcode4C >> 8 + .db opcode4D >> 8 + .db opcode4E >> 8 + .db opcode4F >> 8 + .db opcode50 >> 8 + .db opcode51 >> 8 + .db opcode52 >> 8 + .db opcode53 >> 8 + .db opcode54 >> 8 + .db opcode55 >> 8 + .db opcode56 >> 8 + .db opcode57 >> 8 + .db opcode58 >> 8 + .db opcode59 >> 8 + .db opcode5A >> 8 + .db opcode5B >> 8 + .db opcode5C >> 8 + .db opcode5D >> 8 + .db opcode5E >> 8 + .db opcode5F >> 8 + .db opcode60 >> 8 + .db opcode61 >> 8 + .db opcode62 >> 8 + .db opcode63 >> 8 + .db opcode64 >> 8 + .db opcode65 >> 8 + .db opcode66 >> 8 + .db opcode67 >> 8 + .db opcode68 >> 8 + .db opcode69 >> 8 + .db opcode6A >> 8 + .db opcode6B >> 8 + .db opcode6C >> 8 + .db opcode6D >> 8 + .db opcode6E >> 8 + .db opcode6F >> 8 + .db opcode70 >> 8 + .db opcode71 >> 8 + .db opcode72 >> 8 + .db opcode73 >> 8 + .db opcode74 >> 8 + .db opcode75 >> 8 + .db opcode76 >> 8 + .db opcode77 >> 8 + .db opcode78 >> 8 + .db opcode79 >> 8 + .db opcode7A >> 8 + .db opcode7B >> 8 + .db opcode7C >> 8 + .db opcode7D >> 8 + .db opcode7E >> 8 + .db opcode7F >> 8 + .db opcode80 >> 8 + .db opcode81 >> 8 + .db opcode82 >> 8 + .db opcode83 >> 8 + .db opcode84 >> 8 + .db opcode85 >> 8 + .db opcode86 >> 8 + .db opcode87 >> 8 + .db opcode88 >> 8 + .db opcode89 >> 8 + .db opcode8A >> 8 + .db opcode8B >> 8 + .db opcode8C >> 8 + .db opcode8D >> 8 + .db opcode8E >> 8 + .db opcode8F >> 8 + .db opcode90 >> 8 + .db opcode91 >> 8 + .db opcode92 >> 8 + .db opcode93 >> 8 + .db opcode94 >> 8 + .db opcode95 >> 8 + .db opcode96 >> 8 + .db opcode97 >> 8 + .db opcode98 >> 8 + .db opcode99 >> 8 + .db opcode9A >> 8 + .db opcode9B >> 8 + .db opcode9C >> 8 + .db opcode9D >> 8 + .db opcode9E >> 8 + .db opcode9F >> 8 + .db opcodeA0 >> 8 + .db opcodeA1 >> 8 + .db opcodeA2 >> 8 + .db opcodeA3 >> 8 + .db opcodeA4 >> 8 + .db opcodeA5 >> 8 + .db opcodeA6 >> 8 + .db opcodeA7 >> 8 + .db opcodeA8 >> 8 + .db opcodeA9 >> 8 + .db opcodeAA >> 8 + .db opcodeAB >> 8 + .db opcodeAC >> 8 + .db opcodeAD >> 8 + .db opcodeAE >> 8 + .db opcodeAF >> 8 + .db opcodeB0 >> 8 + .db opcodeB1 >> 8 + .db opcodeB2 >> 8 + .db opcodeB3 >> 8 + .db opcodeB4 >> 8 + .db opcodeB5 >> 8 + .db opcodeB6 >> 8 + .db opcodeB7 >> 8 + .db opcodeB8 >> 8 + .db opcodeB9 >> 8 + .db opcodeBA >> 8 + .db opcodeBB >> 8 + .db opcodeBC >> 8 + .db opcodeBD >> 8 + .db opcodeBE >> 8 + .db opcodeBF >> 8 + .db opcodeC0 >> 8 + .db opcodeC1 >> 8 + .db opcodeC2 >> 8 + .db opcodeC3 >> 8 + .db opcodeC4 >> 8 + .db opcodeC5 >> 8 + .db opcodeC6 >> 8 + .db opcodeC7 >> 8 + .db opcodeC8 >> 8 + .db opcodeC9 >> 8 + .db opcodeCA >> 8 + .db opcodeCB >> 8 + .db opcodeCC >> 8 + .db opcodeCD >> 8 + .db opcodeCE >> 8 + .db opcodeCF >> 8 + .db opcodeD0 >> 8 + .db opcodeD1 >> 8 + .db opcodeD2 >> 8 + .db opcodeD3 >> 8 + .db opcodeD4 >> 8 + .db opcodeD5 >> 8 + .db opcodeD6 >> 8 + .db opcodeD7 >> 8 + .db opcodeD8 >> 8 + .db opcodeD9 >> 8 + .db opcodeDA >> 8 + .db opcodeDB >> 8 + .db opcodeDC >> 8 + .db opcodeDD >> 8 + .db opcodeDE >> 8 + .db opcodeDF >> 8 + .db opcodeE0 >> 8 + .db opcodeE1 >> 8 + .db opcodeE2 >> 8 + .db opcodeE3 >> 8 + .db opcodeE4 >> 8 + .db opcodeE5 >> 8 + .db opcodeE6 >> 8 + .db opcodeE7 >> 8 + .db opcodeE8 >> 8 + .db opcodeE9 >> 8 + .db opcodeEA >> 8 + .db opcodeEB >> 8 + .db opcodeEC >> 8 + .db opcodeED >> 8 + .db opcodeEE >> 8 + .db opcodeEF >> 8 + .db opcodeF0 >> 8 + .db opcodeF1 >> 8 + .db opcodeF2 >> 8 + .db opcodeF3 >> 8 + .db opcodeF4 >> 8 + .db opcodeF5 >> 8 + .db opcodeF6 >> 8 + .db opcodeF7 >> 8 + .db opcodeF8 >> 8 + .db opcodeF9 >> 8 + .db opcodeFA >> 8 + .db opcodeFB >> 8 + .db opcodeFC >> 8 + .db opcodeFD >> 8 + .db opcodeFE >> 8 + .db opcodeFF >> 8 + +opcodetable_B: + .db opcode00_B >> 8 + .db opcode01_B >> 8 + .db opcode02_B >> 8 + .db opcode03_B >> 8 + .db opcode04_B >> 8 + .db opcode05_B >> 8 + .db opcode06_B >> 8 + .db opcode07_B >> 8 + .db opcode08_B >> 8 + .db opcode09_B >> 8 + .db opcode0A_B >> 8 + .db opcode0B_B >> 8 + .db opcode0C_B >> 8 + .db opcode0D_B >> 8 + .db opcode0E_B >> 8 + .db opcode0F_B >> 8 + .db opcode10_B >> 8 + .db opcode11_B >> 8 + .db opcode12_B >> 8 + .db opcode13_B >> 8 + .db opcode14_B >> 8 + .db opcode15_B >> 8 + .db opcode16_B >> 8 + .db opcode17_B >> 8 + .db opcode18_B >> 8 + .db opcode19_B >> 8 + .db opcode1A_B >> 8 + .db opcode1B_B >> 8 + .db opcode1C_B >> 8 + .db opcode1D_B >> 8 + .db opcode1E_B >> 8 + .db opcode1F_B >> 8 + .db opcode20_B >> 8 + .db opcode21_B >> 8 + .db opcode22_B >> 8 + .db opcode23_B >> 8 + .db opcode24_B >> 8 + .db opcode25_B >> 8 + .db opcode26_B >> 8 + .db opcode27_B >> 8 + .db opcode28_B >> 8 + .db opcode29_B >> 8 + .db opcode2A_B >> 8 + .db opcode2B_B >> 8 + .db opcode2C_B >> 8 + .db opcode2D_B >> 8 + .db opcode2E_B >> 8 + .db opcode2F_B >> 8 + .db opcode30_B >> 8 + .db opcode31_B >> 8 + .db opcode32_B >> 8 + .db opcode33_B >> 8 + .db opcode34_B >> 8 + .db opcode35_B >> 8 + .db opcode36_B >> 8 + .db opcode37_B >> 8 + .db opcode38_B >> 8 + .db opcode39_B >> 8 + .db opcode3A_B >> 8 + .db opcode3B_B >> 8 + .db opcode3C_B >> 8 + .db opcode3D_B >> 8 + .db opcode3E_B >> 8 + .db opcode3F_B >> 8 + .db opcode40_B >> 8 + .db opcode41_B >> 8 + .db opcode42_B >> 8 + .db opcode43_B >> 8 + .db opcode44_B >> 8 + .db opcode45_B >> 8 + .db opcode46_B >> 8 + .db opcode47_B >> 8 + .db opcode48_B >> 8 + .db opcode49_B >> 8 + .db opcode4A_B >> 8 + .db opcode4B_B >> 8 + .db opcode4C_B >> 8 + .db opcode4D_B >> 8 + .db opcode4E_B >> 8 + .db opcode4F_B >> 8 + .db opcode50_B >> 8 + .db opcode51_B >> 8 + .db opcode52_B >> 8 + .db opcode53_B >> 8 + .db opcode54_B >> 8 + .db opcode55_B >> 8 + .db opcode56_B >> 8 + .db opcode57_B >> 8 + .db opcode58_B >> 8 + .db opcode59_B >> 8 + .db opcode5A_B >> 8 + .db opcode5B_B >> 8 + .db opcode5C_B >> 8 + .db opcode5D_B >> 8 + .db opcode5E_B >> 8 + .db opcode5F_B >> 8 + .db opcode60_B >> 8 + .db opcode61_B >> 8 + .db opcode62_B >> 8 + .db opcode63_B >> 8 + .db opcode64_B >> 8 + .db opcode65_B >> 8 + .db opcode66_B >> 8 + .db opcode67_B >> 8 + .db opcode68_B >> 8 + .db opcode69_B >> 8 + .db opcode6A_B >> 8 + .db opcode6B_B >> 8 + .db opcode6C_B >> 8 + .db opcode6D_B >> 8 + .db opcode6E_B >> 8 + .db opcode6F_B >> 8 + .db opcode70_B >> 8 + .db opcode71_B >> 8 + .db opcode72_B >> 8 + .db opcode73_B >> 8 + .db opcode74_B >> 8 + .db opcode75_B >> 8 + .db opcode76_B >> 8 + .db opcode77_B >> 8 + .db opcode78_B >> 8 + .db opcode79_B >> 8 + .db opcode7A_B >> 8 + .db opcode7B_B >> 8 + .db opcode7C_B >> 8 + .db opcode7D_B >> 8 + .db opcode7E_B >> 8 + .db opcode7F_B >> 8 + .db opcode80_B >> 8 + .db opcode81_B >> 8 + .db opcode82_B >> 8 + .db opcode83_B >> 8 + .db opcode84_B >> 8 + .db opcode85_B >> 8 + .db opcode86_B >> 8 + .db opcode87_B >> 8 + .db opcode88_B >> 8 + .db opcode89_B >> 8 + .db opcode8A_B >> 8 + .db opcode8B_B >> 8 + .db opcode8C_B >> 8 + .db opcode8D_B >> 8 + .db opcode8E_B >> 8 + .db opcode8F_B >> 8 + .db opcode90_B >> 8 + .db opcode91_B >> 8 + .db opcode92_B >> 8 + .db opcode93_B >> 8 + .db opcode94_B >> 8 + .db opcode95_B >> 8 + .db opcode96_B >> 8 + .db opcode97_B >> 8 + .db opcode98_B >> 8 + .db opcode99_B >> 8 + .db opcode9A_B >> 8 + .db opcode9B_B >> 8 + .db opcode9C_B >> 8 + .db opcode9D_B >> 8 + .db opcode9E_B >> 8 + .db opcode9F_B >> 8 + .db opcodeA0_B >> 8 + .db opcodeA1_B >> 8 + .db opcodeA2_B >> 8 + .db opcodeA3_B >> 8 + .db opcodeA4_B >> 8 + .db opcodeA5_B >> 8 + .db opcodeA6_B >> 8 + .db opcodeA7_B >> 8 + .db opcodeA8_B >> 8 + .db opcodeA9_B >> 8 + .db opcodeAA_B >> 8 + .db opcodeAB_B >> 8 + .db opcodeAC_B >> 8 + .db opcodeAD_B >> 8 + .db opcodeAE_B >> 8 + .db opcodeAF_B >> 8 + .db opcodeB0_B >> 8 + .db opcodeB1_B >> 8 + .db opcodeB2_B >> 8 + .db opcodeB3_B >> 8 + .db opcodeB4_B >> 8 + .db opcodeB5_B >> 8 + .db opcodeB6_B >> 8 + .db opcodeB7_B >> 8 + .db opcodeB8_B >> 8 + .db opcodeB9_B >> 8 + .db opcodeBA_B >> 8 + .db opcodeBB_B >> 8 + .db opcodeBC_B >> 8 + .db opcodeBD_B >> 8 + .db opcodeBE_B >> 8 + .db opcodeBF_B >> 8 + .db opcodeC0_B >> 8 + .db opcodeC1_B >> 8 + .db opcodeC2_B >> 8 + .db opcodeC3_B >> 8 + .db opcodeC4_B >> 8 + .db opcodeC5_B >> 8 + .db opcodeC6_B >> 8 + .db opcodeC7_B >> 8 + .db opcodeC8_B >> 8 + .db opcodeC9_B >> 8 + .db opcodeCA_B >> 8 + .db opcodeCB_B >> 8 + .db opcodeCC_B >> 8 + .db opcodeCD_B >> 8 + .db opcodeCE_B >> 8 + .db opcodeCF_B >> 8 + .db opcodeD0_B >> 8 + .db opcodeD1_B >> 8 + .db opcodeD2_B >> 8 + .db opcodeD3_B >> 8 + .db opcodeD4_B >> 8 + .db opcodeD5_B >> 8 + .db opcodeD6_B >> 8 + .db opcodeD7_B >> 8 + .db opcodeD8_B >> 8 + .db opcodeD9_B >> 8 + .db opcodeDA_B >> 8 + .db opcodeDB_B >> 8 + .db opcodeDC_B >> 8 + .db opcodeDD_B >> 8 + .db opcodeDE_B >> 8 + .db opcodeDF_B >> 8 + .db opcodeE0_B >> 8 + .db opcodeE1_B >> 8 + .db opcodeE2_B >> 8 + .db opcodeE3_B >> 8 + .db opcodeE4_B >> 8 + .db opcodeE5_B >> 8 + .db opcodeE6_B >> 8 + .db opcodeE7_B >> 8 + .db opcodeE8_B >> 8 + .db opcodeE9_B >> 8 + .db opcodeEA_B >> 8 + .db opcodeEB_B >> 8 + .db opcodeEC_B >> 8 + .db opcodeED_B >> 8 + .db opcodeEE_B >> 8 + .db opcodeEF_B >> 8 + .db opcodeF0_B >> 8 + .db opcodeF1_B >> 8 + .db opcodeF2_B >> 8 + .db opcodeF3_B >> 8 + .db opcodeF4_B >> 8 + .db opcodeF5_B >> 8 + .db opcodeF6_B >> 8 + .db opcodeF7_B >> 8 + .db opcodeF8_B >> 8 + .db opcodeF9_B >> 8 + .db opcodeFA_B >> 8 + .db opcodeFB_B >> 8 + .db opcodeFC_B >> 8 + .db opcodeFD_B >> 8 + .db opcodeFE_B >> 8 + .db opcodeFF_B >> 8 + +bitop_table: + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_swap_b & $FF + .db bitop_swap_c & $FF + .db bitop_swap_d & $FF + .db bitop_swap_e & $FF + .db bitop_swap_h & $FF + .db bitop_swap_l & $FF + .db bitop_swap_hl & $FF + .db bitop_swap_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_xf & $FF + .db bitop_a & $FF + + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_x & $FF + .db bitop_a & $FF + +;//////////////////////// +;///// BIT SHIFTING ///// +;//////////////////////// +bitop_a: + ld (_+1),a + ex af,af' +_ + rlc a + NEXT + +bitop_x: +bitop_xf: + ld (_+1),a + ex af,af' + exx +_ + rlc b + exx + NEXT + +bitop_swap_b: + exx + ld a,b + rrca \ rrca \ rrca \ rrca + ld b,a + exx + ex af,af' + NEXT + +bitop_swap_c: + exx + ld a,c + rrca \ rrca \ rrca \ rrca + ld c,a + exx + ex af,af' + NEXT + +bitop_swap_d: + exx + ld a,d + rrca \ rrca \ rrca \ rrca + ld d,a + exx + ex af,af' + NEXT + +bitop_swap_e: + exx + ld a,e + rrca \ rrca \ rrca \ rrca + ld e,a + exx + ex af,af' + NEXT + +bitop_swap_h: + exx + ld a,h + rrca \ rrca \ rrca \ rrca + ld h,a + exx + ex af,af' + NEXT + +bitop_swap_l: + exx + ld a,l + rrca \ rrca \ rrca \ rrca + ld l,a + exx + ex af,af' + NEXT + +bitop_swap_hl: + exx + ld a,(hl) + rrd + exx + ex af,af' + NEXT + +bitop_swap_a: + ex af,af' + rrca \ rrca \ rrca \ rrca + NEXT + + fill_to($E3CB) +bitcodes: + ex af,af' + dec sp + pop af +bitcodes_B: + ld l,a + dec h + ld l,(hl) + inc h + jp (hl) + + fill_to($E3FB) +#define opcodeFB_B eval($) + ;ei + dec sp + jp opcodeFB + +opcodes_start: + insert_opcodes(512-27) + + .echo "Opcode emulation size is ", $-opcodes_start + +;Input: HL = address, A = LSB of address plus 1, Z = (LSB==$FF) + FIX_LBL +io_write: + ex af,af' + ld (hl),a + ex af,af' + jp z,check_ints_2 + dec a + jp z,getkey + cp $0f + jp z,check_ints_2 + cp $41 + jr nz,_ + res 0,(hl) + res 1,(hl) + ld a,(LY) + cp 144 + jr c,end_io_write + set 0,(hl) + jr end_io_write +_ + cp $46 + jr nz,end_io_write + ld de,$fe00 + ld h,(hl) + ld l,e + ld a,c + ld bc,$00a0 + ldir + ld c,a + ld de,(opcodetable_B & $FF00) + (opcodetable >> 8) +end_io_write: + ex af,af' + NEXT + + FIX_LBL +timer1: + ld a,2 + out ($31),a + ld d,0 + in a,($32) + ld e,a + inc de + inc de + inc de + ld hl,(chan3cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 2,(hl) + jr z,_ + ld a,(NR32) + and %01100000 + jr z,_ + ld l,soundOutputs+1 & $FF + ld a,(hl) + xor 2 + ld (hl),a +_ + ld hl,(chan3div) + bit 1,a + jr z,$+3 + inc hl + res 0,l +_ + ld (chan3cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + ld b,a + + ld hl,(chan4cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 3,(hl) + jr z,_ + ld l,soundOutputs & $FF + ld a,r + xor (hl) + and 1 + xor (hl) + ld (hl),a +_ + ld hl,(chan4div) +_ + ld (chan4cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + cp b + jr c,_ + ld a,b +_ + out ($32),a + + ld hl,(soundOutputs) + ld a,h + xor l + ld (soundDiff1),a + ld (soundDiff2),a + bit 7,c + ld c,l + jr z,$+3 + ld c,h + + ld de,(opcodetable_B & $FF00) + (opcodetable >> 8) + ex af,af' + NEXT + + FIX_LBL +timer2: + ld a,2 + out ($34),a + ld d,0 + in a,($35) + ld e,a + inc de + inc de + inc de + ld hl,(chan1cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 0,(hl) + jr z,_ + ld l,soundOutputs & $FF + ld a,(hl) + xor 2 + ld (hl),a + bit 1,a + ld hl,(chan1div1) + jr nz,++_ +_ + ld hl,(chan1div0) +_ + ld (chan1cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + ld b,a + + ld hl,(chan2cnt) + add hl,de + jr nc,++_ + ld hl,NR52_backup + bit 1,(hl) + jr z,_ + ld l,soundOutputs+1 & $FF + ld a,(hl) + xor 1 + ld (hl),a + rra + ld hl,(chan2div1) + jr c,++_ +_ + ld hl,(chan2div0) +_ + ld (chan2cnt),hl + + ld a,$FF + cp h + jr nz,_ + xor l +_ + cp b + jr c,_ + ld a,b +_ + out ($35),a + + ld hl,(soundOutputs) + ld a,h + xor l + ld (soundDiff1),a + ld (soundDiff2),a + bit 7,c + ld c,l + jr z,$+3 + ld c,h + + ld de,(opcodetable_B & $FF00) + (opcodetable >> 8) + ex af,af' + NEXT + + FIX_LBL +irq_sound: + ex (sp),hl + ex af,af' + in a,(4) + rla + jr nc,_ + sbc a,a + out ($37),a + ld a,c +soundDiff1 = $+1 + xor 0 + ld c,a + out (0),a + dec ixl + jr z,hardware + ex af,af' + NEXT + +_ + rla + jp c,timer2 + rla + jp c,timer1 + and %00100000 + jp z,die + + ld (_+1),sp + ld sp,mystack + ld a,3 + out (6),a + call handleSound + ld a,(pageA) + out (6),a +_ + ld sp,0 + ex af,af' + jp opcode00 + + FIX_LBL +irq: + ex (sp),hl + ex af,af' + in a,(4) + rla + jp nc,die + + FIX_LBL +hardware: + ld a,(STAT) + rrca + rrca + add a,a + rlca + jp pe,_ + xor 3 + ld (STAT),a + ld a,(channelSelect) + or a + ld a,2 + ld ixl,a + jr nz,midscanline_continue + out ($37),a + out ($38),a + jr midscanline_continue + FIX_LBL +_ + ld (STAT),a + ld hl,0 + add hl,sp + ld sp,mystack + push hl + ld a,3 + out (6),a + call hardwareflash + ld a,(pageA) + out (6),a + + FIX_LBL +check_ints: + ld a,(intstatus) + or a + ld a,(IE) + ld hl,IF + jr z,no_interrupts + and (hl) + jr z,no_interrupts_3 + rra + jr nc,_ + res 0,(hl) + ld l,$40 + jr do_interrupt +_ + rra + jr nc,_ + res 1,(hl) + ld l,$48 + jr do_interrupt +_ + rra + jr nc,_ + res 2,(hl) + ld l,$50 + jr do_interrupt +_ + rra + jr nc,no_interrupts + res 3,(hl) + ld l,$58 +do_interrupt: + xor a + ld h,a + ld (intstatus),a + ex (sp),hl + ld a,(hl) + cp $76 ;halt + jr nz,_ + inc hl +_ + dec iy + ld (iy),h + dec iy + ld (iy),l + pop hl + ld sp,hl + ex af,af' + NEXT +no_interrupts: + and (hl) +no_interrupts_3: + pop hl + jr z,no_interrupts_2 + ld a,(hl) + cp $76 + jr nz,no_interrupts_2 + inc hl +no_interrupts_2: + ld sp,hl +midscanline_continue: + ex af,af' + NEXT + + FIX_LBL +getkey: + ;Writing to $ff00, so gimmeh the keys + ld a,(hl) + ld hl,(keys) + or %00001111 + bit 4,a + jr nz,$+3 + and l + bit 5,a + jr nz,$+3 + and h + ld (P1),a + ex af,af' + jp opcode00 + + FIX_LBL +memcontrol: + ld a,(mbc) + dec a + jp z,dombc2 + dec a + jp z,dombc3 + dec a + jp z,dombc5 + ld a,h + and %01100000 + cp $60 + jr nz,_ + ld a,l + ld hl,mbcstatus + res 0,(hl) + rra + jr nc,$+4 + set 0,(hl) + ex af,af' + jp opcode00 +_ + cp $20 + jr nz,_ + in a,(6) + ld h,a + ld a,(basepage) + sub h + and %11100000 + ld h,a + ld a,l + and %00011111 + jr nz,$+3 + inc a + or h + jr setcartrom +_ + cp $40 + jr nz,++_ + ld a,(mbcstatus) + rra + jr c,setcartram + in a,(6) + ld h,a + ld a,(basepage) + sub h + ld h,a + ld a,l + rrca + rrca + rrca + xor h + and %01100000 + xor h + jr nz,setcartrom + inc a + jr setcartrom + + FIX_LBL +dombc5: + ld a,h + and %01100000 + cp $20 + jr nz,_ + ld a,l + and %01111111 + jr z,setcartrom_abs +setcartrom: + ld h,a + ld a,(basepage) + sub h +setcartrom_abs: + ld (pageA),a + out (6),a + ex af,af' + jp opcode00 + + FIX_LBL +dombc3: + ld a,h + and %01100000 + cp $20 + jr nz,_ + ld a,l + and %01111111 + jr nz,setcartrom + inc a + jr setcartrom +_ + cp $40 + jr nz,_ +setcartram: + ld a,l + and 3 + ld hl,maxRamPageUsed + cp (hl) + jr c,$+3 + ld (hl),a + add a,$81 + ld (pageB),a + out (7),a + ; See if accessing unavailable page + inc l + cp (hl) + jp nc,die +_ + ex af,af' + jp opcode00 + + FIX_LBL +dombc2: + ld a,h + and %01100001 + cp %00100001 + jr nz,-_ + ld a,l + and %00001111 + jr nz,setcartrom + inc a + jr setcartrom + +decompressRAM: + ld a,(basepage) + out (6),a + call decompress_page3code + ld a,3 + out (6),a + ret + + FIX_LBL +invalid_chk: + ex af,af' + ld hl,-$0053 + add hl,sp + ld a,h + or a + jr nz,diewait + ld a,l + cp 2 + jr nc,diewait + ld sp,TimerInterruptReplacement + 1 + add hl,sp + ld sp,hl + ex af,af' + jp opcode00 + +diewait: + in a,(4) + bit 3,a + jr nz,diewait + jp die + + .echo "CPU emulator: ", $-$E000, " used" + .echo "CPU emulator: ", $FC00-$, " left" + + fill_to($FC00) +im2lut: +invalid: + fill_to($FC00+257) + jp invalid_chk + + FIX_LBL +die: + ld a,(basepage) + out (6),a + jp Recover + + FIX_LBL +irqflash: + push af + in a,(4) + rla + jr nc,_ + sbc a,a + out ($37),a + ex af,af' +soundDiff2 = $+1 + xor 0 + out (0),a + ex af,af' + pop af + ei + ret +_ + rla + jp c,timer2flash + rla + jp c,timer1flash + bit 5,a + jp z,die + push hl + call handleSound + pop hl + pop af + ei + ret + +.block $%2 +chan1div0: + .dw 0 +chan1div1: + .dw 0 +chan1cnt: + .dw 0 +chan2div0: + .dw 0 +chan2div1: + .dw 0 +chan2cnt: + .dw 0 +chan3div: + .dw 0 +chan3cnt: + .dw 0 +chan4div: + .dw 0 +chan4cnt: + .dw 0 + +bytes_skipped_1 = bytes_skipped +vars: +trackoffsetY: + .db 0 +trackoffsetX: + .db 0 +sprite_to_track: + .db -4 +sprite_track_count: + .db 1 +basepage: + .db 0 +sprite_detect: + .db 0 +intstatus: + .db 1 +lcdchanged: + .db 0 +lcdchecksum: + .db 0 +mbcstatus: + .db 0 +mbc: + .db 1 +framecount: + .db 1 +frameskip: + .db 5 +offsetYFake: + .db 8 +offsetXFake: + .db 0 +offsetY: + .db 8 +offsetX: + .db 0 +myLY: + .db 8 +mySCY: + .db 0 +mySCX: + .db 0 +screenHeight: + .db 128 +screenWidth: + .db 21 +windowLine: + .db 0 +screenCopy: + jp safecopy_mono_3 +intermediateFrame: + jp safecopy_mono_3_intermediate +dithercount: + .db 1 +displayFlags: + .db %11000000 +displayFlagsFake: + .db %11000000 +decimalSave: + .db 0 +keySave: + .db 0 +mycontrast: + .db 0 +channelSelect: + .db 0 +pageA: + .db 0 +pageB: + .db $81 +keys: + .dw 0 +maxRamPageUsed: + .db 0 +firstInvalidRamPage: + .db 0 +LCDC_backup: + .db 0 +STAT_backup: + .db 0 +SCY_backup: + .db 0 +SCX_backup: + .db 0 +LY_backup: + .db 0 +LYC_backup: + .db 0 +DMA_backup: + .db 0 +BGP_backup: + .db 0 +OBP0_backup: + .db 0 +OBP1_backup: + .db 0 +WY_backup: + .db 0 +WX_backup: + .db 0 + +TimerInterruptReplacement: + ;.block 16 + + fill_to($FDF3) +#define opcodeF3end eval($) + ;di + ex af,af' + xor a + ld (intstatus),a + ex af,af' + jp opcode00 + + fill_to($FDFD) +irq_jump: + jp irq + +page3codesize = $FE00-$E000-bytes_skipped + .org page3code + page3codesize + \ No newline at end of file diff --git a/render.z80 b/render.z80 new file mode 100644 index 0000000..0cce883 --- /dev/null +++ b/render.z80 @@ -0,0 +1,2767 @@ + ;Display flags + ; Bits 6-7: zoom mode + ; Bit 0: grayscale enable + ; Bits 1-2: monochrome palette select + +render: + ld a,$FF + out (1),a + ld a,$BF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + rla + jr c,_ + ld a,3 + ld (framecount),a +_ + + ld a,(LY) + cp 144 + jr z,_ + ld a,(framecount) + dec a + ret nz + ld a,(LY) + or a + jr nz,++_ + + ld hl,(offsetYFake) + ld (offsetY),hl + ld a,l + ld (myLY),a + + ld hl,displayFlagsFake + ld b,(hl) + dec l + ld a,(hl) + ld (hl),b + xor b + and %11000001 + call nz,update_zoom_vars + xor a + out (5),a + jr ++_ + +_ + call getAllMyKeys + ld hl,framecount + dec (hl) + jp nz,intermediateFrame + ld a,(frameskip) + ld (hl),a +_ + + ld a,(LCDC_backup) + rla + ret nc + + exx + push bc + push de + push hl + ld a,2 + out (5),a + +start_raster: + ld a,(LCDC_backup) + rra + jp nc,clip_bottom + + ld a,(LY) + cp (ix-vars+myLY) + jp c,clip_top + + ld a,(windowLine) + or a + jr nz,_ + bit 5,(ix-vars+LCDC_backup) + jr z,_ + ld a,(myLY) + sub (ix-vars+WY_backup) + jr c,_ + ld (windowLine),a +_ + + ld hl,(SCY_backup) + ld a,(offsetX) + add a,h + ld h,a + ld (mySCY),hl + + call preparetilemap + jr nc,clip_bottom + + ld a,(LCDC_backup) + bit 3,a + jr z,_ + set 2,d +_ + bit 4,a + ld a,$24 ;inc h + jr nz,$+3 + inc a ;dec h + ld (rastersmc1),a + + exx + ld b,(ix-vars+screenWidth) + + ;Is window on? + bit 5,(ix-vars+LCDC_backup) + jr z,raster_no_window + ;Is window Y below the last LY? + ld a,(myLY) + sub (ix-vars+WY_backup) + jr nc,_ + ;Does window start in the current slice? + exx + add a,c + exx + jr nc,raster_no_window + exx + sbc a,c ;CARRY WAS SET + cpl + ld c,a + add a,(ix-vars+myLY) + ld (myLY),a + + call rasterlines + jr start_raster + +_ + ;Make it draw only as far as the window (or the screen width, whichever is less). + ld a,(WX_backup) + sub (ix-vars+offsetX) + jr c,raster_window + + rra + rra + rra + and $1F + cp b + jr nc,raster_no_window + + ld b,a + inc b + exx + + call rasterlines + +raster_window: + call preparewindow + jr nc,clip_bottom + + ld a,(LCDC_backup) + bit 6,a + jr z,_ + set 2,d +_ + bit 4,a + ld a,$24 ;inc h + jr nz,$+3 + inc a ;dec h + ld (rastersmc1),a + + call rasterlines + jr clip_bottom + +raster_no_window: + exx + + call rasterlines + +clip_bottom: + ld a,(LY) + ld (myLY),a + cp 144 + jr nz,clip_top + push iy + call draw_sprites + pop iy + call screenCopy + xor a + ld (windowLine),a +clip_top: + pop hl + pop de + pop bc + exx + xor a + out (5),a + ret + +safecopy_mono_0: + ld hl,bufferBase + ld e,$20 +_ + in a,($10) + rla + jr c,-_ + ld a,e + out ($10),a + ld bc,64*256+$11 +_ + in a,($10) + rla + jr c,-_ + outi + jr nz,-_ + ld c,15 + add hl,bc + inc e + ld a,e + cp $2c + jr nz,--_ +safecopy_mono_0_intermediate: + ret + +safecopy_gray_0_intermediate: + bit 0,(hl) + ret nz + ld a,2 + out (5),a + call safecopy_gray_0 + xor a + out (5),a + ret + +safecopy_gray_0: + ld hl,dithercount + dec (hl) + jr nz,_ + ld (hl),3 +_ + ld bc,30 + ld hl,bufferBase - 30 + ld e,$1F + call advancecolumn + + ld a,(dithercount) + dec a + jr z,gray0loop3 + dec a + jr z,gray0loop2 + +gray0loop1: + in a,($10) + rla + jr c,gray0loop1 + + ld a,(hl) + inc l + xor (hl) + and %10110110 + xor (hl) + inc hl + out ($11),a + + dec b + call z,advancecolumn + +gray0loop2: + in a,($10) + rla + jr c,gray0loop2 + + ld a,(hl) + inc l + xor (hl) + and %11011011 + xor (hl) + inc hl + out ($11),a + + dec b + call z,advancecolumn + +gray0loop3: + in a,($10) + rla + jr c,gray0loop3 + + ld a,(hl) + inc l + xor (hl) + and %01101101 + xor (hl) + inc hl + out ($11),a + + dec b + call z,advancecolumn + jp gray0loop1 + +advancecolumn: + add hl,bc + ld b,64 + inc e + ld a,e + cp $2c + jr z,++_ +_ + in a,($10) + rla + jr c,-_ + ld a,e + out ($10),a + ret +_ + pop hl + ret + +safecopy_mono_1_intermediate: + ld a,2 + out (5),a + call safecopy_mono_1 + xor a + out (5),a + ret + +safecopy_mono_1: + push ix + ld hl,dithercount + dec (hl) + ld a,(hl) + jr nz,_ + ld (hl),6 +_ + srl a + inc a + ld ixh,a + ld d,bit6LUT0 >> 8 + jr nc,_ + inc d +_ + ld hl,bufferBase + ld c,$20 +mono1loop0: + push hl + push ix +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($10),a + ld b,64 +mono1loop1: + ld e,(hl) + inc hl + dec ixh + jr nz,_ + ld ixh,3 + inc hl +_ + ld a,d + xor (bit6LUT0^bit6LUT1)>>8 + ld d,a +_ + in a,($10) + rla + jr c,-_ + ld a,(de) + out ($11),a + djnz mono1loop1 + ld a,c + pop ix + pop hl + ld c,86 + 15 + add hl,bc + inc a + ld c,a + cp $30 + jr nz,mono1loop0 + pop ix + ret + +safecopy_gray_1_intermediate: + bit 0,(hl) + ret nz + ld a,2 + out (5),a + call safecopy_gray_1 + xor a + out (5),a + ret + +safecopy_gray_1: + push ix + ld hl,dithercount + dec (hl) + jr nz,_ + ld (hl),3 +_ + ld a,(hl) + + ld hl,bufferBase - ((86+15)*2) + push hl + ld c,$1F + ld d,bit6LUT0 >> 8 + + dec a + ld ix,gray1loop3 + jr z,advancecolumn1 + + dec a + ld ix,gray1loop2 + jr z,advancecolumn1 + + ld ix,gray1loop1 + +advancecolumn1: + pop hl + ld a,c + inc a + ld bc,(86+15)*2 + add hl,bc + ld c,a + ld b,64 + cp $30 + jr z,++_ +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($10),a + push hl + jp (ix) +_ + pop ix + ret + +gray1loop1: + in a,($10) + rla + jr c,gray1loop1 + + ld a,(hl) + inc l + xor (hl) + and %10011001 + xor (hl) + ld e,a + ld a,(de) + inc hl + out ($11),a + inc l + inc hl + + dec b + jp z,advancecolumn1 + +gray1loop2: + in a,($10) + rla + jr c,gray1loop2 + + ld a,(hl) + inc l + xor (hl) + and %10101010 + xor (hl) + ld e,a + ld a,(de) + inc hl + out ($11),a + + dec b + jp z,advancecolumn1 + +gray1loop3: + in a,($10) + rla + jr c,gray1loop3 + + ld a,(hl) + inc l + xor (hl) + and %00110011 + xor (hl) + ld e,a + ld a,(de) + inc hl + out ($11),a + + dec b + jp z,advancecolumn1 + jp gray1loop1 + +safecopy_mono_2_intermediate: + ;bit 0,(hl) + ;ret nz + ld a,2 + out (5),a + call safecopy_mono_2 + xor a + out (5),a + ret + +safecopy_mono_2: + push ix + push iy + + ld hl,dithercount + dec (hl) + ld a,(hl) + jr nz,_ + ld (hl),6 +_ + srl a + ld h,bit5LUT0 >> 8 + jr nc,_ + inc h +_ + inc a + ld iyl,a + ld ix,bufferBase + ld bc,64*256 + $20 + +mono2loop0: + push bc +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($10),a + + ld iyh,iyl + push ix +mono2loop1: + ld a,h + xor (bit5LUT0^bit5LUT1)>>8 + ld h,a + ld l,(ix) + ld a,(hl) + add a,a + add a,a + add a,a + ld c,a + ld l,(ix+107+15) + ld a,(hl) + rra + srl a + or c + ld c,a +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($11),a + inc ix + inc ix + dec iyh + jr nz,_ + ld iyh,3 + dec ix +_ + djnz mono2loop1 + + pop ix + ld de,(107+15)*2 + add ix,de + + pop bc + inc c +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($10),a + push bc + push ix + ld iyh,iyl +mono2loop2: + ld a,h + xor (bit5LUT0^bit5LUT1)>>8 + ld h,a + add a,(bit4LUT0-bit5LUT0)>>8 + ld d,a + ld l,(ix-107-15) + ld a,(hl) + rrca + rrca + and %11000000 + ld c,a + ld l,(ix+107+15) + ld a,(hl) + rrca + rrca + rrca + and %00000011 + or c + ld c,a + ld e,(ix) + ld a,(de) + add a,a + add a,a + or c + ld c,a +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($11),a + inc ix + inc ix + dec iyh + jr nz,_ + ld iyh,3 + dec ix +_ + djnz mono2loop2 + + pop ix + ld de,(107+15)*2 + add ix,de + + pop bc + inc c +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($10),a + push bc + push ix + ld iyh,iyl +mono2loop3: + ld a,h + xor (bit5LUT0^bit5LUT1)>>8 + ld h,a + ld l,(ix-107-15) + ld a,(hl) + rrca + rrca + rrca + and %11100000 + ld l,(ix) + or (hl) + ld c,a +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($11),a + inc ix + inc ix + dec iyh + jr nz,_ + ld iyh,3 + dec ix +_ + djnz mono2loop3 + + pop ix + ld de,107+15 + add ix,de + + pop bc + inc c + ld a,c + cp $2c + jp nz,mono2loop0 + + pop iy + pop ix + ret + +safecopy_gray_2_intermediate: + bit 0,(hl) + ret nz + ld a,2 + out (5),a + call safecopy_gray_2 + xor a + out (5),a + ret + +safecopy_gray_2: + push ix + + ld a,7 + out ($10),a + + ld hl,dithercount + dec (hl) + ld a,(hl) + jr nz,_ + ld (hl),3 +_ + cpl + ld ixl,a + ld ixh,(graydithers >> 8) - 1 + ld d,bit5LUT0 >> 8 + ld hl,bufferBase + ld c,$80 + +gray2loop0: + push af +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($10),a + + push hl + ld b,4 + inc c + +_ + in a,($10) + rla + jr c,-_ + ld a,$20 + out ($10),a + +gray2loop1: + push bc + ld a,(hl) + inc l + xor (hl) + ;Scaler pulls from *_*_**_* + and (ix-5) + xor (hl) + ld e,a + ld a,(de) + add a,a + add a,a + add a,a + ld bc,(107+15)*2-1 + add hl,bc + ld c,a + ld a,(hl) + inc l + xor (hl) + ;Scaler pulls from *_*_**_* + and (ix-4) + xor (hl) + ld e,a + ld a,(de) + rrca + rrca + ld e,a + and 7 + or c + out ($11),a + ld bc,(107+15)*2-1 + add hl,bc + ld a,(hl) + inc l + xor (hl) + ;Scaler pulls from _*_*_*_* + and (ix) + xor (hl) + ld b,bit4LUT0 >> 8 + ld c,a + ld a,(bc) + add a,a + add a,a + xor e + and %00111111 + xor e + ld bc,(107+15)*2-1 + add hl,bc + ld c,a + ld a,(hl) + inc l + xor (hl) + ;Scaler pulls from *_*_**_* + and (ix-4) + xor (hl) + ld e,a + ld a,(de) + rrca + rrca + rrca + ld e,a + and 3 + or c + out ($11),a + ld bc,(107+15)*2-1 + add hl,bc + ld a,(hl) + inc l + xor (hl) + ;Scaler pulls from *_*_**_* + and (ix-3) + xor (hl) + ld b,d + ld c,a + ld a,(bc) + xor e + and $1f + xor e + ld bc,(107+15)*2-1 + add hl,bc + pop bc + ld e,a +_ + in a,($10) + rla + jr c,-_ + ld a,e + out ($11),a + djnz gray2loop1 + pop hl + pop af + + inc ixl + jr nz,_ + ld ixl,-3 +_ + + cp ixl + jr z,_ + inc l + inc hl +_ + inc l + inc hl + + bit 6,c + jp z,gray2loop0 + + pop ix + +_ + in a,($10) + rla + jr c,-_ + ld a,5 + out ($10),a + +_ + in a,($10) + rla + jr c,-_ + ld a,$80 + out ($10),a + ret + + +safecopy_mono_3_intermediate: + ld a,2 + out (5),a + call safecopy_mono_3 + xor a + out (5),a + ret + +safecopy_mono_3: + ld hl,dithercount + dec (hl) + ld a,(hl) + jr nz,_ + ld (hl),4 +_ + ld d,bufferBase >> 8 + ld e,a + srl e + and 1 + add a,bit4LUT0 >> 8 + ld c,a + ld a,$21 + out ($10),a +_ + push de + push af + ld b,64 +_ + ld a,c + xor 1 + ld c,a + ld a,(de) + ld l,a + ld h,c + ld a,(hl) + add a,a + add a,a + add a,a + add a,a + ld hl,(bufferHeight) + add hl,de + ld l,(hl) + ld h,c + add a,(hl) + inc de + inc de + ld l,a +_ + in a,($10) + rla + jr c,-_ + ld a,l + out ($11),a + djnz --_ +_ + in a,($10) + rla + jr c,-_ + pop af + inc a + out ($10),a + ld hl,(bufferHeight) + add hl,hl + pop de + add hl,de + ex de,hl + cp $2b + jr nz,----_ + ret + +safecopy_gray_3_intermediate: + bit 0,(hl) + ret nz + ld a,2 + out (5),a + exx + push hl + exx + call safecopy_gray_3 + exx + pop hl + exx + xor a + out (5),a + ret + +safecopy_gray_3: + ld hl,dithercount + dec (hl) + jr nz,_ + ld (hl),6 +_ + ld a,(hl) + cp 4 + jr c,_ + sub 3 +_ + exx + ld h,graydithers >> 8 + ld l,a + exx + ld de,bufferBase + ld a,e + jr nc,_ + ld e,2 +_ + adc a,bit4LUT0 >> 8 + ld c,a + ld a,$21 + out ($10),a +gray3loop0: + push de + push af + ld b,64 +gray3loop1: + ld a,(de) + ld l,a + ld h,c + ld a,(hl) + add a,a + add a,a + add a,a + add a,a + ld hl,(bufferHeight) + add hl,de + ld l,(hl) + ld h,c + add a,(hl) + push af + + inc e + ld a,(de) + ld l,a + ld h,c + ld a,(hl) + add a,a + add a,a + add a,a + add a,a + ld hl,(bufferHeight) + add hl,de + ld l,(hl) + ld h,c + add a,(hl) + ld l,a + pop af + + xor l + exx + and (hl) + dec l + jr nz,$+4 + ld l,3 + exx + xor l + + inc de + inc e + inc de + out ($11),a + djnz gray3loop1 +_ + in a,($10) + rla + jr c,-_ + pop af + inc a + out ($10),a + ld hl,(bufferHeight) + add hl,hl + pop de + add hl,de + ex de,hl + cp $2b + jr nz,gray3loop0 + ret + +clear_screen_edges: + in a,($10) + rla + jr c,clear_screen_edges + ld a,$80 + out ($10),a + +_ + in a,($10) + rla + jr c,-_ + ld a,$20 + out ($10),a + + ld b,64 +_ + in a,($10) + rla + jr c,-_ + xor a + out ($11),a + djnz -_ + +_ + in a,($10) + rla + jr c,-_ + ld a,$2B + out ($10),a + + ld b,64 +_ + in a,($10) + rla + jr c,-_ + xor a + out ($11),a + djnz -_ + + ret + +rastercolumnend: + exx + pop de + dec b + exx + pop hl + pop bc + ret z + inc l + ld a,l + and $1f + jp nz,rasterloop0 + ld a,l + sub $20 + ld l,a + jp rasterloop0 + +preparewindow: + ;Generate the optimized rastering code + ld a,(WX_backup) + sub (ix-vars+offsetX) + cpl + ld e,a + push af + call prepareraster + + ;Get the drawing mask + pop af + and 7 + ld b,a + ld a,$ff + jr z,++_ +_ + add a,a + djnz -_ +_ + cpl + exx + ld c,a + exx + + ld a,(windowLine) + ld l,a + ;Put the tile row in B + and 7 + ld b,a + + ;Get the pointer to the start of row in DE + xor l + ld d,$98 >> 2 + add a,a + rl d + add a,a + rl d + ld e,a + + ;Add the number of lines displayed to the windowLine counter + ld a,(LY) + sub (ix-vars+myLY) + add a,l + ld (windowLine),a + + ;Clip, or else get the row to display on and return the pointer in DE and rows to draw in C + ld a,(screenheight) + add a,(ix-vars+offsetY) + ld c,a + ld a,(myLY) + ld h,a + sub c + ret nc + add a,(ix-vars+screenHeight) + ld l,a + ld a,(LY) + cp c + jr c,_ + ld a,c +_ + sub h + ret z + ld c,a + ld a,(displayFlags) + rra + ld a,l + exx + ld h,bufferBase >> 8 + jr nc,_ + add a,a + jr nc,_ + inc h + or a +_ + ld l,a + ld de,(bufferHeight) + sbc hl,de + + ;Now get the window X offset (slightly complicated by the fact that the view window can be scrolled) + ld b,(ix-vars+screenWidth) + ld a,(WX_backup) + sub (ix-vars+offsetX) + jr c,shift_window + ;If the offset is positive, then we just add an offset times the bufferHeight to DE. Also get the display width in B. + sub 8 + jr c,++_ +_ + add hl,de + dec b + ret z + sub 8 + jr nc,-_ +_ + ex de,hl + exx + ret + +shift_window: + ;If the window starts to the left of the screen, we add an offset to the starting tile. + ex de,hl + cpl + rra + rra + rra + and $1F + inc a + exx + add a,e + ld e,a + jr nc,_ + inc d +_ + scf + ret + + +preparetilemap: + ;Generate the optimized rastering code + ld e,(ix-vars+mySCX) + call prepareraster + + ;Get the drawing mask + ld hl,(mySCY) + ld a,h + and 7 + ld b,a + ld a,$ff + jr z,++_ +_ + add a,a + djnz -_ +_ + cpl + exx + ld c,a + exx + + ;Divide X position by 8 + srl h + srl h + srl h + ;Add the line number to the Y position + ld a,(myLY) + add a,l + ld l,a + ;Put the tile row in B + and 7 + ld b,a + + ;Get the tile pointer in DE + xor l + ld d,$98 >> 2 + add a,a + rl d + add a,a + rl d + add a,h + ld e,a + + ;Clip, or else get the row to display on and return the pointer in DE and rows to draw in C + ld a,(screenheight) + add a,(ix-vars+offsetY) + ld c,a + ld a,(myLY) + ld h,a + sub c + ret nc + add a,(ix-vars+screenHeight) + ld l,a + ld a,(LY) + cp c + jr c,_ + ld a,c +_ + sub h + ret z + ld c,a + ld a,(displayFlags) + rra + ld a,l + exx + ld h,bufferBase >> 8 + jr nc,_ + add a,a + jr nc,_ + inc h + or a +_ + ld l,a + ld de,(bufferHeight) + sbc hl,de + ex de,hl + exx + scf + ret + + + ;Input: E = x position of tilemap (for rotation mod) +prepareraster: + ld a,(BGP_backup) + ld l,a + bit 1,(ix-vars+displayFlags) + jr z,_ + rla + or l + ld l,a +_ + bit 2,(ix-vars+displayFlags) + jr z,_ + rla + and l + ld l,a +_ + ld h,bit4LUT1 >> 8 + ld a,(hl) + inc a + ld hl,tmpalettes + ld b,0 +_ + ld c,(hl) + inc hl + dec a + jr z,_ + add hl,bc + jr -_ +_ + ld a,e + push af + ld de,rasterloop2 + ldir + + ex de,hl + and 7 + jr z,++_ + bit 2,a + jr z,_ + or $f8 + ld (hl),$0f ;rrca + inc hl + inc a + jr nz,$-4 + jr ++_ +_ + ld b,a + ld (hl),$07 ;rlca + inc hl + djnz $-3 +_ + + ld a,(displayFlags) + rra + jr nc,no_gray_raster + + ex de,hl + ld hl,rastercodegray + ld bc,rastercodegraysize + ldir + + ld hl,(BGP_backup) + ld h,bit4LUT0 >> 8 + ld a,(hl) + inc a + ld hl,tmpalettes + ld b,0 +_ + ld c,(hl) + inc hl + dec a + jr z,_ + add hl,bc + jr -_ +_ + ldir + + ex de,hl + pop af + and 7 + jr z,++_ + bit 2,a + jr z,_ + or $f8 + ld (hl),$0f ;rrca + inc hl + inc a + jr nz,$-4 + jr ++_ +_ + ld b,a + ld (hl),$07 ;rlca + inc hl + djnz $-3 +_ + + push af +no_gray_raster: + pop af + ex de,hl + ld hl,rastercode1 + ld bc,rastercode1size + ldir + + ld a,rasterloop2-1 & $ff + sub e + ld (de),a + inc de + + ;ld hl,rastercode2 + ld bc,rastercode2size + ldir + ret + +rastercode1: + inc l + exx + ld (de),a + xor (hl) + and c + xor (hl) + ld (hl),a + inc de + inc hl + exx + .db $10 ;djnz rasterloop2 +rastercode1size = $-rastercode1 + +rastercode2: + ld a,e + add a,$20 + ld l,a + ld a,d + jr nc,_ + inc a + xor d + and %00000011 + xor d +_ + ld h,a + ld b,8 + xor a + cp c + jp nz,rasterloop1 + jp rastercolumnend +rastercode2size = $-rastercode2 + +rastercodegray: + dec l + exx + ld (de),a + xor (hl) + and c + xor (hl) + ld (hl),a + inc e + inc l + exx +rastercodegraysize = $-rastercodegray + +tmpalettes: +#comment + .db 1 + xor a + + .db 3 + ld a,l + or h + cpl + + .db 3 + ld a,h + cpl + and l + + .db 2 + ld a,h + cpl + + .db 3 + ld a,l + cpl + and h + + .db 2 + ld a,l + cpl + + .db 2 + ld a,l + xor h + + .db 3 + ld a,l + and h + cpl + + .db 2 + ld a,l + and h + + .db 3 + ld a,l + xor h + cpl + + .db 1 + ld a,l + + .db 3 + ld a,h + cpl + or l + + .db 1 + ld a,h + + .db 3 + ld a,l + cpl + or h + + .db 2 + ld a,l + or h + + .db 2 + ld a,$FF +#endcomment +;#comment + .db 2 + xor a + inc l + + .db 4 + ld a,(hl) + inc l + or (hl) + cpl + + .db 5 + ld a,(hl) + inc l + cpl + or (hl) + cpl + + .db 3 + inc l + ld a,(hl) + cpl + + .db 4 + ld a,(hl) + inc l + cpl + and (hl) + + .db 3 + ld a,(hl) + inc l + cpl + + .db 3 + ld a,(hl) + inc l + xor (hl) + + .db 4 + ld a,(hl) + inc l + and (hl) + cpl + + .db 3 + ld a,(hl) + inc l + and (hl) + + .db 4 + ld a,(hl) + inc l + xor (hl) + cpl + + .db 2 + ld a,(hl) + inc l + + .db 5 + ld a,(hl) + inc l + cpl + and (hl) + cpl + + .db 2 + inc l + ld a,(hl) + + .db 4 + ld a,(hl) + inc l + cpl + or (hl) + + .db 3 + ld a,(hl) + inc l + or (hl) + + .db 3 + ld a,$ff + inc l +;#endcomment + +draw_sprites: + ld a,(sprite_detect) + and 2 + ret z + xor a + ld (sprite_detect),a + ld hl,$FE9C + ld a,(screenHeight) + add a,16 + ld c,a + ld a,(screenWidth) + add a,a + add a,a + add a,a + ld b,a + jr ++_ +draw_next_sprite: + pop bc +draw_next_sprite_1: + pop hl +draw_next_sprite_2: + ld a,l + cp $A0 + jr nz,_ + pop af +_ + sub 4 + ld l,a + ret c + +_ + ld a,(hl) + sub (ix-vars+offsetY) + cp c + jr nc,draw_next_sprite_2 + + ld d,9 + bit 2,(ix-vars+LCDC_backup) + jr z,_ + ld d,1 +_ + sub d + jr c,draw_next_sprite_2 + + push hl + inc hl + + ld d,bufferBase >> 8 + bit 0,(ix-vars+displayFlags) + jr z,_ + scf + adc a,a + jr nc,_ + inc d +_ + ld e,a + + ld a,(hl) + sub (ix-vars+offsetX) + jr z,draw_next_sprite_1 + cp b + jr nc,draw_next_sprite_1 + + push bc + inc hl + push hl + ld hl,(bufferHeight) + ex de,hl + + sub 8 + jr c,++_ +_ + add hl,de + sub 8 + jr nc,-_ +_ + ex de,hl + + ld c,a + exx + add a,(rotLUT >> 8) + 8 + ld b,a + xor 7 + inc a + and %11110111 + ld d,a + exx + ld a,$FF +_ + add a,a + inc c + jr nz,-_ + ld iyh,a + cpl + ld iyl,a + + pop hl + ld a,(hl) + exx + ld h,tileLUT >> 8 + ld l,a + ld a,(LCDC_backup) + bit 2,a + jr z,_ + res 0,l +_ + bit 4,a + ld a,(hl) + jr nz,_ + exx + ld a,l + exx + cp $A0 + ld a,(hl) + jr c,_ + dec h + dec h +_ + inc h + ld h,(hl) + ld l,a + exx + + inc hl + + ld a,(LCDC_backup) + add a,a + and 8 + add a,8 + ld b,a + + ld a,$2c ;inc l + bit 6,(hl) + jr nz,_ + ld a,b + dec a + add a,a + exx + add a,l + ld l,a + exx + ld a,$2d ;dec l +_ + ld (sprite_flip_smc),a + ld (sprite_flip_smc+1),a + + bit 7,(hl) + jr z,_ + ld a,sprite_priority_start & $FF + ld (sprite_next_smc),a + ld a,sprite_priority_start >> 8 + ld (sprite_next_smc+1),a +_ + + bit 5,(hl) + jr z,_ + exx + res 4,b + ld d,b + set 3,d + exx +_ + + bit 4,(hl) + ld a,l + ld hl,(OBP0) + jr z,_ + ld hl,(OBP1) +_ + cp $A0 + jr c,_ + ld hl,(BGP) +_ + + sub 3 + cp (ix-vars+sprite_to_track) + jr nz,_ + ld a,(sprite_track_count) + dec a + jr z,_ + ld (sprite_track_count),a + rra + rra + jr c,_ + ld a,l + cpl + ld l,a +_ + + bit 1,(ix-vars+displayFlags) + jr z,_ + ld a,l + rla + or l + ld l,a +_ + bit 2,(ix-vars+displayFlags) + jr z,_ + ld a,l + rla + and l + ld l,a +_ + ld h,bit4LUT1 >> 8 + push hl + ld a,(hl) + ld hl,spritepaletteLUT + and $0E + add a,l + ld l,a + jr nc,_ + inc h +_ + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (sprite_palette_smc),hl + pop hl + + ld a,(displayFlags) + rra + jr c,_ + + ld hl,(bufferHeight) + xor a + sub l + ld l,a + sbc a,a + sub h + ld h,a + add hl,de + + ld a,spriteloop - (sprite_loop_smc + 1) + ld (sprite_loop_smc),a + jp spriteloop + +_ + dec h + ld a,(hl) + ld hl,spritepaletteLUT + and $0E + add a,l + ld l,a + jr nc,_ + inc h +_ + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (sprite_palette_smc_gray),hl + + ld hl,(bufferHeight) + xor a + sub l + ld l,a + sbc a,a + sub h + ld h,a + add hl,de + + ld a,spriteloop_gray - (sprite_loop_smc + 1) + ld (sprite_loop_smc),a + jp spriteloop_gray + +sprite_priority_start: + pop hl + pop de + ld a,e + push af + push hl + + ld a,(de) + add a,(ix-vars+SCY_backup) + or 7 + inc a + ld c,a + inc e + ld a,(de) + add a,(ix-vars+SCX_backup) + or 7 + inc a + ld b,a + + ld de,$FEA0 +sprite_priority_loop: + ld a,c + sub (ix-vars+SCY_backup) + ld (de),a + inc e + + ld a,b + sub (ix-vars+SCX_backup) + ld (de),a + inc e + + ld a,c + sub 16 + ld l,a + ld h,$98 >> 2 + bit 3,(ix-vars+LCDC_backup) + jr z,$+3 + inc h + add hl,hl + add hl,hl + ld a,b + sub 8 + rrca + rrca + rrca + or l + ld l,a + + ld a,(hl) + ld (de),a + inc e + xor a + ld (de),a + inc e + + ld a,c + sub (ix-vars+SCY_backup) + ld (de),a + inc e + + ld a,b + sub (ix-vars+SCX_backup) + sub 8 + ld (de),a + inc e + + ld a,l + dec a + xor l + and %00011111 + xor l + ld l,a + + ld a,(hl) + ld (de),a + inc e + xor a + ld (de),a + inc e + + ld a,c + sub 8 + ld c,a + + bit 2,(ix-vars+LCDC_backup) + ld a,$B0 + jr z,_ + ld a,$B8 +_ + cp e + jr nz,sprite_priority_loop + + ex de,hl + ex (sp),hl + push hl + ld hl,draw_next_sprite + ld (sprite_next_smc),hl + jp (hl) + + + +spritepalette000: + ld c,a + ld a,(hl) + inc l + or (hl) + dec l + cpl + and c + ret + +spritepalette001: + or (hl) + cpl + inc l + or (hl) + dec l + cpl + ret + +spritepalette010: + inc l + or (hl) + dec l + cpl + or (hl) + cpl + ret + +spritepalette011: + ld c,a + ld a,(hl) + inc l + or (hl) + cpl + and c + xor (hl) + dec l + xor (hl) + ret + +spritepalette100: + or (hl) + inc l + or (hl) + xor (hl) + dec l + xor (hl) + ret + +spritepalette101: + ld c,a + inc l + ld a,(hl) + dec l + cpl + and c + or (hl) + ret + +spritepalette110: + ld c,a + ld a,(hl) + cpl + and c + inc l + or (hl) + dec l + ret + +spritepalette111: + or (hl) + inc l + or (hl) + dec l + ret + +spritepaletteLUT: + .dw spritepalette000 + .dw spritepalette001 + .dw spritepalette010 + .dw spritepalette011 + .dw spritepalette100 + .dw spritepalette101 + .dw spritepalette110 + .dw spritepalette111 + +set_frameskip: + ld b,3+1 + rra + jr nc,frameskip_set + ld b,6+1 + rra + jr nc,frameskip_set + ld b,9+1 + rra + jr nc,frameskip_set + ld a,$F7 + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + ld b,2+1 + rra + rra + jr nc,frameskip_set + ld b,5+1 + rra + jr nc,frameskip_set + ld b,8+1 + rra + jr nc,frameskip_set + ld a,$EF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + ld b,0+1 + rra + jr nc,frameskip_set + inc b ;ld b,1+1 + rra + jr nc,frameskip_set + ld b,4+1 + rra + jr nc,frameskip_set + ld b,7+1 + rra + ret c +frameskip_set: + ld a,b + ld (frameskip),a + ret + +move_view: + ld a,$FF + out (1),a + ld a,$FB + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + rra + jr nc,set_frameskip + + ld a,$FF + out (1),a + ld a,$F7 + out (1),a + ex (sp),hl + ex (sp),hl + ld a,(decimalSave) + ld b,a + in a,(1) + ld (decimalSave),a + bit 2,a + jr z,++_ + cpl + and b + rra + jr nc,+++_ +_ + ld a,(sprite_to_track) + add a,4 + ld (sprite_to_track),a + + cp $A0 + jr z,trackingOff + + ld h,$FE + ld l,a + ld a,(hl) + dec a + cp 144 + 7 + jr nc,-_ + inc l + ld a,(hl) + dec a + cp 160 + 7 + jr nc,-_ + + ld (ix-vars+sprite_track_count),20 +_ + ld a,(screenheight) + srl a + add a,8 + ld (trackoffsetY),a + + ld a,(screenwidth) + dec a + add a,a + add a,a + ld (trackoffsetX),a +_ + + ld a,$FF + out (1),a + ld a,$EF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + rra + jr c,_ +trackingOff: + ld a,-4 + ld (sprite_to_track),a +_ + + ld a,(sprite_to_track) + cp -4 + jp z,not_tracking + + ld h,$FE + ld l,a + ld a,(hl) + dec a + cp 144 + 7 + jr nc,not_tracking + inc l + ld a,(hl) + dec a + cp 160 + 7 + jr nc,not_tracking + + ld a,$FF + out (1),a + ld a,$E3 + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + ld h,a + + ld a,(trackoffsetY) + + bit 1,h + jr nz,_ + sub 2 +_ + + bit 3,h + jr nz,_ + add a,2 +_ + + ld (trackoffsetY),a + + ld a,$FF + out (1),a + ld a,$FB + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + + cpl + and %00001110 + jr z,_ + ld a,(trackoffsetX) + sub 2 + ld (trackoffsetX),a +_ + + ld a,$FF + out (1),a + ld a,$EF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + + cpl + and %00001110 + jr z,_ + ld a,(trackoffsetX) + add a,2 + ld (trackoffsetX),a +_ + + ld hl,(sprite_to_track) + ld h,$FE + ld a,(hl) + ld b,(ix-vars+trackoffsetY) + sub b + bit 7,b + jr nz,_ + jr nc,_ + xor a +_ + ld (offsetYFake),a + + inc l + ld a,(hl) + ld b,(ix-vars+trackoffsetX) + sub b + bit 7,b + jr nz,_ + jr nc,_ + xor a +_ + ld (offsetXFake),a + jp bound_view + + +not_tracking: + ld b,1 + + ld a,$FF + out (1),a + ld a,$E3 + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + ld h,a + + bit 1,h + call z,move_view_down + + bit 3,h + call z,move_view_up + + ld a,$FF + out (1),a + ld a,$FB + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + + cpl + and %00001110 + call nz,move_view_right + + ld a,$FF + out (1),a + ld a,$EF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + + cpl + and %00001110 + call nz,move_view_left + ret + + +move_view_up: + ld a,(offsetYFake) + sub b + jr nc,_ + xor a +_ + ld (offsetYFake),a + ret + +move_view_left: + ld a,(offsetXFake) + sub b + jr nc,_ + xor a +_ + ld (offsetXFake),a + ret + +move_view_down: + ld a,144 + sub (ix-vars+screenheight) + ld c,a + ld a,(offsetYFake) + add a,b + cp c + jr c,_ + ld a,c +_ + ld (offsetYFake),a + ret + +move_view_right: + ld a,(screenwidth) + add a,a + add a,a + add a,a + cpl + add a,169 + ld c,a + ld a,(offsetXFake) + add a,b + cp c + jr c,_ + ld a,c +_ + ld (offsetXFake),a + ret + +bound_view: + ld a,(displayFlagsFake) + rlca + rlca + rlca + and 6 + ld hl,view_bounds + add a,l + ld l,a + jr nc,$+3 + inc h + + ;ld a,(screenwidth) + ;add a,a + ;add a,a + ;add a,a + ;cpl + ;add a,169 + + ld a,(hl) + cp (ix-vars+offsetXFake) + jr nc,_ + ld (offsetXFake),a +_ + + ;ld a,144 + ;sub (ix-vars+screenheight) + + inc hl + ld a,(hl) + + cp (ix-vars+offsetYFake) + ret nc + ld (offsetYFake),a + ret + +view_bounds: + .db 160 - 96, 144 - 64 + .db 160 - 128, 144 - 86 + .db 160 - 160, 144 - 107 + .db 160 - 160, 144 - 128 + +getAllMyKeys: + call set_zoom + call move_view + + ld hl,$FFFF + ld a,l + out (1),a + ;Get arrow keys + dec a + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + + rra + jr c,$+4 + res 3,l + + rra + jr c,$+4 + res 1,l + + rra + jr c,$+11 + bit 1,l + jr nz,$+6 + set 1,l + jr $+3 + dec l + + rra + jr c,$+12 + bit 3,l + jr nz,$+6 + set 3,l + jr $+4 + res 2,l + + ;Get A,B,SELECT,START + ;Aka 2ND,ALPHA,XT0n,MODE + ld a,$BF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + rla + rla + ;START/MODE + jr c,$+4 + res 3,h + rla + ;A/2ND + jr c,$+4 + res 0,h + + ld a,$FF + out (1),a + ld a,$EF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + rla + ;SELECT/XT0n + jr c,$+4 + res 2,h + + ld a,$FF + out (1),a + ld a,$DF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + ;B/ALPHA + rla + jr c,$+4 + res 1,h + + ld (keys),hl + + ld a,$FF + out (1),a + ld a,$F7 + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + rla + jp nc,toggleSound + ret + +set_zoom: + ld a,$FF + out (1),a + ld a,$FD + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + ld b,(ix-vars+keySave) + ld (keySave),a + cpl + and b + ld b,a + + ld hl,mycontrast + ld a,(hl) + bit 3,(ix-vars+keySave) + jr nz,_ + inc a + ret z + ld (hl),a + out ($10),a + ret +_ + bit 4,(ix-vars+keysave) + jr nz,_ + dec a + cp $D8 + ret c + ld (hl),a + out ($10),a + ret +_ + + push bc + bit 6,b + call nz,go_sleep + pop bc + +; bit 5,b +; jr z,_ +; ld a,(gpu_delay_smc) +; xor 5^2 +; ld (gpu_delay_smc),a +;_ + + ld hl,displayFlagsFake + ld a,(hl) + bit 1,b + jr z,_ + sub %01000000 + ret c + ld (hl),a + rlca + rlca + rlca + and 6 + ld hl,trackzoomoffsets + add a,l + ld l,a + jr nc,$+3 + inc h + ld a,(trackoffsetX) + sub (hl) + ld (trackoffsetX),a + ld a,(offsetXFake) + add a,(hl) + ld (offsetXFake),a + inc hl + ld a,(trackoffsetY) + sub (hl) + ld (trackoffsetY),a + ld a,(offsetYFake) + add a,(hl) + ld (offsetYFake),a + jp bound_view +_ + bit 2,b + jr z,_ + add a,%01000000 + ret c + ld (hl),a + rlca + rlca + rlca + and 6 + ld hl,trackzoomoffsets-2 + add a,l + ld l,a + jr nc,$+3 + inc h + ld a,(trackoffsetX) + add a,(hl) + ld (trackoffsetX),a + ld a,(offsetXFake) + sub (hl) + jr nc,$+3 + xor a + ld (offsetXFake),a + inc hl + ld a,(trackoffsetY) + add a,(hl) + ld (trackoffsetY),a + ld a,(offsetYFake) + sub (hl) + jr nc,$+3 + xor a + ld (offsetYFake),a + jp bound_view +_ + + ld a,$FF + out (1),a + ld a,$BF + out (1),a + ex (sp),hl + ex (sp),hl + in a,(1) + + rra + jr c,_ + ld a,(hl) + and %11111000 + inc a + ld (hl),a + ret +_ + rra + jr c,_ + ld a,(hl) + and %11111000 + or %00000010 + ld (hl),a + ret +_ + rra + jr c,_ + ld a,(hl) + and %11111000 + ld (hl),a + ret +_ + rra + ret c + ld a,(hl) + and %11111000 + or %00000100 + ld (hl),a + ret + +trackzoomoffsets: + .db (128-96)/2, (86-64)/2 + .db (160-128)/2, (107-86)/2 + .db (160-160)/2, (128-107)/2 + + ;Input: B=(displayFlags) +update_zoom_vars: + ld a,2 + out (5),a + dec a + out ($10),a + ld (ditherCount),a + + ld a,b + rlca + rlca + and 7 + ld b,a + jr nz,_ + ;Zoom 0 mono + ld hl,13*256 + 64 + ld (screenHeight),hl + ld hl,64 + 15 + ld (bufferHeight),hl + ld hl,safecopy_mono_0 + ld (screenCopy+1),hl + ld hl,safecopy_mono_0_intermediate + ld (intermediateFrame+1),hl + ret +_ + djnz _ + ;Zoom 1 mono + ld hl,17*256 + 86 + ld (screenHeight),hl + ld hl,86 + 15 + ld (bufferHeight),hl + ld hl,safecopy_mono_1 + ld (screenCopy+1),hl + ld hl,safecopy_mono_1_intermediate + ld (intermediateFrame+1),hl + in a,($10) + rla + jr c,$-3 + xor a + out ($10),a + ret +_ + djnz _ + ;Zoom 2 mono + ld hl,21*256 + 107 + ld (screenHeight),hl + ld hl,107 + 15 + ld (bufferHeight),hl + ld hl,safecopy_mono_2 + ld (screenCopy+1),hl + ld hl,safecopy_mono_2_intermediate + ld (intermediateFrame+1),hl + ret +_ + djnz _ + ;Zoom 3 mono + ld hl,21*256 + 128 + ld (screenHeight),hl + ld hl,128 + 15 + ld (bufferHeight),hl + ld hl,safecopy_mono_3 + ld (screenCopy+1),hl + ld hl,safecopy_mono_3_intermediate + ld (intermediateFrame+1),hl + jp clear_screen_edges +_ + djnz _ + ;Zoom 0 gray + ld hl,13*256 + 64 + ld (screenHeight),hl + ld hl,(64 + 15) * 2 + ld (bufferHeight),hl + ld hl,safecopy_gray_0 + ld (screenCopy+1),hl + ld hl,safecopy_gray_0_intermediate + ld (intermediateFrame+1),hl + ret +_ + djnz _ + ;Zoom 1 gray + ld hl,17*256 + 86 + ld (screenHeight),hl + ld hl,(86 + 15) * 2 + ld (bufferHeight),hl + ld hl,safecopy_gray_1 + ld (screenCopy+1),hl + ld hl,safecopy_gray_1_intermediate + ld (intermediateFrame+1),hl + in a,($10) + rla + jr c,$-3 + xor a + out ($10),a + ret +_ + djnz _ + ;Zoom 2 gray + ld hl,21*256 + 107 + ld (screenHeight),hl + ld hl,(107 + 15) * 2 + ld (bufferHeight),hl + ld hl,safecopy_gray_2 + ld (screenCopy+1),hl + ld hl,safecopy_gray_2_intermediate + ld (intermediateFrame+1),hl + ret +_ + ;Zoom 3 gray + ld hl,21*256 + 128 + ld (screenHeight),hl + ld hl,(128 + 15)*2 + ld (bufferHeight),hl + ld hl,safecopy_gray_3 + ld (screenCopy+1),hl + ld hl,safecopy_gray_3_intermediate + ld (intermediateFrame+1),hl + jp clear_screen_edges \ No newline at end of file diff --git a/render_ram.z80 b/render_ram.z80 new file mode 100644 index 0000000..11def95 --- /dev/null +++ b/render_ram.z80 @@ -0,0 +1,136 @@ +spriteloop_gray: + ld a,(de) + xor (hl) + and iyh + xor (hl) + exx + ld c,a + ld a,(bc) +sprite_palette_smc_gray = $+1 + call 0 + ld e,a + ld a,(de) + exx + ld c,a + xor (hl) + and iyl + xor (hl) + ld (hl),a + ld a,(de) + xor c + and iyl + xor c + ld (de),a + dec e + dec l + +spriteloop: + ld a,(de) + xor (hl) + and iyh + xor (hl) + exx + ld c,a + ld a,(bc) +sprite_palette_smc = $+1 + call 0 +sprite_flip_smc: + inc l + inc l + ld e,a + ld a,(de) + exx + ld c,a + xor (hl) + and iyl + xor (hl) + ld (hl),a + ld a,(de) + xor c + and iyl + xor c + ld (de),a + dec de + dec hl +sprite_loop_smc = $+1 + djnz spriteloop +sprite_next_smc = $+1 + jp draw_next_sprite + +;Input: DE = pointer to first tile, DE' = pointer to buffer, B = row within tile, C = rows to draw, B' = columns to draw, C' = mask +rasterlines: + ex de,hl + ld a,8 + sub b + ld b,a +rasterloop0: + push bc + push hl + exx +bufferHeight = $+1 + ld hl,128 + 15 + add hl,de + ex de,hl + push de + exx + ld a,16 + sub b + sub b +rasterloop1: + ld e,(hl) + ld d,tileLUT >> 8 + ex de,hl + add a,(hl) +rastersmc1: + inc h + ld h,(hl) + ld l,a + ld a,c + sub b + jr nc,_ + ld b,c + xor a +_ + ld c,a +rasterloop2: + nop \ nop \ nop \ nop \ nop ;allow room for palette mod + nop \ nop \ nop \ nop ;allow room for rotation mod + dec l + exx + ld (de),a + xor (hl) + and c + xor (hl) + ld (hl),a + inc e + inc l + exx + nop \ nop \ nop \ nop \ nop ;allow room for second palette mod + nop \ nop \ nop \ nop ;allow room for second rotation mod + inc l + exx + ld (de),a + xor (hl) + and c + xor (hl) + ld (hl),a + inc de + inc hl + exx + djnz rasterloop2 + ld a,e + add a,$20 + ld l,a + ld a,d + jr nc,_ + inc a + xor d + and %00000011 + xor d +_ + ld h,a + ld b,8 + xor a + cp c + jp nz,0 ;rasterloop1 + jp 0 ;rastercolumnend \ No newline at end of file diff --git a/setup.z80 b/setup.z80 new file mode 100644 index 0000000..6af1e86 --- /dev/null +++ b/setup.z80 @@ -0,0 +1,195 @@ +setup: + ld a,2 + out (5),a + ld hl,render_ram_code + ld de,render_ram_code_start + ld bc,render_ram_code_size + ldir + + xor a + out (5),a + ld hl,$E000-1 + ld de,page3code + ld bc,page3codesize + 1 + or a ;sound off + call decompress_page3code + + ld hl,TimerInterruptBackup + ld de,TimerInterruptReplacement + ld bc,16 + ldir + + ld a,(maxRamPage) + add a,$81 + ld (firstInvalidRamPage),a + + ld a,(contrast) + add a,$D8 + ld (mycontrast),a + ld a,(CartridgeType) + ld (mbc),a + + ld a,$80 + out ($10),a + out ($28),a + ld a,$10 + out ($27),a + + ld a,im2lut >> 8 + ld i,a + im 2 + xor a + out (4),a + inc a + out (3),a + + ld a,$44 + out ($36),a + ld a,2 + out ($37),a + dec a + out ($38),a + + ld hl,hiram_init + ld de,$ff00 + ld bc,$0100 + ldir + ld hl,$8000 + ld (soundOutputs),hl + + ld c,$8F + call DisplayNintendo + + ld hl,$8000 + ld de,$8001 + ld bc,$1FFF + ld (hl),l + ldir + + ld a,5 + out ($10),a + + call clear_screen_edges + (rompage3code - $4000) + + ld a,3 + out ($20),a + ld a,$0c + out ($2c),a + + ld c,0 + ld de,(opcodetable_B & $FF00) + (opcodetable >> 8) + ld iy,$FFFE + ld sp,$0100 + + ld a,200 + out ($38),a + + ld a,1 + ex af,af' + + in a,(6) + ld (basepage),a + dec a + jp setcartrom_abs + + ;Inputs: NC=sound off, C=sound on + ; HL=output location minus 1 + ; DE=location of compressed code + ; BC=size of compressed code plus 1 +decompress_page3code: + push af +decompressloop1: + cpi + jp po,decompressend + ex de,hl +decompressloop2: + ld a,(hl) + and %11100111 + cp $C7 + jr z,_ + ldi + jp pe,decompressloop2 +decompressend: + pop af + ret +_ + xor (hl) + inc hl + ex de,hl + jr nz,_ + pop af + push af + jr c,decompresswithsound + ld (hl),$E1 ;pop hl + inc hl + ld (hl),$44 ;ld b,h + inc hl + ld (hl),$62 ;ld h,d + inc hl + ld (hl),$66 ;ld h,(hl) + inc hl + ld (hl),$E9 ;jp (hl) + inc hl + ld (hl),$00 ;nop + inc hl + ld (hl),$00 ;nop + jr decompressloop1 +_ + cp $08 + jr nz,_ + ld (hl),$68 ;ld l,b + inc hl + ld (hl),$63 ;ld h,e + inc hl + ld (hl),$66 ;ld h,(hl) + inc hl + ld (hl),$E9 ;jp (hl) + jr decompressloop1 +_ + cp $10 + jr nz,_ +decompresswithsound: + ld (hl),$FB ;ei + inc hl + ld (hl),$E1 ;pop hl + inc hl + ld (hl),$F3 ;di + inc hl + ld (hl),$44 ;ld b,h + inc hl + ld (hl),$62 ;ld h,d + inc hl + ld (hl),$66 ;ld h,(hl) + inc hl + ld (hl),$E9 ;jp (hl) + jr decompressloop1 +_ + ld a,(de) + inc de + dec bc + ld (hl),$FD + inc hl + ld (hl),$FD +_ + inc hl + ld (hl),$FD + dec a + jr nz,-_ + jr decompressloop1 + +hiram_init: + .db 0,0,0,0,0,$00,$00,$00,0,0,0,0,0,0,0,0 + .db $80,$BF,$F3,0,$BF,0,$3F,$00,0,$BF,$7F,$FF,$9F,0,$BF,0 + .db $FF,$00,$00,$BF,$77,$F3,$F1,0,0,0,0,0,0,0,0,0 + .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .db $91,0,$00,$00,0,$00,0,$FC,$FF,$FF,$00,$00,0,0,0,0 + .block $b0 + +render_ram_code: + .org $DF00 +render_ram_code_start: + #include "render_ram.z80" +render_ram_code_size = $ - render_ram_code_start + .org render_ram_code + render_ram_code_size + + .echo "RAM-based render code: ", render_ram_code_size \ No newline at end of file diff --git a/splash.bmp b/splash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..86016cdc0871d75cb3fbcd0e24f65c7669a3403c GIT binary patch literal 830 zcmZwFL1+^}6b9gz%_Ny@!KT$#NX3+3OXw*OL{D`IsY+3ZYd4{u0zw1g#ehV-^tG;~ zMpQfmL?|heLtH^T2!a=b1eD%{77-5(;>m+24<3~DpGi%M_?EZ(@#f9U4!ha&vq91^ zi+c)LLR!cGE*%&@IMho61(m+<>!D@e|D}N&69thv)UyEFWptERGzA9*VsDeJ_4zljXyaW0+5LgWyqRRyo`-a(Jp>BpkfBXF(Kl{_o)B zL0z9{rA;T%uVZzRasvn6!KeH#(XFm=)umvYj;g(kluJiKPM}RIZB;KFck*dkomBl? zsOBY%bpjEmSQVIy^^MT!sft0&IIwWiWM3feyw1Xj-M6q8doE--);d#Q-jbd$^M|X} zCFW*2E6mdPGwTYog}FmCHf2e6*D4v;Y7T^Kl77&zOnM~Wx<{rlD##!LA=Z>aTknMm(NWX^NnWA?ws zB=nC=U{0fFviBJzoZaszAQ&m$XQsbA^_H}obEzku*Ls7VAKqN*JG_pb+*W4V`|x5( Uo2m2-f4uI;n2Kfe|Ll?e0O&>ILjV8( literal 0 HcmV?d00001 diff --git a/ti83small.inc b/ti83small.inc new file mode 100644 index 0000000..4424d15 --- /dev/null +++ b/ti83small.inc @@ -0,0 +1,35 @@ +#define bcall(xxxx) rst 28h \ .dw xxxx + +_JForceCmdNoChar .equ 4027h +_ChkFindSym .equ 42F1h +_EnoughMem .equ 42FDh +_PutC .equ 4504h +_DispHL .equ 4507h +_PutS .equ 450Ah +_ClrScrnFull .equ 4546h +_HomeUp .equ 4558h +_getkey .equ 4972h +_CreateAppVar .equ 4E6Ah +_FlashWriteDisable .equ 4F3Ch +_DelVarArc .equ 4FC6h +_Arc_Unarc .equ 4FD8h ;checks for low battery +_FindSwapSector .equ 5095h +_CopyFlashPage .equ 5098h +_FindAppNumPages .equ 509Bh + +arcInfo .equ 83EEh +contrast .equ 8447h +OP1 .equ 8478h +OP4 .equ 8499h +iMathPtr5 .equ 84DBh +onSP .equ 85BCh +saveSScreen .equ 86ECh +flags .equ 89F0h +pagedCount .equ 9834h +pagedBuf .equ 983Ah +appBackUpScreen .equ 9872h + +AppVarObj .equ 15h ;application variable + +previousEntriesMP .equ 977Eh +gbufMP .equ 9A7Eh \ No newline at end of file diff --git a/tiboyse.z80 b/tiboyse.z80 new file mode 100644 index 0000000..b2e5ac2 --- /dev/null +++ b/tiboyse.z80 @@ -0,0 +1,1554 @@ + #include ti83small.inc + #include app.inc + +mystack = $FF00 + +; No longer Ram Page 0 equates +; DrawBuffer is (A000-)A200-BC15 at the most + +; ROM Page 3 equates +bit5LUT0 = $5A00 ;5A00-5AFF +bit5LUT1 = $5B00 ;5B00-5BFF +bit6LUT0 = $5C00 ;5C00-5CFF +bit6LUT1 = $5D00 ;5D00-5DFF +bit4LUT0 = $5E00 ;5E00-5EFF +bit4LUT1 = $5F00 ;5F00-5FFF +rotflipLUT = $6000 ;6000-67FF +fliprotLUT = $6800 ;6800-6FFF +rotLUT = $7000 ;7000-77FF +tileLUT = $7900 ;7800-7AFF + +;GB IO equates +P1 = $ff00 +SB = $ff01 +SC = $ff02 +DIV = $ff04 +TIMA = $ff05 +TMA = $ff06 +TAC = $ff07 +IF = $ff0f + +NR10 = $ff10 +NR11 = $ff11 +NR12 = $ff12 +NR13 = $ff13 +NR14 = $ff14 + +NR21 = $ff16 +NR22 = $ff17 +NR23 = $ff18 +NR24 = $ff19 + +NR30 = $ff1a +NR31 = $ff1b +NR32 = $ff1c +NR33 = $ff1d +NR34 = $ff1e + +NR41 = $ff20 +NR42 = $ff21 +NR43 = $ff22 +NR44 = $ff23 + +NR50 = $ff24 +NR51 = $ff25 +NR52 = $ff26 + +WavePatternRAM = $ff30 + +LCDC = $ff40 +STAT = $ff41 +SCY = $ff42 +SCX = $ff43 +LY = $ff44 +LYC = $ff45 +DMA = $ff46 +BGP = $ff47 +OBP0 = $ff48 +OBP1 = $ff49 +WY = $ff4a +WX = $ff4b +IE = $ffff + +CartridgeName = $0134 + +;FlashUnlock = $7FF7 +;#define fast_write + + defpage(0, "") + + bcall(_ClrScrnFull) + bcall(_HomeUp) + + in a,(2) + rla + jp c,not_83_plus + + call AppPutS + .db "TI-Boy SE does " + .db "not run on the " + .db "original TI-83+." + .db 0 + bcall(_GetKey) + bcall(_JForceCmdNoChar) + +InstallationFailed: + ld sp,(onSP) + ei + push hl + call AppPutS + .db "TI-Boy could not" + .db "successfully " + .db "modify Flash. " + .db "Error: ",0 + pop hl + bcall(_DispHL) + bcall(_GetKey) + bcall(_JForceCmdNoChar) + +UnsupportedCartridge: + ld sp,(onSP) + ei + call AppPutS + .db "Cartridge type " + .db "is unsupported. " + .db "Sorry for the " + .db "inconvenience.",0 + bcall(_GetKey) + bcall(_JForceCmdNoChar) + +MemError: + ei + call AppPutS + .db "Not enough RAM " + .db "for save file. " + .db "Please have 8500" + .db "or more bytes " + .db "available.",0 + bcall(_GetKey) + bcall(_JForceCmdNoChar) + +not_83_plus: + di + ;ld a,3 + ;out ($20),a + ;ld a,$0c + ;out ($2c),a + + ld hl,WriteFlashCode + ld de,WriteFlash + ld bc,WriteFlashCodeSize + ldir + + call PutSplashScreen + + ld c,$87 + call DisplayNintendo + + ;Backup "previous entries" on OS 2.53MP to appbackupscreen + ld a,3 + out (5),a + ld hl,previousEntriesMP + $4000 + ld de,appBackUpScreen + ld bc,768 + ldir + xor a + out (5),a + + ;Get last app page + in a,(6) + bcall(_FindAppNumPages) + in a,(6) + sub c + inc a + ld (AppFinalPage),a + out (7),a + ;Get cartridge type + ld hl,($8147) + ;Get RAM size byte + ld a,($8149) + ld h,a + ld a,$81 + out (7),a + ld (CartridgeType),hl + ld a,h + cp 3 + jp z,loadappvar32K + or a + jr z,appvardone + +loadappvar8K: + ;Put appvar name into OP1 + ld hl,$4012 - 1 + rst 20h + ld a,AppVarObj + ld (OP1),a + + ld hl,OP1+9 + ld a,' ' +_ + ld (hl),0 + dec hl + cp (hl) + jr z,-_ + + bcall(_ChkFindSym) + jr c,appvar8Knotfound + + ld a,b + or a + jr z,appvar8Kdone + + ;Check for enough memory + ld hl,8500 + bcall(_EnoughMem) + jp c,MemError + + ;Unarchive appvar + bcall(_Arc_Unarc) + jr loadappvar8K + +appvar8Knotfound: + ;Check for enough memory + ld hl,8500 + bcall(_EnoughMem) + jp c,MemError + + ;Create appvar + ld hl,$2000 + bcall(_CreateAppVar) + +appvar8Kdone: + ;Put stack pointer in a place that won't corrupt when switching pages + ld sp,saveSScreen+768 + + ;Skip size bytes + inc de + inc de + ex de,hl + call LoadFile +appvardone: + + ;Put stack pointer in a place that won't corrupt when switching pages + ld sp,saveSScreen+768 + + ;Get the cartridge type + ld a,(CartridgeType) + cp $1F + jp nc,UnsupportedCartridge + ld hl,CartridgeLookup + add a,l + ld l,a + jr nc,$+3 + inc h + ld a,(hl) + or a + jp m,UnsupportedCartridge + ld (CartridgeType),a + + ;Back up RAM permissions + in a,($25) + ld l,a + in a,($26) + ld h,a + ld (RamPermissions),hl + + ;Unlock Flash + call UnlockFlash + + in a,(2) + and 4 + ld hl,0 + jp z,InstallationFailed + + call PatchPageCopy + ld hl,-1 + jp c,InstallationFailed + + ;Save the first byte of page 0, because it will be replaced by swap sector identifier + ld a,($0000) + ld (Byte0000),a + + ;Find the swap sector + bcall(_FindSwapSector) + ld (SwapSectorPage),a + + ;Erase the swap sector + ld b,a + call EraseSector + ld hl,1 + jp c,InstallationFailed + + ld c,$88 + call DisplayNintendo + + ;Copy contents of sector 00h to swap sector + ld a,(SwapSectorPage) + ld c,a + ld b,$00 + ld hl,SwapSectorIdentifier + call CopySector + ld hl,2 + jp c,InstallationFailed + + ld c,$89 + call DisplayNintendo + + ;Erase sector 00h + ld b,$00 + call EraseSector + ld hl,3 + jp c,InstallationFailed + + ld c,$8A + call DisplayNintendo + + ;Backup first 16KB of RAM to flash page 1 + ld hl,$4000 + ld a,$01 + ld de,$8000 + ld b,h + ld c,l + call WriteFlash + ld hl,4 + jp c,InstallationFailed + + ;Backup last 16KB of RAM to flash page 2 + ld hl,$4000 + ld a,$02 + ld de,$C000 + ld b,h + ld c,l + call WriteFlash + ld hl,5 + jp c,InstallationFailed + + ld c,$8B + call DisplayNintendo + + ;Copy the gameboy rom page to flash page 0 + ld a,(AppFinalPage) + out (7),a + ld hl,$8000 + ld de,$C000 + ld bc,$2000 + ldir + ld a,$81 + out (7),a + ;Save the timer interrupt routine + ld hl,$C050 + ld de,TimerInterruptBackup + ld bc,16 + ldir + ;Write the reboot entry point + ld hl,RebootEntryCode + ld de,$C050 + ld bc,8 + ldir + ;Write the reboot code + ;ld hl,RebootCode + ld de,CartridgeName + $C000 + ld bc,RebootCodeSize + ldir + ;Write the page number + ;in a,(6) + ;ld (CartridgeName + $C00C),a + ;Make sure $0038 is not $FF + ld hl,$C038 + ld a,(hl) + inc a + jr nz,_ + ld (hl),$C3 + inc l + ld (hl),$53 + inc l + ld (hl),$00 +_ + ;Write the first half to rom + ld hl,$4000 + xor a + ld de,$C000 + ld bc,$2000 + call WriteFlash + ld a,(AppFinalPage) + out (7),a + ld hl,$A000 + ld de,$C000 + ld bc,$2000-96 + ldir + ld a,$81 + out (7),a + ld hl,$8000-96 + ld bc,96 + ldir + ld hl,$6000 + xor a + ld de,$C000 + ld bc,$2000 + call WriteFlash + + ld c,$8C + call DisplayNintendo + + ;Copy first 8KB of the save file from ram page 2 to ram page 1 + ld a,2 + out (5),a + ld hl,$C000 + ld de,$A000 + ld bc,$2000 + ldir + + ;Copy code temporarily to ram page 0 + xor a + out (5),a + ld hl,rompage3code + ld de,$C000 + ld bc,rompage3codesize + ldir + + ;Generate LUTs temporarily on ram page 0 + ld hl,tileLUT + $8000 + xor a +_ + ld (hl),a + add a,16 + inc l + jr nz,-_ + + inc h + ld b,$7f +_ + ld a,l + and 15 + jr nz,$+3 + inc b + ld (hl),b + inc l + jr nz,-_ + + ld hl,tileLUT - 128 + $8000 + ld b,$87 +_ + ld a,l + and 15 + jr nz,$+3 + inc b + ld (hl),b + inc l + jp po,-_ + + ld hl,bit4LUT0 + $8000 +_ + xor a + rlc l \ rlc l \ rla + rlc l \ rlc l \ rla + rlc l \ rlc l \ rla + rlc l \ rlc l \ rla + ld (hl),a + inc l + jr nz,-_ + + inc h +_ + xor a + rlc l \ rla \ rlc l + rlc l \ rla \ rlc l + rlc l \ rla \ rlc l + rlc l \ rla \ rlc l + ld (hl),a + inc l + jr nz,-_ + +_ + ld h,(rotflipLUT >> 8) + $80 + ld a,l + rrca + rrca + xor l + and %10101010 + xor l + ld b,a + rrca + rrca + rrca + rrca + xor b + and %01100110 + xor b + rrca + ld b,8 +_ + ld (hl),a + inc h + rrc l + djnz -_ + inc l + jr nz,--_ + +_ + ld h,(fliprotLUT >> 8) + $80 + ld a,l + rrca + rrca + xor l + and %10101010 + xor l + ld b,a + rrca + rrca + rrca + rrca + xor b + and %01100110 + xor b + rrca + ld b,8 +_ + ld (hl),a + inc h + rrca + djnz -_ + inc l + jr nz,--_ + +_ + ld h,(rotLUT >> 8) + $80 + ld a,l + ld b,8 +_ + ld (hl),a + inc h + rlca + djnz -_ + inc l + jr nz,--_ + + ld h,(bit6LUT0 >> 8) + $80 +_ + xor a + rlc l \ rla + rlc l \ rlc l \ rla + rlc l \ rla + rlc l \ rla + rlc l \ rlc l \ rla + rlc l \ rla + ld (hl),a + inc l + jr nz,-_ + + inc h +_ + xor a + rlc l \ rlc l \ rla + rlc l \ rla + rlc l \ rla + rlc l \ rlc l \ rla + rlc l \ rla + rlc l \ rla + ld (hl),a + inc l + jr nz,-_ + + ld h,(bit5LUT0 >> 8) + $80 +_ + xor a + rlc l \ rla + rlc l \ rlc l \ rla + rlc l \ rlc l \ rla + rlc l \ rla + rlc l \ rlc l \ rla + ld (hl),a + inc l + jr nz,-_ + + inc h +_ + xor a + rlc l \ rla + rlc l \ rla \ rlc l + rlc l \ rla \ rlc l + rlc l \ rla + rlc l \ rla \ rlc l + ld (hl),a + inc l + jr nz,-_ + + ld c,$8D + call DisplayNintendo + + ;Write the contents of RAM page 0 to ROM page 3 + ld hl,$4000 + ld a,$03 + ld de,$C000 + ld b,h + ld c,l + call WriteFlash + + ld c,$8E + call DisplayNintendo + + ;Make all RAM executable + xor a + out ($25),a + dec a + out ($26),a + + ;Lock Flash + call LockFlash + + + #include setup.z80 + +;EndlessLoop: +; in a,($10) +; rla +; jr c,EndlessLoop +; ld a,$FF \ out ($11),a +; jr EndlessLoop + +Recover: + xor a + out ($20),a + out ($27),a + out ($28),a + out ($36),a + out (0),a + + ld sp,saveSScreen+768 + + ;Copy save file from second 8KB of ram page 1 to first 8KB of ram page 2 + ld a,$81 + out (7),a + ld a,2 + out (5),a + ld hl,$A000 + ld de,$C000 + ld bc,$2000 + ldir + + ;Restore first 16KB of RAM from flash page 1 + ld a,1 + out (7),a + out (5),a + ld hl,$8000 + ld de,$C000 + ld bc,$4000 + ldir + + xor a + out (5),a + ld a,$81 + out (7),a + ; Get number of pages to save + ld a,(maxRamPageUsed) + inc a + ld (RamPagesToSave),a + ; Get last cartridge page mapped + ld a,(pageB) + ld (finalRamPageMapped),a + + ;Restore last 16KB of RAM from flash page 2 + ld a,2 + out (7),a + ld hl,$8000 + ld de,$C000 + ld bc,$4000 + ldir + ld a,$81 + out (7),a + + ;Unlock Flash + call UnlockFlash + + ;Erase sector 00h + ld b,00h + call EraseSector + jr c,$ + + ;Copy the swap sector to sector 00h + ld a,(SwapSectorPage) + ld b,a + ld c,$00 + ld hl,Byte0000 + call CopySector + + ;Restore RAM permissions + ld hl,(RamPermissions) + ld a,l + out ($25),a + ld a,h + out ($26),a + + ;Lock Flash + call LockFlash + + ld sp,(onSP) + ld iy,flags + + ;Check if TI-Boy bailed out because of insufficient RAMs + ld hl,(FinalRamPageMapped) + ld a,l + sub $81 + cp h + jp nc,ExtraRamMissing + + ;Copy save data to the save appvar(s) + ld a,(RamSize) + dec a + cp 2 + jr nc,++_ + call SaveAppvar8K + ld hl,$4012 - 1 + rst 20h + ld a,AppVarObj + ld (OP1),a + ld hl,OP1+9 + ld a,' ' +_ + ld (hl),0 + dec hl + cp (hl) + jr z,-_ + bcall(_Arc_Unarc) + jr ++_ +_ + call z,SaveAppvar32K +_ + + ;Restore "previous entries" on OS 2.53MP from appbackupscreen, and clear the 2.53MP buffer (located directly afterward) + ld a,3 + out (5),a + ld hl,appBackUpScreen + ld de,previousEntriesMP + $4000 + ld bc,768 + ldir + ld h,d + ld l,e + inc de + ld bc,767 + xor a + ld (hl),a + ldir + out (5),a + + ;Return + ld a,$0b + out (3),a + im 1 + ei + bcall(_JForceCmdNoChar) + +LoadAppvar32K: + ld hl,$8200 + ld a,h + out (7),a + ld (hl),a + inc a + out (7),a + ld (hl),a + dec a + out (7),a + cp (hl) + dec a + out (7),a + + ld a,2 + jr c,_ + add a,a +_ + ld (MaxRamPage),a + ld b,a + + ld hl,$4012 - 1 + rst 20h + ld a,appvarobj + ld (op1),a + ld hl,op1+8 + ld a,' ' +_ + ld (hl),0 + dec hl + cp (hl) + jr z,-_ + inc hl + ld (hl),'1' + xor a +LoadAppvar32KLoop: + push af + push bc + push hl + bcall(_chkfindsym) + pop hl + push hl + ex de,hl + jr nc,$+4 \ ld c,0 + call nc,LoadAppvarFromRamOrRom + pop hl + inc (hl) + pop af + ld b,a + pop af + or c + djnz LoadAppvar32KLoop + jp nz,AppVarDone + ld hl,8500 + bcall(_EnoughMem) + jp c,MemError + jp AppVarDone + +ExtraRamMissing: + ;Restore "previous entries" on OS 2.53MP from appbackupscreen, and clear the 2.53MP buffer (located directly afterward) + ld a,3 + out (5),a + ld hl,appBackUpScreen + ld de,previousEntriesMP + $4000 + ld bc,768 + ldir + ld h,d + ld l,e + inc de + ld bc,767 + xor a + ld (hl),a + ldir + out (5),a + + ;Return + ld a,$0b + out (3),a + im 1 + ei + bcall(_clrscrnfull) + call AppPutS + .db "This TI-84+(SE) " + .db "revision doesn't" + .db "have a RAM chip " + .db "large enough to " + .db "emulate this " + .db "cartridge. See " + .db "readme for info.",0 + bcall(_GetKey) + bcall(_JForceCmdNoChar) + +SaveAppvar32K: + ld hl,$4012 - 1 + rst 20h + ld a,appvarobj + ld (op1),a + ld hl,op1+8 + ld a,' ' +_ + ld (hl),0 + dec hl + cp (hl) + jr z,-_ + inc hl + ld (hl),'0' +SaveAppvar32KLoop1: + inc (hl) + push hl + bcall(_chkfindsym) + jr c,_ + bcall(_delvararc) + ;DelVarArc destroys (OP1), and TI never told anybody >_< + ld a,appvarobj + ld (OP1),a +_ + ld hl,RamPagesToSave + dec (hl) + pop hl + jr nz,SaveAppvar32KLoop1 +SaveAppvar32KLoop2: + push hl + ld hl,$2000 + bcall(_createappvar) + inc de + inc de + push de + ld hl,OP4 + rst 20h + pop de + pop hl + ld b,(hl) + push hl + call CopyToAppvar + bcall(_arc_unarc) + pop hl + dec (hl) + ld a,(hl) + cp '0' + jr nz,SaveAppvar32KLoop2 + ret + +AppPutS: + pop hl +_ + ld a,(hl) + inc hl + or a + jr z,_ + bcall(_PutC) + jr -_ +_ + jp (hl) + +PutSplashScreen: + ld hl,SplashScreen + ld de,$8020 +_ + in a,($10) + rla + jr c,-_ + ld a,7 + out ($10),a +PutSplashScreenRow: + ld c,$10 +_ + in a,(c) + jp m,-_ + out (c),d +_ + in a,(c) + jp m,-_ + out (c),e + ld bc,$0C11 +PutSplashScreenByte: +_ + in a,($10) + rla + jr c,-_ + outi + jr nz,PutSplashScreenByte + inc d + bit 6,d + jr z,PutSplashScreenRow + ret + +SplashScreen: + #include "splash.bmp" + +WriteFlashCode: + .org saveSScreen +WriteFlash: + ;DE = Source + ;AHL = Destination + ;BC = Length + ;Returns with carry set if failure + push af + in a,(6) + ld (backup_page),a + pop af + out (6),a + + #ifdef fast_write + ;Set fast write mode + ld a,$AA + ld ($AAA),a + ld a,$55 + ld ($555),a + ld a,$20 + ld ($AAA),a + #endif + +WriteFlashLoop: + #ifdef fast_write + ld (hl),$A0 + #else + ld a,$AA + ld ($AAA),a + ld a,$55 + ld ($555),a + ld a,$A0 + ld ($AAA),a + #endif + ld a,(de) + ld (hl),a + inc de + dec bc + and $80 + ld (WriteByteMSB),a +WriteByteWait: + ld a,(hl) +WriteByteMSB = $+1 + xor 0 + jp p,WriteByteDone + bit 5,a + jr z,WriteByteWait + scf + jr WriteByteFailure + +WriteByteDone: + inc hl + ld a,b + or c + jr nz,WriteFlashLoop + + ;Returns with carry reset due to "or" instruction + +WriteByteFailure: + ;assumes BC < 32768 (a quite valid assumption) + #ifdef fast_write + ;Reset from fast mode + ld a,$90 + ld (bc),a + #endif + ;Read/Reset + ld a,$F0 + ld (bc),a +backup_page = $+1 + ld a,0 + out (6),a + ret + +EraseSector: + ;B = a page in the sector + in a,(6) + push af + + ld a,b + out (6),a + + ld hl,$AAA + ld de,$555 + ld a,e + ld (hl),l + ld (de),a + ld (hl),$80 + ld (hl),l + ld (de),a + ld hl,$4000 + ld (hl),$30 + +EraseWait: + ld a,(hl) + rla + jr c,EraseDone + rla + rla + jr nc,EraseWait + pop af + out (6),a + scf + ret +EraseDone: + pop af + out (6),a + or a + ret + + ;B holds the sector to copy from + ;C holds the sector to copy to + ;HL points to first byte to write (because special first bytes are needed for sector identification) +CopySector: + in a,(6) + push af + ld a,3 + out (5),a + ld a,b + out (6),a +CopySectorLoop: + push bc + ld de,$C000 + ld bc,$2000 + ldi + ld hl,$4001 + ldir + pop bc + push bc + ld hl,$4000 + ld a,c + ld de,$c000 + ld bc,$2000 + call WriteFlash + pop bc + jr c,CopySectorFailed + + push bc + ld hl,$6000 + ld de,$c000 + ld bc,$2000 + ldir + pop bc + push bc + ld hl,$6000 + ld a,c + ld de,$c000 + ld bc,$2000 + call WriteFlash + pop bc + jr c,CopySectorFailed + + inc b + inc c + ld a,b + out (6),a + and 3 + ld hl,$4000 + jr nz,CopySectorLoop + + ;Carry is reset here if success +CopySectorFailed: + ;Doesn't destroy carry + pop bc + ld a,b + out (6),a + ld a,0 + out (5),a + ret + +LoadFile: + in a,(6) + push af + ld a,$82 + out (6),a + ld (SaveFileLoc),hl + ld de,$4000 + ld bc,$2000 + ldir + pop af + out (6),a + ret + +SaveAppvar8K: + ld b,'1' +SaveFileLoc = $+1 + ld de,0 +CopyToAppvar: + in a,(6) + push af + ld hl,$6000 + ld a,b + cp '1' + jr nz,_ + inc a + ld h,$40 +_ + add a,$82-'2' + out (6),a + ld bc,$2000 + ldir + pop af + out (6),a + ret + +LoadAppvarFromRamOrRom: + in a,(6) + push af + ld a,b + or a + ld a,(de) + jr nz,LoadAppvarFromRom + ld de,$6000 + cp '1' + jr nz,_ + inc a + ld d,$40 +_ + add a,$82-'2' + out (6),a + inc hl + inc hl + ld bc,$2000 + ldir + pop af + out (6),a + inc c + ret +LoadAppvarFromRom: + ld de,$E000 + cp '1' + jr nz,_ + inc a + ld d,$C0 +_ + add a,2-'2' + out (5),a + ld a,b + out (6),a + ld b,0 + add hl,bc + ld c,12 + add hl,bc + ld bc,$2000 +_ + bit 7,h + jr z,_ + res 7,h + set 6,h + inc a + out (6),a +_ + ldi + jp pe,--_ + xor a + out (5),a + pop af + out (6),a + ret + +RamRecover: + in a,(4) + bit 3,a + jr nz,RamRecover + + xor a + out ($27),a + out ($28),a + out ($20),a + ld a,3 + out ($10),a + dec a + out (5),a + + ld sp,saveSScreen+768 + + ;Copy save file from second 8KB of ram page 1 to first 8KB of ram page 2 + ld hl,$A000 + ld de,$C000 + ld bc,$2000 + ldir + + ;Restore second 8KB of the first 16KB of RAM from flash page 1 + ld hl,$6000 + ld de,$A000 + ld bc,$2000 + ldir + + ;Restore last 16KB of RAM from flash page 2 + ld a,2 + out (6),a + xor a + out (5),a + ld hl,$4000 + ld de,$C000 + ld b,h + ld c,l + ldir + + ;Unlock Flash + call UnlockFlash + + ;Erase sector 00h + ld b,00h + call EraseSector + jr c,RamRecover + + ;Copy the swap sector to sector 00h + ld a,(SwapSectorPage) + ld b,a + ld c,$00 + ld hl,Byte0000 + call CopySector + + ;Lock Flash + call LockFlash + + ld sp,(onSP) + ld iy,flags + + ;Copy save data to the save appvar(s) + ld a,(RamSize) + dec a + cp 2 + call c,SaveAppvar8K + ;32K saving not supported for crash recovery + ;call z,SaveAppvar32K + + ;Restore "previous entries" on OS 2.53MP from appbackupscreen, and clear the 2.53MP buffer (located directly afterward) + ld a,3 + out (5),a + ld hl,appBackUpScreen + ld de,previousEntriesMP + $4000 + ld bc,768 + ldir + ld h,d + ld l,e + inc de + ld bc,767 + xor a + ld (hl),a + ldir + out (5),a + + ;Return + ld a,$0b + out (3),a + im 1 + + ld hl,$A55A + ld ($85BE),hl + jp $0053 + ;ei + ;bcall(_ClrScrnFull) + ;ld hl,CrashMessage + ;bcall(_PutS) + ;bcall(_GetKey) + ;bcall(_JForceCmdNoChar) + +;CrashMessage: +; .db "TI-Boy SE has " +; .db "recovered from " +; .db "a crash. None of" +; .db "your data has " +; .db "been lost.",0 + +UnlockFlash: +; di + in a, (06) + push af + + ld hl, ReturnPoint+$8138-$80FE + ld de, $8138 + + ld a, d + out (05), a + dec a + ld i, a + dec a + out (06), a + + in a, (02) + and e + jr z, $+4 + ld e, $02 + + ld b, d + ld c, e + lddr + + ex de, hl + add hl, sp + ex de, hl + ld sp, $82A9+$4000 + + jp nz, $4529 + call $4276 + +ReturnPoint: + ex de, hl + ld sp, hl + + out (05), a + pop af + out (06), a + ret + +#comment +;################################### +;unlock flash on 83+SE and 84+BE/SE +;by Brian Coventry (modified by calc84maniac) +UnlockFlash: + in a,(6) + push af + ld (saveSP),sp + ld a,$7F + out (6),a + cpl + ld i,a + rlca + out (5),a + in a,(2) + bit 5,a + ld a,$C3 ;jp + ld hl,returnPoint + ld sp,$82A9+$4000 + jr z, _83PlusSE +_84Plus: + ld ($80C8), a + ld ($80C9), hl + jp $4529 +_83PlusSE: + ld ($80FE), a + ld ($80FF), hl + call $4276 +returnPoint: +saveSP = $+1 + ld sp,0 + xor a + out (05),a + pop af + out (06),a + ret +#endcomment + +LockFlash: + in a,(6) + push af + ld a,$7B + out (6),a + ld hl,(_FlashWriteDisable) + ld a,(_FlashWriteDisable+2) + out (6),a + call JumpHL + pop af + out (6),a + ret + +JumpHL: + jp (hl) + +Byte0000: + .db 0 +SwapSectorPage: + .db 0 +AppFinalPage: + .db 0 +CartridgeType: + .db 0 +RamSize: + .db 0 +SwapSectorIdentifier: + .db $FE +RamPermissions: + .dw 0 +FinalRamPageMapped: + .db 0 +MaxRamPage: + .db 2 +RamPagesToSave: + .db 0 + +PatchPageCopy: + in a,(6) + push af + ld a,$7B + out (6),a + ld hl,(_CopyFlashPage) + ld a,(_CopyFlashPage+2) + out (6),a + ld a,$28 +ThisEqualsZero = $+2 + ld bc,20 + cpir + jr nz,PatchFail + in a,(6) + ld de,ThisEqualsZero + ld bc,1 + call WriteFlash + jr c,PatchFail + pop af + out (6),a + or a + ret + +PatchFail: + pop af + out (6),a + scf + ret + +TimerInterruptBackup: + .block 16 + +WriteFlashCodeSize = $ - WriteFlash + .org WriteFlashCode + WriteFlashCodeSize + +.echo "Setup RAM code size is ", WriteFlashCodeSize + +RebootEntryCode: + jp TimerInterruptReplacement + jp CartridgeName + .dw $A55A + +RebootCode: + ld a,$81 + out (7),a + ld a,$01 + out (6),a + ld hl,$4000 + ld de,$8000 + ld bc,$2000 + ldir + jp RamRecover +RebootCodeSize = $ - RebootCode + + ;Input: C = row+$80 +DisplayNintendo: + ld hl,Nintendo + ld b,5 + ld a,c + sub $8B + jr nc,DisplayNintendoLoop + + ld c,$8B +_ + inc hl + inc hl + dec b + inc a + jr nz,-_ + +DisplayNintendoLoop: +_ + in a,($10) + rla + jr c,-_ + ld a,c + out ($10),a + +_ + in a,($10) + rla + jr c,-_ + ld a,$21 + out ($10),a + +_ + in a,($10) + rla + jr c,-_ + + ld a,(hl) + inc hl + ld d,(hl) + inc hl + ld e,$FB + scf +_ + rra + rr d + rr e + jr c,-_ + + out ($11),a + +_ + in a,($10) + rla + jr c,-_ + ld a,d + out ($11),a + +_ + in a,($10) + rla + jr c,-_ + ld a,e + out ($11),a + + inc c + djnz DisplayNintendoLoop + ret + +Nintendo: + .db $00,$00 + .db $D2,$04 + .db $AB,$44 + .db $BE,$BB + .db $BD,$6F + +MBC1 = 0 +MBC2 = 1 +MBC3 = 2 +MBC5 = 3 + +CartridgeLookup: + .db MBC1,MBC1,MBC1,MBC1,-1,MBC2,MBC2,-1,MBC1,MBC1,-1,-1,-1,-1,-1,MBC3 + .db MBC3,MBC3,MBC3,MBC3,-1,-1,-1,-1,-1,MBC5,MBC5,MBC5,MBC5,MBC5,MBC5 + + #include opcodes_crazy.z80 + #include hardware.z80 + + .echo "Left on page 0: ", $8000-96-$ + + .block $8000-96-$ \ No newline at end of file diff --git a/tiboyse_makeapp/makeapp.cpp b/tiboyse_makeapp/makeapp.cpp new file mode 100644 index 0000000..b705728 --- /dev/null +++ b/tiboyse_makeapp/makeapp.cpp @@ -0,0 +1,212 @@ +#include +#include +#include +#include +#include +#include +#include "rabbitsign.h" + +#ifdef USE_WINDOWS_RESOURCE +#include +#include "resource.h" +#endif + +const unsigned long TIBOY_SIZE = 0x4000 - 96; + +void wait() +{ + std::cout << "< Press Enter to continue >"; + getchar(); +} + +unsigned char getHex(char letter) +{ + if(letter >= '0' && letter <= '9') return letter - '0'; + if(letter >= 'A' && letter <= 'Z') return letter - 'A' + 0xA; + if(letter >= 'a' && letter <= 'z') return letter - 'a' + 0xA; + return 0; +} + +std::string escape(std::string& name) +{ + std::string valid = name; + size_t search = std::string::npos; + while((search = name.find('\\',search+1)) != std::string::npos) + { + name.replace(search, 3, 1, getHex(name[search+1])*16 + getHex(name[search+2])); + valid.replace(search, 3, 1, '-'); + } + return valid; +} + +int main(int argc, char** argv) +{ + std::cout << "ROM to APP converter for TI-Boy Beta 0.2.04\n\n"; + if (argc < 3) + { + atexit(wait); + } + + std::string romfilename; + if(argc >= 2) + { + romfilename = argv[1]; + } + else + { + std::cout << "Enter the filepath/name of the ROM to convert: "; + std::getline(std::cin, romfilename); + } + + std::ifstream romfile; + romfile.open(romfilename.c_str(), std::ios::binary | std::ios::ate); + if(romfile.fail()) + { + std::cout << "Error opening ROM file!\n"; + return EXIT_FAILURE; + } + + unsigned long romfilesize = (unsigned long)romfile.tellg(); + romfile.seekg(0, std::ios::beg); + + if (romfilesize & 0x3FFF) + { + std::cout << "Warning, ROM file is not a multiple of 16KB!\n"; + std::cout << "Ignoring last " << (romfilesize & 0x3FFF) << " bytes.\n\n"; + romfilesize &= ~0x3FFF; + } + + char* romdata = new char[romfilesize]; + romfile.read(romdata, romfilesize); + romfile.close(); + + char internal_name[16]; + strncpy(internal_name, romdata+0x134, 15); + internal_name[15] = 0; + std::cout << "Successfully opened ROM: " << internal_name << "\n"; + + std::string appname, appfilename; + size_t maxName = (romdata[0x149] == 3 ? 7 : 8); + if(argc >= 3) + { + appfilename = escape(appname = argv[2]); + } + if(argc < 3 || appname.length() > maxName) + { + if (argc >= 3) + { + atexit(wait); + } + do + { + std::cout << "Enter a name for the APP (" << maxName << " char max): "; + std::cin >> appname; + std::cin.ignore(); + appfilename = escape(appname); + } + while(appname.length() > maxName); + } + + std::string appPath = argv[0]; + appPath = appPath.substr(0,appPath.find_last_of('\\')+1); + +#ifdef USE_WINDOWS_RESOURCE + HRSRC resourceInfo = FindResource(nullptr, MAKEINTRESOURCE(TIBOYSE_RESOURCE), RT_RCDATA); + if (resourceInfo == nullptr) + { + std::cout << "Error: Could not find embedded tiboyse resource\n"; + return EXIT_FAILURE; + } + if (SizeofResource(nullptr, resourceInfo) != TIBOY_SIZE) + { + std::cout << "Error: Embedded tiboyse resource seems to be corrupt (incorrect size)\n"; + return EXIT_FAILURE; + } + HGLOBAL resourceData = LoadResource(nullptr, resourceInfo); + if (resourceData == nullptr) + { + std::cout << "Error: Failed to load embedded tiboyse resource\n"; + return EXIT_FAILURE; + } + const void* resourcePtr = LockResource(resourceData); + if (resourcePtr == nullptr) + { + std::cout << "Error: Failed to lock embedded tiboyse resource\n"; + return EXIT_FAILURE; + } +#else + std::ifstream tiboyfile; + tiboyfile.open((appPath+"tiboyse.bin").c_str(), std::ios::binary | std::ios::ate); + if(tiboyfile.fail()) + { + std::cout << "Error: Could not locate vital file tiboyse.bin\n"; + return EXIT_FAILURE; + } + if((unsigned long)tiboyfile.tellg() != TIBOY_SIZE) + { + std::cout << "Error: tiboyse.bin seems to be corrupt (incorrect file size)\n"; + return EXIT_FAILURE; + } + tiboyfile.seekg(0, std::ios::beg); +#endif + + unsigned long newsize = romfilesize; + unsigned char comp_byte = romdata[--newsize]; + if(comp_byte == 0x00 || comp_byte == 0xFF) + while(romdata[--newsize] == comp_byte); + romfilesize = (newsize | 0x3FFF) + 1; + + char* appdata = (char*)malloc(TIBOY_SIZE + romfilesize); +#ifdef USE_WINDOWS_RESOURCE + memcpy(appdata, resourcePtr, TIBOY_SIZE); +#else + tiboyfile.read(appdata, TIBOY_SIZE); + tiboyfile.close(); +#endif + + memcpy(appdata + 0x0012, appname.c_str(), appname.length()); + memcpy(appdata + TIBOY_SIZE, romdata + TIBOY_SIZE, romfilesize - TIBOY_SIZE); + memcpy(appdata + romfilesize, romdata, TIBOY_SIZE); + + RSKey *key = rs_key_new(); + rs_key_find_for_id(key, 0x0104, 0); + + RSProgram *prgm = rs_program_new(); + prgm->calctype = RS_CALC_TI83P; + prgm->datatype = RS_DATA_APP; + prgm->data = (unsigned char*)appdata; + prgm->length = prgm->length_a = TIBOY_SIZE + romfilesize; + rs_repair_ti8x_app(prgm, (RSRepairFlags)((int)RS_IGNORE_ALL_WARNINGS | (int)RS_FIX_PAGE_COUNT)); + + if (rs_sign_ti8x_app(prgm, key, 0) == RS_SUCCESS) + { + std::string binout = appPath + appfilename + ".8xk"; + FILE *appfile = fopen(binout.c_str(), "wb"); + if (rs_write_program_file(prgm, appfile, 0, 0, 0, (RSOutputFlags)0) == RS_SUCCESS) + { + std::cout << "\nGenerated a " << romfilesize + 0x4000 << " byte (" << romfilesize/0x4000+1 << " page) APP.\n\n"; + + if((unsigned char)romdata[0x143] == 0xC0) + std::cout << "Warning: This is a Game Boy Color ROM. TI-Boy does not support GBC.\n\n"; + + if(romfilesize > 1540096) + std::cout << "Warning: This APP will not fit on any TI-83+ or TI-84+ calculator.\n\n"; + else if(romfilesize > 491520) + std::cout << "Warning: This APP will only fit on a Silver Edition calculator.\n\n"; + + if(romdata[0x149] == 3) + std::cout << "Warning: This APP may require more than 48KB RAM to emulate.\nIt might not work on new TI-84+ models.\nHowever, Pokemon Red/Blue/Yellow have been confirmed to work on all models.\nTo see if your model has 128KB RAM, check the serial number on the back.\nIf the ending letter is from A-G or has no letter, there is enough RAM.\nOtherwise, just test it and see if it gives an error.\n\n"; + } + else + { + std::cout << "\nAn error occurred when writing to the output file!\n\n"; + } + fclose(appfile); + } + else + { + std::cout << "\nAn error occurred when signing the application!\n\n"; + } + + return EXIT_SUCCESS; +} diff --git a/tiboyse_makeapp/rabbitsign b/tiboyse_makeapp/rabbitsign new file mode 160000 index 0000000..f3b6511 --- /dev/null +++ b/tiboyse_makeapp/rabbitsign @@ -0,0 +1 @@ +Subproject commit f3b65118b2fa3738eb1d5167b63afdace31eee95 diff --git a/tiboyse_makeapp/rabbitsign.vcxproj b/tiboyse_makeapp/rabbitsign.vcxproj new file mode 100644 index 0000000..beedb4f --- /dev/null +++ b/tiboyse_makeapp/rabbitsign.vcxproj @@ -0,0 +1,195 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.0 + {B3E1064D-D26A-431B-B324-74C98F946F6C} + Win32Proj + rabbitsign + 10.0.17134.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + + Disabled + true + _CRT_SECURE_NO_WARNINGS;HAVE_MEMCPY;HAVE_STDLIB_H;HAVE_STRING_H;STDC_HEADERS=1;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + true + 4146;4244;4267 + Level3 + + + Windows + true + + + + + Disabled + true + _CRT_SECURE_NO_WARNINGS;HAVE_MEMCPY;HAVE_STDLIB_H;HAVE_STRING_H;STDC_HEADERS=1;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + true + 4146;4244;4267 + Level3 + + + Windows + true + + + + + MinSpace + true + true + true + _CRT_SECURE_NO_WARNINGS;HAVE_MEMCPY;HAVE_STDLIB_H;HAVE_STRING_H;STDC_HEADERS=1;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + true + 4146;4244;4267 + Level3 + MultiThreaded + + + Windows + true + true + true + + + + + MinSpace + true + true + true + _CRT_SECURE_NO_WARNINGS;HAVE_MEMCPY;HAVE_STDLIB_H;HAVE_STRING_H;STDC_HEADERS=1;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + true + 4146;4244;4267 + Level3 + MultiThreaded + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/tiboyse_makeapp/resource.h b/tiboyse_makeapp/resource.h new file mode 100644 index 0000000..16ca402 --- /dev/null +++ b/tiboyse_makeapp/resource.h @@ -0,0 +1,2 @@ +#pragma once +#define TIBOYSE_RESOURCE 101 diff --git a/tiboyse_makeapp/tiboyse.rc b/tiboyse_makeapp/tiboyse.rc new file mode 100644 index 0000000000000000000000000000000000000000..0d64296964c4616985428807fa57fc0581aef6d4 GIT binary patch literal 126 zcmXAiISPPK5JO)rcn8tmJGd2Af=gi~xPXEvxD;Mqjo)UH$qX;g?J=>?F>}&0;NY@J xcUC2vE(1QJQX7ksl#q;?f`o=#v(R42Me>f(m_VO_VIAVPVqGGBq}KHPv=`i|6%+sf literal 0 HcmV?d00001 diff --git a/tiboyse_makeapp/tiboyse_makeapp.sln b/tiboyse_makeapp/tiboyse_makeapp.sln new file mode 100644 index 0000000..5574ff8 --- /dev/null +++ b/tiboyse_makeapp/tiboyse_makeapp.sln @@ -0,0 +1,41 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2036 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiboyse_makeapp", "tiboyse_makeapp.vcxproj", "{0BF4CA31-F489-4345-B54F-5FE7B946D671}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rabbitsign", "rabbitsign.vcxproj", "{B3E1064D-D26A-431B-B324-74C98F946F6C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Debug|x64.ActiveCfg = Debug|x64 + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Debug|x64.Build.0 = Debug|x64 + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Debug|x86.ActiveCfg = Debug|Win32 + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Debug|x86.Build.0 = Debug|Win32 + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Release|x64.ActiveCfg = Release|x64 + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Release|x64.Build.0 = Release|x64 + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Release|x86.ActiveCfg = Release|Win32 + {0BF4CA31-F489-4345-B54F-5FE7B946D671}.Release|x86.Build.0 = Release|Win32 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Debug|x64.ActiveCfg = Debug|x64 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Debug|x64.Build.0 = Debug|x64 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Debug|x86.ActiveCfg = Debug|Win32 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Debug|x86.Build.0 = Debug|Win32 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Release|x64.ActiveCfg = Release|x64 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Release|x64.Build.0 = Release|x64 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Release|x86.ActiveCfg = Release|Win32 + {B3E1064D-D26A-431B-B324-74C98F946F6C}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4281E31C-7CB4-4BAB-A3EF-13EA47330F62} + EndGlobalSection +EndGlobal diff --git a/tiboyse_makeapp/tiboyse_makeapp.vcxproj b/tiboyse_makeapp/tiboyse_makeapp.vcxproj new file mode 100644 index 0000000..e52ea2a --- /dev/null +++ b/tiboyse_makeapp/tiboyse_makeapp.vcxproj @@ -0,0 +1,178 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + {b3e1064d-d26a-431b-b324-74c98f946f6c} + + + + + + + + + + 15.0 + {0BF4CA31-F489-4345-B54F-5FE7B946D671} + Win32Proj + tiboysemakeapp + 10.0.17134.0 + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + true + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + false + + + + Level4 + Disabled + _CRT_SECURE_NO_WARNINGS;USE_WINDOWS_RESOURCE;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)rabbitsign\src + true + + + Console + DebugFull + + + + + Level4 + Disabled + _CRT_SECURE_NO_WARNINGS;USE_WINDOWS_RESOURCE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)rabbitsign\src + true + + + Console + DebugFull + + + + + Level3 + MinSpace + true + true + _CRT_SECURE_NO_WARNINGS;USE_WINDOWS_RESOURCE;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)rabbitsign\src + true + MultiThreaded + + + Console + true + true + false + /NOCOFFGRPINFO %(AdditionalOptions) + ucrt.lib;%(AdditionalDependencies) + libucrt.lib + + + + + Level3 + MinSpace + true + true + _CRT_SECURE_NO_WARNINGS;USE_WINDOWS_RESOURCE;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)rabbitsign\src + true + MultiThreaded + + + Console + true + true + false + /NOCOFFGRPINFO %(AdditionalOptions) + ucrt.lib;%(AdditionalDependencies) + libucrt.lib + + + + + + \ No newline at end of file