X-Git-Url: http://cloudbase.mooo.com/gitweb/avrcpm.git/blobdiff_plain/f24b3c790fd048b43b1d72e63a8a615a47f17cd9..12a27f27734b18ba4dea8d411095cf53c3870ef2:/avr/8080int-jmp.asm diff --git a/avr/8080int-jmp.asm b/avr/8080int-jmp.asm index e21d703..6a2df73 100644 --- a/avr/8080int-jmp.asm +++ b/avr/8080int-jmp.asm @@ -1,6 +1,6 @@ ; 8080 Interpreter. ; This is part of the Z80-CP/M emulator written by Sprite_tm. -; +; ; Copyright (C) 2010 Sprite_tm ; Copyright (C) 2010 Leo C. @@ -25,7 +25,7 @@ ; .dseg - +z_regs: z_b: .byte 1 z_c: .byte 1 z_d: .byte 1 @@ -33,9 +33,62 @@ 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 - + ;Init z80 z80_init: ldi z_pcl,low (IPLADDR) @@ -66,7 +119,7 @@ notraceon: printnewline printstring "PC=" movw temp,z_pcl - rcall printhexw + lcall printhexw printstring " " noprintpc: .endif @@ -92,14 +145,14 @@ noprintpc: ; ; instr fetch, op, store ; -.macro instr +.macro instr .ifndef opcjmp_table_pos_ .set todo_table_pos_ = PC ; Place the opcode jump table on the next available location. .equ opcjmp = (PC+255) & 0xff00 .set opcjmp_table_pos_ = opcjmp .endif - + .if todo_table_pos_ < opcjmp + 256 + 128 .if todo_table_pos_ + 3 >= opcjmp .set todo_table_pos_ = opcjmp + 256 + 128 @@ -121,15 +174,15 @@ noprintpc: .endif .if cnt_ == 1 ; jump direct to action - .if fetch_ ; - rjmp @0 ; - .endif + .if fetch_ ; + rjmp @0 ; + .endif .if op_ rjmp do_@1 ; do op and return to main - .endif - .if store_ ; - rjmp @2 ; - .endif + .endif + .if store_ ; + rjmp @2 ; + .endif .endif ; two or tree actions @@ -141,7 +194,7 @@ noprintpc: .if fetch_ ; must fetch .if op_ || store_ rcall @0 ; fetch and come back here - .else ; + .else ; rjmp @0 ; fetch and return to main .endif .endif @@ -154,20 +207,20 @@ noprintpc: .endif .if store_ ; must store rjmp @2 ; store is allways last - .endif - + .endif + .set todo_table_pos_ = PC .endif .endm - + ; ------------ Fetch phase stuff ----------------- ;.org (PC+255) & 0xff00 fetch_ops: -do_fetch_nop: +do_fetch_nop: ret do_fetch_a: @@ -273,7 +326,7 @@ do_fetch_rst: store_ops: do_store_nop: ret - + do_store_a: mov z_a,opl ret @@ -426,9 +479,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 | @@ -444,9 +497,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' | @@ -507,7 +560,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 | @@ -594,7 +647,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 @@ -612,8 +664,8 @@ do_store_am: .macro ldpmx ldi zh,high(@1*2) ; table must be page aligned - mov zl,@2 - lpm @0,z + mov zl,@2 + lpm @0,z .endm .macro do_z80_flags_V @@ -622,6 +674,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 @@ -717,21 +775,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 @@ -746,7 +804,7 @@ do_op_in: ; in a,(opl) ;|INC r |**-P0-|Increment |r=r+1 | ;|INC [HL] |**-P0-|Increment |[HL]=[HL]+1 | ; -; +; do_op_inc: ldi temp,1 add opl,temp @@ -809,7 +867,7 @@ do_op_deca: ;|INC xx |------|Increment |xx=xx+1 | ;|INC ss |------|Increment |ss=ss+1 | ; -; +; do_op_inc16: subi opl,low(-1) sbci oph,high(-1) @@ -821,7 +879,7 @@ do_op_inc16: ;|DEC xx |------|Decrement |xx=xx-1 | ;|DEC ss |------|Decrement |ss=ss-1 | ; -; +; do_op_dec16: subi opl, 1 sbci oph, 0 @@ -836,7 +894,7 @@ do_op_dec16: ; ; do_op_rlca: - ;Rotate Left Cyclical. All bits move 1 to the + ;Rotate Left Cyclical. All bits move 1 to the ;left, the msb becomes c and lsb. do_z80_flags_op_rotate lsl z_a @@ -855,8 +913,8 @@ do_op_rlc_noc: ;|RRCA |---- *|Rotate Right Circular|A=->A | ; ; -do_op_rrca: - ;Rotate Right Cyclical. All bits move 1 to the +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 z_a @@ -874,9 +932,9 @@ do_op_rrc_noc: ;|----------|SZHP C|---------- 8080 ----------------------------| ;|RRA |---- *|Rotate Right Acc. |A=->{CY,A} | ; -; -do_op_rra: - ;Rotate Right. All bits move 1 to the right, the lsb +; +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 @@ -893,9 +951,9 @@ do_op_rra: ;|----------|SZHP C|---------- 8080 ----------------------------| ;|RLA |---- *|Rotate Left Acc. |A={CY,A}<- | ; -; +; do_op_rla: - ;Rotate Left. All bits move 1 to the left, the msb + ;Rotate Left. All bits move 1 to the left, the msb ;becomes c, c becomes lsb. clc sbrc z_flags,ZFL_C @@ -1056,9 +1114,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 @@ -1082,7 +1142,7 @@ do_op_sthl: ;store hl to mem loc in opl:h ;---------------------------------------------------------------- ;|LD dst,src|------|Load |dst=src | ; -; +; do_op_rmem16: movw xl,opl mem_read_d opl @@ -1138,13 +1198,13 @@ do_op_rmem8: ; ; --------------------- ; | N | H | low |H' | -; | | |nibble | | +; | | |nibble | | ; |---+---+-------+---| -; | 0 | * | 0-9 | 0 | -; | 0 | * | a-f | 1 | -; | 1 | 0 | * | 0 | -; | 1 | 1 | 6-f | 0 | -; | 1 | 1 | 0-5 | 1 | +; | 0 | * | 0-9 | 0 | +; | 0 | * | a-f | 1 | +; | 1 | 0 | * | 0 | +; | 1 | 1 | 6-f | 0 | +; | 1 | 1 | 0-5 | 1 | ; --------------------- ; ; Ohter flags: @@ -1158,7 +1218,7 @@ do_op_rmem8: do_op_da: #if EM_Z80 - sbrc z_flags,ZFL_N ;if add-op + sbrc z_flags,ZFL_N ;if add-op rjmp op_da_sub ;then #endif @@ -1172,8 +1232,8 @@ op_da_add: brlo op_da_a10 ; | op_da_a01: ; then ldi oph,0x06 ; add 6 to lower nibble - add opl,oph ; - brhc op_da_02 ; if + add opl,oph ; + brhc op_da_02 ; if ori temp2,(1<= 0xA0) - brlo op_da_a13 ; + brlo op_da_a13 ; op_da_a12: ; ldi oph,0x60 ; add 6 to lower nibble add opl,oph ; @@ -1205,7 +1265,7 @@ do_op_da: ldi temp2,0 ;new C and H flag ldi oph,0 ;oph: what to add - sbrc z_flags,ZFL_N ;if add-op + sbrc z_flags,ZFL_N ;if add-op rjmp op_da_sub ;then op_da_add: mov temp,opl ; | @@ -1219,7 +1279,7 @@ op_da_add: rjmp op_da_a02 ; if (C flag ... cpi opl,0x90 ; |... or upper nibble >= 0x90) brlo op_da_a03 ; | -op_da_a02: +op_da_a02: ori oph,0x60 ; add 0x60 ori temp2,(1<= 0xA0) - brlo op_da_a13 ; -op_da_a12: + brlo op_da_a13 ; +op_da_a12: ori oph,0x60 ; add 0x60 ori temp2,(1<HL | ;|EX DE,HL |------|Exchange |DE<->HL | ;-----------------------------Z80-------------------------------- -; +; do_op_exhl: lds temp,z_l lds temp2,z_h @@ -1393,7 +1453,7 @@ do_op_ifnz: sbrs z_flags, ZFL_Z ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zurueck zu main ret ;---------------------------------------------------------------- @@ -1408,7 +1468,7 @@ do_op_ifz: sbrc z_flags, ZFL_Z ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zurueck zu main ret ;---------------------------------------------------------------- @@ -1423,7 +1483,7 @@ do_op_ifnc: sbrs z_flags, ZFL_C ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zuruech zu main ret ;---------------------------------------------------------------- @@ -1438,7 +1498,7 @@ do_op_ifc: sbrc z_flags, ZFL_C ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zuruech zu main ret ;---------------------------------------------------------------- @@ -1453,7 +1513,7 @@ do_op_ifpo: sbrs z_flags, ZFL_P ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zuruech zu main ret ;---------------------------------------------------------------- @@ -1468,7 +1528,7 @@ do_op_ifpe: sbrc z_flags, ZFL_P ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zuruech zu main ret ;---------------------------------------------------------------- @@ -1483,7 +1543,7 @@ do_op_ifp: ;sign positive, aka s=0 sbrs z_flags, ZFL_S ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zuruech zu main ret ;---------------------------------------------------------------- @@ -1498,15 +1558,15 @@ do_op_ifm: ;sign negative, aka s=1 sbrc z_flags, ZFL_S ret pop temp ; nix tun - pop temp ; direkt zuruech zu main + pop temp ; direkt zuruech zu main ret - + ; ----------------------- Opcode decoding ------------------------- ; Lookup table for Z80 opcodes. Translates the first byte of the instruction word into three ; operations: fetch, do something, store. -; The table is made of 256 words. +; The table is made of 256 words. ; .org (PC+255) & 0xff00 @@ -1521,7 +1581,7 @@ instr do_fetch_B, op_DEC, do_store_B ;05 ;DEC B instr do_fetch_DIR8, op_nop, do_store_B ;06 ;LD B,n instr do_fetch_nop, op_RLCA, do_store_nop ;07 ;RLCA instr do_fetch_nop, op_INV, do_store_nop ;08 ;EX AF,AF' -instr do_fetch_BC, op_ADDHL, do_store_HL ;09 ;ADD HL,BC +instr do_fetch_BC, op_ADDHL, do_store_nop ;09 ;ADD HL,BC instr do_fetch_MBC, op_nop, do_store_nop ;0A ;LD A,(BC) instr do_fetch_BC, op_DEC16, do_store_BC ;0B ;DEC BC instr do_fetch_C, op_INC, do_store_C ;0C ;INC C @@ -1537,7 +1597,7 @@ instr do_fetch_D, op_DEC, do_store_D ;15 ;DEC D instr do_fetch_DIR8, op_nop, do_store_D ;16 nn ;LD D,n instr do_fetch_nop, op_RLA, do_store_nop ;17 ;RLA instr do_fetch_nop, op_INV, do_store_nop ;18 oo ;JR o -instr do_fetch_DE, op_ADDHL, do_store_HL ;19 ;ADD HL,DE +instr do_fetch_DE, op_ADDHL, do_store_nop ;19 ;ADD HL,DE instr do_fetch_MDE, op_nop, do_store_nop ;1A ;LD A,(DE) instr do_fetch_DE, op_DEC16, do_store_DE ;1B ;DEC DE instr do_fetch_E, op_INC, do_store_E ;1C ;INC E @@ -1553,7 +1613,7 @@ instr do_fetch_H, op_DEC, do_store_H ;25 ;DEC H instr do_fetch_DIR8, op_nop, do_store_H ;26 nn ;LD H,n instr do_fetch_A, op_DA, do_store_A ;27 ;DAA instr do_fetch_nop, op_INV, do_store_nop ;28 oo ;JR Z,o -instr do_fetch_HL, op_ADDHL, do_store_HL ;29 ;ADD HL,HL +instr do_fetch_HL, op_ADDHL, do_store_nop ;29 ;ADD HL,HL instr do_fetch_DIR16, op_RMEM16, do_store_HL ;2A nn nn ;LD HL,(nn) instr do_fetch_HL, op_DEC16, do_store_HL ;2B ;DEC HL instr do_fetch_L, op_INC, do_store_L ;2C ;INC L @@ -1569,7 +1629,7 @@ instr do_fetch_MHL, op_DEC, do_store_MHL ;35 ;DEC (HL) instr do_fetch_DIR8, op_nop, do_store_MHL ;36 nn ;LD (HL),n instr do_fetch_nop, op_SCF, do_store_nop ;37 ;SCF instr do_fetch_nop, op_INV, do_store_nop ;38 oo ;JR C,o -instr do_fetch_SP, op_ADDHL, do_store_HL ;39 ;ADD HL,SP +instr do_fetch_SP, op_ADDHL, do_store_nop ;39 ;ADD HL,SP instr do_fetch_DIR16, op_RMEM8, do_store_A ;3A nn nn ;LD A,(nn) instr do_fetch_SP, op_DEC16, do_store_SP ;3B ;DEC SP instr do_fetch_nop, op_INCA, do_store_nop ;3C ;INC A @@ -1632,7 +1692,7 @@ instr do_fetch_H, op_nop, do_store_MHL ;74 ;LD (HL),H instr do_fetch_L, op_nop, do_store_MHL ;75 ;LD (HL),L instr do_fetch_nop, op_INV, do_store_nop ;76 ;HALT instr do_fetch_A, op_nop, do_store_MHL ;77 ;LD (HL),A -instr do_fetch_b, op_nop, do_store_A ;78 ;LD A,B +instr do_fetch_B, op_nop, do_store_A ;78 ;LD A,B instr do_fetch_C, op_nop, do_store_A ;79 ;LD A,C instr do_fetch_D, op_nop, do_store_A ;7A ;LD A,D instr do_fetch_E, op_nop, do_store_A ;7B ;LD A,E @@ -1731,7 +1791,7 @@ instr do_fetch_RST, op_nop, do_store_CALL ;D7 ;RST 10H instr do_fetch_nop, op_IFC, do_store_RET ;D8 ;RET C instr do_fetch_nop, op_nop, do_store_nop ;D9 ;EXX instr do_fetch_DIR16, op_IFC, do_store_PC ;DA nn nn ;JP C,nn -instr do_fetch_DIR8, op_IN, do_store_A ;DB nn ;IN A,(n) +instr do_fetch_DIR8, op_INA, do_store_nop ;DB nn ;IN A,(n) instr do_fetch_DIR16, op_IFC, do_store_CALL ;DC nn nn ;CALL C,nn instr do_fetch_nop, op_INV, do_store_nop ;DD ;(Z80 specific) instr do_fetch_DIR8, op_SBCFA, do_store_nop ;DE nn ;SBC A,n @@ -1774,7 +1834,7 @@ instr do_fetch_RST, op_nop, do_store_CALL ;FF ;RST 38H ; Lookup table, stolen from z80ex, Z80 emulation library. ; http://z80ex.sourceforge.net/ -; The S, Z, 5 and 3 bits and the parity of the lookup value +; The S, Z, 5 and 3 bits and the parity of the lookup value ; .org (PC+255) & 0xff00 .org opcjmp + 256 @@ -1811,6 +1871,5 @@ sz53p_tab: .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8 .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0 .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac - -; vim:set ts=8 noet nowrap +; vim:set ts=8 noet nowrap