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 / CPM / ZCPR2 / TEMPLATE.MAC < prev    next >
Text File  |  2000-06-30  |  18KB  |  779 lines

  1. ;
  2. ;  PROGRAM:  TEMPLATE
  3. ;  AUTHOR:  Richard Conn
  4. ;  VERSION:  1.2
  5. ;  DATE:  26 Apr 83
  6. ;  PREVIOUS VERSIONS:  1.1 (25 Apr 83), 1.0 (15 Jan 83)
  7. ;
  8. VERS    equ    12
  9.  
  10. ;
  11. ;    << This is a Template designed to assist the programmer
  12. ;        in writing ZCPR2 Utilities >>
  13. ;    << Insert a Description of the Program Here >>
  14. ;
  15. ;    TEMPLATE is provided as a template around which to build
  16. ; ZCPR2 utilities.  The body of TEMPLATE calls the following routines
  17. ; which must be provided for the specific function:
  18. ;
  19. ;        BANNER   -- Prints Name of Program
  20. ;        HELP     -- Prints Help Message
  21. ;        INIT     -- Performs Necessary Initializations
  22. ;        DINIT    -- Performs Necessary De-Initializations
  23. ;        OPTAB    -- Table of Command Line Options
  24. ;        FUNCTION -- Performs Function of Program
  25. ;        ABORT    -- Prints Abort Message and Exits
  26. ;
  27. ;    The flow of TEMPLATE is as follows:
  28. ;        1) Init ZCPR2 Buffers and Save Command Line
  29. ;        2) Print Banner by Calling BANNER
  30. ;        3) Call INIT Routine to Initialize Program
  31. ;        4) Process Command Line Options
  32. ;            -- OPTAB is used to specify option chars
  33. ;                and the routines used to process them
  34. ;            -- Each option character routine is provided
  35. ;                by the programmer
  36. ;        5) Print HELP Message if Invalid Option encountered
  37. ;           and exit, calling DINIT on the way out
  38. ;        6) Select Files, allowing for Inspection
  39. ;        7) Call FUNCTION for each file selected; when FUNCTION
  40. ;           is called, program has already been logged into the
  41. ;           the directory containing the desired file and HL pts
  42. ;           to the FCB of the desired file
  43. ;        8) Exit, calling DINIT on the way out
  44. ;
  45. ;    Nomenclature:
  46. ;        All Labels Used internal to TEMPLATE are prefixed with T$
  47. ;        All Labels Intended to be accessed by the programmer which
  48. ;            are a part of TEMPLATE are prefixed with E$ (External)
  49. ;        By employing such conventions, the programmer is relatively
  50. ;            free to employ any variable names he desires without
  51. ;            having to concern himself with labels and such used
  52. ;            by TEMPLATE
  53. ;
  54.  
  55. ;
  56. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  57. ;    All Rights Reserved
  58. ;
  59. ;    ZCPR2 and its utilities, including this one, are released
  60. ; to the public domain.  Anyone who wishes to USE them may do so with
  61. ; no strings attached.  The author assumes no responsibility or
  62. ; liability for the use of ZCPR2 and its utilities.
  63. ;
  64. ;    The author, Richard Conn, has sole rights to this program.
  65. ; ZCPR2 and its utilities may not be sold without the express,
  66. ; written permission of the author.
  67. ;
  68.  
  69. FALSE    EQU    0
  70. TRUE    EQU    NOT FALSE
  71.  
  72. ;
  73. ;  BASIC SYSLIB ROUTINES NEEDED BY TEMPLATE
  74. ;
  75. C$ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  76.  
  77.     EXT    DIRFS    ; DIRECTORY PROCESSOR
  78.     EXT    DIRPACK    ; PACK DIRECTORY
  79.  
  80.     EXT    ZGPINS    ; INIT BUFFERS
  81.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  82.  
  83.     EXT    INITFCB    ; INIT FCB
  84.     EXT    RETUD    ; RETURN CURRENT USER/DISK
  85.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  86.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  87.     EXT    LOGUD    ; LOG INTO USER/DISK
  88.     EXT    PRINT    ; PRINT STRING PTED TO BY RET ADR
  89.     EXT    PADC    ; PRINT A AS DECIMAL CHARS
  90.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  91.     EXT    CST    ; CONSOLE STATUS ROUTINE
  92.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  93.     EXT    CAPS    ; CAPITALIZE ROUTINE
  94.     EXT    CRLF    ; NEW LINE ROUTINE
  95.     EXT    CLINE    ; COMMAND LINE STRING SAVE ROUTINE
  96.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  97.  
  98.     EXT    F$OPEN    ; FILE OPEN
  99.     EXT    F$READ    ; BLOCK READ
  100.     EXT    F$CLOSE    ; FILE CLOSE
  101.  
  102. ;
  103. ;  Insert Function-Required Library References Here
  104. ;
  105.  
  106. ;
  107. ;  CP/M EQUATES
  108. ;
  109. CPM    EQU    0    ; WARM BOOT
  110. BDOSE    EQU    CPM+5    ; BDOS ENTRY
  111. FCB    EQU    CPM+5CH    ; FCB
  112. TBUFF    EQU    CPM+80H    ; INPUT LINE BUFFER
  113. DEL    EQU    7FH    ; <DEL>
  114. CR    EQU    13    ; <CR>
  115. FF    EQU    12    ; <FF>
  116. LF    EQU    10    ; <LF>
  117. CTRLC    EQU    'C'-'@'    ; ^C
  118. CTRLG    EQU    'G'-'@'
  119. CTRLH    EQU    'H'-'@'
  120. CTRLI    EQU    'I'-'@'
  121. CTRLS    EQU    'S'-'@'
  122. CTRLX    EQU    'X'-'@'
  123. CTRLZ    EQU    'Z'-'@'
  124.  
  125. ;
  126. ;  Branch to Start of Program
  127. ;
  128.     JMP    T$START
  129.  
  130. ;
  131. ;******************************************************************
  132. ;
  133. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  134. ;
  135. ;    This data block precisely defines the data format for
  136. ; initial features of a ZCPR2 system which are required for proper
  137. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  138. ;
  139.  
  140. ;
  141. ;  EXTERNAL PATH DATA
  142. ;
  143. EPAVAIL:
  144.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  145. EPADR:
  146.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  147.  
  148. ;
  149. ;  INTERNAL PATH DATA
  150. ;
  151. INTPATH:
  152.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  153.             ; DISK = 1 FOR A, '$' FOR CURRENT
  154.             ; USER = NUMBER, '$' FOR CURRENT
  155.     DB    0,0
  156.     DB    0,0
  157.     DB    0,0
  158.     DB    0,0
  159.     DB    0,0
  160.     DB    0,0
  161.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  162.     DB    0    ; END OF PATH
  163.  
  164. ;
  165. ;  MULTIPLE COMMAND LINE BUFFER DATA
  166. ;
  167. MCAVAIL:
  168.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  169. MCADR:
  170.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  171.  
  172. ;
  173. ;  DISK/USER LIMITS
  174. ;
  175. MDISK:
  176.     DB    4    ; MAXIMUM NUMBER OF DISKS
  177. MUSER:
  178.     DB    31    ; MAXIMUM USER NUMBER
  179.  
  180. ;
  181. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  182. ;
  183. DOK:
  184.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  185. UOK:
  186.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  187.  
  188. ;
  189. ;  PRIVILEGED USER DATA
  190. ;
  191. PUSER:
  192.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  193. PPASS:
  194.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  195.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  196.  
  197. ;
  198. ;  CURRENT USER/DISK INDICATOR
  199. ;
  200. CINDIC:
  201.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  202.  
  203. ;
  204. ;  DMA ADDRESS FOR DISK TRANSFERS
  205. ;
  206. DMADR:
  207.     DW    80H    ; TBUFF AREA
  208.  
  209. ;
  210. ;  NAMED DIRECTORY INFORMATION
  211. ;
  212. NDRADR:
  213.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  214. NDNAMES:
  215.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  216. DNFILE:
  217.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  218.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  219.  
  220. ;
  221. ;  REQUIREMENTS FLAGS
  222. ;
  223. EPREQD:
  224.     DB    000H    ; EXTERNAL PATH?
  225. MCREQD:
  226.     DB    000H    ; MULTIPLE COMMAND LINE?
  227. MXREQD:
  228.     DB    000H    ; MAX USER/DISK?
  229. UDREQD:
  230.     DB    000H    ; ALLOW USER/DISK CHANGE?
  231. PUREQD:
  232.     DB    000H    ; PRIVILEGED USER?
  233. CDREQD:
  234.     DB    000H    ; CURRENT INDIC AND DMA?
  235. NDREQD:
  236.     DB    000H    ; NAMED DIRECTORIES?
  237. Z2CLASS:
  238.     DB    0    ; CLASS 0
  239.     DB    'ZCPR2'
  240.     DS    10    ; RESERVED
  241.  
  242. ;
  243. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  244. ;
  245. ;******************************************************************
  246. ;
  247.  
  248. ;
  249. ;  **** Special Initial Value Area for GENINS
  250. ;
  251.  
  252. ;
  253. ;  Start of Program
  254. ;
  255. T$START:
  256.     LXI    H,0    ; GET STACK PTR
  257.     DAD    SP
  258.     SHLD    V$STACK    ; SAVE IT
  259.     LXI    SP,V$STACK    ; SET SP
  260.     XRA    A    ; A=0
  261.     STA    V$INSPECT    ; TURN OFF FILE INSPECTION
  262.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  263.     CALL    RETUD    ; GET CURRENT USER/DISK
  264.     MOV    A,B    ; SAVE DISK
  265.     STA    V$DISK
  266.     MOV    A,C    ; SAVE USER
  267.     STA    V$USER
  268.  
  269.     CALL    ZGPINS    ; INIT BUFFERS
  270.  
  271.     LXI    H,TBUFF    ; SAVE COMMAND LINE
  272.     CALL    CLINE
  273.     SHLD    V$CMDLNE    ; SAVE PTR
  274.  
  275. ;
  276. ;  Banner of Program
  277. ;
  278.     CALL    BANNER    ; PRINT BANNER PROVIDED BY USER
  279. ;
  280. ;  Check for Help Request
  281. ;
  282.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  283.     CPI    ' '    ; NO FILE SPEC?
  284.     JZ    T$HELPENT
  285.     CPI    '/'    ; OPTION CAUGHT?
  286.     JNZ    T$ECONT
  287.  
  288. ;
  289. ;  Print Help Information
  290. ;
  291. T$HELPENT:
  292.     CALL    HELP    ; PRINT PROGRAM'S HELP MESSAGE
  293.  
  294. ;
  295. ;  RETURN TO OS
  296. ;
  297. T$RETURN:
  298.     CALL    DINIT    ; DEINIT PROGRAM
  299.     LHLD    V$STACK    ; GET OLD STACK
  300.     SPHL        ; SET IT
  301.     RET
  302.  
  303. ;
  304. ;  PROGRAM'S INIT ROUTINE
  305. ;
  306. T$ECONT:
  307.     CALL    INIT    ; PROG INIT ROUTINE
  308. ;
  309. ;  EXTRACT FLAGS IF PRESENT
  310. ;
  311.     LXI    H,0    ; SET FILE COUNT
  312.     SHLD    V$FILECNT
  313.     LHLD    V$CMDLNE    ; PT TO BUFFER
  314. ;
  315. ;  SKIP TO FILE NAME STRING
  316. ;
  317.     CALL    T$SBLANK    ; SKIP OVER BLANKS
  318. ;
  319. ;  SKIP TO END OF FILE NAME STRING
  320. ;
  321.     CALL    T$SNBLANK    ; SKIP OVER NON-BLANKS
  322. ;
  323. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  324. ;
  325. T$OPT:
  326.     CPI    '/'    ; OPTION CHAR?
  327.     JNZ    T$OPTION
  328.     INX    H    ; SKIP SLASH
  329. ;
  330. ;  PROCESS LIST OF OPTIONS
  331. ;
  332. T$OPTION:
  333.     MOV    A,M    ; GET BYTE
  334.     ORA    A    ; DONE?
  335.     JZ    T$DSPEC
  336.     INX    H    ; PT TO NEXT CHAR
  337.     CPI    ' '    ; SKIP OVER SPACES
  338.     JZ    T$OPTION
  339.     MOV    C,A    ; COMMAND IN C
  340.     LXI    D,OPTAB    ; PT TO OPTION TABLE
  341. T$OPTL:
  342.     LDAX    D    ; GET OPTION LETTER
  343.     ORA    A    ; END OF TABLE?
  344.     JZ    T$HELPENT    ; HELP IF SO
  345.     CMP    C    ; MATCH?
  346.     JZ    T$OPTM    ; PROCESS IF SO
  347.     INX    D    ; PT TO NEXT ENTRY
  348.     INX    D
  349.     INX    D
  350.     JMP    T$OPTL
  351. ;
  352. ;  PROCESS OPTION
  353. ;
  354. T$OPTM:
  355.     PUSH    H    ; SAVE HL ON STACK
  356.     LXI    H,T$OPTION    ; GET RETURN ADDRESS
  357.     XTHL        ; ... ON STACK AND RESTORE HL
  358.     INX    D    ; PT TO ADDRESS
  359.     LDAX    D    ; GET ADDRESS LOW
  360.     MOV    B,A    ; ... IN B
  361.     INX    D
  362.     LDAX    D    ; GET ADDRESS HIGH
  363.     MOV    D,A    ; ... IN D
  364.     MOV    E,B    ; LOW IN E
  365.     PUSH    D    ; PUT ADDRESS ON STACK
  366.     MOV    A,C    ; COMMAND IN A
  367.     RET        ; "CALL" OPTION ROUTINE
  368. ;
  369. ;  BEGIN MOVING THROUGH FILE NAMES, SEPARATED BY COMMAS
  370. ;
  371. T$DSPEC:
  372.     LHLD    V$CMDLNE    ; PT TO FIRST BYTE
  373.     CALL    T$SBLANK    ; SKIP TO NON-BLANK
  374. ;
  375. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  376. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  377. ;
  378. T$DSPEC1:
  379.     LXI    SP,V$STACK    ; RESET STACK
  380.     CALL    GETUD    ; RESET USER IF NECESSARY
  381.     LXI    D,V$NTFCB    ; PT TO FCB IN DE, PT TO 1ST CHAR OF FN IN HL
  382.  
  383.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  384.     JZ    T$DERR    ; ERROR HANDLER
  385.  
  386.     SHLD    V$NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  387.     MOV    A,B    ; SAVE POSSIBLE DRIVE SPEC
  388.     CPI    0FFH    ; CURRENT DISK?
  389.     JZ    T$DSPEC2
  390.     LDA    MDISK    ; GET MAX DISK NUMBER
  391.     DCR    B    ; ADJUST TO WITHIN BOUNDS 0-15
  392.     CMP    B    ; WITHIN BOUNDS?
  393.     MOV    A,B    ; GET DISK NUMBER IN A
  394.     JNC    T$USPEC
  395. T$DERR:
  396.     CALL    PRINT
  397.     DB    CR,LF,'Invalid Disk Specification',0
  398.     JMP    T$RETURN
  399.  
  400. ;
  401. ;  SET CURRENT DISK
  402. ;
  403. T$DSPEC2:
  404.     LDA    V$DISK    ;GET CURRENT DISK
  405.     MOV    B,A    ;... IN B
  406.  
  407. ;  CHECK FOR USER NUMBER
  408. T$USPEC:
  409.     MOV    A,C    ; GET NEW USER NUMBER
  410.     CPI    0FFH    ; DEFAULT USER?
  411.     JZ    T$USPEC1
  412.     CPI    '?'    ; ALL USERS NOT ALLOWED?
  413.     JZ    T$UERR
  414.     LDA    MUSER    ; GET MAX USER NUMBER
  415.     CMP    C
  416.     MOV    A,C    ; USER NUMBER IN A
  417.     JNC    T$FCT
  418. T$UERR:
  419.     CALL    PRINT
  420.     DB    CR,LF,'Invalid User Number',0
  421.     JMP    T$RETURN
  422. T$USPEC1:
  423.     LDA    V$USER    ;GET CURRENT USER
  424.     MOV    C,A    ;... IN C
  425.  
  426. ;
  427. ;  LOAD DIRECTORY AND PERFORM FUNCTION
  428. ;
  429. T$FCT:
  430.     MOV    A,B    ; SAVE NEW DISK/USER AWAY
  431.     STA    V$CDISK    ; CURRENT DISK
  432.     MOV    A,C
  433.     STA    V$CUSER    ; CURRENT USER
  434.     CALL    LOGUD    ; LOG INTO ACCOUNT
  435.     CALL    CODEND    ; PT TO END OF CODE
  436.     CALL    RETUD    ; GET USER NUMBER FOR DIRFS
  437.     MVI    A,11000000B    ; SELECT SYS AND NON-SYS FILES
  438.     ORA    C    ; OR IN USER NUMBER
  439.     LXI    D,V$NTFCB    ; PT TO FCB
  440.     CALL    INITFCB    ; INIT THE FCB
  441.     CALL    DIRFS    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  442. ;
  443. ;  DETERMINE BEGINNING OF SCRATCH AREA (SCRATCH) AND SIZE IN PAGES (BCNT)
  444. ;
  445.     PUSH    H    ; SAVE PTR AND COUNT
  446.     PUSH    B
  447.     LXI    D,C$ESIZE    ; SET PTR TO NEXT FREE BLOCK
  448. T$FCTFRE:
  449.     MOV    A,B    ; DONE?
  450.     ORA    C
  451.     JZ    T$FCTFR1
  452.     DAD    D    ; PT TO NEXT
  453.     DCX    B    ; COUNT DOWN
  454.     JMP    T$FCTFRE
  455. T$FCTFR1:
  456.     INR    H    ; NEXT PAGE
  457.     MVI    L,0
  458.     SHLD    V$SCRATCH    ; SET PTR TO SCRATCH AREA
  459.     XCHG        ; PTR IN DE
  460.     LHLD    BDOSE+1    ; COMPUTE BLOCK BUFFER SIZE
  461.     MOV    A,H    ; ADJUST FOR ZCPR2
  462.     SUI    10
  463.     SUB    D    ; A=SIZE IN BLOCKS
  464.     STA    V$BCNT    ; SET BLOCK COUNT
  465.     POP    B    ; RESTORE AND SAVE REGS
  466.     POP    H
  467. ;
  468. ;  ALLOW USER TO INSPECT FILES
  469. ;
  470.     PUSH    H
  471.     PUSH    B
  472.     CALL    T$ICHECK    ; CHECK FOR INSPECT OPTION AND INSPECT IF SET
  473.     POP    B    ; RESTORE COUNT AND PTR
  474.     POP    H
  475.  
  476. ;
  477. ;  PERFORM FUNCTION; HL PTS TO FILE AND BC CONTAINS NUMBER OF FILES
  478. ;
  479. T$FCTL:
  480.     MOV    A,B        ; CHECK FOR COMPLETION (COUNT = 0)
  481.     ORA    C
  482.     JZ    T$FCTL1
  483.     DCX    B        ; COUNT DOWN
  484.     LXI    SP,V$STACK    ; RESET STACK
  485.     PUSH    B        ; SAVE COUNT AND PTR
  486.     PUSH    H
  487.     MOV    A,M        ; SELECTED FILE?
  488.     ORA    A        ; 0=YES
  489.     CZ    FUNCTION    ; PERFORM FUNCTION
  490. ;
  491. ;  ENTRY POINT TO SKIP TO NEXT FILE IN LIST
  492. ;
  493. E$FCTLNXT:
  494.     LXI    SP,V$STACK-4    ; RESTORE STACK
  495.     POP    H        ; RESTORE PTR
  496.     POP    B        ; RESTORE COUNT
  497.     LXI    D,C$ESIZE    ; PT TO NEXT ENTRY
  498.     DAD    D
  499.     JMP    T$FCTL
  500.  
  501. ;
  502. ;  CHECK FOR NEXT FILE SPEC
  503. ;
  504. T$FCTL1:
  505.     CALL    GETUD    ; RETURN TO BASE USER/DISK
  506.     LHLD    V$NEXTCH    ; GET PTR
  507.     MOV    A,M    ; GET DELIM
  508.     CPI    ','    ; ANOTHER FILE?
  509.     JNZ    T$RETURN
  510.     INX    H    ; PT TO CHAR AFTER COMMA
  511.     JMP    T$DSPEC1    ; CONTINUE PROCESSING
  512. ;
  513. ;  INSPECT FILES -- THIS ROUTINE IS TO PERFORM A FILE INSPECTION
  514. ;    ON INPUT, HL PTS TO FIRST 16-BYTE ENTRY AND BC=NUMBER OF ENTRIES
  515. ;
  516. T$ICHECK:
  517.     MOV    A,B    ;ANY FILES?
  518.     ORA    C    ;0=NO
  519.     RZ
  520.     PUSH    H    ;SAVE PTRS
  521.     PUSH    B
  522.     LXI    D,C$ESIZE    ;SIZE OF ENTRY
  523. T$ICHK1:
  524.     MVI    M,0    ;CLEAR MSBYTES
  525.     DAD    D    ;PT TO NEXT
  526.     DCX    B    ;COUNT DOWN
  527.     MOV    A,B    ;DONE?
  528.     ORA    C
  529.     JNZ    T$ICHK1
  530.     POP    B    ;RESTORE PTRS
  531.     POP    H
  532.     LDA    V$INSPECT    ;INSPECT?
  533.     ORA    A    ;0=NO
  534.     RZ
  535.     CALL    PRINT
  536.     DB    CR,LF,'File Inspect Mode',0
  537. T$ICHK2:
  538.     CALL    PRINT
  539.     DB    CR,LF,'Select ',0
  540.     CALL    E$PRFN    ;PRINT FILE NAME
  541.     CALL    PRINT
  542.     DB    ' -- (Y/N/Q=Select Rest/S=Skip Rest/other=Y)? '
  543.     DB    0
  544.     CALL    CIN    ;GET RESPONSE
  545.     CALL    CAPS    ;CAPITALIZE
  546.     CALL    COUT    ;ECHO
  547.     CPI    'Q'    ;SELECT REST?
  548.     JZ    T$ICHKYR
  549.     CPI    'S'    ;SKIP REST
  550.     JZ    T$ICHKNR
  551.     CPI    'N'    ;NO TO THIS ONE?
  552.     JNZ    T$ICHK3
  553.     MVI    M,0FFH    ;SET NO FLAG IN FILE FCB
  554. T$ICHK3:
  555.     DAD    D    ;PT TO NEXT ONE
  556.     DCX    B    ;COUNT DOWN
  557.     MOV    A,B    ;DONE?
  558.     ORA    C
  559.     JNZ    T$ICHK2
  560.     RET
  561. ;  CHECK REST OF FILES AS SELECTED
  562. T$ICHKYR:
  563.     CALL    PRINT
  564.     DB    CR,LF,'    Rest of Files Selected',0
  565.     RET
  566. ;  CHECK REST OF FILES AS NOT SELECTED
  567. T$ICHKNR:
  568.     MVI    M,0FFH    ;SET NO FLAG
  569.     DAD    D    ;PT TO NEXT
  570.     DCX    B    ;COUNT DOWN
  571.     MOV    A,B    ;DONE?
  572.     ORA    C
  573.     JNZ    T$ICHKNR
  574.     CALL    PRINT
  575.     DB    CR,LF,'    Rest of Files NOT Selected',0
  576.     RET
  577. ;
  578. ;  UTILITIES
  579. ;    T$SBLANK  -- SKIP BLANKS PTED TO BY HL UNTIL NON-BLANK ENCOUNTERED; HL
  580. ;    T$SNBLANK -- SKIP NON-BLANKS PTED TO BY HL UNTIL BLANK OR EOL; HL
  581. ;    E$PRFN    -- PRINT FILE NAME PTED TO BY HL; AFFECT NOTHING
  582.  
  583. ;
  584. ;  SKIP UNTIL NON-BLANK
  585. ;
  586. T$SBLANK:
  587.     MOV    A,M    ; LOOK FOR BLANK
  588.     INX    H    ; PT TO NEXT
  589.     CPI    ' '    ; BLANK?
  590.     JZ    T$SBLANK
  591.     DCX    H    ; BACK UP
  592.     RET
  593.  
  594. ;
  595. ;  SKIP UNTIL BLANK OR EOL
  596. ;
  597. T$SNBLANK:
  598.     MOV    A,M    ; GET CHAR
  599.     INX    H    ; PT TO NEXT
  600.     CPI    ' '    ; BLANK?
  601.     JZ    T$SNB1
  602.     ORA    A    ; EOL?
  603.     JNZ    T$SNBLANK
  604. T$SNB1:
  605.     DCX    H    ; BACK UP
  606.     RET
  607.  
  608. ;
  609. ;  PRINT FILE NAME PTED TO BY HL
  610. ;    OUTPUT TO CON:
  611. ;
  612. E$PRFN:
  613.     PUSH    H    ; SAVE REGS
  614.     PUSH    B
  615.     CALL    RETUD    ; GET CURRENT USER/DISK
  616.     MOV    A,B    ; GET DISK NUMBER
  617.     ADI    'A'    ; CONVERT TO LETTER
  618.     CALL    COUT    ; PRINT LETTER
  619.     MOV    A,C    ; GET USER NUMBER
  620.     CALL    PADC    ; PRINT USER NUMBER
  621.     CALL    PRINT
  622.     DB    ': ',0
  623.     INX    H    ; PT TO FILE NAME
  624.     MVI    B,8    ; PRINT NAME
  625.     CALL    T$PRNT
  626.     MVI    A,'.'    ; DECIMAL
  627.     CALL    COUT
  628.     MVI    B,3    ; PRINT TYPE
  629.     CALL    T$PRNT
  630.     POP    B    ; GET REGS
  631.     POP    H
  632.     RET
  633.  
  634. ;
  635. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  636. ;    OUTPUT TO CON:
  637. ;
  638. T$PRNT:
  639.     MOV    A,M    ; GET CHAR
  640.     CALL    COUT
  641.     INX    H    ; PT TO NEXT
  642.     DCR    B    ; COUNT DOWN
  643.     JNZ    T$PRNT
  644.     RET
  645.  
  646. ;***********************************************
  647. ;*  Application-Specific Section
  648. ;***********************************************
  649.  
  650. ;****************************************************
  651. ;*
  652. ;*  Function-Specific Routines
  653. ;*    These routines need to be customized for the
  654. ;* specific function being performed.  These, in
  655. ;* effect, implement the function.  Other Entry Points
  656. ;* useful to the programmer are:
  657. ;*        E$FCTLNXT -- Clean Abort of Current
  658. ;*                Processing and Skip
  659. ;*                to Next File in List;
  660. ;*                This is a Clean Way to
  661. ;*                Abort FUNCTION for the
  662. ;*                Next File
  663. ;*        E$PRFN    -- Print File Name Pted to
  664. ;*                by HL; No Regs Affected
  665. ;*
  666. ;****************************************************
  667.  
  668. ;
  669. ;  **** EMERGENCY ABORT
  670. ;
  671. ABORT:
  672.     CALL    PRINT
  673.     db    '<< Insert Your Abort Message Here >>'
  674.     DB    0
  675.     CALL    GETUD    ; RETURN HOME
  676.     JMP    T$RETURN
  677. ;
  678. ;  **** BANNER -- PRINT BANNER FOR PROGRAM (PROGRAM NAME ET AL)
  679. ;
  680. BANNER:
  681.     CALL    PRINT
  682.     db    '<< Insert Banner of Program Here >>'
  683.     DB    0
  684.     RET
  685. ;
  686. ;  **** HELP -- PRINT PROGRAM'S HELP MESSAGE
  687. ;
  688. HELP:
  689.     CALL    PRINT
  690.     db    '<< Insert HELP Text Here >>'
  691.     DB    0
  692.     RET
  693. ;
  694. ;  **** PROGRAM INIT ROUTINE
  695. ;    THIS ROUTINE IS USED BY THE PROGRAM TO PERFORM ANY NECESSARY
  696. ;    INITIALIZATIONS
  697. ;
  698. INIT:
  699.     RET
  700. ;
  701. ;  **** FUNCTION COMPLETE -- CLEANUP AND EXIT
  702. ;    FILL THIS IN WITH CLEANUP CODE FOR EXIT
  703. ;
  704. DINIT:
  705.     RET
  706. ;
  707. ;  **** OPTION TABLE USED TO PROCESS COMMAND LINE
  708. ;    EACH OPTION IS A CAPITAL LETTER OR SPECIAL CHAR FOLLOWED BY
  709. ;        AN ADDRESS; THE TABLE IS TERMINATED BY A BINARY ZERO
  710. ;
  711. OPTAB:
  712.     DB    'I'    ; FILE INSPECTION OPTION
  713.     DW    OPTINSP    ; REMOVE THESE TWO LINES AND THE FOLLOWING ROUTINE
  714.             ;   IF YOU DO NOT WANT FILE INSPECTION OPTION IN
  715.             ;   COMMAND LINE
  716.     DB    0    ; END OF TABLE
  717. ;
  718. ;  **** OPTION ROUTINES
  719. ;    EACH ROUTINE IS PROVIDED THE OPTION CHARACTER IN THE A REGISTER
  720. ;    AND A POINTER TO THE NEXT CHARACTER IN THE COMMAND LINE IN THE
  721. ;    HL REGISTER PAIR; ONLY HL NEED TO BE PRESERVED (WITH OPTIONAL
  722. ;    ADVANCEMENT TO THE NEXT OPTION) ON EXIT
  723. ;
  724. OPTINSP:
  725.     MVI    A,0FFH    ; TURN ON FILE INSPECTION OPTION
  726.     STA    V$INSPECT    ; THIS IS PROVIDED AS A SAMPLE ROUTINE
  727.                 ;   AND FOR THE INDICATED FUNCTION
  728.     RET
  729. ;
  730. ;  **** FUNCTION -- MAIN FUNCTION OF TEMPLATE
  731. ;    ON ENTRY, HL PTS TO NAME OF FILE (16 BYTES) AND USER IS LOGGED INTO
  732. ;        DIRECTORY CONTAINING INDICATED FILE
  733. ;
  734. FUNCTION:
  735.     CALL    CRLF
  736.     CALL    E$PRFN    ; THIS IS PROVIDED AS A SIMPLE ROUTINE TO RUN
  737.     RET
  738. ;
  739. ;  **** BUFFERS -- PLACE APPLICATION-SPECIFIC BUFFERS HERE
  740. ;
  741.  
  742. ;***********************************************
  743. ;*  End of Application-Specific Section
  744. ;***********************************************
  745.  
  746. ;
  747. ;  BUFFERS
  748. ;
  749. V$DISK:
  750.     DS    1    ; HOME DISK NUMBER
  751. V$USER:
  752.     DS    1    ; HOME USER NUMBER
  753. V$CDISK:
  754.     DS    1    ; CURRENT DISK NUMBER
  755. V$CUSER:
  756.     DS    1    ; CURRENT USER NUMBER
  757. V$CMDLNE:
  758.     DS    2    ; PTR TO COMMAND LINE STRING
  759. V$NEXTCH:
  760.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  761. V$FILECNT:
  762.     DS    2    ; COUNT OF NUMBER OF FILES RENAMED
  763. V$SCRATCH:
  764.     DS    2    ; ADDRESS OF FIRST BYTE OF SCRATCH AREA
  765. V$BCNT:
  766.     DS    1    ; NUMBER OF PAGES IN SCRATCH AREA
  767. V$INSPECT:
  768.     DS    1    ; INSPECT FLAG
  769. V$NTFCB:
  770.     DS    36    ; FCB FOR NEW FILE
  771. ;
  772. ;  Stack
  773. ;
  774.     DS    100    ; STACK AREA
  775. V$STACK:
  776.     DS    2    ; OLD STACK PTR
  777.  
  778.     END
  779.