From 1a1d6a788b206d43294878565fbca791d29ead6c Mon Sep 17 00:00:00 2001 From: Leo Date: Sun, 25 Jul 2010 23:08:53 +0000 Subject: [PATCH] * avr/z80.asm: - Interpreter: Apply most ALU operations (add/adc/sub/sbc/and/or/xor/cpl) direkt to z_a, so the STORE_A phase can be skipped. git-svn-id: svn://cu.loc/avr-cpm/trunk@52 57430480-672e-4586-8877-bcf8adbbf3b7 --- avrcpm/avr/z80.asm | 195 ++++++++++++++++++++++++--------------------- 1 file changed, 105 insertions(+), 90 deletions(-) diff --git a/avrcpm/avr/z80.asm b/avrcpm/avr/z80.asm index dd32be8..3d5f0b8 100644 --- a/avrcpm/avr/z80.asm +++ b/avrcpm/avr/z80.asm @@ -2610,6 +2610,7 @@ do_store_am: .equ OP_DI = (37<<10) .equ OP_EI = (38<<10) .equ OP_INV = (39<<10) +.equ OP_CPFA = (40<<10) opjumps: rjmp do_op_nop @@ -2652,6 +2653,7 @@ opjumps: rjmp do_op_di rjmp do_op_ei rjmp do_op_inv + rjmp do_op_cpfa ;How the flags are supposed to work: @@ -3071,9 +3073,9 @@ do_op_rl: ; ; do_op_adda: - add opl,z_a + add z_a,opl in temp,sreg - ldpmx z_flags,sz53p_tab,opl ;S,Z,P flag + ldpmx z_flags,sz53p_tab,z_a ;S,Z,P flag bmov z_flags,ZFL_C, temp,AVR_C do_z80_flags_HP ret @@ -3090,9 +3092,9 @@ do_op_adca: clc sbrc z_flags,ZFL_C sec - adc opl,z_a + adc z_a,opl in temp,sreg - ldpmx z_flags,sz53p_tab,opl ;S,Z,P + ldpmx z_flags,sz53p_tab,z_a ;S,Z,P bmov z_flags,ZFL_C, temp,AVR_C do_z80_flags_HP ret @@ -3101,13 +3103,28 @@ do_op_adca: ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- ;|SUB s |***V1*|Subtract |A=A-s | -;|CP s |***V1*|Compare |A-s | ;|----------|SZHP C|---------- 8080 ----------------------------| ;|SUB s |***P *|Subtract |A=A-s | -;|CP s |***P *|Compare |A-s | ; do_op_subfa: + sub z_a,opl + 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 + do_z80_flags_set_N + ret + +;---------------------------------------------------------------- +;|Mnemonic |SZHPNC|Description |Notes | +;---------------------------------------------------------------- +;|CP s |***V1*|Compare |A-s | +;|----------|SZHP C|---------- 8080 ----------------------------| +;|CP s |***P *|Compare |A-s | + +; +do_op_cpfa: mov temp,z_a sub temp,opl mov opl,temp @@ -3127,14 +3144,12 @@ do_op_subfa: ; ; do_op_sbcfa: - mov temp,z_a clc sbrc z_flags,ZFL_C sec - sbc temp,opl - mov opl,temp + sbc z_a,opl in temp,sreg - ldpmx z_flags,sz53p_tab,opl ;S,Z,P + ldpmx z_flags,sz53p_tab,z_a ;S,Z,P bmov z_flags,ZFL_C, temp,AVR_C do_z80_flags_HP do_z80_flags_set_N @@ -3149,8 +3164,8 @@ do_op_sbcfa: ; ; TODO H-Flag do_op_anda: - and opl,z_a ; - ldpmx z_flags,sz53p_tab,opl ;S,Z,P,N,C + and z_a,opl ; + ldpmx z_flags,sz53p_tab,z_a ;S,Z,P,N,C do_z80_flags_op_and ret @@ -3164,8 +3179,8 @@ do_op_anda: ; ; TODO: H-Flag do_op_ora: - or opl,z_a - ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N,C + or z_a,opl + ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C do_z80_flags_op_or ret @@ -3178,8 +3193,8 @@ do_op_ora: ; ; TODO: H-Flag do_op_xora: - eor opl,z_a - ldpmx z_flags,sz53p_tab,opl ;S,Z,H,P,N,C + eor z_a,opl + ldpmx z_flags,sz53p_tab,z_a ;S,Z,H,P,N,C do_z80_flags_op_or ret @@ -3419,7 +3434,7 @@ do_op_ccf: ; ; do_op_cpl: - com opl + com z_a do_z80_flags_set_HN ret @@ -3824,7 +3839,7 @@ inst_table: .dw (FETCH_L | OP_INC | STORE_L ) ; 2C INC L .dw (FETCH_L | OP_DEC | STORE_L ) ; 2D DEC L .dw (FETCH_DIR8 | OP_NOP | STORE_L ) ; 2E nn LD L,n -.dw (FETCH_A | OP_CPL | STORE_A ) ; 2F CPL +.dw (FETCH_NOP | OP_CPL | STORE_NOP) ; 2F CPL .dw (FETCH_NOP | OP_INV | STORE_NOP) ; 30 oo JR NC,o (Z80) .dw (FETCH_DIR16| OP_NOP | STORE_SP ) ; 31 nn nn LD SP,nn .dw (FETCH_DIR16| OP_NOP | STORE_AM ) ; 32 nn nn LD (nn),A @@ -3905,77 +3920,77 @@ inst_table: .dw (FETCH_L | OP_NOP | STORE_A ) ; 7D LD A,r .dw (FETCH_MHL | OP_NOP | STORE_A ) ; 7E LD A,r .dw (FETCH_A | OP_NOP | STORE_A ) ; 7F LD A,r -.dw (FETCH_B | OP_ADDA | STORE_A ) ; 80 ADD A,r -.dw (FETCH_C | OP_ADDA | STORE_A ) ; 81 ADD A,r -.dw (FETCH_D | OP_ADDA | STORE_A ) ; 82 ADD A,r -.dw (FETCH_E | OP_ADDA | STORE_A ) ; 83 ADD A,r -.dw (FETCH_H | OP_ADDA | STORE_A ) ; 84 ADD A,r -.dw (FETCH_L | OP_ADDA | STORE_A ) ; 85 ADD A,r -.dw (FETCH_MHL | OP_ADDA | STORE_A ) ; 86 ADD A,r -.dw (FETCH_A | OP_ADDA | STORE_A ) ; 87 ADD A,r -.dw (FETCH_B | OP_ADCA | STORE_A ) ; 88 ADC A,r -.dw (FETCH_C | OP_ADCA | STORE_A ) ; 89 ADC A,r -.dw (FETCH_D | OP_ADCA | STORE_A ) ; 8A ADC A,r -.dw (FETCH_E | OP_ADCA | STORE_A ) ; 8B ADC A,r -.dw (FETCH_H | OP_ADCA | STORE_A ) ; 8C ADC A,r -.dw (FETCH_L | OP_ADCA | STORE_A ) ; 8D ADC A,r -.dw (FETCH_MHL | OP_ADCA | STORE_A ) ; 8E ADC A,r -.dw (FETCH_A | OP_ADCA | STORE_A ) ; 8F ADC A,r -.dw (FETCH_B | OP_SUBFA | STORE_A ) ; 90 SUB A,r -.dw (FETCH_C | OP_SUBFA | STORE_A ) ; 91 SUB A,r -.dw (FETCH_D | OP_SUBFA | STORE_A ) ; 92 SUB A,r -.dw (FETCH_E | OP_SUBFA | STORE_A ) ; 93 SUB A,r -.dw (FETCH_H | OP_SUBFA | STORE_A ) ; 94 SUB A,r -.dw (FETCH_L | OP_SUBFA | STORE_A ) ; 95 SUB A,r -.dw (FETCH_MHL | OP_SUBFA | STORE_A ) ; 96 SUB A,r -.dw (FETCH_A | OP_SUBFA | STORE_A ) ; 97 SUB A,r -.dw (FETCH_B | OP_SBCFA | STORE_A ) ; 98 SBC A,r -.dw (FETCH_C | OP_SBCFA | STORE_A ) ; 99 SBC A,r -.dw (FETCH_D | OP_SBCFA | STORE_A ) ; 9A SBC A,r -.dw (FETCH_E | OP_SBCFA | STORE_A ) ; 9B SBC A,r -.dw (FETCH_H | OP_SBCFA | STORE_A ) ; 9C SBC A,r -.dw (FETCH_L | OP_SBCFA | STORE_A ) ; 9D SBC A,r -.dw (FETCH_MHL | OP_SBCFA | STORE_A ) ; 9E SBC A,r -.dw (FETCH_A | OP_SBCFA | STORE_A ) ; 9F SBC A,r -.dw (FETCH_B | OP_ANDA | STORE_A ) ; A0 AND A,r -.dw (FETCH_C | OP_ANDA | STORE_A ) ; A1 AND A,r -.dw (FETCH_D | OP_ANDA | STORE_A ) ; A2 AND A,r -.dw (FETCH_E | OP_ANDA | STORE_A ) ; A3 AND A,r -.dw (FETCH_H | OP_ANDA | STORE_A ) ; A4 AND A,r -.dw (FETCH_L | OP_ANDA | STORE_A ) ; A5 AND A,r -.dw (FETCH_MHL | OP_ANDA | STORE_A ) ; A6 AND A,r -.dw (FETCH_A | OP_ANDA | STORE_A ) ; A7 AND A,r -.dw (FETCH_B | OP_XORA | STORE_A ) ; A8 XOR A,r -.dw (FETCH_C | OP_XORA | STORE_A ) ; A9 XOR A,r -.dw (FETCH_D | OP_XORA | STORE_A ) ; AA XOR A,r -.dw (FETCH_E | OP_XORA | STORE_A ) ; AB XOR A,r -.dw (FETCH_H | OP_XORA | STORE_A ) ; AC XOR A,r -.dw (FETCH_L | OP_XORA | STORE_A ) ; AD XOR A,r -.dw (FETCH_MHL | OP_XORA | STORE_A ) ; AE XOR A,r -.dw (FETCH_A | OP_XORA | STORE_A ) ; AF XOR A,r -.dw (FETCH_B | OP_ORA | STORE_A ) ; B0 OR A,r -.dw (FETCH_C | OP_ORA | STORE_A ) ; B1 OR A,r -.dw (FETCH_D | OP_ORA | STORE_A ) ; B2 OR A,r -.dw (FETCH_E | OP_ORA | STORE_A ) ; B3 OR A,r -.dw (FETCH_H | OP_ORA | STORE_A ) ; B4 OR A,r -.dw (FETCH_L | OP_ORA | STORE_A ) ; B5 OR A,r -.dw (FETCH_MHL | OP_ORA | STORE_A ) ; B6 OR A,r -.dw (FETCH_A | OP_ORA | STORE_A ) ; B7 OR A,r -.dw (FETCH_B | OP_SUBFA | STORE_NOP) ; B8 CP A,r -.dw (FETCH_C | OP_SUBFA | STORE_NOP) ; B9 CP A,r -.dw (FETCH_D | OP_SUBFA | STORE_NOP) ; BA CP A,r -.dw (FETCH_E | OP_SUBFA | STORE_NOP) ; BB CP A,r -.dw (FETCH_H | OP_SUBFA | STORE_NOP) ; BC CP A,r -.dw (FETCH_L | OP_SUBFA | STORE_NOP) ; BD CP A,r -.dw (FETCH_MHL | OP_SUBFA | STORE_NOP) ; BE CP A,r -.dw (FETCH_A | OP_SUBFA | STORE_NOP) ; BF CP A,r +.dw (FETCH_B | OP_ADDA | STORE_NOP) ; 80 ADD A,r +.dw (FETCH_C | OP_ADDA | STORE_NOP) ; 81 ADD A,r +.dw (FETCH_D | OP_ADDA | STORE_NOP) ; 82 ADD A,r +.dw (FETCH_E | OP_ADDA | STORE_NOP) ; 83 ADD A,r +.dw (FETCH_H | OP_ADDA | STORE_NOP) ; 84 ADD A,r +.dw (FETCH_L | OP_ADDA | STORE_NOP) ; 85 ADD A,r +.dw (FETCH_MHL | OP_ADDA | STORE_NOP) ; 86 ADD A,r +.dw (FETCH_A | OP_ADDA | STORE_NOP) ; 87 ADD A,r +.dw (FETCH_B | OP_ADCA | STORE_NOP) ; 88 ADC A,r +.dw (FETCH_C | OP_ADCA | STORE_NOP) ; 89 ADC A,r +.dw (FETCH_D | OP_ADCA | STORE_NOP) ; 8A ADC A,r +.dw (FETCH_E | OP_ADCA | STORE_NOP) ; 8B ADC A,r +.dw (FETCH_H | OP_ADCA | STORE_NOP) ; 8C ADC A,r +.dw (FETCH_L | OP_ADCA | STORE_NOP) ; 8D ADC A,r +.dw (FETCH_MHL | OP_ADCA | STORE_NOP) ; 8E ADC A,r +.dw (FETCH_A | OP_ADCA | STORE_NOP) ; 8F ADC A,r +.dw (FETCH_B | OP_SUBFA | STORE_NOP) ; 90 SUB A,r +.dw (FETCH_C | OP_SUBFA | STORE_NOP) ; 91 SUB A,r +.dw (FETCH_D | OP_SUBFA | STORE_NOP) ; 92 SUB A,r +.dw (FETCH_E | OP_SUBFA | STORE_NOP) ; 93 SUB A,r +.dw (FETCH_H | OP_SUBFA | STORE_NOP) ; 94 SUB A,r +.dw (FETCH_L | OP_SUBFA | STORE_NOP) ; 95 SUB A,r +.dw (FETCH_MHL | OP_SUBFA | STORE_NOP) ; 96 SUB A,r +.dw (FETCH_A | OP_SUBFA | STORE_NOP) ; 97 SUB A,r +.dw (FETCH_B | OP_SBCFA | STORE_NOP) ; 98 SBC A,r +.dw (FETCH_C | OP_SBCFA | STORE_NOP) ; 99 SBC A,r +.dw (FETCH_D | OP_SBCFA | STORE_NOP) ; 9A SBC A,r +.dw (FETCH_E | OP_SBCFA | STORE_NOP) ; 9B SBC A,r +.dw (FETCH_H | OP_SBCFA | STORE_NOP) ; 9C SBC A,r +.dw (FETCH_L | OP_SBCFA | STORE_NOP) ; 9D SBC A,r +.dw (FETCH_MHL | OP_SBCFA | STORE_NOP) ; 9E SBC A,r +.dw (FETCH_A | OP_SBCFA | STORE_NOP) ; 9F SBC A,r +.dw (FETCH_B | OP_ANDA | STORE_NOP) ; A0 AND A,r +.dw (FETCH_C | OP_ANDA | STORE_NOP) ; A1 AND A,r +.dw (FETCH_D | OP_ANDA | STORE_NOP) ; A2 AND A,r +.dw (FETCH_E | OP_ANDA | STORE_NOP) ; A3 AND A,r +.dw (FETCH_H | OP_ANDA | STORE_NOP) ; A4 AND A,r +.dw (FETCH_L | OP_ANDA | STORE_NOP) ; A5 AND A,r +.dw (FETCH_MHL | OP_ANDA | STORE_NOP) ; A6 AND A,r +.dw (FETCH_A | OP_ANDA | STORE_NOP) ; A7 AND A,r +.dw (FETCH_B | OP_XORA | STORE_NOP) ; A8 XOR A,r +.dw (FETCH_C | OP_XORA | STORE_NOP) ; A9 XOR A,r +.dw (FETCH_D | OP_XORA | STORE_NOP) ; AA XOR A,r +.dw (FETCH_E | OP_XORA | STORE_NOP) ; AB XOR A,r +.dw (FETCH_H | OP_XORA | STORE_NOP) ; AC XOR A,r +.dw (FETCH_L | OP_XORA | STORE_NOP) ; AD XOR A,r +.dw (FETCH_MHL | OP_XORA | STORE_NOP) ; AE XOR A,r +.dw (FETCH_A | OP_XORA | STORE_NOP) ; AF XOR A,r +.dw (FETCH_B | OP_ORA | STORE_NOP) ; B0 OR A,r +.dw (FETCH_C | OP_ORA | STORE_NOP) ; B1 OR A,r +.dw (FETCH_D | OP_ORA | STORE_NOP) ; B2 OR A,r +.dw (FETCH_E | OP_ORA | STORE_NOP) ; B3 OR A,r +.dw (FETCH_H | OP_ORA | STORE_NOP) ; B4 OR A,r +.dw (FETCH_L | OP_ORA | STORE_NOP) ; B5 OR A,r +.dw (FETCH_MHL | OP_ORA | STORE_NOP) ; B6 OR A,r +.dw (FETCH_A | OP_ORA | STORE_NOP) ; B7 OR A,r +.dw (FETCH_B | OP_CPFA | STORE_NOP) ; B8 CP A,r +.dw (FETCH_C | OP_CPFA | STORE_NOP) ; B9 CP A,r +.dw (FETCH_D | OP_CPFA | STORE_NOP) ; BA CP A,r +.dw (FETCH_E | OP_CPFA | STORE_NOP) ; BB CP A,r +.dw (FETCH_H | OP_CPFA | STORE_NOP) ; BC CP A,r +.dw (FETCH_L | OP_CPFA | STORE_NOP) ; BD CP A,r +.dw (FETCH_MHL | OP_CPFA | STORE_NOP) ; BE CP A,r +.dw (FETCH_A | OP_CPFA | STORE_NOP) ; BF CP A,r .dw (FETCH_NOP | OP_IFNZ | STORE_RET) ; C0 RET NZ .dw (FETCH_NOP | OP_POP16 | STORE_BC ) ; C1 POP BC .dw (FETCH_DIR16| OP_IFNZ | STORE_PC ) ; C2 nn nn JP NZ,nn .dw (FETCH_DIR16| OP_NOP | STORE_PC ) ; C3 nn nn JP nn .dw (FETCH_DIR16| OP_IFNZ | STORE_CALL) ; C4 nn nn CALL NZ,nn .dw (FETCH_BC | OP_PUSH16 | STORE_NOP) ; C5 PUSH BC -.dw (FETCH_DIR8 | OP_ADDA | STORE_A ) ; C6 nn ADD A,n +.dw (FETCH_DIR8 | OP_ADDA | STORE_NOP) ; C6 nn ADD A,n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; C7 RST 0 .dw (FETCH_NOP | OP_IFZ | STORE_RET) ; C8 RET Z .dw (FETCH_NOP | OP_NOP | STORE_RET) ; C9 RET @@ -3983,7 +3998,7 @@ inst_table: .dw (FETCH_NOP | OP_INV | STORE_NOP) ; CB (Z80 specific) .dw (FETCH_DIR16| OP_IFZ | STORE_CALL) ; CC nn nn CALL Z,nn .dw (FETCH_DIR16| OP_NOP | STORE_CALL) ; CD nn nn CALL nn -.dw (FETCH_DIR8 | OP_ADCA | STORE_A ) ; CE nn ADC A,n +.dw (FETCH_DIR8 | OP_ADCA | STORE_NOP) ; CE nn ADC A,n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; CF RST 8H .dw (FETCH_NOP | OP_IFNC | STORE_RET) ; D0 RET NC .dw (FETCH_NOP | OP_POP16 | STORE_DE ) ; D1 POP DE @@ -3991,7 +4006,7 @@ inst_table: .dw (FETCH_DIR8 | OP_OUTA | STORE_NOP) ; D3 nn OUT (n),A .dw (FETCH_DIR16| OP_IFNC | STORE_CALL) ; D4 nn nn CALL NC,nn .dw (FETCH_DE | OP_PUSH16 | STORE_NOP) ; D5 PUSH DE -.dw (FETCH_DIR8 | OP_SUBFA | STORE_A ) ; D6 nn SUB n +.dw (FETCH_DIR8 | OP_SUBFA | STORE_NOP) ; D6 nn SUB n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; D7 RST 10H .dw (FETCH_NOP | OP_IFC | STORE_RET) ; D8 RET C .dw (FETCH_NOP | OP_INV | STORE_NOP) ; D9 EXX (Z80) @@ -3999,7 +4014,7 @@ inst_table: .dw (FETCH_DIR8 | OP_IN | STORE_A ) ; DB nn IN A,(n) .dw (FETCH_DIR16| OP_IFC | STORE_CALL) ; DC nn nn CALL C,nn .dw (FETCH_NOP | OP_INV | STORE_NOP) ; DD (Z80) -.dw (FETCH_DIR8 | OP_SBCFA | STORE_A ) ; DE nn SBC A,n +.dw (FETCH_DIR8 | OP_SBCFA | STORE_NOP) ; DE nn SBC A,n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; DF RST 18H .dw (FETCH_NOP | OP_IFPO | STORE_RET) ; E0 RET PO .dw (FETCH_NOP | OP_POP16 | STORE_HL ) ; E1 POP HL @@ -4007,7 +4022,7 @@ inst_table: .dw (FETCH_MSP | OP_EXHL | STORE_MSP) ; E3 EX (SP),HL .dw (FETCH_DIR16| OP_IFPO | STORE_CALL) ; E4 nn nn CALL PO,nn .dw (FETCH_HL | OP_PUSH16 | STORE_NOP) ; E5 PUSH HL -.dw (FETCH_DIR8 | OP_ANDA | STORE_A ) ; E6 nn AND n +.dw (FETCH_DIR8 | OP_ANDA | STORE_NOP) ; E6 nn AND n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; E7 RST 20H .dw (FETCH_NOP | OP_IFPE | STORE_RET) ; E8 RET PE .dw (FETCH_HL | OP_NOP | STORE_PC ) ; E9 JP (HL) @@ -4015,7 +4030,7 @@ inst_table: .dw (FETCH_DE | OP_EXHL | STORE_DE ) ; EB EX DE,HL .dw (FETCH_DIR16| OP_IFPE | STORE_CALL) ; EC nn nn CALL PE,nn .dw (FETCH_NOP | OP_INV | STORE_NOP) ; ED (Z80 specific) -.dw (FETCH_DIR8 | OP_XORA | STORE_A ) ; EE nn XOR n +.dw (FETCH_DIR8 | OP_XORA | STORE_NOP) ; EE nn XOR n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; EF RST 28H .dw (FETCH_NOP | OP_IFP | STORE_RET) ; F0 RET P .dw (FETCH_NOP | OP_POP16 | STORE_AF ) ; F1 POP AF @@ -4023,7 +4038,7 @@ inst_table: .dw (FETCH_NOP | OP_DI | STORE_NOP) ; F3 DI .dw (FETCH_DIR16| OP_IFP | STORE_CALL) ; F4 nn nn CALL P,nn .dw (FETCH_AF | OP_PUSH16 | STORE_NOP) ; F5 PUSH AF -.dw (FETCH_DIR8 | OP_ORA | STORE_A ) ; F6 nn OR n +.dw (FETCH_DIR8 | OP_ORA | STORE_NOP) ; F6 nn OR n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; F7 RST 30H .dw (FETCH_NOP | OP_IFM | STORE_RET) ; F8 RET M .dw (FETCH_HL | OP_NOP | STORE_SP ) ; F9 LD SP,HL @@ -4031,7 +4046,7 @@ inst_table: .dw (FETCH_NOP | OP_EI | STORE_NOP) ; FB EI .dw (FETCH_DIR16| OP_IFM | STORE_CALL) ; FC nn nn CALL M,nn .dw (FETCH_NOP | OP_INV | STORE_NOP) ; FD (Z80 specific) -.dw (FETCH_DIR8 | OP_SUBFA | STORE_NOP) ; FE nn CP n +.dw (FETCH_DIR8 | OP_CPFA | STORE_NOP) ; FE nn CP n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; FF RST 38H ; vim:set ts=8 noet nowrap -- 2.39.2