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 / BDOS / NOVADOSI.LBR / NVDS-1.ZZ0 / NVDS-1.Z80
Text File  |  2000-06-30  |  21KB  |  689 lines

  1.      if    z33adr or intadr
  2.         .phase  bdosloc
  3.      endif
  4.  
  5. boot    equ    p2bios+00000h        ; P2 system cold boot
  6. wboot    equ    p2bios+00003h        ; P2 system warm boot
  7. const    equ    p2bios+00006h        ; P2 system console status
  8. conin    equ    p2bios+00009h        ; P2 system console input
  9. conout    equ    p2bios+0000ch        ; P2 system console output
  10. list    equ    p2bios+0000fh        ; P2 system list output
  11. punch    equ    p2bios+00012h        ; P2 system punch output
  12. reader    equ    p2bios+00015h        ; P2 system reader input
  13. home    equ    p2bios+00018h        ; P2 system home disk
  14. seldsk    equ    p2bios+0001bh        ; P2 system select disk
  15. settrk    equ    p2bios+0001eh        ; P2 system select track
  16. setsec    equ    p2bios+00021h        ; P2 system select sector
  17. setdma    equ    p2bios+00024h        ; P2 system set DMA address
  18. read    equ    p2bios+00027h        ; P2 system read 128 bytes
  19. write    equ    p2bios+0002ah        ; P2 system write 128 bytes
  20. listst    equ    p2bios+0002dh        ; P2 system list status
  21. sectrn    equ    p2bios+00030h        ; P2 system sector translation
  22.     if    dotime
  23. time    equ    p2bios+timeoff        ; P2 system get/set time
  24.     endif                ; Must be changed if routine present
  25.  
  26. ; Internal definitions
  27. ;
  28. contc    equ    003h            ; Key to generate warm boot
  29. conte    equ    005h            ; Break line
  30. conth    equ    008h            ; Backspace
  31. tab    equ    009h            ; Tab
  32. lf    equ    00ah            ; Line feed
  33. cr    equ    00dh            ; Carriage return
  34. contp    equ    010h            ; Set/reset print flag
  35. contr    equ    012h            ; Repeat line
  36. conts    equ    013h            ; Stop console output
  37. contu    equ    015h            ; Delete line
  38. contx    equ    018h            ; Delete line (backspaces)
  39. drvsep    equ    03ah            ; Drive seperator (:)
  40. rubout    equ    07fh            ; Delete last char
  41. ;
  42.      if    hifuncs
  43. maxcmd    equ    52            ; Number of valid P2dos commands
  44.      else
  45.      if    pathcall
  46. maxcmd    equ    42
  47.      else
  48. maxcmd    equ    41
  49.      endif
  50.      endif
  51.  
  52. dosstrt    equ    $
  53. ;
  54. ; Start program
  55. ;    
  56. P2dos::
  57. ;
  58. vers:    version                ; Macro in header file
  59.     db    0
  60. ;
  61. ; Start P2dos
  62. ;
  63. start:    jp    entry            ; Jump to entry point P2dos
  64. ;
  65. ; Error messages P2dos
  66. ;
  67. ; Bad sector message changed to read/write messages-b.h.
  68. stbdsc:    defw    0000            ; Bad sector message (dummy)
  69. stsel:    defw    selerr            ; Select error
  70. stro:    defw    rdonly            ; Drive read only
  71. sfilro:    defw    filro            ; File read only
  72. srderr:    defw    rderr            ; Read error message
  73. swrter:    defw    wrterr            ; Write error message
  74. ;
  75. ; External path name
  76. ;
  77.      if    ispath
  78. path:    defw    ramlow+pathoff        ; Pathname for open file command
  79.      endif
  80. ;
  81. ; Time address P2bios
  82. ;
  83.     if    dotime
  84. timead:    defw    time            ; Time routine address for time
  85.                     ; and date stamps
  86.     else
  87. timead:    defw    const
  88.     endif
  89. ;
  90. ; Flags for specials
  91. ; Bit 0: Public file                 enable(1)/disable(0)
  92. ; Bit 1: Delay 256 characters             active(1)/disable(0)
  93. ; Bit 2: Allow high bits into console buffer    yes(1)/no(0)
  94. ; Bit 3: Allow high bits output            yes(1)/no(0)
  95. ; Bit 4: Public attribute files are R/O        yes(1)/no(0)
  96. ;
  97. flags:    db    flagbyte        ; Flag bite
  98. ;
  99. ; Entry point P2dos commands
  100. ;
  101. entry:    ld    a,c            ; Get function number
  102.     ld    (funct),a        ; Save it for later use
  103.     xor    a            ; Clear a
  104.     sbc    hl,hl            ; Set hl to zero
  105.     ld    (pexit),hl        ; Clear exit code
  106.     ld    (passfg),hl        ; Reset pass flag and read/write flag
  107.     ld    (retflg),hl        ; Reset return flag and drv sel done flg
  108.     ld    (spsave),sp        ; Save stack pointer
  109.     ld    sp,p2doss        ; Get internal stack pointer
  110.     push    ix            ; Save index register
  111.     push    de            ; Save parameter register
  112.     pop    ix            ; Get it back in ix
  113.      if    relfunc
  114.     exx                ; Save alternate registers too
  115.     push    hl            ; if using relocation function
  116.     push    de
  117.     exx
  118.      endif
  119.     ld    hl,p2exit        ; Get exit address P2dos
  120.     push    hl            ; Save it on stack to return from P2dos
  121.     ld    a,c            ; Get function code
  122. ;
  123.     if    dotime
  124.     cp    200            ; Test get time
  125.     jp    z,gettim        ; Yes then get time
  126.     cp    201            ; Test set time
  127.     jp    z,settim        ; Yes then set time
  128.     endif
  129. ;
  130.     cp    maxcmd+1        ; Test greater then maxcmd 
  131.     ret    nc            ; If so return to caller and do nothing
  132.     ld    hl,ctable        ; Load table
  133.     ld    b,0            ; Prepare 16 bit add
  134.     add    hl,bc            ; Add
  135.     add    hl,bc            ; Add twice to get word value
  136.     ld    a,(hl)            ; Get LSB
  137.     inc    hl            ; Pointer to MSB
  138.     ld    h,(hl)            ; Get MSB
  139.     ld    l,a            ; Save LSB in l 
  140.     ld    c,e            ; Put argument in C for BIOS
  141.     ld    a,e            ; Put argument in A for DOS
  142.     jp    (hl)            ; Jump to routine
  143. ;
  144. ; Command table
  145. ;
  146. ;
  147. ; Func    Name            Input Parameters    Returned Values
  148. ;   0    boot            none            none
  149. ;   1    console input        none            a=character
  150. ;   2    console output        e=character        a=00h
  151. ;   3    reader input        none            a=character
  152. ;   4    punch output        e=character        a=00h
  153. ;   5    list output        e=character        a=00h
  154. ;   6    direct console I/O    e=0ffh            a=input character
  155. ;                            a=00h if no character 
  156. ;                                present
  157. ;                e=0feh            a=console status
  158. ;                e=000h..0fdh        a=00h
  159. ;   7    get I/O byte        none            a=I/O byte (ramlow+03h)
  160. ;   8    set I/O byte        e=I/O byte        a=00h
  161. ;   9    print string        de=address string    a=00h
  162. ;  10    read console buffer    de=address buffer    a=00h
  163. ;  11    get console status    none            a=00h if no character 
  164. ;                                present
  165. ;                            01h if character present
  166. ;  12    return version number    none            a=version number (022h)
  167. ;  13    reset disk system    none            a=00h no $*.* file
  168. ;                            a=ffh $*.* file present
  169. ;  14    select disk        e=disk number        a=00h
  170. ;  15    open file        de=address FCB        a=directory code
  171. ;  16    close file        de=address FCB        a=directory code
  172. ;  17    search for first    de=address FCB        a=directory code
  173. ;  18    search for next        de=address FCB        a=directory code
  174. ;  19    delete file        de=address FCB        a=error code
  175. ;  20    read sequential        de=address FCB        a=read/write code
  176. ;  21    write sequential    de=address FCB        a=read/write code
  177. ;  22    make file        de=address FCB        a=directory code
  178. ;  23    rename file        de=address FCB        a=error code
  179. ;  24    return login vector    none            hl=login vector
  180. ;  25    return current disk    none            a=current disk
  181. ;  26    set DMA address        de=DMA address        a=00h
  182. ;  27    get allocation address    none            hl=address allocation 
  183. ;                                vector
  184. ;  28    write protect disk    none            a=00h
  185. ;  29    get r/o vector        none            hl=r/o vector
  186. ;  30    set file attributes    de=address FCB        a=error code
  187. ;  31    get address dpb        none            hl=address dpb
  188. ;  32    set/get user code    e=0ffh            a=user number
  189. ;                e=user number        a=00h
  190. ;  33    read random        de=address FCB        a=read/write code
  191. ;  34    write random        de=address FCB        a=read/write code
  192. ;  35    compute file size    de=address FCB        a=error code
  193. ;  36    set random record    de=address FCB        a=00h
  194. ;  37    reset multiple drive    de=mask            a=00h
  195. ;  38    not implemented        none            a=00h
  196. ;  39 * get perm. media vector    none            hl=perm. media vector
  197. ;  40    write random with    de=address FCB        a=read/write code
  198. ;     zero fill
  199. ;  41   set flags byte        e=flags            none
  200. ;  42    get/set DOS path    de=path, de=00        current path if de=0
  201. ;  47 * return DMA address    none            hl=DMA address
  202. ;  48 * return ZRDOS version    none            hl=a valid ZRDOS vs. # 
  203. ;  50 * set warm boot trap    de=trap address        none
  204. ;  52 * reset warm boot trap    none            none
  205. ; 200    get time        de=address to put time    a=00h
  206. ; 201    set time        de=address time        a=00h
  207. ;
  208. ; Function numbers marked with * are ZRDOS functions selectable by assembly
  209. ; option.
  210. ;
  211. ; Directory code : a=00h,01h,02h,03h if no error
  212. ;                  a=0ffh if error
  213. ; Error code     : a=00h if no error
  214. ;                  a=0ffh if error
  215. ; Read/write code: a=00h if no error
  216. ;           a=01h read  => end of file
  217. ;             write => directory full
  218. ;           a=02h disk full
  219. ;
  220. ctable:    defw    wboot            ; Warm boot 
  221.     defw    rdcon            ; Console input
  222.     defw    bwrcon            ; Console output
  223.     defw    rdrdr            ; Reader input
  224.     defw    punch            ; Punch output        - BIOS direct
  225.     defw    list            ; List output        - BIOS direct
  226.     defw    dcio            ; Direct console I/O
  227.     defw    giost            ; Get I/O byte
  228.     defw    siost            ; Set I/O byte
  229.     defw    mess            ; Print string
  230.     defw    rdbuf            ; Read console buffer
  231.     defw    tstcs            ; Get console status
  232.     defw    cmnd12            ; Return version number
  233.     defw    cmnd13            ; Reset disk system
  234.     defw    cmnd14            ; Select disk
  235.     defw    cmnd15            ; Open file
  236.     defw    cmnd16            ; Close file
  237.     defw    cmnd17            ; Search for first
  238.     defw    cmnd18            ; Search for next
  239.     defw    cmnd19            ; Delete file
  240.     defw    cmnd20            ; Read sequential
  241.     defw    cmnd21            ; Write sequential
  242.     defw    cmnd22            ; Make file
  243.     defw    cmnd23            ; Rename file
  244.     defw    cmnd24            ; Return login vector
  245.     defw    cmnd25            ; Return current disk
  246.     defw    cmnd26            ; Set DMA address
  247.     defw    cmnd27            ; Get address allocation vector
  248.     defw    cmnd28            ; Write protect disk
  249.     defw    cmnd29            ; Get r/o vector
  250.     defw    cmnd30            ; Set file attributes
  251.     defw    cmnd31            ; Get address disk parameter header(dph) 
  252.     defw    cmnd32            ; Get/set user code
  253.     defw    cmnd33            ; Read random
  254.     defw    cmnd34            ; Write random
  255.     defw    cmnd35            ; Compute file size
  256.     defw    cmnd36            ; Set random record
  257.     defw    cmnd37            ; Reset multiple drive
  258.      if    relfunc
  259.     defw    cmnd38            ; Relocation
  260.      else
  261.     defw    dummy
  262.      endif
  263.      if    hifuncs
  264.     defw    permdsk            ; Get permanent medium vector 
  265.      else
  266.     defw    dummy
  267.      endif
  268.     defw    cmnd40            ; Write random with zero fill
  269.     defw    setflag            ; Set the flags byte
  270.      if    pathcall and ispath
  271.     defw    setpath            ; Set the DOS path address
  272.      else
  273.      if    hifuncs
  274.     defw    dummy
  275.      endif
  276.      endif
  277.      if    hifuncs
  278.     defw    dummy            ; Not implemented
  279.     defw    dummy            ; Not implemented
  280.     defw    dummy            ; Not implemented
  281.     defw    dummy            ; Not implemented
  282.     defw    getdma            ; Return DMA address
  283.     defw    zrdos            ; Return ZRDOS version number
  284.     defw    dummy            ; Not implemented
  285.     defw    wbtrap            ; Set a warm boot trap
  286.     defw    dummy            ; Not implemented
  287.     defw    wbtres            ; Reset warm boot trap
  288.      endif
  289. ;
  290. ; I/O routines
  291. ;
  292. ; P2dos console input
  293. ;
  294. ; Read character from console and echo
  295. ;  if char=cr,lf,tab,conth or >=space
  296. ;
  297. rdcon:    call    getch            ; Get character
  298.     call    tstch            ; Test if cr,lf,tab,conth or >=space
  299.     jr    c,exit            ; No then exit
  300.     call    wrcon            ; Echo character
  301. exit:    ld    (pexit),a        ; Return character 
  302. dummy:    ret                ; And exit P2dos
  303. ;
  304. ; Read reader
  305. ;
  306. rdrdr:    call    reader            ; Get character from reader
  307.     jr    exit            ; And return it to caller 
  308. ;
  309. ;
  310. ; Direct console input/output
  311. ;
  312. dcio:    inc    e            ; Test if 0ffh
  313.     jr    z,dcio0            ; Yes do input
  314.     inc    e            ; Test if 0feh
  315.     jp    nz,conout        ; No then output character
  316.     call    const            ; Get console status
  317.     jr    exit            ; And return it to caller
  318. dcio0:    call    gconst            ; Get console status (release I)
  319.     or    a            ; Test it
  320.     ret    z            ; Exit if no character present
  321.     call    getch            ; Get character         (release I)
  322.     jr    exit            ; And return it to caller
  323. ;
  324. ; Get I/O status byte
  325. ;
  326. giost:    ld    a,(ramlow+03h)        ; Get I/O byte from ram
  327.     jr    exit            ; And return it to caller
  328. ;
  329. ; Set I/O status byte
  330. ;
  331. siost:    ld    (ramlow+03h),a        ; And save it in ram
  332.     ret                ; Exit to caller
  333. ;
  334. ; Test console status
  335. ;
  336. tstcs:    call    gconst            ; Get console status
  337.     jr    exit            ; And return it to caller
  338. ;
  339. ; Output char (control char = ^char)
  340. ;
  341. outch:    call    tstch            ; Test it cr,lf,tab,conth or >=space
  342.     jr    nc,wrcon        ; Yes then jump
  343.     push    af            ; Save character
  344.     ld    a,'^'            ; Load a with '^' 
  345.     call    wrcon            ; Output it
  346.     pop    af            ; Get character back
  347.     push    af            ; Save it again
  348.     add    a,'A'-1            ; Add offset
  349.     call    wrcon            ; Output it
  350.     pop    af            ; Get character
  351.     ret                ; Return to caller
  352. ;
  353. ; Echo cr,lf
  354. ;
  355. crout:    ld    a,cr            ; A=carriage return
  356.     call    wrcon            ; Output it
  357.     ld    a,lf            ; A=line feed
  358.                     ; fall through to output routine
  359. ;
  360. ; Write character on console
  361. ;
  362. ;
  363. ; P2dos write console
  364. ;
  365. bwrcon:
  366. wrcon:    cp    tab            ; Test if tab
  367.     jr    nz,wrcon1        ; No then jump
  368. wrcon0:    ld    a,' '            ; Expand tab with spaces
  369.     call    wrcon            ; Write space
  370.     ld    a,(tabcnt)        ; Get tab count
  371.     and    7            ; Test if done
  372.     jr    nz,wrcon0        ; No then repeat
  373.     ld    a,tab            ; Return tab
  374.     ret                ; Return to caller
  375. wrcon1:    push    af            ; Save character
  376.     call    gconst            ; Test status and conts/contc
  377.     pop    af            ; Get character back
  378.     push    af            ; Save it again
  379.      if    hibiton
  380.     ld    hl,flags        ; Get the output high bit flag
  381.     bit    3,(hl)            ; Output high bit is flag bit 3
  382.     jr    nz,shohb        ; If not set, output the character
  383.     and    07fh            ; Else mask off the high bit
  384.      endif
  385. shohb:    ld    c,a
  386.     call    conout            ; Output it
  387.     pop    af            ; Get character back
  388.     push    af            ; Save it again
  389.     ld    c,a            ; Copy it
  390.     ld    a,(fcontp)        ; Get printer echo flag 
  391.     or    a            ; Test it
  392.     call    nz,list            ; Non zero => output char to printer
  393.     ld    a,(flags)        ; Get flag byte
  394.     bit    1,a            ; Test delay 256 bytes active
  395.     jr    z,wrcon2        ; No then exit
  396.     ld    hl,delay        ; Get delay counter
  397.     xor    a            ; A=0 
  398.     or    (hl)            ; Test counter=0
  399.     jr    z,wrcon2        ; Yes then exit
  400.     dec    (hl)            ; Else decrement counter
  401. wrcon2:    pop    af            ; Restore character
  402.                     ; fall through to count routine
  403. ;
  404. ; Count characters in line
  405. ;
  406. countc:    ld    hl,tabcnt        ; Get pointer to tab counter
  407. ; Part of delete key fix--b.h.
  408. ;    cp    rubout            ; Test if character = rubout
  409. ;    ret    z            ; Yes no update tab counter
  410.     inc    (hl)            ; Increment tab counter
  411.     cp    ' '            ; Test if char >= ' '
  412.     ret    nc            ; Yes, normal character then exit
  413.     dec    (hl)            ; Control character, decrement tab count
  414.     cp    conth            ; Test backspace
  415.     jr    nz,count0        ; No backspace then jump
  416.     dec    (hl)            ; Decrement tab counter
  417.     ret                ; And exit
  418.     cp    rubout
  419.     jr    nz,count0
  420.     dec    (hl)
  421.     ret
  422. count0:    cp    cr            ; Test carriage return
  423.     jr    nz,count1        ; No then jump
  424.     ld    (hl),0            ; Reset tab count
  425.     ret                ; And exit
  426. count1:    cp    tab            ; Test tab character
  427.     ret    nz            ; No then exit
  428.     push    af            ; Save character
  429.     ld    a,(hl)            ; Get tab count
  430.     add    a,8            ; Advance it 8 position
  431.     and    0f8h            ; Set it to next tab position
  432.     ld    (hl),a            ; Save it
  433.     pop    af            ; Restore character 
  434.     ret                ; And exit
  435. ;
  436. ; Get character from console
  437. ;
  438. getch:    ld    hl,lastch        ; Get pointer to last input character
  439.     ld    a,(hl)            ; Get character
  440.     ld    (hl),0            ; Reset last character
  441.     or    a            ; Test if character present
  442.     ret    nz            ; Return if so
  443.     jp    conin            ; Else get character
  444. ;
  445. ; Get console status
  446. ;
  447. gconst:    ld    a,(delay)        ; Get 256 bytes delay
  448.     or    a            ; Test it
  449.     jr    nz,gcons0        ; Non zero, delay stil active or disabled
  450.     call    const            ; Get console status
  451.     and    1            ; Test it
  452.     jr    nz,gcons1        ; Non zero then get character
  453. gcons0:    ld    a,(lastch)        ; Get last character
  454.     or    a            ; Test it
  455.     jr    nz,gcons3        ; Non zero then character present
  456.     call    const            ; Get console status
  457.     and    1            ; Test it
  458.     ret    z            ; Return if no character present
  459. gcons1:    call    conin            ; Get character
  460.     cp    conts            ; Test stop character
  461.     jr    nz,gcons2        ; Not then exit character
  462.     call    conin            ; Get next character
  463.     cp    contc            ; Test if user wants to exit
  464.     jp    z,error5a        ; Yes then warm boot
  465.     jr    gconst            ; Test again
  466. gcons2:    ld    (lastch),a        ; Save character
  467.     ld    a,0ffh            ; Set delay counter
  468.     ld    (delay),a        ; And save it
  469. gcons3:    ld    a,0ffh            ; Character present code
  470.     ret                ; Return to caller
  471. ;
  472. ; Test character
  473. ; Exit carry=0: cr,lf,tab,conth or >= space
  474. ;      carry=1: All other characters
  475. ;
  476. tstch:    cp    cr            ; Test carriage return
  477.     ret    z            ; Return if so
  478.     cp    lf            ; Test line feed
  479.     ret    z            ; Return if so
  480.     cp    tab            ; Test tab
  481.     ret    z            ; Return if so
  482.     cp    conth            ; Test backspace
  483. ; Added next two lines as a part of delete key fix--b.h.
  484.     ret    z            ; Return if so
  485.     cp    rubout
  486.     ret    z
  487.     cp    ' '            ; Test >=space
  488.     ret                ; Return to caller
  489. ;
  490. ; Write backspace,space,backcpace
  491. ;
  492. wconth:    call    wcont0            ; Write backspace
  493.     ld    c,' '            ; Load space
  494.     call    conout            ; And output it
  495. wcont0:    ld    c,conth            ; Load backspace
  496.     jp    conout            ; And output it
  497. ;
  498. ; Output message
  499. ;
  500. mess:    ld    a,(de)            ; Get byte from buffer
  501.     cp    '$'            ; Test last byte
  502.     ret    z            ; Yes, then return to caller
  503.     inc    de            ; Point to next byte
  504.     push    de            ; Save pointer
  505.     call    wrcon            ; Output character
  506.     pop    de            ; Restore pointer
  507.     jr    mess            ; And test again
  508. ;
  509. ; Again prints #,cr,lf and advances to tabcx1
  510. ;
  511. again:    ld    a,'#'            ; Load '#'
  512.     call    wrcon            ; Output it
  513. again0:    call    crout            ; Output carriage return/line feed
  514. again1:    ld    hl,tabcnt        ; Get tab count pointer
  515.     ld    a,(tabcx1)        ; Get position first character line
  516.     cp    (hl)            ; Check it
  517.     ret    z            ; Return if on same position
  518.     ld    a,' '            ; Load space
  519.     call    wrcon            ; Output it
  520.     jr    again1            ; And test again
  521. ;
  522. ; Delete char
  523. ; Entry : hl=start buffer-1
  524. ;         b =character counter (always>0)
  525. ;
  526. delch:    dec    b            ; Decrement character counter
  527.     ld    a,(tabcnt)        ; Get tab counter
  528.     push    af            ; Save it
  529.     push    bc            ; Save character counter
  530.     ld    a,(tabcx1)        ; Get position first character line
  531.     ld    (tabcnt),a        ; Save it in tab counter
  532. delch0:    ld    a,b            ; Copy character counter
  533.     or    a            ; Test if 0
  534.     jr    z,delch2        ; Yes then jump
  535.     dec    b            ; Decrement it
  536.     inc    hl            ; Increment buffer pointer
  537.     ld    a,(hl)            ; Get character from buffer
  538.     push    hl            ; Save buffer pointer
  539.     call    tstch            ; Test if cr,lf,tab,conth or >=sp
  540.     jr    nc,delch1        ; Yes then jump
  541.     rra                ; Else must be control character
  542.     call    countc            ; Count control character twice
  543. delch1:    call    countc            ; Count character
  544.     pop    hl            ; Get buffer pointer
  545.     jr    delch0            ; And test again
  546. delch2:    pop    bc            ; Restore character counter
  547.     pop    af            ; And tab counter
  548.     push    hl            ; Save buffer pointer
  549.     push    bc            ; And character counter
  550.     ld    hl,tabcnt        ; Get tab counter pointer
  551.     sub    (hl)            ; Calculate difference
  552. delch3:    dec    a            ; Decrement it
  553.     cp    8            ; Compare with 8
  554.     jr    nc,delch4        ; Jump if >=8
  555.     push    af            ; Save difference
  556.     call    wconth            ; Remove character end line
  557.     pop    af            ; Restore counter
  558.     jr    delch3            ; Remove more characters
  559. delch4:    pop    bc            ; Restore character counter
  560.     pop    hl            ; Restore buffer pointer
  561.     ret                ; And return to caller 
  562. ;
  563. ; Read buffer
  564. ;
  565. rdbuf:    ld    a,(tabcnt)        ; Get current position cursor
  566.     ld    (tabcx1),a        ; Save it
  567. rdbuf0:    push    ix            ; Save start address buffer
  568.     pop    hl            ; Get it in hl
  569.     ld    c,(hl)            ; Get maximum line length
  570.     inc    hl            ; Increment to line length position
  571.     ld    b,0            ; Clear line length counter
  572.     push    hl            ; Save start line - 1
  573. rdbuf1:    push    hl            ; Save registers
  574.     push    bc
  575. rdbuf2:    call    getch            ; Get character
  576.     pop    bc            ; Restore registers
  577.      if    hibiton
  578.     ld    hl,flags
  579.     bit    2,(hl)            ; Allow high bits in command line
  580.      endif
  581.     pop    hl            ; if flags bit 2 is set
  582.      if    hibiton
  583.     jr    nz,hibit
  584.      endif
  585.     and    07fh            ; Mask character
  586. hibit:
  587.     cp    conte            ; Test if conte
  588.     jr    nz,rdbuf3        ; Not then jump 
  589.     push    hl            ; Save registers
  590.     push    bc
  591.     call    again0            ; Move cursor to next line
  592.     jr    rdbuf2            ; And get next char
  593. rdbuf3:    cp    conth            ; Test backspace
  594.     jr    nz,rdbuf4        ; Not then jump
  595. doback:    ld    a,b            ; Test if deleting char from empty line
  596.     or    a
  597.     jr    z,rdbuf1        ; Yes then get next char
  598.     pop    hl            ; Get start line
  599.     push    hl            ; And save it again
  600.     call    delch            ; Delete character
  601.     jr    rdbuf1            ; Get next character
  602. rdbuf4:    cp    contp            ; Test print enable/disable
  603.      if    contron
  604.     jr    nz,rdbuf6        ; Not then jump
  605.      else
  606.     jr    nz,rdbufa
  607.      endif
  608.     ld    a,(fcontp)        ; Complement print flag
  609.     cpl
  610.     ld    (fcontp),a
  611. rdbuf5:    jr    rdbuf1            ; And get next character
  612.      if    contron
  613. rdbuf6:    cp    contr            ; Test repeat line
  614.     jr    nz,rdbufa        ; Not then jump
  615.     push    bc            ; Save registers
  616.     call    again            ; Move cursor to next line
  617.     pop    bc            ; Restore registers
  618.     pop    hl            ; Get start line
  619.     push    hl            ; Save it again
  620.     push    bc            ; Save line counter/maximum line length
  621. rdbuf7:    ld    a,b            ; Test last character echoed 
  622.     or    a
  623.     jr    z,rdbuf8        ; Yes then jump
  624.     inc    hl            ; Increment pointer
  625.     ld    a,(hl)            ; Get character
  626.     dec    b            ; Decrement line counter
  627.     push    hl            ; Save registers
  628.     push    bc
  629.     call    outch            ; Output character
  630.     pop    bc            ; Restore registers
  631.     pop    hl
  632.     jr    rdbuf7            ; And test end line
  633. rdbuf8:    pop    bc            ; Restore line counter/max line length
  634. rdbuf9:    jr    rdbuf5            ; And get next char
  635.      endif    ; contron
  636. rdbufa:    cp    contu            ; Test delete line
  637.     jr    nz,rdbufc        ; Not then jump
  638.     pop    hl            ; Get start line
  639.     call    again            ; Move cursor to next line
  640. rdbufb:    jr    rdbuf            ; And start routine again
  641. rdbufc:    cp    contx            ; Test delete line
  642.     jr    nz,rdbufe        ; Not then jump
  643. rdbufd:    pop    hl            ; Get start line
  644.     ld    a,b            ; Test if last character deleted
  645.     or    a
  646.     jr    z,rdbufb        ; Yes start routine again
  647.     push    hl            ; Save pointer
  648.     call    delch            ; Delete last character line
  649.     jr    rdbufd            ; Test last character deleted
  650. rdbufe:    cp    rubout            ; Test delete last character
  651.     jr    nz,rdbuff        ; Not then jump
  652.     jr    doback            ; Part of delete key fix
  653. ; Remove code for echoing deleted character--b.h.
  654. ;    ld    a,b            ; Test first character line
  655. ;    or    a
  656. ;    jr    z,rdbuf9        ; Yes, do not delete
  657. ;    ld    a,(hl)            ; Get last character
  658. ;    dec    hl            ; Decrement pointer line
  659. ;    dec    b            ; Decrement line counter
  660. ;    jr    rdbufg            ; Echo last character
  661. rdbuff:    cp    cr            ; Test carriage return
  662.     jr    z,rdbufi        ; Yes, then exit
  663.     cp    lf            ; Test line feed
  664.     jr    z,rdbufi        ; Yes then exit
  665.     inc    hl            ; Increment pointer
  666.     ld    (hl),a            ; And save character
  667.     inc    b            ; Increment line counter
  668. rdbufg:    push    hl            ; Save registers
  669.     push    bc
  670.     call    outch            ; Echo character
  671.     pop    bc            ; Restore registers
  672.     pop    hl
  673.     cp    contc            ; Test warm boot
  674.     ld    a,b            ; Get line count
  675.     jr    nz,rdbufh        ; No warm boot then jump
  676.     cp    1            ; Test contc is first character line 
  677.     jp    z,error5a        ; Yes then execute warm boot
  678. rdbufh:    cp    c            ; Test line length=maximum line length
  679.      if    contron
  680.     jr    nz,rdbuf9        ; Not then get next character
  681.      else    
  682.     jr    nz,rdbuf5
  683.      endif
  684. rdbufi:    pop    hl            ; Get start line - 1
  685.     ld    (hl),b            ; Save line counter
  686.     ld    a,cr            ; Load carriage return
  687.     jp    wrcon            ; And echo it
  688. ;
  689.