home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug169.arc / Z80DOS2B.LBR / Z80DOSB.ZY0 / Z80DOSB.ZY0
Text File  |  1979-12-31  |  18KB  |  658 lines

  1. ;
  2. ; Z80DOS - Z80 Disk Operating System
  3. ;
  4. ; Version 2.0a - BETA TEST VERSION - 6 Nov 87 by Carson Wilson
  5. ;           - modified for Z80 assembler 19 OCT 88 by B.J. White
  6. ; Support file:    Z80DOSB.Z80
  7. ; Version:    2.0
  8. ; Date:        6 Nov 87
  9. ; Author:    Carson Wilson
  10. ; Changes:    Combined BIOS read and write error messages into one
  11. ;        message - "Data error" so that BDOS error intecepts
  12. ;        work same as standard CP/M.
  13. ;
  14. ;        Added disk changed error routine.
  15. ;
  16. ; Description:    DOS Entry Points, Character I/O, and Error Routines
  17. ;
  18.  
  19.     ORG    BDOS+6        ; Preserve serial number for CP/M
  20.                 ; ..overlay
  21. ;
  22. ; Start BDOS
  23. ;
  24. START:    JP    ENTRY            ; Jump to entry point DOS
  25. ;
  26. ; Error messages DOS - for programs which intercept DOS errors
  27. ;
  28. STRW:    DEFW    RWERR            ; Read or write error
  29. STSEL:    DEFW    SELERR            ; Select error
  30. STRO:    DEFW    RDONLY            ; Drive read only
  31. SFILRO:    DEFW    FILRO            ; File read only
  32.  
  33. ;
  34. ; Run-time configurable options:
  35. ;
  36. TIMEAD:
  37.      IF    RTC
  38.     DEFW    BIOSTIM            ; Dummy or address of BIOS routine
  39.      ELSE
  40.     DEFW    0
  41.      ENDIF    ;RTC
  42.  
  43. FLAGS:    DEFB    OPTIONS            ; Flag byte for public and ^S interrupt
  44.  
  45. ;
  46. ; Entry point for DOS commands
  47. ;
  48. ENTRY:    LD    A,C            ; Get function number
  49.     LD    (FUNCT),A        ; Save it for later use
  50.     LD    HL,0            ; Set hl to zero
  51.     LD    (PEXIT),HL        ; Clear exit code
  52.     XOR    A            ; Clear a
  53.     LD    (FLDRV),A        ; Reset drive select done flag
  54.     LD    (RDWR),A        ; Reset read/write flag
  55.     LD    (SPSAVE),SP        ; Save stack pointer
  56.     LD    SP,DOSS            ; Get internal stack pointer
  57.     PUSH    IX            ; Save index register
  58.     PUSH    DE            ; Save parameter register
  59.     POP    IX            ; Get it back in ix
  60.     LD    HL,EXITP2        ; Get exit address DOS
  61.     PUSH    HL            ; Save it on stack to return from DOS
  62.     LD    A,C            ; Get function code
  63.     CP    105            ; Test get time <crw>
  64.     JP    Z,GETTIM        ; Yes then get time
  65.     CP    104            ; Test set time <crw>
  66.     JP    Z,SETTIM        ; Yes then set time
  67.     CP    55            ; Test use time stamp <crw>
  68.     JP    Z,USESTP
  69.     CP    54            ; Test get time stamp <crw>
  70.     JP    Z,GETSTP
  71.     CP    MAXCMD+1        ; Test greater then MaxCmd
  72.     RET    NC            ; If so return to caller and do nothing
  73.     LD    HL,CTABLE        ; Load table
  74.     LD    B,0            ; Prepare 16 bit add
  75.     ADD    HL,BC            ; Add
  76.     ADD    HL,BC            ; Add twice to get word value
  77.     LD    A,(HL)            ; Get LSB
  78.     INC    HL            ; Pointer to MSB
  79.     LD    H,(HL)            ; Get MSB
  80.     LD    L,A            ; Save LSB in l
  81.     JP    (HL)            ; Jump to routine
  82. ;
  83. ; Command Jump Table
  84. ;
  85. CTABLE:    DEFW    WBOOT            ; Warm boot
  86.     DEFW    RDCON            ; Console input
  87.     DEFW    BWRCON            ; Console output
  88.     DEFW    RDRDR            ; Reader input
  89.     DEFW    WPUNCH            ; Punch output
  90.     DEFW    WLIST            ; List output
  91.     DEFW    DCIO            ; Direct console I/O
  92.     DEFW    GIOST            ; Get I/O byte
  93.     DEFW    SIOST            ; Set I/O byte
  94.     DEFW    MESS            ; Print string
  95.     DEFW    RDBUF            ; Read console buffer
  96.     DEFW    TSTCS            ; Get console status
  97.     DEFW    CMND12            ; Return version number
  98.     DEFW    CMND13            ; Reset disk system
  99.     DEFW    CMND14            ; Select disk
  100.     DEFW    CMND15            ; Open file
  101.     DEFW    CMND16            ; Close file
  102.     DEFW    CMND17            ; Search for first
  103.     DEFW    CMND18            ; Search for next
  104.     DEFW    CMND19            ; Delete file
  105.     DEFW    CMND20            ; Read sequential
  106.     DEFW    CMND21            ; Write sequential
  107.     DEFW    CMND22            ; Make file
  108.     DEFW    CMND23            ; Rename file
  109.     DEFW    CMND24            ; Return login vector
  110.     DEFW    CMND25            ; Return current disk
  111.     DEFW    CMND26            ; Set DMA address
  112.     DEFW    CMND27            ; Get address allocation vector
  113.     DEFW    CMND28            ; Write protect disk
  114.     DEFW    CMND29            ; Get R/O vector
  115.     DEFW    CMND30            ; Set file attributes
  116.     DEFW    CMND31            ; Get address disk parameter header(dph)
  117.     DEFW    CMND32            ; Get/set user code
  118.     DEFW    CMND33            ; Read random
  119.     DEFW    CMND34            ; Write random
  120.     DEFW    CMND35            ; Compute file size
  121.     DEFW    CMND36            ; Set random record
  122.     DEFW    CMND37            ; Reset multiple drive
  123.     DEFW    DUMMY            ; Access drive - not implemented
  124.     DEFW    DUMMY            ; Free drive - not implemented
  125.     DEFW    CMND40            ; Write random with zero fill
  126.  
  127.  
  128. ; ---------------------------------
  129.  
  130. ;    Character Routines
  131.  
  132. ; ---------------------------------
  133.  
  134. ; DOS console input
  135. ;
  136. ; Read character from console and echo
  137. ;  if char=cr, lf, tab, ContH or >=space
  138. ;
  139. RDCON:    CALL    GETCH            ; Get character
  140.     CALL    TSTCH            ; Test if cr,lf,tab,ContH or >=space
  141.     JR    C,EXIT            ; No then exit
  142.     CALL    WRCON            ; Echo character
  143. EXIT:    LD    (PEXIT),A        ; Return character
  144. DUMMY:    RET                ; And exit DOS
  145. ;
  146. ; DOS write console
  147. ;
  148. BWRCON:    LD    A,E            ; Copy character
  149.     JR    WRCON            ; And output it
  150. ;
  151. ; read reader
  152. ;
  153. RDRDR:    CALL    READER            ; Get character from reader
  154.     JR    EXIT            ; And return it to caller
  155. ;
  156. ; write punch
  157. ;
  158. WPUNCH:    LD    C,E            ; Copy character
  159.     JP    PUNCH            ; And output it to punch device
  160. ;
  161. ; Write list
  162. ;
  163. WLIST:    LD    C,E            ; Copy character
  164.     JP    LISTO            ; And output it to list device
  165. ;
  166. ; Direct console input/output
  167. ;
  168. DCIO:    LD    C,E            ; Copy character
  169.     INC    E            ; Test if 0ffh
  170.     JR    Z,DCIO0            ; Yes do input
  171.     INC    E            ; Test if 0feh
  172.     JP    NZ,CONOUT        ; No then output character
  173.     CALL    CONST            ; Get console status
  174.     AND    1            ; Test it
  175.     JR    EXIT            ; And return it to caller
  176. DCIO0:    CALL    CONST            ; Get console status
  177.     AND    1            ; Test it
  178.     RET    Z            ; Exit if no character present
  179.     CALL    CONIN            ; Get character
  180.     JR    EXIT            ; And return it to caller
  181. ;
  182. ; Get I/O status byte
  183. ;
  184. GIOST:    LD    A,(RAMLOW+00003H)    ; Get I/O byte from ram
  185.     JR    EXIT            ; And return it to caller
  186. ;
  187. ; Set I/O status byte
  188. ;
  189. SIOST:    LD    A,E            ; Copy I/O byte
  190.     LD    (RAMLOW+00003H),A    ; And save it in ram
  191.     RET                ; Exit to caller
  192. ;
  193. ; Test console status
  194. ;
  195. TSTCS:    CALL    GCONST            ; Get console status
  196.     JR    EXIT            ; And return it to caller
  197. ;
  198. ; Output char (control char = ^char)
  199. ;
  200. OUTCH:    CALL    TSTCH            ; Test it cr,lf,tab,ContH or >=space
  201.     JR    NC,WRCON        ; Yes then jump
  202.     PUSH    AF            ; Save character
  203.     LD    A,'^'            ; Load a with '^'
  204.     CALL    WRCON            ; Output it
  205.     POP    AF            ; Get character back
  206.     PUSH    AF            ; Save it again
  207.     ADD    A,'A'-1            ; Add offset
  208.     CALL    WRCON            ; Output it
  209.     POP    AF            ; Get character
  210.     RET                ; Return to caller
  211. ;
  212. ; Echo cr,lf
  213. ;
  214. CROUT:    LD    A,CR            ; A=carriage return
  215.     CALL    WRCON            ; Output it
  216.     LD    A,LF            ; A=line feed
  217.                     ; Fall through to output routine
  218. ;
  219. ; Write character on console
  220. ;
  221. WRCON:    CP    TAB            ; Test if tab
  222.     JR    NZ,WRCON1        ; No then jump
  223. WRCON0:    LD    A,' '            ; Expand tab with spaces
  224.     CALL    WRCON            ; Write space
  225.     LD    A,(TABCNT)        ; Get tab count
  226.     AND    7            ; Test if done
  227.     JR    NZ,WRCON0        ; No then repeat
  228.     LD    A,TAB            ; Return tab
  229.     RET                ; Return to caller
  230. WRCON1:    PUSH    AF            ; Save character
  231.     CALL    GCONST            ; Test status and ContS/ContC
  232.     POP    AF            ; Get character back
  233.     PUSH    AF            ; Save it again
  234.     LD    C,A            ; Copy it
  235.     CALL    CONOUT            ; Output it
  236.     POP    AF            ; Get character back
  237.     PUSH    AF            ; Save it again
  238.     LD    C,A            ; Copy it
  239.     LD    A,(FCONTP)        ; Get printer echo flag
  240.     OR    A            ; Test it
  241.     CALL    NZ,LISTO        ; Non zero => output char to printer
  242.     LD    A,(FLAGS)        ; Get flag byte
  243.     BIT    1,A            ; Test delay 256 bytes active
  244.     JR    Z,WRCON2        ; No then exit
  245.     LD    HL,DELAY        ; Get delay counter
  246.     XOR    A            ; A=0
  247.     OR    (HL)            ; Test counter=0
  248.     JR    Z,WRCON2        ; Yes then exit
  249.     DEC    (HL)            ; Else decrement counter
  250. WRCON2:    POP    AF            ; Restore character
  251.                     ; Fall through to count routine
  252. ;
  253. ; Count characters in line
  254. ;
  255. COUNTC:    LD    HL,TABCNT        ; Get pointer to tab counter
  256.     INC    (HL)            ; Increment tab counter
  257.     CP    ' '            ; Test if char >= ' '
  258.     RET    NC            ; Yes, normal character then exit
  259.     DEC    (HL)            ; Control character, decrement tab count
  260.     CP    CONTH            ; Test backspace
  261.     JR    NZ,COUNT0        ; No backspace then jump
  262.     DEC    (HL)            ; Decrement tab counter
  263.     RET                ; And exit
  264. COUNT0:    CP    CR            ; Test carriage return
  265.     JR    NZ,COUNT1        ; No then jump
  266.     LD    (HL),0            ; Reset tab count
  267.     RET                ; And exit
  268. COUNT1:    CP    TAB            ; Test tab character
  269.     RET    NZ            ; No then exit
  270.     PUSH    AF            ; Save character
  271.     LD    A,(HL)            ; Get tab count
  272.     ADD    A,8            ; Advance it 8 position
  273.     AND    0F8H            ; Set it to next tab position
  274.     LD    (HL),A            ; Save it
  275.     POP    AF            ; Restore character
  276.     RET                ; And exit
  277. ;
  278. ; Get character from console
  279. ;
  280. GETCH:    LD    HL,LASTCH        ; Get pointer to last input character
  281.     LD    A,(HL)            ; Get character
  282.     LD    (HL),0            ; Reset last character
  283.     OR    A            ; Test if character present
  284.     RET    NZ            ; Return if so
  285.     JP    CONIN            ; Else get character
  286. ;
  287. ; Get console status
  288. ;
  289. GCONST:    LD    A,(DELAY)        ; Get 256 bytes delay
  290.     OR    A            ; Test it
  291.     JR    NZ,GCONS0        ; Non zero, delay stil active or disabled
  292.     CALL    CONST            ; Get console status
  293.     AND    1            ; Test it
  294.     JR    NZ,GCONS1        ; Non zero then get character
  295. GCONS0:    LD    A,(LASTCH)        ; Get last character
  296.     OR    A            ; Test it
  297.     JR    NZ,GCONS3        ; Non zero then character present
  298.     CALL    CONST            ; Get console status
  299.     AND    1            ; Test it
  300.     RET    Z            ; Return if no character present
  301. GCONS1:    CALL    CONIN            ; Get character
  302.     CP    CONTS            ; Test stop character
  303.     JR    NZ,GCONS2        ; Not then exit character
  304.     CALL    CONIN            ; Get next character
  305.     CP    CONTC            ; Test if user wants to exit
  306.     JP    Z,RAMLOW+00000H        ; Yes then warm boot
  307.     JR    GCONST            ; Test again
  308. GCONS2:    LD    (LASTCH),A        ; Save character
  309.     LD    A,0FFH            ; Set delay counter
  310.     LD    (DELAY),A        ; And save it
  311. GCONS3:    LD    A,1            ; Character present code
  312.     RET                ; Return to caller
  313. ;
  314. ; Test character
  315. ;  exit carry=0: cr,lf,tab,ContH or >=space
  316. ;    carry=1: all other characters
  317. ;
  318. TSTCH:    CP    CR            ; Test carriage return
  319.     RET    Z            ; Return if so
  320.     CP    TAB            ; Test tab
  321.     RET    Z            ; Return if so
  322.     CP    CONTH            ; Test backspace
  323.     RET    Z            ; Return if so
  324.     CP    RUBOUT
  325.     RET    Z
  326.     CP    ' '            ; Test >=space
  327.     RET                ; Return to caller
  328. ;
  329. ; Write backspace, space, backspace
  330. ;
  331. WCONTH:    CALL    WCONT0            ; Write backspace
  332.     LD    C,' '            ; Load space
  333.     CALL    CONOUT            ; And output it
  334. WCONT0:    LD    C,CONTH            ; Load backspace
  335.     JP    CONOUT            ; And output it
  336. ;
  337. ; Output message
  338. ;
  339. MESS:    LD    A,(DE)            ; Get byte from buffer
  340.     CP    '$'            ; Test last byte
  341.     RET    Z            ; Yes, then return to caller
  342.     INC    DE            ; Point to next byte
  343.     PUSH    DE            ; Save pointer
  344.     CALL    WRCON            ; Output character
  345.     POP    DE            ; Restore pointer
  346.     JR    MESS            ; And test again
  347.  
  348. AGAIN0    CALL    CROUT            ;added for CONTROL E
  349. ;
  350. AGAIN:    LD    HL,TABCNT        ; Get tab count pointer
  351.     LD    A,(TABCX1)        ; Get position first character line
  352.     CP    (HL)            ; Check it
  353.     RET    Z            ; Return if on same position
  354.     LD    A,' '            ; Load space
  355.     CALL    WRCON            ; Output it
  356.     JR    AGAIN            ; And test again
  357. ;
  358. ; Delete char
  359. ;  entry : HL = start buffer - 1
  360. ;       B  = character counter (always > 0)
  361. ;
  362. DELCH:    DEC    B            ; Decrement character counter
  363.     LD    A,(TABCNT)        ; Get tab counter
  364.     PUSH    AF            ; Save it
  365.     PUSH    BC            ; Save character counter
  366.     LD    A,(TABCX1)        ; Get position first character line
  367.     LD    (TABCNT),A        ; Save it in tab counter
  368. DELCH0:    LD    A,B            ; Copy character counter
  369.     OR    A            ; Test if 0
  370.     JR    Z,DELCH2        ; Yes then jump
  371.     DEC    B            ; Decrement it
  372.     INC    HL            ; Increment buffer pointer
  373.     LD    A,(HL)            ; Get character from buffer
  374.     PUSH    HL            ; Save buffer pointer
  375.     CALL    TSTCH            ; Test if cr,lf,tab,ContH or >=sp
  376.     JR    NC,DELCH1        ; Yes then jump
  377.     RRA                ; Else must be control character
  378.     CALL    COUNTC            ; Count control character twice
  379. DELCH1:    CALL    COUNTC            ; Count character
  380.     POP    HL            ; Get buffer pointer
  381.     JR    DELCH0            ; And test again
  382. DELCH2:    POP    BC            ; Restore character counter
  383.     POP    AF            ; And tab counter
  384.     PUSH    HL            ; Save buffer pointer
  385.     PUSH    BC            ; And character counter
  386.     LD    HL,TABCNT        ; Get tab counter pointer
  387.     SUB    (HL)            ; Calculate difference
  388. DELCH3:    DEC    A            ; Decrement it
  389.     CP    8            ; Compare with 8
  390.     JR    NC,DELCH4        ; Jump if >=8
  391.     PUSH    AF            ; Save difference
  392.     CALL    WCONTH            ; Remove character end line
  393.     POP    AF            ; Restore counter
  394.     JR    DELCH3            ; Remove more characters
  395. DELCH4:    POP    BC            ; Restore character counter
  396.     POP    HL            ; Restore buffer pointer
  397.     RET                ; And return to caller
  398. ;
  399. ; Read buffer
  400. ;
  401. RDBUF:    LD    A,(TABCNT)        ; Get current position cursor
  402.     LD    (TABCX1),A        ; Save it
  403. RDBUF0:    PUSH    IX            ; Save start address buffer
  404.     POP    HL            ; Get it in hl
  405.     LD    C,(HL)            ; Get maximum line lenght
  406.     INC    HL            ; Increment to line lenght position
  407.     LD    B,0            ; Clear line lenght counter
  408.     PUSH    HL            ; Save start line - 1
  409. RDBUF1:    PUSH    HL            ; Save registers
  410.     PUSH    BC
  411. RDBUF2:    CALL    GETCH            ; Get character
  412.     POP    BC            ; Restore registers
  413.     POP    HL
  414.     AND    07FH            ; Mask character
  415. ;Control E test added (BJW)
  416.     CP    CONTE            ; Test if Control E
  417.     JR    NZ,RDBUF3        ; not then jump
  418.     PUSH    HL            ; save registers
  419.     PUSH    BC
  420.     CALL    AGAIN0            ; move cursor to next line
  421.     JR    RDBUF2            ; and get next character
  422.  
  423. RDBUF3:    CP    CONTH            ; Test backspace
  424.     JR    NZ,RDBUF4        ; Not then jump
  425. DOBACK:    LD    A,B            ; Test if deleting char from empty line
  426.     OR    A
  427.     JR    Z,RDBUF1        ; Yes then get next char
  428.     POP    HL            ; Get start line
  429.     PUSH    HL            ; And save it again
  430.     CALL    DELCH            ; Delete character
  431.     JR    RDBUF1            ; Get next character
  432.  
  433. RDBUF4:    CP    CONTP            ; Test print enable/disable
  434.     JR    NZ,RDBUFC        ; Not then jump
  435.     LD    A,(FCONTP)        ; Complement print flag
  436.     CPL
  437.     LD    (FCONTP),A
  438. ;added jump to RDBUF1 to stop printing of control character (BJW)
  439. RDBUF5: JR    RDBUF1    
  440.  
  441. RDBUFC:    CP    CONTX            ; Test delete line
  442.     JR    NZ,RDBUFE        ; Not then jump
  443. RDBUFD:    POP    HL            ; Get start line
  444.     LD    A,B            ; Test if last character deleted
  445.     OR    A
  446.     JP    Z,RDBUF            ; Yes start routine again
  447.     PUSH    HL            ; Save pointer
  448.     CALL    DELCH            ; Delete last character line
  449.     JR    RDBUFD            ; Test last character deleted
  450. RDBUFE:    CP    RUBOUT            ; Test delete last character
  451.     JR    NZ,RDBUFF        ; Not then jump
  452.     JR    DOBACK            ; Part of delete key fix
  453. RDBUFF:    CP    CR            ; Test carriage return
  454.     JR    Z,RDBUFI        ; Yes, then exit
  455.     INC    HL            ; Increment pointer
  456.     LD    (HL),A            ; And save character
  457.     INC    B            ; Increment line counter
  458. RDBUFG:    PUSH    HL            ; Save registers
  459.     PUSH    BC
  460.     CALL    OUTCH            ; Echo character
  461.     POP    BC            ; Restore registers
  462.     POP    HL
  463.     CP    CONTC            ; Test warm boot
  464.     LD    A,B            ; Get line count
  465.     JR    NZ,RDBUFH        ; No warm boot then jump
  466.     CP    1            ; Test ContC is first character line
  467.     JP    Z,RAMLOW+00000H        ; Yes then execute warm boot
  468. RDBUFH:    CP    C            ; Test line length=maximum line length
  469.     JP    NZ,RDBUF1        ; Not then get next character
  470. RDBUFI:    POP    HL            ; Get start line - 1
  471.     LD    (HL),B            ; Save line counter
  472.     LD    A,CR            ; Load carriage return
  473.     JP    WRCON            ; And echo it
  474.  
  475.  
  476. ;---------------------------
  477.  
  478. ;    Error routines
  479.  
  480. ;---------------------------
  481.  
  482. ;
  483. ; Disk changed error
  484. ;
  485. CHGERR:
  486.     LD    DE,MCHG         ; Load changed error message
  487.     JR    DERROR            ; And display error
  488. ;
  489. ; Select error
  490. ;
  491. SELERR:    LD    DE,MSEL            ; Load selected error message
  492.     JR    DERROR            ; And display error
  493. ;
  494. ; File read only error
  495. ;
  496. FILRO:    LD    DE,MFILRO        ; Load file R/O message
  497.     LD    A,0FFH            ; Set file R/O message flag
  498.     JR    ERROR            ; And display error
  499. ;
  500. ; Read/Write error
  501. ;
  502. RWERR:
  503.     LD    DE,MRWERR
  504.     JR    DERROR
  505. ;
  506. ; Drive read only error
  507. ;
  508. RDONLY:    LD    DE,MRO            ; Load drive R/O message
  509. DERROR:    XOR    A            ; Set no file R/O message
  510. ;    fall    thru
  511.  
  512. ;
  513. ; Display error message
  514. ;
  515. ; "Error message" error on d:
  516. ; Function    nn
  517. ; File        filename.typ
  518. ;
  519. ERROR:    LD    C,A            ; Save file R/O message flag
  520.     PUSH    BC
  521.     PUSH    DE            ; Save error message pointer
  522.     CALL    CROUT            ; Display cr/lf
  523.     POP    DE
  524.     CALL    MESS            ; Display error
  525.     LD    A,(DEFDRV)        ; Get current drive
  526.     ADD    A,'A'            ; Make ASCII
  527.     LD    (MDRIVE),A        ; Save it
  528.     LD    DE,MBERR        ; Load message " error on d:"
  529.     CALL    MESS            ; Display message
  530.     LD    DE,MBFUNC        ; Load message "function "
  531.     CALL    MESS            ; Display message
  532.     LD    A,(FUNCT)        ; Get function number
  533.     PUSH    AF            ; Save it
  534.     LD    BC,100            ; Display number / 100
  535.     CALL    NUM
  536.     LD    C,10            ; Display number / 10
  537.     CALL    NUM
  538.     LD    BC,101H            ; Always display number / 1
  539.     CALL    NUM
  540.     POP    AF            ; Get function number
  541.     POP    BC            ; Get file R/O flag
  542.     CP    15            ; Test if FCB used in command
  543.     JR    C,ERROR3        ; Commands <16, don't show filename
  544.     CP    24
  545.     JR    C,ERROR1        ; Commands 16..23 show file
  546.     CP    30
  547.     JR    Z,ERROR1        ; Command 30 show file
  548.     CP    33
  549.     JR    C,ERROR3        ; Other commands 24..32 no file
  550.     CP    37
  551.     JR    C,ERROR1        ; 33..36 show
  552.     CP    40
  553.     JR    NZ,ERROR3        ; 37 don't show
  554.  
  555. ERROR1:    PUSH    IX            ; Display "file ="
  556.     SUB    19            ; Test delete file function
  557.     JR    NZ,ERROR2        ; Not then jump
  558.     OR    C            ; Test file R/O flag
  559.     JR    Z,ERROR2        ; No file R/O then jump
  560.     CALL    CALDIR            ; Get FCB from directory buffer
  561.     EX    (SP),HL            ; Save it
  562. ERROR2:    LD    DE,MFILE        ; Get message " file ="
  563.     CALL    MESS            ; Display message
  564.     POP    HL            ; Get pointer FCB
  565.     LD    B,8            ; Display first 8 characters
  566.     CALL    FILENM
  567.     LD    A,'.'            ; Load '.'
  568.     PUSH    HL            ; Save FCB pointer
  569.     CALL    WRCON            ; Echo it
  570.     POP    HL            ; Restore FCB pointer
  571.     LD    B,3            ; Display last 3 characters
  572.     CALL    FILENM
  573.  
  574. ; Absorb any pending characters:
  575.  
  576. ERROR3:    CALL    GCONST            ; Test if character pending
  577.     OR    A
  578.     JR    Z,ERROR4        ; No then jump
  579.     CALL    GETCH            ; Get character
  580.     JR    ERROR3            ; And test again
  581. ;
  582. ; Allow retry on read/write errors
  583. ;
  584. ERROR4:
  585.     LD    A,(RETFLG)        ; Allow retry?
  586.     OR    A
  587.     JR    Z,ERROR5        ; No
  588.     XOR    A
  589.     LD    (RETFLG),A        ; Reset flag <crw>
  590.     CALL    GETCH
  591.     CP    CONTC            ; Control-c entered?
  592.     RET    NZ            ; No, retry
  593. ERROR5:    JP    RAMLOW+00000H        ; Do warm boot
  594. ;
  595. ; Display number
  596. ;
  597. NUM:    LD    D,-1            ; Load number -1
  598. NUM1:    INC    D            ; Increment number
  599.     SUB    C            ; Divide by c
  600.     JR    NC,NUM1            ; Not finished then loop
  601.     ADD    A,C            ; Restore last value
  602.     PUSH    AF            ; Save it
  603.     LD    A,D            ; Test if "0"
  604.     OR    B            ; And if leading zero
  605.     JR    Z,NUM2            ; Yes, then exit
  606.     LD    B,A            ; Set no leading zero
  607.     LD    A,D            ; Get number
  608.     ADD    A,'0'            ; Make ASCII
  609.     PUSH    BC            ; Save registers
  610.     CALL    WRCON            ; Echo number
  611.     POP    BC            ; Restore registers
  612. NUM2:    POP    AF            ; Restore number
  613.     RET                ; And exit
  614. ;
  615. ; Display filename.typ
  616. ;
  617. FILENM:    INC    HL            ; Increment pointer FCB
  618.     LD    A,(HL)            ; Get character from FCB
  619.     AND    07FH            ; Mask it
  620.     PUSH    HL            ; Save registers
  621.     PUSH    BC
  622.     CALL    WRCON            ; Echo character
  623.     POP    BC            ; Restore registers
  624.     POP    HL
  625.     DJNZ    FILENM            ; Repeat b times
  626.     RET                ; And exit
  627. ;
  628. ; Error messages
  629. ; Made more meaningful--b.h.
  630. ;
  631.  
  632. MCHG:    DEFM    'Disk changed$'    ; <crw> 
  633.  
  634. MSEL:    DEFM    'Illegal drive$'
  635.  
  636. MFILRO:    DEFM    'File '
  637.  
  638. MRO:    DEFM    'R/O$'
  639.  
  640. MRWERR:    DEFM    'Data$'        ; BIOS read/write error <crw>
  641.  
  642. MBERR:    DEFM    ' error on '
  643. MDRIVE:    DEFB    0
  644.     DEFB    DRVSEP
  645.     DEFM    '$'
  646.  
  647. MBFUNC:    DEFW    0A0DH
  648.     DEFM    'Function'
  649.     DEFB    TAB
  650.     DEFB    '$'
  651.  
  652. MFILE:    DEFW    0A0DH
  653.     DEFM    'File'
  654.     DEFW    0909H
  655.     DEFB    '$'
  656.  
  657.     CHAIN    'Z80DOSC.Z80'
  658.