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