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 / ZCPR33 / S-Z / VFILER43.LBR / VFMAIN.LZB / VFMAIN.LIB
Text File  |  2000-06-30  |  12KB  |  513 lines

  1. ;===========================================================================
  2. ;
  3. ; VFMAIN.Z80 - Main Code Block
  4. ;
  5. ;===========================================================================
  6.  
  7.  
  8. ; ZCPR3 Program Header
  9.  
  10.      if    z3env ne 0    ; External environment
  11.  
  12.     jp    start
  13.     db    'Z3ENV'        ; This is a zcpr3 utility
  14.     db    1        ; External environment descriptor
  15. z3eadr:    dw    z3env
  16.  
  17.      else            ; Internal environment
  18.  
  19.     MACLIB    Z3BASE.LIB
  20.     MACLIB    SYSENV.LIB
  21.  
  22. z3eadr:
  23.     jp    start
  24.     sysenv
  25.  
  26.      endif    ; z3env ne 0
  27.  
  28. ;---------------------------------------------------------------------------
  29.  
  30. ; Configuration and reference data
  31.  
  32.     dw    ctab1        ; Addresses of command tables for reference
  33.     dw    ctab2
  34.     dw    gtable
  35.  
  36.     db    'CONFIG'    ; Marker in code
  37.  
  38. leadadr:
  39.     db    mleadin        ; Macro leadin character here
  40. npause:
  41.     db    tdelay        ; Delay time on screen refresh after macro error
  42. macfladr:
  43.     db    macflag        ; Allow immediate execution of macros 0..9
  44.  
  45.  
  46. OPTIONS:            ; Begin options configurable with 'O' cmd
  47.                 ; DO NOT CHANGE ORDER
  48.  
  49. qryrepa:            ; #1
  50.     db    qryrep        ; Single file replace query option
  51. qrygrpa:            ; #2
  52.     db    qrygrp        ; Multiple file replace query option
  53. qryarca:            ; #3
  54.     db    qryarc        ; Query on archive replacement
  55. qryvfya:            ; #4
  56.     db    qryvfy        ; Verify query option
  57. vflag:                ; #5
  58.     db    vfydflt        ; Verify default if no query or no answer
  59. nosysa:                ; #6
  60.     db    nosys        ; Supress display of SYS files
  61. defalfa:            ; #7
  62.     db    defalpha    ; Initial file sorting mode (FF for name)
  63.  
  64. shwait:                ; Flag also saved on stack with options
  65.     db    0
  66.  
  67. nopt    equ    $ - options    ; Number of option flags to save/restore
  68.  
  69. ;---------------------------------------------------------------------------
  70.  
  71. ; Initialization Code
  72.  
  73.      if    z3env ne 0    ; External environment
  74.  
  75. start:
  76.     ld    hl,(z3eadr)    ; Pt to zcpr3 environment
  77.  
  78.      else            ; Internal environment
  79.  
  80. start:
  81.     ld    hl,z3eadr    ; Pt to zcpr3 environment
  82.  
  83.      endif    ; z3env ne 0
  84.  
  85.     call    z3vinit        ; Initialize the zcpr3 env and the vlib env
  86.     call    tinit        ; Initialize the terminal.
  87.  
  88. ; For ZRDOS 1.3 and later, we disable the PUBLIC facility for
  89. ; the duration of VFILER.  It is re-enabled in OS$CCP exit.
  90.  
  91.     ld    de,126        ; Offset to ZRDOS public bytes
  92.     add    hl,de        ; (Note: HL value preserved above)
  93.     ld    de,pubyts    ; Point to save area
  94.     ld    a,(hl)        ; Drives
  95.     ld    (de),a        ; Save it
  96.     ld    (hl),0        ; Clear it
  97.     inc    hl
  98.     inc    de
  99.     ld    a,(hl)        ; Users
  100.     ld    (de),a        ; Save it
  101.     ld    (hl),0        ; Clear it
  102.  
  103.  
  104.     ld    a,0ffh        ; Set initflag to show first time through
  105.     ld    (initflag),a
  106.  
  107.      if    not warmboot    ; Set opsys stack pointer
  108.     ld    (stack),sp
  109.      endif            ; Not warmboot
  110.  
  111.     call    idu        ; Log in original and requested directories
  112.  
  113.  
  114. ;---------------------------------------------------------------------------
  115.  
  116. ;  Once Environment is Initialized, One of Two Major Functions will be
  117. ;  performed:
  118. ;
  119. ;    1.  VFILER will be installed as a Shell if invoked explicitly
  120. ;        by user command
  121. ;
  122. ;    2.  The VFILER Function will be performed if VFILER is invoked
  123. ;        by ZCPR3 as a Shell and ZEX is not Running
  124.  
  125.  
  126. ; Check to see if VFILER was invoked as a shell
  127.  
  128.     call    qshell        ; Get and test message from zcpr3
  129.     jr    z,funct2    ; If shell invocation, branch to function 2
  130.  
  131.  
  132. ;---------------------------------------------------------------------------
  133.  
  134. ; FUNCTION 1:  User Invocation -- Set Up VFILER as a Shell
  135.  
  136.  
  137. funct1:
  138.     call    shtest        ; Test for adequate system support
  139.     call    getefcb        ; Determine name of program
  140.     jr    z,shgo1        ; Name not given, so use default
  141.  
  142.     inc    hl        ; Pt to name
  143.     ld    de,filercmd    ; Define name of program
  144.     ld    b,8
  145.     call    moveb        ; Copy name
  146.  
  147. shgo1:
  148.     ld    hl,filercmd    ; Establish shell
  149.     call    shpush        ; Push onto shell stack
  150.     jr    z,shgo2        ; Branch if OK
  151.  
  152.     call    vprint
  153.     db    'Shell Stk Full',0
  154.     ret
  155.  
  156.         ; Establish File Selection
  157.  
  158. shgo2:
  159.     xor    a        ; 0 = put system mask.
  160.     ld    (shwait),a    ; Turn off shell wait flag on user invocation
  161.     call    filemask    ; Set system file spec.
  162.  
  163.         ; Establish Initial File Pointer
  164.  
  165.     call    sysfn2        ; Get pointer to system file #2
  166.     ld    de,joker    ; Copy in *.*
  167.     ex    de,hl
  168.     ld    b,11
  169.     call    movea
  170.  
  171.         ; Save initial options on stack
  172.  
  173.     call    putopt
  174.  
  175.         ; Initialize Shell message.
  176.  
  177.     xor    a        ; No wait
  178.     ld    (shwait),a
  179.  
  180.         ; Shell Successfully installed
  181.  
  182.      if    instmsg
  183.     call    vprint
  184.     db    ' VFILER Installed',0
  185.      endif
  186.  
  187.         ; Check for pending command or ZEX or SUBMIT running
  188.  
  189.     call    getcl2        ; See if any more commands pending
  190.     jr    nz,goccp    ; If so, return to CCP
  191.     call    getzrun        ; See if ZEX is running
  192.     jr    nz,goccp    ; If so, return to CCP
  193.     call    z33chk        ; See if ZCPR33 is present
  194.     jr    nz,runsh    ; If not, no way to check for SUBMIT
  195.     call    getsrun        ; See if SUBMIT is running
  196.     jr    z,runsh        ; If not, start running the shell now
  197.  
  198.         ; Command pending. Start execution via return to CCP.
  199.  
  200. goccp:
  201.     jp    chain2        ; Set idu into command line and go
  202.  
  203.  
  204. ;---------------------------------------------------------------------------
  205.  
  206. ; FUNCTION 2: Shell Invocation -- Run VFILER and Perform Main Function
  207.  
  208. runsh:
  209. funct2:
  210.     xor    a        ; Set no shell message
  211.     call    putcst
  212.     call    setup        ; Init buffers and pointers
  213.     call    stackset    ; Setup stack
  214.     call    getopt        ; Restore option flags
  215.  
  216.         ; Process Initial Help if Available and Requested
  217.  
  218.      if    bihelp        ; Built-in help available?
  219.     ld    a,(fcb+1)    ; Check for initial help
  220.     cp    '/'
  221.     jr    nz,runsh1
  222.     call    vcls        ; Clear screen first
  223.     call    helpmsg        ; Print help message
  224.     call    sak        ; Strike any key to continue
  225.     jr    runsh2
  226. runsh1:
  227.      endif            ; Bihelp
  228.  
  229.         ; Check for SAK Delay Before Resuming VFILER
  230.  
  231.     ld    a,(shwait)
  232.     or    a
  233.     call    nz,sak        ; Pause for input
  234.     xor    a
  235.     ld    (shwait),a
  236.  
  237.         ; Begin VFILER Processing
  238.  
  239. runsh2:
  240.     call    fileload    ; Load files, return CANFLG in A
  241.     push    af
  242.     call    setscr        ; Set up screen display variables
  243.     pop    af
  244.     jr    z,runsh4    ; Continue if ok
  245.  
  246. ; No files in current DIR
  247. ;    - (or not enough Storage to hold them)
  248. ;    - Build new screen
  249.  
  250. runsh2e:
  251.     call    rebuild        ; Rebuild entire screen
  252.     call    filelerr    ; Report whatever error
  253.     jr    loop        ; Get next command
  254.  
  255. ; Entry Point for Command Processing
  256. ; Build and Display Screen and Input/Process Command
  257.  
  258. runsh4:
  259.     call    ringempt    ; Check ring empty
  260.     jr    z,runsh2e    ; Tell the user
  261.     ld    a,(initflag)    ; See if first time here
  262.     or    a
  263.     jr    z,runsh4a    ; If not, skip setting pointer from sys file 2
  264. setptr:
  265.     call    sysfn2        ; Get pointer to system file #2
  266.     ld    de,d$fcb+1    ; DE points to file name in FCB
  267.     ld    b,11        ; Move 11 bytes
  268.     call    movea
  269.     jp    goto1        ; Use goto (J) command
  270. runsh4a:
  271.     call    rebuild        ; Rebuild entire screen display
  272.     jr    loopfn        ; Continue
  273.  
  274. ; Entry Point for Command Return
  275. ; Refresh and Display Screen and Input/Process Command
  276.  
  277. runsh5:
  278.     call    refresh        ; Update file portion of display.
  279.     call    setcur        ; Ensure cursor is displayed.
  280.  
  281. ; Display Current File and Input/Process Command
  282.  
  283. loopfn:
  284.     call    dispcfn        ; Display current file name
  285.  
  286. ; Input/Process Command
  287.  
  288. loop:
  289.     call    stackset    ; Reset stack
  290.     call    atcmd        ; Position at command prompt
  291.     call    dkeyin        ; Wait for character from keyboard
  292.     ld    b,a        ; Save it in B
  293.     call    erclr        ; Clear any old error line
  294.     call    atcmd        ; Reposition to command prompt
  295.     ld    a,(leadadr)    ; Get macro leadin character into B
  296.     cp    b        ; Is char the immediate macro invocation char?
  297.     jr    z,loop2        ; If so, branch
  298.  
  299.     ld    a,mnote        ; Is char macro help invocation char?
  300.     cp    b
  301.     jr    z,macpro
  302.  
  303.     ld    a,(macfladr)    ; See if direct processing of 0..9 macros
  304.     or    a        ; ..is allowed
  305.     jr    z,loop1        ; If not, branch
  306.  
  307.     ld    a,b        ; Get user char into A
  308.     cp    '0'
  309.     jr    c,loop1        ; Branch if less than '0'
  310.     cp    '9'+1
  311.     jr    c,macpro    ; If '9' or less, process macro
  312.  
  313. loop1:
  314.     call    erclr        ; Clear error message line
  315.     call    ctproc        ; Process possible table command; if we return
  316.                 ; ..the command was invalid
  317.  
  318.     call    ermsg
  319.     db    bel,'Invalid Cmd: ',0
  320.     call    dispchar    ; Display bad cmd char (in B)
  321.     jr    loop        ; Continue
  322.  
  323. loop2:                ; We have a macro request
  324.     call    vprint
  325.     db    ' Macro: ',0
  326.     call    dkeyin        ; Get key for macro
  327.     call    caps
  328.     cp    ' ' + 1        ; If control char or space, back to beginning
  329.     jr    c,loop
  330.     ld    b,a        ; Move character to B
  331.  
  332. macpro:
  333.     ld    a,b        ; Get char back into A
  334.     call    cout        ; Display choice
  335.     call    erclr        ; Clear error message line
  336.     ld    a,b        ; Get macro char back again
  337.     call    cmacro        ; Process macro command
  338.                 ; If we return, macro was not found
  339.     ld    b,a        ; Save command
  340.     call    ermsg
  341.     db    bel,'No User Function: ',0
  342.     call    dispchar    ; Display the character (in B)
  343.     ld    a,(noteflag)    ; See if macro help screen was displayed
  344.     or    a
  345.     jp    z,loop        ; If not, just go back to loop
  346.  
  347.                 ; Pause before refreshing screen
  348.     call    getspeed    ; Get processor speed
  349.     ld    b,a        ;   into B
  350.     ld    hl,(npause)    ; Get pause time in 0.1 secs
  351.     ld    h,0        ; Use only the low byte
  352.     call    pause
  353.     jp    runsh4a        ; Back to loop with refresh
  354.  
  355. dispchar:            ; Display bad char in B
  356.     ld    a,b        ; Get char
  357.     cp    ' '        ; Expand if less than space
  358.     jr    nc,dispchar1
  359.     ld    a,'^'        ; Control
  360.     call    cout
  361.     ld    a,b        ; Get byte
  362.     add    a,'@'        ; Convert to letter
  363. dispchar1:
  364.     jp    cout        ; Display and return
  365.  
  366. ;---------------------------------------------------------------------------
  367.  
  368. ; E X I T  (return to CCP; entry point for VFILER exit)
  369.  
  370. os$ccp:
  371.     call    shpop        ; Clear shell stack
  372.      if    exitcls
  373.     call    vcls        ; Clear screen on exit.
  374.      else
  375.     ld    hl,cpmadr    ; Command line
  376.     call    gotoxy        ; Position the cursor
  377.      endif            ; Exitcls
  378.  
  379. ; Entry point for command line exec
  380.  
  381. os$ccp1:
  382.     call    resdma        ; Reset dma address
  383.     ld    bc,(du$orig)    ; Get and set original du:
  384.     call    logud
  385.  
  386.     ld    hl,(z3eadr)    ; Environment address
  387.     ld    de,126        ; Offset to ZRDOS public bytes
  388.     add    hl,de
  389.     ex    de,hl        ; To DE
  390.     ld    hl,pubyts    ; Point to save area
  391.     ld    a,(hl)
  392.     ld    (de),a
  393.     inc    hl
  394.     inc    de
  395.     ld    a,(hl)
  396.     ld    (de),a        ; Public reinstated
  397.  
  398.      if    warmboot
  399.     jp    os$base
  400.      endif            ; Warmboot
  401.  
  402.      if    not warmboot
  403.     ld    hl,(stack)    ; Restore stack pointer
  404.     ld    sp,hl
  405.     ret            ; Return to ccp
  406.      endif            ; Not warmboot
  407.  
  408.  
  409. ;---------------------------------------------------------------------------
  410.  
  411. ; CTPROC - Process command from table
  412.  
  413. ctproc:
  414.     call    ringempt    ; Check ring empty
  415.     ld    hl,ctab2    ; In case it is
  416.     jr    z,ctpr1        ; Only ctab2 commands available
  417.     ld    hl,ctable    ; Pt to table
  418.     ld    a,(hl)        ; Any cursor commands?
  419.     or    a
  420.     jr    nz,ctpr1
  421.     ld    hl,ctab1
  422.  
  423. ; Command table scanner
  424. ;    HL = Table
  425. ;    B  = Command Letter
  426.  
  427. ctpr1:
  428.     ld    a,(hl)        ; Get table command char
  429.     or    a        ; End of table?
  430.     ret    z        ; Done if so
  431.     cp    b        ; Match?
  432.     inc    hl        ; -> command wheel flag
  433.     jr    z,ctpr2        ; Br if command found.
  434.  
  435.     inc    hl        ; Skip to next entry
  436.     inc    hl
  437.     inc    hl
  438.     jr    ctpr1
  439.  
  440. ctpr2:
  441.      if    remote
  442.     call    getwhl        ; Get current wheel status
  443.     or    (hl)        ; Combine status and command wheel flag.
  444.     jr    nz,ctpr3    ; Continue if wheel or safe command.
  445.     call    ermsg        ; Tell user bad news
  446.     db    'NOT Wheel!',0
  447.     jp    loop
  448. ctpr3:
  449.      endif
  450.  
  451.     inc    hl        ; -> command address
  452.     ld    a,(hl)        ; Get low command addr byte.
  453.     inc    hl
  454.     ld    h,(hl)        ; Get high
  455.     ld    l,a
  456.     ex    (sp),hl        ; Address on stack
  457.     ret            ; "jump" to routine
  458.  
  459. ;---------------------------------------------------------------------------
  460.  
  461. ; Tests for Adequate System Support
  462.  
  463. shtest:
  464.         ; Check for Presence of Shell Stack
  465.  
  466.     call    getsh2        ; Get shell stack data
  467.     jr    nz,shtest2    ; On to test 2 if OK
  468.  
  469.     pop    af        ; Clear stack
  470.     call    vprint
  471.     db    'No Shell Stk',0
  472.     ret
  473.  
  474.         ; Check for Adequate Shell Stack Size
  475.  
  476. shtest2:
  477.      if    usestk        ; Get required length less one into A
  478.     ld    a,30-1
  479.      else
  480.     ld    a,20-1
  481.      endif
  482.  
  483.     cp    e
  484.     jr    c,shtest3    ; Branch to test 3 if OK
  485.  
  486.     pop    af        ; Clean up stack
  487.     call    vprint
  488.     db    'SH STK too small',0
  489.     ret            ; Return to operating system
  490.  
  491.  
  492.         ; Check for Presence of Command Line
  493.  
  494. shtest3:
  495.     call    getcl1        ; Get command line data
  496.     jr    nz,shtest4    ; Branch to test 4 if OK
  497.  
  498.     pop    af        ; Clear stack
  499.     call    vprint
  500.     db    'No Cmd Buf',0
  501.     ret
  502.  
  503.         ; Check for TCAP
  504.  
  505. shtest4:
  506.     call    cls        ; Try to clear screen
  507.     ret    nz        ; Return if OK
  508.  
  509.     pop    af        ; Clean up stack
  510.     call    vprint
  511.     db    'Bad TCAP',0
  512.     ret
  513.