home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / HACK5C.SFX / hack5-6 next >
Encoding:
Text File  |  1990-02-12  |  16.5 KB  |  801 lines

  1. %    JSR TOGGLE├LOCK
  2. %    JSR SERIAL╫AIT
  3. %    LDX CIA─ATA
  4. %    JSR TOGGLE├LOCK
  5. %    TXA
  6. %    STA ERRNO
  7. %    AND #$0F
  8. %    CMP #2
  9. %    CLI
  10. %    RTS
  11. %
  12.  
  13. ╘HIS NEXT LEVEL OF ROUTINES DEALS WITH LOGICAL SECTORS AND THE TRACK CACHE
  14. RATHER THAN WITH HARDWARE.
  15.  
  16. % ;====LOGICAL SECTOR LEVEL====
  17. %
  18.  
  19. ╔NVALIDATE THE TRACK CACHE IF THE ═╙-─╧╙ DRIVE NUMBER IS CHANGED OR IF A NEW
  20. DISK IS INSERTED.  ╘HIS ROUTINE HAS TO ESTABLISH A ╥┴═ CONFIGURATION OF $0┼
  21. SINCE IT WILL BE CALLED FROM ╥┴═0.  ├ONFIGURATION $0┼ GIVES ╥┴═0 FROM $0000 TO
  22. $┬╞╞╞, ╦ERNAL ╥╧═ FROM $├000 TO $╞╞╞╞, AND THE ╔/╧ SPACE OVER THE ╦ERNAL FROM
  23. $─000 TO $─╞╞╞.  ╘HIS CONFIGURATION IS SET BY ALL APPLICATION INTERFACE
  24. SUBROUTINES.
  25.  
  26. % INIT╨ACKAGE = *
  27. %    LDA #$0E
  28. %    STA $FF00
  29. %    LDA #$FF
  30. %    STA BUF├YLINDER
  31. %    STA BUF╙IDE
  32. %    LDX #7
  33. % -  STA DIR─IRTY,X
  34. %    DEX
  35. %    BPL -
  36. %    STA FAT─IRTY
  37. %    CLC
  38. %    RTS
  39. %
  40.  
  41. ╠OCATE A SECTOR (BLOCK) IN THE TRACK CACHE, OR READ THE CORRESPONDING PHYSICAL
  42. TRACK INTO THE TRACK CACHE IF NECESSARY.  ╘HIS ROUTINE ACCEPTS THE CYLINDER,
  43. SIDE, AND SECTOR NUMBERS OF THE BLOCK.
  44.  
  45. % SECTOR╙AVE = 5
  46. %
  47. % READ┬LOCK = *  ;( .┴=CYLINDER,.╪=SIDE,.┘=SECTOR ) : .┴┘=BLK╨TR,.├╙=ERR
  48.  
  49. ├HECK IF THE CORRECT TRACK IS IN THE TRACK CACHE.
  50.  
  51. %    CMP BUF├YLINDER
  52. %    BNE READ┬LOCK╨HYSICAL
  53. %    CPX BUF╙IDE
  54. %    BNE READ┬LOCK╨HYSICAL
  55.  
  56. ╔F SO, THEN LOCATE THE SECTOR'S ADDRESS AND RETURN THAT.
  57.  
  58. %    DEY
  59. %    TYA
  60. %    ASL
  61. %    CLC
  62. %    ADC #>TRACKBUF
  63. %    TAY
  64. %    LDA #<TRACKBUF
  65. %    CLC
  66. %    RTS
  67. %
  68.  
  69. ╚ERE, WE HAVE TO READ THE PHYSICAL TRACK INTO THE TRACK CACHE.  ╫E SAVE THE
  70. INPUT PARAMETERS AND CALL THE HARDWARE-LEVEL TRACK-READING ROUTINE.
  71.  
  72. %    READ┬LOCK╨HYSICAL = *
  73. %    STA BUF├YLINDER
  74. %    STX BUF╙IDE
  75. %    STY SECTOR╙AVE
  76. %    JSR READ╘RACK
  77.  
  78. ├HECK FOR ERRORS.
  79.  
  80. %    BCC READ┬LOCK╨HYSICAL╧K
  81. %    LDA ERRNO
  82. %    AND #$0F
  83. %    CMP #11    ;DISK CHANGE
  84. %    BEQ +
  85. %    SEC
  86. %    RTS
  87.  
  88. ╔F THE ERROR THAT HAPPENED IS A "─ISK ├HANGE" ERROR, THEN MOUNT THE DISK AND
  89. TRY TO READ THE PHYSICAL TRACK AGAIN.
  90.  
  91. % +  JSR MOUNT─ISK
  92. %    LDA BUF├YLINDER
  93. %    LDX BUF╙IDE
  94. %    LDY SECTOR╙AVE
  95. %    BCC READ┬LOCK╨HYSICAL
  96. %    RTS
  97. %
  98.  
  99. ╚ERE, THE PHYSICAL TRACK HAS BEEN READ INTO THE TRACK CACHE OK, SO WE RECOVER
  100. THE ORIGINAL INPUT PARAMETERS AND TRY THE TOP OF THE ROUTINE AGAIN.
  101.  
  102. %    READ┬LOCK╨HYSICAL╧K = *
  103. %    LDA BUF├YLINDER
  104. %    LDX BUF╙IDE
  105. %    LDY SECTOR╙AVE
  106. %    JMP READ┬LOCK
  107. %
  108.  
  109. ─IVIDE THE GIVEN NUMBER BY 18.  ╘HIS IS NEEDED FOR THE CALCULATIONS TO CONVERT
  110. A LOGICAL SECTOR NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER, SIDE, AND
  111. SECTOR NUMBERS THAT THE LOWER-LEVEL ROUTINES REQUIRE.  ╘HE METHOD OF REPEATED
  112. SUBTRACTION IS USED.  ╘HIS ROUTINE WOULD PROBABLY WORK FASTER IF WE TRIED TO
  113. REPEATEDLY SUBTRACT 360 (18*20) AT THE TOP, BUT ╔ DIDN'T BOTHER.
  114.  
  115. % DIVIDE┬Y18 = *  ;( .┴┘=NUMBER ) : .┴=QUOTIENT, .┘=REMAINDER
  116. %    ;** COULD REPEATEDLY SUBTRACT 360 HERE
  117. %    LDX #$FF
  118. % -  INX
  119. %    SEC
  120. %    SBC #18
  121. %    BCS -
  122. %    DEY
  123. %    BPL -
  124. %    CLC
  125. %    ADC #18
  126. %    INY
  127. %    TAY
  128. %    TXA
  129. %    RTS
  130. %
  131.  
  132. ├ONVERT THE GIVEN LOGICAL BLOCK NUMBER TO THE CORRESPONDING PHYSICAL CYLINDER,
  133. SIDE, AND SECTOR NUMBERS.  ╘HIS ROUTINE FOLLOWS THE FORMULAE GIVEN IN THE
  134. PREVIOUS ARTICLE WITH A FEW SIMPLIFYING TRICKS.
  135.  
  136. % CONVERT╠OGICAL┬LOCK╬UM = *  ;( .┴┘=BLOCK╬UM ) : .┴=CYL, .╪=SIDE,.┘=SEC
  137. %    JSR DIVIDE┬Y18
  138. %    LDX #0
  139. %    CPY #9
  140. %    BCC +
  141. %    PHA
  142. %    TYA
  143. %    SBC #9
  144. %    TAY
  145. %    PLA
  146. %    LDX #1
  147. % +  INY
  148. %    RTS
  149. %
  150.  
  151. ├OPY A SEQUENTIAL GROUP OF LOGICAL SECTORS INTO MEMORY.  ╘HIS ROUTINE IS USED
  152. BY THE DIRECTORY LOADING ROUTINE TO LOAD THE ╞┴╘ AND ╥OOT ─IRECTORY, AND IS
  153. USED BY THE CLUSTER READING ROUTINE TO RETRIEVE ALL OF THE BLOCKS OF A
  154. CLUSTER.  ┴FTER THE GIVEN STARTING LOGICAL SECTOR NUMBER IS CONVERTED INTO ITS
  155. PHYSICAL CYLINDER, SIDE, AND SECTOR EQUIVALENT, THE PHYSICAL VALUES ARE
  156. INCREMENTED TO GET THE ADDRESS OF SUCCESSIVE SECTORS OF THE GROUP.  ╘HIS
  157. AVOIDS THE OVERHEAD OF THE LOGICAL TO PHYSICAL CONVERSION.  ╤UITE A NUMBER OF
  158. TEMPORARIES ARE NEEDED.
  159.  
  160. % DEST╨TR = 6
  161. % CUR├YLINDER = 8
  162. % CUR╙IDE = 9
  163. % CUR╙ECTOR = 10
  164. % BLOCK├OUNTDOWN = 11
  165. % SOURCE╨TR = 12
  166. %
  167. % COPY┬LOCKS = *  ;( .┴┘=START┬LOCK, .╪=BLOCK├OUNT, ($6)=DEST ) : .├╙=ERR
  168. %    STX BLOCK├OUNTDOWN
  169. %    JSR CONVERT╠OGICAL┬LOCK╬UM
  170. %    STA CUR├YLINDER
  171. %    STX CUR╙IDE
  172. %    STY CUR╙ECTOR
  173. %
  174. %    COPY┬LOCK╠OOP = *
  175. %    LDA CUR├YLINDER
  176. %    LDX CUR╙IDE
  177. %    LDY CUR╙ECTOR
  178. %    JSR READ┬LOCK
  179. %    BCC +
  180. %    RTS
  181. % +  STA SOURCE╨TR
  182. %    STY SOURCE╨TR+1
  183. %    LDX #2
  184. %    LDY #0
  185.  
  186. ╚ERE ╔ UNROLL THE COPYING LOOP A LITTLE BIT TO CUT THE OVERHEAD OF THE BRANCH
  187. INSTRUCTION IN HALF.  (┴ CYCLE SAVED... YOU KNOW).
  188.  
  189. % -  LDA (SOURCE╨TR),Y
  190. %    STA (DEST╨TR),Y
  191. %    INY
  192. %    LDA (SOURCE╨TR),Y
  193. %    STA (DEST╨TR),Y
  194. %    INY
  195. %    BNE -
  196. %    INC SOURCE╨TR+1
  197. %    INC DEST╨TR+1
  198. %    DEX
  199. %    BNE -
  200.  
  201. ╔NCREMENT THE CYLINDER, SIDE, SECTOR VALUES.
  202.  
  203. %    INC CUR╙ECTOR
  204. %    LDA CUR╙ECTOR
  205. %    CMP #10
  206. %    BCC +
  207. %    LDA #1
  208. %    STA CUR╙ECTOR
  209. %    INC CUR╙IDE
  210. %    LDA CUR╙IDE
  211. %    CMP #2
  212. %    BCC +
  213. %    LDA #0
  214. %    STA CUR╙IDE
  215. %    INC CUR├YLINDER
  216. % +  DEC BLOCK├OUNTDOWN
  217. %    BNE COPY┬LOCK╠OOP
  218. %    CLC
  219. %    RTS
  220. %
  221.  
  222. ├ONVERT A GIVEN CLUSTER NUMBER INTO THE FIRST CORRESPONDING LOGICAL BLOCK
  223. NUMBER.
  224.  
  225. % CONVERT├LUSTER╬UM = *  ;( .┴┘=CLUSTER╬UM ) : .┴┘=LOGICAL┬LOCK╬UM
  226. %    SEC
  227. %    SBC #2
  228. %    BCS +
  229. %    DEY
  230. % +  LDX CLUSTER┬LOCK├OUNT
  231. %    CPX #1
  232. %    BEQ +
  233. %    ASL
  234. %    STY 7
  235. %    ROL 7
  236. %    LDY 7
  237. % +  CLC
  238. %    ADC FIRST╞ILE┬LOCK
  239. %    BCC +
  240. %    INY
  241. % +  RTS
  242. %
  243.  
  244. ╥EAD A CLUSTER INTO THE ├LUSTER ┬UFFER, GIVEN THE CLUSTER NUMBER.  ╘HE CLUSTER
  245. NUMBER IS CONVERTED TO A LOGICAL SECTOR NUMBER AND THEN THE SECTOR COPYING
  246. ROUTINE IS CALLED.  ╘HE FORMULA GIVEN IN THE PREVIOUS ARTICLE IS USED.
  247.  
  248. % READ├LUSTER = *  ;( .┴┘=CLUSTER╬UMBER ) : CLUSTER┬UF, .├╙=ERR
  249. %    JSR CONVERT├LUSTER╬UM
  250. %
  251. %    ;** READ LOGICAL BLOCKS COMPRISING CLUSTER
  252. %    LDX #<CLUSTER┬UF
  253. %    STX 6
  254. %    LDX #>CLUSTER┬UF
  255. %    STX 7
  256. %    LDX CLUSTER┬LOCK├OUNT
  257. %    JMP COPY┬LOCKS
  258. %
  259.  
  260. ╫RITE A LOGICAL BLOCK OUT TO DISK.  ╘HE REAL PURPOSE OF THIS ROUTINE IS TO
  261. INVALIDATE THE READ-TRACK CACHE IF THE BLOCK TO BE WRITTEN IS CONTAINED IN
  262. THE CACHE.
  263.  
  264. % WRITE╠OGICAL┬LOCK = *  ;( .┴┘=LOGICAL┬LOCK╬UMBER, BUFPTR ) : .├╙=ERR
  265. %    JSR CONVERT╠OGICAL┬LOCK╬UM
  266. %    CMP BUF├YLINDER
  267. %    BNE +
  268. %    CPX BUF╙IDE
  269. %    BNE +
  270. %    PHA
  271. %    LDA #$FF
  272. %    STA BUF├YLINDER
  273. %    STA BUF╙IDE
  274. %    PLA
  275. % +  JSR WRITE╙ECTOR
  276. %    RTS
  277. %
  278. % WRITE├LUSTER╙AVE .BUF 2
  279. %
  280.  
  281. ╫RITE A CLUSTER-FUL OF DATA OUT TO DISK FROM THE CLUSTER BUFFER.  ╘HIS ROUTINE
  282. SIMPLY CALLS THE WRITE LOGICAL BLOCK ROUTINE ONCE OR TWICE, DEPENDING ON THE
  283. CLUSTER SIZE OF THE DISK INVOLVED.
  284.  
  285. % WRITE├LUSTER = *  ;( .┴┘=CLUSTER╬UMBER, CLUSTER┬UF ) : .├╙=ERR
  286. %    JSR CONVERT├LUSTER╬UM
  287. %    LDX #<CLUSTER┬UF
  288. %    STX BUFPTR
  289. %    LDX #>CLUSTER┬UF
  290. %    STX BUFPTR+1
  291. %    STA WRITE├LUSTER╙AVE
  292. %    STY WRITE├LUSTER╙AVE+1
  293. %    JSR WRITE╠OGICAL┬LOCK
  294. %    BCC +
  295. %    RTS
  296. % +  LDA CLUSTER┬LOCK├OUNT
  297. %    CMP #2
  298. %    BCS +
  299. %    RTS
  300. % +  LDA WRITE├LUSTER╙AVE
  301. %    LDY WRITE├LUSTER╙AVE+1
  302. %    CLC
  303. %    ADC #1
  304. %    BCC +
  305. %    INY
  306. % +  JSR WRITE╠OGICAL┬LOCK
  307. %    RTS
  308. %
  309.  
  310. ╘HIS NEXT LEVEL OF ROUTINES DEAL WITH THE DATA STRUCTURES OF THE ═╙-─╧╙ DISK
  311. FORMAT.
  312.  
  313. % ;====═╙-─╧╙ FORMAT LEVEL====
  314. %
  315. % BOOT┬LOCK = 2
  316. %
  317.  
  318. ╥EAD THE DISK FORMAT PARAMETERS, DIRECTORY, AND ╞┴╘ INTO MEMORY.
  319.  
  320. % MS─IR = *  ;( ) : .┴┘=DIRBUF, .╪=DIR┼NTRIES, .├╙=ERR
  321. %    LDA #$0E
  322. %    STA $FF00
  323. %
  324.  
  325. ╥EAD THE BOOT SECTOR AND EXTRACT THE PARAMETERS.
  326.  
  327. %    ;** GET PARAMETERS FROM BOOT SECTOR
  328. %    LDA #0
  329. %    LDY #0
  330. %    JSR CONVERT╠OGICAL┬LOCK╬UM
  331. %    JSR READ┬LOCK
  332. %    BCC +
  333. %    RTS
  334. % +  STA BOOT┬LOCK
  335. %    STY BOOT┬LOCK+1
  336. %    LDY #13              ;GET CLUSTER SIZE
  337. %    LDA (BOOT┬LOCK),Y
  338. %    STA CLUSTER┬LOCK├OUNT
  339. %    CMP #3
  340. %    BCC +
  341. %
  342.  
  343. ╔F A DISK PARAMETER IS FOUND TO EXCEED THE LIMITS OF ╠╥╥, ERROR CODE #60 IS
  344. RETURNED.
  345.  
  346. %    INVALID╨ARMS = *
  347. %    LDA #60
  348. %    STA ERRNO
  349. %    SEC
  350. %    RTS
  351. %
  352. % +  LDY #16              ;CHECK ╞┴╘ REPLICATION COUNT, MUST BE 2
  353. %    LDA (BOOT┬LOCK),Y
  354. %    CMP #2
  355. %    BNE INVALID╨ARMS
  356. %    LDY #22              ;GET ╞┴╘ SIZE IN SECTORS
  357. %    LDA (BOOT┬LOCK),Y
  358. %    STA FAT┬LOCKS
  359. %    CMP #4
  360. %    BCS INVALID╨ARMS
  361. %    LDY #17              ;GET DIRECTORY SIZE
  362. %    LDA (BOOT┬LOCK),Y
  363. %    STA ROOT─IR┼NTRIES
  364. %    CMP #129
  365. %    BCS INVALID╨ARMS
  366. %    LSR
  367. %    LSR
  368. %    LSR
  369. %    LSR
  370. %    STA ROOT─IR┬LOCKS
  371. %    LDY #19              ;GET TOTAL SECTOR COUNT
  372. %    LDA (BOOT┬LOCK),Y
  373. %    STA TOTAL╙ECTORS
  374. %    INY
  375. %    LDA (BOOT┬LOCK),Y
  376. %    STA TOTAL╙ECTORS+1
  377. %    LDY #24              ;CHECK SECTORS PER TRACK, MUST BE 9
  378. %    LDA (BOOT┬LOCK),Y
  379. %    CMP #9
  380. %    BNE INVALID╨ARMS
  381. %    LDY #26
  382. %    LDA (BOOT┬LOCK),Y
  383. %    CMP #2               ;CHECK NUMBER OF SIDES, MUST BE 2
  384. %    BNE INVALID╨ARMS
  385. %    LDY #14              ;CHECK NUMBER OF BOOT SECTORS, MUST BE 1
  386. %    LDA (BOOT┬LOCK),Y
  387. %    CMP #1
  388. %    BNE INVALID╨ARMS
  389. %
  390.  
  391. ├ALCULATE THE DERIVED PARAMETERS.
  392.  
  393. %    ;** GET DERIVED PARAMETERS
  394. %    LDA FAT┬LOCKS        ;FIRST ROOT DIRECTORY SECTOR
  395. %    ASL
  396. %    CLC
  397. %    ADC #1
  398. %    STA FIRST╥OOT─IR┬LOCK
  399. %    CLC                  ;FIRST FILE SECTOR
  400. %    ADC ROOT─IR┬LOCKS
  401. %    STA FIRST╞ILE┬LOCK
  402. %    LDA TOTAL╙ECTORS     ;NUMBER OF FILE CLUSTERS
  403. %    LDY TOTAL╙ECTORS+1
  404. %    SEC
  405. %    SBC FIRST╞ILE┬LOCK
  406. %    BCS +
  407. %    DEY
  408. % +  STA FILE├LUSTER├OUNT
  409. %    STY FILE├LUSTER├OUNT+1
  410. %    LDA CLUSTER┬LOCK├OUNT
  411. %    CMP #2
  412. %    BNE +
  413. %    LSR FILE├LUSTER├OUNT+1
  414. %    ROR FILE├LUSTER├OUNT
  415. % +  CLC
  416. %    LDA FILE├LUSTER├OUNT
  417. %    ADC #2
  418. %    STA LAST╞AT┼NTRY
  419. %    LDA FILE├LUSTER├OUNT+1
  420. %    ADC #0
  421. %    STA LAST╞AT┼NTRY+1
  422. %
  423. %    ;** LOAD ╞┴╘
  424. %    LDA #<FATBUF
  425. %    LDY #>FATBUF
  426. %    STA 6
  427. %    STY 7
  428. %    LDA #1
  429. %    LDY #0
  430. %    LDX FAT┬LOCKS
  431. %    JSR COPY┬LOCKS
  432. %    BCC +
  433. %    RTS
  434. %
  435. %    ;** LOAD ACTUAL DIRECTORY
  436. % +  LDA #<DIRBUF
  437. %    LDY #>DIRBUF
  438. %    STA 6
  439. %    STY 7
  440. %    LDA FIRST╥OOT─IR┬LOCK
  441. %    LDY #0
  442. %    LDX ROOT─IR┬LOCKS
  443. %    JSR COPY┬LOCKS
  444. %    BCC +
  445. %    RTS
  446. % +  LDA #<DIRBUF
  447. %    LDY #>DIRBUF
  448. %    LDX ROOT─IR┼NTRIES
  449. %    CLC
  450. %    RTS
  451. %
  452.  
  453. ╘HIS ROUTINE LOCATES THE GIVEN ╞┴╘ TABLE ENTRY NUMBER AND RETURNS THE VALUE
  454. STORED IN IT.  ╙OME WORK IS NEEDED TO DEAL WITH THE 12-BIT COMPRESSED DATA
  455. STRUCTURE.
  456.  
  457. % ENTRY┴DDR = 2
  458. % ENTRY╫ORK = 4
  459. % ENTRY┬ITS = 5
  460. % ENTRY─ATA0 = 6
  461. % ENTRY─ATA1 = 7
  462. % ENTRY─ATA2 = 8
  463. %
  464. % LOCATE╞AT┼NTRY = *  ;( .┴┘=FAT┼NTRY╬UMBER ) : ENTRY┴DDR, ENTRY┬ITS%1
  465.  
  466. ─IVIDE THE ╞┴╘ ENTRY NUMBER BY TWO AND MULTIPLY BY THREE BECAUSE TWO ╞┴╘
  467. ENTRIES ARE STORED IN THREE BYTES.  ╘HEN ADD THE ╞┴╘ BASE ADDRESS AND WE HAVE
  468. THE ADDRESS OF THE THREE BYTES THAT CONTAIN THE ╞┴╘ ENTRY WE ARE INTERESTED
  469. IN.  ╔ RETRIEVE THE THREE BYTES INTO ZERO-PAGE MEMORY FOR EASY MANIPULATION.
  470.  
  471. %    STA ENTRY┬ITS
  472. %    ;** DIVIDE BY TWO
  473. %    STY ENTRY┴DDR+1
  474. %    LSR ENTRY┴DDR+1
  475. %    ROR
  476. %
  477. %    ;** TIMES THREE
  478. %    STA ENTRY╫ORK
  479. %    LDX ENTRY┴DDR+1
  480. %    ASL
  481. %    ROL ENTRY┴DDR+1
  482. %    CLC
  483. %    ADC ENTRY╫ORK
  484. %    STA ENTRY┴DDR
  485. %    TXA
  486. %    ADC ENTRY┴DDR+1
  487. %    STA ENTRY┴DDR+1
  488. %
  489. %    ;** ADD BASE, GET DATA
  490. %    CLC
  491. %    LDA ENTRY┴DDR
  492. %    ADC #<FATBUF
  493. %    STA ENTRY┴DDR
  494. %    LDA ENTRY┴DDR+1
  495. %    ADC #>FATBUF
  496. %    STA ENTRY┴DDR+1
  497. %    LDY #2
  498. % -  LDA (ENTRY┴DDR),Y
  499. %    STA ENTRY─ATA0,Y
  500. %    DEY
  501. %    BPL -
  502. %    RTS
  503. %
  504. % GET╞AT┼NTRY = *  ;( .┴┘=FAT┼NTRY╬UMBER ) : .┴┘=FAT┼NTRY╓ALUE
  505. %    JSR LOCATE╞AT┼NTRY
  506. %    LDA ENTRY┬ITS
  507. %    AND #1
  508. %    BNE +
  509. %
  510.  
  511. ╔F THE ORIGINAL GIVEN ╞┴╘ ENTRY NUMBER IS EVEN, THEN WE WANT THE FIRST 12-BIT
  512. COMPRESSED FIELD.  ╘HE NYBBLES ARE EXTRACTED ACCORDING TO THE DIAGRAM SHOWN
  513. EARLIER.
  514.  
  515. %    ;** CASE 1: FIRST 12-BIT CLUSTER
  516. %    LDA ENTRY─ATA1
  517. %    AND #$0F
  518. %    TAY
  519. %    LDA ENTRY─ATA0
  520. %    RTS
  521. %
  522.  
  523. ╧THERWISE, WE WANT THE SECOND 12-BIT FIELD.
  524.  
  525. %    ;** CASE 2: SECOND 12-BIT CLUSTER
  526. % +  LDA ENTRY─ATA1
  527. %    LDX #4
  528. % -  LSR ENTRY─ATA2
  529. %    ROR
  530. %    DEX
  531. %    BNE -
  532. %    LDY ENTRY─ATA2
  533. %    RTS
  534. %
  535. % FAT╓ALUE = 9
  536. %
  537.  
  538. ├HANGE THE VALUE IN A ╞┴╘ ENTRY.  ╘HIS ROUTINE IS QUITE SIMILAR TO THE GET
  539. ROUTINE.
  540.  
  541. % SET╞AT┼NTRY = *  ;( .┴┘=FAT┼NTRY╬UMBER, (FAT╓ALUE) )
  542. %    JSR LOCATE╞AT┼NTRY
  543. %    LDA FAT╓ALUE+1
  544. %    AND #$0F
  545. %    STA FAT╓ALUE+1
  546. %    LDA ENTRY┬ITS
  547. %    AND #1
  548. %    BNE +
  549. %
  550. %    ;** CASE 1: FIRST 12-BIT CLUSTER
  551. %    LDA FAT╓ALUE
  552. %    STA ENTRY─ATA0
  553. %    LDA ENTRY─ATA1
  554. %    AND #$F0
  555. %    ORA FAT╓ALUE+1
  556. %    STA ENTRY─ATA1
  557. %    JMP SET╞AT┼XIT
  558. %
  559. %    ;** CASE 2: SECOND 12-BIT CLUSTER
  560. % +  LDX #4
  561. % -  ASL FAT╓ALUE
  562. %    ROL FAT╓ALUE+1
  563. %    DEX
  564. %    BNE -
  565. %    LDA FAT╓ALUE+1
  566. %    STA ENTRY─ATA2
  567. %    LDA ENTRY─ATA1
  568. %    AND #$0F
  569. %    ORA FAT╓ALUE
  570. %    STA ENTRY─ATA1
  571. %
  572. %    SET╞AT┼XIT = *
  573. %    LDY #2
  574. % -  LDA ENTRY─ATA0,Y
  575. %    STA (ENTRY┴DDR),Y
  576. %    DEY
  577. %    BPL -
  578. %    STY FAT─IRTY
  579. %    RTS
  580. %
  581.  
  582. ═ARK THE DIRECTORY SECTOR CORRESPONDING TO THE GIVEN DIRECTORY ENTRY AS BEING
  583. DIRTY SO IT WILL BE WRITTEN OUT TO DISK THE NEXT TIME THE MS╞LUSH ROUTINE IS
  584. CALLED.
  585.  
  586. % DIRTY─IRENT = *  ;( WRITE─IRENT )
  587. %    SEC
  588. %    LDA WRITE─IRENT
  589. %    SBC #<DIRBUF
  590. %    LDA WRITE─IRENT+1
  591. %    SBC #>DIRBUF
  592. %    LSR
  593. %    AND #$07
  594. %    TAX
  595. %    LDA #$FF
  596. %    STA DIR─IRTY,X
  597. %    RTS
  598. %
  599. % DEL├LUSTER = 14
  600. %
  601.  
  602. ─ELETE THE ═╙-─╧╙ FILE WHOSE DIRECTORY ENTRY IS GIVEN.  ╨UT THE $┼5 INTO
  603. ITS FILENAME, GET ITS STARTING CLUSTER AND FOLLOW THE CHAIN OF CLUSTERS
  604. ALLOCATED TO THE FILE IN THE ╞┴╘, MARKING THEM AS UNALLOCATED (VALUE $000)
  605. AS WE GO.  ┼XIT BY MARKING THE DIRECTORY ENTRY AS "DIRTY".
  606.  
  607. % MS─ELETE = *  ;( WRITE─IRENT )
  608. %    LDY #$0E
  609. %    STY $FF00
  610. %    LDA WRITE─IRENT
  611. %    LDY WRITE─IRENT+1
  612. %    STA 2
  613. %    STY 3
  614. %    LDA #$E5
  615. %    LDY #0
  616. %    STA (2),Y
  617. %    LDY #26
  618. %    LDA (2),Y
  619. %    STA DEL├LUSTER
  620. %    INY
  621. %    LDA (2),Y
  622. %    STA DEL├LUSTER+1
  623. % -  LDA DEL├LUSTER+1
  624. %    CMP #5
  625. %    BCC +
  626. %    JMP DIRTY─IRENT
  627. % +  TAY
  628. %    LDA DEL├LUSTER
  629. %    JSR GET╞AT┼NTRY
  630. %    PHA
  631. %    TYA
  632. %    PHA
  633. %    LDA #0
  634. %    STA FAT╓ALUE
  635. %    STA FAT╓ALUE+1
  636. %    LDA DEL├LUSTER
  637. %    LDY DEL├LUSTER+1
  638. %    JSR SET╞AT┼NTRY
  639. %    PLA
  640. %    STA DEL├LUSTER+1
  641. %    PLA
  642. %    STA DEL├LUSTER
  643. %    JMP -
  644. %
  645. % FLUSH┬LOCK = 14
  646. % FLUSH├OUNTDOWN = $60
  647. % FLUSH╥EPEATS = $61
  648. % FLUSH─IR╔NDEX = $61
  649. %
  650.  
  651. ╫RITE THE ╞┴╘ AND DIRECTORY SECTORS FROM MEMORY TO DISK, IF THEY ARE DIRTY.
  652.  
  653. % MS╞LUSH = *  ;( MS─EVICE, MS╘YPE ) : .├╙=ERROR
  654. %    LDA #$0E
  655. %    STA $FF00
  656. %    LDA FAT─IRTY
  657. %    BEQ FLUSH─IRECTORY
  658. %    LDA #0
  659. %    STA FAT─IRTY
  660. %
  661. %    ;** FLUSH FAT
  662.  
  663. ╞LUSH BOTH COPIES OF THE ╞┴╘, IF THERE ARE TWO; OTHERWISE, ONLY FLUSH THE ONE.
  664.  
  665. %    LDA #2
  666. %    STA FLUSH╥EPEATS
  667. %    LDA #1
  668. %    STA FLUSH┬LOCK
  669. %
  670. %    MASTER╞LUSH = *
  671. %    LDA FAT┬LOCKS
  672. %    STA FLUSH├OUNTDOWN
  673. %    LDA #<FATBUF
  674. %    LDY #>FATBUF
  675. %    STA BUFPTR
  676. %    STY BUFPTR+1
  677. % -  LDA FLUSH┬LOCK
  678. %    LDY #0
  679. %    JSR WRITE╠OGICAL┬LOCK
  680. %    BCC +
  681. %    RTS
  682. % +  INC FLUSH┬LOCK
  683. %    DEC FLUSH├OUNTDOWN
  684. %    BNE -
  685. %    DEC FLUSH╥EPEATS
  686. %    BNE MASTER╞LUSH
  687. %
  688. %    ;** FLUSH DIRECTORY
  689. %    FLUSH─IRECTORY = *
  690. %    LDA FIRST╥OOT─IR┬LOCK
  691. %    STA FLUSH┬LOCK
  692. %    LDA ROOT─IR┬LOCKS
  693. %    STA FLUSH├OUNTDOWN
  694. %    LDA #0
  695. %    STA FLUSH─IR╔NDEX
  696. %    LDA #<DIRBUF
  697. %    LDY #>DIRBUF
  698. %    STA BUFPTR
  699. %    STY BUFPTR+1
  700. % -  LDX FLUSH─IR╔NDEX
  701. %    LDA DIR─IRTY,X
  702. %    BEQ +
  703. %    LDA #0
  704. %    STA DIR─IRTY,X
  705. %    LDA FLUSH┬LOCK
  706. %    LDY #0
  707. %    JSR WRITE╠OGICAL┬LOCK
  708. %    DEC BUFPTR+1
  709. %    DEC BUFPTR+1
  710. % +  INC FLUSH┬LOCK
  711. %    INC FLUSH─IR╔NDEX
  712. %    INC BUFPTR+1
  713. %    INC BUFPTR+1
  714. %    DEC FLUSH├OUNTDOWN
  715. %    BNE -
  716. %    CLC
  717. %    RTS
  718. %
  719. % BF╞AT┼NTRY = 14
  720. % BF┬LOCKS = $60
  721. %
  722.  
  723. ├OUNT THE NUMBER OF FREE ╞┴╘ ENTRIES (VALUE $000) FROM ENTRY 2 UP TO THE
  724. HIGHEST ╞┴╘ ENTRY AVAILABLE FOR CLUSTER ALLOCATION.  ╘HEN MULTIPLY THIS
  725. BY THE NUMBER OF BYTES PER CLUSTER (EITHER 512 OR 1024).
  726.  
  727. % MS┬YTES╞REE = *  ;( ) : .┴┘╪=FILE┬YTES╞REE
  728. %    LDY #$0E
  729. %    STY $FF00
  730. %    LDA #2
  731. %    LDY #0
  732. %    STA BF╞AT┼NTRY
  733. %    STY BF╞AT┼NTRY+1
  734. %    STY BF┬LOCKS
  735. %    STY BF┬LOCKS+1
  736. % -  LDA BF╞AT┼NTRY
  737. %    LDY BF╞AT┼NTRY+1
  738. %    JSR GET╞AT┼NTRY
  739. %    STY 2
  740. %    ORA 2
  741. %    BNE +
  742. %    INC BF┬LOCKS
  743. %    BNE +
  744. %    INC BF┬LOCKS+1
  745. % +  INC BF╞AT┼NTRY
  746. %    BNE +
  747. %    INC BF╞AT┼NTRY+1
  748. % +  LDA BF╞AT┼NTRY
  749. %    CMP LAST╞AT┼NTRY
  750. %    LDA BF╞AT┼NTRY+1
  751. %    SBC LAST╞AT┼NTRY+1
  752. %    BCC -
  753. %    LDX CLUSTER┬LOCK├OUNT
  754. % -  ASL BF┬LOCKS
  755. %    ROL BF┬LOCKS+1
  756. %    DEX
  757. %    BNE -
  758. %    LDA #0
  759. %    LDY BF┬LOCKS
  760. %    LDX BF┬LOCKS+1
  761. %    RTS
  762. %
  763.  
  764. ╘HIS IS THE FILE COPYING LEVEL.  ╔T DEALS WITH READING/WRITING THE CLUSTERS OF
  765. ═╙-─╧╙ FILES AND COPYING THE DATA THEY CONTAIN TO/FROM THE ALREADY-OPEN ├┬═
  766. ╦ERNAL FILE, POSSIBLY WITH ┴╙├╔╔/╨┼╘╙├╔╔ TRANSLATION.
  767.  
  768. % ;====FILE COPY LEVEL====
  769. %
  770. % TRANS═ODE = 14
  771. % LFN = 15
  772. % CBM─ATA╨TR = $60
  773. % CBM─ATA╠EN = $62
  774. % CLUSTER = $64
  775. %
  776.  
  777. ├OPY THE GIVEN CLUSTER TO THE ├┬═ OUTPUT FILE.  ╘HIS ROUTINE FETCHES THE NEXT
  778. CLUSTER OF THE FILE FOR THE NEXT TIME THIS ROUTINE IS CALLED, AND IF IT HITS
  779. THE ╬╒╠╠ POINTER OF THE LAST CLUSTER OF A FILE, IT ADJUSTS THE NUMBER OF VALID
  780. FILE DATA BYTES THE CURRENT CLUSTER CONTAINS TO ╞ILE╠ENGTH % ├LUSTER╠ENGTH
  781. (SEE NOTE BELOW).
  782.  
  783. % COPY╞ILE├LUSTER = *  ;( CLUSTER, LFN, TRANS═ODE ) : .├╙=ERR
  784.  
  785. ╥EAD THE CLUSTER AND SETUP TO COPY THE WHOLE CLUSTER TO THE ├┬═ FILE.
  786.  
  787. %    LDA CLUSTER
  788. %    LDY CLUSTER+1
  789. %    JSR READ├LUSTER
  790. %    BCC +
  791. %    RTS
  792. % +  LDA #<CLUSTER┬UF
  793. %    LDY #>CLUSTER┬UF
  794. %    STA CBM─ATA╨TR
  795. %    STY CBM─ATA╨TR+1
  796. %    LDA #0
  797. %    STA CBM─ATA╠EN
  798. %    LDA CLUSTER┬LOCK├OUNT
  799. %    ASL
  800. %    STA CBM─ATA╠EN+1
  801.