MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第8回]
●Z80ソースプログラムを8080ソースにコンバート
ND80Z3.5(ND80ZV)用のZBH3BASICシステムプログラムをMYCPU80に移植するためには、Z80固有の命令を使って書かれている部分を8080の命令で書き直さなければなりません。
どうやってそれを行なうか。
最初はそこのところであれこれ迷いました。
結局落ち着いた結論は、ソースプログラムレベルで直すという方法でした。
MYCPU80には8080アセンブラが付属しています。
これはND80Z3.5(ND80ZV)にも付属しています。
ですからZ80ニーモニックで書かれたソースプログラムを8080ニーモニックで書き換えれば、8080アセンブラを使ってMYCPU80用のマシン語プログラムを作成することができます。
これはちょっと回り道のようですが、結局はそれが最もよい方法だと考えました。
そのように考えることは簡単ですが、ものごと「言うは易く行うは難し」です。
具体的に言いますとこういうことです。
Z80ニーモニックではLD A,Bと書いているところをMOV A,Bに変更します。
なんだ簡単じゃないか、と思われたならそれは早計というものです。
なかなかそんな簡単なものじゃありませんです。
LD (HL),A
LD A,(HL)
はそれぞれ
MOV M,A
MOV A,M
になります。
そこまではそれこそ序の口です。
LD (DE),A
LD A,(DE)
LD (BC),A
LD A,(BC)
になりますと、
STAX D
LDAX D
STAX B
LDAX B
にしなければなりません。
ADD HL,DE
ADD HL,BC
は
DAD D
DAD B
です。
ここまでくると部分的に一部の文字を置き換えるのではなくて、完全に置き換えなくてはなりません。
文字列の置き換えということになりますと、そりゃあもうコンバートプログラムを作って、それにやらせることになりますでしょう。
といっても、まあ、そうは出番のあるものではありません。
おそらく今回の作業が終ればあとは用無しということになりますでしょう。
そこでやっつけ仕事風に力技でのプログラミングとなりました。
Borland C++で書きました。
プログラムのソースリストはのちほどお見せすることにいたします。
●Z80ソースプログラム(ZMON1M.TXT)
まずはプログラムの成果を見ていただきましょう。
こちらはZ80ソースプログラムです。
前回お見せしましたND80Z3.5(ND80ZV)システムROMメモリマップでアドレス1000〜に置かれているZMON1M.TXTです。
これはCP/MのBIOSに相当する基本サブルーチンプログラムです。
;;; NEW MONITOR SUBROUTINE (FOR NEW BS) ;;; 10/6/17 for ND80Z3 ;6/18 6/19 6/20 6/21 6/22 6/23 ;7/2 7/23 8/12 ; ORG $1000 ;;; ;SOUTSB=$067C SINSB=$06A0 ;;; CMDT1=$1D00 CMDT2=$1E00 CMDT0=$1F00 ;;; AUPK=$3E04 WFLO=$3E13 ;;; RENTP=$1803 ROMST=$1800 ;CLR=$1803 SCEDT=$1806 SOUTJ=$1809 ASOUTJ=$180F LCDOT=$1830 LCDINSB=$1839 ;;; HOWT=$1F80 SRRYT=$1F85 WHATT=$1F8B ERRDT=$1FA9 ;;; DAUPK=$6D3C DWFLO=$6D4B ;;; TXTS=$F052 CURAD=$F054 TXTE=$F063 PRTCK=$F065 MODE=$F070 PROG=$F071 LPSW=$F079 PKETA=$F0B5 NMEND=$F0B6 LCDMK=$F0D9 DEFFN=$F0FF SKETA=$F185 SDATA=$F186 ; BFCNT=$F2F5 ; ATRNCK=$FEE4 ;;; DREG1=$FFFC AREG1=$FFFE ;;; JP ROMST KEY:RET NOP NOP JP SCEDT RET NOP NOP SCRL:JP CRLF JP CLR RET NOP NOP ADISP:JP ADSPS DEDP:JP DEDSP JP CRLF JP DPKIN PRTR:RET;JP PRTRS NOP NOP SPJMP:JP SPJP HDCMP:JP HDCP JP HOWDP SRYDP:JP SORRY WHTDP:JP WHAT REENT:JP RENTP JP DECIN SPCDP:JP SPDP INKEY:JP INKY ASHX1:JP AHX1 ASHX2:JP AHX2 ASHX4:JP AHX4 HXDP1:JP HDP1 HXDP2:JP HDP2 HXDP4:JP HDP4 ADRD:JP ADRD1 BREAK:RET; BREAK CHECK NOP NOP BRSP:JP BRSP1 LDISP:JP LDSP1 DECDP:JP DDP1 HLNEG:JP HLNG1 DIV:JP DIV1 BITDP:JP BTDP JP LDSP1 RET;NOT USED NOP NOP JP HLNG2 JP LSRC1 JP LSRC2 JP LSRC0 JP CRLF JP ASH22 JP MOVE JP ADRD3 JP DINS JP BRKCK JP CLRNT JP BRSP2 JP LSC0 JP LSC1 JP LSC2 JP VDPS JP CMDP JP LDSP2 NOP;JP PRT0 NOP NOP JP ERRDP JP ADSPS JP SIN ;;; ASOUT:PUSH AF LD A,(ATRNCK) OR A JR NZ,*ASOUT1 LD A,(LCDMK) OR A JR Z,ADSPS POP AF LCDDP:CP 20 JR NC,LCDDP2 CP 0A RET NZ PUSH BC LD B,01 LD C,00 CALL LCDOT POP BC RET LCDDP2:PUSH BC PUSH AF PUSH HL LCDDP3:CALL LCDINSB JR NZ,LCDDP3 LD A,L CP 14 JR NZ,LCDDP4 LD B,C0 LD C,00 CALL LCDOT LCDDP4:POP HL POP AF LD B,A LD C,20 CALL LCDOT POP BC RET ASOUT1:POP AF JP ASOUTJ ;;; ; CLS CLR:LD A,02 JP ADSPS ;;; ;;; SPACE DISP SPDP:LD A,20 ;;; ACC DISP ADSPS:PUSH BC LD C,A LD A,(LPSW) OR A LD A,C JP M,BFOUT CP 20 JP C,ADSPS2 LD A,(SKETA) INC A CP 50;=80 JP C,ADSPS3 ADSPS2:XOR A ADSPS3:LD (SKETA),A LD A,C LD B,E7 CALL SOUT POP BC RET ; BFOUT:PUSH HL LD HL,(BFCNT) LD (HL),A INC HL LD (BFCNT),HL POP HL POP BC RET ; SOUT:LD C,A SOUT2:IN A,(94) AND 40 JP Z,SOUT2 CALL SOUTSB RET Z;BREAK LD A,B AND FD OUT (98),A SOUT3:IN A,(94) AND 40 JP NZ,SOUT3 LD A,B OUT (98),A OR A;reset z flag RET ; SOUTSB:LD A,C OUT (94),A SOUTSB12:LD A,B AND FD OUT (98),A SOUTSB2:IN A,(94) AND 40 JP Z,SOUTSB22 IN A,(94) AND 20 JP NZ,SOUTSB2 ;BREAK CALL SIN JP NZ,SOUTSB12 RET SOUTSB22:LD A,B OUT (98),A SOUTSB3:IN A,(94) AND 40 JP Z,SOUTSB3 LD A,C RRCA RRCA RRCA RRCA OUT (94),A LD A,01 OR A;RESET Z FLAG RET ; SIN:PUSH BC LD A,EF LD B,A OUT (98),A CALL SINSB OR A POP BC RET ;;; ;;;(DE) TO 0D DISP DEDSP:PUSH HL PUSH BC LD B,A DEDP0:LD A,(DE) INC DE CP B JR Z,DEDP31 CP 0D JR Z,DEDP3 PUSH BC CALL ADSPS POP BC JP Z,DEDP9 JP DEDP0 DEDP3:CALL CRLF DEDP31:LD A,01 OR A;RESET Z FLAG DEDP9:POP BC POP HL RET ;;; CRLF:LD A,0D CALL ADSPS LD A,0A CALL ADSPS RET ;;; ACC DISP & KEYIN DPKIN:CALL ASOUT JP SCEDT ;;;SPACE JUMP SPJP:LD A,(DE) CP 20 RET NZ INC DE JP SPJP ;;;HL-DE COMP HDCP:LD A,H CP D RET NZ LD A,L CP E RET ;;; ;;;DECIMAL TO BINARY DECIN:CALL DINS LD A,H CP FF JP Z,HOWDP RET DINS:LD HL,$0000 LD B,H CALL SPJMP DCIN1:CP 30 RET C CP 3A RET NC LD A,F0 AND H JP NZ,DINS2 INC B PUSH BC LD B,H LD C,L ADD HL,HL ADD HL,HL ADD HL,BC ADD HL,HL LD A,(DE) INC DE AND 0F ADD A,L LD L,A LD A,00 ADC A,H LD H,A POP BC LD A,(DE) JP P,DCIN1 DINS2:LD H,FF RET ;;; ;;;KEY DATA INPUT INKY:CALL KEY INC A JR NZ,INKY INKY2:CALL KEY INC A JR Z,INKY2 DEC A RET ;;; ;;;ASCII TO HEX AHX1:SUB 30 RET C CP 0A CCF RET NC CP 11 RET C CP 17 CCF RET C SUB 07 RET AHX2:LD A,H CALL AHX1 RET C RLCA RLCA RLCA RLCA LD H,A LD A,L CALL AHX1 RET C OR H RET AHX4:CALL AHXS RET C LD B,A ASH22:CALL AHXS RET C LD L,A LD H,B RET AHXS:EX DE,HL LD D,(HL) INC HL LD E,(HL) INC HL EX DE,HL JP AHX2 ;;; ;;;HEX DATA DISP HDP4:CALL HDP2 LD H,L HDP2:LD A,H RRCA RRCA RRCA RRCA CALL HDP1 LD A,H HDP1:AND 0F ADD A,30 CP 3A JP C,HDP12 ADD A,07 HDP12:JP ADSPS ;;; ;;;ADDRESS READ ADRD1:CALL ASHX4 JP C,WHAT INC DE PUSH HL CALL ASHX4 JP C,WHAT LD B,D LD C,E POP DE CALL HDCMP JP C,HOWDP EX DE,HL RET ;;; ;;;BREAK CHECK BRKCK:IN A,(0B) XOR 01 AND 01 RET BRK1:CALL BRKCK RET NZ CLRNT:JP REENT ;;; ;;;BREAK CHECK & SPACE CHECK BRSP2:CALL BRK1 RET BRSP1:CALL BRSP2 RET ;;; ;;; LIST DISP LDSP1:LD A,(DE) LD L,A INC DE LD A,(DE) LD H,A INC DE LD C,06 CALL DECDP CALL SPDP LD A,(MODE) CP 05 JP Z,DEDSP LDSP2:XOR A LD (DEFFN),A ; for DEF FN LD A,(DE) LD C,A INC DE LD A,(DE) CP 2A ;* JP NZ,LD3 INC DE DEC C CALL GOSDS CALL VDPS0 INC C INC C INC C LD3:LD A,(DE) OR A JP NZ,LD30 INC DE INC DE LD A,(DE) LD30:CP F0 JP C,LD31 CP F8 JP C,VDP JP Z,FLODP CP F9 JP Z,DFLDP CP FA JP Z,INTDP JP NC,VDP LD31:CP 0D JP NZ,LD41 LD32:INC DE INC DE CALL CRLF RET LD41:CP 24 ; $ JP NZ,LD43 LD42:CALL ADSPS INC DE DEC C LD A,(DE) CP 0D JP Z,LD32 CP 30 JP C,FLDP3 CP 3A JP C,LD42 CP 41 JP C,FLDP3 CP 47 JP C,LD42 JP FLDP3 LD43:CP 22 ; " JP Z,MOJI CP 80 JP C,LD4 LD B,A CALL CMDP LD A,B CP 86 ;REM JP Z,REM CP 8D ;DATA JP Z,DATA CP 8E ;USR JP Z,LD45 CP A2 ;' JP Z,REM CP 9A JP C,LD44 CP A1 ;LPRINT JP Z,LD44 CP A4 ;THEN JP Z,LD44 CP A5 ;ELSE JP Z,LD44 CP A7 ;WRITE JP Z,LD44 CP AB ;OPEN JP C,LD45 ;from = to < , ' , DEF FN , function CP EB ;INT JP Z,ONINT CP C4 ;INKEY$ JP Z,DTCK CP D5 ;TIME$ JP Z,DTCK CP E3 ;DATE$ JP Z,DTCK CP C0 JP NC,LD45 CP B8 ;LINE JP C,LD44 CP BE ;PAINT+1 JP NC,LD44 INC DE LD A,(DE) DEC DE CP 28 ;( JP Z,LD45 LD44:CALL SPDP LD45:INC DE DEC C RET Z LD A,B CP 80 ;GOTO JP Z,GOSDP CP 82 ;GOSUB JP Z,GOSDP CP 92 ;RESTORE - RESUME JP C,LD3 CP 95 JP C,RSTR CP A3 ; DEF FN JP NZ,LD3 OR A LD (DEFFN),A JP LD3 DTCK:INC DE DEC C RET Z LD A,(DE) OR A JP NZ,DTCK1 INC DE INC DE DEC C DEC C LD A,(DE) DTCK1:CP 80 ;GOTO JP Z,DTCK2 CP A4 ;THEN JP C,LD3 CP A6 ;NOT THEN,ELSE JP NC,LD3 DTCK2:CALL SPDP JP LD3 ONINT:INC DE LD A,(DE) DEC DE CP 28 ;( JP Z,LD45 JP LD44 RSTR:LD A,(DE) CP FA JP NZ,FLDP3 INC DE CALL GOSDS OR A JP P,GOSD2 RES 7,H CALL VDPS0 INC C INC C INC C JP FLDP3 GOSDS:LD A,(DE) INC DE DEC C LD L,A LD A,(DE) INC DE DEC C LD H,A RET GOSDP:CALL GOSDS OR A JP M,ASTDP PUSH BC LD C,00 CALL DECDP POP BC GOSD0:LD A,(DE) CP 2C ; , JP NZ,FLDP3 INC DE DEC C CALL ADSPS JP GOSDP ASTDP:RES 7,H CALL VDPS0 INC C INC C INC C JP GOSD0 GOSD2:PUSH BC LD C,00 CALL DECDP POP BC JP FLDP3 LD4:CALL ADSPS INC DE DEC C JP LD3 VDP:CALL VDPS JP FLDP3 MOJI:CALL ADSPS INC DE DEC C LD A,(DE) CP 0D JP Z,LD32 CP 22 ;" JP NZ,MOJI CALL ADSPS INC DE DEC C JP LD3 DATA:CALL SPDP REM:INC DE REM1:LD A,(DE) CP 0D JP Z,LD32 CALL ADSPS INC DE DEC C JP REM1 CMDP:AND 7F CP 40 JP C,CMDP2 LD HL,CMDT2 JP CMDP3 CMDP2:LD HL,CMDT1 CMDP3:PUSH HL LD HL,CMDT0 ADD A,L LD L,A LD A,(HL) POP HL ADD A,L LD L,A LD A,(HL) AND 7F CMDP4:CALL ADSPS INC HL LD A,(HL) OR A JP P,CMDP4 RET VDPS0:PUSH BC JP VDP1 VDPS:PUSH BC INC DE LD A,(DE) LD L,A INC DE LD A,(DE) LD H,A INC DE VDP1:PUSH DE INC HL INC HL LD DE,(TXTS) ADD HL,DE LD A,(DEFFN) OR A JP Z,VDP2 INC HL ; DEF FN JP VDP22 VDP2:LD A,(HL) AND 7F CALL ADSPS VDP22:INC HL XOR A LD (DEFFN),A LD C,05 VDP3:LD A,(HL) CP 00 JP Z,VDP4 CALL ADSPS INC HL DEC C JP NZ,VDP3 VDP4:POP DE POP BC DEC C DEC C DEC C RET DFLDP:INC DE PUSH DE PUSH BC EX DE,HL CALL DAUPK CALL DWFLO POP BC POP DE INC DE INC DE INC DE INC DE DEC C DEC C DEC C DEC C JP *FLDP1 FLODP:INC DE PUSH DE PUSH BC EX DE,HL CALL AUPK CALL WFLO POP BC POP DE FLDP1:INC DE INC DE INC DE INC DE DEC C DEC C FLDP2:DEC C DEC C DEC C RET Z FLDP3:LD A,(DE) OR A JP Z,*FLDP4 CP 23 ;# JP Z,*FLDP5 CP 80 JP C,LD3 CP 9A JP C,*FLDP4 CP A1 JP C,LD3 FLDP4:CALL SPDP JP LD3 INTDP:INC DE EX DE,HL LD E,(HL) INC HL LD D,(HL) INC HL EX DE,HL PUSH BC LD C,00 CALL DDP1 POP BC JP *FLDP2 FLDP5:CALL ADSPS INC DE DEC C LD A,(DE) CP 41 JP C,LD3 CALL SPDP JP LD3 ;;;DECIMAL DISP DDP1:PUSH DE LD DE,$000A PUSH DE LD B,D DEC C CALL HLNEG JP P,DDP2 LD B,2D DEC C DDP2:PUSH BC DDP22:CALL DIV LD A,B OR C JP Z,DDP3 EX (SP),HL DEC L PUSH HL LD H,B LD L,C JP DDP22 DDP3:POP BC DDP32:DEC C LD A,C OR A JP M,DDP4 CALL SPCDP JR *DDP32 DDP4:LD A,B CALL DDPS LD E,L DDP5:LD A,E CP 0A POP DE RET Z ADD A,30 CALL ADSPS JR *DDP5 DDPS:OR A CALL NZ,ADSPS RET ;;; ;;;HL TO -HL HLNG1:LD A,H OR A RET P HLNG2:LD A,H CPL LD H,A LD A,L CPL LD L,A INC HL LD A,B XOR 80 LD B,A RET ;;; ;;;DIVIDE DIV1:PUSH HL LD L,H LD H,00 CALL DIVS LD B,C LD A,L POP HL LD H,A DIVS:LD C,FF DIVS1:INC C CALL DIVS2 JR NC,*DIVS1 ADD HL,DE RET DIVS2:LD A,L SUB E LD L,A LD A,H SBC A,D LD H,A RET ;;; BTDP:LD C,A LD B,08 BTDP1:RL C LD A,30 JR NC,*BTDP2 INC A BTDP2:CALL ADSPS DEC B JR NZ,*BTDP1 RET ;;; ;;; MOVE MEMORY ;;;FROM (BC) TO (HL) , FOR (DE) MOVE:PUSH HL PUSH BC XOR A SBC HL,BC JR C,MV2 INC HL PUSH HL POP BC POP HL CALL HDCMP JR C,MV1 POP IX PUSH DE LDIR POP HL DEC DE XOR A RET MV1:EX DE,HL ADD HL,BC EX DE,HL DEC DE POP HL PUSH DE LDDR POP HL INC DE EX DE,HL XOR A RET MV2:POP BC POP HL RET ;;;ADDRESS READ BC,HL,DE ADRD3:CALL SPJP CP 2C ;, JR NZ,ADR31 INC DE ADR31:CALL ASHX4 JP C,WHAT INC DE PUSH HL CALL ASHX4 JP C,WHAT INC DE PUSH HL CALL ASHX4 JP C,WHAT EX DE,HL POP HL POP BC RET ;;;LINE NO. SEARCH LSRC0:LD IX,$7FFF JR LSC0 LSRC1:LD IX,$7FFF JR LSC1 LSRC2:LD IX,$7FFF JP LSC2 LSC0:LD DE,(TXTS) LD A,(MODE) CP 04 JP NZ,LSC1 LD DE,(NMEND) LSC1:PUSH HL LD HL,(TXTE) DEC HL XOR A SBC HL,DE POP HL RET C LD A,(DE) LD C,A INC DE LD A,(DE) LD B,A PUSH HL PUSH IX POP HL SBC HL,BC POP HL DEC DE RET C PUSH HL SBC HL,BC POP HL RET Z JR NC,LSC2 CCF RET LSC2:INC DE INC DE LD A,(MODE) CP 04 JR NZ,LSC4 LD A,(DE) INC A INC A ADD A,E LD E,A LD A,00 ADC A,D LD D,A JP LSC1 LSC3:INC DE LSC4:LD A,(DE) CP 0D JR NZ,LSC3 INC DE JP LSC1 ;;; ERRDP:LD DE,ERRDT PUSH AF XOR A LD H,A CALL DEDP POP AF LD L,A LD C,02 JP DECDP HOWDP:LD DE,HOWT JR WHTD2 SORRY:LD DE,SRRYT JR WHTD2 WHAT:LD DE,WHATT WHTD2:XOR A CALL DEDSP JP RENTP |
;;; NEW MONITOR SUBROUTINE (FOR NEW BS) ;;; 10/6/17 for ND80Z3 ;6/18 6/19 6/20 6/21 6/22 6/23 ;7/2 7/23 8/12 ; ORG $1000 ;;; ;SOUTSB=$067C SINSB=$06A0 ;;; CMDT1=$1D00 CMDT2=$1E00 CMDT0=$1F00 ;;; AUPK=$3E04 WFLO=$3E13 ;;; RENTP=$1803 ROMST=$1800 ;CLR=$1803 SCEDT=$1806 SOUTJ=$1809 ASOUTJ=$180F LCDOT=$1830 LCDINSB=$1839 ;;; HOWT=$1F80 SRRYT=$1F85 WHATT=$1F8B ERRDT=$1FA9 ;;; DAUPK=$6D3C DWFLO=$6D4B ;;; TXTS=$F052 CURAD=$F054 TXTE=$F063 PRTCK=$F065 MODE=$F070 PROG=$F071 LPSW=$F079 PKETA=$F0B5 NMEND=$F0B6 LCDMK=$F0D9 DEFFN=$F0FF SKETA=$F185 SDATA=$F186 ; BFCNT=$F2F5 ; ATRNCK=$FEE4 ;;; DREG1=$FFFC AREG1=$FFFE ;;; JMP ROMST KEY:RET NOP NOP JMP SCEDT RET NOP NOP SCRL:JMP CRLF JMP CLR RET NOP NOP ADISP:JMP ADSPS DEDP:JMP DEDSP JMP CRLF JMP DPKIN PRTR:RET;JP PRTRS NOP NOP SPJMP:JMP SPJP HDCMP:JMP HDCP JMP HOWDP SRYDP:JMP SORRY WHTDP:JMP WHAT REENT:JMP RENTP JMP DECIN SPCDP:JMP SPDP INKEY:JMP INKY ASHX1:JMP AHX1 ASHX2:JMP AHX2 ASHX4:JMP AHX4 HXDP1:JMP HDP1 HXDP2:JMP HDP2 HXDP4:JMP HDP4 ADRD:JMP ADRD1 BREAK:RET; BREAK CHECK NOP NOP BRSP:JMP BRSP1 LDISP:JMP LDSP1 DECDP:JMP DDP1 HLNEG:JMP HLNG1 DIV:JMP DIV1 BITDP:JMP BTDP JMP LDSP1 RET;NOT USED NOP NOP JMP HLNG2 JMP LSRC1 JMP LSRC2 JMP LSRC0 JMP CRLF JMP ASH22 JMP MOVE JMP ADRD3 JMP DINS JMP BRKCK JMP CLRNT JMP BRSP2 JMP LSC0 JMP LSC1 JMP LSC2 JMP VDPS JMP CMDP JMP LDSP2 NOP;JP PRT0 NOP NOP JMP ERRDP JMP ADSPS JMP SIN ;;; ASOUT:PUSH PSW LDA ATRNCK ORA A JNZ ASOUT1 LDA LCDMK ORA A JZ ADSPS POP PSW LCDDP:CPI 20 JNC LCDDP2 CPI 0A RNZ PUSH B MVI B,01 MVI C,00 CALL LCDOT POP B RET LCDDP2:PUSH B PUSH PSW PUSH H LCDDP3:CALL LCDINSB JNZ CDDP3 MOV A,L CPI 14 JNZ CDDP4 MVI B,C0 MVI C,00 CALL LCDOT LCDDP4:POP H POP PSW MOV B,A MVI C,20 CALL LCDOT POP B RET ASOUT1:POP PSW JMP ASOUTJ ;;; ; CLS CLR:MVI A,02 JMP ADSPS ;;; ;;; SPACE DISP SPDP:MVI A,20 ;;; ACC DISP ADSPS:PUSH B MOV C,A LDA LPSW ORA A MOV A,C JM BFOUT CPI 20 JC ADSPS2 LDA SKETA INR A CPI 50;=80 JC ADSPS3 ADSPS2:XRA A ADSPS3:STA SKETA MOV A,C MVI B,E7 CALL SOUT POP B RET ; BFOUT:PUSH H LHLD BFCNT MOV M,A INX H SHLD BFCNT POP H POP B RET ; SOUT:MOV C,A SOUT2:IN 94 ANI 40 JZ SOUT2 CALL SOUTSB RZ;BREAK MOV A,B ANI FD OUT 98 SOUT3:IN 94 ANI 40 JNZ SOUT3 MOV A,B OUT 98 ORA A;reset z flag RET ; SOUTSB:MOV A,C OUT 94 SOUTSB12:MOV A,B ANI FD OUT 98 SOUTSB2:IN 94 ANI 40 JZ SOUTSB22 IN 94 ANI 20 JNZ SOUTSB2 ;BREAK CALL SIN JNZ SOUTSB12 RET SOUTSB22:MOV A,B OUT 98 SOUTSB3:IN 94 ANI 40 JZ SOUTSB3 MOV A,C RRC RRC RRC RRC OUT 94 MVI A,01 ORA A;RESET Z FLAG RET ; SIN:PUSH B MVI A,EF MOV B,A OUT 98 CALL SINSB ORA A POP B RET ;;; ;;;(DE) TO 0D DISP DEDSP:PUSH H PUSH B MOV B,A DEDP0:LDAX D INX D CMP B JZ DEDP31 CPI 0D JZ DEDP3 PUSH B CALL ADSPS POP B JZ DEDP9 JMP DEDP0 DEDP3:CALL CRLF DEDP31:MVI A,01 ORA A;RESET Z FLAG DEDP9:POP B POP H RET ;;; CRLF:MVI A,0D CALL ADSPS MVI A,0A CALL ADSPS RET ;;; ACC DISP & KEYIN DPKIN:CALL ASOUT JMP SCEDT ;;;SPACE JUMP SPJP:LDAX D CPI 20 RNZ INX D JMP SPJP ;;;HL-DE COMP HDCP:MOV A,H CMP D RNZ MOV A,L CMP E RET ;;; ;;;DECIMAL TO BINARY DECIN:CALL DINS MOV A,H CPI FF JZ HOWDP RET DINS:LXI H,$0000 MOV B,H CALL SPJMP DCIN1:CPI 30 RC CPI 3A RNC MVI A,F0 ANA H JNZ DINS2 INR B PUSH B MOV B,H MOV C,L DAD H DAD H DAD B DAD H LDAX D INX D ANI 0F ADD L MOV L,A MVI A,00 ADC H MOV H,A POP B LDAX D JP DCIN1 DINS2:MVI H,FF RET ;;; ;;;KEY DATA INPUT INKY:CALL KEY INR A JNZ NKY INKY2:CALL KEY INR A JZ INKY2 DCR A RET ;;; ;;;ASCII TO HEX AHX1:SUI 30 RC CPI 0A CMC RNC CPI 11 RC CPI 17 CMC RC SUI 07 RET AHX2:MOV A,H CALL AHX1 RC RLC RLC RLC RLC MOV H,A MOV A,L CALL AHX1 RC ORA H RET AHX4:CALL AHXS RC MOV B,A ASH22:CALL AHXS RC MOV L,A MOV H,B RET AHXS:XCHG MOV D,M INX H MOV E,M INX H XCHG JMP AHX2 ;;; ;;;HEX DATA DISP HDP4:CALL HDP2 MOV H,L HDP2:MOV A,H RRC RRC RRC RRC CALL HDP1 MOV A,H HDP1:ANI 0F ADI 30 CPI 3A JC HDP12 ADI 07 HDP12:JMP ADSPS ;;; ;;;ADDRESS READ ADRD1:CALL ASHX4 JC WHAT INX D PUSH H CALL ASHX4 JC WHAT MOV B,D MOV C,E POP D CALL HDCMP JC HOWDP XCHG RET ;;; ;;;BREAK CHECK BRKCK:IN 0B XRI 01 ANI 01 RET BRK1:CALL BRKCK RNZ CLRNT:JMP REENT ;;; ;;;BREAK CHECK & SPACE CHECK BRSP2:CALL BRK1 RET BRSP1:CALL BRSP2 RET ;;; ;;; LIST DISP LDSP1:LDAX D MOV L,A INX D LDAX D MOV H,A INX D MVI C,06 CALL DECDP CALL SPDP LDA MODE CPI 05 JZ DEDSP LDSP2:XRA A STA DEFFN ; for DEF FN LDAX D MOV C,A INX D LDAX D CPI 2A ;* JNZ LD3 INX D DCR C CALL GOSDS CALL VDPS0 INR C INR C INR C LD3:LDAX D ORA A JNZ LD30 INX D INX D LDAX D LD30:CPI F0 JC LD31 CPI F8 JC VDP JZ FLODP CPI F9 JZ DFLDP CPI FA JZ INTDP JNC VDP LD31:CPI 0D JNZ LD41 LD32:INX D INX D CALL CRLF RET LD41:CPI 24 ; $ JNZ LD43 LD42:CALL ADSPS INX D DCR C LDAX D CPI 0D JZ LD32 CPI 30 JC FLDP3 CPI 3A JC LD42 CPI 41 JC FLDP3 CPI 47 JC LD42 JMP FLDP3 LD43:CPI 22 ; " JZ MOJI CPI 80 JC LD4 MOV B,A CALL CMDP MOV A,B CPI 86 ;REM JZ REM CPI 8D ;DATA JZ DATA CPI 8E ;USR JZ LD45 CPI A2 ;' JZ REM CPI 9A JC LD44 CPI A1 ;LPRINT JZ LD44 CPI A4 ;THEN JZ LD44 CPI A5 ;ELSE JZ LD44 CPI A7 ;WRITE JZ LD44 CPI AB ;OPEN JC LD45 ;from = to < , ' , DEF FN , function CPI EB ;INT JZ ONINT CPI C4 ;INKEY$ JZ DTCK CPI D5 ;TIME$ JZ DTCK CPI E3 ;DATE$ JZ DTCK CPI C0 JNC LD45 CPI B8 ;LINE JC LD44 CPI BE ;PAINT+1 JNC LD44 INX D LDAX D DCX D CPI 28 ;( JZ LD45 LD44:CALL SPDP LD45:INX D DCR C RZ MOV A,B CPI 80 ;GOTO JZ GOSDP CPI 82 ;GOSUB JZ GOSDP CPI 92 ;RESTORE - RESUME JC LD3 CPI 95 JC RSTR CPI A3 ; DEF FN JNZ LD3 ORA A STA DEFFN JMP LD3 DTCK:INX D DCR C RZ LDAX D ORA A JNZ DTCK1 INX D INX D DCR C DCR C LDAX D DTCK1:CPI 80 ;GOTO JZ DTCK2 CPI A4 ;THEN JC LD3 CPI A6 ;NOT THEN,ELSE JNC LD3 DTCK2:CALL SPDP JMP LD3 ONINT:INX D LDAX D DCX D CPI 28 ;( JZ LD45 JMP LD44 RSTR:LDAX D CPI FA JNZ FLDP3 INX D CALL GOSDS ORA A JP GOSD2 ? RES 7,H CALL VDPS0 INR C INR C INR C JMP FLDP3 GOSDS:LDAX D INX D DCR C MOV L,A LDAX D INX D DCR C MOV H,A RET GOSDP:CALL GOSDS ORA A JM ASTDP PUSH B MVI C,00 CALL DECDP POP B GOSD0:LDAX D CPI 2C ; , JNZ FLDP3 INX D DCR C CALL ADSPS JMP GOSDP ? ASTDP:RES 7,H CALL VDPS0 INR C INR C INR C JMP GOSD0 GOSD2:PUSH B MVI C,00 CALL DECDP POP B JMP FLDP3 LD4:CALL ADSPS INX D DCR C JMP LD3 VDP:CALL VDPS JMP FLDP3 MOJI:CALL ADSPS INX D DCR C LDAX D CPI 0D JZ LD32 CPI 22 ;" JNZ MOJI CALL ADSPS INX D DCR C JMP LD3 DATA:CALL SPDP REM:INX D REM1:LDAX D CPI 0D JZ LD32 CALL ADSPS INX D DCR C JMP REM1 CMDP:ANI 7F CPI 40 JC CMDP2 LXI H,CMDT2 JMP CMDP3 CMDP2:LXI H,CMDT1 CMDP3:PUSH H LXI H,CMDT0 ADD L MOV L,A MOV A,M POP H ADD L MOV L,A MOV A,M ANI 7F CMDP4:CALL ADSPS INX H MOV A,M ORA A JP CMDP4 RET VDPS0:PUSH B JMP VDP1 VDPS:PUSH B INX D LDAX D MOV L,A INX D LDAX D MOV H,A INX D VDP1:PUSH D INX H INX H ? LD DE,(TXTS) DAD D LDA DEFFN ORA A JZ VDP2 INX H ; DEF FN JMP VDP22 VDP2:MOV A,M ANI 7F CALL ADSPS VDP22:INX H XRA A STA DEFFN MVI C,05 VDP3:MOV A,M CPI 00 JZ VDP4 CALL ADSPS INX H DCR C JNZ VDP3 VDP4:POP D POP B DCR C DCR C DCR C RET DFLDP:INX D PUSH D PUSH B XCHG CALL DAUPK CALL DWFLO POP B POP D INX D INX D INX D INX D DCR C DCR C DCR C DCR C JMP *FLDP1 FLODP:INX D PUSH D PUSH B XCHG CALL AUPK CALL WFLO POP B POP D FLDP1:INX D INX D INX D INX D DCR C DCR C FLDP2:DCR C DCR C DCR C RZ FLDP3:LDAX D ORA A JZ *FLDP4 CPI 23 ;# JZ *FLDP5 CPI 80 JC LD3 CPI 9A JC *FLDP4 CPI A1 JC LD3 FLDP4:CALL SPDP JMP LD3 INTDP:INX D XCHG MOV E,M INX H MOV D,M INX H XCHG PUSH B MVI C,00 CALL DDP1 POP B JMP *FLDP2 FLDP5:CALL ADSPS INX D DCR C LDAX D CPI 41 JC LD3 CALL SPDP JMP LD3 ;;;DECIMAL DISP DDP1:PUSH D LXI D,$000A PUSH D MOV B,D DCR C CALL HLNEG JP DDP2 MVI B,2D DCR C DDP2:PUSH B DDP22:CALL DIV MOV A,B ORA C JZ DDP3 XTHL DCR L PUSH H MOV H,B MOV L,C JMP DDP22 DDP3:POP B DDP32:DCR C MOV A,C ORA A JM DDP4 CALL SPCDP JMP DDP32 DDP4:MOV A,B CALL DDPS MOV E,L DDP5:MOV A,E CPI 0A POP D RZ ADI 30 CALL ADSPS JMP DDP5 DDPS:ORA A CNZ ADSPS RET ;;; ;;;HL TO -HL HLNG1:MOV A,H ORA A RP HLNG2:MOV A,H CMA MOV H,A MOV A,L CMA MOV L,A INX H MOV A,B XRI 80 MOV B,A RET ;;; ;;;DIVIDE DIV1:PUSH H MOV L,H MVI H,00 CALL DIVS MOV B,C MOV A,L POP H MOV H,A DIVS:MVI C,FF DIVS1:INR C CALL DIVS2 JNC DIVS1 DAD D RET DIVS2:MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A RET ;;; BTDP:MOV C,A MVI B,08 ? BTDP1:RL C MVI A,30 JNC BTDP2 INR A BTDP2:CALL ADSPS DCR B JNZ BTDP1 RET ;;; ;;; MOVE MEMORY ;;;FROM (BC) TO (HL) , FOR (DE) MOVE:PUSH H PUSH B XRA A ? SBC HL,BC JC MV2 INX H PUSH H POP B POP H CALL HDCMP JC MV1 ? POP IX PUSH D ? LDIR POP H DCX D XRA A RET MV1:XCHG DAD B XCHG DCX D POP H PUSH D ? LDDR POP H INX D XCHG XRA A RET MV2:POP B POP H RET ;;;ADDRESS READ BC,HL,DE ADRD3:CALL SPJP CPI 2C ;, JNZ DR31 INX D ADR31:CALL ASHX4 JC WHAT INX D PUSH H CALL ASHX4 JC WHAT INX D PUSH H CALL ASHX4 JC WHAT XCHG POP H POP B RET ;;;LINE NO. SEARCH ? LSRC0:LD IX,$7FFF JMP LSC0 ? LSRC1:LD IX,$7FFF JMP LSC1 ? LSRC2:LD IX,$7FFF JMP LSC2 ? LSC0:LD DE,(TXTS) LDA MODE CPI 04 JNZ LSC1 ? LD DE,(NMEND) LSC1:PUSH H LHLD TXTE DCX H XRA A ? SBC HL,DE POP H RC LDAX D MOV C,A INX D LDAX D MOV B,A PUSH H ? PUSH IX POP H ? SBC HL,BC POP H DCX D RC PUSH H ? SBC HL,BC POP H RZ JNC LSC2 CMC RET LSC2:INX D INX D LDA MODE CPI 04 JNZ SC4 LDAX D INR A INR A ADD E MOV E,A MVI A,00 ADC D MOV D,A JMP LSC1 LSC3:INX D LSC4:LDAX D CPI 0D JNZ SC3 INX D JMP LSC1 ;;; ERRDP:LXI D,ERRDT PUSH PSW XRA A MOV H,A CALL DEDP POP PSW MOV L,A MVI C,02 JMP DECDP HOWDP:LXI D,HOWT JMP WHTD2 SORRY:LXI D,SRRYT JMP WHTD2 WHAT:LXI D,WHATT WHTD2:XRA A CALL DEDSP JMP RENTP |