home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol101 / template.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  10.0 KB  |  537 lines

  1. ;
  2. ;  PROGRAM:  TEMPLATE
  3. ;  VERSION:  1.0
  4. ;  DATE:  15 Jan 83
  5. ;  AUTHOR:  RICHARD CONN
  6. ;  PREVIOUS VERSIONS:  None
  7. ;
  8. VERS    equ    10
  9.  
  10. ;
  11. ;    TEMPLATE provides a basic template from which to build utilities
  12. ; for ZCPR2.  The areas in the TEMPLATE which begin with **** are those
  13. ; which must be customized for the specific utility.
  14. ;
  15.  
  16.  
  17. ;
  18. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  19. ;    All Rights Reserved
  20. ;
  21. ;    ZCPR2 and its utilities, including this one, are released
  22. ; to the public domain.  Anyone who wishes to USE them may do so with
  23. ; no strings attached.  The author assumes no responsibility or
  24. ; liability for the use of ZCPR2 and its utilities.
  25. ;
  26. ;    The author, Richard Conn, has sole rights to this program.
  27. ; ZCPR2 and its utilities may not be sold without the express,
  28. ; written permission of the author.
  29. ;
  30.  
  31. FALSE    EQU    0
  32. TRUE    EQU    NOT FALSE
  33.  
  34. ;
  35. ;  BASIC SYSLIB ROUTINES NEEDED BY TEMPLATE
  36. ;
  37. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  38.  
  39.     EXT    DIRFS    ; DIRECTORY PROCESSOR
  40.     EXT    DIRPACK    ; PACK DIRECTORY
  41.  
  42.     EXT    ZGPINS    ; INIT BUFFERS
  43.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  44.  
  45.     EXT    INITFCB    ; INIT FCB
  46.     EXT    BDOS    ; BDOS ENTRY
  47.     EXT    RETUD    ; RETURN CURRENT USER/DISK
  48.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  49.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  50.     EXT    LOGUD    ; LOG INTO USER/DISK
  51.     EXT    PRINT    ; PRINT STRING PTED TO BY RET ADR
  52.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  53.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  54.     EXT    CAPS    ; CAPITALIZE ROUTINE
  55.     EXT    CRLF    ; NEW LINE ROUTINE
  56.     EXT    CLINE    ; COMMAND LINE STRING SAVE ROUTINE
  57.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  58.  
  59. ;
  60. ;  CP/M EQUATES
  61. ;
  62. CPM    EQU    0    ; WARM BOOT
  63. BDOSE    EQU    CPM+5    ; BDOS ENTRY
  64. FCB    EQU    CPM+5CH    ; FCB
  65. TBUFF    EQU    CPM+80H    ; INPUT LINE BUFFER
  66. CR    EQU    13    ; <CR>
  67. LF    EQU    10    ; <LF>
  68. CTRLC    EQU    3    ; ^C
  69.  
  70. ;
  71. ;  Branch to Start of Program
  72. ;
  73.     JMP    START
  74.  
  75. ;
  76. ;******************************************************************
  77. ;
  78. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  79. ;
  80. ;    This data block precisely defines the data format for
  81. ; initial features of a ZCPR2 system which are required for proper
  82. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  83. ;
  84.  
  85. ;
  86. ;  EXTERNAL PATH DATA
  87. ;
  88. EPAVAIL:
  89.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  90. EPADR:
  91.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  92.  
  93. ;
  94. ;  INTERNAL PATH DATA
  95. ;
  96. INTPATH:
  97.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  98.             ; DISK = 1 FOR A, '$' FOR CURRENT
  99.             ; USER = NUMBER, '$' FOR CURRENT
  100.     DB    0,0
  101.     DB    0,0
  102.     DB    0,0
  103.     DB    0,0
  104.     DB    0,0
  105.     DB    0,0
  106.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  107.     DB    0    ; END OF PATH
  108.  
  109. ;
  110. ;  MULTIPLE COMMAND LINE BUFFER DATA
  111. ;
  112. MCAVAIL:
  113.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  114. MCADR:
  115.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  116.  
  117. ;
  118. ;  DISK/USER LIMITS
  119. ;
  120. MDISK:
  121.     DB    4    ; MAXIMUM NUMBER OF DISKS
  122. MUSER:
  123.     DB    31    ; MAXIMUM USER NUMBER
  124.  
  125. ;
  126. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  127. ;
  128. DOK:
  129.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  130. UOK:
  131.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  132.  
  133. ;
  134. ;  PRIVILEGED USER DATA
  135. ;
  136. PUSER:
  137.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  138. PPASS:
  139.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  140.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  141.  
  142. ;
  143. ;  CURRENT USER/DISK INDICATOR
  144. ;
  145. CINDIC:
  146.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  147.  
  148. ;
  149. ;  DMA ADDRESS FOR DISK TRANSFERS
  150. ;
  151. DMADR:
  152.     DW    80H    ; TBUFF AREA
  153.  
  154. ;
  155. ;  NAMED DIRECTORY INFORMATION
  156. ;
  157. NDRADR:
  158.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  159. NDNAMES:
  160.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  161. DNFILE:
  162.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  163.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  164.  
  165. ;
  166. ;  REQUIREMENTS FLAGS
  167. ;
  168. EPREQD:
  169.     DB    0FFH    ; EXTERNAL PATH?
  170. MCREQD:
  171.     DB    000H    ; MULTIPLE COMMAND LINE?
  172. MXREQD:
  173.     DB    0FFH    ; MAX USER/DISK?
  174. UDREQD:
  175.     DB    000H    ; ALLOW USER/DISK CHANGE?
  176. PUREQD:
  177.     DB    000H    ; PRIVILEGED USER?
  178. CDREQD:
  179.     DB    0FFH    ; CURRENT INDIC AND DMA?
  180. NDREQD:
  181.     DB    0FFH    ; NAMED DIRECTORIES?
  182. Z2CLASS:
  183.     DB    0    ; CLASS 0
  184.     DB    'ZCPR2'
  185.     DS    10    ; RESERVED
  186.  
  187. ;
  188. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  189. ;
  190. ;******************************************************************
  191. ;
  192.  
  193. ;
  194. ;  **** Special Initial Value Area for GENINS
  195. ;
  196.  
  197. ;
  198. ;  Start of Program
  199. ;
  200. START:
  201.     LXI    H,0    ; GET STACK PTR
  202.     DAD    SP
  203.     SHLD    STACK    ; SAVE IT
  204.     LXI    SP,STACK    ; SET SP
  205.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  206.     CALL    RETUD    ; GET CURRENT USER/DISK
  207.     MOV    A,B    ; SAVE DISK
  208.     STA    DISK
  209.     MOV    A,C    ; SAVE USER
  210.     STA    USER
  211.  
  212.     CALL    ZGPINS    ; INIT BUFFERS
  213.  
  214.     LXI    H,TBUFF    ; SAVE COMMAND LINE
  215.     CALL    CLINE
  216.     SHLD    CMDLNE    ; SAVE PTR
  217.  
  218. ;
  219. ;  **** Banner of Program
  220. ;
  221.     CALL    PRINT
  222.     DB    'TEMPLATE  Version '
  223.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  224.  
  225. ;
  226. ;  Check for Help Request
  227. ;
  228.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  229.     CPI    ' '    ; NO FILE SPEC?
  230.     JZ    HELP
  231.     CPI    '/'    ; OPTION CAUGHT?
  232.     JNZ    ECONT
  233.  
  234. ;
  235. ;  **** Print Help Information
  236. ;
  237. HELP:
  238.     CALL    PRINT
  239.     DB    CR,LF,'TEMPLATE Command --'
  240.     DB    CR,LF,0
  241.  
  242. ;
  243. ;  RETURN TO OS
  244. ;
  245. RETURN:
  246.     LHLD    STACK    ; GET OLD STACK
  247.     SPHL        ; SET IT
  248.     RET
  249.  
  250. ;  EXTRACT FLAGS IF PRESENT
  251. ECONT:
  252.     LXI    H,0    ; SET FILE COUNT
  253.     SHLD    FILECNT
  254.     LHLD    CMDLNE    ; PT TO BUFFER
  255. ;
  256. ;  SKIP TO FILE NAME STRING
  257. ;
  258.     CALL    SBLANK    ; SKIP OVER BLANKS
  259. ;
  260. ;  SKIP TO END OF FILE NAME STRING
  261. ;
  262.     CALL    SNBLANK    ; SKIP OVER NON-BLANKS
  263. ;
  264. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  265. ;
  266. OPT:
  267.     CPI    '/'    ; OPTION CHAR?
  268.     JNZ    OPTION
  269.     INX    H    ; SKIP SLASH
  270. ;
  271. ;  PROCESS LIST OF OPTIONS
  272. ;
  273. OPTION:
  274.     MOV    A,M    ; GET BYTE
  275.     ORA    A    ; DONE?
  276.     JZ    DSPEC
  277.     INX    H    ; PT TO NEXT CHAR
  278.     CPI    ' '    ; SKIP OVER SPACES
  279.     JZ    OPTION
  280.     MOV    C,A    ; COMMAND IN C
  281.     LXI    D,OPTAB    ; PT TO OPTION TABLE
  282. OPTL:
  283.     LDAX    D    ; GET OPTION LETTER
  284.     ORA    A    ; END OF TABLE?
  285.     JZ    HELP    ; HELP IF SO
  286.     CMP    C    ; MATCH?
  287.     JZ    OPTM    ; PROCESS IF SO
  288.     INX    D    ; PT TO NEXT ENTRY
  289.     INX    D
  290.     INX    D
  291.     JMP    OPTL
  292. ;
  293. ;  PROCESS OPTION
  294. ;
  295. OPTM:
  296.     PUSH    H    ; SAVE HL ON STACK
  297.     LXI    H,OPTION    ; GET RETURN ADDRESS
  298.     XTHL        ; ... ON STACK AND RESTORE HL
  299.     INX    D    ; PT TO ADDRESS
  300.     LDAX    D    ; GET ADDRESS LOW
  301.     MOV    B,A    ; ... IN B
  302.     INX    D
  303.     LDAX    D    ; GET ADDRESS HIGH
  304.     MOV    D,A    ; ... IN D
  305.     MOV    E,B    ; LOW IN E
  306.     PUSH    D    ; PUT ADDRESS ON STACK
  307.     RET        ; "CALL" OPTION ROUTINE
  308.  
  309. ;
  310. ;  **** OPTION TABLE
  311. ;    EACH OPTION IS A CAPITAL LETTER OR SPECIAL CHAR FOLLOWED BY
  312. ;        AN ADDRESS; THE TABLE IS TERMINATED BY A BINARY ZERO
  313. ;
  314. OPTAB:
  315.     DB    0    ; END OF TABLE
  316.  
  317. ;
  318. ;  BEGIN MOVING THROUGH FILE NAMES, SEPARATED BY COMMAS
  319. ;
  320. DSPEC:
  321.     LHLD    CMDLNE    ; PT TO FIRST BYTE
  322.     CALL    SBLANK    ; SKIP TO NON-BLANK
  323. ;
  324. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  325. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  326. ;
  327. DSPEC1:
  328.     CALL    GETUD    ; RESET USER IF NECESSARY
  329.     LXI    D,NTFCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  330.  
  331.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  332.     JZ    DERR    ; ERROR HANDLER
  333.  
  334.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  335.     MOV    A,B    ; SAVE POSSIBLE DRIVE SPEC
  336.     CPI    0FFH    ; CURRENT DISK?
  337.     JZ    DSPEC2
  338.     LDA    MDISK    ; GET MAX DISK NUMBER
  339.     DCR    B    ; ADJUST TO WITHIN BOUNDS 0-15
  340.     CMP    B    ; WITHIN BOUNDS?
  341.     MOV    A,B    ; GET DISK NUMBER IN A
  342.     JNC    USPEC
  343. DERR:
  344.     CALL    PRINT
  345.     DB    CR,LF,'Invalid Disk Specification',0
  346.     JMP    DRETURN
  347.  
  348. ;
  349. ;  SET CURRENT DISK
  350. ;
  351. DSPEC2:
  352.     LDA    DISK    ;GET CURRENT DISK
  353.     MOV    B,A    ;... IN B
  354.  
  355. ;  CHECK FOR USER NUMBER
  356. USPEC:
  357.     MOV    A,C    ; GET NEW USER NUMBER
  358.     CPI    0FFH    ; DEFAULT USER?
  359.     JZ    USPEC1
  360.     CPI    '?'    ; ALL USERS NOT ALLOWED?
  361.     JZ    UERR
  362.     LDA    MUSER    ; GET MAX USER NUMBER
  363.     CMP    C
  364.     MOV    A,C    ; USER NUMBER IN A
  365.     JNC    FCT
  366. UERR:
  367.     CALL    PRINT
  368.     DB    CR,LF,'Invalid User Number',0
  369.     JMP    DRETURN
  370. USPEC1:
  371.     LDA    USER    ;GET CURRENT USER
  372.     MOV    C,A    ;... IN C
  373.  
  374. ;
  375. ;  LOAD DIRECTORY AND PERFORM FUNCTION
  376. ;
  377. FCT:
  378.     MOV    A,B    ; SAVE NEW DISK/USER AWAY
  379.     STA    CDISK    ; CURRENT DISK
  380.     MOV    A,C
  381.     STA    CUSER    ; CURRENT USER
  382.     CALL    LOGUD    ; LOG INTO ACCOUNT
  383.     CALL    CODEND    ; PT TO END OF CODE
  384.     CALL    RETUD    ; GET USER NUMBER FOR DIRFS
  385.     MVI    A,11000000B    ; SELECT SYS AND NON-SYS FILES
  386.     ORA    C    ; OR IN USER NUMBER
  387.     LXI    D,NTFCB    ; PT TO FCB
  388.     CALL    INITFCB    ; INIT THE FCB
  389.     CALL    DIRFS    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  390.     CALL    ICHECK    ; CHECK FOR INSPECT OPTION AND INSPECT IF SET
  391.     CALL    GETUD    ; RETURN TO BASE USER/DISK
  392.  
  393. ;
  394. ;  PERFORM FUNCTION; HL PTS TO FILE AND BC CONTAINS NUMBER OF FILES
  395. ;
  396. FCTL:
  397.     MOV    A,B        ; CHECK FOR COMPLETION (COUNT = 0)
  398.     ORA    C
  399.     JZ    FCTL1
  400.     DCX    B        ; COUNT DOWN
  401.     PUSH    H        ; SAVE PTR AND COUNT
  402.     PUSH    B
  403.     CALL    FUNCTION    ; PERFORM FUNCTION
  404.     POP    B        ; GET COUNT AND PTR
  405.     POP    H
  406.     LXI    D,ESIZE        ; PT TO NEXT ENTRY
  407.     DAD    D
  408.     JMP    FCTL
  409.  
  410. ;
  411. ;  CHECK FOR NEXT FILE SPEC
  412. ;
  413. FCTL1:
  414.     LHLD    NEXTCH    ; GET PTR
  415.     MOV    A,M    ; GET DELIM
  416.     CPI    ','    ; ANOTHER FILE?
  417.     JNZ    DRETURN
  418.     INX    H    ; PT TO CHAR AFTER COMMA
  419.     JMP    DSPEC1    ; CONTINUE PROCESSING
  420.  
  421. ;
  422. ;  **** EMERGENCY ABORT
  423. ;
  424. ABORT:
  425.     CALL    PRINT
  426.     DB    CR,LF,'** TEMPLATE Abort **',CR,LF,0
  427.     CALL    GETUD    ; RETURN HOME AND FALL THRU TO DRETURN
  428. ;
  429. ;  **** FUNCTION COMPLETE -- CLEANUP AND EXIT
  430. ;    FILL THIS IN WITH CLEANUP CODE FOR EXIT
  431. ;
  432. DRETURN:
  433.     JMP    RETURN
  434.  
  435. ;
  436. ;  **** INSPECT FILES -- THIS ROUTINE IS TO PERFORM A FILE INSPECTION
  437. ;    ON INPUT, HL PTS TO FIRST 16-BYTE ENTRY AND BC=NUMBER OF ENTRIES
  438. ;
  439. ICHECK:
  440.     RET
  441.  
  442. ;
  443. ;  **** FUNCTION -- MAIN FUNCTION OF TEMPLATE
  444. ;    ON ENTRY, HL PTS TO NAME OF FILE (16 BYTES) AND USER IS LOGGED INTO
  445. ;        DIRECTORY CONTAINING INDICATED FILE
  446. ;
  447. FUNCTION:
  448.     CALL    PRFN    ; FOR TEMPLATE
  449.     RET
  450.  
  451. ;
  452. ;  UTILITIES
  453. ;    SBLANK  -- SKIP BLANKS PTED TO BY HL UNTIL NON-BLANK ENCOUNTERED; HL
  454. ;    SNBLANK -- SKIP NON-BLANKS PTED TO BY HL UNTIL BLANK OR EOL; HL
  455. ;    PRFN    -- PRINT FILE NAME PTED TO BY HL; AFFECT NOTHING
  456. ;
  457.  
  458. ;
  459. ;  SKIP UNTIL NON-BLANK
  460. ;
  461. SBLANK:
  462.     MOV    A,M    ; LOOK FOR BLANK
  463.     INX    H    ; PT TO NEXT
  464.     CPI    ' '    ; BLANK?
  465.     JZ    SBLANK
  466.     DCX    H    ; BACK UP
  467.     RET
  468.  
  469. ;
  470. ;  SKIP UNTIL BLANK OR EOL
  471. ;
  472. SNBLANK:
  473.     MOV    A,M    ; GET CHAR
  474.     INX    H    ; PT TO NEXT
  475.     CPI    ' '    ; BLANK?
  476.     JZ    SNB1
  477.     ORA    A    ; EOL?
  478.     JNZ    SNBLANK
  479. SNB1:
  480.     DCX    H    ; BACK UP
  481.     RET
  482.  
  483. ;
  484. ;  PRINT FILE NAME PTED TO BY HL
  485. ;    OUTPUT TO CON:
  486. ;
  487. PRFN:
  488.     PUSH    H    ; SAVE REGS
  489.     PUSH    B
  490.     INX    H    ; PT TO FILE NAME
  491.     MVI    B,8    ; PRINT NAME
  492.     CALL    PRNT
  493.     MVI    A,'.'    ; DECIMAL
  494.     CALL    COUT
  495.     MVI    B,3    ; PRINT TYPE
  496.     CALL    PRNT
  497.     POP    B    ; GET REGS
  498.     POP    H
  499.     RET
  500.  
  501. ;
  502. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  503. ;    OUTPUT TO CON:
  504. ;
  505. PRNT:
  506.     MOV    A,M    ; GET CHAR
  507.     CALL    COUT
  508.     INX    H    ; PT TO NEXT
  509.     DCR    B    ; COUNT DOWN
  510.     JNZ    PRNT
  511.     RET
  512.  
  513. ;
  514. ;  BUFFERS
  515. ;
  516. DISK:
  517.     DS    1    ; HOME DISK NUMBER
  518. USER:
  519.     DS    1    ; HOME USER NUMBER
  520. CDISK:
  521.     DS    1    ; CURRENT DISK NUMBER
  522. CUSER:
  523.     DS    1    ; CURRENT USER NUMBER
  524. CMDLNE:
  525.     DS    2    ; PTR TO COMMAND LINE STRING
  526. NEXTCH:
  527.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  528. FILECNT:
  529.     DS    2    ; COUNT OF NUMBER OF FILES RENAMED
  530. NTFCB:
  531.     DS    36    ; FCB FOR NEW FILE
  532.     DS    100    ; STACK AREA
  533. STACK:
  534.     DS    2    ; OLD STACK PTR
  535.  
  536.     END
  537.