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