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 / CPMBDOS1.ASM < prev    next >
Assembly Source File  |  1982-12-31  |  16KB  |  710 lines

  1.     title    'CP/M BDOS Interface, BDOS, Version 3.0 Dec, 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. ;**            I n t e r f a c e   M o d u l e                  **
  8. ;**                                                             **
  9. ;*****************************************************************
  10. ;*****************************************************************
  11. ;
  12. ;    Copyright (c) 1978, 1979, 1980, 1981, 1982
  13. ;    Digital Research
  14. ;    Box 579, Pacific Grove
  15. ;    California
  16. ;
  17. ;       December 1982
  18. ;
  19. on    equ    0ffffh
  20. off    equ    00000h
  21. MPM    equ    off
  22. BANKED    equ    off
  23.  
  24. ;
  25. ;    equates for non graphic characters
  26. ;
  27.  
  28. ctla    equ    01h    ; control a
  29. ctlb    equ    02h    ; control b
  30. ctlc    equ    03h    ; control c
  31. ctle    equ    05h    ; physical eol
  32. ctlf    equ    06h    ; control f
  33. ctlg    equ    07h    ; control g
  34. ctlh    equ    08h    ; backspace
  35. ctlk    equ    0bh    ; control k
  36. ctlp    equ    10h    ; prnt toggle
  37. ctlq    equ    11h    ; start screen
  38. ctlr    equ    12h    ; repeat line
  39. ctls    equ    13h    ; stop screen
  40. ctlu    equ    15h    ; line delete
  41. ctlw    equ    17h    ; control w
  42. ctlx    equ    18h    ; =ctl-u
  43. ctlz    equ    1ah    ; end of file
  44. rubout    equ    7fh    ; char delete
  45. tab    equ    09h    ; tab char
  46. cr    equ    0dh    ; carriage return
  47. lf    equ    0ah    ; line feed
  48. ctl    equ    5eh    ; up arrow
  49.  
  50.         org    0000h
  51. base        equ    $
  52.  
  53. ; Base page definitions
  54.  
  55. bnkbdos$pg    equ    base+0fc00h
  56. resbdos$pg    equ    base+0fd00h
  57. scb$pg        equ    base+0fb00h
  58. bios$pg        equ    base+0ff00h
  59.  
  60. ; Bios equates
  61.  
  62. bios        equ    bios$pg
  63. bootf        equ    bios$pg     ; 00. cold boot function
  64.  
  65. if BANKED
  66.  
  67. wbootf        equ    scb$pg+68h    ; 01. warm boot function
  68. constf        equ    scb$pg+6eh      ; 02. console status function
  69. coninf        equ    scb$pg+74h    ; 03. console input function
  70. conoutf        equ    scb$pg+7ah    ; 04. console output function
  71. listf        equ    scb$pg+80h    ; 05. list output function
  72.  
  73. else
  74.  
  75. wbootf        equ    bios$pg+3    ; 01. warm boot function
  76. constf        equ    bios$pg+6    ; 02. console status function
  77. coninf        equ    bios$pg+9    ; 03. console input function
  78. conoutf        equ    bios$pg+12    ; 04. console output function
  79. listf        equ    bios$pg+15    ; 05. list output function
  80.  
  81. endif
  82.  
  83. punchf        equ    bios$pg+18    ; 06. punch output function
  84. readerf        equ    bios$pg+21    ; 07. reader input function
  85. homef        equ    bios$pg+24    ; 08. disk home function
  86. seldskf        equ    bios$pg+27    ; 09. select disk function
  87. settrkf        equ    bios$pg+30    ; 10. set track function
  88. setsecf        equ    bios$pg+33    ; 11. set sector function
  89. setdmaf        equ    bios$pg+36    ; 12. set dma function
  90. readf        equ    bios$pg+39    ; 13. read disk function
  91. writef        equ    bios$pg+42    ; 14. write disk function
  92. liststf        equ    bios$pg+45    ; 15. list status function
  93. sectran        equ    bios$pg+48    ; 16. sector translate
  94. conoutstf    equ    bios$pg+51    ; 17. console output status function
  95. auxinstf    equ    bios$pg+54    ; 18. aux input status function
  96. auxoutstf    equ    bios$pg+57    ; 19. aux output status function
  97. devtblf        equ    bios$pg+60    ; 20. retunr device table address fx
  98. devinitf    equ    bios$pg+63    ; 21. initialize device function
  99. drvtblf        equ    bios$pg+66    ; 22. return drive table address
  100. multiof        equ    bios$pg+69    ; 23. multiple i/o function
  101. flushf        equ    bios$pg+72    ; 24. flush function
  102. movef        equ    bios$pg+75    ; 25. memory move function
  103. timef        equ    bios$pg+78    ; 26. system get/set time function
  104. selmemf        equ    bios$pg+81    ; 27. select memory function
  105. setbnkf        equ    bios$pg+84    ; 28. set dma bank function
  106. xmovef        equ    bios$pg+87    ; 29. extended move function
  107.  
  108. if BANKED
  109.  
  110. ; System Control Block equates
  111.  
  112. olog        equ    scb$pg+090h
  113. rlog        equ    scb$pg+092h
  114.  
  115. SCB        equ    scb$pg+09ch
  116.  
  117. ; Expansion Area - 6 bytes
  118.  
  119. hashl        equ    scb$pg+09ch
  120. hash        equ    scb$pg+09dh
  121. version        equ    scb$pg+0a1h
  122.  
  123. ; Utilities Section - 8 bytes
  124.  
  125. util$flgs    equ    scb$pg+0a2h
  126. dspl$flgs    equ    scb$pg+0a6h
  127.  
  128. ; CLP Section - 4 bytes
  129.  
  130. clp$flgs    equ    scb$pg+0aah
  131. clp$errcde    equ    scb$pg+0ach
  132.  
  133. ; CCP Section - 8 bytes
  134.  
  135. ccp$comlen    equ    scb$pg+0aeh
  136. ccp$curdrv    equ    scb$pg+0afh
  137. ccp$curusr    equ    scb$pg+0b0h
  138. ccp$conbuff    equ    scb$pg+0b1h
  139. ccp$flgs    equ    scb$pg+0b3h
  140.  
  141. ; Device I/O Section - 32 bytes
  142.  
  143. conwidth    equ    scb$pg+0b6h
  144. column        equ    scb$pg+0b7h
  145. conpage        equ    scb$pg+0b8h
  146. conline        equ    scb$pg+0b9h
  147. conbuffadd    equ    scb$pg+0bah
  148. conbufflen    equ    scb$pg+0bch
  149. conin$rflg    equ    scb$pg+0beh
  150. conout$rflg    equ    scb$pg+0c0h
  151. auxin$rflg    equ    scb$pg+0c2h
  152. auxout$rflg    equ    scb$pg+0c4h
  153. lstout$rflg    equ    scb$pg+0c6h
  154. page$mode    equ    scb$pg+0c8h
  155. pm$default    equ    scb$pg+0c9h
  156. ctlh$act    equ    scb$pg+0cah
  157. rubout$act    equ    scb$pg+0cbh
  158. type$ahead    equ    scb$pg+0cch
  159. contran        equ    scb$pg+0cdh
  160. conmode        equ    scb$pg+0cfh
  161. outdelim    equ    scb$pg+0d3h
  162. listcp        equ    scb$pg+0d4h
  163. qflag        equ    scb$pg+0d5h
  164.  
  165. ; BDOS Section - 42 bytes
  166.  
  167. scbadd        equ    scb$pg+0d6h
  168. dmaad        equ    scb$pg+0d8h
  169. olddsk        equ    scb$pg+0dah
  170. info        equ    scb$pg+0dbh
  171. resel        equ    scb$pg+0ddh
  172. relog         equ    scb$pg+0deh
  173. fx        equ    scb$pg+0dfh
  174. usrcode        equ    scb$pg+0e0h
  175. dcnt        equ    scb$pg+0e1h
  176. ;searcha    equ    scb$pg+0e3h
  177. searchl        equ    scb$pg+0e5h
  178. multcnt        equ    scb$pg+0e6h
  179. errormode    equ    scb$pg+0e7h
  180. searchchain    equ    scb$pg+0e8h
  181. temp$drive    equ    scb$pg+0ech
  182. errdrv          equ    scb$pg+0edh
  183. media$flag    equ    scb$pg+0f0h
  184. bdos$flags    equ    scb$pg+0f3h
  185. stamp        equ    scb$pg+0f4h
  186. commonbase    equ    scb$pg+0f9h
  187. error        equ    scb$pg+0fbh    ;jmp error$sub
  188. bdosadd        equ    scb$pg+0feh
  189.  
  190. ; Resbdos equates
  191.  
  192. resbdos        equ    resbdos$pg
  193. move$out    equ    resbdos$pg+9    ; a=bank #, hl=dest, de=srce
  194. move$tpa    equ    resbdos$pg+0ch    ; a=bank #, hl=dest, de=srce
  195. srch$hash    equ    resbdos$pg+0fh    ; a=bank #, hl=hash table addr
  196. hashmx        equ    resbdos$pg+12h    ; max hash search dcnt
  197. rd$dir$flag    equ    resbdos$pg+14h    ; directory read flag
  198. make$xfcb    equ    resbdos$pg+15h    ; make function flag
  199. find$xfcb    equ    resbdos$pg+16h    ; search function flag
  200. xdcnt        equ    resbdos$pg+17h    ; dcnt save for empty fcb, 
  201.                     ; user 0 fcb, or xfcb
  202. xdmaad        equ    resbdos$pg+19h    ; resbdos dma copy area addr
  203. curdma        equ    resbdos$pg+1bh    ; current dma
  204. copy$cr$only    equ    resbdos$pg+1dh    ; dont restore fcb flag
  205. user$info    equ    resbdos$pg+1eh    ; user fcb address
  206. kbchar        equ    resbdos$pg+20h  ; conbdos look ahead char
  207. qconinx        equ    resbdos$pg+21h    ; qconin mov a,m routine
  208.  
  209. ELSE
  210.  
  211. move$out    equ    movef
  212. move$tpa    equ    movef
  213.  
  214. ENDIF
  215.  
  216. ;
  217. serial: db    '654321'
  218. ;
  219. ;    Enter here from the user's program with function number in c,
  220. ;    and information address in d,e
  221. ;
  222.  
  223. bdose:    ; Arrive here from user programs
  224.     xchg! shld info! xchg ; info=de, de=info
  225.  
  226.     mov a,c! sta fx! cpi 14! jc bdose2
  227.     lxi h,0! shld dircnt ; dircnt,multnum = 0
  228.     lda olddsk! sta seldsk ; Set seldsk
  229.  
  230. if BANKED
  231.     dcr a! sta copy$cr$init
  232. ENDIF
  233.  
  234.     ; If mult$cnt ~= 1 then read or write commands
  235.     ; are handled by the shell
  236.     lda mult$cnt! dcr a! jz bdose2
  237.     lxi h,mult$fxs
  238. bdose1:
  239.     mov a,m! ora a! jz bdose2
  240.     cmp c! jz shell
  241.     inx h! jmp bdose1
  242. bdose2:
  243.     mov a,e! sta linfo ; linfo = low(info) - don't equ
  244.     lxi h,0! shld aret ; Return value defaults to 0000
  245.     shld resel ; resel,relog = 0
  246.     ; Save user's stack pointer, set to local stack
  247.     dad sp! shld entsp ; entsp = stackptr
  248.  
  249. if not BANKED
  250.     lxi sp,lstack ; local stack setup
  251. ENDIF
  252.  
  253.     lxi h,goback ; Return here after all functions
  254.     push h ; jmp goback equivalent to ret
  255.     mov a,c! cpi nfuncs! jnc high$fxs ; Skip if invalid #
  256.     mov c,e ; possible output character to c
  257.     lxi h,functab! jmp bdos$jmp
  258.     ; look for functions 98 ->
  259. high$fxs:
  260.     cpi 128! jnc test$152
  261.     sui 98! jc lret$eq$ff ; Skip if function < 98
  262.     cpi nfuncs2! jnc lret$eq$ff
  263.     lxi h,functab2
  264. bdos$jmp:
  265.     mov e,a! mvi d,0 ; de=func, hl=.ciotab
  266.     dad d! dad d! mov e,m! inx h! mov d,m ; de=functab(func)
  267.     lhld info ; info in de for later xchg    
  268.     xchg! pchl ; dispatched
  269.  
  270. ;       CAUTION: In banked systems only,
  271. ;          error$sub is referenced indirectly by the SCB ERROR
  272. ;        field in RESBDOS as (0fc7ch).  This value is converted
  273. ;        to the actual address of error$sub by GENSYS.  If the offset
  274. ;        of error$sub is changed, the SCB ERROR value must also
  275. ;        be changed.
  276.  
  277. ;
  278. ;    error subroutine
  279. ;
  280.  
  281. error$sub:
  282.     mvi b,0! push b! dcr c
  283.     lxi h,errtbl! dad b! dad b
  284.     mov e,m! inx h! mov d,m! xchg
  285.     call errflg
  286.     pop b! lda error$mode! ora a! rnz
  287.     jmp reboote
  288.  
  289. mult$fxs:    db    20,21,33,34,40,0
  290.  
  291. if BANKED
  292.     db    'COPYRIGHT (C) 1982,'
  293.     db    ' DIGITAL RESEARCH '
  294.     db    '151282'
  295. else
  296.     db    'COPR. ''82 DRI 151282'
  297.  
  298.     ;    31 level stack
  299.  
  300.     dw    0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
  301.     dw    0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
  302.     dw    0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
  303.     dw    0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
  304. lstack:
  305.  
  306. endif
  307.  
  308. ;    dispatch table for functions
  309.  
  310. functab:
  311.     dw    rebootx1, func1, func2, func3
  312.     dw    punchf, listf, func6, func7
  313.     dw    func8, func9, func10, func11
  314. diskf    equ    ($-functab)/2    ; disk funcs
  315.     dw    func12,func13,func14,func15
  316.     dw    func16,func17,func18,func19
  317.     dw    func20,func21,func22,func23
  318.     dw    func24,func25,func26,func27
  319.     dw    func28,func29,func30,func31
  320.     dw    func32,func33,func34,func35
  321.     dw    func36,func37,func38,func39
  322.     dw    func40,lret$eq$ff,func42,func43
  323.     dw    func44,func45,func46,func47
  324.     dw    func48,func49,func50
  325. nfuncs    equ    ($-functab)/2
  326.  
  327. functab2:
  328.     dw    func98,func99
  329.     dw    func100,func101,func102,func103
  330.     dw    func104,func105,func106,func107
  331.     dw    func108,func109,func110,func111
  332.     dw    func112
  333.  
  334. nfuncs2    equ    ($-functab2)/2
  335.  
  336. errtbl:
  337.     dw    permsg
  338.     dw    rodmsg
  339.     dw    rofmsg
  340.     dw    selmsg
  341.     dw    0
  342.     dw    0
  343.     dw    passmsg
  344.     dw    fxstsmsg
  345.     dw    wildmsg
  346.  
  347. test$152:
  348.     cpi 152! rnz
  349.  
  350. ;
  351. ;    PARSE version 3.0b  Oct 08 1982 - Doug Huskey
  352. ;
  353. ;
  354.           ; DE->.(.filename,.fcb)
  355.     ;
  356.     ; filename = [d:]file[.type][;password]
  357.     ;             
  358.     ; fcb assignments
  359.     ;
  360.     ;   0     => drive, 0 = default, 1 = A, 2 = B, ...
  361.     ;   1-8   => file, converted to upper case,
  362.     ;            padded with blanks (left justified)
  363.     ;   9-11  => type, converted to upper case,
  364.     ;         padded with blanks (left justified)
  365.     ;   12-15 => set to zero
  366.     ;   16-23 => password, converted to upper case,
  367.     ;         padded with blanks
  368.     ;   24-25 => 0000h
  369.     ;   26    => length of password (0 - 8)
  370.     ;
  371.     ; Upon return, HL is set to FFFFH if DE locates
  372.     ;            an invalid file name;
  373.     ; otherwise, HL is set to 0000H if the delimiter
  374.     ;            following the file name is a 00H (NULL)
  375.     ;          or a 0DH (CR);
  376.     ; otherwise, HL is set to the address of the delimiter
  377.     ;            following the file name.
  378.     ;
  379.     lxi     h,sthl$ret
  380.     push    h
  381.     lhld     info
  382.     mov    e,m        ;get first parameter
  383.     inx    h
  384.     mov    d,m
  385.     push    d        ;save .filename
  386.     inx    h
  387.     mov    e,m        ;get second parameter
  388.     inx    h
  389.     mov    d,m
  390.     pop    h        ;DE=.fcb  HL=.filename
  391.     xchg
  392. parse0:
  393.     push    h        ;save .fcb
  394.     xra    a
  395.     mov    m,a        ;clear drive byte
  396.     inx    h
  397.     lxi    b,20h*256+11
  398.     call    pad        ;pad name and type w/ blanks
  399.     lxi    b,4
  400.     call    pad        ;EXT, S1, S2, RC = 0
  401.     lxi    b,20h*256+8
  402.     call    pad        ;pad password field w/ blanks
  403.     lxi    b,12
  404.     call    pad        ;zero 2nd 1/2 of map, cr, r0 - r2
  405. ;
  406. ;    skip spaces
  407. ;
  408.     call    skps
  409. ;
  410. ;    check for drive
  411. ;
  412.     ldax    d
  413.     cpi    ':'        ;is this a drive?
  414.     dcx    d
  415.     pop    h
  416.     push    h        ;HL = .fcb
  417.     jnz    parse$name
  418. ;
  419. ;    Parse the drive-spec
  420. ;
  421. parsedrv:
  422.     call     delim
  423.     jz    parse$ok
  424.     sui    'A'
  425.     jc    perror1
  426.     cpi    16
  427.     jnc    perror1
  428.     inx    d
  429.     inx    d        ;past the ':'
  430.     inr    a        ;set drive relative to 1
  431.     mov    m,a        ;store the drive in FCB(0)
  432. ;
  433. ;    Parse the file-name
  434. ;
  435. parse$name:
  436.     inx    h        ;HL = .fcb(1)
  437.     call    delim
  438.     jz    parse$ok
  439.     lxi    b,7*256
  440.  
  441. parse6:    ldax    d        ;get a character
  442.     cpi    '.'        ;file-type next?
  443.     jz    parse$type    ;branch to file-type processing
  444.     cpi    ';'
  445.     jz    parse$pw
  446.     call    gfc        ;process one character
  447.     jnz    parse6        ;loop if not end of name
  448.     jmp    parse$ok
  449. ;
  450. ;    Parse the file-type
  451. ;
  452. parse$type:    
  453.     inx    d        ;advance past dot
  454.     pop    h
  455.     push    h        ;HL =.fcb
  456.     lxi    b,9
  457.     dad    b        ;HL =.fcb(9)
  458.     lxi    b,2*256
  459.  
  460. parse8:    ldax    d
  461.     cpi    ';'
  462.     jz    parsepw
  463.     call    gfc        ;process one character
  464.     jnz    parse8        ;loop if not end of type
  465. ;
  466. parse$ok:
  467.     pop    b
  468.     push    d
  469.     call    skps        ;skip trailing blanks and tabs
  470.     dcx    d
  471.     call    delim        ;is next nonblank char a delim?
  472.     pop    h
  473.     rnz            ;no
  474.     lxi    h,0
  475.     ora    a
  476.     rz            ;return zero if delim = 0
  477.     cpi    cr
  478.     rz            ;return zero if delim = cr
  479.     xchg
  480.     ret
  481. ;
  482. ;    handle parser error
  483. ;
  484. perror:
  485.     pop    b            ;throw away return addr
  486. perror1:
  487.     pop    b
  488.     lxi    h,0ffffh
  489.     ret
  490. ;
  491. ;    Parse the password
  492. ;
  493. parsepw:
  494.     inx    d
  495.     pop    h
  496.     push    h
  497.     lxi    b,16
  498.     dad    b
  499.     lxi    b,7*256+1
  500. parsepw1:
  501.     call    gfc
  502.     jnz    parsepw1
  503.     mvi    a,7
  504.     sub    b
  505.     pop    h
  506.     push    h
  507.     lxi    b,26
  508.     dad    b
  509.     mov    m,a
  510.     ldax    d            ;delimiter in A
  511.     jmp    parse$ok
  512. ;
  513. ;    get next character of name, type or password
  514. ;
  515. gfc:    call    delim        ;check for end of filename
  516.     rz            ;return if so
  517.     cpi    ' '        ;check for control characters
  518.     inx    d
  519.     jc    perror        ;error if control characters encountered
  520.     inr    b        ;error if too big for field
  521.     dcr    b
  522.     jm    perror
  523.     inr    c
  524.     dcr    c
  525.     jnz    gfc1
  526.     cpi    '*'        ;trap "match rest of field" character
  527.     jz    setmatch
  528. gfc1:    mov    m,a        ;put character in fcb
  529.     inx    h
  530.     dcr    b        ;decrement field size counter
  531.     ora    a        ;clear zero flag
  532.     ret
  533. ;;
  534. setmatch:
  535.     mvi    m,'?'        ;set match one character
  536.     inx    h
  537.     dcr    b
  538.     jp    setmatch
  539.     ret
  540. ;    
  541. ;    check for delimiter
  542. ;
  543. ;    entry:    A = character
  544. ;    exit:    z = set if char is a delimiter
  545. ;
  546. delimiters:    db    cr,tab,' .,:;[]=<>|',0
  547.  
  548. delim:    ldax    d        ;get character
  549.     push    h
  550.     lxi    h,delimiters
  551. delim1:    cmp    m        ;is char in table
  552.     jz    delim2
  553.     inr    m
  554.     dcr    m        ;end of table? (0)
  555.     inx    h
  556.     jnz    delim1
  557.     ora    a        ;reset zero flag
  558. delim2:    pop    h
  559.     rz
  560.     ;
  561.     ;    not a delimiter, convert to upper case
  562.     ;
  563.     cpi    'a'
  564.     rc
  565.     cpi    'z'+1
  566.     jnc    delim3
  567.     ani     05fh
  568. delim3:    ani    07fh    
  569.     ret            ;return with zero set if so
  570. ;
  571. ;    pad with blanks or zeros
  572. ;
  573. pad:    mov    m,b
  574.     inx    h
  575.     dcr    c
  576.     jnz    pad
  577.     ret
  578. ;
  579. ;    skip blanks and tabs
  580. ;
  581. skps:    ldax    d
  582.     inx    d
  583.     cpi    ' '        ;skip spaces & tabs
  584.     jz     skps
  585.     cpi    tab
  586.     jz    skps
  587.     ret
  588. ;
  589. ;    end of PARSE
  590. ;
  591.  
  592. errflg:
  593.     ; report error to console, message address in hl
  594.     push h! call crlf ; stack mssg address, new line
  595.     lda adrive! adi 'A'! sta dskerr ; current disk name
  596.     lxi b,dskmsg
  597.  
  598. if BANKED
  599.     call zprint ; the error message
  600. else
  601.     call print
  602. endif
  603.  
  604.     pop b
  605.  
  606. if BANKED
  607.     lda bdos$flags! ral! jnc zprint
  608.     call zprint ; error message tail
  609.     lda fx! mvi b,30h
  610.     lxi h,pr$fx1
  611.     cpi 100! jc errflg1
  612.     mvi m,31h! inx h! sui 100
  613. errflg1:
  614.     sui 10! jc errflg2
  615.     inr b! jmp errflg1
  616. errflg2:
  617.     mov m,b! inx h! adi 3ah! mov m,a
  618.     inx h! mvi m,20h
  619.     lxi h,pr$fcb! mvi m,0
  620.     lda resel! ora a! jz errflg3
  621.     mvi m,20h! push d
  622.     lhld info! inx h! xchg! lxi h,pr$fcb1
  623.     mvi c,8! call move! mvi m,'.'! inx h
  624.     mvi c,3! call move! pop d
  625. errflg3:
  626.     call crlf
  627.     lxi b,pr$fx! jmp zprint
  628.  
  629. zprint:
  630.     ldax b! ora a! rz
  631.     push b! mov c,a
  632.     call tabout
  633.     pop b! inx b! jmp zprint
  634.  
  635. pr$fx:    db    'BDOS Function = '
  636. pr$fx1:    db    '   '
  637. pr$fcb:    db    ' File = '
  638. pr$fcb1:ds    12
  639.     db    0
  640.  
  641. else
  642.     jmp    print
  643. endif
  644.  
  645. reboote: 
  646.     lxi h,0fffdh! jmp rebootx0 ; BDOS error
  647. rebootx:
  648.     lxi h,0fffeh ; CTL-C error
  649. rebootx0:
  650.     shld clp$errcde
  651. rebootx1:
  652.     jmp wbootf
  653.  
  654. entsp:    ds    2    ; entry stack pointer
  655.  
  656. shell:
  657.     lxi h,0! dad sp! shld shell$sp
  658.  
  659. if not BANKED
  660.     lxi sp,shell$stk
  661. endif
  662.  
  663.     lxi h,shell$rtn! push h
  664.     call save$rr! call save$dma
  665.     lda mult$cnt
  666. mult$io:
  667.     push a! sta mult$num! call cbdos
  668.     ora a! jnz shell$err
  669.     lda fx! cpi 33! cnc incr$rr
  670.     call adv$dma
  671.     pop a! dcr a! jnz mult$io
  672.     mov h,a! mov l,a! ret
  673.  
  674. shell$sp:    dw    0
  675.  
  676.         dw    0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
  677.  
  678. shell$stk:        ; shell has 5 level stack
  679. hold$dma:    dw    0
  680.  
  681. cbdos:
  682.     lda fx! mov c,a
  683. cbdos1:
  684.     lhld info! xchg! jmp bdose2
  685.  
  686. adv$dma:
  687.     lhld dmaad! lxi d,80h! dad d! jmp reset$dma1
  688.  
  689. save$dma:
  690.     lhld dmaad! shld hold$dma! ret
  691.  
  692. reset$dma:
  693.     lhld hold$dma
  694. reset$dma1:
  695.     shld dmaad! jmp setdma
  696.  
  697. shell$err:
  698.     pop b! inr a! rz
  699.     lda mult$cnt! sub b! mov h,a! ret
  700.  
  701. shell$rtn:
  702.     push h! lda fx! cpi 33! cnc reset$rr
  703.     call reset$dma
  704.     pop d! lhld shell$sp! sphl! xchg
  705.     mov a,l! mov b,h! ret
  706.  
  707.     page
  708.  
  709.  
  710.