home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 55
/
Amiga_Dream_55.iso
/
RISCOS
/
MAGAZINE
/
NEWS
/
PCE021.ZIP
/
Pce021
/
Src
/
cpu
/
s
/
arithmetic
next >
Wrap
Text File
|
1998-06-24
|
3KB
|
172 lines
; arithmetic.s
; ------------
; Arithmetic opcodes
GET hdr.common
GET hdr.memory
GET hdr.addressing
GBLS data1
GBLS data2
GBLS byte
; Add with carry
MACRO
m_adc $reg
NEW data1
NEW data2
ROUT
tst r_p, #D_FLAG
beq %ft10 ; not decimal mode
tst r_p, r_p, lsr #1 ; ARM C flag = Hu6280 C flag
and $data1, r_a, #0x0f000000
mov $data1, $data1, lsr #24
and $data2, $reg, #0x0f000000
adc $data1, $data1, $data2, lsr #24
cmp $data1, #10
subcs $data1, $data1, #10
mov r_a, r_a, lsr #28
adc $data2, r_a, $reg, lsr #28
cmp $data2, #10
subcs $data2, $data2, #10
bic r_p, r_p, #N_FLAG + C_FLAG + Z_FLAG
orrcs r_p, r_p, #C_FLAG
mov r_a, $data2, lsl #28
orrs r_a, r_a, $data1, lsl #24
orreq r_p, r_p, #Z_FLAG
b %ft20
10
tst r_p, r_p, lsr #1 ; ARM C flag = Hu6280 C flag
mvn r_a, r_a ; r_a = NOT(r_a)
eor r_a, r_a, #0xff000000 ; xxffffff so that carry is effective
adcs r_a, r_a, $reg
bic r_p, r_p, #N_FLAG + V_FLAG + Z_FLAG + C_FLAG
orrcs r_p, r_p, #C_FLAG
orrvs r_p, r_p, #V_FLAG
orrmi r_p, r_p, #N_FLAG
andnes r_a, r_a, #0xff000000
orreq r_p, r_p, #Z_FLAG
20
DELETE data1
DELETE data2
MEND
; Subtract with carry
MACRO
m_sbc $reg
NEW data1
NEW data2
ROUT
tst r_p, #D_FLAG
beq %ft10 ; not decimal mode
tst r_p, r_p, lsr #1 ; ARM C flag = Hu6280 C flag
and $data1, r_a, #0x0f000000
mov $data1, $data1, lsr #24
and $data2, $reg, #0x0f000000
sbcs $data1, $data1, $data2, lsr #24
addcc $data1, $data1, #10
mov r_a, r_a, lsr #28
sbcs $data2, r_a, $reg, lsr #28
addcc $data2, $data2, #10
bic r_p, r_p, #N_FLAG + C_FLAG + Z_FLAG
orrcs r_p, r_p, #C_FLAG
mov r_a, $data2, lsl #28
orrs r_a, r_a, $data1, lsl #24
orreq r_p, r_p, #Z_FLAG
b %ft20
10
tst r_p, r_p, lsr #1 ; ARM C flag = Hu6280 C flag
sbcs r_a, r_a, $reg
bic r_p, r_p, #N_FLAG + V_FLAG + Z_FLAG + C_FLAG
orrcs r_p, r_p, #C_FLAG
orrvs r_p, r_p, #V_FLAG
orrmi r_p, r_p, #N_FLAG
andnes r_a, r_a, #0xff000000
orreq r_p, r_p, #Z_FLAG
20
DELETE data1
DELETE data2
MEND
; Increment byte by one
MACRO
m_inc $reg
adds $reg, $reg, #1 << 24
bic r_p, r_p, #N_FLAG + Z_FLAG
orreq r_p, r_p, #Z_FLAG
orrmi r_p, r_p, #N_FLAG
MEND
; Decrement byte by one
MACRO
m_dec $reg
subs $reg, $reg, #1 << 24
bic r_p, r_p, #N_FLAG + Z_FLAG
orreq r_p, r_p, #Z_FLAG
orrmi r_p, r_p, #N_FLAG
MEND
AREA |cpu$$opcodes|, CODE, READONLY
IMPORT Read_Register
IMPORT Write_Register
IMPORT Next_Opcode
OPCODE_R adc, im, m_adc
OPCODE_R adc, zp, m_adc
OPCODE_R adc, zx, m_adc
OPCODE_R adc, in, m_adc
OPCODE_R adc, ix, m_adc
OPCODE_R adc, iy, m_adc
OPCODE_R adc, ab, m_adc
OPCODE_R adc, ax, m_adc
OPCODE_R adc, ay, m_adc
OPCODE_R sbc, im, m_sbc
OPCODE_R sbc, zp, m_sbc
OPCODE_R sbc, zx, m_sbc
OPCODE_R sbc, in, m_sbc
OPCODE_R sbc, ix, m_sbc
OPCODE_R sbc, iy, m_sbc
OPCODE_R sbc, ab, m_sbc
OPCODE_R sbc, ax, m_sbc
OPCODE_R sbc, ay, m_sbc
OPCODE_RW inc, zp, m_inc
OPCODE_RW inc, zx, m_inc
OPCODE_RW inc, ab, m_inc
OPCODE_RW inc, ax, m_inc
DEF_OPCODE inc_rg
m_inc r_a
END_OPCODE
OPCODE_RW dec, zp, m_dec
OPCODE_RW dec, zx, m_dec
OPCODE_RW dec, ab, m_dec
OPCODE_RW dec, ax, m_dec
DEF_OPCODE dec_rg
m_dec r_a
END_OPCODE
DEF_OPCODE inx_rg
m_inc r_x
END_OPCODE
DEF_OPCODE dex_rg
m_dec r_x
END_OPCODE
DEF_OPCODE iny_rg
m_inc r_y
END_OPCODE
DEF_OPCODE dey_rg
m_dec r_y
END_OPCODE
END