ORG 103H
XEQ 103H
SIN EQU 0C01FH    SOL INPUT
SOU EQU 0C019H    SOL OUTPUT
STAK EQU 0CBFFH   STACK IN SCRATCHPAD RAM
LXI SP,STAK
COPY NPTDEFS     PTDOS SYSTEM CALLS
CALL 0C0D5H      CLEAR SCREEN
CALL MSGI        ASK FOR INPUT FILENAME
LXI H,IBUFI
IMF CALL SIN      PUT IT IN BUFFER FOR PSCAN
JZ IMF
MOV M,A
CPI 0DH
PUSH PSW
MOV B,A
CNZ OUTR       ECHO TO SCREEN IF NOT C/R
POP PSW
INX H
JNZ IMF
CALL MSGO     ASK FOR OUTPUT FILENAME
LXI H,IBUFO
OMF CALL SIN   TO BUFFER
JZ OMF
MOV M,A
CPI 0DH
PUSH PSW
MOV B,A
CNZ OUTR
POP PSW
INX H
JNZ OMF
PI MVI A,PSOP+40H  OPEN INPUT FILE
LXI H,IBUFI       NAME IS IN IBUFI
LXI D,OBUFI       OUTPUT BUFFER FOR PSCAN
CALL PSCAN
JC ERR            CARRY IS ERROR, ALWAYS
JZ ERR            HERE, SO IS ZERO
MOV A,E
CPI 0FFH          0FFH IN E IS ERROR
JZ ERR
STA IFN           GOT FILE NUMBER, STORE IT
PO MVI A,PSCO+40H  DO SAME FOR OUTPUT FILE
LXI H,IBUFO       CREATE IF IT DOESN'T EXIST
LXI D,OBUFO
CALL PSCAN
JC ERR
JZ ERR
MOV A,E
CPI 0FFH
JZ ERR
STA OFN
LXI H,0
SHLD TEMP1    COUNTER FOR INPUT FILE BUFFER
LXI H,04C0H
SHLD TEMP2    COUNTER FOR OUTPUT FILE BUFFER
LXI H,OFB
SHLD TEMP5    START OF OUTPUT FILE BUFFER
MVI A,1
STA  TEMP6    EOF FLAG
START LHLD  TEMP1
XRA A         SEE IF COUNTER IS ZERO
CMP H
JNZ STAR2
CMP L
JZ  BEGIN         EMPTY?, READ IN MORE & RESET COUNTER
STAR2 LHLD  TEMP4  TEMP4 IS INPUT BUFFER POINTER
MOV A,M
STA TEMP3
CALL WOBUF   PUT CHARACTER IN OUTPUT FILE BUFFER
CONT  LHLD  TEMP4  INCREMENT INPUT FILE BUFFER POINTER
INX H
SHLD TEMP4
LHLD  TEMP1  DECREMENT INPUT BUFFER COUNTER
DCX H
SHLD TEMP1
LDA TEMP3  PUT CHARACTER IN A
CPI 0DH    CR? THEN ADD LINEFEED
CZ LFINS
JMP START
LFINS MVI A,0AH   ADD LINEFEED
CALL WOBU2
RET
BEGIN LDA TEMP6  EOF?
CPI 0
JZ FINISH  IF SO, ADD A CTL Z, ENDFILE THE OUTPUT FILE,
;           CLOSE FILES, AND RETURN TO SYS
PUSH H    READ INPUT FILE INTO BUFFER
PUSH B         RESET COUNTER
PUSH D
PUSH PSW
LXI B,04C0H
LXI D,IFB
MVI L,1
LDA IFN
CALL SYS
DB DRDOP      DELIMITED READ
JMP RERR         ERROR RETURN
NRET PUSH B       NORMAL RETURN FROM READ
POP H        B HAD BYTES LEFT IN BUFFER, NOW H HAS IT
SHLD TEMP1   STORE IT
LXI H,TEMP1  HL POINTS TO BYTES LEFT
MVI A,0C0H   DOUBLE PRECISION SUBTRACTION OF
SUB M        BYTES LEFT FROM SIZE OF BUFFER
MOV C,A     (4C0H)
INX H
MVI A,04
SBB M
MOV B,A
PUSH B      B HAS BYTES READ
POP H       NOW H HAS IT
SHLD TEMP1  NOW IN TEMP1
LXI H,IFB
SHLD TEMP4
POP PSW
POP D
POP B
POP H
JMP START
RERR CPI 18H  IN CASE THERE IS NO EOF MARK
JZ EFSET     (A WILL CONTAIN 18H IF EOF)
JMP ERR1
EFSET XRA A   RESET EOF FLAG
STA TEMP6
JMP NRET
WOBUF LDA TEMP3     GET CHARACTER
WOBU2 LHLD  TEMP5   H POINTS TO OUTPUT FILE BUFFER
MOV M,A            PUT IT THERE
LHLD  TEMP2        TEMP2 IS COUNTER
DCX H              BUFFER FULL?
SHLD TEMP2
XRA A
CMP H
JNZ RES
CMP L
JZ WRT             IF SO, WRITE TO DISK
RES   LHLD TEMP5    INCREMENT COUNTER
INX H
SHLD TEMP5         STORE IT
RET                OTHERWISE GET ANOTHER CHARACTER
WRT1 XRA A          RESET EOF FLAG
STA TEMP6
WRT LDA OFN         DELIMITED WRITE TO DISK
LXI B,04C0H
LXI D,OFB
MVI L,1
CALL SYS
DB DWROP
JMP ERR1
W2 LXI H,04C0H  RESET COUNTER
SHLD TEMP2
LXI H,OFB    RESET POINTER
SHLD TEMP5
RET
FINISH MVI A,1AH ADD CP/M END OF FILE
CALL WOBU2
MVI A,1     THIS PUTS 1 AT THE END FOR DELIMITED WRITE
CALL WOBU2
CALL WRT    REST OF OUTPUT BUFFER TO DISK
LDA OFN
LXI B,1
MVI D,128
CALL SYS
DB SPAOP
JMP ERR
LDA OFN  ENDFILE ROUTINE
CALL SYS
DB EOFOP
JMP ERR
EN MVI A,255  CLOSE ALL OPEN FILES
CALL SYS
DB CAOP
JMP ERR
CALL SYS  RETURN TO PTDOS
DB RESOP
MSGI LXI H,MSI
MSGI1 MOV A,M
CPI 0FFH
RZ
MOV B,A
CALL OUTR
INX H
JMP MSGI1
MSGO LXI H,MSO
JMP MSGI1
MSI ASC 'ENTER INPUT FILE NAME - C/R'
DB 0DH
DB 0AH
DB 0FFH
MSO DB 0DH
DB 0AH
ASC 'ENTER OUTPUT FILE NAME - C/R'
DB 0DH
DB 0AH
DB 0FFH
OUTR PUSH H
PUSH D
PUSH B
PUSH PSW
CALL SOU
POP PSW
POP B
POP D
POP H
RET
ERR1 MOV E,A
ERR LXI H,EM
MOV M,E
MVI A,84H
CALL UTIL
DB UXOP
JMP ERR
DB -1
EM DS 1
JMP EN
TEMP1 DS 2
TEMP2 DS 2
TEMP3 DS 1
TEMP4 DS 2
TEMP5 DS 2
TEMP6 DS 2
IFN DS 1
OFN DS 1
IBUFI DS 10
IBUFO DS 10
OBUFI DS 20
DB 0AEH
DW 04C0H
DB 0
OBUFO DS 20
IFB DS 04C0H
OFB DS 04C0H
END