Table of Contents

PDISK

Table Of Contents

  • [00005] DISK FLOPPY DISK ROUTINES
  • [00006] COMMENTS
  • [00139] DEFINITIONS
  • [00162] DEFINE DISK ROUTINES
  • [00210] DEFINE SUBROUTINES FOR DISK ROUTINES
  • [00241] D.RDEF READ DISKETTE DEFINITION SECTOR
  • [00309] EXIT ROUTINES
  • [00352] F.INIX BEGIN EXECUTION
  • [00406] F.JUMPO JUMP-OUT TO SPECIFIED LESSON
  • [00468] F.OPEN OPEN DISK FILE
  • [00612] F.READ / F.WRITE
  • [00697] Y.DSKAD COMPUTE ABSOLUTE DISK ADDRESS
  • [00794] ROUTINES

Source Code

PDISK.txt
  1. PDISK
  2. * /--- FILE TYPE = E
  3. * /--- BLOCK DISK 00 000 81/04/22 15.45
  4. IDENT DISK
  5. TITLE DISK FLOPPY DISK ROUTINES
  6. TITLE COMMENTS
  7. *
  8. * ****************************************************
  9. *
  10. *
  11. *
  12. * ASSUMED CONSTANTS - 16 SECTORS/SPACE
  13. * - 128 BYTES/PHYSICAL SECTOR
  14. *
  15. *
  16. * DEFINITION SECTOR (ABSOLUTE SECTOR 0)
  17. * BYTES 00-09 DF.LABL *DEFINITION*
  18. * 10 DF.TYPE DISKETTE TYPE
  19. * 11-12 DF.DSP DIRECTORY SPACE NUMBER
  20. * 13 DF.DNSP NUMBER DIRECTORY SPACES
  21. * 14 DF.DTRK DIRECTORY 1ST TRACK NUMBER
  22. * 15 DF.DSEC DIRECTORY 1ST SECTOR NUMBER
  23. * 16 DF.ST SECTORS / TRACK
  24. * 17 DF.TD TRACKS / DISKETTE
  25. * 18-19 DF.SPD SPACES / DISKETTE
  26. * 20-21 DF.SSP SYSTEM FILE SPACE NUMBER
  27. * 22 DF.SNSP NUMBER SYSTEM FILE SPACES
  28. * 23 DF.STRK SYS FILE 1ST TRACK NUMBER
  29. * 24 DF.SSEC SYS FILE 1ST SECTOR NUMBER
  30. * 25-34 DF.BLSN BOOTSTRAP LESSON NAME
  31. * 35 DF.INSP NUMBER INTERP FILE SPACES
  32. * 36 DF.REL DISKETTE RELEASE LEVEL
  33. * 37 DF.YEAR DISKETTE START YEAR
  34. * 38 DF.MON DISKETTE START MONTH
  35. * 39 DF.DAY DISKETTE START DAY
  36. * 40 DF.PUB PUBLISHED DISKETTE FLAG(S)
  37. * 41 DF.SS SECTORS PER SPACE
  38. * 42-51 DF.PART PART NUMBER
  39. * 52-61 DF.SNUM SERIAL NUMBER
  40. * 62-63 DF.RPAS READ PASSWORD
  41. * 64-65 DF.WPAS WRITE PASSWORD
  42. * 66 DF.CSUM INTERPRETER CHECKSUM
  43. * 67-125 (UNUSED)
  44. * 126-127 DF.DCHK CHECK CHANGED DISK
  45. *
  46. *
  47. * DISKETTE DIRECTORY
  48. * BYTES 00-09 DD.LABL *DIRECTORY*
  49. * 10-19 DD.NAM DISKETTE NAME
  50. * 20-31 UNUSED
  51. * 32 DD.NFNS NUM FILE NAME TABLE SECTORS
  52. * 33 DD.HFNS HIGHEST FILE NAME SECT USED
  53. * 34-47 UNUSED
  54. * 48-127 DD.SRT SPACE RESERVATION TABLE
  55. *
  56. *
  57. * FILE NAME TABLE ENTRY
  58. * BYTES 00-19 FN.NAM FILE NAME
  59. * 20 FN.TYPE FILE TYPE
  60. * 21-22 FN.SPAC STARTING SPACE NUMBER
  61. * 23 FN.NSPC NUMBER SPACES
  62. * 24-31 FN.INF UNIQUE BY FILE TYPE
  63. * (32) FN.LTH LENGTH OF NAME TABLE ENTRY
  64. *
  65. * /--- BLOCK DISK 00 000 81/04/22 15.52
  66. *
  67. * SYSTEM FILE (SYSTEMB)
  68. * SECTOR 00 SF.SCOS SCORE/COMPLETION INFO SECTOR
  69. * BYTES 00-01 SF.SCOR CURRENT SCORE
  70. * 02-03 SF.LDON LESSON COMPLETION INFO
  71. * 04-127 UNUSED
  72. *
  73. * SECTOR 01 SF.ERPS ERROR LOG POINTER SECTOR
  74. * BYTES 00 SF.ERRP CURRENT ERROR LOG POINTER
  75. *
  76. * SECTOR 02-09 SF.ERRS EXECUTION ERROR LOG
  77. *
  78. *
  79. * FILE INFORMATION PACKAGE
  80. * BYTES 00-01 FI.SECT LOGICAL SECTOR
  81. * 02 FI.NSEC NUMBER SECTORS
  82. * 03-04 FI.ADDR BUFFER ADDRESS
  83. * 05 FI.UNIT UNIT NUMBER
  84. * 06-25 FI.NAM FILE NAME
  85. * 26 FI.TYPE FILE TYPE
  86. * 27-28 FI.SPAC STARTING SPACE NUMBER
  87. * 29 FI.NSPC NUMBER SPACES
  88. * 30-36 FI.INF UNIQUE BY FILE TYPE
  89. * 37 FI.PUB PUBLISHED FILE FLAG(S)
  90. * (38) FI.LTH LENGTH OF FILE INFO PACKAGE
  91. *
  92. * *FI.INF* FOR LESSON BINARY
  93. * BYTES 00 LI.DSEC NUMBER DIRECTORY SECTORS
  94. * 01 LI.CSEC MAXIMUM CHARSET SECTORS
  95. * 02-03 LI.VARS NUMBER USER VARIABLE BYTES
  96. *
  97. *
  98. * LESSON BINARY DIRECTORY
  99. * BYTES 00 LD.NUN NUMBER UNITS
  100. * 01 LD.ISTU NUMBER OF UNIT TO JUMPOUT TO
  101. * 02 LD.NNAS NUM UNIT NAME TABLE SECTORS
  102. * 03 LD.YEAR LESSON LAST-COPY YEAR
  103. * 04 LD.MON LESSON LAST-COPY MONTH
  104. * 05 LD.DAY LESSON LAST-COPY DAY
  105. * 06-07 LD.OBTS OBTAIN TABLE FIRST SECTOR
  106. * 08 LD.OBTL OBTAIN TABLE SECTOR COUNT
  107. * 09-10 LD.OFRS OFFER TABLE FIRST SECTOR
  108. * 11 LD.OFRL OFFER TABLE SECTOR COUNT
  109. * 12 LD.INTU FIRST NON-OBTAINED UNIT
  110. * 13-15 UNUSED
  111. * 16-XX LD.UTAB UNIT LOCATION/LENGTH TABLE
  112. *
  113. *
  114. * /--- BLOCK DISK 00 000 80/09/14 19.47
  115. *
  116. *
  117. * F.OPEN H,L = ADDRESS OF FIP
  118. * F.CLOSE H,L = ADDRESS OF FIP
  119. * F.READ H,L = ADDRESS OF FIP
  120. * F.WRITE H,L = ADDRESS OF FIP
  121. *
  122. * ERROR RETURN CODES
  123. *
  124. * DP.ERR = 1 = READ ERROR
  125. * 2 = WRITE ERROR
  126. * 3 = MASTER-CLEAR ERROR
  127. * 4 = TIME-OUT
  128. * 5 = FILE NOT FOUND
  129. * 6 = DUPLICATE FILE NAME
  130. * 7 = ILLEGAL PARAMETER
  131. * 8 = INSUFFICIENT DISK SPACE
  132. * 9 = DISKETTE FORMAT BAD
  133. * 10 = DATA SUM-CHECK ERROR
  134. * 11 = SEEK ERROR
  135. *
  136. *
  137. * ****************************************************
  138. * /--- BLOCK DEFINITION 00 000 81/09/02 09.07
  139. TITLE DEFINITIONS
  140. *
  141.  
  142. CODE D SET ASSEMBLER TO DISPLAY CODE
  143.  
  144. *
  145. EXT COMPHL,MOVEB,ZEROB,DIVBCDE,MULDEHL
  146. EXT PPTTUT,PURGALL,LESERR,DSKERR,TVARS,UBUFFA
  147. EXT ISTRAM,LIBLOAD,V
  148. EXT ZEROB,ALLOC
  149. *
  150. ENTRY IINTERP,D.VDEF,D.RDEF,D.CLEAR,D.READ
  151. ENTRY D.WRITE,F.JUMPO,D.RCID,D.CLOCK
  152. ENTRY F.LESSN,F.OPEN,F.READ,F.WRITE
  153. ENTRY F.FNTS,Y.INIX1,F.FILEL,SETRAM
  154. *
  155. *
  156. CST
  157. *
  158. *CALL DXTEXT
  159. *
  160. *
  161. * /--- BLOCK D.ENTRIES 00 000 81/07/06 19.52
  162. TITLE DEFINE DISK ROUTINES
  163. LIST G
  164. *
  165. *
  166. *
  167. * * * D.CLEAR MASTER-CLEAR DISK
  168. * ON ENTRY - DP.UNIT = DISK UNIT NUMBER
  169. *
  170. D.CLEAR D.CLEAR DEFINE D.CLEAR ROUTINE
  171. *
  172. *
  173. *
  174. * * * D.RCID READ CONTROLLER ID
  175. * ON EXIT - A = DP.CID = CONTROLLER ID BYTE
  176. * = 0 = NO RESPONSE FROM CONTROLLER
  177. *
  178. D.RCID D.RCID DEFINE D.RCID ROUTINE
  179.  
  180. * D.CLOCK READ THE CLOCK VALUE
  181. * EXIT HL = CURRENT CLOCK VALUE.
  182. * = 0 IF AN ERROR OCCURRED.
  183.  
  184. D.CLOCK D.CLOCK
  185.  
  186. *
  187. *
  188. *
  189. * * * D.READ READ DISK
  190. * ON ENTRY - DP.UNIT = DISK UNIT NUMBER
  191. * DP.TRAK = TRACK
  192. * DP.SECT = LOGICAL SECTOR
  193. * DP.NUM = NUMBER SECTORS TO READ
  194. * DP.ADDR = BUFFER ADDRESS
  195. *
  196. D.READ D.READ DEFINE D.READ ROUTINE
  197. *
  198. *
  199. *
  200. * * * D.WRITE WRITE DISK
  201. * ON ENTRY - DP.UNIT = DISK UNIT NUMBER
  202. * DP.TRAK = TRACK
  203. * DP.SECT = LOGICAL SECTOR
  204. * DP.NUM = NUMBER SECTORS TO WRITE
  205. * DP.ADDR = BUFFER ADDRESS
  206. *
  207. D.WRITE D.WRITE DEFINE D.WRITE ROUTINE
  208. *
  209. * /--- BLOCK DS.SUBR 00 000 81/01/22 18.47
  210. TITLE DEFINE SUBROUTINES FOR DISK ROUTINES
  211. *
  212. *
  213. *
  214. * + + SINC INCREMENT TRACK+SECTOR ADDRESS
  215. * ON ENTRY - DP.TRAK = TRACK
  216. * DP.SECT = SECTOR
  217. *
  218. * + + RLIGHT BLINK RED ERROR INDICATOR
  219. *
  220. DS.SUBR DEFINE DISK SUBROUTINES
  221. *
  222. *
  223. *
  224. * + + SETTS SET TRACK/SECTOR
  225. * ON ENTRY - D.TRACK = TRACK
  226. * D.SECT = SECTOR
  227. *
  228. DS.SUBS DEFINE DISK SUBROUTINES
  229. *
  230. *
  231. *
  232. * + + WAITI WAIT OPERATION INITIATED
  233. *
  234. * + + WAITC WAIT OPERATION COMPLETE
  235. *
  236. DS.WAIT DEFINE WAIT SUBROUTINES
  237. *
  238. LIST *
  239. *
  240. * /--- BLOCK D.RDEF 00 000 81/07/06 19.51
  241. TITLE D.RDEF READ DISKETTE DEFINITION SECTOR
  242. *
  243. *
  244. *
  245. * D.RDEF READ DISKETTE DEFINITION SECTOR
  246. * ON EXIT - A = NON-ZERO IF ERROR OCCURRED
  247. * DF.BUFF = DEFINITION PARAMETERS
  248. * F.BUFF = DEFINITION SECTOR
  249. *
  250. D.RDEF XOR A A = 0
  251. LD (DF.BUFF+DF.LABL),A PRE-CLEAR LABEL
  252. LD (DP.UNIT),A SET UNIT NUMBER
  253. LD (DP.TRAK),A SET TRACK NUMBER
  254. LD A,1
  255. LD (DP.SECT),A SET SECTOR NUMBER
  256. LD (DP.NUM),A SET NUMBER SECTORS
  257. *
  258. * INITIALIZE DISK CONTROLLER
  259. *
  260. CALL D.RCID READ CONTROLLER ID
  261. JR Z,XRD190 JUMP IF NO CONTROLLER REPLY
  262. *
  263. * /--- BLOCK D.RDEF 00 000 81/07/06 20.18
  264. *
  265. * READ AND VERIFY DEFINITION SECTOR
  266. *
  267. LD HL,F.BUFF
  268. LD (DP.ADDR),HL SET BUFFER ADDRESS
  269. LD A,26 PRE-SET SECTORS/TRACK = 26
  270. LD (DF.BUFF+DF.ST),A
  271. CALL D.READ READ DEFINITION SECTOR
  272. JR NZ,XRD190
  273. LD DE,F.BUFF D,E = *FROM* ADDRESS FOR MOVE
  274. LD HL,DF.BUFF H,L = *TO* ADDRESS FOR MOVE
  275. LD BC,DF.LTH B,C = LENGTH
  276. CALL MOVEB MOVE DISKETTE DEFINITION
  277. CALL D.VDEF VERIFY DEFINITION
  278. RET Z
  279. *
  280. XRD190 LD A,26 RE-SET SECTORS/TRACK = 26
  281. LD (DF.BUFF+DF.ST),A
  282. JR ERR9
  283. *
  284. *
  285. *
  286. * D.VDEF VERIFY DEFINITION SECTOR
  287. * CHECKS DEFINITION SECTOR LABEL CORRECT
  288. * ON EXIT - A = NON-ZERO IF ERROR OCCURRED
  289. *
  290. D.VDEF LD HL,DF.BUFF+DF.LABL H,L = ADDR OF LABEL
  291. LD BC,XVLABL D,E = ADDR OF CORRECT LABEL
  292. *
  293. XVD120 LD A,(BC) LOAD NEXT BYTE OF LABEL
  294. AND A
  295. RET Z EXIT IF END OF LABEL (A=0)
  296. LD D,(HL) LOAD NEXT BYTE OF LABEL
  297. SUB D
  298. JR NZ,ERR9 JUMP IF DID NOT VERIFY
  299. INC HL
  300. INC BC ADVANCE INDEXES
  301. JR XVD120
  302. *
  303. *
  304. XVLABL DEFB '7D'7,'7E'7,'7F'7
  305. VFD 8/0
  306. *
  307. *
  308. * /--- BLOCK EXITS 00 000 80/03/24 17.56
  309. TITLE EXIT ROUTINES
  310. *
  311. *
  312. *
  313. ERR1 LD A,1 1 = READ ERROR
  314. JR ERRSET
  315. *
  316. ERR2 LD A,2 2 = WRITE ERROR
  317. JR ERRSET
  318. *
  319. ERR3 LD A,3 3 = MASTER-CLEAR ERROR
  320. JR ERRSET
  321. *
  322. ERR4 LD A,4 4 = TIME-OUT
  323. JR ERRSET
  324. *
  325. ERR5 LD A,5 5 = FILE NOT FOUND
  326. JR ERRSET
  327. *
  328. * 6 = DUPLICATE FILE NAME
  329. *
  330. ERR7 LD A,7 7 = ILLEGAL PARAMETER
  331. JR ERRSET
  332. *
  333. * 8 = INSUFFICIENT DISK SPACE
  334. *
  335. ERR9 LD A,9 9 = DISKETTE FORMAT BAD
  336. JR ERRSET
  337. *
  338. ERR10 LD A,10 10 = DATA SUM-CHECK ERROR
  339. JR ERRSET
  340. *
  341. * 11 = SEEK ERROR
  342. *
  343. *
  344. ERRSET LD (DP.ERR),A SET ERROR CODE
  345. *
  346. DISKRET LD A,(DP.ERR) GET DISK ERROR FLAG
  347. AND A
  348. RET EXIT
  349. *
  350. *
  351. * /--- BLOCK F.INIX 00 000 81/07/07 17.37
  352. TITLE F.INIX BEGIN EXECUTION
  353. *
  354. *
  355. *
  356. * F.INIX
  357. * INITIALIZES INTERPRETER AND INITIATES EXECUTION OF
  358. * BOOTSTRAP (ROUTER) LESSON IN OFF-LINE MODE
  359. *
  360. IINTERP DEFS 0
  361. *
  362. * PRE-ZERO /PPTCOM/
  363. *
  364. LD HL,PPTCOM H,L = ADDRESS OF /PPTCOM/
  365. LD DE,PPTCOML D,E = LENGTH OF /PPTCOM/
  366. LD B,0 B = 0
  367. *
  368. IX220 LD (HL),B ZERO NEXT BYTE OF COMMON
  369. INC HL ADVANCE MEMORY ADDRESS
  370. DEC DE DECREMENT BYTE COUNT
  371. LD A,D
  372. OR E END TEST
  373. JR NZ,IX220
  374. *
  375. * INITIALIZE INTERPRETER VARIABLES
  376. *
  377. LD A,77O
  378. LD (UNCCHR),A PLANT UNCOVER CODES FOR FORMAT
  379. LD (LSTCHAR+1),A
  380. LD HL,-1
  381. LD (ZSCORE),HL INITIALIZE *ZSCORE* = -1
  382. LD HL,0
  383. LD (TVARS),HL FLAG VARIABLE ADDR NOT SET
  384. LD (M.HALT),HL CLEAR HALT REQUEST FLAG
  385. ADD HL,SP SAVE ENTRY VALUE OF STACK PTR
  386. LD (XSP),HL
  387. *
  388. * READ DISKETTE DEFINITION SECTOR
  389. *
  390. CALL D.RDEF INITIALIZE DEFINITION SECTOR
  391. JP NZ,LESERR CHECK IF ERROR OCCURRED
  392. * CHECK MICRO-PLATO RELEASE LEVEL CORRECT
  393. *
  394. LD A,(V+2) LOAD INTERPRETER RELEASE LEVEL
  395. LD B,A
  396. LD A,(F.BUFF+DF.REL) DISKETTE RELEASE LEVEL
  397. SUB B
  398. JP NZ,DSKERR CHECK IF INCORRECT LEVEL
  399. *
  400. Y.INIX1 LD A,1 MARK IN OFF-LINE STATE
  401. LD (RMODE),A
  402. LD HL,DF.BUFF+DF.BLSN H,L = ADDR LESSON NAME
  403. *
  404. *
  405. * /--- BLOCK F.JUMPO 00 000 81/07/06 19.52
  406. TITLE F.JUMPO JUMP-OUT TO SPECIFIED LESSON
  407. *
  408. *
  409. *
  410. * F.JUMPO JUMP-OUT TO SPECIFIED LESSON
  411. * ON ENTRY - H,L = ADDRESS OF LESSON NAME
  412. *
  413. F.JUMPO PUSH HL PUSH ADDRESS OF LESSON NAME
  414. CALL PURGALL DELETE ALL UNITS
  415.  
  416. * SET *TVARS* TO 0 SO *LIBLOAD* WILL DO INITIALIZATIONS.
  417.  
  418. LD HL,0
  419. LD (TVARS),HL
  420. *
  421. * INITIALIZE CHARSET POINTERS
  422. *
  423. LD HL,M2ADD SET ADDRESS OF M2 CHARACTERS
  424. LD (TMCHR2),HL
  425. LD HL,M3ADD SET ADDRESS OF M3 CHARACTERS
  426. LD (TMCHR3),HL
  427.  
  428. * INITIALIZE THE STACK AND UNIT BUFFER POINTERS SO
  429. * SPACE CAN BE ALLOCATED FOR LIBRARY BUFFERS.
  430.  
  431. LD HL,M2ADD
  432. LD (TOS),HL
  433. CALL SETRAM RETURN WITH HL = 5300
  434. LD (BUFBEG),HL
  435.  
  436. * ALLOCATE SPACE FOR LIBRARY RESOLUTION BUFFERS.
  437. * THIS IS DONE SO THE *XLESS* OVERLAY IS LOADED
  438. * LOWER IN MEMORY THAN THE BUFFERS AND DOESNT HAVE
  439. * TO MOVE WHEN IT ALLOCATES THE BUFFERS.
  440. * THE NUMBER OF SECTORS *B.SECTS* COMES FROM THE
  441. * EQUATE OF THE SAME NAME IN THE *XLESSN* OVERLAY.
  442.  
  443. B.SECTS EQU 64
  444.  
  445. LD A,B.SECTS NUM. SECTORS USED BY XLESSN
  446. CALL ALLOC
  447. LD (BUFBEG),HL
  448. *
  449. * WE ZERO THE MEMORY LOCATION POINTED TO BY *BUFBEG*
  450. * SO THAT WHEN *LIBLOAD* CALLS *FINDU*, IT WILL NOT
  451. * FIND ANY UNITS IN MEMORY.
  452.  
  453. XOR A
  454. LD (HL),A
  455.  
  456. LD A,SYSLN SYSTEM LESSON NUMBER
  457. LD (L.NUM),A
  458. LD A,ZXLESSN OVERLAY NUMBER
  459. LD (UNUM),A
  460. LD (OVRLAYU),A
  461. LD HL,0
  462. CALL LIBLOAD LOAD LIBRARY OVERLAY
  463. JP NZ,DSKERR
  464. JP (HL) EXECUTE LIBRARY OVERLAY
  465. *
  466. *
  467. * /--- BLOCK F.OPEN 00 000 81/07/06 19.52
  468. TITLE F.OPEN OPEN DISK FILE
  469. *
  470. *
  471. *
  472. * F.OPEN OPEN SPECIFIED FILE
  473. * ON ENTRY - H,L = ADDR OF FIP
  474. * ON EXIT - FIP = FILE INFORMATION
  475. *
  476. F.OPEN LD DE,FI.NAM GET BIAS TO FILE NAME
  477. ADD HL,DE ADD TO FIP ADDRESS
  478. LD (FIPADR),HL
  479. CALL IDEF INSURE DEFINITION SECTOR VALID
  480. RET NZ
  481. *
  482. * DETERMINE DISK UNIT NUMBER
  483. *
  484. LD HL,(FIPADR) LOAD ADDRESS OF FILE NAME
  485. DEC HL BACK UP TO DISK UNIT NUMBER
  486. LD A,(HL)
  487. AND A
  488. JP M,FOP110 IF NEGATIVE DISK UNIT NUMBER
  489. LD (DP.UNIT),A SET DISK UNIT NUMBER
  490. AND 376O
  491. JP NZ,ERR7 CHECK IF LEGAL DISK UNIT NUMBER
  492. JR FOP200
  493. *
  494. FOP110 CP -2
  495. JR NZ,FOP120 IF DISK UNIT .NE. -2
  496. *
  497. * SEARCH DEFAULT DRIVE (NUMBER 0) ONLY.
  498. *
  499. XOR A
  500. LD (DP.UNIT),A
  501. CALL FOP200
  502. RET NZ EXIT IF ERROR OCCURRED
  503. JR FOP130
  504. *
  505. * SEARCH FOR FILE ON BOTH DISK UNITS (UNIT 0 FIRST)
  506. *
  507. FOP120 XOR A SEARCH DISK UNIT 0
  508. LD (DP.UNIT),A
  509. CALL FOP200 ATTEMPT TO OPEN FILE ON UNIT 0
  510. JR Z,FOP130
  511. LD A,1 SEARCH DISK UNIT 1
  512. LD (DP.UNIT),A
  513. CALL FOP200 ATTEMPT TO OPEN FILE ON UNIT 1
  514. RET NZ EXIT IF ERROR OCCURRED
  515. *
  516. FOP130 LD HL,(FIPADR) GET ADDRESS OF FILE NAME IN FIP
  517. DEC HL BACK-UP TO DISK UNIT NUMBER
  518. LD A,(DP.UNIT)
  519. LD (HL),A SET DISK UNIT NUMBER IN FIP
  520. XOR A A = 0
  521. RET
  522. *
  523. * /--- BLOCK F.OPEN 00 000 81/07/06 19.52
  524. *
  525. * READ 1ST SECTOR OF DISKETTE DIRECTORY
  526. *
  527. FOP200 CALL READDIR READ 1ST SECTOR OF DIRECTORY
  528. RET NZ
  529. *
  530. *
  531. *
  532. * F.FNTS SEARCH FILE NAME TABLE
  533. * ON ENTRY - F.BUFF = 1ST SECTOR OF DIRECTORY
  534. * DP.UNIT = UNIT NUMBER
  535. * DP.TRAK = DIRECTORY TRACK NUMBER
  536. * FIPADR = ADDRESS OF FIP
  537. * ON EXIT - FIP = FILE INFORMATION
  538. * FADDR = ADDR OF FILE NAME TABLE ENTRY
  539. * FSECT = NAME TABLE SECTOR NUMBER
  540. *
  541. F.FNTS DEFS 0
  542. *
  543. * SEARCH FILE NAME SECTORS FOR SPECIFIED FILE
  544. *
  545. LD A,(F.BUFF+DD.HFNS)
  546. LD (FNSECT),A SET NUM FILE NAME SECTORS+1
  547. LD A,(F.BUFF+DD.NFNS)
  548. LD (FMSECT),A SET MAXIMUM SECTOR NUMBER
  549. LD A,(DF.BUFF+DF.DSEC)
  550. INC A SET STARTING SECTOR NUMBER
  551. LD (FSECT),A
  552. *
  553. * READ NEXT SECTOR
  554. *
  555. FOP220 LD A,(FSECT) SET SECTOR NUMBER
  556. LD (DP.SECT),A
  557. LD A,1 SET NUMBER SECTORS TO READ
  558. LD (DP.NUM),A
  559. LD HL,F.BUFF SET BUFFER ADDRESS
  560. LD (DP.ADDR),HL
  561. CALL D.READ READ NEXT SECTOR
  562. RET NZ EXIT IF ERROR OCCURRED
  563. *
  564. * /--- BLOCK F.OPEN 00 000 78/07/09 16.35
  565. *
  566. * SEARCH CURRENT SECTOR
  567. *
  568. LD HL,F.BUFF INITIALIZE ADDRESS
  569. LD (FADDR),HL
  570. EX DE,HL D,E = ADDRESS IN SECTOR BUFFER
  571. LD B,FN.FNS B = NUMBER NAMES/SECTOR
  572. *
  573. FOP240 LD HL,(FIPADR) GET ADDRESS OF FILE INFO
  574. LD C,21 C = NUM CHARS TO COMPARE
  575. *
  576. FOP242 LD A,(DE) COMPARE NEXT CHARACTER
  577. SUB (HL)
  578. JR NZ,FOP244
  579. INC HL ADVANCE CHARACTER POINTERS
  580. INC DE
  581. DEC C NAME END TEST
  582. JR NZ,FOP242
  583. LD HL,(FADDR) GET ADDRESS OF FILE NAME/INFO
  584. EX DE,HL D,E = *FROM* ADDRESS FOR MOVE
  585. LD HL,(FIPADR) H,L = *TO* ADDRESS FOR MOVE
  586. LD BC,FN.LTH B,C = LENGTH TO MOVE
  587. CALL MOVEB EXTRACT FILE INFORMATION
  588. JP DISKRET
  589. *
  590. FOP244 LD HL,(FADDR) INCREMENT ADDRESS
  591. LD DE,FN.LTH
  592. ADD HL,DE ADVANCE TO NEXT FILE NAME
  593. LD (FADDR),HL
  594. EX DE,HL D,E = ADDRESS IN SECTOR BUFFER
  595. DEC B SECTOR END TEST
  596. JR NZ,FOP240
  597. LD A,(FNSECT)
  598. DEC A CHECK IF LAST SECTOR
  599. JP Z,ERR5 EXIT IF FILE NOT FOUND
  600. JP M,ERR5
  601. LD (FNSECT),A DECREMENT SECTOR COUNT
  602. LD A,(FSECT) LOAD CURRENT SECTOR ADDRESS
  603. INC A ADVANCE SECTOR ADDRESS
  604. LD (FSECT),A
  605. LD B,A
  606. LD A,(FMSECT) LOAD MAXIMUM SECTOR NUMBER
  607. CP B
  608. JP M,ERR5 EXIT IF FILE NOT FOUND
  609. JP FOP220 READ NEXT SECTOR
  610. *
  611. * /--- BLOCK F.READ 00 000 81/07/06 19.53
  612. TITLE F.READ / F.WRITE
  613. *
  614. *
  615. *
  616. * F.READ READ SPECIFIED FILE
  617. * F.WRITE WRITE SPECIFIED FILE
  618. * ON ENTRY - H,L = ADDRESS OF FIP
  619. * ON EXIT - A = NON-ZERO IF ERROR OCCURRED
  620. *
  621. F.READ CALL RWSET INITIALIZE FOR READ
  622. RET NZ
  623. CALL D.READ READ DISK
  624. RET
  625. *
  626. F.WRITE CALL RWSET INITIALIZE FOR WRITE
  627. RET NZ
  628. CALL D.WRITE WRITE DISK
  629. RET
  630. *
  631. *
  632. *
  633. * RWSET INITIALIZE FOR FILE READ/WRITE
  634. * ON ENTRY - H,L = ADDRESS OF FIP
  635. * ON EXIT - A = NON-ZERO IF BOUNDS ERROR
  636. * DP.UNIT = DISK UNIT NUMBER
  637. * DP.TRAK = ABSOLUTE TRACK NUMBER
  638. * DP.SECT = ABSOLUTE SECTOR NUMBER
  639. * DP.NUM = NUMBER SECTORS TO READ/WRITE
  640. * DP.ADDR = BUFFER ADDRESS
  641. *
  642. RWSET LD (FIPADR),HL SET ADDRESS OF FIP
  643. XOR A A = 0
  644. LD (DP.ERR),A CLEAR DISK ERROR CODE
  645. LD DE,FI.ADDR
  646. ADD HL,DE H,L = ADDRESS OF BUFFER ADDRESS
  647. LD E,(HL)
  648. INC HL
  649. LD D,(HL) D,E = BUFFER ADDRESS
  650. EX DE,HL
  651. LD (DP.ADDR),HL SET BUFFER ADDRESS
  652. LD HL,(FIPADR) H,L = ADDRESS OF FIP
  653. CALL F.FILEL COMPUTE FILE LENGTH IN SECTORS
  654. CALL COMPHL H,L = -FILE LENGTH
  655. LD (FNSECT),HL SAVE COMP OF LENGTH
  656. *
  657. * /--- BLOCK F.READ 00 000 80/03/15 19.33
  658. *
  659. LD HL,(FIPADR)
  660. LD D,H D,E = ADDRESS OF FIP
  661. LD E,L
  662. LD BC,FI.UNIT BIAS TO DISK UNIT NUMBER
  663. ADD HL,BC H,L = ADDRESS OF DISK UNIT NUM
  664. LD A,(HL)
  665. LD (DP.UNIT),A SET DISK UNIT NUMBER
  666. LD HL,FI.SECT BIAS TO LOGICAL SECTOR
  667. ADD HL,DE H,L = ADDR OF LOGICAL SECTOR
  668. LD C,(HL)
  669. INC HL
  670. LD B,(HL) B,C = LOGICAL SECTOR
  671. LD A,370O
  672. AND B CHECK SECTOR NUMBER REASONABLE
  673. JP NZ,ERR7
  674. LD HL,FI.NSEC BIAS TO NUMBER SECTORS
  675. ADD HL,DE
  676. LD D,0
  677. LD E,(HL) D,E = NUMBER SECTORS
  678. LD A,E
  679. AND A CHECK SECTOR COUNT PRESENT
  680. JP Z,ERR7
  681. LD (DP.NUM),A SET NUMBER SECTORS
  682. EX DE,HL
  683. ADD HL,BC COMPUTE ENDING SECTOR NUMBER
  684. DEC HL
  685. EX DE,HL
  686. LD HL,(FNSECT) RETRIEVE COMPLEMENT OF LENGTH
  687. ADD HL,DE
  688. LD A,H CHECK TRANSFER LEGAL
  689. AND A
  690. JP P,ERR7 ERROR EXIT IF ILLEGAL TRANSFER
  691. CALL Y.DSKAD COMPUTE DISK ADDRESS
  692. XOR A A = 0
  693. RET
  694. *
  695. *
  696. * /--- BLOCK Y.DSKAD 00 000 81/07/06 20.20
  697. TITLE Y.DSKAD COMPUTE ABSOLUTE DISK ADDRESS
  698. *
  699. *
  700. *
  701. * Y.DSKAD
  702. * COMPUTE ABSOLUTE TRACK+SECTOR FROM SPACE NUMBER
  703. * AND LOGICAL SECTOR
  704. *
  705. * PERFORMS THE FOLLOWING CALCULATION -
  706. * TEMP=SPACE*(SECTORS/SPACE)
  707. * TEMP=TEMP+LOGICAL SECTOR
  708. * DP.TRAK=INT(TEMP/(SECTORS/TRACK))
  709. * DP.SECT=TEMP-TEMP*(SECTORS/TRACK)
  710. *
  711. * ON ENTRY - FIPADR = ADDRESS OF FIP
  712. * ON EXIT - DP.TRAK = ABSOLUTE TRACK NUMBER
  713. * DP.SECT = ABSOLUTE SECTOR NUMBER
  714. *
  715. Y.DSKAD LD HL,(FIPADR) GET ADDRESS OF FIP
  716. LD DE,FI.SPAC
  717. ADD HL,DE H,L = ADDRESS OF SPACE NUMBER
  718. LD D,(HL)
  719. INC HL
  720. LD E,(HL) D,E = SPACE NUMBER
  721. CALL MSPSSP COMPUTE SECTORS*SECTORS/SPACE
  722. EX DE,HL D,E = SECTOR NUMBER
  723. LD HL,(FIPADR) LOAD ADDRESS OF FIP
  724. LD BC,FI.SECT
  725. ADD HL,BC H,L = ADDRESS OF SECTOR NUMBER
  726. LD C,(HL)
  727. INC HL
  728. LD B,(HL) B,C = LOGICAL SECTOR
  729. EX DE,HL
  730. ADD HL,BC H,L = SECTOR REL TO DISKETTE
  731. PUSH HL SAVE RELATIVE SECTOR IN STACK
  732. LD B,H
  733. LD C,L B,C = RELATIVE SECTOR
  734. LD A,(DF.BUFF+DF.ST)
  735. LD D,0
  736. LD E,A D,E = PHYSICAL SECTORS/TRACK
  737. CALL DIVBCDE COMPUTE TRACK NUMBER
  738. LD A,C
  739. LD (DP.TRAK),A SET TRACK NUMBER
  740. LD D,B
  741. LD E,C D,E = TRACK NUMBER
  742. *
  743. * /--- BLOCK Y.DSKAD 00 000 80/10/01 18.27
  744. *
  745. LD HL,(DF.BUFF+DF.ST)
  746. LD H,0 H,L = SECTORS/TRACK
  747. CALL MULDEHL COMPUTE TRACK*SECTORS/TRACK
  748. EX DE,HL
  749. CALL COMPHL COMPLEMENT BASE SECTOR NUMBER
  750. EX DE,HL D,E = -BASE SECTOR
  751. POP HL RETRIEVE REL SECTOR FROM STACK
  752. ADD HL,DE COMPUTE SECTOR WITHIN TRACK
  753. LD A,L
  754. INC A ADJUST TO START AT SECTOR 1
  755. LD (DP.SECT),A SET SECTOR NUMBER
  756. RET
  757. *
  758. *
  759. *
  760. * F.FILEL RETURN FILE LENGTH IN SECTORS
  761. * ON ENTRY - H,L = ADDRESS OF FIP
  762. * ON EXIT - H,L = FILE LENGTH IN SECTORS
  763. *
  764. F.FILEL LD DE,FI.NSPC BIAS TO NUMBER FILE SPACES
  765. ADD HL,DE H,L = ADDRESS OF NUMBER SPACES
  766. LD D,0
  767. LD E,(HL) D,E = NUMBER OF SPACES
  768. *
  769. MSPIF IFEQ DC.SS,13
  770. MSPSSP LD H,D COPY SPACE NUMBER TO H,L
  771. LD L,E
  772. ADD HL,DE H,L = 2*SPACE
  773. ADD HL,HL H,L = 4*SPACE
  774. LD B,H
  775. LD C,L B,C = 4*SPACE
  776. ADD HL,HL H,L = 8*SPACE
  777. ADD HL,BC H,L = 12*SPACE
  778. ADD HL,DE H,L = 13*SPACE = SECTOR
  779. RET
  780. MSPIF ENDIF
  781. *
  782. MSPIF IFEQ DC.SS,16
  783. MSPSSP LD H,D COPY SPACE NUMBER TO H,L
  784. LD L,E
  785. ADD HL,DE H,L = 2*SPACE
  786. ADD HL,HL H,L = 4*SPACE
  787. ADD HL,HL H,L = 8*SPACE
  788. ADD HL,HL H,L = 16*SPACE = SECTOR
  789. RET
  790. MSPIF ENDIF
  791. *
  792. *
  793. * /--- BLOCK ROUTINES 00 000 80/08/24 15.41
  794. TITLE ROUTINES
  795. *
  796. *
  797. *
  798. * READDIR READ 1ST SECTOR OF DIRECTORY
  799. * ON ENTRY - DP.UNIT = UNIT NUMBER
  800. * ON EXIT - A = NON-ZERO IF ERROR OCCURRED
  801. * F.BUFF = 1ST SECTOR
  802. *
  803. READDIR CALL SETDIR SET TO READ DIRECTORY
  804. CALL D.READ READ 1ST SECTOR
  805. RET
  806. *
  807. *
  808. *
  809. * SETDIR SET TO READ/WRITE DIRECTORY
  810. * ON EXIT - DP.TRAK = DIRECTORY 1ST TRACK NUMBER
  811. * DP.SECT = DIRECTORY 1ST SECTOR NUMBER
  812. * DP.ADDR = ADDRESS OF F.BUFF
  813. * DP.NUM = 1
  814. *
  815. SETDIR LD A,(DF.BUFF+DF.DTRK)
  816. LD (DP.TRAK),A SET DIRECTORY TRACK
  817. LD A,(DF.BUFF+DF.DSEC)
  818. LD (DP.SECT),A SET DIRECTORY SECTOR
  819. LD A,1
  820. LD (DP.NUM),A SET NUMBER SECTORS TO READ
  821. LD HL,F.BUFF
  822. LD (DP.ADDR),HL SET BUFFER ADDRESS
  823. RET
  824. *
  825. *
  826. *
  827. * IDEF INITIALIZE DEFINITION SECTOR
  828. * ON EXIT - A = NON-ZERO IF ERROR OCCURRED
  829. *
  830. IDEF CALL D.VDEF VERIFY DEFINITION SECTOR
  831. RET Z EXIT IF INTACT
  832. CALL D.RDEF READ DEFINITION SECTOR
  833. RET
  834. *
  835. * /--- BLOCK ROUTINES 00 000 80/09/23 17.55
  836. *
  837. *
  838. *
  839. * SETRAM SET LWA OF USEABLE RAM
  840. * ON EXIT - H,L = LWA OF USEABLE RAM
  841. * USES - A,H,L
  842. *
  843. SETRAM LD HL,ISTRAM GET FWA OF INTERPRETER RAM
  844. RET
  845. *
  846. * /--- BLOCK END 00 000 81/07/06 19.54
  847. *
  848. *
  849. F.LESSN JP LESERR
  850. *
  851. *
  852. END