Bweh/notes/todo_insn_decode.md
2024-06-22 07:34:17 -05:00

13 KiB

    // TODO: Do this instead of instruction decode
    #[allow(unused)]
    #[rustfmt::skip]
    pub const INS: [fn(&mut CPU, &mut dyn BusIO) -> IResult; 256] = [
        |cpu, _bus| cpu.nop(), // 000 nop
        |_cpu, _bus| Ok(()),   // 001 ld bc, n16
        |_cpu, _bus| Ok(()),   // 002 ld [bc], a
        |_cpu, _bus| Ok(()),   // 003 inc bc
        |_cpu, _bus| Ok(()),   // 004 inc b
        |_cpu, _bus| Ok(()),   // 005 dec b
        |_cpu, _bus| Ok(()),   // 006 ld b,n8
        |_cpu, _bus| Ok(()),   // 007 rlca
        |_cpu, _bus| Ok(()),   // 010 ld [a16], sp
        |_cpu, _bus| Ok(()),   // 011 add hl, bc
        |_cpu, _bus| Ok(()),   // 012 ld a, [bc]
        |_cpu, _bus| Ok(()),   // 013 dec bc
        |_cpu, _bus| Ok(()),   // 014 inc c
        |_cpu, _bus| Ok(()),   // 015 dec c
        |_cpu, _bus| Ok(()),   // 016 ld c, n8
        |_cpu, _bus| Ok(()),   // 017 rrca
        |_cpu, _bus| Ok(()),   // 020 stop n8
        |_cpu, _bus| Ok(()),   // 021 ld de, n16
        |_cpu, _bus| Ok(()),   // 022 ld [de], a
        |_cpu, _bus| Ok(()),   // 023 inc de
        |_cpu, _bus| Ok(()),   // 024 inc d
        |_cpu, _bus| Ok(()),   // 025 dec d
        |_cpu, _bus| Ok(()),   // 026 ld d, n8
        |_cpu, _bus| Ok(()),   // 027 rla
        |_cpu, _bus| Ok(()),   // 030 jr e8
        |_cpu, _bus| Ok(()),   // 031 add hl, de
        |_cpu, _bus| Ok(()),   // 032 ld a, [de]
        |_cpu, _bus| Ok(()),   // 033 dec de
        |_cpu, _bus| Ok(()),   // 034 inc e
        |_cpu, _bus| Ok(()),   // 035 dec e
        |_cpu, _bus| Ok(()),   // 036 ld e, n8
        |_cpu, _bus| Ok(()),   // 037 rra
        |_cpu, _bus| Ok(()),   // 040 jr nz, e8
        |_cpu, _bus| Ok(()),   // 041 ld hl, n16
        |_cpu, _bus| Ok(()),   // 042 ld [hl+], a
        |_cpu, _bus| Ok(()),   // 043 inc hl
        |_cpu, _bus| Ok(()),   // 044 inc h
        |_cpu, _bus| Ok(()),   // 045 dec h
        |_cpu, _bus| Ok(()),   // 046 ld h, n8
        |_cpu, _bus| Ok(()),   // 047 daa
        |_cpu, _bus| Ok(()),   // 050 jr z, e8
        |_cpu, _bus| Ok(()),   // 051 add hl, hl
        |_cpu, _bus| Ok(()),   // 052 ld a [hl+]
        |_cpu, _bus| Ok(()),   // 053 dec hl
        |_cpu, _bus| Ok(()),   // 054 inc l
        |_cpu, _bus| Ok(()),   // 055 dec l
        |_cpu, _bus| Ok(()),   // 056 ld l, n8
        |_cpu, _bus| Ok(()),   // 057 cpl
        |_cpu, _bus| Ok(()),   // 060 jr nc, e8
        |_cpu, _bus| Ok(()),   // 061 ld sp, n16
        |_cpu, _bus| Ok(()),   // 062 ld [hl-], a
        |_cpu, _bus| Ok(()),   // 063 inc sp
        |_cpu, _bus| Ok(()),   // 064 inc [hl]
        |_cpu, _bus| Ok(()),   // 065 dec [hl]
        |_cpu, _bus| Ok(()),   // 066 ld [hl], n8
        |_cpu, _bus| Ok(()),   // 067 scf
        |_cpu, _bus| Ok(()),   // 070 jr c, e8
        |_cpu, _bus| Ok(()),   // 071 add hl, sp
        |_cpu, _bus| Ok(()),   // 072 ld a, [hl-]
        |_cpu, _bus| Ok(()),   // 073 dec sp
        |_cpu, _bus| Ok(()),   // 074 inc a
        |_cpu, _bus| Ok(()),   // 075 dec a
        |_cpu, _bus| Ok(()),   // 076 ld a, n8
        |_cpu, _bus| Ok(()),   // 077 ccf

        |_cpu, _bus| Ok(()),                             // 100 ld b, b
        |cpu, _bus| { cpu[R8::B] = cpu[R8::C]; Ok(()) }, // 101 ld b, c
        |cpu, _bus| { cpu[R8::B] = cpu[R8::D]; Ok(()) }, // 102 ld b, d
        |cpu, _bus| { cpu[R8::B] = cpu[R8::E]; Ok(()) }, // 103 ld b, e
        |cpu, _bus| { cpu[R8::B] = cpu[R8::H]; Ok(()) }, // 104 ld b, h
        |cpu, _bus| { cpu[R8::B] = cpu[R8::L]; Ok(()) }, // 105 ld b, l
        |_cpu, _bus| Ok(()),                             // 106 ld b, [hl]
        |cpu, _bus| { cpu[R8::B] = cpu[R8::A]; Ok(()) }, // 107 ld b, a
        |cpu, _bus| { cpu[R8::C] = cpu[R8::B]; Ok(()) }, // 110 ld c, b
        |_cpu, _bus| Ok(()),                             // 111 ld c, c
        |cpu, _bus| { cpu[R8::C] = cpu[R8::D]; Ok(()) }, // 112 ld c, d
        |cpu, _bus| { cpu[R8::C] = cpu[R8::E]; Ok(()) }, // 113 ld c, e
        |cpu, _bus| { cpu[R8::C] = cpu[R8::H]; Ok(()) }, // 114 ld c, h
        |cpu, _bus| { cpu[R8::C] = cpu[R8::L]; Ok(()) }, // 115 ld c, l 
        |_cpu, _bus| Ok(()),                             // 116 ld c, [hl] 
        |cpu, _bus| { cpu[R8::C] = cpu[R8::A]; Ok(()) }, // 117 ld c, a 
        |cpu, _bus| { cpu[R8::D] = cpu[R8::B]; Ok(()) }, // 120 ld d, b 
        |cpu, _bus| { cpu[R8::D] = cpu[R8::C]; Ok(()) }, // 121 ld d, c 
        |_cpu, _bus| Ok(()),                             // 122 ld d, d 
        |cpu, _bus| { cpu[R8::D] = cpu[R8::E]; Ok(()) }, // 123 ld d, e 
        |cpu, _bus| { cpu[R8::D] = cpu[R8::H]; Ok(()) }, // 124 ld d, h 
        |cpu, _bus| { cpu[R8::D] = cpu[R8::L]; Ok(()) }, // 125 ld d, l 
        |_cpu, _bus| Ok(()),                             // 126 ld d, [hl] 
        |cpu, _bus| { cpu[R8::D] = cpu[R8::A]; Ok(()) }, // 127 ld d, a 
        |cpu, _bus| { cpu[R8::E] = cpu[R8::B]; Ok(()) }, // 130 ld e, b 
        |cpu, _bus| { cpu[R8::E] = cpu[R8::C]; Ok(()) }, // 131 ld e, c 
        |cpu, _bus| { cpu[R8::E] = cpu[R8::D]; Ok(()) }, // 132 ld e, d 
        |_cpu, _bus| Ok(()),                             // 133 ld e, e
        |cpu, _bus| { cpu[R8::E] = cpu[R8::H]; Ok(()) }, // 134 ld e, h
        |cpu, _bus| { cpu[R8::E] = cpu[R8::L]; Ok(()) }, // 135 ld e, l
        |_cpu, _bus| Ok(()),                             // 136 ld e, [hl]
        |cpu, _bus| { cpu[R8::E] = cpu[R8::A]; Ok(()) }, // 137 ld e, a
        |cpu, _bus| { cpu[R8::H] = cpu[R8::B]; Ok(()) }, // 140 ld h, b
        |cpu, _bus| { cpu[R8::H] = cpu[R8::C]; Ok(()) }, // 141 ld h, c
        |cpu, _bus| { cpu[R8::H] = cpu[R8::D]; Ok(()) }, // 142 ld h, d
        |cpu, _bus| { cpu[R8::H] = cpu[R8::E]; Ok(()) }, // 143 ld h, e
        |_cpu, _bus| Ok(()),                             // 144 ld h, h
        |cpu, _bus| { cpu[R8::H] = cpu[R8::L]; Ok(()) }, // 145 ld h, l
        |_cpu, _bus| Ok(()),                             // 146 ld h, [hl]
        |cpu, _bus| { cpu[R8::H] = cpu[R8::A]; Ok(()) }, // 147 ld h, a
        |cpu, _bus| { cpu[R8::L] = cpu[R8::B]; Ok(()) }, // 150 ld l, b
        |cpu, _bus| { cpu[R8::L] = cpu[R8::C]; Ok(()) }, // 151 ld l, c
        |cpu, _bus| { cpu[R8::L] = cpu[R8::D]; Ok(()) }, // 152 ld l, d
        |cpu, _bus| { cpu[R8::L] = cpu[R8::E]; Ok(()) }, // 153 ld l, e
        |cpu, _bus| { cpu[R8::L] = cpu[R8::H]; Ok(()) }, // 154 ld l, h
        |_cpu, _bus| Ok(()),                             // 155 ld l, l
        |_cpu, _bus| Ok(()),                             // 156 ld l, [hl]
        |cpu, _bus| { cpu[R8::L] = cpu[R8::A]; Ok(()) }, // 157 ld l, a
        |_cpu, _bus| Ok(()),   // 160 ld [hl], b
        |_cpu, _bus| Ok(()),   // 161 ld [hl], c
        |_cpu, _bus| Ok(()),   // 162 ld [hl], d
        |_cpu, _bus| Ok(()),   // 163 ld [hl], e
        |_cpu, _bus| Ok(()),   // 164 ld [hl], h
        |_cpu, _bus| Ok(()),   // 165 ld [hl], l
        |_cpu, _bus| Ok(()),   // 166 halt
        |_cpu, _bus| Ok(()),   // 167 ld [hl], a
        |cpu, _bus| { cpu[R8::A] = cpu[R8::B]; Ok(()) }, // 170 ld a, b
        |cpu, _bus| { cpu[R8::A] = cpu[R8::C]; Ok(()) }, // 171 ld a, c
        |cpu, _bus| { cpu[R8::A] = cpu[R8::D]; Ok(()) }, // 172 ld a, d
        |cpu, _bus| { cpu[R8::A] = cpu[R8::E]; Ok(()) }, // 173 ld a, e
        |cpu, _bus| { cpu[R8::A] = cpu[R8::H]; Ok(()) }, // 174 ld a, h
        |cpu, _bus| { cpu[R8::A] = cpu[R8::L]; Ok(()) }, // 175 ld a, l
        |_cpu, _bus| Ok(()),   // 176 ld a, [hl]
        |_cpu, _bus| Ok(()),   // 177 ld a, a
        |_cpu, _bus| Ok(()),   // 200 add a, b
        |_cpu, _bus| Ok(()),   // 201 add a, c
        |_cpu, _bus| Ok(()),   // 202 add a, d
        |_cpu, _bus| Ok(()),   // 203 add a, e
        |_cpu, _bus| Ok(()),   // 204 add a, h
        |_cpu, _bus| Ok(()),   // 205 add a, l
        |_cpu, _bus| Ok(()),   // 206 add a, [hl]
        |_cpu, _bus| Ok(()),   // 207 add a, a
        |_cpu, _bus| Ok(()),   // 210 adc a, b
        |_cpu, _bus| Ok(()),   // 211 adc a, c
        |_cpu, _bus| Ok(()),   // 212 adc a, d
        |_cpu, _bus| Ok(()),   // 213 adc a, e
        |_cpu, _bus| Ok(()),   // 214 adc a, h
        |_cpu, _bus| Ok(()),   // 215 adc a, l
        |_cpu, _bus| Ok(()),   // 216 adc a, [hl]
        |_cpu, _bus| Ok(()),   // 217 adc a, a
        |_cpu, _bus| Ok(()),   // 220 sub a, b
        |_cpu, _bus| Ok(()),   // 221 sub a, c
        |_cpu, _bus| Ok(()),   // 222 sub a, d
        |_cpu, _bus| Ok(()),   // 223 sub a, e
        |_cpu, _bus| Ok(()),   // 224 sub a, h
        |_cpu, _bus| Ok(()),   // 225 sub a, l
        |_cpu, _bus| Ok(()),   // 226 sub a, [hl]
        |_cpu, _bus| Ok(()),   // 227 sub a, a
        |_cpu, _bus| Ok(()),   // 230 sbc a, b
        |_cpu, _bus| Ok(()),   // 231 sbc a, c
        |_cpu, _bus| Ok(()),   // 232 sbc a, d
        |_cpu, _bus| Ok(()),   // 233 sbc a, e
        |_cpu, _bus| Ok(()),   // 234 sbc a, h
        |_cpu, _bus| Ok(()),   // 235 sbc a, l
        |_cpu, _bus| Ok(()),   // 236 sbc a, [hl]
        |_cpu, _bus| Ok(()),   // 237 sbc a, a
        |_cpu, _bus| Ok(()),   // 240 and a, b
        |_cpu, _bus| Ok(()),   // 241 and a, c
        |_cpu, _bus| Ok(()),   // 242 and a, d
        |_cpu, _bus| Ok(()),   // 243 and a, e
        |_cpu, _bus| Ok(()),   // 244 and a, h
        |_cpu, _bus| Ok(()),   // 245 and a, l
        |_cpu, _bus| Ok(()),   // 246 and a, [hl]
        |_cpu, _bus| Ok(()),   // 247 and a, a
        |_cpu, _bus| Ok(()),   // 250 xor a, b
        |_cpu, _bus| Ok(()),   // 251 xor a, c
        |_cpu, _bus| Ok(()),   // 252 xor a, d
        |_cpu, _bus| Ok(()),   // 253 xor a, e
        |_cpu, _bus| Ok(()),   // 254 xor a, h
        |_cpu, _bus| Ok(()),   // 255 xor a, l
        |_cpu, _bus| Ok(()),   // 256 xor a, [hl]
        |_cpu, _bus| Ok(()),   // 257 xor a, a
        |_cpu, _bus| Ok(()),   // 260 or a, b
        |_cpu, _bus| Ok(()),   // 261 or a, c
        |_cpu, _bus| Ok(()),   // 262 or a, d
        |_cpu, _bus| Ok(()),   // 263 or a, e
        |_cpu, _bus| Ok(()),   // 264 or a, h
        |_cpu, _bus| Ok(()),   // 265 or a, l
        |_cpu, _bus| Ok(()),   // 266 or a, [hl]
        |_cpu, _bus| Ok(()),   // 267 or a, a
        |_cpu, _bus| Ok(()),   // 270 cmp a, b
        |_cpu, _bus| Ok(()),   // 271 cmp a, c
        |_cpu, _bus| Ok(()),   // 272 cmp a, d
        |_cpu, _bus| Ok(()),   // 273 cmp a, e
        |_cpu, _bus| Ok(()),   // 274 cmp a, h
        |_cpu, _bus| Ok(()),   // 275 cmp a, l
        |_cpu, _bus| Ok(()),   // 276 cmp a, [hl]
        |_cpu, _bus| Ok(()),   // 277 cmp a, a

        |_cpu, _bus| Ok(()), // 0300 ret nz
        |_cpu, _bus| Ok(()), // 0301 pop bc
        |_cpu, _bus| Ok(()), // 0302 jp nz, a16
        |_cpu, _bus| Ok(()), // 0303 jp a16
        |_cpu, _bus| Ok(()), // 0304 call nz, a16
        |_cpu, _bus| Ok(()), // 0305 push bc
        |_cpu, _bus| Ok(()), // 0306 add a, n8
        |_cpu, _bus| Ok(()), // 0307 rst $00

        |_cpu, _bus| Ok(()), // 0310 ret z
        |_cpu, _bus| Ok(()), // 0311 ret
        |_cpu, _bus| Ok(()), // 0312 jp z, a16
        |_cpu, _bus| Ok(()), // 0313 PREFIX 0xCB
        |_cpu, _bus| Ok(()), // 0314 call z, a16
        |_cpu, _bus| Ok(()), // 0315 call a16
        |_cpu, _bus| Ok(()), // 0316 adc a, n8
        |_cpu, _bus| Ok(()), // 0317 rst $08

        |_cpu, _bus| Ok(()), // 0320 ret nc
        |_cpu, _bus| Ok(()), // 0321 pop de
        |_cpu, _bus| Ok(()), // 0322 jp nc, a16
        |_cpu, _bus| Ok(()), // 0323 --
        |_cpu, _bus| Ok(()), // 0324 call nc, a16
        |_cpu, _bus| Ok(()), // 0325 push de
        |_cpu, _bus| Ok(()), // 0326 sub a, n8
        |_cpu, _bus| Ok(()), // 0327 rst $10

        |_cpu, _bus| Ok(()), // 0330 ret c
        |_cpu, _bus| Ok(()), // 0331 reti
        |_cpu, _bus| Ok(()), // 0332 jp c, a16
        |_cpu, _bus| Ok(()), // 0333 --
        |_cpu, _bus| Ok(()), // 0334 call c, a16
        |_cpu, _bus| Ok(()), // 0335 --
        |_cpu, _bus| Ok(()), // 0336 sbc a, n8
        |_cpu, _bus| Ok(()), // 0337 rst $18

        |_cpu, _bus| Ok(()), // 0340 ldh [a8], a
        |_cpu, _bus| Ok(()), // 0341 pop hl
        |_cpu, _bus| Ok(()), // 0342 ld [c], a
        |_cpu, _bus| Ok(()), // 0343 --
        |_cpu, _bus| Ok(()), // 0344 --
        |_cpu, _bus| Ok(()), // 0345 push hl
        |_cpu, _bus| Ok(()), // 0346 and a, n8
        |_cpu, _bus| Ok(()), // 0347 rst $20

        |_cpu, _bus| Ok(()), // 0350 add sp, e8
        |_cpu, _bus| Ok(()), // 0351 jp hl
        |_cpu, _bus| Ok(()), // 0352 ld [a16], a
        |_cpu, _bus| Ok(()), // 0353 --
        |_cpu, _bus| Ok(()), // 0354 --
        |_cpu, _bus| Ok(()), // 0355 --
        |_cpu, _bus| Ok(()), // 0356 xor a, n8
        |_cpu, _bus| Ok(()), // 0357 rst $28

        |_cpu, _bus| Ok(()), // 0360 ldh a, [a8]
        |_cpu, _bus| Ok(()), // 0361 pop af
        |_cpu, _bus| Ok(()), // 0362 ld a, [c]
        |_cpu, _bus| Ok(()), // 0363 di
        |_cpu, _bus| Ok(()), // 0364 --
        |_cpu, _bus| Ok(()), // 0365 push af
        |_cpu, _bus| Ok(()), // 0366 or a, n8
        |_cpu, _bus| Ok(()), // 0367 rst $30

        |_cpu, _bus| Ok(()), // 0370 ld hl, sp + e8
        |_cpu, _bus| Ok(()), // 0371 ld sp, hl
        |_cpu, _bus| Ok(()), // 0372 ld a, [a16]
        |_cpu, _bus| Ok(()), // 0373 ei
        |_cpu, _bus| Ok(()), // 0374 --
        |_cpu, _bus| Ok(()), // 0375 --
        |_cpu, _bus| Ok(()), // 0376 cp a, n8
        |_cpu, _bus| Ok(()), // 0377 rst $38
    ];
    ```