1
0
Fork 0
2021-8bit-cpu-gameboy/code/signals.asm

255 lines
2.5 KiB
NASM

SECTION "Control Signals", ROM0
; [in] f: flags set from a previous operation
UpdateFlags:
ld hl, flags_temp
.check_z:
jr z, .set_z
res FLAG_Z, [hl]
.check_c:
jr c, .set_c
res FLAG_C, [hl]
jr .exit
.set_z:
set FLAG_Z, [hl]
jr .check_c
.set_c:
set FLAG_C, [hl]
.exit:
ret
ctrl_ht:
ld a, [ctrl]
ld b, a
bit CTRL_HT, b
jr z, .exit
xor a
ld [running], a
.exit:
ret
ctrl_ro:
ld a, [ctrl]
ld b, a
bit CTRL_RO, b
jr z, .exit
; get memory offset based on MAR
ld hl, ram
ld a, [mar]
add l
ld l, a
ld a, [hl]
ld [bus], a
.exit:
ret
ctrl_io:
ld a, [ctrl]
ld b, a
bit CTRL_IO, b
jr z, .exit
ld a, [ir]
and $0f
ld [bus], a
.exit:
ret
ctrl_ao:
ld a, [ctrl]
ld b, a
bit CTRL_AO, b
jr z, .exit
ld a, [a_reg]
ld [bus], a
.exit:
ret
ctrl_eo:
ld a, [ctrl+1]
ld b, a
bit CTRL_EO, b
jp z, .exit
ld a, [alu]
ld [bus], a
.exit:
ret
ctrl_co:
ld a, [ctrl+1]
ld b, a
bit CTRL_CO, b
jp z, .exit
ld a, [pc]
ld [bus], a
.exit:
ret
ctrl_mi:
ld a, [ctrl]
ld b, a
bit CTRL_MI, b
jp z, .exit
ld a, [bus]
ld [mar], a
.exit:
ret
ctrl_ri:
ld a, [ctrl]
ld b, a
bit CTRL_RI, b
jp z, .exit
; get memory offset based on MAR
ld hl, ram
ld a, [mar]
add l
ld l, a
ld a, [bus]
ld [hl], a
.exit:
ret
ctrl_ii:
ld a, [ctrl]
ld b, a
bit CTRL_II, b
jp z, .exit
ld a, [bus]
ld [ir], a
.exit:
ret
ctrl_ai:
ld a, [ctrl]
ld b, a
bit CTRL_AI, b
jp z, .exit
ld a, [bus]
ld [a_reg], a
; alu value reflects any change to A or B
ld d, a
ld a, [b_reg]
add d
ld [alu], a
call UpdateFlags
.exit:
ret
ctrl_su:
ld a, [ctrl+1]
ld b, a
bit CTRL_SU, b
jp z, .exit
ld a, [b_reg]
cpl
inc a
ld [b_reg], a
; alu value reflects any change to A or B
ld d, a
ld a, [a_reg]
add d
ld [alu], a
call UpdateFlags
.exit:
ret
ctrl_bi:
ld a, [ctrl+1]
ld b, a
bit CTRL_BI, b
jp z, .exit
ld a, [bus]
ld [b_reg], a
; alu value reflects any change to A or B
ld d, a
ld a, [a_reg]
add d
ld [alu], a
call UpdateFlags
.exit:
ret
ctrl_oi:
ld a, [ctrl+1]
ld b, a
bit CTRL_OI, b
jp z, .exit
ld a, [bus]
ld [out_reg], a
.exit:
ret
ctrl_ce:
ld a, [ctrl+1]
ld b, a
bit CTRL_CE, b
jp z, .exit
ld a, [pc]
inc a
ld [pc], a
.exit:
ret
ctrl_jp:
ld a, [ctrl+1]
ld b, a
bit CTRL_JP, b
jp z, .exit
ld a, [bus]
ld [pc], a
.exit:
ret
ctrl_fi:
ld a, [ctrl+1]
ld b, a
bit CTRL_FI, b
jp z, .exit
ld a, [flags_temp]
ld [flags], a
.exit:
ret