home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / DRIPAK.ZIP / CPM_3-0 / SOURCES / GETRSX.ASM < prev    next >
Assembly Source File  |  1982-12-31  |  20KB  |  870 lines

  1. title    'GET.RSX 3.0 - CP/M 3.0 Input Redirection - August 1982'
  2. ;******************************************************************
  3. ;
  4. ;    get  'Input Redirection Facility'  version 3.0
  5. ;
  6. ;     11/30/82 - Doug Huskey
  7. ;    This RSX redirects console input and status from a file.
  8. ;******************************************************************
  9. ;
  10. ;
  11. true        equ    0ffffh
  12. false        equ    00000h
  13. ;
  14. submit        equ    false    ;true if submit RSX
  15. remove$rsx    equ    false    ;true if RSX removes itself
  16. ;                ;false if LOADER does removes
  17. ;
  18. ;
  19. ;    generation procedure
  20. ;
  21. ;    rmac getrsx
  22. ;    xref getrsx
  23. ;    link getrsx[op]
  24. ;    ERA get.RSX
  25. ;    REN get.RSX=getRSX.PRL
  26. ;    GENCOM $1.COM get.RSX         ($1 is either SUBMIT or GET)
  27. ;
  28. ;
  29. ;    initialization procedure
  30. ;
  31. ;    GETF makes a RSX function 60 call with a sub-function of
  32. ;    128.  GETRSX returns the address of a data table containing:
  33. ;
  34. ;    init$table:    
  35. ;        dw    kill        ;RSX remove flag addr in GET
  36. ;        dw    bios$constat    ;bios entry point in GET
  37. ;        dw    bios$conin    ;bios entry point in GET
  38. ;
  39. ;    GETF initializes the data are between movstart: and movend:
  40. ;    and moves it into GET.RSX.  This means that data should not
  41. ;    be reordered without also changing GETF.ASM.
  42. ;
  43. bios$functions    equ    true    ;intercept BIOS console functions
  44. ;
  45. ;    low memory locations
  46. ;
  47. wboot    equ    0000h
  48. bdos    equ    0005h
  49. bdosl    equ    bdos+1
  50. buf    equ    0080h
  51. ;
  52. ;    equates for non graphic characters
  53. ;
  54. ctlc    equ    03h    ; control c
  55. ctle    equ    05h    ; physical eol
  56. ctlh    equ    08h    ; backspace
  57. ctlp    equ    10h    ; prnt toggle
  58. ctlr    equ    12h    ; repeat line
  59. ctls    equ    13h    ; stop/start screen
  60. ctlu    equ    15h    ; line delete
  61. ctlx    equ    18h    ; =ctl-u
  62.     if submit
  63. ctlz    equ    0ffh
  64.     else
  65. ctlz    equ    1ah    ; end of file
  66.     endif
  67. rubout    equ    7fh    ; char delete
  68. tab    equ    09h    ; tab char
  69. cr    equ    0dh    ; carriage return
  70. lf    equ    0ah    ; line feed
  71. ctl    equ    5eh    ; up arrow
  72. ;
  73. ;    BDOS function equates
  74. ;
  75. cinf    equ    1    ;read character
  76. coutf    equ    2    ;output character
  77. crawf    equ    6    ;raw console I/O
  78. creadf    equ    10    ;read buffer
  79. cstatf    equ    11    ;status
  80. pchrf    equ    5    ;print character
  81. pbuff    equ    9    ;print buffer
  82. openf    equ    15    ;open file
  83. closef    equ    16    ;close file
  84. delf    equ    19    ;delete file
  85. dreadf    equ    20    ;disk read
  86. dmaf    equ    26    ;set dma function
  87. userf    equ    32    ;set/get user number
  88. scbf    equ    49    ;set/get system control block word
  89. loadf    equ    59    ;loader function call
  90. rsxf    equ    60    ;RSX function call
  91. ginitf    equ    128    ;GET initialization sub-function no.
  92. gkillf    equ    129    ;GET delete sub-function no.
  93. gfcbf    equ    130    ;GET file display sub-function no.
  94. pinitf    equ    132    ;PUT initialization sub-funct no.
  95. pckillf    equ    133    ;PUT CON: delete sub-function no.
  96. pcfcbf    equ    134    ;return PUT CON: fcb address
  97. plkillf    equ    137    ;PUT LST: delete sub-function no.
  98. plfcbf    equ    138    ;return PUT LST:fcb address
  99. gsigf    equ    140    ;signal GET without [SYSTEM] option
  100. jinitf    equ    141    ;JOURNAL initialization sub-funct no.
  101. jkillf    equ    142    ;JOURNAL delete sub-function no.
  102. jfcbf    equ    143    ;return JOURNAL fcb address
  103. ;
  104. ;    System Control Block definitions
  105. ;
  106. scba    equ    03ah    ;offset of scbadr from SCB base
  107. ccpflg    equ    0b3h    ;offset of ccpflags word from page boundary
  108. ccpres    equ    020h    ;ccp resident flag = bit 5
  109. bdosoff equ    0feh    ;offset of BDOS address from page boundary
  110. errflg    equ    0ach    ;offset of error flag from page boundary
  111. pg$mode    equ    0c8h    ;offset of page mode byte from pag. bound.
  112. pg$def    equ    0c9h    ;offset of page mode default from pag. bound.
  113. conmode    equ    0cfh    ;offset of console mode word from pag. bound.
  114. listcp    equ    0d4h    ;offset of ^P flag from page boundary
  115. dmaad    equ    0d8h    ;offset of DMA address from pg bnd.
  116. usrcode    equ    0e0h    ;offset of user number from pg bnd.
  117. dcnt    equ    0e1h    ;offset of dcnt, searcha & searchl from pg bnd.
  118. constfx    equ    06eh    ;offset of constat JMP from page boundary
  119. coninfx    equ    074h    ;offset of conin JMP from page boundary
  120.  
  121.  
  122. ;******************************************************************
  123. ;        RSX HEADER 
  124. ;******************************************************************
  125.  
  126. serial:    db    0,0,0,0,0,0
  127.  
  128. trapjmp:
  129.     jmp    trap        ;trap read buff and DMA functions
  130. next:    jmp    0        ;go to BDOS
  131. prev:    dw    bdos
  132. kill:    db    0FFh        ;0FFh => remove RSX at wstart
  133. nbank:    db    0
  134. rname:    db    'GET     '    ;RSX name
  135. space:    dw    0
  136. patch:    db    0
  137.  
  138. ;******************************************************************
  139. ;        START OF CODE
  140. ;******************************************************************
  141.  
  142. ;
  143. ;    ABORT ROUTINE
  144. ;
  145. getout:
  146.     ;
  147. if bios$functions
  148.     ;
  149.     ;restore bios jumps
  150.     lda    restore$mode        ;may be FF, 7f, 80 or 0
  151.     inr    a    
  152.     rz                ; FF = no bios interception
  153.     lhld    biosin
  154.     xchg
  155.     lhld    biosta
  156.     call    restore$bios        ;restore BIOS constat & conin jmps
  157.     rm                ; 7f = RESBDOS jmps not changed
  158.     lhld    scbadr
  159.     mvi    l,constfx
  160.     mvi    m,jmp
  161.     rpe                ; 80 = conin jmp not changed
  162.     mvi    l,coninfx
  163.     mvi    m,jmp
  164. endif
  165.     ret                ; 0  = everything done
  166. ;
  167. ;    ARRIVE HERE ON EACH BIOS CONIN OR CONSTAT CALL
  168. ;
  169. ;
  170. bios$constat:
  171.     ;
  172. if bios$functions
  173.     ;
  174.     ;enter here from BIOS constat
  175.     lxi    b,4*256+cstatf    ;b=offset in exit table
  176.     jmp    bios$trap
  177. endif
  178. ;
  179. bios$conin:
  180.     ;
  181. if bios$functions
  182.     ;
  183.     ;enter here from BIOS conin
  184.     lxi    b,6*256+crawf    ;b=offset in exit table
  185.     mvi    e,0fdh
  186.     jmp    biostrap
  187. endif
  188. ;
  189. ;    ARRIVE HERE AT EACH BDOS CALL
  190. ;
  191. trap:
  192.     ;
  193.     ;
  194.     lxi    h,excess
  195.     mvi    b,0
  196.     mov    m,b
  197. biostrap:
  198.     ;enter here on BIOS calls
  199.  
  200.     pop    h        ;return address
  201.     push    h        ;back to stack
  202.     lda    trapjmp+2    ;GET.RSX page address
  203.     cmp    h        ;high byte of return address
  204.     jc    exit        ;skip calls on bdos above here
  205.     mov    a,c        ;function number
  206.     ;
  207.     ;
  208.     cpi    cstatf        ;status    
  209.     jz    intercept
  210.     cpi    crawf
  211.     jz    intercept    ;raw I/O
  212.     lxi    h,statflg    ;zero conditional status flag
  213.     mvi    m,0
  214.     cpi    cinf
  215.     jz    intercept    ;read character
  216.     cpi    creadf
  217.     jz    intercept    ;read buffer
  218.     cpi    rsxf
  219.     jz    rsxfunc        ;rsx function
  220.     cpi    dmaf
  221.     jnz    exit        ;skip if not setting DMA
  222.     xchg
  223.     shld    udma        ;save user's DMA address
  224.     xchg
  225. ;
  226. exit:
  227.     ;go to real BDOS
  228.  
  229. if not bios$functions
  230.     ;
  231.     jmp    next        ;go to next RSX or BDOS
  232.  
  233. else
  234.     mov    a,b        ;get type of call:
  235.     lxi    h,exit$table    ;0=BDOS call, 4=BIOS CONIN, 6=BIOS CONSTAT
  236.     call    addhla
  237.     mov    b,m        ;low byte to b
  238.     inx    h
  239.     mov    h,m        ;high byte to h
  240.     mov    l,b        ;HL = .exit routine
  241.     pchl            ;gone to BDOS or BIOS
  242. endif
  243. ;    
  244. ;
  245. rsxfunc:            ;check for initialize or delete RSX functions
  246.     ldax    d        ;get RSX sub-function number
  247.     lxi    h,init$table    ;address of area initialized by COM file
  248.     cpi    ginitf
  249.     rz
  250.     lda    kill
  251.     ora    a
  252.     jnz    exit
  253.     ldax    d
  254.     cpi    gfcbf    
  255.     lxi    h,subfcb
  256.     rz
  257. cksig:
  258.     cpi    gsigf
  259.     jnz    ckkill
  260.     lxi    h,get$active
  261.     mvi    a,gkillf
  262.     sub    m        ;toggle get$active flag
  263.     mov    m,a        ;gkillf->0    0->gkillf
  264.  
  265. ckkill:
  266.     cpi    gkillf        ;remove this instance of GET?
  267.     jnz    exit        ;jump if not
  268.     
  269.  
  270. restor:
  271.     lda    get$active
  272.     ora    a
  273.     rz
  274.     call    getout        ;bios jump fixup
  275.  
  276. if submit
  277.     mvi    c,closef
  278.     call    subdos
  279.     mvi    c,delf
  280.     call    subdos        ;delete SYSIN??.$$$ if not
  281. endif
  282.     lxi    h,kill
  283.     dcr    m        ;set to 0ffh, so we are removed 
  284.     xchg            ; D = base of this RSX
  285.     lhld    scbadr
  286.     mvi    l,ccpflg+1    ;hl = .ccp flag 2 in SCB
  287.     mov    a,m
  288.     ani    0bfh
  289.     mov    m,a        ;turn off redirection flag
  290.     ;we must remove this RSX if it is the lowest one
  291.     lda    bdosl+1        ;location 6 high byte
  292.     cmp    d        ;Does location 6 point to us
  293.     RNZ            ;return if not
  294. if remove$rsx
  295.     xchg            ;D = scb page
  296.     lhld    next+1
  297.     shld    bdosl
  298.     xchg            ;H = scb page
  299.     mvi    l,bdosoff    ;HL = "BDOS" address in SCB
  300.     mov    m,e        ;put next address into SCB
  301.     inx    h
  302.     mov    m,d
  303.     xchg
  304.     mvi    l,0ch        ;HL = .previous RSX field in next RSX
  305.     mvi    m,7
  306.     inx    h
  307.     mvi    m,0        ;put previous into previous
  308.     ret
  309. else
  310.     ;    CP/M 3 loader does RSX removal if DE=0
  311.     mvi    c,loadf
  312.     lxi    d,0
  313.     jmp    next        ;ask loader to remove me
  314. endif
  315.  
  316. ;
  317. ;
  318. ;    INTERCEPT EACH BDOS CONSOLE INPUT FUNCTION CALL HERE
  319. ;
  320. ;    enter with funct in A, info in DE
  321. ;
  322. intercept:
  323. ;
  324.     lda    kill
  325.     ora    a
  326.     jnz    exit        ;skip if remove flag turned on
  327.     ;
  328.     ;switch stacks
  329.     lxi    h,0
  330.     dad    sp
  331.     shld    old$stack    
  332.     lxi    sp,stack
  333.     push    b        ;save function #
  334.     push    d        ;save info
  335.     ;check redirection mode
  336.     call    getmode        ;returns with H=SCB page
  337.     cpi    2
  338.     jz    skip        ;skip if no redirection flag on
  339.     
  340. if submit    
  341. ;
  342. ;    SUBMIT PROCESSOR
  343. ;
  344.     ;check if CCP is calling
  345. ckccp:    mvi    l,pg$mode
  346.     mov    m,H        ;set to non-zero for no paging
  347.     mvi    l,ccpflg+1    ;CCP FLAG 2 in SCB
  348.     mov    a,m        ;ccp flag byte 2 to A
  349.     ori    040h
  350.     mov    m,a        ;set redirection flag on
  351.     ani    ccpres        ;zero flag set if not CCP calling
  352.     lda    ccp$line
  353.     jz    not$ccp
  354.     ;yes, CCP is calling
  355.     ora    a
  356.     jnz    redirect    ;we have a CCP line
  357.     ;CCP & not a CCP line
  358.     push    h
  359.     call     coninf        ;throw away until next CCP line
  360.     lxi    h,excess
  361.     mov    a,m
  362.     ora    a        ;is this the first time?
  363.     mvi    m,true
  364.     lxi    d,garbage
  365.     mvi    c,pbuff
  366.     cz    next        ;print the warning if so
  367.     pop    h
  368.     lda    kill
  369.     ora    a
  370.     jz    ckccp        ;get next character (unless eof)
  371.     mov    a,m
  372.     ani    7fh        ;turn off disk reset (CCP) flag
  373.     mov    m,a
  374.     jmp    wboot        ;skip if remove flag turned on
  375. ;
  376. not$ccp:
  377.     ;no, its not the CCP
  378.     ora    a
  379.     jnz    skip        ;skip if no program line
  380.  
  381. else
  382.     lda    program
  383.     ora    a        ;program input only?
  384.     mvi    l,ccpflg+1    ;CCP FLAG 2 in SCB
  385.     mov    a,m        ;ccp flag byte 2 to A
  386.     jz    set$no$page    ;jump if [system] option
  387.     ;check if CCP is calling
  388.     ani    ccpres        ;zero flag set if not CCP calling
  389.     jz    redirect    ;jump if not the CCP
  390.     lxi    h,ccpcnt    ;decrement once for each
  391.     dcr    m        ;time CCP active
  392.     cm    restor        ;if 2nd CCP appearance
  393.     lxi    d,cksig+1
  394.     mvi    c,rsxf        ;terminate any GETs waiting for
  395.     call    next        ;us to finish
  396.     jmp    skip
  397.     ;
  398. set$no$page:
  399.     ori    40h        ;A=ccpflag2, HL=.ccpflag2
  400.     mov    m,a        ;set redirection flag on
  401.     mvi    l,pg$mode
  402.     mov    m,h        ;set to non-zero for no paging
  403. endif
  404.     ;
  405.     ;    REDIRECTION PROCESSOR
  406.     ;
  407. redirect:
  408.     ;break if control-C typed on console
  409.     call    break
  410.     pop    d
  411.     pop    b        ;recover function no. & info
  412.     push    b        ;save function
  413.     push    d        ;save info
  414.     mov    a,c        ;function no. to A
  415.     lxi    h,retmon    ;program return routine
  416.     push    h        ;push on stack 
  417.     ;
  418.     ;
  419.     cpi    creadf
  420.     jz    func10        ;read buffer (returns to retmon)
  421.     cpi    cinf
  422.     jz    func1        ;read character (returns to retmon)
  423.     cpi    cstatf
  424.     jz    func11        ;status    (returns to retmon)
  425. ;
  426. func6:
  427.     ;direct console i/o - read if 0ffh
  428.     ;returns to retmon
  429.     mov     a,e    
  430.     inr     a
  431.     jz     dirinp         ;0ffh in E for status/input
  432.     inr     a
  433.     jz     CONBRK        ;0feh in E for status
  434.     lxi    h,statflg
  435.     mvi    m,0
  436.     inr     a        
  437.     jz    coninf        ;0fdh in E for input
  438.     ;
  439.     ;direct output function
  440.     ;
  441.     jmp    skip1
  442.     ;
  443. break:    ;
  444.     ;quit if ^C typed
  445.     mvi    c,cstatf
  446.     call    real$bdos
  447.     ora    a        ;was ^C typed?
  448.     rz
  449.     pop    h        ;throw away return address
  450.     call    restor        ;remove this RSX, if so
  451.     mvi    c,crawf
  452.     mvi    e,0ffh
  453.     call    next        ;eat ^C if not nested
  454.     ;
  455. skip:    ;
  456.     ;reset ^C status mode
  457.     call    getmode        ;returns .conmode+1
  458.     dcx    h        ;hl = .conmode in SCB
  459.     mov    a,m
  460.     ani    0feh        ;turn off control C status
  461.     mov    m,a
  462.     ;restore the BDOS call 
  463.     pop    d        ;restore BDOS function no.
  464.     pop    b        ;restore BDOS parameter
  465.     ;restore the user's stack
  466. skip1:    lhld    old$stack
  467.     sphl
  468.     jmp    exit        ;goto BDOS
  469.  
  470. ;
  471. retmon:
  472.     ;normal entry point, char in A
  473.     cpi    ctlz
  474.     jz    skip
  475.     lhld    old$stack
  476.     sphl
  477.     mov    l,a
  478.     ret            ;to calling program
  479.  
  480.  
  481. ;******************************************************************
  482. ;        BIOS FUNCTIONS (REDIRECTION ROUTINES)
  483. ;******************************************************************
  484. ;
  485. ;    ;direct console input
  486. dirinp:
  487.     call    conbrk
  488.     ora    a
  489.     rz
  490. ;
  491. ;
  492. ;    get next character from file
  493. ;
  494.     ;
  495. coninf:    
  496. getc:    ;return ^Z if end of file
  497.     xra    a
  498.     lxi    h,cbufp        ;cbuf index
  499.     inr    m        ;next chr position
  500.     cm    readf        ;read a new record
  501.     ora    a        
  502.     mvi    b,ctlz        ;EOF indicator
  503.     jnz    getc1        ;jump if end of file
  504.     lda    cbufp
  505.     lxi    h,cbuf
  506.     call    addhla        ;HL = .char
  507.     ;one character look ahead
  508.     ;new char in B, current char in nextchr
  509.     mov    b,m        ;new character in B
  510. getc1:    mov    a,b
  511.     cpi    ctlz
  512.     push    b
  513.     cz    restor
  514.     pop    b
  515.     lxi    h,nextchr
  516.     mov    a,m        ;current character
  517.     cpi    cr
  518.     mov    m,b        ;save next character
  519.     rnz
  520.     mov    a,b        ;A=character after CR
  521.     cpi    lf        ;is it a line feed
  522.     cz    getc        ;eat line feeds after a CR
  523.                 ;this must return from above
  524.                 ;rnz because nextchr = lf
  525.     ;
  526. if submit
  527.     ;
  528.     mov    a,b        ;get nextchr
  529.     sui    '<'        ;program line?
  530.     sta    ccp$line    ;zero if so
  531.     cz    getc        ;eat '<' char
  532.                 ;this must return from above
  533.                 ;rnz because nextchr = <
  534. endif
  535.     mvi    a,cr        ;get back the cr
  536.     ret            ;with character in a
  537. ;
  538. ;    set DMA address in DE
  539. ;
  540. setdma:    mvi    c,dmaf
  541.     jmp    next
  542. ;
  543. ;    read next record
  544. ;
  545. readf:    mvi    c,dreadf    ;read next record of input to cbuf
  546. subdos:    push    b
  547.     lxi    d,cbuf
  548.     call    setdma        ;set DMA to our buffer
  549.     lhld    scbadr
  550.     lxi    d,sav$area    ;10 byte save area
  551.     pop    b        ;C  = function no.
  552.     push    h        ;save for restore
  553.     push    d        ;save for restore
  554.     call    mov7        ;save hash info in save area
  555.     mvi    l,usrcode    ;HL = .dcnt in SCB
  556.     call    mov7        ;save dcnt, searcha & l, user# &
  557.     dcx    h        ;multi-sector I/O count
  558.     mvi    m,1        ;set multi-sector count = 1
  559.     lxi    d,subusr    ;DE = .submit user #
  560.     mvi    l,usrcode    ;HL = .BDOS user number
  561.     ldax    d
  562.     mov    m,a
  563.     inx    d
  564.     call    next        ;read next record
  565.     pop    h        ;HL = .sav$area
  566.     pop    d        ;DE = .scb
  567.     push    psw        ;save A (non-zero if error)
  568.     call    mov7        ;restore hash info
  569.     mvi    e,usrcode    ;DE = .dcnt in scb
  570.     call    mov7        ;restore dcnt search addr & len
  571.     lhld    udma
  572.     xchg
  573.     call    setdma        ;restore DMA to program's buffer
  574.     xra    a
  575.     sta    cbufp        ;reset buffer position to 0
  576.     pop    psw
  577.     ora    a
  578.     ret            ;zero flag set, if successful
  579. ;
  580. ;    reboot from ^C
  581. ;
  582. rebootx:
  583.     ;store 0fffeh in clp$errcode in SCB
  584.     lhld    scbadr
  585.     mvi    l,errflg
  586.     mvi    m,0feh
  587.     inx    h
  588.     mvi    m,0ffh
  589.     jmp    wboot
  590. ;
  591. ;
  592. ;    get input redirection mode to A 
  593. ;    turn on ^C status mode for break
  594. ;    return .conmode+1 in HL
  595. ;    preserve registers BC and DE
  596. ;
  597. getmode:
  598.     lhld    scbadr
  599.     mvi    l,conmode
  600.     mov    a,m
  601.     ori    1        ;turn on ^C status
  602.     mov    m,a
  603.     inx    h
  604.     mov    a,m
  605.     ani    3        ;mask off redirection bits
  606.     dcr    a        ;255=false, 0=conditional, 1=true,
  607.     ret            ;  2=don't redirect input
  608. ;
  609. ;    move routine
  610. ;
  611. mov7:    mvi    b,7
  612.     ;            HL = source
  613.     ;            DE = destination
  614.     ;             B = count
  615. move:    mov    a,m
  616.     stax    d
  617.     inx    h
  618.     inx    d
  619.     dcr    b
  620.     jnz    move
  621.     ret
  622. ;
  623. ;    add a to hl
  624. ;
  625. addhla:    add    l
  626.     mov    l,a
  627.     rnc
  628.     inr    h
  629.     ret
  630. ;
  631. ;******************************************************************
  632. ;        BDOS CONSOLE INPUT ROUTINES
  633. ;******************************************************************
  634.  
  635. ;
  636. ;       February 3, 1981
  637. ;
  638. ;
  639. ;    console handlers
  640.  
  641. conin:    equ    coninf
  642. ;
  643. conech:
  644.     ;read character with echo
  645.     call conin! call echoc! rc     ;echo character?
  646.         ;character must be echoed before return
  647.     push psw! call conout! pop psw
  648.     ret                 ;with character in A
  649. ;
  650. echoc:
  651.     ;are we in cooked or raw mode?
  652.     lxi h,cooked! dcr m! inr m! rz    ;return if raw
  653.     ;echo character if graphic
  654.     ;cr, lf, tab, or backspace
  655.     cpi cr! rz         ;carriage return?
  656.     cpi lf! rz         ;line feed?
  657.     cpi tab! rz         ;tab?
  658.     cpi ctlh! rz         ;backspace?
  659.     cpi ' '! ret         ;carry set if not graphic
  660. ;
  661. conbrk:    ;STATUS - check for character ready
  662.     lxi h,statflg
  663.     mov b,m! mvi m,0ffh    ;set conditional status flag true
  664.     call getmode        ;check input redirection status mode  
  665.     cpi 1! rz        ;actual status mode => return true
  666.     ora a! rz        ;false status mode  => return false
  667.     ;conditional status mode => false unless prev func was status
  668.     mov a,b! ret        ; return false if statflg false
  669.                 ; return true if statflg true
  670. ;
  671. ;
  672. ctlout:
  673.     ;send character in A with possible preceding up-arrow
  674.     call echoc         ;cy if not graphic (or special case)
  675.     jnc conout         ;skip if graphic, tab, cr, lf, or ctlh
  676.         ;send preceding up arrow
  677.         push psw! mvi a,ctl! call conout ;up arrow
  678.         pop psw! ori 40h     ;becomes graphic letter
  679.         ;(drop through to conout)
  680. ;
  681. ;
  682. ;    send character in A to console
  683. ;
  684. conout:
  685.     mov    e,a
  686.     lda    echo
  687.     ora    a
  688.     rz
  689.     mvi    c,coutf
  690.     jmp    next
  691. ;
  692. ;
  693. read:    ;read to buffer address (max length, current length, buffer)
  694.     xchg                    ;buffer address to HL
  695.     mov c,m! inx h! push h! mvi b,0        ;save .(current length)
  696.     ;B = current buffer length,
  697.     ;C = maximum buffer length,
  698.     ;HL= next to fill - 1
  699.     readnx:
  700.         ;read next character, BC, HL active
  701.         push b! push h                 ;blen, cmax, HL saved
  702.         readn0:
  703.             call conin             ;next char in A
  704.             pop h! pop b             ;reactivate counters
  705.             cpi ctlz! jnz noteof          ;end of file?
  706.             dcr b! inr b! jz readen        ;skip if buffer empty
  707.             mvi a,cr            ;otherwise return
  708.         noteof:
  709.             cpi cr!   jz readen        ;end of line?
  710.             cpi lf!   jz readen        ;also end of line
  711.             cpi ctlp! jnz notp         ;skip if not ctlp
  712.             ;list toggle - change parity
  713.             push h!    push b            ;save counters
  714.             lhld scbadr! mvi l,listcp    ;hl =.listcp 
  715.             mvi a,1! sub m            ;True-listcp
  716.             mov m,a             ;listcp = not listcp
  717.             pop b! pop h! jmp readnx     ;for another char
  718.         notp:
  719.             ;not a ctlp
  720.             ;place into buffer
  721.         rdecho:
  722.             inx h! mov m,a         ;character filled to mem
  723.             inr b             ;blen = blen + 1
  724.         rdech1:
  725.             ;look for a random control character
  726.             push b! push h         ;active values saved
  727.             call ctlout         ;may be up-arrow C
  728.             pop h! pop b! mov a,m     ;recall char
  729.             cpi ctlc         ;set flags for reboot test
  730.             mov a,b         ;move length to A
  731.             jnz notc         ;skip if not a control c
  732.             cpi 1             ;control C, must be length 1
  733.             jz rebootx         ;reboot if blen = 1
  734.             ;length not one, so skip reboot
  735.         notc:
  736.             ;not reboot, are we at end of buffer?
  737.             cmp c! jc readnx     ;go for another if not
  738.         readen:
  739.             ;end of read operation, store blen
  740.             pop h! mov m,b         ;M(current len) = B
  741.             push psw        ;may be a ctl-z
  742.             mvi a,cr! call conout    ;return carriage
  743.             pop psw            ;restore character
  744.             ret
  745. ;
  746. func1:    equ    conech
  747.     ;return console character with echo
  748. ;
  749. ;func6:    see intercept routine at front of module
  750. ;
  751. func10:    equ    read
  752.     ;read a buffered console line
  753. ;
  754. func11: equ    conbrk
  755.     ;check console status
  756. ;
  757. ;
  758.  
  759. ;******************************************************************
  760. ;        DATA AREA
  761. ;******************************************************************
  762.  
  763. statflg:    db    0    ;non-zero if prev funct was status
  764.     ;
  765.     ;    
  766.  
  767. ;******************************************************************
  768. ;    Following variables and entry points are used by GET.COM
  769. ;    Their order and contents must not be changed without also
  770. ;    changing GET.COM.
  771. ;******************************************************************
  772.     ;
  773.     if bios$functions
  774.     ;
  775. exit$table:            ;addresses to go to on exit
  776.     dw    next        ;BDOS
  777.     endif
  778.     ;
  779. movstart:
  780. init$table:            ;addresses used by GET.COM for 
  781. scbadr:    dw    kill        ;address of System Control Block
  782.     ;
  783.     if bios$functions    ;GET.RSX initialization
  784.     ;
  785. biosta    dw    bios$constat    ;set to real BIOS routine
  786. biosin    dw    bios$conin    ;set to real BIOS routine
  787.     ;
  788.                 ;restore only if changed when removed.
  789. restore$mode
  790.     db    0        ;if non-zero change LXI @jmpadr to JMP
  791.                 ;when removed.
  792. restore$bios:
  793.     ;hl = real constat routine
  794.     ;de = real conin routine
  795.     shld    0        ;address of const jmp initialized by COM
  796.     xchg
  797.     shld    0        ;address of conin jmp initialized by COM
  798.     ret
  799.     endif
  800.     ;
  801. real$bdos:
  802.     jmp    bdos        ;address filled in by COM
  803.     ;
  804.     ;
  805. echo:    db    1
  806. cooked:    db    0
  807.     ;
  808. program:
  809.     db    0        ;true if program input only    
  810. subusr:    db    0        ;user number for redirection file
  811. subfcb:    db    1        ;a:
  812.     db    'SYSIN   '
  813.     db    'SUB'
  814.     db    0,0
  815. submod:    db    0
  816. subrc:    ds    1
  817.     ds    16        ;map
  818. subcr:    ds    1
  819.     ;
  820. movend:
  821. ;*******************************************************************
  822.  
  823. cbufp    db    128        ;current character position in cbuf
  824. nextchr    db    cr        ;next character (1 char lookahead)
  825.  
  826.     if submit
  827. ccp$line:
  828.     db    false        ;nonzero if line is for CCP
  829.     endif
  830.  
  831. cbuf:                ;128 byte record buffer
  832.  
  833.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  834.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  835.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  836.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  837.  
  838.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  839.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  840.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  841.     db    3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
  842.  
  843. udma:    dw    buf        ;user dma address
  844. get$active:
  845.     db    gkillf
  846.     ;
  847. sav$area:            ;14 byte save area (searchn)
  848.     db    68h,68h,68h,68h,68h, 68h,68h,68h,68h,68h
  849.     db    68h,68h,68h,68h
  850. excess:    db    0
  851. old$stack:
  852.     dw    0
  853.     if    submit
  854. garbage:
  855. ;    db    cr,lf
  856.     db    'WARNING: PROGRAM INPUT IGNORED',cr,lf,'$'
  857.     else
  858. ccpcnt:    db    1
  859.     endif
  860. patch$area:
  861.     ds    30h
  862.     db    ' 151282 '
  863.     db    ' COPYR ''82 DRI '
  864.     db    67h,67h,67h,67h,67h, 67h,67h,67h,67h,67h
  865.     db    67h,67h,67h,67h,67h, 67h,67h,67h,67h,67h
  866.     db    67h,67h,67h,67h,67h, 67h,67h,67h,67h,67h
  867.     ;
  868. stack:                ;15 level stack
  869.     end
  870.