home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / A / CONCAT11.LBR / CONCAT11.ZZ0 / CONCAT11.Z80
Text File  |  2000-06-30  |  8KB  |  543 lines

  1. ;FILE CONCATENATION UTILITY V1.1
  2. ;
  3. ;Guy Cousineau
  4. ;1059 Hindley Street
  5. ;OTTAWA Canada
  6. ;K2B 5L9    Ottawa RCPM (613) 952-2289
  7. ;
  8. ;SYNTAX:    CONCAT [du:]ufn=[du:]ufn1[,[du:]ufn2,[du:]ufn3...]
  9. ;
  10. ;        The '=' must be supplied along with at least
  11. ;        One source file name
  12. ;        WARNING!! all file read abort on ^Z
  13. ;              not for use on OBJECT files
  14. ;
  15. ;1990-02-03    V1.1        Fixed exit user bug
  16. ;
  17. ;1990-01-??    unnumbered    First release
  18. ;
  19.     MACLIB    DOSCALLS
  20. ;
  21. MAXUSER    EQU    16
  22. MAXDSK EQU    'P'+1
  23. ;
  24. START:
  25.     LD    (OLDSP),SP
  26.     LD    SP,STACK
  27. ;
  28.     LD    A,(PRET)
  29.     LD    (START),A    ;disable GO
  30.     LD    DE,HELLO
  31.     CALL    PRINTS
  32.     LD    C,GETDSK
  33.     CALL    BDOS
  34.     LD    (CDRIVE),A
  35.     LD    C,SGTUSR
  36.     LD    E,0FFH
  37.     CALL    BDOS
  38.     LD    (CUSER),A
  39. ;
  40.     LD    DE,COMMAND
  41.     LD    HL,DMA
  42.     LD    BC,82H
  43.     LDIR            ;save user command line
  44.     LD    HL,COMMAND
  45.     LD    A,(HL)
  46.     OR    A
  47.     JR    NZ,GOTINPUT
  48. SYNERR:
  49.     LD    DE,SYNTAX
  50.     JP    PRTERR
  51. ;
  52. ;get destination file name
  53. ;
  54. GOTINPUT:
  55.     INC    HL
  56.     LD    (NXTCHR),HL
  57.     CALL    SETWRF
  58.     LD    (DSTUSR),A    ;save destination user
  59.     LD    HL,(NXTCHR)
  60.     LD    A,(HL)
  61.     CP    '='
  62.     JR    NZ,SYNERR
  63.     INC    HL
  64.     LD    A,(HL)
  65.     OR    A
  66.     JR    Z,SYNERR    ;no second file name
  67.     LD    DE,CFCB+1
  68.     LD    A,(DE)
  69.     CP    ' '
  70.     JR    Z,SYNERR
  71.     PUSH    DE        ;save FCB+1
  72.     CALL    SETDSTUSR
  73.     POP    DE
  74.     PUSH    DE        ;adjust to FCB
  75.     DEC    DE
  76.     CALL    MAKEFILE    ;destination file
  77.     POP    DE        ;get FCB+1 back
  78.     CALL    PRINTF
  79.     LD    DE,EQUAL
  80.     CALL    PRINTS
  81.     JR    SKIPPLUS
  82. ;
  83. ;check for source file name(s)
  84. ;
  85. READMORE:
  86.     LD    DE,PLUS
  87.     CALL    PRINTS
  88. SKIPPLUS:
  89.     CALL    SETWRF        ;Decode a source file
  90.     LD    (SRCUSR),A
  91.     LD    DE,CFCB+1
  92.     LD    A,(DE)
  93.     CP    ' '
  94.     JR    Z,CLOSEFILE
  95.     CALL    PRINTF
  96.     LD    DE,CFCB
  97.     CALL    CREAD
  98.     JR    READMORE
  99. CLOSEFILE:
  100.     LD    DE,BACKSPACE
  101.     CALL    PRINTS
  102.     XOR    A
  103.     LD    (CHECKPATCH),A    ;Fix PUT_CHR to abort on EOF
  104.     LD    BC,401H
  105. ZFILL:
  106.     PUSH    BC
  107.     LD    A,EOF
  108.     CALL    PUT_CHR
  109.     POP    BC
  110.     DEC    BC
  111.     LD    A,B
  112.     OR    C
  113.     JR    NZ,ZFILL    ;^Z to end of K
  114. ;
  115. CLOSE1:
  116.     LD    DE,DFCB
  117.     LD    C,CLOSEF
  118.     CALL    BDOS
  119.     INC    A
  120.     JR    NZ,GETBACK
  121.     LD    DE,BADCLOSE
  122.     JP    PRTERR
  123. GETBACK:
  124.     LD    E,0
  125. CUSER    EQU    $-1
  126.     LD    C,SGTUSR
  127.     CALL    BDOS
  128.     LD    E,0
  129. CDRIVE    EQU    $-1
  130.     LD    C,SETDSK
  131.     CALL    BDOS
  132.     LD    SP,(OLDSP)
  133. PRET:    RET
  134. ;
  135. ;********************************************************************
  136. ;*
  137. ;*    SUBROUTINE AREA
  138. ;*
  139. ;********************************************************************
  140. ;
  141. ;look for a source file
  142. ;
  143. CREAD:
  144.     LD    A,0FFH
  145.     LD    (IN_POS),A    ;force read on first pass
  146.     CALL    OPENFCB
  147.     JP    Z,NFERR        ;not found
  148. COPYLOOP:
  149.     CALL    GET_CHR
  150.     RET    Z        ;was EOF
  151.     CALL    PUT_CHR
  152.     JR    COPYLOOP
  153. ;
  154. ;get character from CFCB file
  155. ;
  156. GET_CHR:
  157.     LD    A,0
  158. IN_POS    EQU    $-1
  159.     CP    80H
  160.     JR    C,GET_CHR1    ;still in buffer
  161.     CALL    SETSRCUSR
  162.     LD    DE,INBUFFER
  163.     LD    C,SETDMA
  164.     CALL    BDOS
  165.     LD    DE,CFCB
  166.     LD    C,RDSEQ
  167.     CALL    BDOS
  168.     OR    A
  169.     JR    NZ,BAD_READ
  170. GET_CHR1:
  171.     LD    HL,INBUFFER
  172.     CALL    ADDAHL
  173.     INC    A
  174.     LD    (IN_POS),A
  175.     LD    A,(HL)
  176.     CP    EOF
  177.     RET
  178. ;
  179. ;write character to DFCB file
  180. ;take advantage of buffering (1K)
  181. ;
  182. PUT_CHR:
  183.     PUSH    AF        ;save character
  184.     LD    HL,OUTBUFFER
  185. OUT_POS    EQU    $-2
  186.     PUSH    HL
  187.     LD    BC,OUTBUFFER+400H
  188.     OR    A
  189.     SBC    HL,BC
  190.     POP    HL
  191.     JR    C,PUT_CHR1    ;still in buffer
  192.     CALL    SETDSTUSR
  193.     LD    B,8
  194.     LD    DE,OUTBUFFER    ;start at buffer top
  195. WRTLOOP:
  196.     PUSH    BC
  197.     PUSH    DE
  198.     LD    C,SETDMA
  199.     CALL    BDOS
  200.     LD    C,WRTSEQ
  201.     LD    DE,DFCB
  202.     CALL    BDOS
  203.     OR    A
  204.     JR    NZ,BAD_WRITE
  205.     POP    HL
  206.     LD    DE,80H
  207.     ADD    HL,DE
  208.     PUSH    HL
  209.     POP    DE        ;new buffer
  210.     JR    NOCHECK
  211. CHECKPATCH EQU    $-1
  212.     DEC    HL        ;check last record
  213.     LD    A,(HL)
  214.     CP    EOF        ;have we written enough?
  215.     JP    Z,CLOSE1
  216. NOCHECK:
  217.     POP    BC
  218.     DJNZ    WRTLOOP
  219.     LD    HL,OUTBUFFER
  220. PUT_CHR1:
  221.     POP    AF        ;get out character back
  222.     LD    (HL),A
  223.     INC    HL
  224.     LD    (OUT_POS),HL
  225.     RET
  226. ;
  227. ;assorted errors
  228. ;
  229. BAD_READ:
  230.     LD    DE,READERR
  231.     JR    PRTERR
  232. BAD_WRITE:
  233.     LD    DE,WRTERR
  234.     JR    PRTERR
  235. NFERR:
  236.     LD    DE,NOTFND
  237.     JR    PRTERR
  238. ERR3:    LD    DE,SYNMSG
  239.     JR    PRTERR
  240. ;
  241. MAKEFILE:
  242.     LD    C,DELF
  243.     CALL    DOS
  244.     LD    C,MAKEF
  245.     CALL    DOS
  246.     JR    Z,ERR4
  247.     LD    DE,DFCB
  248.     LD    HL,CFCB
  249.     LD    BC,36
  250.     LDIR            ;copy FCB to dest FCB
  251.     RET
  252. ;
  253. ERR4:    LD    DE,DSKERR    
  254. ;
  255. ;print error message
  256. ;
  257. PRTERR: PUSH    DE
  258.     CALL    CRLF
  259.     POP    DE
  260.     CALL    PRINTS
  261.     JP    GETBACK
  262. ;
  263. ;****************************************************
  264. ;
  265. ;CHARACTER I/O ROUTINES
  266. ;
  267. ;****************************************************
  268. ;
  269. CRLF:
  270.     LD    DE,CRLFMSG
  271.     CALL    PRINTS
  272.     RET
  273. ;
  274. ;print file name in DE
  275. ;
  276. PRINTF:
  277.     PUSH    BC
  278.     PUSH    HL
  279.     PUSH    DE
  280.     EX    DE,HL
  281.     LD    B,8
  282.     CALL    PRINTB
  283.     LD    E,'.'
  284.     LD    C,CONOUT
  285.     PUSH    HL
  286.     CALL    BDOS
  287.     POP    HL
  288.     LD    B,3
  289.     CALL    PRINTB
  290.     POP    DE
  291.     POP    HL
  292.     POP    BC
  293.     RET
  294. PRINTB:
  295.     LD    C,CONOUT
  296. PRINTB1:
  297.     LD    A,(HL)
  298.     CP    ' '
  299.     JR    Z,SKIPSPC
  300.     LD    E,A
  301.     PUSH    BC
  302.     PUSH    HL
  303.     CALL    BDOS
  304.     POP    HL
  305.     POP    BC
  306. SKIPSPC:
  307.     INC    HL
  308.     DJNZ    PRINTB1
  309.     RET
  310. ;
  311. ;print string in DE
  312. ;
  313. PRINTS:
  314.     LD    C,PRTSTR
  315.     CALL    BDOS
  316.     RET
  317. ;
  318. ;**********************************************
  319. ;
  320. ;PARSING ROUTINES
  321. ;
  322. ;**********************************************
  323. ;
  324. ;Decode a decimal number from the command line
  325. ;On return, the number is in HL.
  326. ;
  327. DECODE:    EX    DE,HL
  328.     LD    HL,0
  329. DECOD1:    LD    A,(DE)
  330.     CALL    CHECK
  331.     LD    (NXTCHR),DE
  332.     RET    Z
  333.     INC    DE
  334.     SUB    '0'        ;make binary from ascii.
  335.     JP    C,ERR3    
  336.     CP    10
  337.     JP    NC,ERR3
  338.     LD    B,H
  339.     LD    C,L
  340.     ADD    HL,HL        ;x2
  341.     ADD    HL,HL        ;x4
  342.     ADD    HL,BC        ;x5
  343.     ADD    HL,HL        ;x10
  344.     CALL    ADDAHL
  345.     JR    DECOD1
  346. ;
  347. ADDAHL:
  348.     PUSH    BC
  349.     LD    B,0
  350.     LD    C,A
  351.     ADD    HL,BC
  352.     POP    BC
  353.     RET
  354. ;
  355. CHECK:    PUSH    BC
  356.     PUSH    HL
  357.     LD    HL,SEPR
  358.     LD    BC,9
  359.     CPIR
  360.     POP    HL
  361.     POP    BC
  362.     RET            ;to caller
  363. SEPR:    DB    0,' =,.:;<>'
  364. ;
  365. OPENFCB:
  366.     LD    C,OPENF
  367. ;
  368.     LD    DE,CFCB    
  369. DOS:    PUSH    DE
  370.     CALL    BDOS
  371.     CP    0FFH
  372.     POP    DE
  373.     RET    
  374. ;
  375. ;set user number
  376. ;
  377. SETSRCUSR:
  378.     LD    A,0
  379. SRCUSR    EQU    $-1
  380.     JR    GETSETUC
  381. SETDSTUSR:
  382.     LD    A,0
  383. DSTUSR    EQU    $-1
  384. ;
  385. ;get/set user number
  386. ;
  387. GETSETUC: LD    E,A
  388.     LD    C,SGTUSR
  389.     JR    DOS 
  390. ;
  391. ;PARSE A FILE NAME FROM COMMAND LINE<
  392. ;
  393. SETWRF:    LD    HL,(NXTCHR)
  394.     LD    DE,CFCB
  395.     XOR    A
  396.     LD    (DE),A
  397.     LD    (QMCNT),A
  398.     LD    A,(CUSER)
  399.     LD    (TUSER),A
  400.     CALL    NONDELIM
  401.     LD    B,11
  402.     JR    Z,SETINC
  403.     PUSH    HL
  404.     CP    'A'
  405.     JR    C,SET1
  406.     CP    MAXDSK
  407.     JR    C,SET2
  408. SET1:    CP    '0'
  409.     JR    C,SET3
  410.     CP    '9'+1
  411.     JR    NC,SET3
  412. SET2:    INC    HL
  413.     LD    A,(HL)
  414.     JR    SET1    
  415. SET3:    POP    HL
  416.     CP    ':'
  417.     JR    NZ,SET7
  418.     LD    A,(HL)
  419.     SUB    'A'-1
  420.     JR    C,SET5
  421.     LD    (DE),A
  422.     INC    HL
  423.     LD    A,(HL)
  424.     CP    ':'
  425.     JR    Z,SET6
  426. SET5:    PUSH    DE
  427.     CALL    DECODE
  428.     LD    A,L
  429.     EX    DE,HL
  430.     POP    DE
  431.     CP    MAXUSER
  432.     JP    NC,ERR3
  433.     LD    (TUSER),A
  434. SET6:    INC    HL
  435. SET7:    INC    DE
  436.     LD    B,8
  437.     CALL    SETPART
  438.     LD    B,3
  439.     LD    A,(HL)
  440.     CP    '.'
  441.     JR    NZ,SET8
  442.     INC    HL
  443.     CALL    SETPART    
  444.     JR    SET9
  445. SETINC:    INC    DE
  446. SET8:    CALL    SPACE
  447. SET9:    LD    B,4
  448.     XOR    A
  449.     LD    (CFCB+32),A
  450.     CALL    FILL
  451.     LD    (NXTCHR),HL
  452.     LD    A,0
  453. QMCNT    EQU    $-1
  454.     OR    A        ;check syntax
  455.     LD    A,0
  456. TUSER    EQU    $-1        ;get user just in case
  457.     RET    Z
  458.     LD    DE,NOWILD
  459.     JP    PRTERR    
  460. ;
  461. ;Check character at (DE) for legal command input. Note that the
  462. ;zero flag is set if the character is a delimiter.
  463. ;
  464. SETPART: LD    A,(HL)
  465.     CALL    CHECK
  466.     JR    Z,SPACE
  467.     CP    '*'
  468.     JR    NZ,SETPT1
  469.     LD    A,'?'
  470.     DEC    HL
  471. SETPT1:    CP    '?'
  472.     JR    NZ,SETPT2
  473.     PUSH    HL
  474.     LD    HL,QMCNT
  475.     INC    (HL)
  476.     POP    HL
  477. SETPT2:    LD    (DE),A
  478.     INC    DE    
  479.     INC    HL
  480.     DJNZ    SETPART
  481.     LD    A,(HL)
  482.     CP    '*'
  483.     RET    NZ
  484.     INC    HL
  485.     RET
  486. SPACE:    LD    A,' '
  487. FILL:    LD    (DE),A
  488.     INC    DE
  489.     DJNZ    FILL
  490.     RET
  491. NONDELIM: LD    HL,0
  492. NXTCHR    EQU    $-2
  493. NONDL1:    LD    A,(HL)
  494.     OR    A
  495.     RET    Z
  496.     CALL    CHECK
  497.     RET    NZ
  498.     INC    HL
  499.     JR    NONDL1
  500. ;
  501. ;********************************************************************
  502. ;*
  503. ;*    STACK AND DATA AREA
  504. ;*
  505. ;********************************************************************
  506. ;
  507. HELLO:    DB    LF,'File Concatenation Utility V1.0',CR,LF
  508.     DB    '       By  Guy Cousineau',CR,LF,LF,'$'
  509. SYNTAX:    DB    'SYNTAX:  concat [du:]ufn=[du:]ufn1,[[du:]ufn2,[du:]ufn3,...'
  510.     DB    CR,LF,'where the first file name is the destination file'
  511.     DB    CR,LF,'and all other names are source files',CR,LF,'$'
  512. DSKERR: DB    'I/O Error$'
  513. SYNMSG:    DB    'Bad Syntax$'
  514. NOWILD:    DB    'No Wild Cards Allowed$'
  515. NOTFND:    DB    'File Not Found$'
  516. READERR: DB    'Bad File Read$'
  517. WRTERR:    DB    'Bad File Write$'
  518. BADCLOSE: DB    'Cannot Close Target$'
  519. BACKSPACE: DB    BS,BS,BS,'  $'
  520. CRLFMSG: DB    CR,LF,'$'
  521. EQUAL:    DB    ' = $'
  522. PLUS:    DB    ' + $'
  523. COMMAND    DS    82H            ;copy command buffer here
  524. ;
  525. ;FCB for source files
  526. ;
  527. CFCB:    DB    0,0,0,0,0,0,0,0,0,0,0,0
  528.     DB    0,0,0,0,0,0,0,0,0,0,0,0
  529.     DB    0,0,0,0,0,0,0,0,0,0,0,0
  530. ;
  531. ;FCB for destination file
  532. ;
  533. DFCB:    DB    0,0,0,0,0,0,0,0,0,0,0,0
  534.     DB    0,0,0,0,0,0,0,0,0,0,0,0
  535.     DB    0,0,0,0,0,0,0,0,0,0,0,0
  536. ;
  537. OLDSP:    DS    2
  538.     DS    100H
  539. STACK:
  540. INBUFFER: DS    80H
  541. OUTBUFFER: DS    400H
  542.     END
  543.