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 / BEEHIVE / UTILITYS / DOS1A.ARC / DOS1A.MAC < prev   
Text File  |  1990-07-21  |  37KB  |  1,182 lines

  1.         TITLE    'SUPRBDOS Disk Operating System'
  2. ;
  3. ;    Implement full XON - XOFF protocol for console I/O
  4. ;
  5. ;                        Michael Stapleton 29/5/1987
  6. ;
  7. ;******************************************************************************
  8. ;*                                          *
  9. ;*  P 2 D O S --Z80 REPLACEMENT DISK OPERATING SYSTEM VERSION 1.2          *
  10. ;*        No more control-C to change disks!                      *
  11. ;*  COPYRIGHT (C) 1985 BY:     H.A.J. TEN BRUGGE                  *
  12. ;*  ALL RIGHTS RESERVED         MOLENSTRAAT 33                      *
  13. ;*                  NL-7491 BD DELDEN                  *
  14. ;*                 THE NETHERLANDS                  *
  15. ;*                 TEL:..31-5407-1980                  *
  16. ;*  P2DOS WAS WRITTEN BY HERMAN TEN BRUGGE, WHO ASSUMES NO RESPONSIBILITY     *
  17. ;*  OR LIABILITY FOR ITS USE. P2DOS IS RELEASED TO THE PUBLIC DOMAIN FOR      *
  18. ;*  NON-COMMERCIAL USE ONLY.                              *
  19. ;*                                          *
  20. ;*  THE PULBLIC IS ENCOURAGED TO FREELY COPY AND USE THIS PROGRAM FOR         *
  21. ;*  NON-COMMERCIAL PURPOSES. ANY COMMERCIAL USE OF P2DOS IS PROHIBITED        *
  22. ;*  UNLESS APPROVED BY THE AUTHOR, H.A.J. TEN BRUGGE, IN WRITING.          *
  23. ;*                                              *     
  24. ;*  THIS IS MOD 0.2 TO THE RELEASE VERSION OF P2DOS                  *
  25. ;*                                          *
  26. ;******************************************************************************
  27. ;*  MOD 0.2 Revisions
  28. ;*  Renamed to SUPRBDOS
  29. ;*        By Benjamin Ho
  30. ;*               626 Emerson St.
  31. ;*                 Evanston, IL 60201
  32. ;*  Background:
  33. ;* 
  34. ;*  P2DOS MOD 0.1 was not a major improvement on the standard CP/M BDOS.
  35. ;*  While it added Public files, slightly more informative error messages, and
  36. ;*  time stamping support, it did not fix the major annoyances of the CP/M BDOS,
  37. ;*  namely the necessity of logging in new disks with Control-C, mystifying
  38. ;*  error messages, and a delete key that looked like it didn't delete.  
  39. ;*
  40. ;*  P2DOS MOD 0.2 is a major enhancement which liberates the CP/M user from all
  41. ;*  these annoyances.  It is compatible with all CP/M software except those
  42. ;*  that modify the BDOS.  Fortunately, that type of program is extremely rare.
  43. ;*
  44. ;*  P2DOS MOD 0.2 may be used with ZCPR3 to provide an extremely powerful
  45. ;*  100% CP/M 2.2 compatible operating system.  The resulting system is not
  46. ;*  subject to Digital Research's licensing agreement.  The only restriction
  47. ;*  is that it may be used for non-commerical use only, as stated by the
  48. ;*  authors of ZCPR3 and P2DOS.
  49. ;*
  50. ;*  Enjoy!
  51. ;*  9/2/86- 
  52. ;*        Added automatic login of changed disks--no more Control-C 
  53. ;*          when changing disks!  
  54. ;*        Removed P2DOS tie to ZCPR2.  Can now be used with ZCPR3 or 
  55. ;*            (ugh!) normal CP/M.  
  56. ;*        Improved error messages:  
  57. ;*          Disk Error on X: Read Error 
  58. ;*                             Write Error 
  59. ;*                           Non-existent drive 
  60. ;*                             File is Read-Only 
  61. ;*        Fixed delete key--now works like backspace.  No echoing characters 
  62. ;*        Allowed functions 13 and 37 to recognize changes between single and 
  63. ;*            double sided disks on machines which normally require a warm 
  64. ;*            boot when "sidedness" is changed.  Bios modification is needed 
  65. ;*            to support this feature 
  66. ;*        Fixed directory read bug.  Function 37 bug which plagued
  67. ;*            library utility program NULU 1.5 is fixed.                
  68. ;*        Choice of assembly by M80 and compatibles or public domain ZASM 
  69. ;*          System files are read/write, as in CP/M.  Changed from P2DOS 
  70. ;*           mod 0.1 in which system files were R/O
  71. ;*          Deleted P2DOS search path so the more flexible 
  72. ;*           ZCR3 search path could be used
  73. ;*          File split into 3 sections for easy of editing.
  74. ;******************************************************************************
  75. RAMLOW    EQU    00000H            ; START ADDRESS MEMORY
  76. DOSSTRT    EQU    $
  77. P2BIOS    EQU    DOSSTRT+0E00H
  78. ;
  79. ;
  80. ;  P 2 D O S --Z80 REPLACEMENT DISK OPERATING SYSTEM VERSION 1.1
  81. ;
  82. ;
  83. ; NEW FEATURES OF P2DOS ARE:
  84. ; - TEST CONSOLE STATUS AFTER 256 CHARACTERS OUTPUT. THIS MAKES IT POSSIBLE TO
  85. ;   EXIT A PROGRAM, AFTER YOU HIT ACCIDENTALY A KEY, BY TYPING ^S FOLLOWED BY ^C.  
  86. ;  - ERROR ROUTINES GIVE MORE INFORMATION.
  87. ;      P2DOS ERROR ON D: BAD SECTOR
  88. ;             SELECT
  89. ;             FILE R/O
  90. ;             R/O
  91. ;      FUNCTION =XXX (FILE =FILENAME.TYP)
  92. ;    AS YOU CAN SEE THE ERROR IS DISPLAYED WITH THE P2DOS FUNCTION CALL.
  93. ;    THE OPTION 'FILE =FILENAME.TYP' IS ONLY DISPLAYED IF THE P2DOS FUNCTION
  94. ;    USES A FILENAME. AFTER ALL ERRORS A WARM BOOT IS DONE.
  95. ;
  96. ; - PUBLIC FILES ARE SUPPORTED. YOU CAN ACCESS A PUBLIC FILE FROM ANY
  97. ;   USER NUMBER.  THIS MAKES IT POSSIBLE TO PUT FOR EXAMPLE ALL '.COM' IN 
  98. ;   A SPECIAL USER NUMBER AND MAKE ALL THOSE FILES PUBLIC. YOU CAN ACCESS ALL 
  99. ;   THE FILES FROM ANY USER NUMBER ON THE SAME DISK.
  100. ;   A PUBLIC FILE IS A FILE WITH BIT F2 (BIT 7 FROM FILENAME LETTER 2) SET TO
  101. ;   ONE. PUBLIC FILES CAN ONLY BE REFERENCED BY THERE EXACT NAME AND NOT BY WILD
  102. ;   CARD CHARACTERS. 
  103. ;
  104. ; - SEARCH PATH IS IMPLEMENTED JUST AS IN ZCPR2 TO FIND FILES ON OTHER DRIVES
  105. ;   AND IN OTHER USER AREAS. THE FILES MUST BE SYSTEM FILES AND MUST BE
  106. ;   REFERENCED BY THEIR EXACT NAME AS IN PUBLIC FILE NAMES ABOVE.
  107. ;
  108. ; - AUTOMATIC DATE AND TIME STAMP IS IMPLEMENTED. THE CREATION DATE AND TIME
  109. ;    IS SET WHEN THE FUNCTION MAKE IS EXECUTED. THE UPDATE DATE AND TIME IS
  110. ;    SET AS THE FILE IS CLOSED. TO LET THIS FEATURE WORK YOU NEED TO HAVE A 
  111. ;    REAL TIME CLOCK AND THE CORRECT P2BIOS DRIVER ROUTINE. YOU ALSO HAVE TO 
  112. ;    INITIALISE YOUR  DIRECTORY FOR TIME STAMPS.   
  113. ;  - FILE R/O ERROR MESSAGE OCCURS IF ONE OF THE FOLLOWING FILE TYPES IS ACTIVE:
  114. ;     PUBLIC FILE (F2)
  115. ;     FILE R/O    (T1)
  116. ;     SYSTEM FILE (T2)
  117. ;    THIS MEANS THAT A SYSTEM FILE OR PUBLIC FILE CANNOT BE ERASED ACCIDENTALY.
  118. ;
  119. ; - NEW FUNCTION GET TIME (200) IS IMPLEMENTED TO GET THE CORRECT DATE AND TIME.
  120. ;   ENTRY DE IS ADDRESS TO PUT TIME. THE DATE AND TIME RECORD HAS THE FOLLOWING
  121. ;   LAYOUT:
  122. ;    DATE:    DEFS    2    DATE = 1     (SU 01-JAN-1978)
  123. ;                DATE = 65535 (SU 05-JUN-2157)     
  124. ;    HOUR:    DEFS    1    HOUR IN BCD
  125. ;    MINUTE:    DEFS    1    MINUTE IN BCD
  126. ;    SECOND:    DEFS    1    SECOND IN BCD
  127. ;    FUNCTION WORKS ONLY IF CORRECT P2BIOS FUNCTION CALL IS INSTALLED.
  128. ;
  129. ; - NEW FUNCTION SET TIME (201) IS IMPLEMENTED TO SET THE CORRECT DATE AND TIME.
  130. ;   ENTRY DE IS ADDRESS NEW TIME. THE DATE AND TIME LAYOUT IS AS ABOVE.
  131. ;   FUNCTION WORKS ONLY IF CORRECT P2BIOS FUNCTION CALL IS INSTALLED.
  132. ;
  133. ;  - DISK SIZE CAN BE AS LARGE AS 65536*16K=1 048 576 K BYTE=1 G BYTE. 
  134. ;  - FILE SIZE CAN BE AS LARGE AS 32*64*16K=32 768K BYTE=32 M BYTE.  
  135. ;
  136. ; YOU CAN ENABLE/DISABLE THE FUNCTIONS MENTIONED ABOVE WITH THE FOLLOWING DATA
  137. ; AND ADDRESSES.
  138. ;
  139. ; - ENABLE PATH NAME BY PUTTING ADDRESS OF PATH IN P2DOS+11H. IF THIS VALUE IS
  140. ;   0000H NO PATH IS USED. THIS ADDRESS IS NORMALLY SET TO 0040H.
  141. ;
  142. ; - ENABLE P2DOS TIME AND DATE STAMPING BY PUTTING THE CORRECT P2BIOS ADDRESS
  143. ;   AT P2DOS+13H. THIS ADDRESS IS NORMALY SET TO THE P2BIOS CONSOLE STATUS 
  144. ;   FUNCTION. 
  145. ;
  146. ; - YOU CAN ENABLE THE 256 CHARACTER DELAY FUNCTION BY SETTING BIT 0 OF
  147. ;   ADDRESS P2DOS+15H. THIS BIT IS NORMALLY SET TO 1.
  148. ;
  149. ; - YOU CAN ENABLE PUBLIC FILES BY SETTING BIT 1 OF ADDRESS P2DOS+15H TO 1.
  150. ;   THIS BIT IS NORMALLY SET TO 1.
  151. ;
  152. ; ENTRY ADDRESSES P2BIOS
  153. ;
  154. ; FUNC    NAME    INPUT PARAMETERS    RETURNED VALUES
  155. ;  0    BOOT    NONE            NONE
  156. ;  1    WBOOT    NONE            NONE
  157. ;  2    CONST    NONE            A=0FFH IF READY
  158. ;                    A=000H IF NOT READY
  159. ;  3    CONIN    NONE            A=CONSOLE CHARACTER
  160. ;  4    CONOUT    C=CONSOLE CHARACTER    NONE
  161. ;  5    LIST    C=LIST CHARACTER    NONE
  162. ;  6    PUNCH    C=PUNCH CHARACTER    NONE
  163. ;  7    READER    NONE            A=READER CHARACTER
  164. ;  8    HOME    NONE            NONE
  165. ;  9    SELDSK    C=DRIVE NUMBER (0..15)    HL=DISK PARAMETER HEADER ADDRESS
  166. ;        E=INIT SELECT FLAG    HL=0000H IF INVALID DRIVE
  167. ; 10    SETTRK    BC=TRACK NUMBER        NONE
  168. ; 11    SETSEC    BC=SECTOR NUMBER    NONE
  169. ; 12    SETDMA    BC=DMA ADDRESS        NONE
  170. ; 13    READ    NONE            A=00H IF NO ERROR
  171. ;                    A=01H IF ERROR
  172. ; 14    WRITE    C=0 WRITE DATA        A=00H IF NO ERROR
  173. ;        C=1 WRITE DIRECTORY    A=01H IF ERROR
  174. ;        C=2 WRITE NEW DATA
  175. ; 15    LISTST    NONE            A=000H IF READY
  176. ;                    A=0FFH IF NOT READY
  177. ; 16    SECTRN    BC=LOGICAL SECTOR    HL=PHYSICAL SECTOR NUMBER
  178. ;            NUMBER
  179. ;        DE=TRANSLATION TABLE
  180. ;            ADDRESS
  181. ; XX    TIME    C=000H GET TIME        HL=POINTER TO TIME TABLE
  182. ;        C=0FFH UPDATE CLOCK        HL+0:DATE LSB SINCE 1,1,1978
  183. ;        HL=POINTER TO TIME        HL+1:DATE MSB
  184. ;            TABLE            HL+2:HOURS  (BCD)
  185. ;                        HL+3:MINUTES (BCD)
  186. ;                        HL+4:SECONDS (BCD)
  187. ;
  188. BOOT    EQU    P2BIOS+00000H        ; P2 SYSTEM COLD BOOT
  189. WBOOT    EQU    P2BIOS+00003H        ; P2 SYSTEM WARM BOOT
  190. CONST    EQU    P2BIOS+00006H        ; P2 SYSTEM CONSOLE STATUS
  191. CONIN    EQU    P2BIOS+00009H        ; P2 SYSTEM CONSOLE INPUT
  192. CONOUT    EQU    P2BIOS+0000CH        ; P2 SYSTEM CONSOLE OUTPUT
  193. LIST    EQU    P2BIOS+0000FH        ; P2 SYSTEM LIST OUTPUT
  194. PUNCH    EQU    P2BIOS+00012H        ; P2 SYSTEM PUNCH OUTPUT
  195. READER    EQU    P2BIOS+00015H        ; P2 SYSTEM READER INPUT
  196. HOME    EQU    P2BIOS+00018H        ; P2 SYSTEM HOME DISK
  197. SELDSK    EQU    P2BIOS+0001BH        ; P2 SYSTEM SELECT DISK
  198. SETTRK    EQU    P2BIOS+0001EH        ; P2 SYSTEM SELECT TRACK
  199. SETSEC    EQU    P2BIOS+00021H        ; P2 SYSTEM SELECT SECTOR
  200. SETDMA    EQU    P2BIOS+00024H        ; P2 SYSTEM SET DMA ADDRESS
  201. READ    EQU    P2BIOS+00027H        ; P2 SYSTEM READ 128 BYTES
  202. WRITE    EQU    P2BIOS+0002AH        ; P2 SYSTEM WRITE 128 BYTES
  203. LISTST    EQU    P2BIOS+0002DH        ; P2 SYSTEM LIST STATUS
  204. SECTRN    EQU    P2BIOS+00030H        ; P2 SYSTEM SECTOR TRANSLATION
  205. TIME    EQU    P2BIOS+00006H        ; P2 SYSTEM GET/SET TIME
  206.                     ; MUST BE CHANGED IF ROUTINE PRESENT
  207. ;
  208. ;
  209. ; INTERNAL DEFINITIONS
  210. ;
  211. CONTC    EQU    003H            ; KEY TO GENERATE WARM BOOT
  212. CONTE    EQU    005H            ; BREAK LINE
  213. CONTH    EQU    008H            ; BACKSPACE
  214. TAB    EQU    009H            ; TAB
  215. LF    EQU    00AH            ; LINE FEED
  216. CR    EQU    00DH            ; CARRIAGE RETURN
  217. CONTP    EQU    010H            ; SET/RESET PRINT FLAG
  218. ;
  219. ; added definition for XON character
  220. ;
  221. XON    EQU    011H            ; DEFINE ASCII XON CHARACTER
  222. ;
  223. CONTR    EQU    012H            ; REPEAT LINE
  224. CONTS    EQU    013H            ; STOP CONSOLE OUTPUT
  225. CONTU    EQU    015H            ; DELETE LINE
  226. CONTX    EQU    018H            ; DELETE LINE (BACKSPACES)
  227. DRVSEP    EQU    03AH            ; DRIVE SEPERATOR (:)
  228. RUBOUT    EQU    07FH            ; DELETE LAST CHAR
  229. ;
  230. MAXCMD    EQU    40            ; NUMBER OF VALID P2DOS COMMANDS
  231. ;
  232. ; START PROGRAM
  233. ;    
  234. P2DOS:
  235. ;
  236. VERS:    DB    000H            ; VERSION NUMBER NOT IMPLEMENTED
  237.     DB    000H            
  238.     DB    000H            
  239.     DB    000H
  240.     DB    000H
  241.     DB    000H
  242. ;
  243. ; START P2DOS
  244. ;
  245. START:    JP    ENTRY            ; JUMP TO ENTRY POINT P2DOS
  246. ;
  247. ; ERROR MESSAGES P2DOS
  248. ;
  249. ;Bad sector message changed to read/write messages-B.H.
  250. ;STBDSC:    DEFW    BADSEC            ; BAD SECTOR MESSAGE
  251. STSEL:    DEFW    SELERR            ; SELECT ERROR
  252. STRO:    DEFW    RDONLY            ; DRIVE READ ONLY
  253. SFILRO:    DEFW    FILRO            ; FILE READ ONLY
  254. SRDERR:    DEFW    RDERR            ; Read error message
  255. SWRTER:    DEFW    WRTERR            ; Write error message
  256. ;
  257. ; EXTERNAL PATH NAME
  258. ;
  259. ;PATH:    DEFW    RAMLOW+00040H        ; PATHNAME FOR OPEN FILE COMMAND
  260. ;Path not supported--B.H.
  261. PATH:    DEFW    RAMLOW+0000H
  262. ;
  263. ; TIME ADDRESS P2BIOS
  264. ;
  265.     IF    DOTIME
  266. TIMEAD:    DEFW    TIME            ; TIME ROUTINE ADDRESS FOR TIME
  267.                         ; AND DATE STAMPS
  268.     ELSE
  269. TIMEAD:    DEFW    CONST
  270.     ENDIF
  271. ;
  272. ; FLAGS FOR SPECIALS
  273. ; BIT 0: PUBLIC FILE ENABLE(1)/DISABLE(0)
  274. ; BIT 1: DELAY 256 CHARACTERS ACTIVE(1)/DISABLE(0)
  275. ;
  276. FLAGS:    DB    0FFH            ; FLAG BITE
  277. ;
  278. ; ENTRY POINT P2DOS COMMANDS
  279. ;
  280. ENTRY:    LD    A,C            ; GET FUNCTION NUMBER
  281.     LD    (FUNCT),A        ; SAVE IT FOR LATER USE
  282.     LD    HL,0            ; SET HL TO ZERO
  283.     LD    (PEXIT),HL        ; CLEAR EXIT CODE
  284.     XOR    A            ; CLEAR A
  285.     LD    (FLDRV),A        ; RESET DRIVE SELECT DONE FLAG
  286.     LD    (RDWR),A        ; RESET READ/WRITE FLAG
  287.     LD    (SPSAVE),SP        ; SAVE STACK POINTER
  288.     LD    SP,P2DOSS        ; GET INTERNAL STACK POINTER
  289.     PUSH    IX            ; SAVE INDEX REGISTER
  290.     PUSH    DE            ; SAVE PARAMETER REGISTER
  291.     POP    IX            ; GET IT BACK IN IX
  292.     LD    HL,P2EXIT        ; GET EXIT ADDRESS P2DOS
  293.     PUSH    HL            ; SAVE IT ON STACK TO RETURN FROM P2DOS
  294.     LD    A,C            ; GET FUNCTION CODE
  295. ;
  296.     IF    DOTIME
  297.     CP    200            ; TEST GET TIME
  298.     JP    Z,GETTIM        ; YES THEN GET TIME
  299.     CP    201            ; TEST SET TIME
  300.     JP    Z,SETTIM        ; YES THEN SET TIME
  301.     ENDIF
  302. ;
  303.     CP    MAXCMD+1        ; TEST GREATER THEN MAXCMD 
  304.     RET    NC            ; IF SO RETURN TO CALLER AND DO NOTHING
  305.     LD    HL,CTABLE        ; LOAD TABLE
  306.     LD    B,0            ; PREPARE 16 BIT ADD
  307.     ADD    HL,BC            ; ADD
  308.     ADD    HL,BC            ; ADD TWICE TO GET WORD VALUE
  309.     LD    A,(HL)            ; GET LSB
  310.     INC    HL            ; POINTER TO MSB
  311.     LD    H,(HL)            ; GET MSB
  312.     LD    L,A            ; SAVE LSB IN L 
  313.     JP    (HL)            ; JUMP TO ROUTINE
  314. ;
  315. ; COMMAND TABLE
  316. ;
  317. ;
  318. ; FUNC    NAME            INPUT PARAMETERS    RETURNED VALUES
  319. ;   0    BOOT            NONE            NONE
  320. ;   1    CONSOLE INPUT        NONE            A=CHARACTER
  321. ;   2    CONSOLE OUTPUT        E=CHARACTER        A=00H
  322. ;   3    READER INPUT        NONE            A=CHARACTER
  323. ;   4    PUNCH OUTPUT        E=CHARACTER        A=00H
  324. ;   5    LIST OUTPUT        E=CHARACTER        A=00H
  325. ;   6    DIRECT CONSOLE I/O    E=0FFH            A=INPUT CHARACTER
  326. ;                            A=00H IF NO CHARACTER 
  327. ;                                PRESENT
  328. ;                E=0FEH            A=CONSOLE STATUS
  329. ;                E=000H..0FDH        A=00H
  330. ;   7    GET I/O BYTE        NONE            A=I/O BYTE (RAMLOW+03H)
  331. ;   8    SET I/O BYTE        E=I/O BYTE        A=00H
  332. ;   9    PRINT STRING        DE=ADDRESS STRING    A=00H
  333. ;  10    READ CONSOLE BUFFER    DE=ADDRESS BUFFER    A=00H
  334. ;  11    GET CONSOLE STATUS    NONE            A=00H IF NO CHARACTER 
  335. ;                                PRESENT
  336. ;                            01H IF CHARACTER PRESENT
  337. ;  12    RETURN VERSION NUMBER    NONE            A=VERSION NUMBER (022H)
  338. ;  13    RESET DISK SYSTEM    NONE            A=00H NO $*.* FILE
  339. ;                            A=FFH $*.* FILE PRESENT
  340. ;  14    SELECT DISK        E=DISK NUMBER        A=00H
  341. ;  15    OPEN FILE        DE=ADDRESS FCB        A=DIRECTORY CODE
  342. ;  16    CLOSE FILE        DE=ADDRESS FCB        A=DIRECTORY CODE
  343. ;  17    SEARCH FOR FIRST    DE=ADDRESS FCB        A=DIRECTORY CODE
  344. ;  18    SEARCH FOR NEXT        DE=ADDRESS FCB        A=DIRECTORY CODE
  345. ;  19    DELETE FILE        DE=ADDRESS FCB        A=ERROR CODE
  346. ;  20    READ SEQUENTIAL        DE=ADDRESS FCB        A=READ/WRITE CODE
  347. ;  21    WRITE SEQUENTIAL    DE=ADDRESS FCB        A=READ/WRITE CODE
  348. ;  22    MAKE FILE        DE=ADDRESS FCB        A=DIRECTORY CODE
  349. ;  23    RENAME FILE        DE=ADDRESS FCB        A=ERROR CODE
  350. ;  24    RETURN LOGIN VECTOR    NONE            HL=LOGIN VECTOR
  351. ;  25    RETURN CURRENT DISK    NONE            A=CURRENT DISK
  352. ;  26    SET DMA ADDRESS        DE=DMA ADDRESS        A=00H
  353. ;  27    GET ALLOCATION ADDRESS    NONE            HL=ADDRESS ALLOCATION 
  354. ;                                VECTOR
  355. ;  28    WRITE PROTECT DISK    NONE            A=00H
  356. ;  29    GET R/O VECTOR        NONE            HL=R/O VECTOR
  357. ;  30    SET FILE ATTRIBUTES    DE=ADDRESS FCB        A=ERROR CODE
  358. ;  31    GET ADDRESS DPB        NONE            HL=ADDRESS DPB
  359. ;  32    SET/GET USER CODE    E=0FFH            A=USER NUMBER
  360. ;                E=USER NUMBER        A=00H
  361. ;  33    READ RANDOM        DE=ADDRESS FCB        A=READ/WRITE CODE
  362. ;  34    WRITE RANDOM        DE=ADDRESS FCB        A=READ/WRITE CODE
  363. ;  35    COMPUTE FILE SIZE    DE=ADDRESS FCB        A=ERROR CODE
  364. ;  36    SET RANDOM RECORD    DE=ADDRESS FCB        A=00H
  365. ;  37    RESET MULTIPLE DRIVE    DE=MASK            A=00H
  366. ;  38    NOT IMPLEMENTED        NONE            A=00H
  367. ;  39    NOT IMPLEMENTED        NONE            A=00H
  368. ;  40    WRITE RANDOM WITH    DE=ADDRESS FCB        A=READ/WRITE CODE
  369. ;     ZERO FILL
  370. ; 200    GET TIME        DE=ADDRESS TO PUT TIME    A=00H
  371. ; 201    SET TIME        DE=ADDRESS TIME        A=00H
  372. ;
  373. ; DIRECTORY CODE : A=00H,01H,02H,03H IF NO ERROR
  374. ;                  A=0FFH IF ERROR
  375. ; ERROR CODE     : A=00H IF NO ERROR
  376. ;                  A=0FFH IF ERROR
  377. ; READ/WRITE CODE: A=00H IF NO ERROR
  378. ;           A=01H READ  => END OF FILE
  379. ;             WRITE => DIRECTORY FULL
  380. ;           A=02H DISK FULL
  381. ;
  382. CTABLE:    DEFW    WBOOT            ; WARM BOOT 
  383.     DEFW    RDCON            ; CONSOLE INPUT
  384.     DEFW    BWRCON            ; CONSOLE OUTPUT
  385.     DEFW    RDRDR            ; READER INPUT
  386.     DEFW    WPUNCH            ; PUNCH OUTPUT
  387.     DEFW    WLIST            ; LIST OUTPUT
  388.     DEFW    DCIO            ; DIRECT CONSOLE I/O
  389.     DEFW    GIOST            ; GET I/O BYTE
  390.     DEFW    SIOST            ; SET I/O BYTE
  391.     DEFW    MESS            ; PRINT STRING
  392.     DEFW    RDBUF            ; READ CONSOLE BUFFER
  393.     DEFW    TSTCS            ; GET CONSOLE STATUS
  394.     DEFW    CMND12            ; RETURN VERSION NUMBER
  395.     DEFW    CMND13            ; RESET DISK SYSTEM
  396.     DEFW    CMND14            ; SELECT DISK
  397.     DEFW    CMND15            ; OPEN FILE
  398.     DEFW    CMND16            ; CLOSE FILE
  399.     DEFW    CMND17            ; SEARCH FOR FIRST
  400.     DEFW    CMND18            ; SEARCH FOR NEXT
  401.     DEFW    CMND19            ; DELETE FILE
  402.     DEFW    CMND20            ; READ SEQUENTIAL
  403.     DEFW    CMND21            ; WRITE SEQUENTIAL
  404.     DEFW    CMND22            ; MAKE FILE
  405.     DEFW    CMND23            ; RENAME FILE
  406.     DEFW    CMND24            ; RETURN LOGIN VECTOR
  407.     DEFW    CMND25            ; RETURN CURRENT DISK
  408.     DEFW    CMND26            ; SET DMA ADDRESS
  409.     DEFW    CMND27            ; GET ADDRESS ALLOCATION VECTOR
  410.     DEFW    CMND28            ; WRITE PROTECT DISK
  411.     DEFW    CMND29            ; GET R/O VECTOR
  412.     DEFW    CMND30            ; SET FILE ATTRIBUTES
  413.     DEFW    CMND31            ; GET ADDRESS DISK PARAMETER HEADER(DPH) 
  414.     DEFW    CMND32            ; GET/SET USER CODE
  415.     DEFW    CMND33            ; READ RANDOM
  416.     DEFW    CMND34            ; WRITE RANDOM
  417.     DEFW    CMND35            ; COMPUTE FILE SIZE
  418.     DEFW    CMND36            ; SET RANDOM RECORD
  419.     DEFW    CMND37            ; RESET MULTIPLE DRIVE
  420.     DEFW    DUMMY            ; NOT IMPLEMENTED 
  421.     DEFW    DUMMY            ; NOT IMPLEMENTED 
  422.     DEFW    CMND40            ; WRITE RANDOM WITH ZERO FILL
  423. ;
  424. ; I/O ROUTINES
  425. ;
  426. ; P2DOS CONSOLE INPUT
  427. ;
  428. ; READ CHARACTER FROM CONSOLE AND ECHO
  429. ;  IF CHAR=CR,LF,TAB,CONTH OR >=SPACE
  430. ;
  431. RDCON:    CALL    GETCH            ; GET CHARACTER
  432.     CALL    TSTCH            ; TEST IF CR,LF,TAB,CONTH OR >=SPACE
  433.     JR    C,EXIT            ; NO THEN EXIT
  434.     CALL    WRCON            ; ECHO CHARACTER
  435. EXIT:    LD    (PEXIT),A        ; RETURN CHARACTER 
  436. DUMMY:    RET                ; AND EXIT P2DOS
  437. ;
  438. ; P2DOS WRITE CONSOLE
  439. ;
  440. BWRCON:    LD    A,E            ; COPY CHARACTER
  441.     JR    WRCON            ; AND OUTPUT IT
  442. ;
  443. ; READ READER
  444. ;
  445. RDRDR:    CALL    READER            ; GET CHARACTER FROM READER
  446.     JR    EXIT            ; AND RETURN IT TO CALLER 
  447. ;
  448. ; WRITE PUNCH
  449. ;
  450. WPUNCH:    LD    C,E            ; COPY CHARACTER
  451.     JP    PUNCH            ; AND OUTPUT IT TO PUNCH DEVICE
  452. ;
  453. ; WRITE LIST
  454. ;
  455. WLIST:    LD    C,E            ; COPY CHARACTER
  456.     JP    LIST            ; AND OUTPUT IT TO LIST DEVICE
  457. ;
  458. ; DIRECT CONSOLE INPUT/OUTPUT
  459. ;
  460. DCIO:    LD    C,E            ; COPY CHARACTER
  461.     INC    E            ; TEST IF 0FFH
  462.     JR    Z,DCIO0            ; YES DO INPUT
  463.     INC    E            ; TEST IF 0FEH
  464.     JP    NZ,CONOUT        ; NO THEN OUTPUT CHARACTER
  465.     CALL    CONST            ; GET CONSOLE STATUS
  466.     JR    EXIT            ; AND RETURN IT TO CALLER
  467. DCIO0:    CALL    CONST            ; GET CONSOLE STATUS
  468.     OR    A            ; TEST IT
  469.     RET    Z            ; EXIT IF NO CHARACTER PRESENT
  470.     CALL    CONIN            ; GET CHARACTER
  471.     JR    EXIT            ; AND RETURN IT TO CALLER
  472. ;
  473. ; GET I/O STATUS BYTE
  474. ;
  475. GIOST:    LD    A,(RAMLOW+00003H)    ; GET I/O BYTE FROM RAM
  476.     JR    EXIT            ; AND RETURN IT TO CALLER
  477. ;
  478. ; SET I/O STATUS BYTE
  479. ;
  480. SIOST:    LD    A,E            ; COPY I/O BYTE
  481.     LD    (RAMLOW+00003H),A    ; AND SAVE IT IN RAM
  482.     RET                ; EXIT TO CALLER
  483. ;
  484. ; TEST CONSOLE STATUS
  485. ;
  486. TSTCS:    CALL    GCONST            ; GET CONSOLE STATUS
  487.     JR    EXIT            ; AND RETURN IT TO CALLER
  488. ;
  489. ; OUTPUT CHAR (CONTROL CHAR = ^CHAR)
  490. ;
  491. OUTCH:    CALL    TSTCH            ; TEST IT CR,LF,TAB,CONTH OR >=SPACE
  492.     JR    NC,WRCON        ; YES THEN JUMP
  493.     PUSH    AF            ; SAVE CHARACTER
  494.     LD    A,'^'            ; LOAD A WITH '^' 
  495.     CALL    WRCON            ; OUTPUT IT
  496.     POP    AF            ; GET CHARACTER BACK
  497.     PUSH    AF            ; SAVE IT AGAIN
  498.     ADD    A,'A'-1            ; ADD OFFSET
  499.     CALL    WRCON            ; OUTPUT IT
  500.     POP    AF            ; GET CHARACTER
  501.     RET                ; RETURN TO CALLER
  502. ;
  503. ; ECHO CR,LF
  504. ;
  505. CROUT:    LD    A,CR            ; A=CARRIAGE RETURN
  506.     CALL    WRCON            ; OUTPUT IT
  507.     LD    A,LF            ; A=LINE FEED
  508.                     ; FALL THROUGH TO OUTPUT ROUTINE
  509. ;
  510. ; WRITE CHARACTER ON CONSOLE
  511. ;
  512. WRCON:    CP    TAB            ; TEST IF TAB
  513.     JR    NZ,WRCON1        ; NO THEN JUMP
  514. WRCON0:    LD    A,' '            ; EXPAND TAB WITH SPACES
  515.     CALL    WRCON            ; WRITE SPACE
  516.     LD    A,(TABCNT)        ; GET TAB COUNT
  517.     AND    7            ; TEST IF DONE
  518.     JR    NZ,WRCON0        ; NO THEN REPEAT
  519.     LD    A,TAB            ; RETURN TAB
  520.     RET                ; RETURN TO CALLER
  521. WRCON1:    PUSH    AF            ; SAVE CHARACTER
  522.     CALL    GCONST            ; TEST STATUS AND CONTS/CONTC
  523.     POP    AF            ; GET CHARACTER BACK
  524.     PUSH    AF            ; SAVE IT AGAIN
  525.     LD    C,A            ; COPY IT
  526.     CALL    CONOUT            ; OUTPUT IT
  527.     POP    AF            ; GET CHARACTER BACK
  528.     PUSH    AF            ; SAVE IT AGAIN
  529.     LD    C,A            ; COPY IT
  530.     LD    A,(FCONTP)        ; GET PRINTER ECHO FLAG 
  531.     OR    A            ; TEST IT
  532.     CALL    NZ,LIST            ; NON ZERO => OUTPUT CHAR TO PRINTER
  533.     LD    A,(FLAGS)        ; GET FLAG BYTE
  534.     BIT    1,A            ; TEST DELAY 256 BYTES ACTIVE
  535.     JR    Z,WRCON2        ; NO THEN EXIT
  536.     LD    HL,DELAY        ; GET DELAY COUNTER
  537.     XOR    A            ; A=0 
  538.     OR    (HL)            ; TEST COUNTER=0
  539.     JR    Z,WRCON2        ; YES THEN EXIT
  540.     DEC    (HL)            ; ELSE DECREMENT COUNTER
  541. WRCON2:    POP    AF            ; RESTORE CHARACTER
  542.                     ; FALL THROUGH TO COUNT ROUTINE
  543. ;
  544. ; COUNT CHARACTERS IN LINE
  545. ;
  546. COUNTC:    LD    HL,TABCNT        ; GET POINTER TO TAB COUNTER
  547. ;Part of delete key fix--B.H.
  548. ;    CP    RUBOUT            ; TEST IF CHARACTER = RUBOUT
  549. ;    RET    Z            ; YES NO UPDATE TAB COUNTER
  550.     INC    (HL)            ; INCREMENT TAB COUNTER
  551.     CP    ' '            ; TEST IF CHAR >= ' '
  552.     RET    NC            ; YES, NORMAL CHARACTER THEN EXIT
  553.     DEC    (HL)            ; CONTROL CHARACTER, DECREMENT TAB COUNT
  554.     CP    CONTH            ; TEST BACKSPACE
  555.     JR    NZ,COUNT0        ; NO BACKSPACE THEN JUMP
  556.     DEC    (HL)            ; DECREMENT TAB COUNTER
  557.     RET                ; AND EXIT
  558.     CP    RUBOUT
  559.     JR    NZ,COUNT0
  560.     DEC    (HL)
  561.     RET
  562. COUNT0:    CP    CR            ; TEST CARRIAGE RETURN
  563.     JR    NZ,COUNT1        ; NO THEN JUMP
  564.     LD    (HL),0            ; RESET TAB COUNT
  565.     RET                ; AND EXIT
  566. COUNT1:    CP    TAB            ; TEST TAB CHARACTER
  567.     RET    NZ            ; NO THEN EXIT
  568.     PUSH    AF            ; SAVE CHARACTER
  569.     LD    A,(HL)            ; GET TAB COUNT
  570.     ADD    A,8            ; ADVANCE IT 8 POSITION
  571.     AND    0F8H            ; SET IT TO NEXT TAB POSITION
  572.     LD    (HL),A            ; SAVE IT
  573.     POP    AF            ; RESTORE CHARACTER 
  574.     RET                ; AND EXIT
  575. ;
  576. ; GET CHARACTER FROM CONSOLE
  577. ;
  578. GETCH:    LD    HL,LASTCH        ; GET POINTER TO LAST INPUT CHARACTER
  579.     LD    A,(HL)            ; GET CHARACTER
  580.     LD    (HL),0            ; RESET LAST CHARACTER
  581.     OR    A            ; TEST IF CHARACTER PRESENT
  582.     RET    NZ            ; RETURN IF SO
  583.     JP    CONIN            ; ELSE GET CHARACTER
  584. ;
  585. ; GET CONSOLE STATUS
  586. ;
  587. GCONST:    LD    A,(DELAY)        ; GET 256 BYTES DELAY
  588.     OR    A            ; TEST IT
  589.     JR    NZ,GCONS0        ; NON ZERO, DELAY STIL ACTIVE OR DISABLED
  590.     CALL    CONST            ; GET CONSOLE STATUS
  591.     AND    1            ; TEST IT
  592.     JR    NZ,GCONS1        ; NON ZERO THEN GET CHARACTER
  593. GCONS0:    LD    A,(LASTCH)        ; GET LAST CHARACTER
  594.     OR    A            ; TEST IT
  595.     JR    NZ,GCONS3        ; NON ZERO THEN CHARACTER PRESENT
  596.     CALL    CONST            ; GET CONSOLE STATUS
  597.     AND    1            ; TEST IT
  598.     RET    Z            ; RETURN IF NO CHARACTER PRESENT
  599. GCONS1:    CALL    CONIN            ; GET CHARACTER
  600.     CP    CONTS            ; TEST STOP CHARACTER
  601.     JR    NZ,GCONS2        ; NOT THEN EXIT CHARACTER
  602. ;
  603. ; added label "GCNS1A" here for not XON character loop
  604. ;
  605. GCNS1A:    CALL    CONIN            ; GET NEXT CHARACTER
  606.     CP    CONTC            ; TEST IF USER WANTS TO EXIT
  607.     JP    Z,RAMLOW+00000H        ; YES THEN WARM BOOT
  608. ;
  609. ; code added to test for XON - if yes then start output else wait for XON
  610. ;
  611.     CP    XON            ; SEE IF START CHARACTER
  612.     JR    NZ,GCNS1A        ; LOOP IF NOT
  613. ;
  614.     JR    GCONST            ; TEST AGAIN
  615. GCONS2:    LD    (LASTCH),A        ; SAVE CHARACTER
  616.     LD    A,0FFH            ; SET DELAY COUNTER
  617.     LD    (DELAY),A        ; AND SAVE IT
  618. GCONS3:    LD    A,1            ; CHARACTER PRESENT CODE
  619.     RET                ; RETURN TO CALLER
  620. ;
  621. ; TEST CHARACTER
  622. ;  EXIT CARRY=0: CR,LF,TAB,CONTH OR >=SPACE
  623. ;       CARRY=1: ALL OTHER CHARACTERS
  624. ;
  625. TSTCH:    CP    CR            ; TEST CARRIAGE RETURN
  626.     RET    Z            ; RETURN IF SO
  627.     CP    LF            ; TEST LINE FEED
  628.     RET    Z            ; RETURN IF SO
  629.     CP    TAB            ; TEST TAB
  630.     RET    Z            ; RETURN IF SO
  631.     CP    CONTH            ; TEST BACKSPACE
  632. ;Added next two lines as a part of delete key fix--B.H.
  633.     RET    Z            ; RETURN IF SO
  634.     CP    RUBOUT
  635.     RET    Z
  636.     CP    ' '            ; TEST >=SPACE
  637.     RET                ; RETURN TO CALLER
  638. ;
  639. ; WRITE BACKSPACE,SPACE,BACKCPACE
  640. ;
  641. WCONTH:    CALL    WCONT0            ; WRITE BACKSPACE
  642.     LD    C,' '            ; LOAD SPACE
  643.     CALL    CONOUT            ; AND OUTPUT IT
  644. WCONT0:    LD    C,CONTH            ; LOAD BACKSPACE
  645.     JP    CONOUT            ; AND OUTPUT IT
  646. ;
  647. ; OUTPUT MESSAGE
  648. ;
  649. MESS:    LD    A,(DE)            ; GET BYTE FROM BUFFER
  650.     CP    '$'            ; TEST LAST BYTE
  651.     RET    Z            ; YES, THEN RETURN TO CALLER
  652.     INC    DE            ; POINT TO NEXT BYTE
  653.     PUSH    DE            ; SAVE POINTER
  654.     CALL    WRCON            ; OUTPUT CHARACTER
  655.     POP    DE            ; RESTORE POINTER
  656.     JR    MESS            ; AND TEST AGAIN
  657. ;
  658. ; AGAIN PRINTS #,CR,LF AND ADVANCES TO TABCX1
  659. ;
  660. AGAIN:    LD    A,'#'            ; LOAD '#'
  661.     CALL    WRCON            ; OUTPUT IT
  662. AGAIN0:    CALL    CROUT            ; OUTPUT CARRIAGE RETURN/LINE FEED
  663. AGAIN1:    LD    HL,TABCNT        ; GET TAB COUNT POINTER
  664.     LD    A,(TABCX1)        ; GET POSITION FIRST CHARACTER LINE
  665.     CP    (HL)            ; CHECK IT
  666.     RET    Z            ; RETURN IF ON SAME POSITION
  667.     LD    A,' '            ; LOAD SPACE
  668.     CALL    WRCON            ; OUTPUT IT
  669.     JR    AGAIN1            ; AND TEST AGAIN
  670. ;
  671. ; DELETE CHAR
  672. ;  ENTRY : HL=START BUFFER-1
  673. ;          B =CHARACTER COUNTER (ALWAYS>0)
  674. ;
  675. DELCH:    DEC    B            ; DECREMENT CHARACTER COUNTER
  676.     LD    A,(TABCNT)        ; GET TAB COUNTER
  677.     PUSH    AF            ; SAVE IT
  678.     PUSH    BC            ; SAVE CHARACTER COUNTER
  679.     LD    A,(TABCX1)        ; GET POSITION FIRST CHARACTER LINE
  680.     LD    (TABCNT),A        ; SAVE IT IN TAB COUNTER
  681. DELCH0:    LD    A,B            ; COPY CHARACTER COUNTER
  682.     OR    A            ; TEST IF 0
  683.     JR    Z,DELCH2        ; YES THEN JUMP
  684.     DEC    B            ; DECREMENT IT
  685.     INC    HL            ; INCREMENT BUFFER POINTER
  686.     LD    A,(HL)            ; GET CHARACTER FROM BUFFER
  687.     PUSH    HL            ; SAVE BUFFER POINTER
  688.     CALL    TSTCH            ; TEST IF CR,LF,TAB,CONTH OR >=SP
  689.     JR    NC,DELCH1        ; YES THEN JUMP
  690.     RRA                ; ELSE MUST BE CONTROL CHARACTER
  691.     CALL    COUNTC            ; COUNT CONTROL CHARACTER TWICE
  692. DELCH1:    CALL    COUNTC            ; COUNT CHARACTER
  693.     POP    HL            ; GET BUFFER POINTER
  694.     JR    DELCH0            ; AND TEST AGAIN
  695. DELCH2:    POP    BC            ; RESTORE CHARACTER COUNTER
  696.     POP    AF            ; AND TAB COUNTER
  697.     PUSH    HL            ; SAVE BUFFER POINTER
  698.     PUSH    BC            ; AND CHARACTER COUNTER
  699.     LD    HL,TABCNT        ; GET TAB COUNTER POINTER
  700.     SUB    (HL)            ; CALCULATE DIFFERENCE
  701. DELCH3:    DEC    A            ; DECREMENT IT
  702.     CP    8            ; COMPARE WITH 8
  703.     JR    NC,DELCH4        ; JUMP IF >=8
  704.     PUSH    AF            ; SAVE DIFFERENCE
  705.     CALL    WCONTH            ; REMOVE CHARACTER END LINE
  706.     POP    AF            ; RESTORE COUNTER
  707.     JR    DELCH3            ; REMOVE MORE CHARACTERS
  708. DELCH4:    POP    BC            ; RESTORE CHARACTER COUNTER
  709.     POP    HL            ; RESTORE BUFFER POINTER
  710.     RET                ; AND RETURN TO CALLER 
  711. ;
  712. ; READ BUFFER
  713. ;
  714. RDBUF:    LD    A,(TABCNT)        ; GET CURRENT POSITION CURSOR
  715.     LD    (TABCX1),A        ; SAVE IT
  716. RDBUF0:    PUSH    IX            ; SAVE START ADDRESS BUFFER
  717.     POP    HL            ; GET IT IN HL
  718.     LD    C,(HL)            ; GET MAXIMUM LINE LENGTH
  719.     INC    HL            ; INCREMENT TO LINE LENGTH POSITION
  720.     LD    B,0            ; CLEAR LINE LENGTH COUNTER
  721.     PUSH    HL            ; SAVE START LINE - 1
  722. RDBUF1:    PUSH    HL            ; SAVE REGISTERS
  723.     PUSH    BC
  724. RDBUF2:    CALL    GETCH            ; GET CHARACTER
  725.     POP    BC            ; RESTORE REGISTERS
  726.     POP    HL
  727.     AND    07FH            ; MASK CHARACTER
  728.     CP    CONTE            ; TEST IF CONTE
  729.     JR    NZ,RDBUF3        ; NOT THEN JUMP 
  730.     PUSH    HL            ; SAVE REGISTERS
  731.     PUSH    BC
  732.     CALL    AGAIN0            ; MOVE CURSOR TO NEXT LINE
  733.     JR    RDBUF2            ; AND GET NEXT CHAR
  734. RDBUF3:    CP    CONTH            ; TEST BACKSPACE
  735.     JR    NZ,RDBUF4        ; NOT THEN JUMP
  736. DOBACK:    LD    A,B            ; TEST IF DELETING CHAR FROM EMPTY LINE
  737.     OR    A
  738.     JR    Z,RDBUF1        ; YES THEN GET NEXT CHAR
  739.     POP    HL            ; GET START LINE
  740.     PUSH    HL            ; AND SAVE IT AGAIN
  741.     CALL    DELCH            ; DELETE CHARACTER
  742.     JR    RDBUF1            ; GET NEXT CHARACTER
  743. RDBUF4:    CP    CONTP            ; TEST PRINT ENABLE/DISABLE
  744.     JR    NZ,RDBUF6        ; NOT THEN JUMP
  745.     LD    A,(FCONTP)        ; COMPLEMENT PRINT FLAG
  746.     CPL
  747.     LD    (FCONTP),A
  748. RDBUF5:    JR    RDBUF1            ; AND GET NEXT CHARACTER
  749. RDBUF6:    CP    CONTR            ; TEST REPEAT LINE
  750.     JR    NZ,RDBUFA        ; NOT THEN JUMP
  751.     PUSH    BC            ; SAVE REGISTERS
  752.     CALL    AGAIN            ; MOVE CURSOR TO NEXT LINE
  753.     POP    BC            ; RESTORE REGISTERS
  754.     POP    HL            ; GET START LINE
  755.     PUSH    HL            ; SAVE IT AGAIN
  756.     PUSH    BC            ; SAVE LINE COUNTER/MAXIMUM LINE LENGTH
  757. RDBUF7:    LD    A,B            ; TEST LAST CHARACTER ECHOED 
  758.     OR    A
  759.     JR    Z,RDBUF8        ; YES THEN JUMP
  760.     INC    HL            ; INCREMENT POINTER
  761.     LD    A,(HL)            ; GET CHARACTER
  762.     DEC    B            ; DECREMENT LINE COUNTER
  763.     PUSH    HL            ; SAVE REGISTERS
  764.     PUSH    BC
  765.     CALL    OUTCH            ; OUTPUT CHARACTER
  766.     POP    BC            ; RESTORE REGISTERS
  767.     POP    HL
  768.     JR    RDBUF7            ; AND TEST END LINE
  769. RDBUF8:    POP    BC            ; RESTORE LINE COUNTER/MAX LINE LENGTH
  770. RDBUF9:    JR    RDBUF5            ; AND GET NEXT CHAR
  771. RDBUFA:    CP    CONTU            ; TEST DELETE LINE
  772.     JR    NZ,RDBUFC        ; NOT THEN JUMP
  773.     POP    HL            ; GET START LINE
  774.     CALL    AGAIN            ; MOVE CURSOR TO NEXT LINE
  775. RDBUFB:    JR    RDBUF            ; AND START ROUTINE AGAIN
  776. RDBUFC:    CP    CONTX            ; TEST DELETE LINE
  777.     JR    NZ,RDBUFE        ; NOT THEN JUMP
  778. RDBUFD:    POP    HL            ; GET START LINE
  779.     LD    A,B            ; TEST IF LAST CHARACTER DELETED
  780.     OR    A
  781.     JR    Z,RDBUFB        ; YES START ROUTINE AGAIN
  782.     PUSH    HL            ; SAVE POINTER
  783.     CALL    DELCH            ; DELETE LAST CHARACTER LINE
  784.     JR    RDBUFD            ; TEST LAST CHARACTER DELETED
  785. RDBUFE:    CP    RUBOUT            ; TEST DELETE LAST CHARACTER
  786.     JR    NZ,RDBUFF        ; NOT THEN JUMP
  787.     JR    DOBACK            ; Part of delete key fix
  788. ;Remove code for echoing deleted character--B.H.
  789. ;    LD    A,B            ; TEST FIRST CHARACTER LINE
  790. ;    OR    A
  791. ;    JR    Z,RDBUF9        ; YES, DO NOT DELETE
  792. ;    LD    A,(HL)            ; GET LAST CHARACTER
  793. ;    DEC    HL            ; DECREMENT POINTER LINE
  794. ;    DEC    B            ; DECREMENT LINE COUNTER
  795. ;    JR    RDBUFG            ; ECHO LAST CHARACTER
  796. RDBUFF:    CP    CR            ; TEST CARRIAGE RETURN
  797.     JR    Z,RDBUFI        ; YES, THEN EXIT
  798.     CP    LF            ; TEST LINE FEED
  799.     JR    Z,RDBUFI        ; YES THEN EXIT
  800.     INC    HL            ; INCREMENT POINTER
  801.     LD    (HL),A            ; AND SAVE CHARACTER
  802.     INC    B            ; INCREMENT LINE COUNTER
  803. RDBUFG:    PUSH    HL            ; SAVE REGISTERS
  804.     PUSH    BC
  805.     CALL    OUTCH            ; ECHO CHARACTER
  806.     POP    BC            ; RESTORE REGISTERS
  807.     POP    HL
  808.     CP    CONTC            ; TEST WARM BOOT
  809.     LD    A,B            ; GET LINE COUNT
  810.     JR    NZ,RDBUFH        ; NO WARM BOOT THEN JUMP
  811.     CP    1            ; TEST CONTC IS FIRST CHARACTER LINE 
  812.     JP    Z,RAMLOW+00000H        ; YES THEN EXECUTE WARM BOOT
  813. RDBUFH:    CP    C            ; TEST LINE LENGTH=MAXIMUM LINE LENGTH
  814.     JR    NZ,RDBUF9        ; NOT THEN GET NEXT CHARACTER
  815. RDBUFI:    POP    HL            ; GET START LINE - 1
  816.     LD    (HL),B            ; SAVE LINE COUNTER
  817.     LD    A,CR            ; LOAD CARRIAGE RETURN
  818.     JP    WRCON            ; AND ECHO IT
  819. ;
  820. ;******************************************************************************
  821. ;*                                          *
  822. ;*     DISK FUNCTIONS                                  *
  823. ;*                                          *
  824. ;******************************************************************************
  825. ;
  826. ; RETURN VERSION NUMBER
  827. ;
  828. CMND12:    LD    A,22H            ; SET VERSION NUMBER
  829.     JR    CMD25A            ; AND EXIT
  830. ;
  831. ; RESET DISK SYSTEM
  832. ;
  833. CMND13:    
  834.     IF    RESDSK
  835. ;detect change between single and double sided disks if this function is
  836. ;supported.--B.H.
  837.     CALL    SETDSK        
  838.     ENDIF    
  839.     LD    HL,0            ; LOAD ZERO
  840.     LD    (LOGIN),HL        ; ALL DRIVES LOGED OUT
  841.     LD    (DSKRO),HL        ; ALL DRIVES READ/WRITE
  842.     LD    HL,RAMLOW+00080H    ; SET UP DMA ADDRESS
  843.     LD    (DMA),HL        ; AND SAVE IT
  844.     CALL    STDMA            ; DO P2BIOS CALL
  845.     XOR    A            ; SET DEFAULT DRIVE = 'A'
  846.     LD    (DEFDRV),A        ; SAVE IT
  847.     CALL    SELDK            ; SELECT DRIVE 'A'
  848.     LD    A,(SUBFLG)        ; GET SUBMIT FLAG
  849.     JR    CMD25A            ; EXIT
  850. ;
  851. ; SEARCH FOR FILE
  852. ;
  853. CMND17:    
  854.     CALL    SELDRV            ; SELECT DRIVE FROM FCB
  855.     LD    A,(IX+0)        ; GET DRIVE NUMBER FROM FCB
  856.     SUB    '?'            ; TEST IF '?'
  857.     JR    Z,CMD17B        ; IF SO ALL ENTRIES MATCH
  858.     LD    A,(IX+14)        ; GET SYSTEM BYTE
  859.     CP    '?'            ; TEST IF '?' 
  860.     JR    Z,CMD17A        ; YES, JUMP
  861.     LD    (IX+14),0        ; LOAD SYSTEM BYTE WITH ZERO
  862. CMD17A:    LD    A,15            ; TEST FIRST 15 ITEMS IN FCB
  863. CMD17B:    CALL    SEARCH            ; DO SEARCH
  864. CMD17C:    LD    HL,(DIRBUF)        ; COPY DIRECTORY BUFFER 
  865.     LD    DE,(DMA)        ; TO DMA ADDRESS
  866.     LD    BC,128            ; DIRECTORY=128 BYTES 
  867.     LDIR
  868.     RET                ; EXIT
  869. ;
  870. ; SEARCH FOR NEXT OCCURENCE FILE
  871. ;
  872. CMND18:    LD    IX,(DCOPY)        ; GET LAST FCB USED BY SEARCH
  873.     CALL    SELDRV            ; SELEXT DRIVE FROM FCB
  874.     CALL    SEARCN            ; SEARCH NEXT FILE MATCH
  875.     JR    CMD17C            ; AND COPY DIRECTORY TO DMA ADDRESS
  876. ;
  877. ; DELETE FILE
  878. ;
  879. CMND19:    
  880.     CALL    SELDRV            ; SELECT DRIVE FROM FCB
  881.     CALL    DELETE            ; DELETE FILE
  882. CMD19A:    LD    A,(SEAREX)        ; GET EXIT BYTE 00=FILE FOUND,0FFH NOT
  883.     JR    CMD25A            ; AND EXIT
  884. ;
  885. ; RENAME FILE
  886. ;
  887. CMND23:    
  888.     CALL    SELDRV            ; SELECT DRIVE FROM FCB
  889.     CALL    RENAM            ; RENAME FILE
  890.     JR    CMD19A            ; AND EXIT
  891. ;
  892. ; RETURN LOGIN VECTOR
  893. ;
  894. CMND24:    LD    HL,(LOGIN)        ; GET LOGIN VECTOR
  895. CMD24A:    LD    (PEXIT),HL        ; SAVE IT
  896.     RET                ; AND EXIT
  897. ;
  898. ; RETURN CURRENT DRIVE
  899. ;
  900. CMND25:    LD    A,(DEFDRV)        ; GET CURRENT DRIVE
  901. CMD25A:    JP    EXIT            ; AND EXIT
  902. ;
  903. ; RETURN ALV VECTOR
  904. ;
  905. CMND27:    LD    HL,(ALV)        ; GET ALLOCATION VECTOR
  906.     JR    CMD24A            ; AND EXIT
  907. ;
  908. ; RETURN DISK R/O VECTOR
  909. ;
  910. CMND29:    LD    HL,(DSKRO)        ; GET DISK R/O VECTOR
  911.     JR    CMD24A            ; AND EXIT
  912. ;
  913. ; CHANGE STATUS
  914. ;
  915. CMND30:    CALL    SELDRV            ; SELECT DRIVE FROM FCB
  916.     CALL    CSTAT            ; CHANGE STATUS
  917.     JR    CMD19A            ; AND EXIT
  918. ;
  919. ; RETURN DRIVE TABLE
  920. ;
  921. CMND31:    LD    HL,(IXP)        ; GET DRIVE TABLE
  922.     JR    CMD24A            ; AND EXIT
  923. ;
  924. ; SET/GET USER CODE
  925. ;
  926. CMND32:    LD    A,E            ; GET USER CODE
  927.     INC    A            ; TEST IF 0FFH
  928.     LD    A,(USER)        ; GET OLD USER CODE
  929.     JR    Z,CMD25A        ; IF 0FFH THEN EXIT
  930.     LD    A,E            ; GET NEW USER CODE
  931.     AND    01FH            ; MASK IT
  932.     LD    (USER),A        ; SAVE IT
  933.     RET                ; AND EXIT
  934. ;
  935. ; COMPUTE FILE SIZE COMMAND
  936. ;
  937. CMND35:    CALL    SELDRV            ; SELECT DRIVE FROM FCB
  938.     CALL    FILSZ            ; COMPUTE FILE SIZE
  939.     JR    CMD19A            ; AND EXIT
  940. ;
  941. ; SET RANDOM RECORD COUNT
  942. ;
  943. CMND36:    LD    HL,32            ; SET POINTER TO NEXT RECORD
  944.     CALL    CALRRC            ; CALCULATE RANDOM RECORD COUNT
  945. LDRRC:    LD    (IX+33),D        ; AND SAVE RANDOM RECORD COUNT
  946.     LD    (IX+34),C
  947.     LD    (IX+35),B
  948.     RET                ; AND EXIT
  949. ;
  950. ; RESET MULTIPLE LOGIN DRIVE
  951. ;
  952. CMND37:    
  953.     LD    A,E            ; GET MASK LSB
  954.     CPL                ; COMPLEMENT IT
  955.     LD    E,A 
  956.     LD    A,D            ; GET MASK MSB
  957.     CPL                ; COMPLEMENT IT
  958.     LD    D,A
  959.     LD    HL,(LOGIN)        ; GET LOGIN VECTOR
  960.     LD    A,E            ; MASK LOGIN VECTOR
  961.     AND    L            ; LSB
  962.     LD    L,A
  963.     LD    A,D            ; MASK LOGIN VECTOR
  964.     AND    H            ; MSB
  965.     LD    H,A
  966.     LD    (LOGIN),HL        ; SAVE LOGIN VECTOR
  967.     EX    DE,HL            ; USE LOGIN VECTOR AS MASK
  968.     LD    HL,(DSKRO)        ; GET DRIVE R/O VECTOR
  969.     LD    A,E            ; MASK DRIVE R/O VECTOR
  970.     AND    L            ; LSB
  971.     LD    L,A
  972.     LD    A,D            ; MASK DRIVE R/O VECTOR
  973.     AND    H            ; LSB
  974.     LD    H,A
  975.     LD    (DSKRO),HL        ; SAVE DRIVE R/O VECTOR
  976. ;
  977. DBL:    EXX
  978.     IF    RESDSK
  979.     CALL    SETDSK
  980.     ENDIF
  981.     CALL    CLRDSK
  982.     EXX
  983.     RET
  984. ;
  985. ;******************************************************************************
  986. ;*                                          *
  987. ;*     ERROR ROUTINES                                  *
  988. ;*                                          *
  989. ;******************************************************************************
  990. ;
  991. ; Bad sector error message replaced by read/write error messages--B.H.
  992. ; BAD SECTOR ERROR
  993. ;
  994. ;BADSEC:    LD    DE,MBADSC        ; LOAD BAD SECTOR MESSAGE
  995. ;    JR    DERROR            ; AND DISPLAY ERROR
  996. ;
  997. ; SELECT ERROR
  998. ;
  999. SELERR:    LD    DE,MSEL            ; LOAD SELECT ERROR MESSAGE
  1000.     JR    DERROR            ; AND DIPLAY ERROR
  1001. ;
  1002. ; FILE READ ONLY ERROR
  1003. ;
  1004. FILRO:    LD    DE,MFILRO        ; LOAD FILE R/O MESSAGE
  1005.     LD    A,0FFH            ; SET FILE R/O MESSAGE FLAG
  1006.     JR    ERROR            ; AND DISPLAY ERROR
  1007. ;
  1008. ; Read Error Message--B.H.
  1009. ;
  1010. RDERR:    LD    DE,MRDERR
  1011.     JR    DERROR
  1012. ;
  1013. ; Write Error Message--B.H.
  1014. WRTERR:    LD    DE,MWRTER
  1015.     JR    DERROR
  1016. ;
  1017. ; DRIVE READ ONLY ERROR
  1018. ;
  1019. RDONLY:    LD    DE,MRO            ; LOAD DRIVE R/O MESSAGE
  1020. DERROR:    XOR    A            ; SET NO FILE R/O MESSAGE
  1021. ;
  1022. ;
  1023. ; DISPLAY ERROR MESSAGE
  1024. ;
  1025. ; P2DOS ERROR ON D: ERROR MESSAGE
  1026. ; FUNCTION = NN  [FILE = FILENAME.TYP]
  1027. ;
  1028. ERROR:    LD    C,A            ; SAVE FILE R/O MESSAGE FLAG
  1029.     PUSH    BC
  1030.     PUSH    DE            ; SAVE ERROR MESSAGE POINTER
  1031.     CALL    CROUT            ; DIPLAY CR/LF
  1032.     LD    A,(DEFDRV)        ; GET CURRENT DRIVE
  1033.     ADD    A,'A'            ; MAKE ASCII
  1034.     LD    (MDRIVE),A        ; SAVE IT
  1035.     LD    DE,MBERR        ; LOAD MESSAGE "P2DOS ERROR ON D:"
  1036.     CALL    MESS            ; DISPLAY MESSAGE
  1037.     POP    DE            ; GET ERROR MESSAGE POINTER
  1038.     CALL    MESS            ; DISPLAY MESSAGE
  1039.     CALL    CROUT            ; DISPLAY CR/LF
  1040.     LD    DE,MBFUNC        ; LOAD MESSAGE "FUNCTION ="
  1041.     CALL    MESS            ; DISPLAY MESSAGE
  1042.     LD    A,(FUNCT)        ; GET FUNCTION NUMBER
  1043.     PUSH    AF            ; SAVE IT
  1044.     LD    BC,100            ; DISPLAY NUMBER / 100
  1045.     CALL    NUM
  1046.     LD    C,10            ; DISPLAY NUMBER / 10
  1047.     CALL    NUM
  1048.     LD    BC,101H            ; ALWAYS DISPLAY NUMBER / 1
  1049.     CALL    NUM
  1050.     POP    AF            ; GET FUNCTION NUMBER
  1051.     POP    BC            ; GET FILE R/O FLAG
  1052.     CP    15            ; TEST IF FCB USED IN COMMAND
  1053.     JR    C,ERROR3
  1054.     CP    24
  1055.     JR    C,ERROR1
  1056.     CP    30
  1057.     JR    Z,ERROR1
  1058.     CP    33
  1059.     JR    C,ERROR3
  1060.     CP    37
  1061.     JR    C,ERROR1
  1062.     CP    40
  1063.     JR    NZ,ERROR3
  1064. ERROR1:    PUSH    IX            ; YES THEN DISPLAY "FILE ="
  1065.     SUB    19            ; TEST DELETE FILE FUNCTION
  1066.     JR    NZ,ERROR2        ; NOT THEN JUMP
  1067.     OR    C            ; TEST FILE R/O FLAG
  1068.     JR    Z,ERROR2        ; NO FILE R/O THEN JUMP
  1069.     CALL    CALDIR            ; GET FCB FROM DIRECTORY BUFFER
  1070.     EX    (SP),HL            ; SAVE IT
  1071. ERROR2:    LD    DE,MFILE        ; GET MESSAGE " FILE ="
  1072.     CALL    MESS            ; DISPLAY MESSAGE
  1073.     POP    HL            ; GET POINTER FCB
  1074.     LD    B,8            ; DISPLAY FISRT 8 CHARACTERS
  1075.     CALL    FILENM
  1076.     LD    A,'.'            ; LOAD '.'
  1077.     PUSH    HL            ; SAVE FCB POINTER
  1078.     CALL    WRCON            ; ECHO IT
  1079.     POP    HL            ; RESTORE FCB POINTER
  1080.     LD    B,3            ; DISPLAY LAST 3 CHARACTERS 
  1081.     CALL    FILENM
  1082. ERROR3:    CALL    GCONST            ; TEST IF CHARACTER PRESENT
  1083.     OR    A
  1084.     JR    Z,ERROR4        ; NO THEN JUMP
  1085.     CALL    GETCH            ; GET CHARACTER
  1086.     JR    ERROR3            ; AND TEST AGAIN
  1087. ERROR4:    CALL    GETCH            ; GET CHARACTER
  1088. ;P2DOS had a bug which did not allow the user to ignore a read/write error
  1089. ;by hitting a key other than Control-C. This is the fix.--B.H.
  1090.     PUSH    AF            ; Save it
  1091.     LD    A,(RETFLG)        ; Get RETFLG
  1092.     OR    A
  1093.     JR    Z,ERROR5
  1094.     POP    AF
  1095.     CP    CONTC
  1096.     RET    NZ
  1097. ERROR5:    JP    RAMLOW+00000H        ; AND DO WARM BOOT
  1098. ;
  1099. ; DISPLAY NUMBER
  1100. ;
  1101. NUM:    LD    D,0FFH            ; LOAD NUMBER -1
  1102. NUM1:    INC    D            ; INCREMENT NUMBER
  1103.     SUB    C            ; DIVIDE BY C
  1104.     JR    NC,NUM1            ; NOT FINISHED THEN LOOP
  1105.     ADD    A,C            ; RESTORE LAST VALUE
  1106.     PUSH    AF            ; SAVE IT
  1107.     LD    A,D            ; TEST IF "0"
  1108.     OR    B            ; AND IF LEADING ZERO
  1109.     JR    Z,NUM2            ; YES, THEN EXIT 
  1110.     LD    B,D            ; SET NO LEADING ZERO 
  1111.     LD    A,D            ; GET NUMBER
  1112.     ADD    A,'0'            ; MAKE ASCII
  1113.     PUSH    BC            ; SAVE REGISTERS
  1114.     CALL    WRCON            ; ECHO NUMBER
  1115.     POP    BC            ; RESTORE REGISTERS
  1116. NUM2:    POP    AF            ; RESTORE NUMBER
  1117.     RET                ; AND EXIT
  1118. ;
  1119. ; DISPLAY FILNAME.TYP
  1120. ;
  1121. FILENM:    INC    HL            ; INCREMENT POINTER FCB
  1122.     LD    A,(HL)            ; GET CHARACTER FROM FCB
  1123.     AND    07FH            ; MASK IT
  1124.     PUSH    HL            ; SAVE REGISTERS
  1125.     PUSH    BC
  1126.     CALL    WRCON            ; ECHO CHARACTER
  1127.     POP    BC            ; RESTORE REGISTERS
  1128.     POP    HL
  1129.     DJNZ    FILENM            ; REPEAT B TIMES
  1130.     RET                ; AND EXIT
  1131. ;
  1132. ; ERROR MESSAGES
  1133. ; Made more meaningful-B.H.
  1134. ;
  1135. ;Bad sector message replaced by read/write error messages
  1136. ;MBADSC:    DB    'Bad sector$'
  1137. ;
  1138. MSEL:    DB    'Non-existent drive$'
  1139. ;
  1140. MFILRO:    DB    'File is '
  1141. ;
  1142. MRO:    DB    'Read-Only$'
  1143. ;
  1144. MBERR:    DB    'Disk error on '
  1145. MDRIVE:    DB    0
  1146.     DB    DRVSEP
  1147.     DB    ' $'
  1148. ;
  1149. MBFUNC:    DB    'Function = $'
  1150. ;
  1151. MFILE:    DB    '; File = $'
  1152. ;
  1153. MRDERR:    DB    'Read error$'
  1154. ;
  1155. MWRTER:    DB    'Write error$'
  1156. ;
  1157. ; SELECT DISK FROM FCB
  1158. ;
  1159. SELDRV:    LD    A,0FFH            ; SET DISK SELECT DONE FLAG
  1160.     LD    (FLDRV),A
  1161.     LD    A,(DEFDRV)        ; GET CURRENT DRIVE
  1162.     LD    (DRIVE),A        ; SAVE IT IN MEMORY
  1163.     LD    E,A            ; SAVE IT IN REGISTER E
  1164.     LD    A,(IX+0)        ; GET DRIVE FROM FCB
  1165.     LD    (FCB0),A        ; SAVE IT
  1166.     CP    '?'            ; TEST IF '?'
  1167.     JR    Z,CMND14        ; YES, THEN SELECT DRIVE FROM REGISTER E
  1168.     AND    01FH            ; MASK DRIVE
  1169.     LD    A,E            ; TEST IF ZERO
  1170.     JR    Z,SELDR0        ; SELECT DRIVE FROM REGISTER E
  1171.     LD    A,(IX+0)        ; GET DRIVE FROM FCB
  1172.     DEC    A            ; DECREMENT DRIVE
  1173. SELDR0:    CALL    SELDK            ; SELECT DRIVE
  1174.     LD    A,(IX+0)        ; GET DRIVE FROM FCB
  1175.     AND    0E0H            ; REMOVE DRIVE BITS
  1176.     LD    B,A            ; SAVE REGISTER
  1177.     LD    A,(USER)        ; GET USER NUMBER
  1178.     OR    B            ; INSERT USER NUMBER IN FCB
  1179.     LD    (IX+0),A
  1180.     RET                ; AND EXIT
  1181.  
  1182.