home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / uploads / conctrl.lbr / CONCTRL.ZZ0 / CONCTRL.Z80
Encoding:
Text File  |  1993-06-07  |  4.0 KB  |  148 lines

  1. Z3ENV    DEFL    0FE00H
  2. FCB    EQU    5CH
  3. BDOS    EQU    5
  4. PRTSTR    EQU    9
  5. CR    EQU    0DH
  6. LF    EQU    0AH
  7. BEL    EQU    07H
  8.  
  9.     EXTRN    Z3INIT,GETIOP,GETCL2
  10.     EXTRN    GETEFCB,GETQUIET
  11.     EXTRN    CLRCL,IFEND,INSTR
  12.  
  13. START:    JP    BEGIN
  14.     DB    'Z3ENV',3    ; Tool ID, allow high ORG
  15. Z3EADR:
  16.     DW    Z3ENV        ; Z33/BGii will poke this anyway
  17.     DW    START        ; Linker will calculate this
  18. BEGIN:    LD    HL,(Z3EADR)
  19.     CALL    Z3INIT        ; Educate Z3LIB 
  20.     LD    HL,HLPMSG    ; Convenient source
  21.     LD    DE,STRING    ; Target buffer
  22.     LD    BC,STREND-STRING; String length
  23.     LDIR            ; For re-entrance, move 'em out
  24.     EX    DE,HL
  25.     LD    (HL),B        ; B's got a NULL, plant it
  26.     LD    D,B        ; Use to zero out D register
  27.     CALL    GETIOP        ; Get IOP start
  28.     LD    E,12H        ; DE = 0012H
  29.     JR    NZ,CHKOPT    ; No IOP, use BIOS jump entry
  30.     LD    A,(HL)
  31.     OR    A
  32.     JR    NZ,CHKOPT
  33. DOBIOS:    LD    HL,(1)        ; HL = BIOS cold boot jump addr.
  34.     LD    E,09H        ; DE = 0009H
  35. CHKOPT:    ADD    HL,DE
  36.     LD    A,(FCB+2)    ; Check for user options
  37.     CP    '/'        ; Help query?
  38.     JR    Z,HELP
  39.     CP    'N'        ; Force CON: output on?
  40.     JR    Z,CONON
  41.     CP    'F'        ; Force CON: output off?
  42.     JR    Z,FRCOFF
  43.     LD    A,(HL)        ; Get jump address contents
  44.     CP    0C9H        ; Is it already a RET?
  45.     JR    Z,CONON        ; Then patch it back to a JP
  46.     CP    0C3H        ; JP is only acceptable byte
  47.     JR    Z,CONOFF    ; OK, let 'er rip
  48.     CALL    GETIOP        ; Re-test for IOP, use BIOS?
  49.     JR    NZ,DOBIOS    ; No IOP means damaged BIOS
  50.     LD    DE,BIOSER    ; So point to msg and go home
  51.     JR    DOMSG
  52. CONOFF:
  53.     EX    DE,HL        ; Otherwise stash address in DE
  54.     CALL    GETCL2        ; Are there pending commands?
  55.     EX    DE,HL        ; Swap back registers
  56.     JR    Z,NOCMD        ; Barf if no further commands
  57.     PUSH    HL        ; Otherwise stash addr. on stack
  58.     CALL    GETEFCB        ; Get Z3 External FCB address
  59.     JR    Z,NOEFCB    ; No EFCB, use name "CONCTRL"
  60.     LD    B,8        ; Down-counter in B
  61.     EX    DE,HL        ; EFCB start (drive code) in DE
  62.     LD    HL,STRING-1    ; One byte below buffer into HL
  63.  
  64. LOOP:    INC    HL        ; Bump buffer pointer
  65.     INC    DE        ; Bump EFCB pointer
  66.     LD    A,(DE)        ; Get character from EFCB
  67.     AND    7FH        ; Mask out any attribits
  68.     CP    ' '        ; Done?
  69.     JR    Z,DONE        ; Done if Z, (HL) at terminator
  70.     LD    (HL),A        ; Otherwise, character to buffer
  71.     DJNZ    LOOP        ; Loop if not finished
  72.     INC    HL        ; Bump to terminator position
  73.  
  74. DONE:    LD    (HL),0        ; Poke a NULL terminator
  75.  
  76. NOEFCB:
  77.     CALL    GETCL2        ; Pending command is start
  78.     LD    DE,STRING    ; String to compare
  79.     CALL    INSTR        ; Search
  80.     POP    HL        ; Get back CONOUT jump addr
  81.     JR    NZ,UNBAL    ; Search failed, bitch 'n barf
  82.  
  83. FRCOFF:    CALL    WAITIT        ; Tell user to wait
  84.     LD    (HL),0C9H    ; Patch the jump to a RET
  85.     RET            ; Return to Z, CONOUT disabled
  86.  
  87. CONON:    LD    (HL),0C3H    ; Poke (HL) to a JP
  88.     RET            ; Return to Z, CONOUT enabled
  89.  
  90. HELP:    LD    DE,HLPMSG    ; Point to message
  91.     XOR    A        ; Force output
  92.     JR    DOMSG        ; Exit via BDOS
  93.  
  94. UNBAL:    CALL    IFEND        ; Decrement IF level
  95.     JR    NZ,UNBAL    ; Until none active
  96.     CALL    CLRCL        ; Discard rest of command line
  97.     LD    DE,UNBAMG    ; Point to message
  98.     JR    MSG        ; (Conditional) bitch 'n barf
  99.  
  100. NOCMD:    LD    DE,NCOMMG    ; Point to message
  101.     JR    MSG        ; etc.
  102.  
  103. WAITIT:
  104.     PUSH    HL        ; Save IOP CONOUT jump pointer
  105.     LD    DE,WAITMG    ; Point to message
  106.     CALL    MSG        ; Conditionally print it
  107.     POP    HL        ; Restore pointer
  108.     RET            ; Return to caller
  109.  
  110. MSG:    CALL    CONON        ; Make sure we're not muzzled
  111.     CALL    GETQUIET    ; Does Z3 want us stifled?
  112. DOMSG:    LD    C,PRTSTR    ; BDOS's Print string function #
  113.     JP    Z,BDOS        ; Exit via BDOS if loud
  114.     RET            ; Just return to Z if quiet
  115.  
  116.  
  117. ;            MESSAGES
  118.  
  119. UNBAMG:
  120.  DB BEL,'Unbalanced CONCTRL invocation, aborting.',CR,LF,'$'
  121.  
  122. NCOMMG:
  123.  DB BEL,'No pending commands, CONCTRL aborting.',CR,LF,'$'
  124.  
  125. WAITMG:    DB    'Stand by.....$'
  126.  
  127. BIOSER:    DB    BEL,'WARNING: BROKEN BIOS!$'
  128.  
  129. HLPMSG:
  130.  DB 'CONCTRL, Version 1.0',CR,LF
  131.  DB 'Syntax:',CR,LF
  132.  DB ' CONCTRL OFF  (turns off the CON: device output)',CR,LF
  133.  DB ' CONCTRL ON   (turns on  the CON: device output)',CR,LF
  134.  DB 'CONCTRL with no tail toggles the CON: output state.',CR,LF
  135.  DB 'This mode is for balanced command lines only, such as:',CR,LF
  136.  DB ' CONCTRL;cmd1;cmd2;cmd3;CONCTRL (cmd?=silent commands)',CR,LF
  137.  DB '$'
  138.  
  139.  
  140. ;    DATA (initialized, bytes defined for reference only)
  141.  
  142.     DSEG
  143.  
  144. STRING:    DB    'CONCTRL'
  145. STREND:    DS    4        ; Enough extra for 12345678 & 0
  146.  
  147.     END
  148.