From f24b3c790fd048b43b1d72e63a8a615a47f17cd9 Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 4 Mar 2012 21:35:31 +0000 Subject: [PATCH] * avr/8080int-*.asm - DAA instruction corrected - Flag treatment corrected * avr/8080int-jmp.asm - Minor opcode and jump table optimizations git-svn-id: svn://cu.loc/avr-cpm/avrcpm/trunk@168 57430480-672e-4586-8877-bcf8adbbf3b7 --- avr/8080int-jmp.asm | 456 +++++++++++++---------- avr/8080int-t3-jmp.asm | 337 ++++++++--------- avr/8080int-t3.asm | 339 +++++++++-------- avr/8080int.asm | 829 ++++++++++++++++++++--------------------- 4 files changed, 1001 insertions(+), 960 deletions(-) diff --git a/avr/8080int-jmp.asm b/avr/8080int-jmp.asm index 1d7d1f3..e21d703 100644 --- a/avr/8080int-jmp.asm +++ b/avr/8080int-jmp.asm @@ -57,7 +57,6 @@ main: notraceon: .endif - .if PRINT_PC cpi z_pch,DBG_TRACE_BOTTOM brlo noprintpc @@ -76,8 +75,8 @@ noprintpc: sbic flags,trace rcall printregs .endif - ;hier kommt die Interruptbehandlung rein + ;hier kommt die Interruptbehandlung rein mem_read_ds zl,z_pc ;zl = memReadByte(z_pc) adiw z_pcl,1 ;++z_pc @@ -86,8 +85,7 @@ noprintpc: rjmp main ; - -; .listmac + .listmac ;-------------------------------------------------- ; Generate a table entry for one instruction @@ -107,19 +105,39 @@ noprintpc: .set todo_table_pos_ = opcjmp + 256 + 128 .endif .endif - .set do_@0_@1_@2 = todo_table_pos_ ; make a label - .org opcjmp_table_pos_ - rjmp do_@0_@1_@2 ; generate a jump to the label - .set opcjmp_table_pos_ = PC - - .org do_@0_@1_@2 - .set fetch_ = (@0 != do_fetch_nop) ; must call or jump to fetch phase .set op_ = (do_@1 != do_op_nop) ; must call or jump to op phase .set store_ = (@2 != do_store_nop) ; must jump to store phase - - .if fetch_ || op_ || store_ ; something to do + .set cnt_ = fetch_ + op_ + store_ + + .set do_@0_@1_@2 = todo_table_pos_ ; make a label + + .org opcjmp_table_pos_ + .set opcjmp_table_pos_ = opcjmp_table_pos_ + 1 + + .if cnt_ == 0 ; nothing to do (nop) + ret ; go back to main + .endif + + .if cnt_ == 1 ; jump direct to action + .if fetch_ ; + rjmp @0 ; + .endif + .if op_ + rjmp do_@1 ; do op and return to main + .endif + .if store_ ; + rjmp @2 ; + .endif + .endif + + ; two or tree actions + .if cnt_ >= 2 ; jump direct to action + rjmp do_@0_@1_@2 ; generate a jump to action table + + .org do_@0_@1_@2 + .if fetch_ ; must fetch .if op_ || store_ rcall @0 ; fetch and come back here @@ -137,11 +155,11 @@ noprintpc: .if store_ ; must store rjmp @2 ; store is allways last .endif - .else - ret ; nop, go back to main + + .set todo_table_pos_ = PC + .endif - .set todo_table_pos_ = PC .endm @@ -207,13 +225,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: @@ -307,13 +325,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: @@ -385,7 +403,6 @@ do_store_am: - ; ------------ Operation phase stuff ----------------- ;---------------------------------------------------------------- @@ -599,10 +616,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 @@ -624,6 +640,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 - brcc do_op_rrc_noc - ori opl, 0x80 - 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 ;---------------------------------------------------------------- @@ -865,15 +894,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 ;---------------------------------------------------------------- @@ -889,7 +918,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 ;---------------------------------------------------------------- @@ -908,7 +938,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 ;---------------------------------------------------------------- @@ -924,7 +955,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 @@ -937,13 +969,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 @@ -963,7 +995,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 @@ -974,7 +1007,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 @@ -989,7 +1022,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 @@ -1003,7 +1036,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 @@ -1080,125 +1113,148 @@ 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 | -; |-----------------------------------------------------------------------------| -; | | 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 | -; | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 | -; | | 0 | 9-F | 0 | A-F | 66 | 1 | -; | INC | 0 | A-F | 1 | 0-3 | 66 | 1 | -; | | 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. +; ------------------------------------------------------------------- +; | |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 | +; | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 | +; | | 0 | 9-F | 0 | A-F | 66 | 1 | +; | INC | 0 | A-F | 1 | 0-3 | 66 | 1 | +; | | 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 | +; ------------------------------------------------------------------- +; +; 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 ; | +op_da_a01: ; then + ldi oph,0x06 ; add 6 to lower nibble + add opl,oph ; + brhc op_da_02 ; if + ori temp2,(1<= 0xA0) + brlo op_da_a13 ; +op_da_a12: ; + ldi oph,0x60 ; add 6 to lower nibble + add opl,oph ; + 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<= 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<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 op_end ;---------------------------------------------------------------- @@ -935,15 +946,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 op_end ;---------------------------------------------------------------- @@ -959,7 +970,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 op_end ;---------------------------------------------------------------- @@ -978,7 +990,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 op_end ;---------------------------------------------------------------- @@ -994,7 +1007,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 op_end @@ -1007,13 +1021,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 op_end @@ -1033,7 +1047,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 op_end @@ -1044,7 +1059,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 @@ -1059,7 +1074,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 @@ -1073,7 +1088,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 @@ -1150,11 +1165,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 | @@ -1164,110 +1179,85 @@ 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<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 ;---------------------------------------------------------------- @@ -959,15 +973,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 ;---------------------------------------------------------------- @@ -983,7 +997,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 ;---------------------------------------------------------------- @@ -1002,7 +1017,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 ;---------------------------------------------------------------- @@ -1018,7 +1034,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 @@ -1031,13 +1048,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 @@ -1057,7 +1074,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 @@ -1068,7 +1086,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 @@ -1083,7 +1101,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 @@ -1097,7 +1115,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 @@ -1174,11 +1192,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 | @@ -1188,110 +1206,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<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<