2014.7.31

前へ
次へ
ホームページトップへ戻る

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


●8080ソースプログラム(MMON1M.TXT)

そしてこちらがコンバートプログラムによって上のプログラムファイルを読み込んで生成された8080ニーモニックのソースプログラムです。

;;; 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

どうです。
ちょいと見事なものでしょう。
よく見ていただきますと、ときどき ? がついているところがあります。
8080にはない、Z80固有の命令なので置き換えできません、という印です。
こういうところもコンバートプログラムにやらせることができれば世話は無いのですが、そうは簡単にはいきません。
中には機械的に8080の命令を使って置き換えることができるところもありますが、なかには注意深く前後のプログラムをよく確認して置き換え作業をしなければならないところもあります。
ですので ? のところはこのあと手作業でひとつずつ置き換えていくことにしました。
それがなかなかに大変な作業だったのです。 

CPU80でCP/Mを![第8回]
2014.7.31upload

前へ
次へ
ホームページトップへ戻る