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 / STARTUP.MQC / STARTUP.MAC
Text File  |  2000-06-30  |  10KB  |  457 lines

  1. ;
  2. ;  Program:  STARTUP
  3. ;  Author:  Richard Conn
  4. ;  Version:  1.4
  5. ;  Date:  9 Jan 83
  6. ;  Previous Versions:  1.3 (7 Jan 83)
  7. ;  Previous Versions:  1.2 (6 Jan 83), 1.1 (7 Dec 82), 1.0 (8 Nov 82)
  8. ;
  9. ;    STARTUP loads the ZCPR2 command line with an initial command string
  10. ; for execution on cold boot.  The user may specify what this command string
  11. ; is to STARTUP in an interactive mode, and STARTUP may be configured at
  12. ; any time.
  13. ;
  14. vers    equ    14
  15.  
  16. ;
  17. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  18. ;    All Rights Reserved
  19. ;
  20. ;    ZCPR2 and its utilities, including this one, are released
  21. ; to the public domain.  Anyone who wishes to USE them may do so with
  22. ; no strings attached.  The author assumes no responsibility or
  23. ; liability for the use of ZCPR2 and its utilities.
  24. ;
  25. ;    The author, Richard Conn, has sole rights to this program.
  26. ; ZCPR2 and its utilities may not be sold without the express,
  27. ; written permission of the author.
  28. ;
  29.  
  30.  
  31. ;
  32. ;  Externals
  33. ;
  34.     ext    print,bbline,initfcb
  35.     ext    f$delete,f$make,f$write,f$close
  36.     ext    cin,cout,caps,crlf
  37.     ext    eval,padc,phl4hc
  38.     ext    shftlh,pstr
  39.     ext    fname,bdos
  40.     ext    codend
  41.  
  42. ;
  43. ;  Constants
  44. ;
  45. fcb    equ    5ch
  46. cr    equ    0dh
  47. lf    equ    0ah
  48.  
  49. ;
  50. ;  Branch to Start of Program
  51. ;
  52.     jmp    start
  53.  
  54. ;
  55. ;******************************************************************
  56. ;
  57. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  58. ;
  59. ;    This data block precisely defines the data format for
  60. ; initial features of a ZCPR2 system which are required for proper
  61. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  62. ;
  63.  
  64. ;
  65. ;  EXTERNAL PATH DATA
  66. ;
  67. EPAVAIL:
  68.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  69. EPADR:
  70.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  71.  
  72. ;
  73. ;  INTERNAL PATH DATA
  74. ;
  75. INTPATH:
  76.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  77.             ; DISK = 1 FOR A, '$' FOR CURRENT
  78.             ; USER = NUMBER, '$' FOR CURRENT
  79.     DB    0,0
  80.     DB    0,0
  81.     DB    0,0
  82.     DB    0,0
  83.     DB    0,0
  84.     DB    0,0
  85.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  86.     DB    0    ; END OF PATH
  87.  
  88. ;
  89. ;  MULTIPLE COMMAND LINE BUFFER DATA
  90. ;
  91. MCAVAIL:
  92.     DB    000H    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  93. MCADR:
  94.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  95.  
  96. ;
  97. ;  DISK/USER LIMITS
  98. ;
  99. MDISK:
  100.     DB    4    ; MAXIMUM NUMBER OF DISKS
  101. MUSER:
  102.     DB    31    ; MAXIMUM USER NUMBER
  103.  
  104. ;
  105. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  106. ;
  107. DOK:
  108.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  109. UOK:
  110.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  111.  
  112. ;
  113. ;  PRIVILEGED USER DATA
  114. ;
  115. PUSER:
  116.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  117. PPASS:
  118.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  119.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  120.  
  121. ;
  122. ;  CURRENT USER/DISK INDICATOR
  123. ;
  124. CINDIC:
  125.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  126.  
  127. ;
  128. ;  DMA ADDRESS FOR DISK TRANSFERS
  129. ;
  130. DMADR:
  131.     DW    80H    ; TBUFF AREA
  132.  
  133. ;
  134. ;  NAMED DIRECTORY INFORMATION
  135. ;
  136. NDRADR:
  137.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  138. NDNAMES:
  139.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  140. DNFILE:
  141.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  142.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  143.  
  144. ;
  145. ;  REQUIREMENTS FLAGS
  146. ;
  147. EPREQD:
  148.     DB    000H    ; EXTERNAL PATH?
  149. MCREQD:
  150.     DB    0FFH    ; MULTIPLE COMMAND LINE?
  151. MXREQD:
  152.     DB    000H    ; MAX USER/DISK?
  153. UDREQD:
  154.     DB    000H    ; ALLOW USER/DISK CHANGE?
  155. PUREQD:
  156.     DB    000H    ; PRIVILEGED USER?
  157. CDREQD:
  158.     DB    000H    ; CURRENT INDIC AND DMA?
  159. NDREQD:
  160.     DB    000H    ; NAMED DIRECTORIES?
  161. Z2CLASS:
  162.     DB    0    ; CLASS 0
  163.     DB    'ZCPR2'
  164.     DS    10    ; RESERVED
  165.  
  166. ;
  167. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  168. ;
  169. ;******************************************************************
  170. ;
  171.  
  172. ;
  173. ;  Start of Program
  174. ;
  175. start:
  176.     lda    mcavail    ;multiple commands available?
  177.     ora    a    ;0=no
  178.     jz    mcerr
  179.     call    codend    ;allocate buffer space
  180.     shld    oldcmd    ;256 bytes for old command line
  181.     lda    fcb+1    ;check for option char
  182.     cpi    ' '    ;no option if <sp>
  183.     jz    run    ;run command
  184.     cpi    'S'    ;setup?
  185.     jz    setup
  186.     call    banner    ;print banner
  187.     call    print    ;print help message
  188.     db    cr,lf,'STARTUP is used to execute an initial set of commands'
  189.     db    cr,lf,'  under ZCPR2 with Multiple Commands implemented.'
  190.     db    cr,lf
  191.     db    cr,lf,'STARTUP is invoked by one of the following command'
  192.     db    cr,lf,'  lines:'
  193.     db    cr,lf
  194.     db    cr,lf,'    STARTUP        <-- execute built-in commands'
  195.     db    cr,lf,'    STARTUP SETUP    <-- define built-in commands'
  196.     db    cr,lf,'                (only the S in SETUP is needed)'
  197.     db    cr,lf,0
  198.     ret
  199. ;
  200. ;  Multiple Command Line Buffer not Supported -- Fatal Error
  201. ;
  202. mcerr:
  203.     call    banner
  204.     call    print
  205.     db    cr,lf,'Multiple Command Line is not supported.'
  206.     db    cr,lf,'STARTUP is based on the use of this buffer,'
  207.     db    cr,lf,'and STARTUP cannot function without it.'
  208.     db    cr,lf,'STARTUP is aborting.'
  209.     db    cr,lf,0
  210.     ret
  211. ;
  212. ;  Print Startup Banner
  213. ;
  214. banner:
  215.     call    print
  216.     db    'STARTUP, Version '
  217.     db    vers/10+'0','.',(vers mod 10)+'0'
  218.     db    0
  219.     ret
  220.  
  221. ;
  222. ;  Run STARTUP Command Line
  223. ;
  224. run:
  225.     lhld    oldcmd    ;pt to save buffer
  226.     xchg        ;... in DE
  227.     lhld    mcadr    ;get base of command line
  228.     mov    a,m    ;low-order address in A
  229.     inx    h
  230.     mov    h,m    ;high-order address in H
  231.     mov    l,a    ;low-order address in L
  232. run0:
  233.     mov    a,m    ;get char
  234.     stax    d    ;put it
  235.     inx    h    ;pt to next
  236.     inx    d
  237.     ora    a    ;end of line?
  238.     jnz    run0
  239.     lhld    mcadr    ;pt to base address of command line
  240.     push    h    ;save ptr
  241.     lxi    d,4    ;pt to command line byte
  242.     dad    d    ;hl pts to command line byte
  243.     xchg        ;... de pts to it
  244.     pop    h    ;get ptr to base
  245.     mov    m,e    ;store address
  246.     inx    h
  247.     mov    m,d
  248.     xchg        ;hl pts to first byte of command line
  249.     shld    byte1    ;save ptr in case of error
  250.     lxi    d,cmnd    ;pt to STARTUP Buffer
  251.     push    h    ;save HL for now
  252.     lhld    mcadr    ;address of multiple command line buffer
  253.     inx    h    ;skip ptr
  254.     inx    h    ;pt to buffer size
  255.     mov    b,m    ;... in B
  256.     pop    h    ;restore HL
  257.     call    stline    ;store line
  258.     jz    err    ;line too long?
  259.     dcx    h    ;pt to ending null
  260.     xchg
  261.     lhld    oldcmd    ;pt to old command line
  262.     xchg        ;... in DE
  263.     call    stline
  264.     jz    err    ;line too long?
  265.     ret
  266. err:
  267.     call    banner
  268.     call    print
  269.     db    cr,lf,7,'** Command Line too Long -- Abort **',0
  270.     lhld    byte1    ;clear line
  271.     mvi    m,0
  272.     ret
  273. ;
  274. ;  Store commands pted to by DE in buffer pted to by HL; B=space left in buffer
  275. ;
  276. stline:
  277.     ldax    d    ;get byte of command
  278.     mov    m,a    ;store it
  279.     inx    h    ;pt to next
  280.     inx    d
  281.     dcr    b    ;count down
  282.     jz    stlerr
  283.     ora    a    ;done?
  284.     jnz    stline
  285.     mvi    a,0ffh    ;set no error
  286.     ora    a
  287.     ret
  288. stlerr:
  289.     xra    a    ;error
  290.     ret
  291. ;
  292. ;  STARTUP Setup Mode
  293. ;
  294. setup:
  295.     call    banner
  296. cloop:
  297.     call    print
  298.     db    cr,lf,'STARTUP Setup Command (?=Help)? ',0
  299.     call    capin    ;get response, capitalize, and echo
  300.     cpi    'C'    ;define command line
  301.     jz    setupc
  302.     cpi    'D'    ;display values
  303.     jz    setupd
  304.     cpi    'X'    ;exit
  305.     jz    setupx
  306.     call    print    ;print help message
  307.     db    cr,lf,'  Setup Mode Commands are --'
  308.     db    cr,lf,'    C -- Define STARTUP Multiple Command Line'
  309.     db    cr,lf,'    D -- Display STARTUP Values'
  310.     db    cr,lf,'    X -- Exit and Optionally Rewrite STARTUP'
  311.     db    0
  312.     jmp    cloop
  313. ;
  314. ;  Set STARTUP Multiple Command Line Buffer Contents
  315. ;
  316. setupc:
  317.     call    print
  318.     db    cr,lf,'    Current Multiple Command Buffer Contents is --',cr,lf,0
  319.     lxi    h,cmnd    ;pt to line
  320.     call    pstr
  321.     call    print
  322.     db    cr,lf,'    New Line? ',0
  323.     xra    a    ;no caps
  324.     call    bbline    ;get line from user
  325.     lxi    d,cmnd    ;pt to command line
  326. copy:
  327.     mov    a,m    ;get byte
  328.     stax    d    ;put byte
  329.     inx    h    ;pt to next
  330.     inx    d
  331.     ora    a    ;done?
  332.     jnz    copy    ;fall thru to setupd to display result
  333. ;
  334. ;  Display Values
  335. ;
  336. setupd:
  337.     call    print
  338.     db    cr,lf
  339.     db    cr,lf,'    Multiple Command Line --',cr,lf,'    --->',0
  340.     lxi    h,cmnd    ;pt to buffer
  341.     call    pstr    ;print it
  342.     call    crlf    ;new line
  343.     jmp    cloop    ;get next command
  344.  
  345. ;
  346. ;  Exit to OS with optional rewrite of STARTUP.COM
  347. ;
  348. setupx:
  349.     call    print
  350.     db    cr,lf,'    Do you wish to update STARTUP (Y/N/<CR>=Y)? ',0
  351.     call    capin    ;get response, capitalize, and echo
  352.     cpi    'N'    ;no?
  353.     rz        ;done if so
  354.     call    print
  355.     db    cr,lf,'    STARTUP will write file to current disk/user',0
  356. file:
  357.     call    print
  358.     db    cr,lf,'    STARTUP File is ',0
  359.     lxi    h,sfcb+1    ;pt to FN field
  360.     call    prfn    ;print file name
  361.     call    print
  362.     db    cr,lf,'    Enter New File Name or <CR> if OK: ',0
  363.     mvi    a,0ffh    ;capitalize
  364.     call    bbline    ;get line
  365.     ora    a    ;any input?
  366.     jz    write
  367.     lxi    d,sfcb    ;pt to FCB
  368.     call    fname    ;convert into FCB
  369.     mov    a,b    ;anything other than default given?
  370.     ana    c
  371.     cpi    0ffh    ;must be FF if both defaults
  372.     jz    file
  373.     call    print
  374.     db    cr,lf,'    ** Disk or User Specification Ignored **',0
  375.     jmp    file
  376. prfn:
  377.     mvi    b,8    ;8 chars
  378.     call    prch
  379.     mvi    a,'.'
  380.     call    cout
  381.     mvi    b,3    ;3 chars
  382. prch:
  383.     mov    a,m    ;get char
  384.     call    cout    ;output it
  385.     inx    h    ;pt to next
  386.     dcr    b    ;count down
  387.     jnz    prch
  388.     ret
  389. capin:
  390.     call    cin    ;get response
  391.     call    caps
  392.     jmp    cout
  393. ;
  394. ;  Begin procedure to write file to disk
  395. ;
  396. write:
  397.     call    print
  398.     db    cr,lf,'    Writing File ',0
  399.     lxi    h,sfcb+1    ;print file name
  400.     call    prfn
  401.     call    print
  402.     db    ' to Disk ... ',0
  403.     lxi    d,sfcb    ;pt to fcb
  404.     call    initfcb    ;init it
  405.     call    f$delete    ;delete it
  406.     call    initfcb    ;reinit it
  407.     call    f$make    ;create file
  408.     cpi    0ffh    ;error?
  409.     jz    derr
  410.     call    codend    ;get end of code
  411.     call    shftlh    ;shift HL left 1 bit so we have a block (128 byte)
  412.             ;count
  413.     mov    b,h    ;count in b
  414.     lxi    h,100h    ;pt to start of program
  415. writel:
  416.     xchg        ;de is dma address
  417.     push    h    ;save HL
  418.     mvi    c,26    ;set dma address
  419.     call    bdos
  420.     lxi    h,80h    ;pt to next block
  421.     dad    d
  422.     pop    d    ;get de (ptr to sfcb), hl pts to next block
  423.     call    f$write    ;write block to disk
  424.     ora    a    ;0=ok
  425.     jnz    derr
  426.     dcr    b    ;count down
  427.     jnz    writel
  428.     call    f$close    ;close file
  429.     call    print
  430.     db    'Done',0
  431.     ret
  432. derr:
  433.     call    print
  434.     db    cr,lf,'    Disk Output Error -- Aborting',0
  435.     ret
  436.  
  437. ;
  438. ;  Buffers
  439. ;
  440. oldcmd:
  441.     ds    2    ;original command line
  442. byte1:
  443.     ds    2    ;ptr to first byte
  444. cmnd:
  445.     db    0    ;empty line initially
  446.     ds    256    ;buffer for command line
  447.  
  448. ;  FCB to write STARTUP to
  449. sfcb:
  450.     db    0    ;current disk
  451.     db    'STARTUP COM'
  452.     ds    4
  453.     ds    16
  454.     ds    4
  455.  
  456.     end
  457.