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 / Z80DS231.LBR / Z80DCHAR.ZZ0 / Z80DCHAR.Z80
Text File  |  2000-06-30  |  18KB  |  678 lines

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