home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol008 / pastocpm.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  11.4 KB  |  660 lines

  1.     TITLE    '"PASTOCPM" - Convert Pascal file to CP/M file'
  2. ;From DR. DOBB'S - August 1979
  3. ;Copyright (C) 1979 Ronald G. Parsons
  4. ;Modified by T. Mueller 9/1/79
  5. ; Changes include:
  6. ;    Provisions for designating disk drives.
  7. ;    Re-ordering calls to disk routines to be of the form:
  8. ;        select disk, select track, select sector, read/write.
  9. ;    Cleaned up handling of null codes in .TEXT files.
  10. ;    Set up new stack area and data buffers.
  11. ;    Changed exit to simple return, no re-boot.
  12. ;    Guaranteed .TEXT file on CP/M disk ends in EOF.
  13. ;    Memory size independance for BIOS calls.
  14. ;9/22/79 - Corrected handling of DLE as last byte of read block.
  15. ;
  16. ;Transfers a Pascal file to CP/M file.
  17. ;
  18. ;Syntax -- PASTOCPM <[d:]CP/M filename> <[d:]Pascal filename>
  19. ;
  20. ;Disk drive (d:) identifiers may be entered.  If none are supplied
  21. ; defaults are: CP/M file on logged drive, Pascal file on drive B:.
  22. ;
  23. ;Transfers the Pascal filename on a Pascal disk
  24. ;  to the CP/M filename on a CP/M disk.  If the CP/M file already exists,
  25. ;  you will be asked for permission to overwrite.
  26. ;If the Pascal file is a .TEXT file, then two blocks are skipped
  27. ;  and tabs replaced by spaces.  LF is added after each CR.
  28. ;If the Pascal file is a .CODE file, then one block is skipped.
  29. ;If file is neither .TEXT or .CODE, the copy is exact.
  30. ;
  31. ;
  32. DLE    EQU    10H
  33. DENTSZ    EQU    26    ;DIRECTORY ENTRY SIZE IN BYTES
  34. DTITLE    EQU    6    ;OFFSET TO ENTRY TITLE
  35. ;
  36.     ORG    100H
  37. START    LXI    H,0
  38.     DAD    SP
  39.     SHLD    STACK
  40.     LXI    SP,STACK    ;SET UP PRIVATE STACK
  41. ;
  42.     MVI    C,LOGGED    ;GET LOGGED DISK DRIVE
  43.     CALL    BDOS
  44.     STA    LDRIVE
  45.     LDA    FCB        ;GET CP/M DRIVE
  46.     ORA    A
  47.     JNZ    DOIT        ;NOT LOGGED DRIVE
  48.     LDA    LDRIVE        ;GET LOGGED DRIVE
  49.     INR    A
  50.     STA    FCB        ;FORCE SELECTION OF DRIVE
  51. DOIT    LXI    H,BUFF        ;GET PASCAL FILE NAME
  52.     LXI    D,SYSTLE+1
  53.     MVI    A,1
  54.     STA    RDRIVE        ;SET PASCAL DEFAULT TO DRIVE B
  55. SCN1    CALL    SCBLK        ;FIND NON-BLANK
  56.     JZ    SCN1
  57. SCN2    CALL    SCBLK        ;FIND BLANK
  58.     JNZ    SCN2
  59. SCN3    CALL    SCBLK        ;FIND START OF SECOND PARM
  60.     JZ    SCN3
  61.     INX    H
  62.     MOV    A,M
  63.     CPI    ':'        ;CHECK IF DRIVE ENTERED
  64.     DCX    H
  65.     JNZ    SCN4
  66.     MOV    A,M        ;GET DRIVE
  67.     SUI    'A'
  68.     STA    RDRIVE        ;SAVE READ DRIVE
  69.     INX    H
  70.     INX    H        ;SKIP DRIVE
  71. SCN4    PUSH    H
  72.     LXI    H,RDRIVE
  73.     LDA    FCB
  74.     DCR    A
  75.     CMP    M        ;CHECK IF READ AND WRITE DRIVES ARE SAME
  76.     POP    H
  77.     JZ    DRVERR
  78.     MVI    C,0
  79. PFN2    MOV    A,M
  80.     ORA    A
  81.     JZ    PFN3
  82.     STAX    D
  83.     INX    H
  84.     INX    D
  85.     INR    C
  86.     JMP    PFN2
  87. ;
  88. PFN3    MOV    A,C        ;GET FILENAME LENGTH
  89.     STA    SYSTLE
  90.     ORA    A
  91.     JZ    NOFLNM
  92. ;CHECK FOR .TEXT OR .CODE FILENAME
  93.     LXI    D,TEXT+6
  94.     DCX    H        ;HL POINTS TO END OF FILENAME
  95.     PUSH    H
  96.     MVI    C,5
  97. TEXTLP    LDAX    D
  98.     CMP    M
  99.     JNZ    NOTEXT        ;FILENAME DOES NOT END IN .TEXT
  100.     DCX    H
  101.     DCX    D
  102.     DCR    C
  103.     JNZ    TEXTLP
  104.     LXI    H,TXTFLG    ;GOT .TEXT FILE
  105.     MVI    M,2
  106.     LXI    D,TEXT
  107.     MVI    C,WRITECB
  108.     CALL    BDOS
  109. ;
  110. NOTEXT    POP    H        ;POINT TO END OF FILENAME
  111.     LXI    D,CODE+6
  112.     MVI    C,5
  113. CODELP    LDAX    D
  114.     CMP    M
  115.     JNZ    NOTCODE        ;FILENAME DOES NOT END IN .CODE
  116.     DCX    H
  117.     DCX    D
  118.     DCR    C
  119.     JNZ    CODELP
  120.     LXI    H,TXTFLG
  121.     MVI    M,1        ;GOT .CODE FILE
  122.     LXI    D,CODE
  123.     MVI    C,WRITECB
  124.     CALL    BDOS
  125. ;
  126. NOTCODE    LXI    D,FCB
  127.     MVI    C,OPENF        ;OPEN FILE
  128.     CALL    BDOS
  129.     CPI    0FFH        ;NON-EXISTANT?
  130.     JZ    CREF        ;YES - CREATE IT
  131.     LXI    D,PERMSG    ;GET PERMISSION TO DELETE IT
  132.     MVI    C,WRITECB
  133.     CALL    BDOS
  134. ;
  135. RDCHR    MVI    C,READC        ;READ CONSOLE
  136.     CALL    BDOS
  137.     CPI    ABORT
  138.     JZ    EXIT
  139.     CPI    CR
  140.     JNZ    RDCHR        ;INVALID RESPONSE, TRY AGAIN
  141.     MVI    E,LF
  142.     MVI    C,WRITEC    ;CHARACTER TO CONSOLE
  143.     CALL    BDOS
  144.     LXI    D,FCB
  145.     MVI    C,DELETEF    ;KILL FILE
  146.     CALL    BDOS
  147. ;
  148. CREF    LXI    D,FCB
  149.     MVI    C,CREATEF    ;CREATE FILE
  150.     CALL    BDOS
  151.     CPI    0FFH        ;ERROR?
  152.     JZ    CERROR        ;YES
  153. ;
  154. ;INITIALIXE BUFFER POINTERS
  155. ;
  156. INIT    LXI    H,BUFF
  157.     SHLD    BOL
  158.     LXI    H,BUFF+127
  159.     SHLD    EOB
  160.     LXI    H,BLKBUF+512
  161.     SHLD    BUFADD
  162. ;
  163.     LXI    B,DIRTOP    ;READ DIRECTORY INTO THIS
  164.     CALL    READ$DIR
  165. ;
  166.     LXI    H,DIRTOP    ;SET DIRECTORY ENTRY POINTER
  167.     LXI    D,DENTSZ    ;  TO FIRST ENTRY AFTER VOLUME NAME
  168.     DAD    D
  169.     SHLD    DENTP
  170. ;
  171.     CALL    FIND$FILE    ;FIND THE FILE
  172. ;
  173.     LHLD    DENTP        ;START OF DIRECTORY ENTRY
  174.     MOV    E,M
  175.     INX    H
  176.     MOV    D,M
  177.     PUSH    D        ;SAVE FIRST BLOCK
  178.     INX    H
  179.     MOV    E,M
  180.     INX    H
  181.     MOV    D,M
  182.     XCHG            ;LAST BLOCK+1 IN HL
  183.     DAD    H        ;X2
  184.     DAD    H        ;X4
  185.     SHLD    LSTLSN        ;(LAST LSN + 1) * 4
  186.     POP    H        ;GET FIRST BLOCK
  187.     LDA    TXTFLG
  188. SKPBL1    DCR    A        ;SKIP BLOCKS DEPENDING ON
  189.     JM    SKPBL2        ;  .TEXT OR .CODE
  190.     INX    H
  191.     JMP    SKPBL1
  192. ;
  193. SKPBL2    DAD    H        ;X2
  194.     DAD    H        ;X4
  195.     SHLD    LSN        ;(FIRST LSN) * 4
  196. ;
  197. LR80B    CALL    R80B        ;READ 128 BYTES
  198.     LDA    EOFFLAG
  199.     ORA    A        ;LAST PASCAL SECTOR READ?
  200.     JNZ    FILL1A        ;YES
  201.     CALL    WB        ;WRITE BUFFER
  202.     JMP    LR80B
  203. ;
  204. FILL1A    CALL    CT        ;FILL BUFFER WITH EOF
  205.     CALL    WB        ;WRITE BUFFER
  206.     LDA    TXTFLG
  207.     CPI    2        ;.TEXT?
  208.     JNZ    FILL2        ;NO
  209.     LHLD    EOB
  210.     MOV    A,M
  211.     CPI    EOF        ;CHECK IF LAST SECTOR WRITTEN HAS EOF
  212.     JZ    FILL2
  213.     LXI    H,BUFF
  214.     SHLD    BOL
  215.     JMP    FILL1A
  216. FILL2    LXI    D,FCB
  217.     MVI    C,CLOSEF    ;CLOSE FILE
  218.     CALL    BDOS
  219. EXIT    LXI    D,BUFF
  220.     MVI    C,DMAADD
  221.     CALL    BDOS
  222.     LDA    LDRIVE        ;GET LOGGED DRIVE
  223.     MOV    E,A
  224.     MVI    C,SELECTD    ;RESTORE LOGGED DRIVE
  225.     CALL    BDOS
  226.     LHLD    STACK
  227.     SPHL            ;RESTORE SP
  228.     RET            ;JOB DONE - GO BACK
  229. ;
  230. ;*********************************************************
  231. ;
  232. ;  SUBROUTINES
  233. ;
  234. ;*********************************************************
  235. ;
  236. ;READ DIRECTORY'S 4 BLOCKS TO BUFFER
  237. ;BUFFER ADDRESS IS ALREADY IN REG-BC
  238. ;
  239. READ$DIR:
  240.     MVI    E,4        ;DIRECTORY IS 4 BLOCKS LONG
  241.     LXI    H,2        ;  AND STARTS AT BLOCK 2
  242.     CALL    SYSRD        ;GET IT
  243.     RET
  244. ;
  245. ;
  246. FIND$FILE:
  247.     MVI    C,77        ;STOP AFTER THE 77'TH ENTRY
  248.     LHLD    DENTP        ;GET STARTING ENTRY
  249. FI$SCH$LP:
  250.     LXI    D,DTITLE    ;ADVANCE TO TILTE STRING
  251.     DAD    D
  252.     LXI    D,SYSTLE    ;SET REG-DE TO COMPARISON STRING
  253.     LDA    SYSTLE        ;COMPARISON LENGTH
  254.     INR    A        ;COMPARE INCLUDES LENGTH BYTE
  255.     MOV    B,A
  256. FI$CMP$LP:
  257.     LDAX    D
  258.     CMP    M
  259.     JNZ    FI$CONT        ;IT'S NOT THIS ONE
  260.     INX    D
  261.     INX    H
  262.     DCR    B        ;CHECK FOR END OF STRING
  263.     JNZ    FI$CMP$LP    ;NOT YET
  264.     JMP    FI$FOUND    ;FOUND IT
  265. ;
  266. FI$CONT:
  267.     LHLD    DENTP        ;ON TO THE NEXT ENTRY
  268.     LXI    D,DENTSZ
  269.     DAD    D
  270.     SHLD    DENTP
  271.     DCR    C        ;IS THERE ANY DIRECTORY LEFT?
  272.     JNZ    FI$SCH$LP    ;YES
  273. FI$HANG:
  274.     JMP    NOFILE        ;FILE NOT THERE
  275. ;
  276. FI$FOUND:
  277.     RET            ;GOT IT
  278. ;
  279. ;
  280. ;READ BLOCKS FROM PASCAL DISKETTE
  281. ;
  282. SYSRD    PUSH    D        ;SAVE BLOCK COUNT
  283.     PUSH    H        ;  AND BLOCK NUMBER
  284.     CALL    READ$RX        ;BUFFER IS ADVANCED BY 512 BYTES
  285.     POP    H
  286.     POP    D
  287.     INX    H        ;ADVANCE TO NEXT BLOCK
  288.     DCR    E        ;SEE IF WE'RE DONE
  289.     JNZ    SYSRD
  290.     RET
  291. ;
  292. ;
  293. ;READ A PASCAL BLOCK
  294. ;
  295. READ$RX:
  296.     DAD    H        ;THERE ARE 4 SECTORS TO A BLOCK
  297.     DAD    H        ;MULT LOGICAL BLOCK BY 4
  298.     MVI    E,4
  299. RR$LP    PUSH    B        ;SET BUFFER ADDRESS
  300.     PUSH    D
  301.     PUSH    H
  302.     CALL    SETDMA
  303.     POP    H        ;NOW COMPUTE TRACK/SECTOR
  304.     PUSH    H
  305.     CALL    MAP        ;CONVERTS LOGICAL SECTOR IN HL
  306.     PUSH    H
  307.     LDA    RDRIVE
  308.     MOV    E,A
  309.     MVI    C,SELECTD    ;SELECT READ DISK
  310.     CALL    BDOS
  311.     POP    H
  312.     MOV    C,H        ;  INTO TRACK H, SECTOR L
  313.     PUSH    H
  314.     CALL    SETTRK
  315.     POP    H
  316.     MOV    C,L
  317.     CALL    SETSEC
  318.     CALL    READ
  319.     ORA    A
  320.     JNZ    RWERR
  321.     POP    H
  322.     POP    D
  323.     POP    B
  324.     PUSH    H        ;ADVANCE THE BUFFER ADDRESS
  325.     LXI    H,128
  326.     DAD    B
  327.     MOV    B,H
  328.     MOV    C,L
  329.     POP    H
  330.     INX    H        ;ADVANCE THE BLOCK COUNT
  331.     DCR    E        ;SEE IF WE CONTINUE
  332.     JNZ    RR$LP        ;YES
  333.     RET
  334. ;
  335. ;
  336. ;READ SECTOR GIVEN BY LSN
  337. ;
  338. RDSEC    MVI    C,DMAADD
  339.     CALL    BDOS
  340.     LHLD    LSN
  341.     CALL    MAP        ;CONVERT LOGICAL SECTOR # TO TRACK/SECTOR
  342.     MOV    C,H
  343.     PUSH    H
  344.     CALL    SETTRK
  345.     POP    H
  346.     MOV    C,L
  347.     CALL    SETSEC
  348.     CALL    READ
  349.     ORA    A
  350.     JNZ    RWERR
  351.     LHLD    LSN
  352.     INX    H
  353.     SHLD    LSN
  354.     RET
  355. ;
  356. ;CLEAR TO END OF BUFFER
  357. ;
  358. CT    LHLD    EOB
  359.     INX    H
  360.     XCHG
  361.     LHLD    BOL
  362. CT1    CALL    EQUAL
  363.     RZ
  364.     MVI    M,EOF
  365.     INX    H
  366.     JMP    CT1
  367. ;
  368. EQUAL    MOV    A,L
  369.     CMP    E
  370.     RNZ
  371.     MOV    A,H
  372.     CMP    D
  373.     RET            ;ZERO IF DE=HL
  374. ;
  375. ;READ A SECTOR TO BUFFER
  376. ;
  377. R80B    MVI    B,128
  378.     LXI    H,BUFF
  379. R80B1    PUSH    B
  380.     PUSH    H
  381.     CALL    RB
  382.     POP    H
  383.     POP    B
  384.     PUSH    PSW
  385.     LDA    EOFFLAG
  386.     ORA    A
  387.     JZ    R80B2        ;NOT EOF
  388.     POP    PSW
  389.     SHLD    BOL
  390.     RET
  391. ;
  392. R80B2    POP    PSW
  393.     MOV    M,A
  394.     INX    H
  395.     DCR    B
  396.     JNZ    R80B1
  397.     RET
  398. ;
  399. ;WRITE 128 BYTE BUFFER
  400. ;
  401. WB    LXI    D,BUFF
  402.     MVI    C,DMAADD
  403.     CALL    BDOS
  404.     LXI    D,FCB
  405.     MVI    C,WRITER
  406.     CALL    BDOS
  407.     ORA    A
  408.     JNZ    RWERR
  409.     RET
  410. ;
  411. ;SCAN FOR BLANKS IN COMMAND LINE
  412. ;
  413. SCBLK    INX    H
  414.     MOV    A,M
  415.     CPI    0        ;CHECK IF END OF INPUT LINE
  416.     JZ    NOFLNM
  417.     CPI    ' '
  418.     RET
  419. ;
  420. ;PROCESS LF AND TAB FILL, GET BYTE FROM READ BUFFER
  421. ;
  422. RB    LDA    TXTFLG
  423.     CPI    2
  424.     JNZ    RBFB        ;NOT .TEXT
  425. RCCKLF    LDA    NLF        ;NEED LF?
  426.     ORA    A
  427.     JZ    RBCKTB
  428.     XRA    A
  429.     STA    NLF
  430.     MVI    A,LF
  431.     RET
  432. ;
  433. RBCKTB    LDA    NTB        ;NEED TAB?
  434.     ORA    A
  435.     JZ    RBFB
  436.     DCR    A
  437.     STA    NTB
  438.     MVI    A,' '
  439.     RET
  440. ;
  441. ;GET BYTE FROM READ BUFFER, AND FILL IF NEEDED
  442. ;
  443. RBFB    LHLD    BUFADD
  444.     LXI    D,BLKBUF+512
  445.     CALL    EQUAL        ;CHECK FOR END OF BUFFER
  446.     JZ    RBLK
  447.     LDA    TXTFLG
  448.     CPI    2        ;.TEXT?
  449.     JNZ    NOTEXT2
  450.     LDA    DFLAG        ;WAS LAST CHAR DLE?
  451.     ORA    A
  452.     JNZ    RBFBT        ;YES
  453.     MOV    A,M
  454.     ORA    A
  455.     INX    H
  456.     SHLD    BUFADD
  457.     JZ    RBFB        ;SKIP BYTE OF ZERO
  458.     CPI    CR
  459.     JNZ    CKDLE
  460.     STA    NLF        ;PUT LF AFTER CR
  461.     RET
  462. ;PROCESS BYTE FOLLOWING DLE
  463. ;
  464. RBFBT    MOV    A,M
  465.     INX    H
  466.     SHLD    BUFADD
  467.     SUI    32        ;GET INDENTATION
  468.     STA    NTB        ;SAVE NUMBER OF COLUMNS TO INDENT
  469.     XRA    A
  470.     STA    DFLAG        ;CLEAR TAB FLAG
  471.     JMP    RBCKTB        ;DO BLANK EXPANSION
  472. ;
  473. ;CHECK FOR DLE CODE - USED FOR INDENTATION
  474. ;
  475. CKDLE    CPI    DLE
  476.     RNZ
  477.     STA    DFLAG        ;SET FLAG FOR DLE FOUND
  478.     JMP    RBFB        ;GET NEXT BYTE (COUNT)
  479. ;
  480. NOTEXT2    MOV    A,M
  481.     INX    H
  482.     SHLD    BUFADD
  483.     RET
  484. ;
  485. ;READ 4 SECTORS (A PASCAL BLOCK)
  486. ;
  487. RBLK    LHLD    LSN        ;GET START LOGICAL SECTOR NUMBER
  488.     XCHG
  489.     LHLD    LSTLSN
  490.     CALL    EQUAL
  491.     JZ    SETEOF        ;FOUND LAST SECTOR
  492.     LDA    RDRIVE        ;GET READ DRIVE NUMBER
  493.     MOV    E,A
  494.     MVI    C,SELECTD    ;SELECT DISK
  495.     CALL    BDOS
  496.     LXI    D,BLKBUF    ;READ 4 SECTORS
  497.     CALL    RDSEC
  498.     LXI    D,BLKBUF+128
  499.     CALL    RDSEC
  500.     LXI    D,BLKBUF+256
  501.     CALL    RDSEC
  502.     LXI    D,BLKBUF+384
  503.     CALL    RDSEC
  504.     LXI    H,BLKBUF
  505.     SHLD    BUFADD        ;RESET POINTER TO START OF BUFFER
  506.     JMP    RBFB
  507. ;
  508. SETEOF    LXI    H,EOFFLAG
  509.     MVI    M,1        ;LAST SECTOR ALREADY READ
  510.     RET
  511. ;
  512. ;ERROR MESSAGES
  513. ;
  514. NOFLNM    LXI    D,NOFLNMSG
  515.     JMP    GENERR
  516. ;
  517. NOFILE    LXI    D,NOFMSG
  518.     JMP    GENERR
  519. ;
  520. RWERR    ORI    '0'        ;MAKE IT ASCII
  521.     STA    WERMSG
  522.     LXI    D,WERMSG
  523. GENERR    MVI    C,WRITECB
  524.     CALL    BDOS
  525.     JMP    EXIT
  526. ;
  527. CERROR    LXI    D,ERRMSG
  528.     ORI    '0'
  529.     STA    ERRMSG
  530.     JMP    GENERR
  531. ;
  532. DRVERR    LXI    D,DERMSG
  533.     JMP    GENERR
  534. ;
  535. ;TURN LSN INTO TRACK/SECTOR
  536. ;
  537. ;NOTE - TRACK 0 IS NOT USED, SO BLOCK 0 IS AT TRACK 1 SECTOR 1
  538. ;
  539. ;ON ENTRY - REG-HL HAS LOGICAL BLOCK # * 4 = LOGICAL SECTOR #
  540. ;ON EXIT - REG-H HAS PHYSICAL TRACK
  541. ;       REG-L HAS PHYSICAL SECTOR
  542. ;
  543. MAP    PUSH    B
  544.     PUSH    D
  545.     CALL    DIV26
  546.     MOV    A,L
  547.     ADD    A
  548.     MOV    B,A
  549.     MVI    A,12
  550.     CMP    L
  551.     JNC    MAPC
  552.     INR    B
  553. MAPC    MOV    C,E
  554.     XRA    A
  555.     MOV    D,A
  556.     MOV    H,A
  557.     MOV    L,B
  558.     MVI    A,6
  559. MAP$LOOP:
  560.     DAD    D
  561.     DCR    A
  562.     JNZ    MAP$LOOP
  563.     PUSH    B
  564.     CALL    DIV26
  565.     POP    B
  566.     INR    L
  567.     MOV    H,C
  568.     INR    H
  569.     POP    D
  570.     POP    B
  571.     RET
  572. ;
  573. ;
  574. DIV26    LXI    B,-26
  575.     MVI    E,0FFH
  576. DIVL    INR    E
  577.     DAD    B
  578.     MOV    A,H
  579.     ORA    A
  580.     JP    DIVL
  581.     LXI    B,26
  582.     DAD    B
  583.     RET
  584. ;
  585. ;
  586. ;
  587. ;BIOS ENTRIES
  588. ;
  589. SETTRK    LHLD    1
  590.     MVI    L,1EH
  591.     PCHL
  592. ;
  593. SETSEC    LHLD    1
  594.     MVI    L,21H
  595.     PCHL
  596. ;
  597. SETDMA    LHLD    1
  598.     MVI    L,24H
  599.     PCHL
  600. ;
  601. READ    LHLD    1
  602.     MVI    L,27H
  603.     PCHL
  604. ;
  605. NOFLNMSG    DB    CR,LF,'ERROR - Missing file name$'
  606. NOFMSG        DB    CR,LF,'"Pascal" file does not exist$'
  607. WERMSG        DB    '  Read/Write ERROR$'
  608. PERMSG        DB    CR,LF,'"CP/M" file already exists.'
  609.         DB    CR,LF,'C/R to continue, CTRL-C to abort$'
  610. ERRMSG        DB    '  ERROR in file Create or Open$'
  611. TEXT        DB    CR,LF,'.TEXT file being processed$'
  612. CODE        DB    CR,LF,'.CODE file being processed$'
  613. DERMSG        DB    CR,LF,'ERROR - Both files on same drive$'
  614. ;
  615. ;
  616. TXTFLG    DB    0
  617. DENTP    DS    2
  618. EOFFLAG    DB    0
  619. NLF    DB    0
  620. NTB    DB    0
  621. DFLAG    DB    0
  622. BUFADD    DS    2
  623. LSN    DS    2
  624. LSTLSN    DS    2
  625. BOL    DS    2
  626. EOB    DS    2
  627. SYSTLE    DS    22
  628. RDRIVE    DS    1        ;DRIVE FOR READ
  629. LDRIVE    DS    1        ;LOGGED DRIVE ON ENTRY
  630. ;
  631.     DS    64        ;STACK AREA
  632. STACK    DS    2        ;ENTRY SP
  633. BLKBUF    DS    512
  634. DIRTOP    DS    2048
  635. ;
  636. ;
  637. ;CP/M EQUATES
  638. ;
  639. BDOS    EQU    5
  640. FCB    EQU    5CH
  641. BUFF    EQU    80H
  642. READC    EQU    1        ;READ CONSOLE CHARACTER
  643. WRITEC    EQU    2        ;WRITE CONSOLE CHARACTER
  644. WRITECB    EQU    9        ;WRITE CONSOLE BUFFER
  645. SELECTD    EQU    14        ;SELECT DRIVE
  646. OPENF    EQU    15        ;OPEN FILE
  647. CLOSEF    EQU    16        ;CLOSE FILE
  648. DELETEF    EQU    19        ;DELETE FILE
  649. WRITER    EQU    21        ;WRITE RECORD
  650. CREATEF    EQU    22        ;CREATE FILE
  651. LOGGED    EQU    25        ;GET LOGGED DRIVE
  652. DMAADD    EQU    26        ;SET DMA ADDRESS
  653. ;
  654. CR    EQU    0DH
  655. LF    EQU    0AH
  656. ABORT    EQU    3        ;CRTL-C
  657. EOF    EQU    1AH
  658. ;
  659.     END    START
  660.