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 / CONBDOS.ASM < prev    next >
Assembly Source File  |  1982-12-31  |  21KB  |  903 lines

  1.     title    'CP/M Bdos Interface, Bdos, Version 3.0 Nov, 1982'
  2. ;*****************************************************************
  3. ;*****************************************************************
  4. ;**                                                             **
  5. ;**   B a s i c    D i s k   O p e r a t i n g   S y s t e m    **
  6. ;**                                **
  7. ;**               C o n s o l e   P o r t i o n                 **
  8. ;**                                                             **
  9. ;*****************************************************************
  10. ;*****************************************************************
  11. ;
  12. ;       November 1982
  13. ;
  14. ;
  15. ;    Console handlers
  16. ;
  17. conin:
  18.     ;read console character to A
  19.     lxi h,kbchar! mov a,m! mvi m,0! ora a! rnz
  20.     ;no previous keyboard character ready
  21.     jmp coninf ;get character externally
  22.     ;ret
  23. ;
  24. conech:
  25.     LXI H,STA$RET! PUSH H
  26. CONECH0:
  27.     ;read character with echo
  28.     call conin! call echoc! JC CONECH1 ;echo character?
  29.         ;character must be echoed before return
  30.     push psw! mov c,a! call tabout! pop psw
  31.     RET
  32. CONECH1:
  33.     CALL TEST$CTLS$MODE! RNZ
  34.     CPI CTLS! JNZ CONECH2
  35.     CALL CONBRK2! JMP CONECH0
  36. CONECH2:
  37.     CPI CTLQ! JZ CONECH0
  38.     CPI CTLP! JZ CONECH0
  39.     RET
  40. ;
  41. echoc:
  42.     ;echo character if graphic
  43.     ;cr, lf, tab, or backspace
  44.     cpi cr! rz ;carriage return?
  45.     cpi lf! rz ;line feed?
  46.     cpi tab! rz ;tab?
  47.     cpi ctlh! rz ;backspace?
  48.     cpi ' '! ret ;carry set if not graphic
  49. ;
  50. CONSTX:
  51.     LDA KBCHAR! ORA A! JNZ CONB1
  52.     CALL CONSTF! ANI 1! RET
  53. ;
  54. if BANKED
  55.  
  56. SET$CTLS$MODE:
  57.     ;SET CTLS STATUS OR INPUT FLAG FOR QUEUE MANAGER
  58.     LXI H,QFLAG! MVI M,40H! XTHL! PCHL
  59.  
  60. endif
  61. ;
  62. TEST$CTLS$MODE:
  63.     ;RETURN WITH Z FLAG RESET IF CTL-S CTL-Q CHECKING DISABLED
  64.     MOV B,A! LDA CONMODE! ANI 2! MOV A,B! RET
  65. ;
  66. conbrk:    ;check for character ready
  67.     CALL TEST$CTLS$MODE! JNZ CONSTX
  68.     lda kbchar! ora a! jnz CONBRK1 ;skip if active kbchar
  69.         ;no active kbchar, check external break
  70.         ;DOES BIOS HAVE TYPE AHEAD?
  71. if BANKED
  72.         LDA TYPE$AHEAD! INR A! JZ CONSTX ;YES
  73. endif
  74.         ;CONBRKX CALLED BY CONOUT
  75.  
  76.     CONBRKX:
  77.         ;HAS CTL-S INTERCEPT BEEN DISABLED?
  78.         CALL TEST$CTLS$MODE! RNZ ;YES
  79.         ;DOES KBCHAR CONTAIN CTL-S?
  80.         LDA KBCHAR! CPI CTLS! JZ CONBRK1 ;YES
  81. if BANKED
  82.         CALL SET$CTLS$MODE
  83. endif
  84.         ;IS A CHARACTER READY FOR INPUT?
  85.         call constf
  86. if BANKED
  87.         POP H! MVI M,0
  88. endif
  89.         ani 1! rz ;NO
  90.         ;character ready, read it
  91. if BANKED
  92.         CALL SET$CTLS$MODE
  93. endif
  94.         call coninf
  95. if BANKED
  96.         POP H! MVI M,0
  97. endif
  98.     CONBRK1:
  99.         cpi ctls! jnz conb0 ;check stop screen function
  100.         ;DOES KBCHAR CONTAIN A CTL-S?
  101.         LXI H,KBCHAR! CMP M! JNZ CONBRK2 ;NO
  102.         MVI M,0 ; KBCHAR = 0
  103.         ;found ctls, read next character
  104.     CONBRK2:
  105.  
  106. if BANKED
  107.         CALL SET$CTLS$MODE
  108. endif
  109.         call coninf ;to A
  110. if BANKED
  111.         POP H! MVI M,0
  112. endif
  113.         cpi ctlc! JNZ CONBRK3
  114.         LDA CONMODE! ANI 08H! JZ REBOOTX
  115.         XRA A
  116.     CONBRK3:
  117.         SUI CTLQ! RZ ; RETURN WITH A = ZERO IF CTLQ
  118.         INR A! CALL CONB3! JMP CONBRK2
  119.     conb0:
  120.         LXI H,KBCHAR
  121.  
  122.         MOV B,A
  123.         ;IS CONMODE(1) TRUE?
  124.         LDA CONMODE! RAR! JNC $+7 ;NO
  125.         ;DOES KBCHAR = CTLC?
  126.         MVI A,CTLC! CMP M! RZ ;YES - RETURN
  127.         MOV A,B
  128.  
  129.         CPI CTLQ! JZ CONB2
  130.         CPI CTLP! JZ CONB2
  131.         ;character in accum, save it
  132.         MOV M,A
  133.     conb1:
  134.         ;return with true set in accumulator
  135.         mvi a,1! ret
  136.     CONB2:
  137.         XRA A! MOV M,A! RET
  138.     CONB3:
  139.         CZ TOGGLE$LISTCP
  140.         MVI C,7! CNZ CONOUTF
  141.         RET
  142. ;
  143. TOGGLE$LISTCP:
  144.     ; IS PRINTER ECHO DISABLED?
  145.     LDA CONMODE! ANI 14H! JNZ TOGGLE$L1 ;YES
  146.     LXI H,LISTCP! MVI A,1! XRA M! ANI 1
  147.     MOV M,A! RET
  148. TOGGLE$L1:
  149.     XRA A! RET
  150. ;
  151. QCONOUTF:
  152.     ;DOES FX = INPUT?
  153.     LDA FX! DCR A! JZ CONOUTF ;YES
  154.     ;IS ESCAPE SEQUENCE DECODING IN EFFECT?
  155.     MOV A,B! ANI 8! JNZ SCONOUTF ;YES
  156.     JMP CONOUTF
  157. ;
  158. conout:
  159.     ;compute character position/write console char from C
  160.     ;compcol = true if computing column position
  161.     lda compcol! ora a! jnz compout
  162.         ;write the character, then compute the column
  163.         ;write console character from C
  164.         ;B ~= 0 -> ESCAPE SEQUENCE DECODING
  165.         LDA CONMODE! ANI 14H! MOV B,A
  166.         push b
  167.         ;CALL CONBRKX FOR OUTPUT FUNCTIONS ONLY
  168.         LDA FX! DCR A! CNZ CONBRKX
  169.         pop b! push b ;recall/save character
  170.         call QCONOUTF ;externally, to console
  171.         pop b
  172.         ;SKIP ECHO WHEN CONMODE & 14H ~= 0
  173.         MOV A,B! ORA A! JNZ COMPOUT
  174.         push b ;recall/save character
  175.         ;may be copying to the list device
  176.         lda listcp! ora a! cnz listf ;to printer, if so
  177.         pop b ;recall the character
  178.     compout:
  179.         mov a,c ;recall the character
  180.         ;and compute column position
  181.         lxi h,column ;A = char, HL = .column
  182.         cpi rubout! rz ;no column change if nulls
  183.         inr m ;column = column + 1
  184.         cpi ' '! rnc ;return if graphic
  185.         ;not graphic, reset column position
  186.         dcr m ;column = column - 1
  187.         mov a,m! ora a! rz ;return if at zero
  188.         ;not at zero, may be backspace or end line
  189.         mov a,c ;character back to A
  190.         cpi ctlh! jnz notbacksp
  191.             ;backspace character
  192.             dcr m ;column = column - 1
  193.             ret
  194.         notbacksp:
  195.             ;not a backspace character, eol?
  196.             cpi cr! rnz ;return if not
  197.             ;end of line, column = 0
  198.             mvi m,0 ;column = 0
  199.         ret
  200. ;
  201. ctlout:
  202.     ;send C character with possible preceding up-arrow
  203.     mov a,c! call echoc ;cy if not graphic (or special case)
  204.     jnc tabout ;skip if graphic, tab, cr, lf, or ctlh
  205.         ;send preceding up arrow
  206.         push psw! mvi c,ctl! call conout ;up arrow
  207.         pop psw! ori 40h ;becomes graphic letter
  208.         mov c,a ;ready to print
  209. if BANKED
  210.         call chk$column! rz
  211. endif
  212.         ;(drop through to tabout)
  213. ;
  214. tabout:
  215.     ;IS FX AN INPUT FUNCTION?
  216.     LDA FX! DCR A! JZ TABOUT1 ;YES - ALWAYS EXPAND TABS FOR ECHO
  217.     ;HAS TAB EXPANSION BEEN DISABLED OR
  218.     ;ESCAPE SEQUENCE DECODING BEEN ENABLED?
  219.     LDA CONMODE! ANI 14H! JNZ CONOUT ;YES
  220. TABOUT1:
  221.     ;expand tabs to console
  222.     mov a,c! cpi tab! jnz conout ;direct to conout if not
  223.         ;tab encountered, move to next tab position
  224.     tab0:
  225.  
  226. if BANKED
  227.         lda fx! cpi 1! jnz tab1
  228.         call chk$column! rz
  229.     tab1:
  230. endif
  231.  
  232.         mvi c,' '! call conout ;another blank
  233.         lda column! ani 111b ;column mod 8 = 0 ?
  234.         jnz tab0 ;back for another if not
  235.     ret
  236. ;
  237. ;
  238. backup:
  239.     ;back-up one screen position
  240.     call pctlh
  241.  
  242. if BANKED
  243.     lda comchr! cpi ctla! rz
  244. endif
  245.  
  246.     mvi c,' '! call conoutf
  247. ;    (drop through to pctlh)                ;
  248. pctlh:
  249.     ;send ctlh to console without affecting column count
  250.     mvi c,ctlh! jmp conoutf
  251.     ;ret
  252. ;
  253. crlfp:
  254.     ;print #, cr, lf for ctlx, ctlu, ctlr functions
  255.     ;then move to strtcol (starting column)
  256.     mvi c,'#'! call conout
  257.     call crlf
  258.     ;column = 0, move to position strtcol
  259.     crlfp0:
  260.         lda column! lxi h,strtcol
  261.         cmp m! rnc ;stop when column reaches strtcol
  262.         mvi c,' '! call conout ;print blank
  263.         jmp crlfp0
  264. ;;
  265. ;
  266. crlf:
  267.     ;carriage return line feed sequence
  268.     mvi c,cr! call conout! mvi c,lf! jmp conout
  269.     ;ret
  270. ;
  271. print:
  272.     ;print message until M(BC) = '$'
  273.     LXI H,OUTDELIM
  274.     ldax b! CMP M! rz ;stop on $
  275.         ;more to print
  276.         inx b! push b! mov c,a ;char to C
  277.         call tabout ;another character printed
  278.         pop b! jmp print
  279. ;
  280. QCONIN:
  281.  
  282. if BANKED
  283.     lhld apos! mov a,m! sta ctla$sw
  284. endif
  285.     ;IS BUFFER ADDRESS = 0?
  286.     LHLD CONBUFFADD! MOV A,L! ORA H! JZ CONIN ;YES
  287.     ;IS CHARACTER IN BUFFER < 5?
  288.  
  289. if BANKED
  290.     call qconinx ; mov a,m with bank 1 switched in
  291. else
  292.     MOV A,M
  293. endif
  294.  
  295.     INX H
  296.     ORA A! JNZ QCONIN1 ; NO
  297.     LXI H,0
  298. QCONIN1:
  299.     SHLD CONBUFFADD! SHLD CONBUFFLEN! RNZ ; NO
  300.     JMP CONIN
  301.  
  302. if BANKED
  303.     
  304. chk$column:
  305.     lda conwidth! mov e,a! lda column! cmp e! ret
  306. ;
  307. expand:
  308.     xchg! lhld apos! xchg
  309. expand1:
  310.     ldax d! ora a! rz
  311.     inx d! inx h! mov m,a! inr b! jmp expand1
  312. ;
  313. copy$xbuff:
  314.     mov a,b! ora a! rz
  315.     push b! mov c,b! push h! xchg! inx d
  316.     lxi h,xbuff
  317.     call move
  318.     mvi m,0! shld xpos
  319.     pop h! pop b! ret
  320. ;
  321. copy$cbuff:
  322.     lda ccpflgs+1! ral! rnc
  323.     lxi h,xbuff! lxi d,cbuff! inr c! jnz copy$cbuff1
  324.     xchg! mov a,b! ora a! rz
  325.     sta cbuff$len
  326.     push d! lxi b,copy$cbuff2! push b
  327.     mov b,a
  328. copy$cbuff1:
  329.     inr b! mov c,b! jmp move
  330. copy$cbuff2:
  331.     pop h! dcx h! mvi m,0! ret
  332. ;
  333. save$col:
  334.     lda column! sta save$column! ret
  335. ;
  336. clear$right:
  337.     lda column! lxi h,ctla$column! cmp m! rnc
  338.     mvi c,20h! call conout! jmp clear$right
  339. ;
  340. reverse:
  341.     lda save$column! lxi h,column! cmp m! rnc
  342.     mvi c,ctlh! call conout! jmp reverse
  343. ;
  344. chk$buffer$size:
  345.     push b! push h
  346.     lhld apos! mvi e,0
  347. cbs1:
  348.     mov a,m! ora a! jz cbs2
  349.     inr e! inx h! jmp cbs1
  350. cbs2:
  351.     mov a,b! add e! cmp c
  352.     push a! mvi c,7! cnc conoutf
  353.     pop a! pop h! pop b! rc
  354.     pop d! pop d! jmp readnx
  355. ;
  356. refresh:
  357.     lda ctla$sw! ora a! rz
  358.     lda comchr! cpi ctla! rz
  359.     cpi ctlf! rz
  360.     cpi ctlw! rz
  361. refresh0:
  362.     push h! push b
  363.     call save$col
  364.     lhld apos
  365. refresh1:
  366.     mov a,m! ora a! jz refresh2
  367.     mov c,a! call chk$column! jc refresh05
  368.     mov a,e! sta column! jmp refresh2
  369. refresh05:
  370.     push h! call ctlout
  371.     pop h! inx h! jmp refresh1
  372. refresh2:
  373.     lda column! sta new$ctla$col
  374. refresh3:
  375.     call clear$right
  376.     call reverse
  377.     lda new$ctla$col! sta ctla$column
  378.     pop b! pop h! ret
  379. ;
  380. init$apos:
  381.     lxi h,aposi! shld apos
  382.     xra a! sta ctla$sw
  383.     ret
  384. ;
  385. init$xpos:
  386.     lxi h,xbuff! shld xpos! ret
  387. ;
  388. set$ctla$column:
  389.     lxi h,ctla$sw! mov a,m! ora a! rnz
  390.     inr m! lda column! sta ctla$column! ret
  391. ;
  392. readi:
  393.     call chk$column! cnc crlf
  394.     lda cbuff$len! mov b,a
  395.     mvi c,0! call copy$cbuff
  396. else
  397.  
  398. readi:
  399.     MOV A,D! ORA E! JNZ READ
  400.     LHLD DMAAD! SHLD INFO
  401.     INX H! INX H! SHLD CONBUFFADD
  402. endif
  403.  
  404. read:    ;read to info address (max length, current length, buffer)
  405.  
  406. if BANKED
  407.     call init$xpos
  408.     call init$apos
  409. readx:
  410.     call refresh
  411.     xra a! sta ctlw$sw
  412. readx1:
  413.  
  414. endif
  415.  
  416.     MVI A,1! STA FX
  417.     lda column! sta strtcol ;save start for ctl-x, ctl-h
  418.     lhld info! mov c,m! inx h! push h
  419.     XRA A! MOV B,A! STA SAVEPOS
  420.     CMP C! JNZ $+4
  421.     INR C
  422.     ;B = current buffer length,
  423.     ;C = maximum buffer length,
  424.     ;HL= next to fill - 1
  425.     readnx:
  426.         ;read next character, BC, HL active
  427.         push b! push h ;blen, cmax, HL saved
  428.         readn0:
  429.  
  430. if BANKED
  431.             lda ctlw$sw! ora a! cz qconin
  432. nxtline:
  433.             sta comchr
  434. else
  435.             CALL QCONIN ;next char in A
  436. endif
  437.  
  438.             ;ani 7fh ;mask parity bit
  439.             pop h! pop b ;reactivate counters
  440.             cpi cr! jz readen ;end of line?
  441.             cpi lf! jz readen ;also end of line
  442.  
  443. if BANKED
  444.             cpi ctlf! jnz not$ctlf
  445.         do$ctlf:
  446.             call chk$column! dcr e! cmp e! jnc readnx
  447.         do$ctlf0:
  448.             xchg! lhld apos! mov a,m! ora a! jz ctlw$l15
  449.             inx h! shld apos! xchg! jmp notr
  450.         not$ctlf:
  451.             cpi ctlw! jnz not$ctlw
  452.         do$ctlw:
  453.             xchg! lhld apos! mov a,m! ora a! jz ctlw$l1
  454.             xchg! call chk$column! dcr e! cmp e! xchg! jc ctlw$l0
  455.             xchg! call refresh0! xchg! jmp ctlw$l13
  456.         ctlw$l0:
  457.             lhld apos! mov a,m
  458.             inx h! shld apos! jmp ctlw$l3
  459.         ctlw$l1:
  460.             lxi h,ctla$sw! mov a,m! mvi m,0
  461.             ora a! jz ctlw$l2
  462.         ctlw$l13:
  463.             lxi h,ctlw$sw! mvi m,0
  464.         ctlw$l15:
  465.             xchg! jmp readnx
  466.         ctlw$l2:
  467.             lda ctlw$sw! ora a! jnz ctlw$l25
  468.             mov a,b! ora a! jnz ctlw$l15
  469.             call init$xpos
  470.         ctlw$l25:
  471.             lhld xpos! mov a,m! ora a
  472.             sta ctlw$sw! jz ctlw$l15
  473.             inx h! shld xpos
  474.         ctlw$l3:
  475.             lxi h,ctlw$sw! mvi m,ctlw
  476.             xchg! jmp notr
  477.         not$ctlw:
  478.             cpi ctla! jnz not$ctla
  479.         do$ctla:
  480.             ;do we have any characters to back over?
  481.             lda strtcol! mov d,a! lda column! cmp d
  482.             jz readnx
  483.             sta compcol ;COL > 0
  484.             mov a,b! ora a! jz linelen
  485.             ;characters remain in buffer, backup one
  486.             dcr b ;remove one character
  487.             ;compcol > 0 marks repeat as length compute
  488.             ;backup one position in xbuff
  489.             push h
  490.             call set$ctla$column
  491.             pop d
  492.             lhld apos! dcx h
  493.             shld apos! ldax d! mov m,a! xchg! jmp linelen
  494.         not$ctla:
  495.             cpi ctlb! jnz not$ctlb
  496.         do$ctlb:
  497.             lda save$pos! cmp b! jnz ctlb$l0
  498.             mvi a,ctlw! sta ctla$sw
  499.             sta comchr! jmp do$ctlw
  500.         ctlb$l0:
  501.             xchg! lhld apos! inr b
  502.         ctlb$l1:
  503.             dcr b! lda save$pos! cmp b! jz ctlb$l2
  504.             dcx h! ldax d! mov m,a! dcx d! jmp ctlb$l1
  505.         ctlb$l2:
  506.             shld apos
  507.             push b! push d
  508.             call set$ctla$column
  509.         ctlb$l3:
  510.             lda column! mov b,a
  511.             lda strtcol! cmp b! jz read$n0
  512.              mvi c,ctlh! call conout! jmp ctlb$l3
  513.         not$ctlb:
  514.             cpi ctlk! jnz not$ctlk
  515.             xchg! lxi h,aposi! shld apos
  516.             xchg! call refresh
  517.             jmp readnx
  518.         not$ctlk:
  519.             cpi ctlg! jnz not$ctlg
  520.             lda ctla$sw! ora a! jz readnx
  521.             jmp do$ctlf0
  522.         not$ctlg:
  523. endif
  524.  
  525.             cpi ctlh! jnz noth ;backspace?
  526.             LDA CTLH$ACT! INR A! JZ DO$RUBOUT
  527.         DO$CTLH:
  528.             ;do we have any characters to back over?
  529.             LDA STRTCOL! MOV D,A! LDA COLUMN! CMP D
  530.             jz readnx
  531.             STA COMPCOL ;COL > 0
  532.             MOV A,B! ORA A! JZ $+4
  533.             ;characters remain in buffer, backup one
  534.             dcr b ;remove one character
  535.             ;compcol > 0 marks repeat as length compute
  536.             jmp linelen ;uses same code as repeat
  537.         noth:
  538.             ;not a backspace
  539.             cpi rubout! jnz notrub ;rubout char?
  540.             LDA RUBOUT$ACT! INR A! JZ DO$CTLH
  541.         DO$RUBOUT:
  542. if BANKED
  543.             mvi a,rubout! sta comchr
  544.             lda ctla$sw! ora a! jnz do$ctlh
  545. endif
  546.             ;rubout encountered, rubout if possible
  547.             mov a,b! ora a! jz readnx ;skip if len=0
  548.             ;buffer has characters, resend last char
  549.             mov a,m! dcr b! dcx h ;A = last char
  550.             ;blen=blen-1, next to fill - 1 decremented
  551.             jmp rdech1 ;act like this is an echo
  552.         notrub:
  553.             ;not a rubout character, check end line
  554.             cpi ctle! jnz note ;physical end line?
  555.             ;yes, save active counters and force eol
  556.             push b! MOV A,B! STA SAVE$POS
  557.             push h
  558. if BANKED
  559.             lda ctla$sw! ora a! cnz clear$right
  560. endif
  561.             call crlf
  562. if BANKED
  563.             call refresh
  564. endif
  565.             xra a! sta strtcol ;start position = 00
  566.             jmp readn0 ;for another character
  567.         note:
  568.             ;not end of line, list toggle?
  569.             cpi ctlp! jnz notp ;skip if not ctlp
  570.             ;list toggle - change parity
  571.             push h ;save next to fill - 1
  572.             PUSH B
  573.             XRA A! CALL CONB3
  574.             POP B
  575.             pop h! jmp readnx ;for another char
  576.         notp:
  577.             ;not a ctlp, line delete?
  578.             cpi ctlx! jnz notx
  579.             pop h ;discard start position
  580.             ;loop while column > strtcol
  581.             backx:
  582.                 lda strtcol! lxi h,column
  583. if BANKED
  584.                 cmp m! jc backx1
  585.                 lhld apos! mov a,m! ora a! jnz readx
  586.                 jmp read
  587.                 backx1:
  588. else
  589.                 cmp m! jnc read ;start again
  590. endif
  591.                 dcr m ;column = column - 1
  592.                 call backup ;one position
  593.                 jmp backx
  594.         notx:
  595.             ;not a control x, control u?
  596.             ;not control-X, control-U?
  597.             cpi ctlu! jnz notu ;skip if not
  598. if BANKED
  599.             xthl! call copy$xbuff! xthl
  600. endif
  601.             ;delete line (ctlu)
  602.         do$ctlu:
  603.             call crlfp ;physical eol
  604.             pop h ;discard starting position
  605.             jmp read ;to start all over
  606.         notu:
  607.             ;not line delete, repeat line?
  608.             cpi ctlr! jnz notr
  609.             XRA A! STA SAVEPOS
  610. if BANKED
  611.             xchg! call init$apos! xchg
  612.             mov a,b! ora a! jz do$ctlu
  613.             xchg! lhld apos! inr b
  614.         ctlr$l1:
  615.             dcr b! jz ctlr$l2
  616.             dcx h! ldax d! mov m,a! dcx d
  617.             jmp ctlr$l1
  618.         ctlr$l2:
  619.             shld apos! push b! push d
  620.             call crlfp! mvi a,ctlw! sta ctlw$sw
  621.             sta ctla$sw! jmp readn0
  622. endif
  623.         linelen:
  624.             ;repeat line, or compute line len (ctlh)
  625.             ;if compcol > 0
  626.             push b! call crlfp ;save line length
  627.             pop b! pop h! push h! push b
  628.             ;bcur, cmax active, beginning buff at HL
  629.         rep0:
  630.             mov a,b! ora a! jz rep1 ;count len to 00
  631.             inx h! mov c,m ;next to print
  632.             DCR B
  633.             POP D! PUSH D! MOV A,D! SUB B! MOV D,A
  634.             push b! push h ;count length down
  635.             LDA SAVEPOS! CMP D! CC CTLOUT
  636.             pop h! pop b ;recall remaining count
  637.             jmp rep0 ;for the next character
  638.         rep1:
  639.             ;end of repeat, recall lengths
  640.             ;original BC still remains pushed
  641.             push h ;save next to fill
  642.             lda compcol! ora a ;>0 if computing length
  643.             jz readn0 ;for another char if so
  644.             ;column position computed for ctlh
  645.             lxi h,column! sub m ;diff > 0
  646.             sta compcol ;count down below
  647.             ;move back compcol-column spaces
  648.         backsp:
  649.             ;move back one more space
  650.             call backup ;one space
  651.             lxi h,compcol! dcr m
  652.             jnz backsp
  653. if BANKED
  654.             call refresh
  655. endif
  656.             jmp readn0 ;for next character
  657.         notr:
  658.             ;not a ctlr, place into buffer
  659.             ;IS BUFFER FULL?
  660.             PUSH A
  661.             MOV A,B! CMP C! JC RDECH0 ;NO
  662.             ;DISCARD CHARACTER AND RING BELL
  663.             POP A! PUSH B! PUSH H
  664.             MVI C,7! CALL CONOUTF! JMP READN0
  665.         RDECH0:
  666.  
  667. if BANKED
  668.             lda comchr! cpi ctlg! jz rdech05
  669.             lda ctla$sw! ora a! cnz chk$buffer$size
  670.         rdech05:
  671. endif
  672.  
  673.             POP A
  674.             inx h! mov m,a ;character filled to mem
  675.             inr b ;blen = blen + 1
  676.         rdech1:
  677.             ;look for a random control character
  678.             push b! push h ;active values saved
  679.             mov c,a ;ready to print
  680. if BANKED
  681.             call save$col
  682. endif
  683.             call ctlout ;may be up-arrow C
  684.             pop h! pop b
  685. if BANKED
  686.             lda comchr! cpi ctlg! jz do$ctlh
  687.             cpi rubout! jz rdech2
  688.             call refresh
  689.         rdech2:
  690. endif
  691.             LDA CONMODE! ANI 08H! JNZ NOTC
  692.             mov a,m ;recall char
  693.             cpi ctlc ;set flags for reboot test
  694.             mov a,b ;move length to A
  695.             jnz notc ;skip if not a control c
  696.             cpi 1 ;control C, must be length 1
  697.             jz REBOOTX ;reboot if blen = 1
  698.             ;length not one, so skip reboot
  699.         notc:
  700.             ;not reboot, are we at end of buffer?
  701. if BANKED
  702.             cmp c! jnc buffer$full
  703. else
  704.             jmp readnx ;go for another if not
  705. endif
  706.  
  707. if BANKED
  708.             push b! push h
  709.             call chk$column! jc readn0
  710.             lda ctla$sw! ora a! jz do$new$line
  711.             lda comchr! cpi ctlw! jz back$one
  712.             cpi ctlf! jz back$one
  713.                 
  714.         do$newline:
  715.             mvi a,ctle! jmp nxtline
  716.  
  717.         back$one:
  718.             ;back up to previous character
  719.             pop h! pop b
  720.             dcr b! xchg
  721.             lhld apos! dcx h! shld apos
  722.             ldax d! mov m,a! xchg! dcx h
  723.             push b! push h! call reverse
  724.             ;disable ctlb or ctlw
  725.             xra a! sta ctlw$sw! jmp readn0
  726.         
  727.         buffer$full:
  728.             xra a! sta ctlw$sw! jmp readnx
  729. endif
  730.         readen:
  731.             ;end of read operation, store blen
  732. if BANKED
  733.             call expand
  734. endif
  735.             pop h! mov m,b ;M(current len) = B
  736. if BANKED
  737.             push b
  738.             call copy$xbuff
  739.             pop b
  740.             mvi c,0ffh! call copy$cbuff
  741. endif
  742.             LXI H,0! SHLD CONBUFFADD
  743.             mvi c,cr! jmp conout ;return carriage
  744.             ;ret
  745. ;
  746. func1    equ    CONECH
  747.     ;return console character with echo
  748. ;
  749. func2:    equ    tabout
  750.     ;write console character with tab expansion
  751. ;
  752. func3:
  753.     ;return reader character
  754.     call readerf
  755.     jmp sta$ret
  756. ;
  757. ;func4:    equated to punchf
  758.     ;write punch character
  759. ;
  760. ;func5:    equated to listf
  761.     ;write list character
  762.     ;write to list device
  763. ;
  764. func6:
  765.     ;direct console i/o - read if 0ffh
  766.     mov a,c! inr a! jz dirinp ;0ffh => 00h, means input mode
  767.         inr a! JZ DIRSTAT ;0feh => direct STATUS function
  768.         INR A! JZ DIRINP1 ;0fdh => direct input, no status
  769.         JMP CONOUTF
  770.     DIRSTAT:
  771.         ;0feH in C for status
  772.         CALL CONSTX! JNZ LRET$EQ$FF! JMP STA$RET
  773.     dirinp:
  774.         CALL CONSTX ;status check
  775.         ora a! RZ ;skip, return 00 if not ready
  776.         ;character is ready, get it
  777.     dirinp1:
  778.         call CONIN ;to A
  779.         jmp sta$ret
  780. ;
  781. func7:
  782.     call auxinstf
  783.     jmp sta$ret
  784. ;
  785. func8:
  786.     call auxoutstf
  787.     jmp sta$ret
  788. ;
  789. func9:
  790.     ;write line until $ encountered
  791.     xchg    ;was lhld info    
  792.     mov c,l! mov b,h ;BC=string address
  793.     jmp print ;out to console    
  794.  
  795. func10    equ    readi
  796.     ;read a buffered console line
  797.  
  798. func11:
  799.     ;IS CONMODE(1) TRUE?
  800.     LDA CONMODE! RAR! JNC NORMAL$STATUS ;NO
  801.     ;CTL-C ONLY STATUS CHECK
  802. if BANKED
  803.     LXI H,QFLAG! MVI M,80H! PUSH H
  804. endif
  805.     LXI H,CTLC$STAT$RET! PUSH H
  806.     ;DOES KBCHAR = CTL-C?
  807.     LDA KBCHAR! CPI CTLC! JZ CONB1 ;YES
  808.     ;IS THERE A READY CHARACTER?
  809.     CALL CONSTF! ORA A! RZ ;NO
  810.     ;IS THE READY CHARACTER A CTL-C?
  811.     CALL CONINF! CPI CTLC! JZ CONB0 ;YES
  812.     STA KBCHAR! XRA A! RET
  813.  
  814. CTLC$STAT$RET:
  815.  
  816. if BANKED
  817.     CALL STA$RET
  818.     POP H! MVI M,0! RET
  819. else
  820.     JMP STA$RET
  821. endif
  822.  
  823. NORMAL$STATUS:
  824.     ;check console status
  825.     call conbrk
  826.     ;(drop through to sta$ret)
  827. sta$ret:
  828.     ;store the A register to aret
  829.     sta aret
  830. func$ret:                        ;
  831.     ret ;jmp goback (pop stack for non cp/m functions)
  832. ;
  833. setlret1:
  834.     ;set lret = 1
  835.     mvi a,1! jmp sta$ret                ;
  836. ;
  837. FUNC109:            ;GET/SET CONSOLE MODE
  838.     ;DOES DE = 0FFFFH?
  839.     MOV A,D! ANA E! INR A
  840.     LHLD CONMODE! JZ STHL$RET ;YES - RETURN CONSOLE MODE
  841.     XCHG! SHLD CONMODE! RET ;NO - SET CONSOLE MODE
  842. ;
  843. FUNC110:            ;GET/SET FUNCTION 9 DELIMITER
  844.     LXI H,OUT$DELIM
  845.     ;DOES DE = 0FFFFH?
  846.     MOV A,D! ANA E! INR A
  847.     MOV A,M! JZ STA$RET ;YES - RETURN DELIMITER
  848.     MOV M,E! RET ;NO - SET DELIMITER
  849. ;
  850. FUNC111:            ;PRINT BLOCK TO CONSOLE
  851. FUNC112:            ;LIST BLOCK
  852.     XCHG! MOV E,M! INX H! MOV D,M! INX H
  853.     MOV C,M! INX H! MOV B,M! XCHG
  854.     ;HL = ADDR OF STRING
  855.     ;BC = LENGTH OF STRING
  856. BLK$OUT:
  857.     MOV A,B! ORA C! RZ
  858.     PUSH B! PUSH H! MOV C,M
  859.     LDA FX! CPI 111! JZ BLK$OUT1
  860.     CALL LISTF! JMP BLK$OUT2
  861. BLK$OUT1:
  862.     CALL TABOUT
  863. BLK$OUT2:
  864.     POP H! INX H! POP B! DCX B
  865.     JMP BLK$OUT
  866.  
  867. SCONOUTF    EQU    CONOUTF
  868.  
  869. ;
  870. ;    data areas
  871. ;
  872. compcol:db    0    ;true if computing column position
  873. strtcol:db    0    ;starting column position after read
  874.  
  875. if not BANKED
  876.  
  877. kbchar:    db    0    ;initial key char = 00
  878.  
  879. endif
  880.  
  881. SAVEPOS:DB    0    ;POSITION IN BUFFER CORRESPONDING TO
  882.             ;BEGINNING OF LINE
  883. if BANKED
  884.  
  885. comchr:        db    0
  886. cbuff$len:    db    0
  887. cbuff:        ds    256
  888.         db    0
  889. xbuff:        db    0
  890.         ds    354
  891. aposi:        db    0
  892. xpos:        dw    0
  893. apos:        dw    0
  894. ctla$sw:    db    0
  895. ctlw$sw:    db    0
  896. save$column:    db    0
  897. ctla$column:    db    0
  898. new$ctla$col:    db    0
  899.  
  900. endif
  901.  
  902. ;    end of BDOS Console module
  903.