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 / SLTRAP.LBR / SLTRAP.ZZ0 / SLTRAP.Z80
Text File  |  2000-06-30  |  12KB  |  629 lines

  1. ; SLTRAP RCP
  2. ;  By Paul Pomerleau
  3. ;  January 13, 1986.
  4. ;
  5. ;  This RCP traps all output going to the console or the printer 
  6. ; and deposits it into a file.  Trapping starts with:
  7. ;   'SOPEN filename.typ'  (or LOPEN)
  8. ; and ends with:
  9. ;   'SCLOSE' (or LCLOSE)
  10. ;
  11. ;  This code assembles with ZASM (Cromemco) ONLY!
  12. ;
  13. ;  Maybe someday I (or someone else) will comment this better,
  14. ; clean up the code (It's very wasteful).  For now, please except
  15. ; my apologies.
  16.  
  17. VERS    equ    12
  18. BDOS    equ    5
  19.  
  20. *INCLUDE1    Z3BASE.LIB    ; USE BASE ADDRESSES
  21.  
  22. ;
  23. ;  SYSTEM Entry Point
  24. ;
  25.     org    RCP        ; passed for Z3BASE
  26.     db    'Z3RCP'        ; Flag for Package Loader
  27.     db    06        ; How long each name is
  28. CTAB:
  29.     db    'H     '    ; Help for RCP
  30.     dw    CLIST
  31.     db    'SOPEN '
  32.     dw    OPEN
  33.     db    'LOPEN '
  34.     dw    LOPEN
  35.     db    'KEY   '
  36.     dw    KEY
  37.     db    'SCLOSE'
  38.     dw    CLOSE
  39.     db    'LCLOSE'
  40.     dw    LCLOSE
  41. CTAB1:
  42.     db    0
  43. ;
  44. ;  Banner Name of Rcp:
  45. ;  Command List Routine
  46. ;
  47. CLIST:
  48.     ld    de,RCP$NAME
  49.     jp    STRING
  50.  
  51. ;
  52. ; Routines for SCR-TRAPing.  From here to end, all is neccessary.
  53. ;
  54. ORIGNAME    equ    5ch
  55. ONKEY        equ    '\' - '@'
  56. ;
  57. KEY:    ld    de,KEYSTR
  58.     call    STRING        ; Print msg
  59. GETKEY:    ld    e,0ffh
  60.     call    DCIO        ; Bring in a key
  61.     or    a
  62.     jr    z,GETKEY    ; Keep at it 'till we get a key
  63.     ld    (KEYON + 1),a    ; Save key
  64.     bit    7,a
  65.     jr    z,NOTHIGH    ; Check for high bit
  66.     push    af
  67.     ld    e,'~'        ; Print a ~
  68.     call    DCIO
  69.     pop    af
  70. NOTHIGH:
  71.     and    01111111b    ; Remove high bit
  72.     cp    ' '
  73.     jr    nc,NOTCTRL    ; Check for control char
  74.     push    af
  75.     ld    e,'^'        ; Print a '^'
  76.     call    DCIO
  77.     pop    af
  78.     add    a,'@'        ; Make normal char
  79. NOTCTRL:
  80.     ld    e,a
  81.     jp    DCIO        ; Print it
  82.  
  83. OPEN:    ld    a,(OPENFLG)    ; Check to see if a file is already open
  84.     or    a
  85.     jr    z,CONTOPEN    ; No
  86.     ld    de,ALREADY    ; Yes, print and abort
  87.     jp    STRING
  88. CONTOPEN:
  89.     ld    hl,FILE
  90.     ld    de,FILE + 1
  91.     ld    bc,35
  92.     xor    a
  93.     ld    (hl),a        ; Zap the whole FCB
  94.     ldir
  95.     ld    hl,ORIGNAME
  96.     ld    de,FILE
  97.     ld    bc,13
  98.     ldir            ; Move file name to protected memory
  99.     ld    a,'?'
  100.     ld    bc,0bh
  101.     ld    hl,FILE + 1
  102.     cpir            ; Check entire name for ambiguity
  103.     jr    z,AMBIG
  104.     
  105.     ld    a,(5ch)
  106.     or    a
  107.     jr    nz,STOREU
  108.     ld    c,25
  109.     call    BDOS
  110.     inc    a
  111.     ld    (FILE),a
  112. STOREU:    ld    hl,5ch + 13    ; Get user number
  113.     ld    a,(hl)
  114.     ld    (UNUM + 1),a    ; Store it to user routine
  115.  
  116.     call    TOU        ; Go to proper user #
  117.     ld    c,13h
  118.     call    FCBBDOS
  119.     ld    c,16h
  120.     call    FCBBDOS
  121.     ld    c,16h
  122.     inc    a        ;  0ffh = No room
  123.     jp    z,FULL        ; No good?  Then abort
  124.  
  125.     ld    de,OPENMSG
  126.     call    STRING
  127.  
  128.     ld    hl,BUFFER
  129.     ld    (POINTER),hl    ; POINTER => first char of BUFFER
  130.     xor    a
  131.     ld    (ON),a
  132.     ld    (COUNTER),a
  133.  
  134.     ld    hl,(1)        ; Get BOOT location
  135.     ld    de,0ah        ; Offset for JP <LOCATON>
  136.     add    hl,de
  137.     ld    (JCON),hl    ; Save location for JP to CONSOLE OUT
  138.     ld    e,(hl)
  139.     inc    hl
  140.     ld    d,(hl)        ; Move to de
  141.     ld    (CON),de    ; Save DE
  142.     ld    de,NEWOUT
  143.     ld    (hl),d
  144.     dec    hl
  145.     ld    (hl),e        ; Fill our NEWOUT location in
  146.  
  147.     ld    hl,(1)        ; Get BOOT location
  148.     ld    de,07h        ; Offset for JP <LOCATON>
  149.     add    hl,de
  150.     ld    (JCONIN),hl    ; Save location for JP to CONSOLE IN
  151.     ld    e,(hl)
  152.     inc    hl
  153.     ld    d,(hl)        ; Move to de
  154.     ld    (CONIN),de    ; Save DE
  155.     ld    de,NEWIN
  156.     ld    (hl),d
  157.     dec    hl
  158.     ld    (hl),e        ; Fill our NEWOUT location in
  159.  
  160.     call    SETBDOS
  161.  
  162.     ld    a,0ffh
  163.     ld    (OPENFLG),a    ; Show that there is a S file open
  164.  
  165.     jp    BACKU        ; Come back to normal U
  166.  
  167. AMBIG:    ld    de,AMBIGSTR
  168.     jp    STRING        ; Print the message
  169.  
  170. NEWIN:    call    ORIGIN        ; Bring key in
  171. KEYON:    cp    ONKEY        ; Is it the trigger key?
  172.     ret    nz
  173.     ld    a,(ON)
  174.     cpl
  175.     ld    (ON),a        ; Flip On to Off or Off to On
  176.     jp    ORIGIN        ; Get a new key
  177.  
  178. NEWOUT:    push    bc
  179.     call    ORIGOUT        ; Print the char
  180.     pop    bc
  181.     ld    a,(ON)        ; Are we in trap mode?
  182.     or    a
  183.     ret    z
  184.     ld    a,c
  185.     cp    26        ; EOF?
  186.     ret    z
  187. NOUT2:    push    hl
  188.     ld    hl,(POINTER)    ; Consider BUFFER point
  189.     ld    (hl),c        ; Store the Char
  190.     inc    hl        ; Go to next char in buffer
  191.     ld    (POINTER),hl    ; Save that point
  192.     pop    hl
  193.     ld    a,(COUNTER)    ; Consider # of chars in buffer
  194.     inc    a
  195.     cp    80h        ; Time to write?
  196.     jr    z,WRITE
  197.     ld    (COUNTER),a    ; Save counter
  198.     ret
  199.  
  200. WRITE:    ld    a,(BDOSFLG)
  201.     or    a
  202.     jr    z,DOWRITE
  203.     ld    (PEND),a
  204.     push    hl
  205.     push    de
  206.     push    bc
  207.     ld    hl,BUFFER
  208.     ld    (POINTER),hl
  209.     ld    de,BUFF2
  210.     ld    bc,128
  211.     ldir
  212.     xor    a
  213.     ld    (COUNTER),a
  214.     pop    bc
  215.     pop    de
  216.     pop    hl
  217.     ret
  218. DOWRITE:
  219.     push    hl
  220.     call    TOU        ; Go to file's user number
  221.     ld    c,26        ; Set dma
  222.     ld    de,BUFFER    ; At buffer
  223.     call    BDOSCALL
  224.     xor    a
  225.     ld    (COUNTER),a    ; No chars (start fresh)
  226.     ld    hl,BUFFER
  227.     ld    (POINTER),hl    ; No chars in buffer
  228.     ld    c,21        ; Write sequential
  229.     call    FCBBDOS
  230.     pop    hl
  231.     or    a
  232.     jr    nz,FULL        ; No good, write msg
  233.     jp    BACKU        ; Come back to normal U ;~
  234.  
  235. FINISH:
  236.     push    hl
  237.     call    TOU        ; Go to file's user number
  238.     ld    c,26        ; Set dma
  239.     ld    de,BUFF2    ; At buffer
  240.     call    BDOSCALL
  241.     ld    c,21        ; Write sequential
  242.     call    FCBBDOS
  243.     pop    hl
  244.     or    a
  245.     jr    nz,FULL        ; No good, write msg
  246.     jr    BACKU        ; Come back to normal U
  247.  
  248. FULL:    call    BACKU        ; Come back to normal U
  249.     ld    de,FULLMSG
  250.     jp    STRING
  251.  
  252. CLOSE:    ld    a,(OPENFLG)    ; Is there really a file open?
  253.     or    a
  254.     jr    nz,CONTCLOSE    ; Yes, Skip
  255.     ld    de,NONE        ; No
  256.     jp    STRING
  257. CONTCLOSE:
  258.     call    CLRBDOS
  259.  
  260.     xor    a
  261.     ld    (OPENFLG),a    ; Save fact that there is no file open
  262.  
  263.     ld    hl,(JCONIN)    ; Get place to restore
  264.     ld    de,(CONIN)    ; Get location that LISTST should JP to
  265.     ld    (hl),e
  266.     inc    hl
  267.     ld    (hl),d        ; Put in a JP and the location
  268.  
  269.     ld    hl,(JCON)    ; Place to restore
  270.     ld    de,(CON)    ; Location to JP to
  271.     ld    (hl),e
  272.     inc    hl
  273.     ld    (hl),d        ; Put into place
  274.  
  275.     call    TOU        ; Go to proper user #
  276.     ld    c,26        ; Write an end of file
  277.     call    NOUT2
  278.     ld    a,(COUNTER)    ; Was buffer just written?
  279.     or    a
  280.     jr    z,DONTWRITE    ; Yes, don't write
  281.     ld    c,26
  282.     ld    de,BUFFER
  283.     call    BDOSCALL    ; Set DMA to BUFFER
  284.     ld    c,21
  285.     call    FCBBDOS        ; Write sequential
  286. DONTWRITE:
  287.     ld    c,16
  288.     call    FCBBDOS        ; Close file
  289.     inc    a
  290.     jr    z,FULL        ; No?  Print msg.
  291.     ld    de,CLOSEMSG
  292.     call    STRING
  293.     jr    BACKU        ; Come back to normal U
  294.  
  295. STRING:    ld    c,9
  296.     jp    BDOS
  297. FCBBDOS:
  298.     ld    de,FILE
  299.     jp    BDOS
  300.  
  301. TOU:    ld    e,0ffh
  302.     call    USER        ; Get current user number
  303.     ld    (CURU),a    ; Store it
  304. UNUM:    ld    e,00
  305.     jp    USER        ; Set to file's
  306. BACKU:    ld    c,26
  307.     ld    de,(DMA)
  308.     call    BDOSCALL
  309.     ld    a,(CURU)    ; Get current user number
  310.     ld    e,a
  311.     jp    USER        ; Go to it
  312.  
  313. ;;;;;;;;;;;;;;; HACK, HEW, CUT, RIP!
  314.  
  315. LOPEN:    ld    a,(LOPENFLG)    ; Check to see if a file is already open
  316.     or    a
  317.     jr    z,LCONTOPEN    ; No
  318.     ld    de,ALREADY    ; Yes, print and abort
  319.     jp    STRING
  320. LCONTOPEN:
  321.     ld    hl,LFILE
  322.     ld    de,LFILE + 1
  323.     ld    bc,35
  324.     xor    a
  325.     ld    (hl),a        ; Zap the whole FCB
  326.     ldir
  327.     ld    hl,ORIGNAME
  328.     ld    de,LFILE
  329.     ld    bc,13
  330.     ldir            ; Move file name to protected memory
  331.     ld    a,'?'
  332.     ld    bc,0bh
  333.     ld    hl,LFILE + 1
  334.     cpir            ; Check entire name for ambiguity
  335.     jp    z,AMBIG
  336.     
  337.     ld    a,(5ch)
  338.     or    a
  339.     jr    nz,LSTOREU
  340.     ld    c,25
  341.     call    BDOS
  342.     inc    a
  343.     ld    (LFILE),a
  344. LSTOREU:    ld    hl,5ch + 13    ; Get user number
  345.     ld    a,(hl)
  346.     ld    (LUNUM + 1),a    ; Store it to user routine
  347.  
  348.     call    LTOU        ; Go to proper user #
  349.     ld    c,13h
  350.     call    LFCBBDOS    ; Delete file
  351.     ld    c,16h
  352.     call    LFCBBDOS    ; Create file
  353.     inc    a        ;  0ffh = No room
  354.     jp    z,LFULL        ; No good?  Then abort
  355.  
  356.     ld    de,OPENMSG
  357.     call    STRING
  358.  
  359.     ld    hl,LBUFFER
  360.     ld    (LPOINTER),hl    ; POINTER => first char of BUFFER
  361.     xor    a
  362.     ld    (LCOUNTER),a
  363.  
  364.     ld    hl,(1)        ; Get BOOT location
  365.     ld    de,0dh        ; Offset for JP <LOCATON>
  366.     add    hl,de
  367.     ld    (JLIST),hl    ; Save location for JP to list
  368.     ld    e,(hl)
  369.     inc    hl
  370.     ld    d,(hl)        ; Move to de
  371.     ld    (LIST),de    ; Save DE
  372.     ld    de,NLOUT
  373.     ld    (hl),d
  374.     dec    hl
  375.     ld    (hl),e        ; Fill our NLOUT location in
  376.     ld    hl,(1)        ; Get BOOT address, again
  377.     ld    de,2ah        ; Offset for <JP> LOCATON
  378.     add    hl,de
  379.     ld    (JLISTST),hl    ; Save JP LISTST location
  380.     ld    (hl),3eh    ; LD A,
  381.     inc    hl
  382.     ld    e,(hl)
  383.     ld    (hl),0ffh    ; 0ffh
  384.     inc    hl
  385.     ld    d,(hl)
  386.     ld    (hl),0c9h    ; RET instruction
  387.     ld    (LISTST),de    ; Save Location for JP
  388.     call    SETBDOS
  389.     ld    a,0ffh
  390.     ld    (LOPENFLG),a    ; And register the fact
  391.     jp    LBACKU        ; Come back to normal U
  392.  
  393. NLOUT:
  394.     ld    a,c
  395.     cp    26
  396.     ret    z
  397. ZNLOUT:    ld    hl,(LPOINTER)    ; Consider BUFFER point
  398.     ld    (hl),c        ; Store the Char
  399.     inc    hl        ; Go to next char in buffer
  400.     ld    (LPOINTER),hl    ; Save that point
  401.     ld    a,(LCOUNTER)    ; Consider # of chars in buffer
  402.     inc    a
  403.     cp    80h        ; Time to write?
  404.     jr    z,LWRITE
  405.     ld    (LCOUNTER),a    ; Save counter
  406.     ret
  407.  
  408. LWRITE:    xor    a
  409.     ld    (LCOUNTER),a    ; No chars (start fresh)
  410.     ld    hl,LBUFFER
  411.     ld    (LPOINTER),hl    ; No chars in buffer
  412.     ld    a,(BDOSFLG)
  413.     or    a
  414.     jr    z,LDOWRITE
  415.     ld    (LPEND),a
  416.     ret
  417. LDOWRITE:
  418.     call    LTOU        ; Go to file's user number
  419.     ld    c,26        ; Set dma
  420.     ld    de,LBUFFER    ; At buffer
  421.     call    BDOSCALL
  422.     ld    c,21        ; Write sequential
  423.     call    LFCBBDOS
  424.     or    a
  425.     jr    nz,LFULL    ; No good, write msg
  426.     jr    LBACKU        ; Come back to normal U
  427.  
  428. LFULL:    call    LBACKU        ; Come back to normal U
  429.     ld    de,FULLMSG
  430.     jp    STRING
  431.  
  432. LCLOSE:    ld    a,(LOPENFLG)    ; Is there really a file open?
  433.     or    a
  434.     jr    nz,LCONTCLOSE    ; Yes, Skip
  435.     ld    de,NONE        ; No
  436.     jp    STRING
  437. LCONTCLOSE:
  438.     call    CLRBDOS
  439.  
  440.     xor    a
  441.     ld    (LOPENFLG),a    ; Save fact that there is no file open
  442.  
  443.     ld    hl,(JLISTST)    ; Get place to restore
  444.     ld    de,(LISTST)    ; Get location that LISTST should JP to
  445.     ld    (hl),0c3h    ; JP 
  446.     inc    hl
  447.     ld    (hl),e
  448.     inc    hl
  449.     ld    (hl),d        ; Put in a JP and the location
  450.  
  451.     ld    hl,(JLIST)    ; Place to restore
  452.     ld    de,(LIST)    ; Location to JP to
  453.     ld    (hl),e
  454.     inc    hl
  455.     ld    (hl),d        ; Put into place
  456.  
  457.     call    LTOU        ; Go to proper user #
  458.     ld    c,26        ; Write an end of file
  459.     call    ZNLOUT
  460.     ld    a,(LCOUNTER)    ; Was buffer just written?
  461.     or    a
  462.     jr    z,LDONTWRITE    ; Yes, don't write
  463.     ld    c,26
  464.     ld    de,LBUFFER
  465.     call    BDOSCALL    ; Set DMA to BUFFER
  466.     ld    c,21
  467.     call    LFCBBDOS    ; Write sequential
  468. LDONTWRITE:
  469.     ld    c,16
  470.     call    LFCBBDOS    ; Close file
  471.     inc    a
  472.     jr    z,LFULL        ; No?  Print msg.
  473.  
  474.     ld    de,CLOSEMSG
  475.     call    STRING
  476.  
  477.     jr    LBACKU        ; Come back to normal U
  478.  
  479. LFCBBDOS:
  480.     ld    de,LFILE
  481.     jp    BDOS
  482.  
  483. LTOU:    ld    e,0ffh
  484.     call    USER        ; Get current user number
  485.     ld    (LCURU),a    ; Store it
  486. LUNUM:    ld    e,00
  487.     jp    USER        ; Set to file's
  488. LBACKU:    ld    c,26
  489.     ld    de,(DMA)
  490.     call    BDOSCALL
  491.     ld    a,(LCURU)    ; Get current user number
  492.     ld    e,a
  493.     jp    USER        ; Go to it
  494.  
  495. LFULLMSG:
  496.     db    'LTRCP Msg: Disk Full.$'
  497.  
  498. JLIST:    dw    0
  499. LIST:    dw    0
  500. JLISTST:
  501.     dw    0
  502. LISTST:    dw    0
  503. LCURU:    db    0
  504. LOPENFLG:
  505.     db    0
  506. LCOUNTER:
  507.     db    0
  508. LPOINTER:
  509.     dw    LBUFFER
  510. LFILE:
  511.     ds    36
  512. LBUFFER:
  513.     ds    129
  514.  
  515. ;;;;;;;;;;;;;;;  Paste, Glue, Tape!
  516. ;;;;;;;;;;;;;;;  Suction, Damn it, I need more suction!
  517.  
  518. SETBDOS:
  519.     ld    a,(LOPENFLG)
  520.     ld    hl,OPENFLG
  521.     or    (hl)
  522.     ret    nz
  523.     ld    hl,(6)
  524.     ld    (BDOSCALL + 1),hl
  525.     ld    de,3
  526.     sbc    hl,de
  527.     ld    (6),hl
  528.     ld    (hl),0c3h
  529.     inc    hl
  530.     ld    de,CALLBDOS
  531.     ld    (hl),e
  532.     inc    hl
  533.     ld    (hl),d
  534.     ret
  535.  
  536. CLRBDOS:
  537.     ld    a,(LOPENFLG)
  538.     ld    hl,OPENFLG
  539.     xor    (hl)
  540.     ret    z
  541.     ld    hl,(BDOSCALL + 1)
  542.     ld    (6),hl
  543.     ret
  544.  
  545. CALLBDOS:
  546.     ld    a,0ffh
  547.     ld    (BDOSFLG),a
  548.     ld    a,c
  549.     cp    26
  550.     jr    nz,NOTDMA
  551.     ld    (DMA),de
  552. NOTDMA:
  553.     call    BDOSCALL
  554.     push    af
  555.     xor    a
  556.     ld    (BDOSFLG),a
  557.     ld    a,(PEND)
  558.     or    a
  559.     jr    z,P1
  560.     xor    a
  561.     ld    (PEND),a
  562.     call    FINISH
  563. P1:    ld    a,(LPEND)
  564.     or    a
  565.     jr    z,P2
  566.     xor    a
  567.     ld    (LPEND),a
  568.     call    LWRITE
  569. P2:    pop    af
  570.     ret
  571.  
  572. BDOSCALL:
  573.     jp    0000
  574.  
  575.  
  576. USER:    ld    c,32
  577.     jp    BDOS
  578.  
  579. DCIO:    ld    c,6
  580.     jp    BDOS
  581.  
  582. OPENMSG:
  583.     db    'File open.$'
  584. CLOSEMSG:
  585.     db    'File closed.$'
  586. RCP$NAME:
  587.     db    'SLTRAP RCP vers ',(vers / 10) + '0'
  588.     db    '.',(vers mod 10) + '0',13,10
  589.     db    'KEY',9,9,'- Change screen trigger key.',13,10
  590.     db    'SOPEN name.typ',9,'- Open a file for screen output.',13,10
  591.     db    'LOPEN name.typ',9,'- Open a file for list output.',13,10
  592.     db    'SCLOSE',9,9,'- Close the screen file.',13,10
  593.     db    'LCLOSE',9,9,'- Close the list file.$'
  594. ALREADY:
  595.     db    'File already open.$'
  596. NONE:    db    'No file open.$'
  597. AMBIGSTR:
  598.     db    'Bad file name.$'
  599. FULLMSG:
  600.     db    'STRCP Msg: Disk Full.$'
  601. KEYSTR:    db    'Trigger key: $'
  602. ORIGOUT:
  603.     db    0c3h    ; JP
  604. CON:    dw    0
  605. JCON:    dw    0
  606.  
  607. ORIGIN:
  608.     db    0c3h    ; JP
  609. CONIN:    dw    0
  610. JCONIN:    dw    0
  611.  
  612. ON:    db    0
  613. CURU:    db    0
  614. PEND:    db    0
  615. LPEND:    db    0
  616. BDOSFLG:
  617.     db    0
  618. OPENFLG:
  619.     db    0
  620. COUNTER:
  621.     db    0
  622. POINTER:
  623.     dw    BUFFER
  624. DMA:    dw    0000
  625. FILE:    ds    36
  626. BUFFER:    ds    129
  627. BUFF2:    ds    128
  628.     END
  629.     jr