home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol044
/
cpm2heli.s
< prev
next >
Wrap
Text File
|
1984-04-29
|
5KB
|
246 lines
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
LXI H,40H LINE LENGTH COUNTER
SHLD TEMP7
LXI H,1
SHLD 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
CPI 0AH REMOVE LF
JZ CONT
CPI 1AH REMOVE CTRL/Z
JZ FINISH
CPI 9 REMOVE HORIZONTAL TAB
JZ CONT
CPI 0DH CR? RESET LINE LENGTH COUNTER
CZ CRRES
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
LHLD TEMP7
DCR L INSERT CR IF 64 CHARACTERS WITHOUT ONE
SHLD TEMP7
CZ CRINS
JMP START
CRRES LXI H,40H RESET CHARACTER COUNTER TO 64
SHLD TEMP7
RET
CRINS MVI A,0DH CR IN A
CALL WOBU2 PUT IT IN OUTPUT BUFFER
JMP CRRES RESET CHARACTER COUNTER
BEGIN LDA TEMP6 EOF?
CPI 0
JZ FINISH IF SO,ENDFILE OF, CLOSE FILES, 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
JMP RERR ERROR RETURN
NRET PUSH B B HAS # BYTES NOT READ
POP H NOW H HAS IT
SHLD TEMP1 IN TEMP1 FOR THE MOMENT
LXI H,TEMP1 HL POINTS TO IT
MVI A,0C0H DOUBLE PRECISION SUBTRACTION OF BYTES
SUB M NOT READ FROM SIZE OF BUFFER (4C0H)
MOV C,A
INX H
MVI A,04
SBB M
MOV B,A
PUSH B
POP H
SHLD TEMP1 TEMP1 NOW HAS BYTES READ
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
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
INX H
SHLD TEMP5
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,1 PUT 1 AT END FOR DELIMITED WRITE
CALL WOBU2
CALL WRT WRITE REST OF BUFFER TO DISK
LDA OFN MOVE FILE CURSOR BACK ONE SPACE
LXI B,1
MVI D,128
CALL SYS
DB SPAOP
JMP ERR
LDA OFN EOF MARK TO OUTPUT FILE
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 EN
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
TEMP7 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