X-Git-Url: http://cloudbase.mooo.com/gitweb/avrcpm.git/blobdiff_plain/dcd7e502729b7ca08df21573b8d98b81a3f81b51..f24b3c790fd048b43b1d72e63a8a615a47f17cd9:/avr/8080int.asm diff --git a/avr/8080int.asm b/avr/8080int.asm index 85445cf..b660a3c 100644 --- a/avr/8080int.asm +++ b/avr/8080int.asm @@ -30,7 +30,7 @@ ; instr fetch, op, store ; .macro instr - .db low(@2), low(@1), high(@1), low(@0) + .db low(@2), low(do_@1), high(do_@1), low(@0) .endm @@ -136,7 +136,7 @@ noprintpc: .org (PC+255) & 0xff00 ; wichtig !!!fetch und store muessen in einer page liegen fetch_ops: -do_nop: +do_fetch_nop: ret do_fetch_a: @@ -194,13 +194,13 @@ do_fetch_sp: do_fetch_mbc: lds xh,z_b lds xl,z_c - mem_read_d opl + mem_read_d z_a ret do_fetch_mde: lds xh,z_d lds xl,z_e - mem_read_d opl + mem_read_d z_a ret do_fetch_mhl: @@ -240,6 +240,7 @@ do_fetch_rst: .org (PC+255) & 0xff00 ; wichtig !!!fetch und store muessen in einer page liegen store_ops: +do_store_nop: ret do_store_a: @@ -293,13 +294,13 @@ do_store_hl: do_store_mbc: lds xh,z_b lds xl,z_c - mem_write_s opl + mem_write_s z_a ret do_store_mde: lds xh,z_d lds xl,z_e - mem_write_s opl + mem_write_s z_a ret do_store_mhl: @@ -369,9 +370,10 @@ do_store_am: mem_write_ds op, z_a ret -; ------------ Operation phase stuff ----------------- +; ------------ Operation phase stuff ----------------- + ;---------------------------------------------------------------- ;| | ;| Zilog | @@ -561,6 +563,7 @@ do_store_am: .equ ZFL_N = 1 .equ ZFL_C = 0 + .equ AVR_T = SREG_T .equ AVR_H = SREG_H .equ AVR_S = SREG_S @@ -582,10 +585,9 @@ do_store_am: lpm @0,z .endm -.macro do_z80_flags_HP +.macro do_z80_flags_V #if EM_Z80 bmov z_flags, ZFL_P, temp, AVR_V - bmov z_flags, ZFL_H, temp, AVR_H #endif .endm @@ -607,6 +609,19 @@ do_store_am: #endif .endm +.macro do_z80_flags_clear_HN +#if EM_Z80 + andi z_flags,~((1<A | ; ; -do_op_rrc: +do_op_rrca: ;Rotate Right Cyclical. All bits move 1 to the ;right, the lsb becomes c and msb. do_z80_flags_op_rotate - lsr opl + lsr z_a brcc do_op_rrc_noc - ori opl, 0x80 + ldi temp,0x80 + or z_a,temp ori z_flags, (1<{CY,A} | ; ; -do_op_rr: +do_op_rra: ;Rotate Right. All bits move 1 to the right, the lsb ;becomes c, c becomes msb. clc ; get z80 carry to avr carry sbrc z_flags,ZFL_C sec do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C) - bmov z_flags,ZFL_C, opl,0 ; Bit 0 --> CY - ror opl + bmov z_flags,ZFL_C, z_a,0 ; Bit 0 --> CY + ror z_a ret ;---------------------------------------------------------------- @@ -845,15 +863,15 @@ do_op_rr: ;|RLA |---- *|Rotate Left Acc. |A={CY,A}<- | ; ; -do_op_rl: +do_op_rla: ;Rotate Left. All bits move 1 to the left, the msb ;becomes c, c becomes lsb. clc sbrc z_flags,ZFL_C sec do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C) - bmov z_flags,ZFL_C, opl,7 ; Bit 7 --> CY - rol opl + bmov z_flags,ZFL_C, z_a,7 ; Bit 7 --> CY + rol z_a ret ;---------------------------------------------------------------- @@ -869,7 +887,8 @@ do_op_adda: in temp,sreg ldpmx z_flags,sz53p_tab,z_a ;S,Z,P flag bmov z_flags,ZFL_C, temp,AVR_C - do_z80_flags_HP + bmov z_flags,ZFL_H, temp,AVR_H + do_z80_flags_V ret ;---------------------------------------------------------------- @@ -888,7 +907,8 @@ do_op_adca: in temp,sreg ldpmx z_flags,sz53p_tab,z_a ;S,Z,P bmov z_flags,ZFL_C, temp,AVR_C - do_z80_flags_HP + bmov z_flags,ZFL_H, temp,AVR_H + do_z80_flags_V ret ;---------------------------------------------------------------- @@ -904,7 +924,8 @@ do_op_subfa: in temp,sreg ldpmx z_flags,sz53p_tab,z_a ;S,Z,P bmov z_flags,ZFL_C, temp,AVR_C - do_z80_flags_HP + bmov z_flags,ZFL_H, temp,AVR_H + do_z80_flags_V do_z80_flags_set_N ret @@ -917,13 +938,13 @@ do_op_subfa: ; do_op_cpfa: - mov temp,z_a - sub temp,opl - mov opl,temp + mov temp2,z_a + sub temp2,opl in temp,sreg - ldpmx z_flags,sz53p_tab,opl ;S,Z,P + ldpmx z_flags,sz53p_tab,temp2 ;S,Z,P bmov z_flags,ZFL_C, temp,AVR_C - do_z80_flags_HP + bmov z_flags,ZFL_H, temp,AVR_H + do_z80_flags_V do_z80_flags_set_N ret @@ -943,7 +964,8 @@ do_op_sbcfa: in temp,sreg ldpmx z_flags,sz53p_tab,z_a ;S,Z,P bmov z_flags,ZFL_C, temp,AVR_C - do_z80_flags_HP + bmov z_flags,ZFL_H, temp,AVR_H + do_z80_flags_V do_z80_flags_set_N ret @@ -954,7 +976,7 @@ do_op_sbcfa: ;|----------|SZHP C|---------- 8080 ----------------------------| ;|AND s |**-P 0|Logical AND |A=A&s | ; -; TODO H-Flag +; do_op_anda: and z_a,opl ; ldpmx z_flags,sz53p_tab,z_a ;S,Z,P,N,C @@ -969,7 +991,7 @@ do_op_anda: ;|----------|SZHP C|---------- 8080 ----------------------------| ;|OR s |**-P00|Logical inclusive OR |A=Avs | ; -; TODO: H-Flag +; do_op_ora: or z_a,opl ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C @@ -983,7 +1005,7 @@ do_op_ora: ;|----------|SZHP C|---------- 8080 ----------------------------| ;|XOR s |**-P 0|Logical Exclusive OR |A=Axs | ; -; TODO: H-Flag +; do_op_xora: eor z_a,opl ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C @@ -1060,11 +1082,11 @@ do_op_rmem8: ; and subtraction operations. For addition (ADD, ADC, INC) or subtraction ; (SUB, SBC, DEC, NEC), the following table indicates the operation performed: ; -; ------------------------------------------------------------------------------- -; | | C Flag | HEX value in | H Flag | HEX value in | Number | C flag| -; | Operation| Before | upper digit | Before | lower digit | added | After | -; | | DAA | (bit 7-4) | DAA | (bit 3-0) | to byte | DAA | -; |-----------------------------------------------------------------------------| +; ------------------------------------------------------------------- +; | |C Flag |HEX value in|H Flag |HEX val in | Number |C flag | +; | Oper |Before |upper digit |Before |lower digit| added |After | +; | |DAA |(bit 7-4) |DAA |(bit 3-0) | to A |DAA | +; |-------+-------+------------+-------+-----------+--------+-------| ; | | 0 | 0-9 | 0 | 0-9 | 00 | 0 | ; | ADD | 0 | 0-8 | 0 | A-F | 06 | 0 | ; | | 0 | 0-9 | 1 | 0-3 | 06 | 0 | @@ -1074,110 +1096,86 @@ do_op_rmem8: ; | | 1 | 0-2 | 0 | 0-9 | 60 | 1 | ; | | 1 | 0-2 | 0 | A-F | 66 | 1 | ; | | 1 | 0-3 | 1 | 0-3 | 66 | 1 | -; |-----------------------------------------------------------------------------| +; |-------+-------+------------+-------+-----------+--------+-------| ; | SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 | ; | SBC | 0 | 0-8 | 1 | 6-F | FA | 0 | ; | DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 | ; | NEG | 1 | 6-F | 1 | 6-F | 9A | 1 | -; |-----------------------------------------------------------------------------| -; -; Flags: -; C: See instruction. +; ------------------------------------------------------------------- +; +; The H flag is affected as follows: +; +; --------------------- +; | N | H | low |H' | +; | | |nibble | | +; |---+---+-------+---| +; | 0 | * | 0-9 | 0 | +; | 0 | * | a-f | 1 | +; | 1 | 0 | * | 0 | +; | 1 | 1 | 6-f | 0 | +; | 1 | 1 | 0-5 | 1 | +; --------------------- +; +; Ohter flags: ; N: Unaffected. ; P/V: Set if Acc. is even parity after operation, reset otherwise. -; H: See instruction. ; Z: Set if Acc. is Zero after operation, reset otherwise. ; S: Set if most significant bit of Acc. is 1 after operation, reset otherwise. - -#if 1 do_op_da: - ldi oph,0 ; what to add - sbrc z_flags,ZFL_H ; if H-Flag - rjmp op_da_06 - mov temp,opl - andi temp,0x0f ; ... or lower digit > 9 - cpi temp,0x0a - brlo op_da_06n -op_da_06: - ori oph,0x06 -op_da_06n: - sbrc z_flags,(1<= 0x0A) + brlo op_da_a10 ; | + ori oph,0x06 ; add 6 + ori temp2,(1<= 0x90) + brlo op_da_a03 ; | +op_da_a02: + ori oph,0x60 ; add 0x60 + ori temp2,(1<= 0xA0) + brlo op_da_a13 ; +op_da_a12: + ori oph,0x60 ; add 0x60 + ori temp2,(1<= 0x0A) + brsh op_da_ae ; | + ori temp2,(1< 9 - brlo do_op_da_h ; - ori temp2,0x06 ; add 6 to lower digit -do_op_da_h: ; - sbrc z_flags,ZFL_H ; ... or H-Flag - ori temp2,0x06 ; - add opl,temp2 ; - - ldi temp2,0 ; - mov temp,opl ; - andi temp,0xf0 ; - cpi temp,0xa0 ; - brlo do_op_da_c ; - ori temp2,0x60 ; -do_op_da_c: ; else sub-op - sbrc z_flags,ZFL_C ; - ori temp2,0x60 ; - andi z_flags, ~( (1<