N TITLE '"PASTOCPM" - Convert Pascal file to CP/M file' ;From DR. DOBB'S - August 1979 ;Copyright (C) 1979 Ronald G. Parsons ;Modified by T. Mueller 9/1/79 ; Changes include: ; Provisions for designating disk drives. ; Re-ordering calls to disk routines to be of the form: ; select disk, select track, select sector, read/write. ; Cleaned up handling of null codes in .TEXT files. ; Set up new stack area and data buffers. ; Changed exit to simple return, no re-boot. ; Guaranteed .TEXT file on CP/M disk ends in EOF. ; Memory size independance for BIOS calls. ;9/22/79 - Corrected handling of DLE as last byte of read block. ; ;Transfers a Pascal file to CP/M file. ; ;Syntax -- PASTOCPM <[d:]CP/M filename> <[d:]Pascal filename> ; ;Disk drive (d:) identifiers may be entered. If none are supplied ; defaults are: CP/M file on logged drive, Pascal file on drive B:. ; ;Transfers the Pascal filename on a Pascal disk ; to the CP/M filename on a CP/M disk. If the CP/M file already exists, ; you will be asked for permission to overwrite. ;If the Pascal file is a .TEXT file, then two blocks are skipped ; and tabs replaced by spaces. LF is added after each CR. ;If the Pascal file is a .CODE file, then one block is skipped. ;If file is neither .TEXT or .CODE, the copy is exact. ; ; 0010 = DLE EQU 10H 001A = DENTSZ EQU 26 ;DIRECTORY ENTRY SIZE IN BYTES 0006 = DTITLE EQU 6 ;OFFSET TO ENTRY TITLE ; 0100 ORG 100H 0100 210000 START LXI H,0 0103 39 DAD SP 0104 221E06 SHLD STACK 0107 311E06 LXI SP,STACK ;SET UP PRIVATE STACK ; 010A 0E19 MVI C,LOGGED ;GET LOGGED DISK DRIVE 010C CD0500 CALL BDOS 010F 32DD05 STA LDRIVE 0112 3A5C00 LDA FCB ;GET CP/M DRIVE 0115 B7 ORA A 0116 C22001 JNZ DOIT ;NOT LOGGED DRIVE 0119 3ADD05 LDA LDRIVE ;GET LOGGED DRIVE 011C 3C INR A 011D 325C00 STA FCB ;FORCE SELECTION OF DRIVE 0120 218000 DOIT LXI H,BUFF ;GET PASCAL FILE NAME 0123 11C705 LXI D,SYSTLE+1 0126 3E01 MVI A,1 0128 32DC05 STA RDRIVE ;SET PASCAL DEFAULT TO DRIVE B 012B CD7703 SCN1 CALL SCBLK ;FIND NON-BLANK 012E CA2B01 JZ SCN1 0131 CD7703 SCN2 CALL SCBLK ;FIND BLANK 0134 C23101 JNZ SCN2 0137 CD7703 SCN3 CALL SCBLK ;FIND START OF SECOND PARM 013A CA3701 JZ SCN3 013D 23 INX H 013E 7E MOV A,M 013F FE3A CPI ':' ;CHECK IF DRIVE ENTERED 0141 2B DCX H 0142 C24D01 JNZ SCN4 0145 7E MOV A,M ;GET DRIVE 0146 D641 SUI 'A' 0148 32DC05 STA RDRIVE ;SAVE READ DRIVE 014B 23 INX H 014C 23 INX H ;SKIP DRIVE 014D E5 SCN4 PUSH H 014E 21DC05 LXI H,RDRIVE 0151 3A5C00 LDA FCB 0154 3D DCR A 0155 BE CMP M ;CHECK IF READ AND WRITE DRIVES ARE SAME 0156 E1 POP H 0157 CA5604 JZ DRVERR 015A 0E00 MVI C,0 015C 7E PFN2 MOV A,M 015D B7 ORA A 015E CA6801 JZ PFN3 0161 12 STAX D 0162 23 INX H 0163 13 INX D 0164 0C INR C 0165 C35C01 JMP PFN2 ; 0168 79 PFN3 MOV A,C ;GET FILENAME LENGTH 0169 32C605 STA SYSTLE 016C B7 ORA A 016D CA2F04 JZ NOFLNM ;CHECK FOR .TEXT OR .CODE FILENAME 0170 115E05 LXI D,TEXT+6 0173 2B DCX H ;HL POINTS TO END OF FILENAME 0174 E5 PUSH H 0175 0E05 MVI C,5 0177 1A TEXTLP LDAX D 0178 BE CMP M 0179 C28F01 JNZ NOTEXT ;FILENAME DOES NOT END IN .TEXT 017C 2B DCX H 017D 1B DCX D 017E 0D DCR C 017F C27701 JNZ TEXTLP 0182 21B505 LXI H,TXTFLG ;GOT .TEXT FILE 0185 3602 MVI M,2 0187 115805 LXI D,TEXT 018A 0E09 MVI C,WRITECB 018C CD0500 CALL BDOS ; 018F E1 NOTEXT POP H ;POINT TO END OF FILENAME 0190 117B05 LXI D,CODE+6 0193 0E05 MVI C,5 0195 1A CODELP LDAX D 0196 BE CMP M 0197 C2AD01 JNZ NOTCODE ;FILENAME DOES NOT END IN .CODE 019A 2B DCX H 019B 1B DCX D 019C 0D DCR C 019D C29501 JNZ CODELP 01A0 21B505 LXI H,TXTFLG 01A3 3601 MVI M,1 ;GOT .CODE FILE 01A5 117505 LXI D,CODE 01A8 0E09 MVI C,WRITECB 01AA CD0500 CALL BDOS ; 01AD 115C00 NOTCODE LXI D,FCB 01B0 0E0F MVI C,OPENF ;OPEN FILE 01B2 CD0500 CALL BDOS 01B5 FEFF CPI 0FFH ;NON-EXISTANT? 01B7 CAE001 JZ CREF ;YES - CREATE IT 01BA 11F904 LXI D,PERMSG ;GET PERMISSION TO DELETE IT 01BD 0E09 MVI C,WRITECB 01BF CD0500 CALL BDOS ; 01C2 0E01 RDCHR MVI C,READC ;READ CONSOLE 01C4 CD0500 CALL BDOS 01C7 FE03 CPI ABORT 01C9 CA6C02 JZ EXIT 01CC FE0D CPI CR 01CE C2C201 JNZ RDCHR ;INVALID RESPONSE, TRY AGAIN 01D1 1E0A MVI E,LF 01D3 0E02 MVI C,WRITEC ;CHARACTER TO CONSOLE 01D5 CD0500 CALL BDOS 01D8 115C00 LXI D,FCB 01DB 0E13 MVI C,DELETEF ;KILL FILE 01DD CD0500 CALL BDOS ; 01E0 115C00 CREF LXI D,FCB 01E3 0E16 MVI C,CREATEF ;CREATE FILE 01E5 CD0500 CALL BDOS 01E8 FEFF CPI 0FFH ;ERROR? 01EA CA4B04 JZ CERROR ;YES ; ;INITIALIXE BUFFER POINTERS ; 01ED 218000 INIT LXI H,BUFF 01F0 22C205 SHLD BOL 01F3 21FF00 LXI H,BUFF+127 01F6 22C405 SHLD EOB 01F9 212008 LXI H,BLKBUF+512 01FC 22BC05 SHLD BUFADD ; 01FF 012008 LXI B,DIRTOP ;READ DIRECTORY INTO THIS 0202 CD8202 CALL READ$DIR ; 0205 212008 LXI H,DIRTOP ;SET DIRECTORY ENTRY POINTER 0208 111A00 LXI D,DENTSZ ; TO FIRST ENTRY AFTER VOLUME NAME 020B 19 DAD D 020C 22B605 SHLD DENTP ; 020F CD8B02 CALL FIND$FILE ;FIND THE FILE ; 0212 2AB605 LHLD DENTP ;START OF DIRECTORY ENTRY 0215 5E MOV E,M 0216 23 INX H 0217 56 MOV D,M 0218 D5 PUSH D ;SAVE FIRST BLOCK 0219 23 INX H 021A 5E MOV E,M 021B 23 INX H 021C 56 MOV D,M 021D EB XCHG ;LAST BLOCK+1 IN HL 021E 29 DAD H ;X2 021F 29 DAD H ;X4 0220 22C005 SHLD LSTLSN ;(LAST LSN + 1) * 4 0223 E1 POP H ;GET FIRST BLOCK 0224 3AB505 LDA TXTFLG 0227 3D SKPBL1 DCR A ;SKIP BLOCKS DEPENDING ON 0228 FA2F02 JM SKPBL2 ; .TEXT OR .CODE 022B 23 INX H 022C C32702 JMP SKPBL1 ; 022F 29 SKPBL2 DAD H ;X2 0230 29 DAD H ;X4 0231 22BE05 SHLD LSN ;(FIRST LSN) * 4 ; 0234 CD4103 LR80B CALL R80B ;READ 128 BYTES 0237 3AB805 LDA EOFFLAG 023A B7 ORA A ;LAST PASCAL SECTOR READ? 023B C24402 JNZ FILL1A ;YES 023E CD6203 CALL WB ;WRITE BUFFER 0241 C33402 JMP LR80B ; 0244 CD2903 FILL1A CALL CT ;FILL BUFFER WITH EOF 0247 CD6203 CALL WB ;WRITE BUFFER 024A 3AB505 LDA TXTFLG 024D FE02 CPI 2 ;.TEXT? 024F C26402 JNZ FILL2 ;NO 0252 2AC405 LHLD EOB 0255 7E MOV A,M 0256 FE1A CPI EOF ;CHECK IF LAST SECTOR WRITTEN HAS EOF 0258 CA6402 JZ FILL2 025B 218000 LXI H,BUFF 025E 22C205 SHLD BOL 0261 C34402 JMP FILL1A 0264 115C00 FILL2 LXI D,FCB 0267 0E10 MVI C,CLOSEF ;CLOSE FILE 0269 CD0500 CALL BDOS 026C 118000 EXIT LXI D,BUFF 026F 0E1A MVI C,DMAADD 0271 CD0500 CALL BDOS 0274 3ADD05 LDA LDRIVE ;GET LOGGED DRIVE 0277 5F MOV E,A 0278 0E0E MVI C,SELECTD ;RESTORE LOGGED DRIVE 027A CD0500 CALL BDOS 027D 2A1E06 LHLD STACK 0280 F9 SPHL ;RESTORE SP 0281 C9 RET ;JOB DONE - GO BACK ; ;********************************************************* ; ; SUBROUTINES ; ;********************************************************* ; ;READ DIRECTORY'S 4 BLOCKS TO BUFFER ;BUFFER ADDRESS IS ALREADY IN REG-BC ; READ$DIR: 0282 1E04 MVI E,4 ;DIRECTORY IS 4 BLOCKS LONG 0284 210200 LXI H,2 ; AND STARTS AT BLOCK 2 0287 CDBC02 CALL SYSRD ;GET IT 028A C9 RET ; ; FIND$FILE: 028B 0E4D MVI C,77 ;STOP AFTER THE 77'TH ENTRY 028D 2AB605 LHLD DENTP ;GET STARTING ENTRY FI$SCH$LP: 0290 110600 LXI D,DTITLE ;ADVANCE TO TILTE STRING 0293 19 DAD D 0294 11C605 LXI D,SYSTLE ;SET REG-DE TO COMPARISON STRING 0297 3AC605 LDA SYSTLE ;COMPARISON LENGTH 029A 3C INR A ;COMPARE INCLUDES LENGTH BYTE 029B 47 MOV B,A FI$CMP$LP: 029C 1A LDAX D 029D BE CMP M 029E C2AA02 JNZ FI$CONT ;IT'S NOT THIS ONE 02A1 13 INX D 02A2 23 INX H 02A3 05 DCR B ;CHECK FOR END OF STRING 02A4 C29C02 JNZ FI$CMP$LP ;NOT YET 02A7 C3BB02 JMP FI$FOUND ;FOUND IT ; FI$CONT: 02AA 2AB605 LHLD DENTP ;ON TO THE NEXT ENTRY 02AD 111A00 LXI D,DENTSZ 02B0 19 DAD D 02B1 22B605 SHLD DENTP 02B4 0D DCR C ;IS THERE ANY DIRECTORY LEFT? 02B5 C29002 JNZ FI$SCH$LP ;YES FI$HANG: 02B8 C33504 JMP NOFILE ;FILE NOT THERE ; FI$FOUND: 02BB C9 RET ;GOT IT ; ; ;READ BLOCKS FROM PASCAL DISKETTE ; 02BC D5 SYSRD PUSH D ;SAVE BLOCK COUNT 02BD E5 PUSH H ; AND BLOCK NUMBER 02BE CDC902 CALL READ$RX ;BUFFER IS ADVANCED BY 512 BYTES 02C1 E1 POP H 02C2 D1 POP D 02C3 23 INX H ;ADVANCE TO NEXT BLOCK 02C4 1D DCR E ;SEE IF WE'RE DONE 02C5 C2BC02 JNZ SYSRD 02C8 C9 RET ; ; ;READ A PASCAL BLOCK ; READ$RX: 02C9 29 DAD H ;THERE ARE 4 SECTORS TO A BLOCK 02CA 29 DAD H ;MULT LOGICAL BLOCK BY 4 02CB 1E04 MVI E,4 02CD C5 RR$LP PUSH B ;SET BUFFER ADDRESS 02CE D5 PUSH D 02CF E5 PUSH H 02D0 CD9F04 CALL SETDMA 02D3 E1 POP H ;NOW COMPUTE TRACK/SECTOR 02D4 E5 PUSH H 02D5 CD5C04 CALL MAP ;CONVERTS LOGICAL SECTOR IN HL 02D8 E5 PUSH H 02D9 3ADC05 LDA RDRIVE 02DC 5F MOV E,A 02DD 0E0E MVI C,SELECTD ;SELECT READ DISK 02DF CD0500 CALL BDOS 02E2 E1 POP H 02E3 4C MOV C,H ; INTO TRACK H, SECTOR L 02E4 E5 PUSH H 02E5 CD9304 CALL SETTRK 02E8 E1 POP H 02E9 4D MOV C,L 02EA CD9904 CALL SETSEC 02ED CDA504 CALL READ 02F0 B7 ORA A 02F1 C23B04 JNZ RWERR 02F4 E1 POP H 02F5 D1 POP D 02F6 C1 POP B 02F7 E5 PUSH H ;ADVANCE THE BUFFER ADDRESS 02F8 218000 LXI H,128 02FB 09 DAD B 02FC 44 MOV B,H 02FD 4D MOV C,L 02FE E1 POP H 02FF 23 INX H ;ADVANCE THE BLOCK COUNT 0300 1D DCR E ;SEE IF WE CONTINUE 0301 C2CD02 JNZ RR$LP ;YES 0304 C9 RET ; ; ;READ SECTOR GIVEN BY LSN ; 0305 0E1A RDSEC MVI C,DMAADD 0307 CD0500 CALL BDOS 030A 2ABE05 LHLD LSN 030D CD5C04 CALL MAP ;CONVERT LOGICAL SECTOR # TO TRACK/SECTOR 0310 4C MOV C,H 0311 E5 PUSH H 0312 CD9304 CALL SETTRK 0315 E1 POP H 0316 4D MOV C,L 0317 CD9904 CALL SETSEC 031A CDA504 CALL READ 031D B7 ORA A 031E C23B04 JNZ RWERR 0321 2ABE05 LHLD LSN 0324 23 INX H 0325 22BE05 SHLD LSN 0328 C9 RET ; ;CLEAR TO END OF BUFFER ; 0329 2AC405 CT LHLD EOB 032C 23 INX H 032D EB XCHG 032E 2AC205 LHLD BOL 0331 CD3B03 CT1 CALL EQUAL 0334 C8 RZ 0335 361A MVI M,EOF 0337 23 INX H 0338 C33103 JMP CT1 ; 033B 7D EQUAL MOV A,L 033C BB CMP E 033D C0 RNZ 033E 7C MOV A,H 033F BA CMP D 0340 C9 RET ;ZERO IF DE=HL ; ;READ A SECTOR TO BUFFER ; 0341 0680 R80B MVI B,128 0343 218000 LXI H,BUFF 0346 C5 R80B1 PUSH B 0347 E5 PUSH H 0348 CD8103 CALL RB 034B E1 POP H 034C C1 POP B 034D F5 PUSH PSW 034E 3AB805 LDA EOFFLAG 0351 B7 ORA A 0352 CA5A03 JZ R80B2 ;NOT EOF 0355 F1 POP PSW 0356 22C205 SHLD BOL 0359 C9 RET ; 035A F1 R80B2 POP PSW 035B 77 MOV M,A 035C 23 INX H 035D 05 DCR B 035E C24603 JNZ R80B1 0361 C9 RET ; ;WRITE 128 BYTE BUFFER ; 0362 118000 WB LXI D,BUFF 0365 0E1A MVI C,DMAADD 0367 CD0500 CALL BDOS 036A 115C00 LXI D,FCB 036D 0E15 MVI C,WRITER 036F CD0500 CALL BDOS 0372 B7 ORA A 0373 C23B04 JNZ RWERR 0376 C9 RET ; ;SCAN FOR BLANKS IN COMMAND LINE ; 0377 23 SCBLK INX H 0378 7E MOV A,M 0379 FE00 CPI 0 ;CHECK IF END OF INPUT LINE 037B CA2F04 JZ NOFLNM 037E FE20 CPI ' ' 0380 C9 RET ; ;PROCESS LF AND TAB FILL, GET BYTE FROM READ BUFFER ; 0381 3AB505 RB LDA TXTFLG 0384 FE02 CPI 2 0386 C2A503 JNZ RBFB ;NOT .TEXT 0389 3AB905 RCCKLF LDA NLF ;NEED LF? 038C B7 ORA A 038D CA9703 JZ RBCKTB 0390 AF XRA A 0391 32B905 STA NLF 0394 3E0A MVI A,LF 0396 C9 RET ; 0397 3ABA05 RBCKTB LDA NTB ;NEED TAB? 039A B7 ORA A 039B CAA503 JZ RBFB 039E 3D DCR A 039F 32BA05 STA NTB 03A2 3E20 MVI A,' ' 03A4 C9 RET ; ;GET BYTE FROM READ BUFFER, AND FILL IF NEEDED ; 03A5 2ABC05 RBFB LHLD BUFADD 03A8 112008 LXI D,BLKBUF+512 03AB CD3B03 CALL EQUAL ;CHECK FOR END OF BUFFER 03AE CAF203 JZ RBLK 03B1 3AB505 LDA TXTFLG 03B4 FE02 CPI 2 ;.TEXT? 03B6 C2EC03 JNZ NOTEXT2 03B9 3ABB05 LDA DFLAG ;WAS LAST CHAR DLE? 03BC B7 ORA A 03BD C2D203 JNZ RBFBT ;YES 03C0 7E MOV A,M 03C1 B7 ORA A 03C2 23 INX H 03C3 22BC05 SHLD BUFADD 03C6 CAA503 JZ RBFB ;SKIP BYTE OF ZERO 03C9 FE0D CPI CR 03CB C2E303 JNZ CKDLE 03CE 32B905 STA NLF ;PUT LF AFTER CR 03D1 C9 RET ;PROCESS BYTE FOLLOWING DLE ; 03D2 7E RBFBT MOV A,M 03D3 23 INX H 03D4 22BC05 SHLD BUFADD 03D7 D620 SUI 32 ;GET INDENTATION 03D9 32BA05 STA NTB ;SAVE NUMBER OF COLUMNS TO INDENT 03DC AF XRA A 03DD 32BB05 STA DFLAG ;CLEAR TAB FLAG 03E0 C39703 JMP RBCKTB ;DO BLANK EXPANSION ; ;CHECK FOR DLE CODE - USED FOR INDENTATION ; 03E3 FE10 CKDLE CPI DLE 03E5 C0 RNZ 03E6 32BB05 STA DFLAG ;SET FLAG FOR DLE FOUND 03E9 C3A503 JMP RBFB ;GET NEXT BYTE (COUNT) ; 03EC 7E NOTEXT2 MOV A,M 03ED 23 INX H 03EE 22BC05 SHLD BUFADD 03F1 C9 RET ; ;READ 4 SECTORS (A PASCAL BLOCK) ; 03F2 2ABE05 RBLK LHLD LSN ;GET START LOGICAL SECTOR NUMBER 03F5 EB XCHG 03F6 2AC005 LHLD LSTLSN 03F9 CD3B03 CALL EQUAL 03FC CA2904 JZ SETEOF ;FOUND LAST SECTOR 03FF 3ADC05 LDA RDRIVE ;GET READ DRIVE NUMBER 0402 5F MOV E,A 0403 0E0E MVI C,SELECTD ;SELECT DISK 0405 CD0500 CALL BDOS 0408 112006 LXI D,BLKBUF ;READ 4 SECTORS 040B CD0503 CALL RDSEC 040E 11A006 LXI D,BLKBUF+128 0411 CD0503 CALL RDSEC 0414 112007 LXI D,BLKBUF+256 0417 CD0503 CALL RDSEC 041A 11A007 LXI D,BLKBUF+384 041D CD0503 CALL RDSEC 0420 212006 LXI H,BLKBUF 0423 22BC05 SHLD BUFADD ;RESET POINTER TO START OF BUFFER 0426 C3A503 JMP RBFB ; 0429 21B805 SETEOF LXI H,EOFFLAG 042C 3601 MVI M,1 ;LAST SECTOR ALREADY READ 042E C9 RET ; ;ERROR MESSAGES ; 042F 11AB04 NOFLNM LXI D,NOFLNMSG 0432 C34304 JMP GENERR ; 0435 11C704 NOFILE LXI D,NOFMSG 0438 C34304 JMP GENERR ; 043B F630 RWERR ORI '0' ;MAKE IT ASCII 043D 32E604 STA WERMSG 0440 11E604 LXI D,WERMSG 0443 0E09 GENERR MVI C,WRITECB 0445 CD0500 CALL BDOS 0448 C36C02 JMP EXIT ; 044B 113905 CERROR LXI D,ERRMSG 044E F630 ORI '0' 0450 323905 STA ERRMSG 0453 C34304 JMP GENERR ; 0456 119205 DRVERR LXI D,DERMSG 0459 C34304 JMP GENERR ; ;TURN LSN INTO TRACK/SECTOR ; ;NOTE - TRACK 0 IS NOT USED, SO BLOCK 0 IS AT TRACK 1 SECTOR 1 ; ;ON ENTRY - REG-HL HAS LOGICAL BLOCK # * 4 = LOGICAL SECTOR # ;ON EXIT - REG-H HAS PHYSICAL TRACK ; REG-L HAS PHYSICAL SECTOR ; 045C C5 MAP PUSH B 045D D5 PUSH D 045E CD8204 CALL DIV26 0461 7D MOV A,L 0462 87 ADD A 0463 47 MOV B,A 0464 3E0C MVI A,12 0466 BD CMP L 0467 D26B04 JNC MAPC 046A 04 INR B 046B 4B MAPC MOV C,E 046C AF XRA A 046D 57 MOV D,A 046E 67 MOV H,A 046F 68 MOV L,B 0470 3E06 MVI A,6 MAP$LOOP: 0472 19 DAD D 0473 3D DCR A 0474 C27204 JNZ MAP$LOOP 0477 C5 PUSH B 0478 CD8204 CALL DIV26 047B C1 POP B 047C 2C INR L 047D 61 MOV H,C 047E 24 INR H 047F D1 POP D 0480 C1 POP B 0481 C9 RET ; ; 0482 01E6FF DIV26 LXI B,-26 0485 1EFF MVI E,0FFH 0487 1C DIVL INR E 0488 09 DAD B 0489 7C MOV A,H 048A B7 ORA A 048B F28704 JP DIVL 048E 011A00 LXI B,26 0491 09 DAD B 0492 C9 RET ; ; ; ;BIOS ENTRIES ; 0493 2A0100 SETTRK LHLD 1 0496 2E1E MVI L,1EH 0498 E9 PCHL ; 0499 2A0100 SETSEC LHLD 1 049C 2E21 MVI L,21H 049E E9 PCHL ; 049F 2A0100 SETDMA LHLD 1 04A2 2E24 MVI L,24H 04A4 E9 PCHL ; 04A5 2A0100 READ LHLD 1 04A8 2E27 MVI L,27H 04AA E9 PCHL ; 04AB 0D0A455252NOFLNMSG DB CR,LF,'ERROR - Missing file name$' 04C7 0D0A225061NOFMSG DB CR,LF,'"Pascal" file does not exist$' 04E6 2020526561WERMSG DB ' Read/Write ERROR$' 04F9 0D0A224350PERMSG DB CR,LF,'"CP/M" file already exists.' 0516 0D0A432F52 DB CR,LF,'C/R to continue, CTRL-C to abort$' 0539 2020455252ERRMSG DB ' ERROR in file Create or Open$' 0558 0D0A2E5445TEXT DB CR,LF,'.TEXT file being processed$' 0575 0D0A2E434FCODE DB CR,LF,'.CODE file being processed$' 0592 0D0A455252DERMSG DB CR,LF,'ERROR - Both files on same drive$' ; ; 05B5 00 TXTFLG DB 0 05B6 DENTP DS 2 05B8 00 EOFFLAG DB 0 05B9 00 NLF DB 0 05BA 00 NTB DB 0 05BB 00 DFLAG DB 0 05BC BUFADD DS 2 05BE LSN DS 2 05C0 LSTLSN DS 2 05C2 BOL DS 2 05C4 EOB DS 2 05C6 SYSTLE DS 22 05DC RDRIVE DS 1 ;DRIVE FOR READ 05DD LDRIVE DS 1 ;LOGGED DRIVE ON ENTRY ; 05DE DS 64 ;STACK AREA 061E STACK DS 2 ;ENTRY SP 0620 BLKBUF DS 512 0820 DIRTOP DS 2048 ; ; ;CP/M EQUATES ; 0005 = BDOS EQU 5 005C = FCB EQU 5CH 0080 = BUFF EQU 80H 0001 = READC EQU 1 ;READ CONSOLE CHARACTER 0002 = WRITEC EQU 2 ;WRITE CONSOLE CHARACTER 0009 = WRITECB EQU 9 ;WRITE CONSOLE BUFFER 000E = SELECTD EQU 14 ;SELECT DRIVE 000F = OPENF EQU 15 ;OPEN FILE 0010 = CLOSEF EQU 16 ;CLOSE FILE 0013 = DELETEF EQU 19 ;DELETE FILE 0015 = WRITER EQU 21 ;WRITE RECORD 0016 = CREATEF EQU 22 ;CREATE FILE 0019 = LOGGED EQU 25 ;GET LOGGED DRIVE 001A = DMAADD EQU 26 ;SET DMA ADDRESS ; 000D = CR EQU 0DH 000A = LF EQU 0AH 0003 = ABORT EQU 3 ;CRTL-C 001A = EOF EQU 1AH ; 1020 END START