255 lines
2.5 KiB
NASM
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
|