X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/30d1329e8e5c029a87f657baace698d1d7031f9e..296050043a19ee9b18c850dad01cc36ee64bd7b0:/z180/ddtz.180 diff --git a/z180/ddtz.180 b/z180/ddtz.180 index e544b08..5f8bf20 100644 --- a/z180/ddtz.180 +++ b/z180/ddtz.180 @@ -2,14 +2,18 @@ .z80 extrn ?const,?conin,?cono + extrn getiff + extrn selbnk,@cbnk global ddtz,bpent global $stack include config.inc + if CPU_Z180 include z180reg.inc include z180.lib + endif BS equ 08h TAB equ 09h @@ -51,10 +55,6 @@ comend macro endif endm -; repeat execution of last common code snippet -comrep macro - call ?exclst - endm @@ -97,7 +97,7 @@ ddtz: ld sp,$stack ld a,(wstrtflg) ;check warm start flag or a - jr nz,ddtz_w +;;; jr nz,ddtz_w exx ld hl,sysramc @@ -105,14 +105,12 @@ ddtz: ld bc,topcodend-topcodbeg ldir - ld hl,vartab - ld de,ddtram - ld bc,vartabe-vartab - ldir exx + if CPU_Z180 ld a,e ld (ubbr),a + endif ddtz_w: ld hl,MSG ;073c @@ -251,179 +249,179 @@ DELC1: ret DELL: - ld a,b ;081b - or a ;081c - ret z ;081d - call DELC ;081e - jr DELL ;0821 + ld a,b ; + or a ; + ret z ; + call DELC ; + jr DELL ; INLINE: - push hl ;0823 - ld hl,CI.BUF ;0824 - ld c,(hl) ;0827 - inc hl ;0828 - ld b,000h ;0829 - inc hl ;082b + push hl ; + ld hl,CI.BUF ; + ld c,(hl) ; + inc hl ; + ld b,000h ; + inc hl ; inlnxtch: - ld a,c ;082c - or a ;082d - jr z,inl_e ;082e - call $ci ;0830 - cp CR ;0833 - jr z,inl_e ;0835 - cp LF ;0837 - jr z,inl_e ;0839 - cp BS ;083b - jr nz,l0844h ;083d - call DELC ;083f - jr inlnxtch ;0842 + ld a,c ; + or a ; + jr z,inl_e ; + call $ci ; + cp CR ; + jr z,inl_e ;Accept line + cp LF ; + jr z,inl_e ;Accept line + cp BS ; + jr nz,l0844h ; + call DELC ;Delete Char + jr inlnxtch ; l0844h: - cp DEL ;0844 - jr nz,l084dh ;0846 - call DELC ;0848 - jr inlnxtch ;084b + cp DEL ; + jr nz,l084dh ; + call DELC ;Delete Char + jr inlnxtch ; l084dh: - cp CNTRX ;084d - jr nz,l0856h ;084f - call DELL ;0851 - jr inlnxtch ;0854 + cp CNTRX ; + jr nz,l0856h ; + call DELL ;Delete Line + jr inlnxtch ; l0856h: - cp TAB ;0856 - jr nz,l085ch ;0858 - ld a,' ' ;085a + cp TAB ; + jr nz,l085ch ; + ld a,' ' ; l085ch: - ld (hl),a ;085c - cp ' ' ;085d - jr nc,l0869h ;085f - ld a,'^' ;0861 - call $co ;0863 - ld a,(hl) ;0866 - add a,'@' ;0867 + ld (hl),a ; + cp ' ' ; + jr nc,l0869h ; + ld a,'^' ;Controll characters + call $co ; + ld a,(hl) ; + add a,'@' ; l0869h: - call $co ;0869 - inc hl ;086c - inc b ;086d - dec c ;086e - jr inlnxtch ;086f + call $co ; + inc hl ; + inc b ; + dec c ; + jr inlnxtch ; inl_e: - ld hl,ci.buf+1 ;0871 - ld (hl),b ;0874 - call CRLF ;0875 - ld de,ci.buf+1 ;0878 - ld a,(de) ;087b - ld b,a ;087c - ld c,000h ;087d - inc b ;087f + ld hl,ci.buf+1 ; + ld (hl),b ; + call CRLF ; + ld de,ci.buf+1 ; + ld a,(de) ; + ld b,a ; + ld c,000h ; + inc b ; l0880h: - inc de ;0880 - dec b ;0881 - jr z,l08b2h ;0882 - ld a,(de) ;0884 - bit 0,c ;0885 - call z,UPCASE ;0887 - ld (de),a ;088a - cp '''' ;088b - jr nz,l0880h ;088d - push de ;088f - dec de ;0890 - ld a,(de) ;0891 - cp '''' ;0892 - jr z,l08aeh ;0894 - dec de ;0896 - ld a,(de) ;0897 - cp '^' ;0898 - jr z,l08a2h ;089a - dec de ;089c - ld a,(de) ;089d - cp '^' ;089e - jr nz,l08aeh ;08a0 + inc de ; + dec b ; + jr z,l08b2h ; + ld a,(de) ; + bit 0,c ; + call z,UPCASE ; + ld (de),a ; + cp '''' ; + jr nz,l0880h ; + push de ; + dec de ; + ld a,(de) ; + cp '''' ; + jr z,l08aeh ; + dec de ; + ld a,(de) ; + cp '^' ; + jr z,l08a2h ; + dec de ; + ld a,(de) ; + cp '^' ; + jr nz,l08aeh ; l08a2h: - inc de ;08a2 - push bc ;08a3 - call sub_0a0eh ;08a4 - pop bc ;08a7 - dec de ;08a8 - ld a,(de) ;08a9 - cp '''' ;08aa - jr z,l08afh ;08ac + inc de ; + push bc ; + call sub_0a0eh ; + pop bc ; + dec de ; + ld a,(de) ; + cp '''' ; + jr z,l08afh ; l08aeh: - inc c ;08ae + inc c ; l08afh: - pop de ;08af - jr l0880h ;08b0 + pop de ; + jr l0880h ; l08b2h: - xor a ;08b2 - ld (de),a ;08b3 - ld de,ci.buf+2 ;08b4 - pop hl ;08b7 - ret ;08b8 + xor a ; + ld (de),a ; + ld de,ci.buf+2 ; + pop hl ; + ret ; UPCASE: - cp 'a' ;08b9 - ret c ;08bb - cp 'z'+1 ;08bc - ret nc ;08be - and 05fh ;08bf - ret ;08c1 + cp 'a' ; + ret c ; + cp 'z'+1 ; + ret nc ; + and 05fh ; + ret ; out.hl.@: - call out.hl ;08c2 - push de ;08c5 - push hl ;08c6 - ld de,(offs.@) ;08c7 - ld a,d ;08cb - or e ;08cc - jr z,l08ddh ;08cd - call OUTBL ;08cf - ld a,'@' ;08d2 - call OUTCHAR ;08d4 - and a ;08d7 - sbc hl,de ;08d8 - call out.hl ;08da + call out.hl ; + push de ; + push hl ; + ld de,(offs.@) ; + ld a,d ; + or e ; + jr z,l08ddh ; + call OUTBL ; + ld a,'@' ; + call OUTCHAR ; + and a ; + sbc hl,de ; + call out.hl ; l08ddh: - pop hl ;08dd - pop de ;08de - ret ;08df + pop hl ; + pop de ; + ret ; out.bin.w: - ld a,h ;08e0 - call out.bin.b ;08e1 - ld a,l ;08e4 + ld a,h ; + call out.bin.b ; + ld a,l ; out.bin.b: - ld b,008h ;08e5 + ld b,008h ; l08e7h: - add a,a ;08e7 - push af ;08e8 - ld a,0 ;08e9 - adc a,a ;08eb - call out.digit ;08ec - pop af ;08ef - djnz l08e7h ;08f0 - ld a,'"' ;08f2 - jp OUTCHAR ;08f4 + add a,a ; + push af ; + ld a,0 ; + adc a,a ; + call out.digit ; + pop af ; + djnz l08e7h ; + ld a,'"' ; + jp OUTCHAR ; sub_08f7h: - ld a,'-' ;08f7 - call OUTCHAR ;08f9 - dec hl ;08fc - jp cpl.hl ;08fd + ld a,'-' ; + call OUTCHAR ; + dec hl ; + jp cpl.hl ; out.hl.decm: - push hl ;0900 - call sub_08f7h ;0901 - db 3eh ;0904 ld a,0E5h + push hl ; + call sub_08f7h ; + db 3eh ; ld a,0E5h out.hl.dec: push hl - ld b,6 ;0906 - call sub_0917h ;0908 - pop hl ;090b - ld a,'.' ;090c - call OUTCHAR ;090e + ld b,6 ; + call sub_0917h ; + pop hl ; + ld a,'.' ; + call OUTCHAR ; l0911h: - call OUTBL ;0911 - djnz l0911h ;0914 - ret ;0916 + call OUTBL ; + djnz l0911h ; + ret ; sub_0917h: @@ -918,7 +916,8 @@ do_op_sub: jr l0b58h ;0b5e do_op_mlt: - push bc ;0b60 + push bc + if CPU_Z180 ld b,h ld c,e ld h,e @@ -930,8 +929,24 @@ do_op_mlt: add a,c add a,e ld h,a - pop bc ;0b72 - jr l0b58h ;0b73 + else + ld b,h + ld c,l + ld hl,0 + ld a,16 +mlt_1: + add hl,hl + ex de,hl + add hl,hl + ex de,hl + jr nc,mlt_2 + add hl,bc +mlt_2: + dec a + jr nz,mlt_1 + endif + pop bc + jr l0b58h do_op_div: call DIV_HL_DE ;0b75 @@ -1636,67 +1651,80 @@ sub_0f91h: bpddtz: if ROMSYS - ld h,ROMEN ;0fcd - jr z,l0fd2h ;0fcf - inc h ;0fd1 + ld h,ROMEN + jr z,l0fd2h + inc h l0fd2h: - push hl ;0fd2 save rom enable stat + push hl ;save rom enable stat + endif + push bc + push de + push ix + push iy + ld a,i + ld h,a + ld l,000h + push hl ;save I register + + if CPU_Z180 + ld a,0f3h ;DI + jp po,l0fe6h + ld a,0fbh ;EI + else ;NMOS Z80 design flaw + call getiff ;return Carry set, if INTs are disabled. + ld a,0f3h ;DI + jr c,l0fe6h + ld a,0fbh ;EI endif - push bc ;0fd3 - push de ;0fd4 - push ix ;0fd5 - push iy ;0fd7 - ld a,i ;0fd9 - ld h,a ;0fdb - ld l,000h ;0fdc - push hl ;0fde - ld a,0f3h ;0fdf DI - jp po,l0fe6h ;0fe1 - ld a,0fbh ;0fe4 EI l0fe6h: - ld (reg.iff),a ;0fe6 - ld hl,ivtab ;0fe9 - ld a,h ;0fec - ld i,a ;0fed - call ddtei ;0fef - ex af,af' ;0ff2 - push af ;0ff3 - exx ;0ff4 - push bc ;0ff5 - push de ;0ff6 - push hl ;0ff7 - call bp.unset ;0ff8 - in0 a,(itc) ;0ffb - jp p,l1017h ;0ffe - res TRAP,a ;1001 - out0 (itc),a ;1003 - bit UFO,a ;1006 - jr z,l1011h ;1008 - ld hl,(REG.PC) ;100a - dec hl ;100d - ld (REG.PC),hl ;100e + ld (reg.iff),a + ld hl,ivtab + ld a,h + ld i,a + call ddtei + ex af,af' + push af + exx + push bc + push de + push hl + call bp.unset + if CPU_Z180 + in0 a,(itc) + jp p,l1017h + res TRAP,a + out0 (itc),a + bit UFO,a + jr z,l1011h + ld hl,(REG.PC) + dec hl + ld (REG.PC),hl l1011h: - ld hl,MSG_trap ;1011 - call PSTR ;1014 + ld hl,MSG_trap + call PSTR l1017h: - ld a,(XBFE8) ;1017 - dec a ;101a - jr z,l1051h ;101b - call inchar ;101d - jr c,l102eh ;1020 - call sub_1059h ;1022 - and a ;1025 - jp z,l1183h ;1026 - and 083h ;1029 - jp z,l284ah ;102b + endif + + ld a,(XBFE8) + dec a + jr z,l1051h + call inchar + jr c,l102eh + call sub_1059h + and a + jp z,l1183h + and 083h + jp z,l284ah l102eh: - call sub_0e68h ;102e + call sub_0e68h call prnt_cpustat ;1031 - jp DDTZML ;1034 + jp DDTZML + if CPU_Z180 MSG_trap: DB CR,LF,'Undefined opcode trap' DB CR,LF,0 + endif l1051h: ld (XBFE8),a ;1051 @@ -1830,30 +1858,6 @@ l1144h: ld l,(ix+002h) ;114e ld h,(ix+003h) ;1151 - if 0 - - comst ;1154 - ld a,(hl) ;1158 - comend - ld (ix+001h),a ;1159 - ld a,(ddtrst) ;115c - comst ;115f - ld (hl),a ;1163 - comend - and 038h ;1164 - ld h,000h ;1166 - ld l,a ;1168 - ld a,0c3h ;1169 - comrep ;116b - inc hl ;116e - ld de,bpent ;116f - ld a,e ;1172 - comrep ;1173 - inc hl ;1176 - ld a,d ;1177 - comrep ;1178 - - else ld a,(ddtrst) ;115c comst ;115f @@ -1873,7 +1877,6 @@ l1144h: ld (hl),d ;1177 comend - endif l117bh: ld de,BP_SIZE ;117b @@ -2146,8 +2149,15 @@ sub_1315h: ret ;1329 b_0x132A_start: + if ROMSYS + DC 'ROMSEL' + endif + if CPU_Z180 DC 'CBAR' DC 'BBR' + else + DC 'BNK' + endif DC 'BC''' DC 'DE''' DC 'HL''' @@ -2179,15 +2189,21 @@ b_0x132A_start: DC 'I' DC 'F''' DC 'F' - if ROMSYS - DC 'ROMSEL' - endif DB 0 b_0x136C_start: + if ROMSYS + defb 000h ;13cf + defw uromen ;13d0 + endif + if CPU_Z180 defb 000h ;136c defw ucbar ;136d defb 000h ;136f defw ubbr ;1370 + else + defb 000h ;136f + defw ubnk ;1370 + endif defb 003h ;1372 defw reg.c2 ;1373 defb 003h ;1375 @@ -2250,10 +2266,6 @@ b_0x136C_start: defw reg.f2 ;13ca defb 000h ;13cc defw reg.f ;13cd - if ROMSYS - defb 000h ;13cf - defw uromen ;13d0 - endif CMD.S: ld hl,(lst.S) ;13d2 call get_lastarg_def ;13d5 @@ -2303,6 +2315,7 @@ CMD.I: ld (lst.IP),hl ;1427 ld b,h ;142a ld c,l ;142b + if CPU_Z180 ld a,b ;142c or a ;142d jr nz,l1442h ;142e @@ -2317,6 +2330,7 @@ l143fh: ld a,(hl) ;143f jr l1444h ;1440 l1442h: + endif in a,(c) ;1442 l1444h: push af ;1444 @@ -2339,6 +2353,7 @@ CMD.O: ld (lst.OP),hl ;146c ld b,h ;146f ld c,l ;1470 + if CPU_Z180 ld a,b ;1471 or a ;1472 jr nz,l1489h ;1473 @@ -2352,13 +2367,16 @@ CMD.O: cp cbr ;1484 jp z,ERROR ;1486 l1489h: + endif pop af ;1489 out (c),a ;148a ret ;148c + if CPU_Z180 l148dh: pop af ;148d ld (hl),a ;148e ret ;148f + endif CMD.V: call get_arg3 ;1490 get from, size, to @@ -2724,10 +2742,9 @@ l1698h: ret ;169a ; Read Intel Hex File from console. - CMD.R: ld hl,0 ;169b - call get_lastarg_def ;169e + call get_lastarg_def ;169e get offset from command line push hl ;16a1 ld hl,0 ;16a2 ld (HILOD),hl ;16a5 @@ -2749,15 +2766,15 @@ w_recstart: jr z,l16deh ;16c4 l16c6h: call i.gethexbyte ;16c6 - pop de ;16c9 + pop de ;16c9 offset push de ;16ca push hl ;16cb add hl,de ;16cc call i.storebyte ;16cd pop hl ;16d0 inc hl ;16d1 - djnz l16c6h ;16d2 - call i.gethexbyte ;16d4 + djnz l16c6h ;16d2 repeat for record len + call i.gethexbyte ;16d4 checksum ld a,c ;16d7 and a ;16d8 jp nz,ERROR ;16d9 exit if checksum error @@ -2798,10 +2815,10 @@ i.getchar: i.storebyte: push af ;1708 push de ;1709 - ld de,TPA ;170a + ld de,TPA ;170a lowest allowed load address call CP.HL.DE ;170d jp c,ERROR ;1710 - ld de,$stcka ;1713 + ld de,$stcka ;1713 highest allowed load address call CP.HL.DE ;1716 jp nc,ERROR ;1719 ld de,(HILOD) ;171c @@ -2817,7 +2834,7 @@ l1734h: pop de ;1734 pop af ;1735 comst ;1736 - ld (hl),a ;173a + ld (hl),a ;173a store byte comend ret ;173b @@ -6094,10 +6111,14 @@ l28dbh: pop bc ;28f8 pop af ;28f9 ex (sp),hl ;28fa -?exclst: + if CPU_Z180 push hl ;28fb ld hl,(ubbr) ;2900 + else + push af ;28fb + ld a,(ubnk) ;2900 + endif if ROMSYS push af ;28fc ld a,(uromen) ;28fd @@ -6115,178 +6136,100 @@ ddtram: ; The following 2 params are changeable by user. ; Should these moved to top ram? ; -ddtrst: inidat ; - rst DRSTNUM ;rst used by ddtz - inidate ; -ddtei: inidat ; - ei ;ints enabled/disabled while ddtz is running +ddtrst: rst DRSTNUM ;rst used by ddtz +ddtei: ei ;ints enabled/disabled while ddtz is running ret ; - inidate ; offs.pc: - inidat dw TPA - inidate offs.@: - inidat dw 0 - inidate CMD_ERR: - inidat dw 0 - inidate CMD_RPT: - inidat dw DDTZML - inidate ci.buf: - inidat db 80 rept 83 db 0 endm - inidate CON.COL: - inidat db 0 - inidate XA747: - inidat db 0 - inidate bp_tab: - inidat rept BP_CNT db 0,0 dw 0,0,0 endm BP_SIZE equ 8 - inidate sexp1: - inidat dw sexpbuf - inidate sexp2: - inidat dw sexpbuf - inidate sexpbuf: - inidat rept 128 db 0 endm - inidate sexpbufe: msg.Y: - inidat dc 'Y0' - inidate reg.Y: - inidat rept 10 dw 0 endm - inidate lst.S: - inidat dw 0 - inidate lst.IP: - inidat dw 0 - inidate lst.OP: - inidat dw 0 - inidate lst.OD: - inidat db 0 - inidate lst.Qj: - inidat db 0 - inidate lst.D: - inidat dw 0 - inidate HILOD: - inidat dw 0 - inidate MAXLOD: - inidat dw 0 - inidate XB068: - inidat dw 0 - inidate lst.A: - inidat dw 0 - inidate XB06C: - inidat dw 0 - inidate pfx.IXY: - inidat db 000h - inidate is.pfx.IXY: - inidat db 000h - inidate lst.L: - inidat dw 0 - inidate XBE01: - inidat dw 0 - inidate XBE03: - inidat db 000h - inidate XBEDD: - inidat ret ;ret cc and a pop hl inc hl jp (hl) - inidate XBFE8: - inidat db 0 - inidate TCFLG: - inidat db 0 - inidate XBFEA: - inidat db 0 - inidate TCCSTR: - inidat dw 0 - inidate TCNFLG: - inidat db 0 - inidate TRJFLG: - inidat db 0 - inidate wstrtflg: - inidat db 1 - inidate cseg vartabe: @@ -6323,8 +6266,13 @@ reg.b: db 0 ; 0fe61h udcntl: db CWAITIO ; 0fe62h (mem-, io- wait) uromen: db ROM_DIS ; 0fe63h endif + if CPU_Z180 ubbr: db 0 ; 0fe64h ucbar: db USR$CBAR ; 0fe65h + else + db 0 ; 0fe64h +ubnk: db 0 ; 0fe65h + endif reg.f: db 0 ; 0fe66h reg.a: db 0 ; 0fe67h reg.l: db 0 ; 0fe68h @@ -6335,10 +6283,15 @@ $go: if ROMSYS out (000h),a ;064c fe6c out0 (dcntl),l ;064e - pop hl ;0651 + pop hl endif + if CPU_Z180 out0 (cbar),h ;0652 out0 (bbr),l ;0655 + else + ld a,h + call selbnk + endif pop af ;0658 pop hl ;0659 ld sp,(reg.sp) ;065a @@ -6356,11 +6309,20 @@ bpent: ld (reg.sp),sp ;066a ld sp,reg.l ;066e push af ;0671 + if CPU_Z180 in0 h,(cbar) ;0672 in0 l,(bbr) ;0675 - push hl ;0678 ld a,SYS$CBAR ;0679 out0 (cbar),a ;067b +;;; TODO: bbr? + else + ld a,(@cbnk) + ld h,a + xor a + ld l,a + call selbnk + endif + push hl ;0678 if ROMSYS in0 l,(dcntl) ;067e @@ -6380,15 +6342,26 @@ bpent: pop af ;069a endif + if CPU_Z180 out0 (cbar),h ;0694 out0 (bbr),l ;0697 pop hl ;069b + else + call selbnk + pop af + endif ?exeit: ds ?lcmax+2 push af ;069f + if CPU_Z180 ld a,SYS$CBAR ;06a0 out0 (cbar),a ;06a2 +;;; TODO: bbr? + else + xor a + call selbnk + endif if ROMSYS ld a,ROM_EN ;06a5 out (000h),a ;06a7