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 / SIMTEL / CPMUG / CPMUG036.ARK / COMBINE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  388 lines

  1.     title    'COMBINE.ASM    12/20/79'
  2.     page    0
  3.  
  4. ;12/10/78 BY Ward Christensen
  5. ;Modified by Bob Van Valzah & Steve Ness on 1/9/78 to allow
  6. ;source files on any drive and remove comments preceded by blanks.
  7. ;
  8. ;Modified by Steve Ness on 12/20/79 to allow filetypes on source files.
  9. ;
  10. ;Used to combine multiple small programs into one large assembly file.
  11. ;
  12. ;command format:
  13. ;
  14. ;    COMBINE output=input1,input2....
  15. ;
  16. ;The input files may have a: or b: specified.
  17. ;The output file may have A: or B: specified.
  18.  
  19. TEST    EQU    0
  20. K    EQU    1024    ;1K
  21. BLKSIZE    EQU    12*K    ;OUTPUT FILE BLOCKSIZE
  22. ;
  23. ;(FROM EQU7.LIB...)
  24. MF    SET    0    ;SHOW MOVE NOT REQUESTED
  25. CF    SET    0    ;SHOW COMP NOT REQUESTED
  26. ;
  27. ;DEFINE SOME MACROS TO MAKE THINGS EASIER
  28. ;
  29. ;DEFINE DATA MOVE MACRO
  30. ;
  31. MOVE    MACRO    ?F,?T,?L,?I
  32.     IF    NOT NUL ?F
  33.     LXI    H,?F
  34.     ENDIF
  35.     IF    NOT NUL ?T
  36.     LXI    D,?T
  37.     ENDIF
  38.     IF    NOT NUL ?L
  39.     LXI    B,?L
  40.     ENDIF
  41.     IF    NOT NUL ?I
  42.     LOCAL    ?B,?Z
  43.     CALL    ?Z
  44. ?B    DB    ?I
  45. ?Z    POP    H    ;GET TO
  46.     LXI    B,?Z-?B
  47.     ENDIF
  48.     CALL    MOVER
  49. MF    SET    -1    ;;SHOW EXPANSION
  50.     ENDM
  51. ;COMPARE MACRO
  52. COMP    MACRO    ?F,?T,?L,?I
  53.     IF    NOT NUL ?F
  54.     LXI    H,?F
  55.     ENDIF
  56.     IF    NOT NUL ?T
  57.     LXI    D,?T
  58.     ENDIF
  59.     IF    NOT NUL ?L
  60.     LXI    B,?L
  61.     ENDIF
  62.     IF    NOT NUL ?I
  63.     LOCAL    ?B,?Z
  64.     CALL    ?Z
  65. ?B    DB    ?I
  66. ?Z    POP    D    ;GET TO
  67.     LXI    B,?Z-?B
  68.     ENDIF
  69.     CALL    COMPR
  70. CF    SET    -1    ;;SHOW EXPANSION
  71.     ENDM
  72. ;
  73. ;DEFINE CP/M MACRO - CPM FNC,PARM
  74. ;
  75. CPM    MACRO    ?F,?P
  76.     PUSH    B
  77.     PUSH    D
  78.     PUSH    H
  79.     IF    NOT NUL ?F
  80.     MVI    C,?F
  81.     ENDIF
  82.     IF    NOT NUL ?P
  83.     LXI    D,?P
  84.     ENDIF
  85.     CALL    BDOS
  86.     POP    H
  87.     POP    D
  88.     POP    B
  89.     ENDM
  90. ;
  91.     ORG    100H
  92. ;INIT LOCAL STACK
  93. ;
  94.     LXI    H,0
  95.     DAD    SP
  96.     SHLD    STACK
  97.     LXI    SP,STACK
  98. ;
  99. ;START OF PROGRAM EXECUTION
  100. ;
  101. ;MOVE THE COMMAND BUFFER
  102.     MOVE    80H,HOLD,80H ;FROM,TO,LENGTH
  103. ;ERASE THE OUTPUT FILE
  104.     IF    NOT TEST
  105.     CPM    ERASE,FCB
  106.     CPM    MAKE,FCB
  107.     INR    A
  108.     JZ    NOROOM
  109.     ENDIF
  110. ;POSITION TO FIRST NAME TO COPY (FOLLOWS =)
  111.     LXI    H,HOLD
  112. SKIPEQ    INX    H
  113.     MOV    A,M
  114.     CPI    '='
  115.     JNZ    SKIPEQ
  116.     SHLD    NAMEADD    ;SAVE POINTER
  117.     CALL    NEXTFL    ;PRIME THINGS
  118. LOOP    CALL    WRBYTE
  119.     CALL    RDBYTE
  120.     JNC    LOOP
  121. ;DONE -
  122.     MVI    A,1AH
  123.     CALL    WRBYTE
  124.     LHLD    WRCOUNT
  125.     LXI    D,128
  126.     DAD    D    ;FORCE LAST SECTOR
  127.     SHLD    WRCOUNT    ;..WRITE
  128.     CALL    WRBUFS    ;WRITE THE BUFFER
  129.     CPM    CLOSE,FCB
  130.     INR    A
  131.     JNZ    EXIT
  132.     CALL    ERXIT
  133.     DB    '++CLOSE ERROR++$'
  134. ;
  135. ;WRITE BYTE TO OUTPUT FILE
  136. ;
  137. WRBYTE    LHLD    WRBUFAD
  138.     MOV    M,A
  139.     INX    H
  140.     SHLD    WRBUFAD
  141. ;BUMP COUNT
  142.     LHLD    WRCOUNT
  143.     INX    H
  144.     SHLD    WRCOUNT
  145. ;SEE IF TIME TO WRITE BUFFER
  146.     DAD    H    ;H=# SECTORS
  147.     MOV    A,H
  148.     CPI    BLKSIZE/128
  149.     RNZ
  150. ;TIME TO WRITE THE OUTPUT BUFFER
  151. ;
  152. WRBUFS    LXI    H,WRBUFF
  153.     SHLD    WRBUFAD
  154.     XCHG
  155.     LHLD    WRCOUNT
  156.     DAD    H    ;H=# SECTORS
  157.     MOV    B,H    ;SAVE SECTOR COUNT
  158.     MOV    A,B
  159.     ORA    A    ;0 SECTORS? (POSS AT EOF)
  160.     JNZ    WRBFLP
  161.     INR    B    ;FUDGE IN PARTIAL SECTOR
  162. WRBFLP    CPM    SETDMA
  163.     CPM    WRITE,FCB
  164.     ORA    A
  165.     JNZ    WRERR
  166.     LXI    H,80H
  167.     DAD    D
  168.     XCHG
  169.     DCR    B
  170.     JNZ    WRBFLP
  171.     LXI    H,0
  172.     SHLD    WRCOUNT
  173.     RET
  174. ;
  175. WRERR    CALL    ERXIT
  176.     DB    '++WRITE ERROR++$'
  177. ;
  178. ;READ BYTE FROM INPUT FILE
  179. ;
  180. RDBYTE    LHLD    RDBUFAD
  181.     LDA    RDCOUNT    ;GET CHAR COUNT
  182.     ORA    A    ;TIME TO READ?
  183.     JP    NOREAD
  184. ;HAVE TO READ
  185.     CPM    SETDMA,RDBUFF
  186.     CPM    READ,RDFCB
  187.     ORA    A
  188.     JNZ    RDERR
  189.     CPM    SETDMA,80H
  190.     LXI    H,RDBUFF
  191.     MVI    A,0
  192. NOREAD    INR    A
  193.     STA    RDCOUNT    ;SAVE CHAR COUNT
  194. ;CHECK FOR NEW LINE OR TAB, TO DELETE COMMENTS
  195.     LDA    PREV
  196.     CPI    9
  197.     JZ    TESTCOM
  198.     CPI    ' '
  199.     JZ    TESTCOM
  200.     CPI    0AH    ;LF?
  201.     JZ    TESTCM1
  202. NOCOM    MOV    A,M    ;GET CHAR
  203.     INX    H
  204.     SHLD    RDBUFAD
  205.     CPI    'Z'-40H    ;EOF?
  206.     JZ    NEXTFL
  207.     STA    PREV    ;SAVE FOR COMMENTS TEST
  208.     ORA    A    ;CARRY OFF SHOWN NOT EOF
  209.     RET
  210. ;
  211. ;TEST FOR COMMENT
  212. TESTCOM    MOV    A,M
  213.     CPI    ';'
  214.     JNZ    NOCOM
  215. ;GOT COMMENT, SKIP IT
  216.     STA    PREV
  217.     INX    H
  218.     SHLD    RDBUFAD
  219. SKIPCOM    CALL    RDBYTE
  220.     CPI    0DH
  221.     JNZ    SKIPCOM
  222.     STA    PREV
  223.     RET
  224. TESTCM1    MOV    A,M
  225.     CPI    ';'
  226.     JNZ    NOCOM
  227.     STA    PREV
  228.     INX    H
  229.     SHLD    RDBUFAD
  230. ;DELETE ENTIRE LINE
  231. DELINE    CALL    RDBYTE
  232.     CPI    0AH
  233.     JNZ    DELINE
  234.     JMP    RDBYTE    ;GET, RET NEXT CHAR
  235. ;GOT EOF - GET NEXT FILE
  236. RDERR    CALL    ERXIT
  237.     DB    '++READ ERROR++$'
  238. NEXTFL    LHLD    NAMEADD    ;GET NAME POINTER
  239.     MOV    A,M    ;GET DELIMITER
  240.     ORA    A
  241.     STC
  242.     RZ        ;RET IF ALL DONE
  243.     INX    H    ;SKIP DELIMITER
  244.     LXI    D,RDFCB ;POINT TO NAME
  245.     xra    a    ;prepare to use default drive
  246.     stax    d
  247.     inx    d
  248.     PUSH    D
  249. ;BLANK THE FCB
  250.     MVI    A,' '
  251.     MVI    B,11
  252. BLANK    STAX    D
  253.     INX    D
  254.     DCR    B
  255.     JNZ    BLANK
  256.     POP    D
  257.     inx    h    ;look ahead for colon, indicating drive
  258.     mov    a,m
  259.     dcx    h    ;backup j.i.c. not there
  260.     cpi    ':'    ;was a drive specified?
  261.     jnz    moven    ;nope - just scan off file name
  262.     mov    a,m    ;yup - insert drive name into fcb
  263.     sui    'A'-1
  264.     sta    rdfcb
  265.     inx    h    ;move source pointer over drive spec.
  266.     inx    h
  267. MOVEN    MOV    A,M
  268.     CPI    ','
  269.     JZ    MOVED
  270.     cpi    '.'
  271.     jz    movft
  272.     ORA    A    ;ZERO @ END?
  273.     JZ    MOVED
  274.     STAX    D
  275.     INX    H
  276.     INX    D
  277.     JMP    MOVEN
  278. movft    inx    h
  279.     lxi    d,rdfcb+9    ;address filetype of read block
  280.     jmp    moven
  281. ;ALL DONE MOVING
  282. MOVED    SHLD    NAMEADD    ;SAVE NAME LIST ADDR
  283.     XRA    A
  284.     STA    RDEXT    ;ZERO EXTENT
  285.     STA    RDRNO    ;ZERO RECORD #
  286.     CPM    SETDMA,RDBUFF
  287.     CPM    OPEN,RDFCB
  288.     INR    A
  289.     JZ    OPENERR
  290.     MVI    A,80H    ;SHOW TIME TO READ
  291.     STA    RDCOUNT
  292.     CPM    SETDMA,80H
  293.     JMP    RDBYTE
  294. OPENERR    LXI    H,RDFCB+1
  295.     MVI    B,11
  296. NAMELP    MOV    A,M
  297.     CALL    TYPE
  298.     INX    H
  299.     DCR    B
  300.     JNZ    NAMELP
  301.     CALL    ERXIT
  302.     DB    ': ++OPEN FAILED++$'
  303. NOROOM    CALL    ERXIT
  304.     DB    '++NO ROOM ON OUTPUT DISK$'
  305. ;
  306. TYPE    MOV    E,A
  307.     CPM    WRCON
  308.     RET
  309. ;
  310. ;FOLLOWING FROM 'EQU7.LIB'---->
  311. ;
  312. ;MOVE, COMPARE SUBROUTINES
  313. ;
  314.     IF    MF    ;MACRO EXPANSION FLAG SET?
  315. MOVER    MOV    A,M
  316.     STAX    D
  317.     INX    H
  318.     INX    D
  319.     DCX    B
  320.     MOV    A,B
  321.     ORA    C
  322.     JNZ    MOVER
  323.     RET
  324.     ENDIF
  325. ;
  326. ;
  327.     IF    CF    ;MACRO EXPANSION FLAG SET?
  328. COMPR    LDAX    D
  329.     CMP    M
  330.     RNZ
  331.     INX    D
  332.     INX    H
  333.     DCX    B
  334.     MOV    A,B
  335.     ORA    C
  336.     JNZ    COMPR
  337.     RET
  338.     ENDIF
  339. ;EXIT WITH ERROR MESSAGE
  340. MSGEXIT    EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  341. ERXIT    POP    D    ;GET MSG
  342.     MVI    C,PRINT
  343.     CALL    BDOS
  344. ;EXIT, RESTORING STACK AND RETURN
  345. EXIT    LHLD    STACK
  346.     SPHL
  347.     RET        ;TO CCP
  348. PREV    DB    0AH    ;PREV CHAR FOR COMMENTS TEST
  349. WRBUFAD    DW    WRBUFF    ;OUTPUT BUFFER ADDR
  350. WRCOUNT    DW    0    ;BYTE COUNTER
  351. RDBUFAD    DW    RDBUFF
  352. RDDRV    DB    0    ;DRIVE NAME TO READ FROM
  353. RDFCB    DB    0,'           '
  354. RDEXT    DB    0
  355.     DS    19
  356. RDRNO    DB    0
  357. RDCOUNT    DB    80H    ;CHARACTER COUNT IN BUFF
  358.     DS    40H    ;STACK AREA
  359. STACK    DS    2
  360. ;POINTER TO LIST OF FILENAMES
  361. NAMEADD    DS    2
  362. ;COPY OF INPUT COMMAND BUFFER (FROM 80H)
  363. HOLD    DS    128
  364. ;OUTPUT DISK BUFFER
  365.     ORG    ($+255) AND 0FF00H ;TO PAGE
  366. RDBUFF    DS    128
  367. WRBUFF    DS    BLKSIZE
  368. ;BDOS/CBIOS EQUATES (VERSION 7)    
  369. RDCON    EQU    1
  370. WRCON    EQU    2
  371. PRINT    EQU    9
  372. CONST    EQU    11
  373. OPEN    EQU    15
  374. CLOSE    EQU    16
  375. SRCHF    EQU    17
  376. SRCHN    EQU    18
  377. ERASE    EQU    19
  378. READ    EQU    20
  379. WRITE    EQU    21
  380. MAKE    EQU    22
  381. REN    EQU    23
  382. SETDMA    EQU    26
  383. BDOS    EQU    5
  384. FCB    EQU    5CH 
  385. FCB2    EQU    6CH
  386. FCBEXT    EQU    FCB+12
  387. FCBRNO    EQU    FCB+32
  388.