X-Git-Url: http://cloudbase.mooo.com/gitweb/avrcpm.git/blobdiff_plain/f24b3c790fd048b43b1d72e63a8a615a47f17cd9..de15c768141e7d7c3f34e6a4260d1c7a55cece4f:/avr/8080int.asm diff --git a/avr/8080int.asm b/avr/8080int.asm index b660a3c..5e68a92 100644 --- a/avr/8080int.asm +++ b/avr/8080int.asm @@ -43,6 +43,59 @@ z_e: .byte 1 z_h: .byte 1 z_l: .byte 1 + .equ oz_b = 0 + .equ oz_c = 1 + .equ oz_d = 2 + .equ oz_e = 3 + .equ oz_h = 4 + .equ oz_l = 5 + + +#if EM_Z80 +z_b2: .byte 1 +z_c2: .byte 1 +z_d2: .byte 1 +z_e2: .byte 1 +z_h2: .byte 1 +z_l2: .byte 1 +z_f2: .byte 1 +z_a2: .byte 1 + .equ r2ofs = z_b2-z_b + .equ oz_b2 = 6 + .equ oz_c2 = 7 + .equ oz_d2 = 8 + .equ oz_e2 = 9 + .equ oz_h2 = 10 + .equ oz_l2 = 11 + .equ oz_f2 = 12 + .equ oz_a2 = 13 + +z_xh: .byte 1 +z_xl: .byte 1 +z_yh: .byte 1 +z_yl: .byte 1 + +z_i: .byte 1 +z_r: .byte 1 + .equ oz_xh = 14 + .equ oz_xl = 15 + .equ oz_yh = 16 + .equ oz_yl = 17 + .equ oz_i = 18 + .equ oz_r = 19 + +z_istat: .byte 1 + .equ oz_istat = 20 + + .equ IM_MASK = 0x03 ;Mask IM 0..2 + .equ IM0 = 0 + .equ IM1 = 1 + .equ IM2 = 2 + + .equ IFF1 = 2 ;IFF1 Flag + .equ IFF2 = 3 ;IFF2 Flag + +#endif .cseg @@ -80,7 +133,6 @@ main: notraceon: .endif - .if PRINT_PC cpi z_pch,DBG_TRACE_BOTTOM brlo noprintpc @@ -90,7 +142,7 @@ notraceon: printnewline printstring "PC=" movw temp,z_pcl - rcall printhexw + lcall printhexw printstring " " noprintpc: .endif @@ -371,7 +423,6 @@ do_store_am: ret - ; ------------ Operation phase stuff ----------------- ;---------------------------------------------------------------- @@ -395,9 +446,9 @@ do_store_am: ;|ADC A,s |***V0*|Add with Carry |A=A+s+CY | ;|ADC HL,ss |**?V0*|Add with Carry |HL=HL+ss+CY | ;|ADD A,s |***V0*|Add |A=A+s | -;|ADD HL,ss |--?-0*|Add |HL=HL+ss | -;|ADD IX,pp |--?-0*|Add |IX=IX+pp | -;|ADD IY,rr |--?-0*|Add |IY=IY+rr | +;|ADD HL,ss |--*-0*|Add |HL=HL+ss | +;|ADD IX,pp |--*-0*|Add |IX=IX+pp | +;|ADD IY,rr |--*-0*|Add |IY=IY+rr | ;|AND s |**1P00|Logical AND |A=A&s | ;|BIT b,m |?*1?0-|Test Bit |m&{2^b} | ;|CALL cc,nn|------|Conditional Call |If cc CALL | @@ -413,9 +464,9 @@ do_store_am: ;|DEC s |***V1-|Decrement |s=s-1 | ;|DEC xx |------|Decrement |xx=xx-1 | ;|DEC ss |------|Decrement |ss=ss-1 | -;|DI |------|Disable Interrupts | | +;|DI |------|Disable Interrupts |IFF1 = IFF2 = 0 | ;|DJNZ e |------|Dec., Jump Non-Zero |B=B-1 till B=0 | -;|EI |------|Enable Interrupts | | +;|EI |------|Enable Interrupts |IFF1 = IFF2 = 1 | ;|EX [SP],HL|------|Exchange |[SP]<->HL | ;|EX [SP],xx|------|Exchange |[SP]<->xx | ;|EX AF,AF' |------|Exchange |AF<->AF' | @@ -476,7 +527,7 @@ do_store_am: ;|RRD |**0P0-|Rotate Right 4 bits |{A,[HL]}=->{A,[HL]} ##| ;|RST p |------|Restart | (p=0H,8H,10H,...,38H)| ;|SBC A,s |***V1*|Subtract with Carry |A=A-s-CY | -;|SBC HL,ss |**?V1*|Subtract with Carry |HL=HL-ss-CY | +;|SBC HL,ss |***V1*|Subtract with Carry |HL=HL-ss-CY | ;|SCF |--0-01|Set Carry Flag |CY=1 | ;|SET b,m |------|Set bit |m=mv{2^b} | ;|SLA m |**0P0*|Shift Left Arithmetic|m=m*2 | @@ -563,7 +614,6 @@ 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 @@ -591,6 +641,12 @@ do_store_am: #endif .endm +.macro do_z80_flags_H +#if EM_Z80 + bmov z_flags, ZFL_H, temp, AVR_H +#endif +.endm + .macro do_z80_flags_set_N #if EM_Z80 ori z_flags, (1< (" mov temp,opl - rcall printhex + lcall printhex printstring ") " .endif mov temp,z_a @@ -686,21 +742,21 @@ do_op_outa: ; out (opl),a ;|IN A,[n] |------|Input |A=[n] | ; ; -do_op_in: ; in a,(opl) +do_op_ina: ; in a,(opl) .if PORT_DEBUG printnewline printstring "Port read: (" mov temp,opl - rcall printhex + lcall printhex printstring ") -> " .endif mov temp2,opl lcall portRead - mov opl,temp + mov z_a,temp .if PORT_DEBUG - rcall printhex + lcall printhex printstring " " .endif ret @@ -1025,9 +1081,11 @@ do_op_addhl: lds temp2,z_h add opl,temp adc oph,temp2 + sts z_l,opl + sts z_h,oph in temp,sreg - bmov z_flags,ZFL_H, temp,AVR_H bmov z_flags,ZFL_C, temp,AVR_C + do_z80_flags_H do_z80_flags_clear_N ret @@ -1122,6 +1180,53 @@ do_op_rmem8: ; 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: + +#if EM_Z80 + sbrc z_flags,ZFL_N ;if add-op + rjmp op_da_sub ;then +#endif + +op_da_add: + ldi temp2,0 ; new C and H flag + sbrc z_flags,ZFL_H ; | + rjmp op_da_a01 ; if (H flag ... + mov temp,opl ; | + andi temp,0x0f ; | + cpi temp,0x0a ; or (lower nibble >= 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<