1213 lines
15 KiB
NASM
1213 lines
15 KiB
NASM
|
; Z80 to 8086 Translator version 2.21
|
|||
|
; Runs on the 8086 under 86-DOS
|
|||
|
; by Tim Paterson
|
|||
|
;
|
|||
|
ORG 100H
|
|||
|
EOF: EQU 1AH ;End of file
|
|||
|
EOL: EQU 0DH
|
|||
|
FCB: EQU 5CH
|
|||
|
SYSTEM: EQU 5
|
|||
|
OPEN: EQU 15
|
|||
|
CLOSE: EQU 16
|
|||
|
SETDMA: EQU 26
|
|||
|
CREATE: EQU 22
|
|||
|
DELETE: EQU 19
|
|||
|
READ: EQU 20
|
|||
|
WRITE: EQU 21
|
|||
|
PRNBUF: EQU 9
|
|||
|
MOV SP,STACK
|
|||
|
MOV DX,HEADER
|
|||
|
MOV CL,9
|
|||
|
CALL SYSTEM
|
|||
|
MOV BX,FCB+12
|
|||
|
XOR AL,AL
|
|||
|
MOV CH,4
|
|||
|
CLRFCB:
|
|||
|
MOV [BX],AL
|
|||
|
INC BX
|
|||
|
DEC CH
|
|||
|
JNZ CLRFCB
|
|||
|
MOV [FCB+32],AL
|
|||
|
MOV BX,FCB
|
|||
|
MOV DX,PUTFCB
|
|||
|
MOV CX,16
|
|||
|
UP
|
|||
|
MOV SI,BX
|
|||
|
MOV DI,DX
|
|||
|
REP
|
|||
|
MOVB
|
|||
|
MOV DX,DI
|
|||
|
MOV BX,SI
|
|||
|
MOV [PUTFCB+32],AL
|
|||
|
MOV BX,"A"+5300H ;"AS"
|
|||
|
MOV [PUTFCB+9],BX
|
|||
|
MOV AL,'M'
|
|||
|
MOV [PUTFCB+11],AL
|
|||
|
MOV DX,FCB
|
|||
|
MOV CL,OPEN
|
|||
|
CALL SYSTEM
|
|||
|
INC AL
|
|||
|
MOV DX,NOFILE
|
|||
|
JZ ABORTJ
|
|||
|
MOV DX,PUTFCB
|
|||
|
MOV CL,DELETE
|
|||
|
CALL SYSTEM
|
|||
|
MOV DX,PUTFCB
|
|||
|
MOV CL,CREATE
|
|||
|
CALL SYSTEM
|
|||
|
INC AL
|
|||
|
MOV DX,NOROOM
|
|||
|
ABORTJ:
|
|||
|
JZ ABORT
|
|||
|
MOV DX,PUTFCB
|
|||
|
MOV CL,OPEN
|
|||
|
CALL SYSTEM
|
|||
|
MOV BX,PUTBUF
|
|||
|
MOV [PUTPT],BX
|
|||
|
MOV BX,GETBUF+80H
|
|||
|
MOV [GETPT],BX
|
|||
|
TRANLN:
|
|||
|
XOR AL,AL
|
|||
|
MOV [OP1],AL
|
|||
|
MOV [OP2],AL
|
|||
|
MOV BX,OPCODE
|
|||
|
CALL LOAD
|
|||
|
MOV BX,OP1
|
|||
|
CALL GETOP
|
|||
|
MOV B,[BX],0
|
|||
|
MOV BX,OP2
|
|||
|
CALL GETOP
|
|||
|
DOLIN:
|
|||
|
MOV B,[BX],0
|
|||
|
CALL FINDOP
|
|||
|
ENLIN:
|
|||
|
MOV SP,STACK
|
|||
|
MOV AL,[CHAR]
|
|||
|
CMP AL,';'
|
|||
|
JNZ NOCOM
|
|||
|
MOV AL,9
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,';'
|
|||
|
NOCOM:
|
|||
|
CALL PUTCH
|
|||
|
PUTLIN:
|
|||
|
CMP AL,EOF
|
|||
|
JZ END
|
|||
|
CALL GETCH
|
|||
|
CALL PUTCH
|
|||
|
CMP AL,10
|
|||
|
JNZ PUTLIN
|
|||
|
JP TRANLN
|
|||
|
END:
|
|||
|
MOV CH,127
|
|||
|
MOV AL,1AH
|
|||
|
FILL:
|
|||
|
CALL PUTCH
|
|||
|
DEC CH
|
|||
|
JNZ FILL
|
|||
|
MOV DX,PUTFCB
|
|||
|
MOV CL,CLOSE
|
|||
|
CALL SYSTEM
|
|||
|
MOV DX,ENDMES
|
|||
|
ABORT:
|
|||
|
MOV CL,PRNBUF
|
|||
|
CALL SYSTEM
|
|||
|
JMP 0
|
|||
|
DELIM:
|
|||
|
CALL GETCH
|
|||
|
DELCHK:
|
|||
|
CMP AL,EOL
|
|||
|
JZ DOLIN
|
|||
|
CMP AL,EOF
|
|||
|
JZ DOLIN
|
|||
|
CMP AL,';'
|
|||
|
JZ DOLIN
|
|||
|
CMP AL,' '
|
|||
|
JZ RET
|
|||
|
CMP AL,':'
|
|||
|
JZ RET
|
|||
|
CMP AL,','
|
|||
|
JZ RET
|
|||
|
CMP AL,9
|
|||
|
RET
|
|||
|
HEX:
|
|||
|
AND AL,0FH
|
|||
|
ADD AL,90H
|
|||
|
DAA
|
|||
|
ADC AL,40H
|
|||
|
DAA
|
|||
|
PUTCH:
|
|||
|
PUSH BX
|
|||
|
PUSH DX
|
|||
|
PUSH CX
|
|||
|
LAHF
|
|||
|
XCHG AH,AL
|
|||
|
PUSH AX
|
|||
|
XCHG AH,AL
|
|||
|
AND AL,7FH
|
|||
|
MOV BX,[PUTPT]
|
|||
|
MOV [BX],AL
|
|||
|
INC BX
|
|||
|
MOV [PUTPT],BX
|
|||
|
CMP BX,PUTBUF+80H
|
|||
|
JNZ POPRET
|
|||
|
MOV DX,PUTBUF
|
|||
|
MOV [PUTPT],DX
|
|||
|
MOV CL,SETDMA
|
|||
|
CALL SYSTEM
|
|||
|
MOV DX,PUTFCB
|
|||
|
MOV CL,WRITE
|
|||
|
CALL SYSTEM
|
|||
|
OR AL,AL
|
|||
|
MOV DX,WRTERR
|
|||
|
JNZ ABORT
|
|||
|
POPRET:
|
|||
|
POP AX
|
|||
|
XCHG AH,AL
|
|||
|
SAHF
|
|||
|
NOTAF:
|
|||
|
POP CX
|
|||
|
POP DX
|
|||
|
POP BX
|
|||
|
RET
|
|||
|
;
|
|||
|
; Get character from source file.
|
|||
|
;
|
|||
|
GETCH:
|
|||
|
PUSH BX
|
|||
|
PUSH DX
|
|||
|
PUSH CX
|
|||
|
MOV BX,[GETPT] ; Get buffer pointer.
|
|||
|
CMP BX,GETBUF+80H ; Past end-of-buffer?
|
|||
|
JNZ GETIT ; Jump if not.
|
|||
|
MOV DX,GETBUF ; Set `DMA address'.
|
|||
|
MOV CL,SETDMA
|
|||
|
CALL SYSTEM
|
|||
|
MOV DX,FCB ; Read the next record from source file.
|
|||
|
MOV CL,READ
|
|||
|
CALL SYSTEM
|
|||
|
CMP AL,0 ; Entire record read OK?
|
|||
|
JE OKRECORD
|
|||
|
CMP AL,3 ; Partial record read?
|
|||
|
JE OKRECORD
|
|||
|
MOV AL,EOF ; Force end-of-file character in case
|
|||
|
JP TESEND ; there is nothing in the record.
|
|||
|
OKRECORD:
|
|||
|
MOV BX,GETBUF ; Reset buffer pointer.
|
|||
|
GETIT:
|
|||
|
MOV AL,[BX] ; Get next character from buffer.
|
|||
|
INC BX ; Point to next character.
|
|||
|
MOV [GETPT],BX ; Save new pointer.
|
|||
|
TESEND:
|
|||
|
MOV [CHAR],AL
|
|||
|
JP NOTAF ; Pop registers and return.
|
|||
|
LOAD:
|
|||
|
CALL DELIM
|
|||
|
JZ LOADOP
|
|||
|
EATLAB:
|
|||
|
CALL PUTCH
|
|||
|
CALL DELIM
|
|||
|
JNZ EATLAB
|
|||
|
ENLAB:
|
|||
|
MOV AL,':'
|
|||
|
CALL PUTCH
|
|||
|
LOADOP:
|
|||
|
MOV BX,OPCODE
|
|||
|
EATEM:
|
|||
|
CALL DELIM
|
|||
|
JZ EATEM
|
|||
|
LOADLP:
|
|||
|
CALL IDCHK
|
|||
|
JNC $+5
|
|||
|
JMP OPERR
|
|||
|
MOV [BX],AL
|
|||
|
INC BX
|
|||
|
CALL DELIM
|
|||
|
JNZ LOADLP
|
|||
|
MOV B,[BX],0
|
|||
|
CMP AL,':'
|
|||
|
JNZ RET
|
|||
|
MOV BX,OPCODE
|
|||
|
CALL TRANS
|
|||
|
JP ENLAB
|
|||
|
GETOP:
|
|||
|
XOR AL,AL
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
GETLP:
|
|||
|
CALL DELIM
|
|||
|
JZ GETLP
|
|||
|
OPCHAR:
|
|||
|
CMP AL,'('
|
|||
|
JNZ NOTLEF
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
INC AL
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
MOV B,[BX],'['
|
|||
|
JP NEXCH
|
|||
|
NOTLEF:
|
|||
|
CMP AL,')'
|
|||
|
JNZ NOTRIT
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
DEC AL
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
MOV B,[BX],']'
|
|||
|
JP NEXCH
|
|||
|
NOTRIT:
|
|||
|
MOV [BX],AL
|
|||
|
CMP AL,''''
|
|||
|
JZ EATQUO
|
|||
|
CALL IDCHK
|
|||
|
JNC GETID
|
|||
|
NEXCH:
|
|||
|
INC BX
|
|||
|
CALL GETCH
|
|||
|
IDRET:
|
|||
|
CALL DELCHK
|
|||
|
JNZ OPCHAR
|
|||
|
CMP AL,' '
|
|||
|
JZ OPCHAR
|
|||
|
RET
|
|||
|
EATQUO:
|
|||
|
INC BX
|
|||
|
CALL GETCH
|
|||
|
MOV [BX],AL
|
|||
|
CMP AL,';'
|
|||
|
JZ L0000
|
|||
|
CALL DELCHK
|
|||
|
L0000:
|
|||
|
CMP AL,''''
|
|||
|
JNZ EATQUO
|
|||
|
JP NEXCH
|
|||
|
IDCHK:
|
|||
|
CMP AL,'0'
|
|||
|
JC RET
|
|||
|
CMP AL,'9'+1
|
|||
|
CMC
|
|||
|
JNC RET
|
|||
|
CMP AL,40H
|
|||
|
JC RET
|
|||
|
AND AL,5FH
|
|||
|
CMP AL,'A'
|
|||
|
JC RET
|
|||
|
CMP AL,'Z'+1
|
|||
|
CMC
|
|||
|
RET
|
|||
|
GETID:
|
|||
|
MOV [BX],AL
|
|||
|
MOV CH,1
|
|||
|
LODID:
|
|||
|
INC BX
|
|||
|
CALL GETCH
|
|||
|
CALL IDCHK
|
|||
|
JC RWCHK
|
|||
|
MOV [BX],AL
|
|||
|
INC CH
|
|||
|
JP LODID
|
|||
|
RWCHK:
|
|||
|
LAHF
|
|||
|
XCHG AH,AL
|
|||
|
PUSH AX
|
|||
|
XCHG AH,AL
|
|||
|
PUSH BX
|
|||
|
DEC BX
|
|||
|
DEC CH
|
|||
|
MOV DL,CH
|
|||
|
JZ LOOKRW
|
|||
|
MOV DL,[BX]
|
|||
|
DEC BX
|
|||
|
DEC CH
|
|||
|
JNZ NORW
|
|||
|
LOOKRW:
|
|||
|
MOV AL,[BX]
|
|||
|
MOV DH,AL
|
|||
|
PUSH BX
|
|||
|
MOV BX,RWTAB
|
|||
|
MOV CX,LENRW
|
|||
|
RWLK:
|
|||
|
UP
|
|||
|
MOV DI,BX
|
|||
|
REPNZ
|
|||
|
SCAB
|
|||
|
MOV BX,DI
|
|||
|
JNZ NOTRW
|
|||
|
PUSH BX
|
|||
|
PUSH CX
|
|||
|
MOV CX,LENRW-1
|
|||
|
LAHF
|
|||
|
ADD BX,CX
|
|||
|
RCR SI
|
|||
|
SAHF
|
|||
|
RCL SI
|
|||
|
MOV AL,[BX]
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
CMP AL,DL
|
|||
|
JZ HAVRW
|
|||
|
MOV AL,CL
|
|||
|
OR AL,AL
|
|||
|
MOV AL,DH
|
|||
|
JNZ RWLK
|
|||
|
NOTRW:
|
|||
|
POP BX
|
|||
|
NORW:
|
|||
|
POP BX
|
|||
|
ENDRW:
|
|||
|
POP AX
|
|||
|
XCHG AH,AL
|
|||
|
SAHF
|
|||
|
JMP IDRET
|
|||
|
HAVRW:
|
|||
|
POP BX
|
|||
|
INC CL
|
|||
|
MOV [BX],CL
|
|||
|
INC BX
|
|||
|
POP DX
|
|||
|
PUSH BX
|
|||
|
MOV AL,CL
|
|||
|
MOV BX,IXSI
|
|||
|
CMP AL,RSI
|
|||
|
JZ IXIY
|
|||
|
MOV BX,IYDI
|
|||
|
CMP AL,RDI
|
|||
|
JNZ NORW
|
|||
|
IXIY:
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
JZ NOTENC
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
CALL OUTSTR
|
|||
|
JP NORW
|
|||
|
NOTENC:
|
|||
|
LAHF
|
|||
|
XCHG AX,BP
|
|||
|
SAHF
|
|||
|
POP BX
|
|||
|
DEC BX
|
|||
|
MOV B,[BX],'['
|
|||
|
INC BX
|
|||
|
ADD AL,RIX-1
|
|||
|
MOV [BX],AL
|
|||
|
INC BX
|
|||
|
MOV B,[BX],']'
|
|||
|
INC BX
|
|||
|
JP ENDRW
|
|||
|
RET
|
|||
|
FINDOP:
|
|||
|
MOV BX,OPCODE
|
|||
|
MOV CX,5
|
|||
|
XOR AL,AL
|
|||
|
UP
|
|||
|
MOV DI,BX
|
|||
|
REPNZ
|
|||
|
SCAB
|
|||
|
MOV BX,DI
|
|||
|
JNZ OPERR
|
|||
|
MOV AL,4
|
|||
|
SUB AL,CL
|
|||
|
JZ RET
|
|||
|
DEC AL
|
|||
|
JZ OPERR
|
|||
|
MOV CL,AL
|
|||
|
DEC BX
|
|||
|
DEC BX
|
|||
|
OR B,[BX],080H
|
|||
|
MOV AL,[OPCODE]
|
|||
|
SUB AL,'A'
|
|||
|
JC OPERR
|
|||
|
ADD AL,AL
|
|||
|
MOV DL,AL
|
|||
|
MOV DH,0
|
|||
|
MOV BX,OPTAB
|
|||
|
LAHF
|
|||
|
ADD BX,DX
|
|||
|
RCR SI
|
|||
|
SAHF
|
|||
|
RCL SI
|
|||
|
MOV DL,[BX]
|
|||
|
INC BX
|
|||
|
MOV DH,[BX]
|
|||
|
XCHG DX,BX
|
|||
|
MOV AL,9
|
|||
|
CALL PUTCH
|
|||
|
LOOKOP:
|
|||
|
MOV AL,[BX]
|
|||
|
OR AL,AL
|
|||
|
JZ OPERR
|
|||
|
MOV DX,OPCODE+1
|
|||
|
MOV CH,CL
|
|||
|
LOOKLP:
|
|||
|
MOV SI,DX
|
|||
|
LODB
|
|||
|
CMP AL,[BX]
|
|||
|
JNZ NEXOP
|
|||
|
INC DX
|
|||
|
INC BX
|
|||
|
DEC CH
|
|||
|
JNZ LOOKLP
|
|||
|
MOV DX,[BX]
|
|||
|
MOV BX,[BX+2]
|
|||
|
JMP DX
|
|||
|
NEXOP:
|
|||
|
RCR SI
|
|||
|
TEST B,[BX],080H
|
|||
|
RCL SI
|
|||
|
LAHF
|
|||
|
INC BX
|
|||
|
SAHF
|
|||
|
JZ NEXOP
|
|||
|
MOV DX,4
|
|||
|
LAHF
|
|||
|
ADD BX,DX
|
|||
|
RCR SI
|
|||
|
SAHF
|
|||
|
RCL SI
|
|||
|
JP LOOKOP
|
|||
|
OPERR:
|
|||
|
MOV BX,OPCODE
|
|||
|
CALL OUTSTR
|
|||
|
CALL TWOOPS
|
|||
|
MOV BX,OPCDER
|
|||
|
CALL OUTSTR
|
|||
|
JMP ENLIN
|
|||
|
LD:
|
|||
|
CALL OUTSTR
|
|||
|
MOV BX,OP1
|
|||
|
MOV DX,OP2+1
|
|||
|
CALL LCHECK
|
|||
|
JNZ $+5
|
|||
|
JMP LDAX
|
|||
|
XCHG DX,BX
|
|||
|
DEC BX
|
|||
|
INC DX
|
|||
|
CALL LCHECK
|
|||
|
JNZ $+5
|
|||
|
JMP STAX
|
|||
|
;If immediate move, check for byte memory reference
|
|||
|
MOV AL,[OP2]
|
|||
|
CMP AL,20H ;Could be immediate?
|
|||
|
MOV AL,9
|
|||
|
JC L0001
|
|||
|
CALL BYTCHK ;Add "B," if memory reference
|
|||
|
L0001:
|
|||
|
CALL TRAN1
|
|||
|
JP TRNOP2
|
|||
|
TWOOPS:
|
|||
|
CALL TRNOP1
|
|||
|
TRNOP2:
|
|||
|
MOV AL,','
|
|||
|
TRAN2:
|
|||
|
MOV BX,OP2
|
|||
|
PTRANS:
|
|||
|
CALL PUTCH
|
|||
|
TRANS:
|
|||
|
MOV AL,[BX]
|
|||
|
LAHF
|
|||
|
INC BX
|
|||
|
SAHF
|
|||
|
OR AL,AL
|
|||
|
JZ RET
|
|||
|
CALL TRNTOK
|
|||
|
JP TRANS
|
|||
|
LCHECK:
|
|||
|
MOV AL,[BX]
|
|||
|
CMP AL,RAL
|
|||
|
JNZ RET
|
|||
|
MOV SI,DX
|
|||
|
LODB
|
|||
|
CMP AL,RCX
|
|||
|
JZ RET
|
|||
|
CMP AL,RDX
|
|||
|
RET
|
|||
|
|
|||
|
ONEOP:
|
|||
|
CALL OUTSTR
|
|||
|
MOV AL,9
|
|||
|
CALL BYTCHK ;If memory reference, add "B," flag
|
|||
|
JMPS TRAN1
|
|||
|
|
|||
|
TRNOP1:
|
|||
|
MOV AL,9
|
|||
|
TRAN1:
|
|||
|
MOV BX,OP1
|
|||
|
JP PTRANS
|
|||
|
IN:
|
|||
|
MOV AL,[OP1]
|
|||
|
CMP AL,RAL
|
|||
|
XCHG DX,BX
|
|||
|
MOV BX,OP2
|
|||
|
JZ GETPORT
|
|||
|
MOV BX,SAVEAX
|
|||
|
CALL OUTSTR
|
|||
|
CALL OUTSTR
|
|||
|
MOV BX,OP2
|
|||
|
CALL GETPORT
|
|||
|
MOV BX,MOV0
|
|||
|
CALL ONEOP
|
|||
|
MOV AL,','
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,RAL
|
|||
|
CALL TRNTOK
|
|||
|
IODONE:
|
|||
|
MOV BX,RESTAX
|
|||
|
JMP OUTSTR
|
|||
|
OUT:
|
|||
|
MOV AL,[OP2]
|
|||
|
XCHG DX,BX
|
|||
|
MOV BX,OP1
|
|||
|
CMP AL,RAL
|
|||
|
JZ GETOUT
|
|||
|
MOV BX,SAVEAX
|
|||
|
CALL OUTSTR
|
|||
|
MOV BX,MOVAL
|
|||
|
CALL OUTSTR
|
|||
|
CALL TRNOP2
|
|||
|
MOV BX,CRLFTB
|
|||
|
CALL OUTSTR
|
|||
|
MOV BX,OP1
|
|||
|
CALL GETOUT
|
|||
|
JP IODONE
|
|||
|
GETPORT:
|
|||
|
MOV AL,[BX]
|
|||
|
CMP AL,'['
|
|||
|
JNZ NOBRAK
|
|||
|
LAHF
|
|||
|
INC BX
|
|||
|
SAHF
|
|||
|
PUSH BX
|
|||
|
MOV CX,80
|
|||
|
MOV AL,']'
|
|||
|
UP
|
|||
|
MOV DI,BX
|
|||
|
REPNZ
|
|||
|
SCAB
|
|||
|
MOV BX,DI
|
|||
|
LAHF
|
|||
|
DEC BX
|
|||
|
SAHF
|
|||
|
MOV B,[BX],0
|
|||
|
POP BX
|
|||
|
NOBRAK:
|
|||
|
MOV AL,[BX]
|
|||
|
CMP AL,RGCL
|
|||
|
JNZ FIXPOR
|
|||
|
MOV BX,IO1
|
|||
|
CALL OUTSTR
|
|||
|
XCHG DX,BX
|
|||
|
CALL OUTSTR
|
|||
|
MOV AL,RDX
|
|||
|
CALL TRNTOK
|
|||
|
MOV BX,IO2
|
|||
|
JMP OUTSTR
|
|||
|
GETOUT:
|
|||
|
CALL GETPORT
|
|||
|
JNC RET
|
|||
|
MOV BX,BADIO
|
|||
|
JMP OUTSTR
|
|||
|
FIXPOR:
|
|||
|
XCHG DX,BX
|
|||
|
CALL OUTSTR
|
|||
|
XCHG DX,BX
|
|||
|
JMP TRANS
|
|||
|
LDAX:
|
|||
|
MOV BX,LDAX1
|
|||
|
LSAX:
|
|||
|
CALL OUTSTR
|
|||
|
MOV SI,DX
|
|||
|
LODB
|
|||
|
CALL TRNTOK
|
|||
|
JP OUTSTR
|
|||
|
STAX:
|
|||
|
MOV BX,STAX1
|
|||
|
JP LSAX
|
|||
|
TRNTOK:
|
|||
|
CMP AL,' '
|
|||
|
JC $+5
|
|||
|
JMP PUTCH
|
|||
|
PUSH BX
|
|||
|
PUSH CX
|
|||
|
MOV CL,AL
|
|||
|
MOV CH,0
|
|||
|
MOV BX,TOKTAB-2
|
|||
|
LAHF
|
|||
|
ADD BX,CX
|
|||
|
RCR SI
|
|||
|
SAHF
|
|||
|
RCL SI
|
|||
|
LAHF
|
|||
|
ADD BX,CX
|
|||
|
RCR SI
|
|||
|
SAHF
|
|||
|
RCL SI
|
|||
|
MOV AL,[BX]
|
|||
|
CALL PUTCH
|
|||
|
INC BX
|
|||
|
MOV AL,[BX]
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
OR AL,AL
|
|||
|
JZ RET
|
|||
|
JMP PUTCH
|
|||
|
PUSH:
|
|||
|
MOV DX,PUSHAF
|
|||
|
JP AFCHK
|
|||
|
POP:
|
|||
|
MOV DX,POPAF
|
|||
|
AFCHK:
|
|||
|
MOV AL,[OP1]
|
|||
|
CMP AL,RAX
|
|||
|
JNZ ONEOPJ
|
|||
|
XCHG DX,BX
|
|||
|
OUTSTR:
|
|||
|
MOV AL,[BX]
|
|||
|
OR AL,AL
|
|||
|
JNZ L0002
|
|||
|
CALL NEWOP
|
|||
|
L0002:
|
|||
|
CALL PUTCH
|
|||
|
INC BX
|
|||
|
ADD AL,AL
|
|||
|
JNC OUTSTR
|
|||
|
RET
|
|||
|
NEWOP:
|
|||
|
MOV AL,13
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,10
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,9
|
|||
|
RET
|
|||
|
LDDR:
|
|||
|
CALL OUTSTR
|
|||
|
MOV BX,BLMOVE
|
|||
|
JP OUTSTR
|
|||
|
CPDR:
|
|||
|
CALL OUTSTR
|
|||
|
MOV BX,CMPREP
|
|||
|
JP OUTSTR
|
|||
|
ADD:
|
|||
|
MOV AL,[OP1]
|
|||
|
CMP AL,RBX
|
|||
|
JZ DAD
|
|||
|
ARITH:
|
|||
|
CALL OUTSTR
|
|||
|
MOV AL,[OP2]
|
|||
|
OR AL,AL
|
|||
|
JZ $+5
|
|||
|
JMP TWOOPS
|
|||
|
MOV AL,9
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,RAL
|
|||
|
CALL TRNTOK
|
|||
|
MOV AL,','
|
|||
|
JMP TRAN1
|
|||
|
ACCUM:
|
|||
|
CALL OUTSTR
|
|||
|
MOV AL,9
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,RAL
|
|||
|
JMP TRNTOK
|
|||
|
ONEOPJ: JMP ONEOP
|
|||
|
DAD:
|
|||
|
MOV BX,DAD1
|
|||
|
CALL OUTSTR
|
|||
|
CALL TWOOPS
|
|||
|
MOV BX,DAD2
|
|||
|
JP OUTSTR
|
|||
|
|
|||
|
INCDEC:
|
|||
|
MOV AL,[OP1]
|
|||
|
CMP AL,RCX+1 ;16-bit?
|
|||
|
JNC ONEOPJ
|
|||
|
MOV BX,LAHF
|
|||
|
CALL OUTSTR
|
|||
|
XCHG DX,BX
|
|||
|
MOV BX,OPCODE-1
|
|||
|
CALL ONEOP
|
|||
|
XCHG DX,BX
|
|||
|
OUTSTRJ:
|
|||
|
JMP OUTSTR
|
|||
|
JUMP:
|
|||
|
MOV AL,[OP1]
|
|||
|
CMP AL,'['
|
|||
|
JNZ DIRECT
|
|||
|
MOV AL,[OP1+1]
|
|||
|
MOV [OP1],AL
|
|||
|
XOR AL,AL
|
|||
|
MOV [OP1+1],AL
|
|||
|
DIRECT:
|
|||
|
MOV AL,[OP2]
|
|||
|
OR AL,AL
|
|||
|
JZ ONEOPJ
|
|||
|
CALL FIXCON
|
|||
|
MOV BX,OP2
|
|||
|
OUTCON:
|
|||
|
MOV CH,AL
|
|||
|
MOV AL,'J'
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,CH
|
|||
|
CALL TRNTOK
|
|||
|
MOV AL,9
|
|||
|
CALL PTRANS
|
|||
|
MOV AL,CH
|
|||
|
CMP AL,ODDPAR
|
|||
|
MOV BX,WARNPA
|
|||
|
JZ OUTSTRJ
|
|||
|
CMP AL,EVEPAR
|
|||
|
JZ OUTSTRJ
|
|||
|
RET
|
|||
|
FIXCON:
|
|||
|
MOV AL,[OP1]
|
|||
|
CMP AL,RGCL
|
|||
|
JNZ RET
|
|||
|
MOV AL,CY
|
|||
|
RET
|
|||
|
RETURN:
|
|||
|
MOV AL,[OP1]
|
|||
|
OR AL,AL
|
|||
|
JZ OUTSTRJ
|
|||
|
MOV BX,'R'+4500H ;"RE"
|
|||
|
MOV [OP2],BX
|
|||
|
MOV BX,'T'
|
|||
|
MOV [OP2+2],BX
|
|||
|
JP DIRECT
|
|||
|
ONEOPJ1:
|
|||
|
JMP ONEOP
|
|||
|
DOCALL:
|
|||
|
MOV AL,[OP2]
|
|||
|
OR AL,AL
|
|||
|
JZ ONEOPJ1
|
|||
|
CALL FIXCON
|
|||
|
DEC AL
|
|||
|
XOR AL,1
|
|||
|
INC AL
|
|||
|
MOV BX,LABEL
|
|||
|
CALL OUTCON
|
|||
|
MOV BX,OPCODE-1
|
|||
|
CALL OUTSTR
|
|||
|
MOV AL,[OP2]
|
|||
|
OR AL,AL
|
|||
|
MOV AL,9
|
|||
|
MOV BX,OP2
|
|||
|
JZ L0003
|
|||
|
CALL PTRANS
|
|||
|
L0003:
|
|||
|
MOV BX,CRLF
|
|||
|
CALL OUTSTR
|
|||
|
CALL TRANS
|
|||
|
CALL OUTSTR
|
|||
|
MOV BX,LABEL+4
|
|||
|
NEXLAB:
|
|||
|
INC [BX]
|
|||
|
MOV AL,[BX]
|
|||
|
CMP AL,'9'+1
|
|||
|
JNZ RET
|
|||
|
MOV B,[BX],'0'
|
|||
|
LAHF
|
|||
|
DEC BX
|
|||
|
SAHF
|
|||
|
JP NEXLAB
|
|||
|
EX:
|
|||
|
MOV AL,[OP1]
|
|||
|
CMP AL,RAX
|
|||
|
JZ OUTSTRJ1
|
|||
|
MOV AL,[OP1+1]
|
|||
|
CMP AL,STP
|
|||
|
JZ XTHL
|
|||
|
MOV BX,XCHG
|
|||
|
CALL OUTSTR
|
|||
|
JMP TWOOPS
|
|||
|
XTHL:
|
|||
|
MOV BX,XTHL1
|
|||
|
CALL OUTSTR
|
|||
|
CALL TRNOP2
|
|||
|
MOV BX,XTHL2
|
|||
|
OUTSTRJ1:
|
|||
|
JMP OUTSTR
|
|||
|
PSEUDO:
|
|||
|
CALL ONEOP
|
|||
|
MOV AL,[OP2]
|
|||
|
OR AL,AL
|
|||
|
JZ RET
|
|||
|
JMP TRNOP2
|
|||
|
RET
|
|||
|
BITSET:
|
|||
|
MOV CL,0
|
|||
|
JP SETRES
|
|||
|
RES:
|
|||
|
MOV CL,-1
|
|||
|
SETRES:
|
|||
|
CALL OUTSTR
|
|||
|
PUSH BX
|
|||
|
MOV AL,[OP2]
|
|||
|
CMP AL,'['
|
|||
|
MOV AL,9
|
|||
|
JNZ L0004
|
|||
|
CALL BFLAG
|
|||
|
L0004:
|
|||
|
CALL TRAN2
|
|||
|
MOV AL,','
|
|||
|
CALL PUTCH
|
|||
|
CALL GETBIT
|
|||
|
MOV BX,BITERR
|
|||
|
JNC L0005
|
|||
|
CALL OUTSTR
|
|||
|
L0005:
|
|||
|
POP BX
|
|||
|
JMP OUTSTR
|
|||
|
|
|||
|
BYTCHK:
|
|||
|
;Check if memory reference and add "B," for byte mode
|
|||
|
CMP B,[OP1],"[" ;Memory reference?
|
|||
|
JNZ RET
|
|||
|
CMP B,[OP1+1],RIX ;Referencing IX as a word?
|
|||
|
JZ RET
|
|||
|
CMP B,[OP1+1],RIY
|
|||
|
JZ RET
|
|||
|
BFLAG:
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,'B'
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,','
|
|||
|
RET
|
|||
|
|
|||
|
GETBIT:
|
|||
|
MOV AL,[OP1+1]
|
|||
|
OR AL,AL
|
|||
|
STC
|
|||
|
JNZ RET
|
|||
|
MOV AL,[OP1]
|
|||
|
SUB AL,'0'
|
|||
|
JC RET
|
|||
|
CMP AL,8
|
|||
|
CMC
|
|||
|
JC RET
|
|||
|
MOV CH,AL
|
|||
|
INC CH
|
|||
|
XOR AL,AL
|
|||
|
STC
|
|||
|
SHFT:
|
|||
|
RCL AL
|
|||
|
DEC CH
|
|||
|
JNZ SHFT
|
|||
|
XOR AL,CL
|
|||
|
MOV CH,AL
|
|||
|
MOV AL,'0'
|
|||
|
CALL PUTCH
|
|||
|
MOV AL,CH
|
|||
|
RCR AL
|
|||
|
RCR AL
|
|||
|
RCR AL
|
|||
|
RCR AL
|
|||
|
CALL HEX
|
|||
|
MOV AL,CH
|
|||
|
CALL HEX
|
|||
|
MOV AL,'H'
|
|||
|
JMP PUTCH
|
|||
|
OPTAB:
|
|||
|
DW AOPS,BOPS,COPS,DOPS,EOPS
|
|||
|
DW FOPS,GOPS,HOPS,IOPS,JOPS
|
|||
|
DW KOPS,LOPS,MOPS,NOPS,OOPS
|
|||
|
DW POPS,QOPS,ROPS,SOPS,TOPS
|
|||
|
DW UOPS,VOPS,WOPS,XOPS,YOPS
|
|||
|
DW ZOPS
|
|||
|
AOPS:
|
|||
|
DM 'DD'
|
|||
|
DW ADD,OPCODE
|
|||
|
DM 'DC'
|
|||
|
DW ARITH,OPCODE
|
|||
|
DM 'ND'
|
|||
|
DW ARITH,OPCODE
|
|||
|
DB 0
|
|||
|
BOPS:
|
|||
|
DM 'IT'
|
|||
|
DW BITSET,TESBIT
|
|||
|
DB 0
|
|||
|
COPS:
|
|||
|
DM 'ALL'
|
|||
|
DW DOCALL,OPCODE
|
|||
|
DM 'P'
|
|||
|
DW ARITH,CMP
|
|||
|
DM 'PL'
|
|||
|
DW ACCUM,NOT
|
|||
|
DM 'PIR'
|
|||
|
DW OUTSTR,CPIR
|
|||
|
DM 'PDR'
|
|||
|
DW CPDR,DOWN
|
|||
|
DM 'CF'
|
|||
|
DW OUTSTR,CMC
|
|||
|
DB 0
|
|||
|
DOPS:
|
|||
|
DM 'EC'
|
|||
|
DW INCDEC,OPCODE
|
|||
|
DM 'JNZ'
|
|||
|
DW ONEOP,DJNZ
|
|||
|
DM 'AA'
|
|||
|
DW OUTSTR,OPCODE
|
|||
|
DM 'I'
|
|||
|
DW OUTSTR,OPCODE
|
|||
|
DM 'W'
|
|||
|
DW PSEUDO,OPCODE
|
|||
|
DM 'B'
|
|||
|
DW PSEUDO,OPCODE
|
|||
|
DM 'M'
|
|||
|
DW PSEUDO,OPCODE
|
|||
|
DM 'S'
|
|||
|
DW ONEOP,OPCODE
|
|||
|
DB 0
|
|||
|
EOPS:
|
|||
|
DM 'X'
|
|||
|
DW EX,EXAF
|
|||
|
DM 'I'
|
|||
|
DW OUTSTR,OPCODE
|
|||
|
DM 'XX'
|
|||
|
DW OUTSTR,EXX
|
|||
|
DM 'QU'
|
|||
|
DW ONEOP,OPCODE
|
|||
|
DM 'NDIF'
|
|||
|
DW OUTSTR,OPCODE
|
|||
|
DB 0
|
|||
|
FOPS:
|
|||
|
DB 0
|
|||
|
GOPS:
|
|||
|
DB 0
|
|||
|
HOPS:
|
|||
|
DM 'ALT'
|
|||
|
DW OUTSTR,HLT
|
|||
|
DB 0
|
|||
|
IOPS:
|
|||
|
DM 'NC'
|
|||
|
DW INCDEC,OPCODE
|
|||
|
DM 'N'
|
|||
|
DW IN,INB
|
|||
|
DM 'F'
|
|||
|
DW ONEOP,OPCODE
|
|||
|
DB 0
|
|||
|
JOPS:
|
|||
|
DM 'R'
|
|||
|
DW JUMP,JR
|
|||
|
DM 'P'
|
|||
|
DW JUMP,JMP
|
|||
|
DB 0
|
|||
|
KOPS:
|
|||
|
DB 0
|
|||
|
LOPS:
|
|||
|
DM 'D'
|
|||
|
DW LD,MOV
|
|||
|
DM 'DIR'
|
|||
|
DW OUTSTR,UP
|
|||
|
DM 'DDR'
|
|||
|
DW LDDR,DOWN
|
|||
|
DB 0
|
|||
|
MOPS:
|
|||
|
DB 0
|
|||
|
NOPS:
|
|||
|
DM 'EG'
|
|||
|
DW ACCUM,OPCODE
|
|||
|
DB 0
|
|||
|
OOPS:
|
|||
|
DM 'R'
|
|||
|
DW ARITH,OPCODE
|
|||
|
DM 'UT'
|
|||
|
DW OUT,OUTB
|
|||
|
DM 'RG'
|
|||
|
DW ONEOP,OPCODE
|
|||
|
DB 0
|
|||
|
POPS:
|
|||
|
DM 'OP'
|
|||
|
DW POP,OPCODE
|
|||
|
DM 'USH'
|
|||
|
DW PUSH,OPCODE
|
|||
|
DB 0
|
|||
|
QOPS:
|
|||
|
DB 0
|
|||
|
ROPS:
|
|||
|
DM 'ET'
|
|||
|
DW RETURN,OPCODE
|
|||
|
DM 'LA'
|
|||
|
DW ACCUM,RCL
|
|||
|
DM 'RA'
|
|||
|
DW ACCUM,RCR
|
|||
|
DM 'LCA'
|
|||
|
DW ACCUM,ROL
|
|||
|
DM 'RCA'
|
|||
|
DW ACCUM,ROR
|
|||
|
DM 'L'
|
|||
|
DW ONEOP,RCL
|
|||
|
DM 'R'
|
|||
|
DW ONEOP,RCR
|
|||
|
DM 'LC'
|
|||
|
DW ONEOP,ROL
|
|||
|
DM 'RC'
|
|||
|
DW ONEOP,ROR
|
|||
|
DM 'ES'
|
|||
|
DW RES,RESBIT
|
|||
|
DM 'ETI'
|
|||
|
DW OUTSTR,IRET
|
|||
|
DM 'ETN'
|
|||
|
DW OUTSTR,IRET
|
|||
|
DM 'ST'
|
|||
|
DW ONEOP,CALL
|
|||
|
DB 0
|
|||
|
SOPS:
|
|||
|
DM 'UB'
|
|||
|
DW ARITH,OPCODE
|
|||
|
DM 'BC'
|
|||
|
DW ARITH,SBB
|
|||
|
DM 'LA'
|
|||
|
DW ONEOP,SAL
|
|||
|
DM 'RA'
|
|||
|
DW ONEOP,SAR
|
|||
|
DM 'RL'
|
|||
|
DW ONEOP,SHR
|
|||
|
DM 'CF'
|
|||
|
DW OUTSTR,STC
|
|||
|
DM 'ET'
|
|||
|
DW BITSET,SETBIT
|
|||
|
DB 0
|
|||
|
TOPS:
|
|||
|
DB 0
|
|||
|
UOPS:
|
|||
|
DB 0
|
|||
|
VOPS:
|
|||
|
DB 0
|
|||
|
WOPS:
|
|||
|
DB 0
|
|||
|
XOPS:
|
|||
|
DM 'OR'
|
|||
|
DW ARITH,OPCODE
|
|||
|
DB 0
|
|||
|
YOPS:
|
|||
|
DB 0
|
|||
|
ZOPS:
|
|||
|
DB 0
|
|||
|
LDAX1: DM 9,'SI,'
|
|||
|
DM 0,'LODB'
|
|||
|
STAX1: DM 9,'DI,'
|
|||
|
DM 0,'STOB'
|
|||
|
PUSHAF: DB 'LAHF',0,'XCHG',9,'AH,AL',0,'PUSH',9,'AX',0
|
|||
|
DM 'XCHG',9,'AH,AL'
|
|||
|
POPAF: DM 'POP',9,'AX',0,'XCHG',9,'AH,AL',0,'SAHF'
|
|||
|
DOWN: DM 'DOWN'
|
|||
|
UP: DB 'UP'
|
|||
|
BLMOVE: DB 0,'MOV',9,'SI,BX',0,'MOV',9,'DI,DX'
|
|||
|
DB 0,'REP',0,'MOVB',0,'MOV',9,'DX,DI'
|
|||
|
DM 0,'MOV',9,'BX,SI'
|
|||
|
CPIR: DB 'UP'
|
|||
|
CMPREP: DB 0,'MOV',9,'DI,BX',0,'REPNZ',0,'SCAB'
|
|||
|
DM 0,'MOV',9,'BX,DI'
|
|||
|
DAD1: DM 'LAHF',0,'ADD'
|
|||
|
DAD2: DM 0,'RCR',9,'SI',0,'SAHF',0,'RCL',9,'SI'
|
|||
|
LAHF: DM 'LAHF'
|
|||
|
DM 0,'SAHF'
|
|||
|
DJNZ: DB 'DEC',9,'CH',13,10
|
|||
|
DB '; *** WARNING: DJNZ does not affect flags - DEC does.',0
|
|||
|
DM 'JNZ'
|
|||
|
WARNPA: DM 13,10,'; *** WARNING: Parity flag not always same as Z80.'
|
|||
|
IO1: DB 'MOV',9,'DI,DX',0,'MOV',9,'DL,CL',0
|
|||
|
DM 'XOR',9,'DH,DH',13,10,9
|
|||
|
IO2: DM 0,'MOV',9,'DX,DI'
|
|||
|
BADIO: DM 13,10,'; *** WARNING: Flags not same as Z80.'
|
|||
|
BITERR: DM 13,10,' *** ERROR: Cannot determine bit number.'
|
|||
|
SETBIT: DM 'LAHF',0,'OR'
|
|||
|
DM 0,'SAHF'
|
|||
|
RESBIT: DM 'LAHF',0,'AND'
|
|||
|
DM 0,'SAHF'
|
|||
|
TESBIT: DM 'RCR',9,'AH',0,'TEST'
|
|||
|
DM 0,'RCL',9,'AH'
|
|||
|
XTHL1: DM 'POP',9,'SI',0,'XCHG',9,'SI'
|
|||
|
XTHL2: DM 0,'PUSH',9,'SI'
|
|||
|
EXX: DB 'XCHG',9,'BX,[HL]',0,'XCHG',9,'DX,[DE]',0
|
|||
|
DM 'XCHG',9,'CX,[BC]'
|
|||
|
EXAF: DM 'LAHF',0,'XCHG',9,'AX,BP',0,'SAHF'
|
|||
|
MOVAL: DM 0,'MOV',9,'AL'
|
|||
|
IXSI: DM 9,'MOV',9,'SI,[IX]',13,10
|
|||
|
IYDI: DM 9,'MOV',9,'DI,[IY]',13,10
|
|||
|
RESTAX: DB 0
|
|||
|
SAVEAX: DM 'XCHG',9,'AX,SI'
|
|||
|
CRLFTB: DM 13,10,9
|
|||
|
INB: DM 'INB',9
|
|||
|
OUTB: DM 'OUTB',9
|
|||
|
XCHG: DM 'XCHG'
|
|||
|
JMP: DM 'JMP'
|
|||
|
JR: DM 'JMPS'
|
|||
|
RCL: DM 'RCL'
|
|||
|
RCR: DM 'RCR'
|
|||
|
ROL: DM 'ROL'
|
|||
|
ROR: DM 'ROR'
|
|||
|
SAL: DM 'SAL'
|
|||
|
SAR: DM 'SAR'
|
|||
|
SHR: DM 'SHR'
|
|||
|
STC: DM 'STC'
|
|||
|
IRET: DM 'IRET'
|
|||
|
HLT: DM 'HLT'
|
|||
|
CMC: DM 'CMC'
|
|||
|
NOT: DM 'NOT'
|
|||
|
MOV0: DB 0
|
|||
|
MOV: DM 'MOV'
|
|||
|
CMP: DM 'CMP'
|
|||
|
SBB: DM 'SBB'
|
|||
|
CALL: DM 'CALL'
|
|||
|
TOKTAB:
|
|||
|
DB 'SIDI'
|
|||
|
DB 'PEPOS',0,'NSNZZ',0,'NCC',0
|
|||
|
DB 'AXSPBXDXCX'
|
|||
|
DB 'BLBHDLDHCLCHALIXIY'
|
|||
|
RWTAB:
|
|||
|
DB 'ABCDEHLBDHSACNZNPMPPII'
|
|||
|
LENRW: EQU $-RWTAB
|
|||
|
DB 0,0,0,0,0,0,0,'CELPF',0,'C',0,'Z',0,0,'OEYX'
|
|||
|
HEADER: DB 13,10,'Z80 to 8086 Translator version 2.21',13,10,'$'
|
|||
|
NOROOM: DB 13,10,'File creation error',13,10,'$'
|
|||
|
NOFILE: DB 13,10,'File not found',13,10,'$'
|
|||
|
ENDMES: DB 13,10,'Translation complete',13,10,'$'
|
|||
|
WRTERR: DB 13,10,'Out of disk space',13,10,'$'
|
|||
|
OPCDER: DM 13,10,'*** Opcode Error '
|
|||
|
CRLF: DM 13,10
|
|||
|
LABEL: DB 'L0000',0
|
|||
|
DM ':',9
|
|||
|
PUTPT: DS 2
|
|||
|
GETPT: DS 2
|
|||
|
CHAR: DS 1
|
|||
|
DB 0
|
|||
|
OPCODE: DS 80
|
|||
|
OP1: DS 80
|
|||
|
OP2: DS 80
|
|||
|
PUTBUF: DS 128
|
|||
|
GETBUF: DS 128
|
|||
|
PUTFCB: DS 33
|
|||
|
DS 50
|
|||
|
STACK: EQU $
|
|||
|
ORG 1 ;This is really just for equates without EQU
|
|||
|
RSI: DS 1
|
|||
|
RDI: DS 1
|
|||
|
ODDPAR: DS 1
|
|||
|
EVEPAR: DS 1
|
|||
|
DS 5 ;MINUS,PLUS,NOT ZERO,ZERO,NOT CARRY
|
|||
|
CY: DS 1
|
|||
|
RAX: DS 1
|
|||
|
STP: DS 1
|
|||
|
RBX: DS 1
|
|||
|
RDX: DS 1
|
|||
|
RCX: DS 1
|
|||
|
RBL: DS 1
|
|||
|
RBH: DS 1
|
|||
|
RDL: DS 1
|
|||
|
RDH: DS 1
|
|||
|
RGCL: DS 1
|
|||
|
RCH: DS 1
|
|||
|
RAL: DS 1
|
|||
|
RIX: DS 1
|
|||
|
RIY: DS 1
|
|||
|
|