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 / MBUG / MBUG039.ARC / BATCH.Z80 < prev    next >
Text File  |  1979-12-31  |  6KB  |  264 lines

  1. ;
  2. ;  **   BATCH version 2.1 **
  3. ;    A program to generate a $$$.SUB submit file
  4. ;     for immediate processing under CP/M 2.2.
  5. ;
  6. ;    Written by Robert Blum
  7. ;    Published in April '85 "Dr Dobbs Journal"
  8. ;
  9. ;--NOTES:
  10. ;    1) The $$$.SUB file is created on disk unit A
  11. ;          since the D. R. utility XSUB will only operate
  12. ;       on disk unit A.  If BATCH is run from disk B,
  13. ;       for example, the $$$.SUB file will be created
  14. ;       on disk unit A and then processed from disk A.
  15. ;       All files referenced in the submit file created
  16. ;       by BATCH must be on the disk unit from which
  17. ;       BATCH is being run includingg PIP and XSUB.
  18. ;
  19. ;    2) Use DDT to modify PIP as follows to solve the
  20. ;       null line PIP exit problem: change 053D from
  21. ;       2A to 23, 054E from FE to D6, 0550 from 00 to
  22. ;       02, and 051 from C2 to F2.  Exit DDT by entering
  23. ;       G0, and then do a SAVE 32 PIP.COM.  The modified
  24. ;       version of PIP outputs # as an input request
  25. ;       symbol and will exit on a null or single
  26. ;       character input line.
  27. ;
  28. ;    3) Input line must not exceed input buffer length
  29. ;       which is 132 characters.
  30. ;
  31. ;    4) Example of use of BATCH:
  32. ;        >BATCH<RET>
  33. ;        ->XSUB/PIP/B:=A:XDIR.COM/X/DIR A:/DIR B:<RET>
  34. ;
  35. ; ** PROGRAM DEFINITIONS **
  36. CR    EQU    0DH        ;CARRIAGE RETURN
  37. LF    EQU    0AH        ;LINE FEED
  38. BDOS    EQU    5        ;ADDR CP/M BDOS FUNCTION CALLS
  39. ;
  40.     ORG    100H        ;PROG ORG
  41. ;
  42. START:    LD    HL,0
  43.     ADD    HL,SP        ;GET CP/M STACK POINTER
  44.     LD    (CPMSTK),HL     ;SAVE IT
  45.     LD    SP,STACK    ;SETUP NEW STACK
  46.     LD    DE,PROMPT    ;PTR TO SIGNON MESSAGE
  47.     CALL    PUTSTR        ;SEND STRING
  48.     CALL    SETDMA        ;SET DKS BUF ADDR
  49.     CALL    GETBUF        ;GET INPUT
  50.     LD    HL,INPBUF+1    ;PTR NUM INP CHRS
  51.     LD    A,(HL)        ;GET NUM INP CHRS
  52.     LD    C,A        ;SAVE CHAR CNT IN C
  53.     DEC    A        ;CK IF ANY CHRS IN BUFF
  54.     JP    M,BCKCPM    ;NO CHRS, BACK TO CP/M
  55.     JP    Z,BCKCPM    ;NO CHRS, BACK TO CP/M
  56.     LD    A,0FFH        ;GET FF=START OF INPUT
  57.     LD    (HL),A        ;SET CHR CNT=FF
  58.     LD    A,C        ;GET CHR CNT AGAIN
  59.     INC    A        ;ADD ONE FOR 01 END CHR
  60. ;--ADD A TO HL TO FORM END INP STRING--
  61.     CALL    ADATHL
  62.     LD    (HL),1        ;INDICATE END OF INPUT
  63. ;
  64. ;--SELECT DISK UNIT A--
  65.     CALL    INIT
  66. ;
  67.     CALL    DELETE        ;DELETE OLD $$$.SUB
  68.     CALL    MAKE        ;MAKE NEW $$$.SUB
  69. ; SET CURRENT RECORD = 0
  70.     LD    HL,SUBFCB+32    ;HL=PTR CUR POS IN FCB
  71.     XOR    A
  72.     LD    (HL),A
  73. ;--CONVERT BUFFER TO UPPER CASE CHRS--
  74. ;--SKIP ANY LEADING BLANK CHARS IN 1ST STRING--
  75.     CALL    CNVBUF
  76.     LD    HL,INPBUF+2    ;HL=PTR INPUT BUFF
  77. ;--COUNT CHRS IN INPUT STRING AND SET HL TO END--
  78. COUNT:    CALL    CNTCHR
  79. ;--MAIN COMMAND SCANNING LOOP (RIGHT TO LEFT)--
  80. SCNLOP:    LD    A,(HL)        ;GET CHR
  81.     CP    0FFH        ;CHECK IF CONE
  82.     JR    Z,DONE        ;QUIT, DONE
  83.     LD    C,0        ;BACKUP TO PREVIOUS /
  84. SCNLP2:    DEC    HL        ;DEC CHR PTR
  85.     LD    A,(HL)        ;GET CHR
  86.     INC    C        ;INC COUNT
  87. ;--FF=BEGINNING (END) OF INPUT STRING--
  88.     CP    0FFH        ;CHECK IF LAST COMMAND
  89.     JR    Z,PUTCMN    ;PUT LAST COMMAND IN SUB FILE
  90. ;--/=BEGINNING (END) OF ONE COMMAND STRING--
  91.     CP    '/'        ;CHECK FOR / BETWEEN COMMANDS
  92.     JR    NZ,SCNLP2    ;LOOP TILL / OR FF
  93. ;--PUT COMMAND INTO SUBMIT FILE--
  94. ;--USE CP/M DEFAULT BUFFER AREA--
  95. PUTCMN:    PUSH    HL        ;SAVE POINTER
  96.     DEC    C        ;DEC FOR / CHR
  97.     INC    HL        ;SKIP OVER /
  98.     LD    A,C
  99.     LD    (80H),A        ;PUT LENGTH IN BUFFER
  100.     LD    DE,81H
  101.     CALL    BLKMOV        ;MOVE COMMAND TO BUFFER
  102.     EX    DE,HL        ;SET HL TO END OF COMMAND
  103. ;--ZERO REST OF BUFFER--
  104.     LD    A,127
  105.     SUB    A,C
  106.     LD    B,A        ;SET LOOP COUNT
  107.     LD    C,0
  108. ZROLOP:    LD    (HL),C
  109.     INC    HL
  110.     DJNZ    ZROLOP
  111. ;--WRITE ONE SECTOR--
  112.     CALL    WRITE        ;WRITE BUFF TO SUB FILE
  113.     POP    HL        ;GET POSITION POINTER AGAIN
  114.     INC    A        ;CHECK FOR WRITE ERROR
  115.     JR    NZ,SCNLOP
  116. ;--DISK ERROR-
  117.     LD    DE,NSPMSG
  118.     JP    SERMSG
  119. ;
  120. ;--DONE, BACK TO CP/M--
  121. ;--DO A RESET TO START SUBMIT--
  122. DONE:    CALL    CLOSE
  123.     JP    0
  124. ;
  125. ;--COUNT CHARS IN THE COMMAND--
  126. ;  MOVE HL TO END OF COMMAND
  127. CNTCHR:    LD    C,1        ;INIT CNT=1
  128. CNTLOP:    LD    A,(HL)
  129.     CP    CR        ;END IF CR
  130.     RET    Z
  131.     CP    1        ;END IF CHR=1
  132.     RET    Z
  133.     INC    C
  134.     INC    HL
  135.     JR    CNTLOP
  136. ;
  137. ;--ADD A TO HL--
  138. ADATHL:    ADD    A,L
  139.     LD    L,A
  140.     RET    NC
  141.     INC    H
  142.     RET
  143. ;
  144. ;--BLOCK MOVE--
  145. ;   HL=SOURCE, DE=DESTINATION, C=NUMBER OF CHARS
  146. BLKMOV:    LD    B,0
  147.     LDIR
  148.     RET
  149. ;
  150. ;--CONVERT BUFFER TO UPPER CASE--
  151. CNVBUF:    LD    HL,INPBUF+2
  152.     LD    D,H
  153.     LD    E,L
  154. ;--SKIP LEADING BLANKS
  155. SKPLOP:    LD    A,(HL)
  156.     CP    ' '
  157.     JR    NC,CNVLOP
  158.     INC    HL
  159.     JR    SKPLOP
  160. CNVLOP:    CALL    GETCHR
  161.     LD    (DE),A        ;MOVE CHR
  162.     INC    DE
  163.     INC    HL
  164.     CP    1        ;END?
  165.     JR    NZ,CNVLOP
  166.     RET
  167. ;
  168. ;--GET NEXT CHR AND CONV TO UPPER CASE--
  169. GETCHR:    LD    A,(HL)        ;GET CHR
  170.     CP    7BH        ;ABOVE z?
  171.     RET    NC
  172.     CP    61H        ;BELOW a?
  173.     RET    C
  174.     AND    5FH        ;LOW TO UP
  175.     RET
  176. ;
  177. ;--GET BUFFERED LINE OF COMMANDS--
  178. GETBUF:    LD    DE,INPBUF    ;INP BUFF ADDR
  179.     LD    C,10
  180.     CALL    BDOS
  181.     RET
  182. ;
  183. ;--SET DISK BUFFER ADDRESS(DMA)--
  184. SETDMA:    LD    DE,80H        ;BUFF ADDR
  185.     LD    C,26
  186.     CALL    BDOS
  187.     RET
  188. ;
  189. ;--WRITE CONTENTS OF BUFF TO SUB FILE--
  190. WRITE:    LD    DE,SUBFCB
  191.     LD    C,21
  192.     CALL    BDOS
  193.     RET
  194. ;
  195. ;--CLOSE $$$.SUB--
  196. CLOSE:    LD    C,16
  197.     LD    DE,SUBFCB
  198.     CALL    BDOS
  199.     RET
  200. ;
  201. ;--MAKE NEW $$$.SUB FILE--
  202. MAKE:    LD    DE,SUBFCB
  203.     LD    C,22
  204.     CALL    BDOS
  205.     INC    A        ;FF=NO SPACE
  206.     JP    Z,NOSERR    ;NO SPACE ERROR
  207.     RET
  208. ;
  209. ;--DELETE ANY OLD $$$.SUB FILE--
  210. DELETE:    LD    DE,SUBFCB
  211.     LD    C,19
  212.     CALL    BDOS
  213.     RET
  214. ;
  215. ;--INIT AND SELECT DISK A--
  216. INIT:    LD    C,13
  217.     CALL    BDOS
  218.     RET
  219. ;
  220. ;--SEND STRING TO TERMINAL--
  221. ; --DE=POINTER TO STRING ADDRESS--
  222. PUTSTR:    LD    C,9
  223.     CALL    BDOS
  224.     RET
  225. ;
  226. ;--MESSAGES--
  227. PROMPT:    DEFB    CR,LF,'BATCH v2.1 Submit File Generator'
  228.     DEFB    CR,LF,'for use with XSUB under CP/M 2.2.'
  229.     DEFB    CR,LF,'Enter Command String and then <RET>.'
  230.     DEFB    CR,LF,'Separate each command with a / symbol.'
  231.     DEFB    CR,LF,'/X may be used to exit modified version of PIP.'
  232.     DEFB    CR,LF,'->$'
  233. NSPMSG:    DEFB    CR,LF,'Disk Full--No More Space'
  234.     DEFB    CR,LF,7,7,'$'
  235. NDSMSG:    DEFB    CR,LF,'Directory Full--No More Space'
  236.     DEFB    CR,LF,7,7,'$'
  237. ;
  238. NOSERR:    LD    DE,NDSMSG
  239. ;--SEND ERROR MESSAGE AND BACK TO CP/M--
  240. SERMSG:    CALL    PUTSTR
  241. BCKCPM:    LD    HL,(CPMSTK)
  242.     LD    SP,HL        ;RESET STACK POINTER
  243.     RET            ;BACK TO CP/M
  244. ;
  245. ;--FILE CONTROL BLOCK--
  246. SUBFCB:    DEFB    0        ;DRIVE CODE
  247.     DEFB    '$$$     SUB'    ;FILE NAME
  248.     DEFB    0,0,0,0
  249.     DEFS    17
  250. ;--CP/M STACK STORAGE--
  251. CPMSTK:    DEFW    0
  252. ;--INPUT BUFFER AREA--
  253. INPBUF:    DEFB    128        ;BUF LENGTH
  254. BUFCNT:    DEFB    0        ;CHRS IN BUF
  255.     DEFS    128
  256. ;--STACK AREA--
  257.     DEFS    20        ;SIZE OF STACK
  258. STACK:    EQU    0        ;BOTTOM OS STACK
  259.     END
  260.  
  261. UF LENGTH
  262. BUFCNT:    DEFB    0        ;CHRS IN BUF
  263.     DEFS    128
  264. ;--STACK A