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

  1. %
  2.  
  3. ╞ETCH THE NEXT CLUSTER NUMBER OF THE FILE, AND ADJUST THE CLUSTER DATA LENGTH
  4. FOR THE LAST CLUSTER OF THE FILE.
  5.  
  6. %    ;**GET NEXT CLUSTER
  7. %    LDA CLUSTER
  8. %    LDY CLUSTER+1
  9. %    JSR GET╞AT┼NTRY
  10. %    STA CLUSTER
  11. %    STY CLUSTER+1
  12. %    CPY #$05
  13. %    BCC COPY╞ILE├LUSTER─ATA
  14. %    LDA LEN═╠
  15. %    STA CBM─ATA╠EN
  16. %    LDA #$01
  17. %    LDX CLUSTER┬LOCK├OUNT
  18. %    CPX #1
  19. %    BEQ +
  20. %    LDA #$03
  21. % +  AND LEN═╠+1
  22.  
  23. ╘HE FOLLOWING THREE LINES WERE ADDED IN A LAST MINUTE PANIC AFTER REALIZING
  24. THAT IF ╞ILE╠ENGTH % ├LUSTER╙IZE == 0, THEN THE LAST CLUSTER OF THE FILE
  25. CONTAINS ├LUSTER╙IZE BYTES, NOT ZERO BYTES.
  26.  
  27. %    BNE +
  28. %    LDX LEN═╠
  29. %    BEQ COPY╞ILE├LUSTER─ATA
  30. % +  STA CBM─ATA╠EN+1
  31. %
  32. %    COPY╞ILE├LUSTER─ATA = *
  33. %    JSR COMMIE╧UT
  34. %    RTS
  35. %
  36.  
  37. ├OPY THE FILE DATA IN THE ═╙-─╧╙ CLUSTER BUFFER TO THE ├┬═ OUTPUT FILE.
  38.  
  39. % CBM─ATA╠IMIT = $66
  40. %
  41. % COMMIE╧UT = *  ;( CBM─ATA╨TR, CBM─ATA╠EN ) : .├╙=ERR
  42.  
  43. ╔F THE THE LOGICAL FILE NUMBER TO COPY TO IS 0 ("NULL DEVICE"), THEN DON'T
  44. BOTHER COPYING ANYTHING.
  45.  
  46. %    LDX LFN
  47. %    BNE +
  48. %    CLC
  49. %    RTS
  50.  
  51. ╧THERWISE, PREPARE THE LOGICAL FILE NUMBER FOR OUTPUT.
  52.  
  53. % +  JSR KERNEL├HKOUT
  54. %    BCC COMMIE╧UT═ORE
  55. %    STA ERRNO
  56. %    RTS
  57. %
  58.  
  59. ╨ROCESS THE CLUSTER DATA IN CHUNKS OF UP TO 255 BYTES OR THE NUMBER OF DATA
  60. BYTES REMAINING IN THE CLUSTER.
  61.  
  62. %    COMMIE╧UT═ORE = *
  63. %    LDA #255
  64. %    LDX CBM─ATA╠EN+1
  65. %    BNE +
  66. %    LDA CBM─ATA╠EN
  67. % +  STA CBM─ATA╠IMIT
  68. %    LDY #0
  69. % -  LDA (CBM─ATA╨TR),Y
  70. %    BIT TRANS═ODE
  71. %    BPL +
  72.  
  73. ╔F WE HAVE TO TRANSLATE THE CURRENT ┴╙├╔╔ CHARACTER, LOOK UP THE ╨┼╘╙├╔╔ VALUE
  74. IN THE TRANSLATION TABLE AND OUTPUT THAT VALUE.  ╔F THE TRANSLATION TABLE
  75. ENTRY VALUE IS $00, THEN DON'T OUTPUT A CHARACTER (FILTER OUT INVALID
  76. CHARACTER CODES).
  77.  
  78. %    TAX
  79. %    LDA TRANS┬UF,X
  80. %    BEQ COMMIE╬EXT
  81. % +  JSR KERNEL├HROUT
  82. %    COMMIE╬EXT = *
  83. %    INY
  84. %    CPY CBM─ATA╠IMIT
  85. %    BNE -
  86. %
  87.  
  88. ╔NCREMENT THE CLUSTER BUFFER POINTER AND DECREMENT THE CLUSTER BUFFER CHARACTER
  89. COUNT ACCORDING TO THE NUMBER OF BYTES JUST PROCESSED, AND REPEAT THE ABOVE IF
  90. MORE FILE DATA REMAINS IN THE CURRENT CLUSTER.
  91.  
  92. %    CLC
  93. %    LDA CBM─ATA╨TR
  94. %    ADC CBM─ATA╠IMIT
  95. %    STA CBM─ATA╨TR
  96. %    BCC +
  97. %    INC CBM─ATA╨TR+1
  98. % +  SEC
  99. %    LDA CBM─ATA╠EN
  100. %    SBC CBM─ATA╠IMIT
  101. %    STA CBM─ATA╠EN
  102. %    BCS +
  103. %    DEC CBM─ATA╠EN+1
  104. % +  LDA CBM─ATA╠EN
  105. %    ORA CBM─ATA╠EN+1
  106. %    BNE COMMIE╧UT═ORE
  107.  
  108. ╔F WE ARE FINISHED WITH THE CLUSTER, THEN CLEAR THE ├┬═ ╦ERNAL OUTPUT CHANNEL.
  109.  
  110. %    JSR KERNEL├LRCHN
  111. %    CLC
  112. %    RTS
  113. %
  114.  
  115. ╘HE FILE COPYING MAIN ROUTINE.  ╙ET UP FOR THE STARTING CLUSTER, AND CALL
  116. THE CLUSTER COPYING ROUTINE UNTIL END-OF-FILE IS REACHED.  ├HECKS FOR A
  117. ╬╒╠╠ CLUSTER POINTER IN THE DIRECTORY ENTRY TO HANDLE ZERO-LENGTH FILES.
  118.  
  119. % MS╥EAD = *  ;( CLUSTER, LEN═╠, .┴=TRANS═ODE, .╪=LFN ) : .├╙=ERR
  120. %    LDY #$0E
  121. %    STY $FF00
  122. %    STA TRANS═ODE
  123. %    STX LFN
  124. %    LDA START├LUSTER
  125. %    LDY START├LUSTER+1
  126. %    STA CLUSTER
  127. %    STY CLUSTER+1
  128. %    JMP +
  129. % -  JSR COPY╞ILE├LUSTER
  130. %    BCC +
  131. %    RTS
  132. % +  LDA CLUSTER+1
  133. %    CMP #$05
  134. %    BCC -
  135. %    CLC
  136. %    RTS
  137. %
  138. % IN╠FN = $50
  139. % GENERATE╠F = $51
  140. % CBM─ATA═AX = $52
  141. % REACHED┼OF = $54
  142. % PREV╙T = $55
  143. %
  144.  
  145. ╙ET THE TRANSLATION AND INPUT LOGICAL FILE NUMBER AND SET UP FOR READING
  146. FROM A ├┬═-╦ERNAL INPUT FILE.
  147.  
  148. % COMMIE╔N╔NIT = *  ;( .┴=TRANS═ODE, .╪=IN╠FN )
  149. %    STA TRANS═ODE
  150. %    STX IN╠FN
  151. %    LDA #0
  152. %    STA GENERATE╠F
  153. %    STA REACHED┼OF
  154. %    STA PREV╙T
  155. %    RTS
  156. %
  157.  
  158. ╥EAD UP TO "CBM─ATA═AX" BYTES INTO THE SPECIFIED BUFFER FROM THE ESTABLISHED
  159. ├┬═ LOGICAL FILE NUMBER.  ╘HE NUMBER OF BYTES READ IS RETURNED IN
  160. "CBM─ATA╠EN".  ╔F END OF FILE OCCURS, "CBM─ATA╠EN" WILL BE ZERO AND THE .┌
  161. FLAG WILL BE SET.  ╥EGULAR ERROR RETURN.
  162.  
  163. % COMMIE╔N = *  ;( CBM─ATA╨TR++, CBM─ATA═AX ) : CBM─ATA╠EN, .├╙=ERR, .┌=EOF
  164.  
  165. ┼STABLISH INPUT FILE, OR RETURN IMMEDIATELY IF ALREADY PAST EOF.
  166.  
  167. %    LDA #0
  168. %    STA CBM─ATA╠EN
  169. %    STA CBM─ATA╠EN+1
  170. %    LDX REACHED┼OF
  171. %    BEQ +
  172. %    LDA #0
  173. %    CLC
  174. %    RTS
  175. % +  LDX IN╠FN
  176. %    JSR KERNEL├HKIN
  177. %    BCC COMMIE╔N═ORE
  178. %    STA ERRNO
  179. %    RTS
  180. %
  181.  
  182. ╥EAD NEXT CHUNK OF UP TO 255 BYTES INTO INPUT BUFFER.
  183.  
  184. %    COMMIE╔N═ORE = *
  185. %    LDA #255
  186. %    LDX CBM─ATA═AX+1
  187. %    BNE +
  188. %    LDA CBM─ATA═AX
  189. % +  STA CBM─ATA╠IMIT
  190. %    LDY #0
  191. % -  JSR COMMIE╔N┬YTE
  192. %    BCC +
  193. %    RTS
  194. % +  BEQ +
  195. %    STA (CBM─ATA╨TR),Y
  196. %    INY
  197. %    CPY CBM─ATA╠IMIT
  198. %    BNE -
  199. %
  200.  
  201. ╨REPARE TO READ ANOTHER CHUNK, OR EXIT.
  202.  
  203. % +  STY CBM─ATA╠IMIT
  204. %    CLC
  205. %    LDA CBM─ATA╨TR
  206. %    ADC CBM─ATA╠IMIT
  207. %    STA CBM─ATA╨TR
  208. %    BCC +
  209. %    INC CBM─ATA╨TR+1
  210. % +  CLC
  211. %    LDA CBM─ATA╠EN
  212. %    ADC CBM─ATA╠IMIT
  213. %    STA CBM─ATA╠EN
  214. %    BCC +
  215. %    INC CBM─ATA╠EN+1
  216. % +  SEC
  217. %    LDA CBM─ATA═AX
  218. %    SBC CBM─ATA╠IMIT
  219. %    STA CBM─ATA═AX
  220. %    BCS +
  221. %    DEC CBM─ATA═AX+1
  222. % +  LDA REACHED┼OF
  223. %    BNE +
  224. %    LDA CBM─ATA═AX
  225. %    ORA CBM─ATA═AX+1
  226. %    BNE COMMIE╔N═ORE
  227.  
  228. ╙HUT DOWN READING AND EXIT.
  229.  
  230. % +  JSR KERNEL├LRCHN
  231. %    LDA CBM─ATA╠EN
  232. %    ORA CBM─ATA╠EN+1
  233. %    CLC
  234. %    RTS
  235. %
  236.  
  237. ╥EAD A SINGLE BYTE FROM THE ├┬═-╦ERNAL INPUT LOGICAL FILE NUMBER.  ╘RANSLATE
  238. CHARACTER INTO ┴╙├╔╔ AND EXPAND ├╥ INTO ├╥+╠╞ IF NECESSARY.  ╥ETURN ┼╧╞ IF
  239. PREVIOUS CHARACTER RETURNED WAS LAST FROM DISK INPUT CHANNEL.
  240.  
  241. % COMMIE╔N┬YTE = *  ;( ) : .┴=CHAR, .├╙=ERR, .┌=EOF, REACHED┼OF
  242. %    ;** CHECK FOR ALREADY PAST EOF
  243. %    LDA REACHED┼OF
  244. %    BEQ +
  245. %    BRK
  246. %    ;** CHECK FOR GENERATED LINEFEED
  247. % +  LDA GENERATE╠F
  248. %    BEQ +
  249. %    LDA #0
  250. %    STA GENERATE╠F
  251. %    LDA #$0A
  252. %    CLC
  253. %    RTS
  254. %    ;** CHECK FOR EOF
  255. % +  LDA PREV╙T
  256. %    AND #$40
  257. %    BEQ +
  258. %    LDA #$FF
  259. %    STA REACHED┼OF
  260. %    LDA #0
  261. %    CLC
  262. %    RTS
  263. %    ;** READ ACTUAL CHARACTER
  264. % +  JSR KERNEL├HRIN
  265. %    LDX ST
  266. %    STX PREV╙T
  267. %    BCC +
  268. %    STA ERRNO
  269. %    JSR KERNEL├LRCHN
  270. %    RTS
  271. %    ;** TRANSLATE IF NECESSARY
  272. % +  BIT TRANS═ODE
  273. %    BPL +
  274. %    TAX
  275. %    LDA TRANS┬UF╘O┴SCII,X
  276. %    BEQ COMMIE╔N┬YTE
  277.  
  278. ╬OTE HERE THAT THE TRANSLATED CHARACTER IS CHECKED TO SEE IF IT IS A CARRIAGE
  279. RETURN, RATHER THAN CHECKING THE NON-TRANSLATED CHARACTER, TO SEE IF A
  280. LINEFEED MUST BE GENERATED NEXT.  ╘HUS, YOU COULD DEFINE THAT A ├OMMODORE
  281. CARRIAGE RETURN BE TRANSLATED INTO A LINEFEED (FOR ╒NIX) AND NO ADDITIONAL
  282. UNWANTED LINEFEED WOULD BE GENERATED.
  283.  
  284. %    CMP #$0D
  285. %    BNE +
  286. %    STA GENERATE╠F
  287. %    ;** EXIT
  288. % +  LDX #$FF
  289. %    CLC
  290. %    RTS
  291. %
  292. % FIRST╞REE╞AT┼NTRY = $5A
  293. %
  294.  
  295. ╙EARCH ╞┴╘ FOR A FREE CLUSTER, AND RETURN THE CLUSTER (╞┴╘ ENTRY) NUMBER.  ┴
  296. GLOBAL VARIABLE "FIRST╞REE╞AR┼NTRY" IS MAINTAINED WHICH POINTS TO THE FIRST
  297. ╞┴╘ ENTRY THAT COULD POSSIBLY BE FREE, TO AVOID WASTING TIME SEARCHING FROM
  298. THE VERY BEGINNING OF THE ╞┴╘ EVERY TIME.  ├LUSTERS ARE ALLOCATED IN
  299. FIRST-FREE ORDER.
  300.  
  301. % ALLOCATE╞AT┼NTRY = *  ;( ) : .┴┘=FAT┼NTRY, .├╙=ERR
  302. % -  LDA FIRST╞REE╞AT┼NTRY
  303. %    CMP LAST╞AT┼NTRY
  304. %    LDA FIRST╞REE╞AT┼NTRY+1
  305. %    SBC LAST╞AT┼NTRY+1
  306. %    BCC +
  307. %    RTS
  308. % +  LDA FIRST╞REE╞AT┼NTRY
  309. %    LDY FIRST╞REE╞AT┼NTRY+1
  310. %    JSR GET╞AT┼NTRY
  311. %    STY 2
  312. %    ORA 2
  313. %    BNE +
  314. %    LDA FIRST╞REE╞AT┼NTRY
  315. %    LDY FIRST╞REE╞AT┼NTRY+1
  316. %    CLC
  317. %    RTS
  318. % +  INC FIRST╞REE╞AT┼NTRY
  319. %    BNE -
  320. %    INC FIRST╞REE╞AT┼NTRY+1
  321. %    JMP -
  322. %
  323. % MS╞ILE╠ENGTH = $5C  ;(3 BYTES)
  324. %
  325.  
  326. ┴LLOCATE A NEW CLUSTER TO A FILE, LINK IT INTO THE FILE CLUSTER CHAIN, AND
  327. WRITE THE CLUSTER BUFFER TO DISK IN THAT CLUSTER, ADDING "CBM─ATA╠EN" BYTES
  328. TO THE FILE.
  329.  
  330. % MS╫RITE├LUSTER = *  ; (*) : .├╙=ERR
  331. %    ;** GET A NEW CLUSTER
  332. %    JSR ALLOCATE╞AT┼NTRY
  333. %    BCC +
  334. %    RTS
  335. %    ;** MAKE PREVIOUS FAT ENTRY POINT TO NEW CLUSTER
  336. % +  STA FAT╓ALUE
  337. %    STY FAT╓ALUE+1
  338. %    LDA CLUSTER
  339. %    ORA CLUSTER+1
  340. %    BEQ +
  341. %    LDA CLUSTER
  342. %    LDY CLUSTER+1
  343. %    LDX FAT╓ALUE
  344. %    STX CLUSTER
  345. %    LDX FAT╓ALUE+1
  346. %    STX CLUSTER+1
  347. %    JSR SET╞AT┼NTRY
  348. %    JMP MS├LUSTER╬EW
  349.  
  350. ╚ANDLE CASE OF NO PREVIOUS CLUSTER - MAKE DIRECTORY ENTRY POINT TO NEW
  351. CLUSTER.
  352.  
  353. % +  LDA WRITE─IRENT
  354. %    LDY WRITE─IRENT+1
  355. %    STA 2
  356. %    STY 3
  357. %    LDY #26
  358. %    LDA FAT╓ALUE
  359. %    STA (2),Y
  360. %    STA CLUSTER
  361. %    INY
  362. %    LDA FAT╓ALUE+1
  363. %    STA (2),Y
  364. %    STA CLUSTER+1
  365. %
  366. %    ;** MAKE NEW FAT ENTRY POINT TO NULL
  367. %    MS├LUSTER╬EW = *
  368. %    LDA #$FF
  369. %    LDY #$0F
  370. %    STA FAT╓ALUE
  371. %    STY FAT╓ALUE+1
  372. %    LDA CLUSTER
  373. %    LDY CLUSTER+1
  374. %    JSR SET╞AT┼NTRY
  375. %    ;** WRITE NEW CLUSTER DATA
  376. % +  LDA CLUSTER
  377. %    LDY CLUSTER+1
  378. %    JSR WRITE├LUSTER
  379. %    BCC +
  380. %    RTS
  381. %    ;** ADD CLUSTER LENGTH TO FILE LENGTH
  382. % +  CLC
  383. %    LDA MS╞ILE╠ENGTH
  384. %    ADC CBM─ATA╠EN
  385. %    STA MS╞ILE╠ENGTH
  386. %    LDA MS╞ILE╠ENGTH+1
  387. %    ADC CBM─ATA╠EN+1
  388. %    STA MS╞ILE╠ENGTH+1
  389. %    BCC +
  390. %    INC MS╞ILE╠ENGTH+2
  391. % +  CLC
  392. %    RTS
  393. %
  394.  
  395. ├OPY A ├┬═-╦ERNAL FILE TO AN ═╙-─╧╙ FILE, POSSIBLY WITH TRANSLATION.
  396.  
  397. % MS╫RITE = *  ;( MS─EVICE, MS╘YPE, WRITE─IRENT, .┴=TRANS, .╪=CBM╠FN ) :.├╙=ERR
  398. %    LDY #$0E
  399. %    STY $FF00
  400. %    ;** INITIALIZE
  401.  
  402. ╙ET INPUT FILE TRANSLATION AND LOGICAL FILE NUMBER, INIT CLUSTER, FILE LENGTH,
  403. ╞┴╘ ALLOCATION FIRST FREE POINTER (TO CLUSTER #2, THE FIRST DATA CLUSTER).
  404.  
  405. %    JSR COMMIE╔N╔NIT
  406. %    LDA #0
  407. %    STA CLUSTER
  408. %    STA CLUSTER+1
  409. %    STA FIRST╞REE╞AT┼NTRY+1
  410. %    STA MS╞ILE╠ENGTH
  411. %    STA MS╞ILE╠ENGTH+1
  412. %    STA MS╞ILE╠ENGTH+2
  413. %    LDA #2
  414. %    STA FIRST╞REE╞AT┼NTRY
  415. %
  416. %    ;** COPY CLUSTER FROM CBM FILE
  417. % -  LDA #<CLUSTER┬UF
  418. %    LDY #>CLUSTER┬UF
  419. %    STA CBM─ATA╨TR
  420. %    STY CBM─ATA╨TR+1
  421. %    LDA CLUSTER┬LOCK├OUNT
  422. %    ASL
  423. %    TAY
  424. %    LDA #0
  425. %    STA CBM─ATA═AX
  426. %    STY CBM─ATA═AX+1
  427. %    JSR COMMIE╔N
  428. %    BCC +
  429. %    RTS
  430. % +  BEQ +
  431. %    JSR MS╫RITE├LUSTER
  432. %    BCC -
  433. %    RTS
  434. %
  435. %    ;** WRAP UP AFTER WRITING - SET FILE LENGTH, DIRTY FLAG, EXIT.
  436. % +  LDA WRITE─IRENT
  437. %    LDY WRITE─IRENT+1
  438. %    STA 2
  439. %    STY 3
  440. %    LDX #0
  441. %    LDY #28
  442. % -  LDA MS╞ILE╠ENGTH,X
  443. %    STA (2),Y
  444. %    INY
  445. %    INX
  446. %    CPX #3
  447. %    BCC -
  448. %    JSR DIRTY─IRENT
  449. %    CLC
  450. %    RTS
  451. %
  452.  
  453. ╘HIS LEVEL DEALS EXCLUSIVELY WITH ├OMMODORE FILES.
  454.  
  455. % ;===== COMMODORE FILE LEVEL =====
  456. %
  457.  
  458. ├OPY FROM AN INPUT DISK LOGICAL FILE NUMBER TO AN OUTPUT LFN, IN UP TO 1024
  459. BYTE CHUNKS.  ╘HIS ROUTINE MAKES USE OF THE EXISTING "COMMIE╔N" AND
  460. "COMMIE╧UT" ROUTINES.  ╬O FILE TRANSLATION IS AVAILABLE; BINARY TRANSLATION IS
  461. USED FOR BOTH COMMIE╔N AND COMMIE╧UT.
  462.  
  463. % CBM├OPY = *  ;( .┴=IN╠FN, .╪=OUT╠FN )
  464. %    LDY #$0E
  465. %    STY $FF00
  466. %    STX LFN
  467. %    TAX
  468. %    LDA #0
  469. %    JSR COMMIE╔N╔NIT
  470. % -  LDA #<CLUSTER┬UF
  471. %    LDY #>CLUSTER┬UF
  472. %    STA CBM─ATA╨TR
  473. %    STY CBM─ATA╨TR+1
  474. %    LDA #<1024
  475. %    LDY #>1024
  476. %    STA CBM─ATA═AX
  477. %    STY CBM─ATA═AX+1
  478. %    JSR COMMIE╔N
  479. %    BCS +
  480. %    BEQ +
  481. %    LDA #<CLUSTER┬UF
  482. %    LDY #>CLUSTER┬UF
  483. %    STA CBM─ATA╨TR
  484. %    STY CBM─ATA╨TR+1
  485. %    JSR COMMIE╧UT
  486. %    BCS +
  487. %    JMP -
  488. % +  RTS
  489. %
  490.  
  491. ╥EAD A SINGLE DIRECTORY ENTRY FROM THE GIVEN LOGICAL FILE NUMBER, WHICH IS
  492. ASSUMED TO BE OPEN FOR READING A DIRECTORY ("$").  ╘HE DATA OF THE DIRECTORY
  493. ENTRY ARE RETURNED IN THE INTERFACE VARIABLES.
  494.  
  495. % CBM─IRENT = *  ;( .┴=LFN )
  496.  
  497. ╔NITIALIZE.
  498.  
  499. %    LDY #$0E
  500. %    STY $FF00
  501. %    TAX
  502. %    JSR KERNEL├HKIN
  503. %    BCC +
  504. %    CDIR┼RR = *
  505. %    LDA #0
  506. %    STA CDIR╞LEN
  507. %    STA CDIR┬LOCKS
  508. %    STA CDIR┬LOCKS+1
  509. %    RTS
  510. %    ;** GET BLOCK COUNT
  511. % +  JSR CDIR╟ETCH
  512. %    JSR CDIR╟ETCH
  513. %    JSR CDIR╟ETCH
  514. %    STA CDIR┬LOCKS
  515. %    JSR CDIR╟ETCH
  516. %    STA CDIR┬LOCKS+1
  517. %    ;** LOOK FOR FILENAME
  518. %    LDA #0
  519. %    STA CDIR╞LEN
  520. % -  JSR CDIR╟ETCH
  521. %    CMP #34
  522. %    BEQ +
  523. %    CMP #"B"
  524. %    BNE -
  525. %    JSR KERNEL├LRCHN
  526. %    RTS
  527. %    ;** GET FILENAME
  528. % +  LDY #0
  529. % -  JSR CDIR╟ETCH
  530. %    CMP #34
  531. %    BEQ +
  532. %    STA CDIR╬AME,Y
  533. %    INY
  534. %    BNE -
  535. % +  STY CDIR╞LEN
  536.  
  537. ╠OOK FOR AND GET FILE TYPE.
  538.  
  539. % -  JSR CDIR╟ETCH
  540. %    CMP #" "
  541. %    BEQ -
  542. %    STA CDIR╘YPE
  543.  
  544. ╙CAN FOR END OF DIRECTORY ENTRY, RETURN.
  545.  
  546. % -  JSR CDIR╟ETCH
  547. %    CMP #0
  548. %    BNE -
  549. %    JSR KERNEL├LRCHN
  550. %    RTS
  551. %
  552.  
  553. ╟ET A SINGLE CHARACTER OF THE DIRECTORY ENTRY, WATCHING FOR END OF FILE (WHICH
  554. WOULD INDICATE ERROR HERE).
  555.  
  556. % CDIR╟ETCH = *
  557. %    JSR KERNEL├HRIN
  558. %    BCS +
  559. %    BIT ST
  560. %    BVS +
  561. %    RTS
  562. % +  PLA
  563. %    PLA
  564. %    JSR KERNEL├LRCHN
  565. %    JMP CDIR┼RR
  566. %
  567. % ;===== DATA =====
  568. %
  569.  
  570. ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ┴╙├╔╔ TO ╨┼╘╙├╔╔.  ┘OU CAN
  571. MODIFY IT TO SUIT YOUR NEEDS IF YOU WISH.  ╔F YOU CANNOT REASSEMBLE THIS FILE,
  572. THEN YOU CAN SIFT THROUGH THE BINARY FILE AND LOCATE THE TABLE AND CHANGE IT
  573. THERE.  ┴N ENTRY OF $00 MEANS THE CORRESPONDING ┴╙├╔╔ CHARACTER WILL NOT BE
  574. TRANSLATED.  ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING
  575. ┴╙├╔╔ CONTROL CHARACTERS INTO ╨┼╘╙├╔╔: ┬ACKSPACE, ╘AB, ╠INEFEED (├╥), AND
  576. ╞ORMFEED.  ╔ ALSO TRANSLATE THE NON-╨┼╘╙├╔╔ CHARACTERS SUCH AS {, |, ~, AND _
  577. ACCORDING TO WHAT THEY PROBABLY WOULD HAVE BEEN IF ├OMMODORE WASN'T SO
  578. CONCERNED WITH THE GRAPHICS CHARACTERS.
  579.  
  580. % TRANS┬UF = *
  581. %        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  582. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$14,$09,$0D,$00,$93,$00,$00,$00 ;0
  583. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
  584. % .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  585. % .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  586. % .BYTE $40,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ;4
  587. % .BYTE $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$5B,$5C,$5D,$5E,$5F ;5
  588. % .BYTE $C0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;6
  589. % .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$DB,$DC,$DD,$DE,$DF ;7
  590. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
  591. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
  592. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
  593. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
  594. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;C
  595. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;D
  596. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
  597. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;F
  598. %
  599.  
  600. ╘HIS IS THE TRANSLATION TABLE USED TO CONVERT FROM ╨┼╘╙├╔╔ TO ┴╙├╔╔.  ┘OU CAN
  601. MODIFY IT TO SUIT YOUR NEEDS, SIMILAR TO THE ┴╙├╔╔ TO ╨┼╘╙├╔╔ TABLE.  ┴N ENTRY
  602. OF $00 MEANS THE CORRESPONDING ╨┼╘╙├╔╔ CHARACTER WILL NOT BE TRANSLATED.
  603. ┘OU'LL NOTICE THAT ╔ HAVE SET UP TRANSLATIONS FOR THE FOLLOWING ╨┼╘╙├╔╔
  604. CONTROL CHARACTERS INTO ┴╙├╔╔: ─ELETE (INTO ┬ACKSPACE), ╘AB, ├ARRIAGE ╥ETURN
  605. (INTO ├╥+╠╞), AND ├LEAR╙CREEN (INTO ╞ORDFEED).  ┴PPROPRIATE TRANSLATIONS INTO
  606. THE ┴╙├╔╔ CHARACTERS {, }, ^, _, ~, \, AND | ARE ALSO SET UP.
  607.  
  608. % TRANS┬UF╘O┴SCII = *
  609. %        ;0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  610. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$00,$00,$00,$0D,$00,$00 ;0
  611. % .BYTE $00,$00,$00,$00,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
  612. % .BYTE $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F ;2
  613. % .BYTE $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F ;3
  614. % .BYTE $40,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F ;4
  615. % .BYTE $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$5B,$5C,$5D,$5E,$5F ;5
  616. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;6
  617. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;7
  618. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
  619. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
  620. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;A
  621. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;B
  622. % .BYTE $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;C
  623. % .BYTE $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$7B,$7C,$7D,$7E,$7F ;D
  624. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;E
  625. % .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$7E ;F
  626. %
  627. % ;====BSS STORAGE (SIZE=11,264 BYTES)====
  628. %
  629.  
  630. ╘HIS IS WHERE THE TRACK CACHE, ETC. ARE STORED.  ╘HIS SECTION REQUIRES 11╦ OF
  631. STORAGE SPACE BUT DOES NOT INCREASE THE LENGTH OF THE BINARY PROGRAM FILE
  632. SINCE THESE STORAGE AREAS ARE ─┼╞╔╬┼─ RATHER THAN ALLOCATED WITH ".BUF"
  633. DIRECTIVES.  ╘HE ╒NIX TERMINOLOGY FOR THIS TYPE OF UNINITIALIZED DATA IS
  634. "BSS".
  635.  
  636. % BSS = *
  637. % TRACKBUF   = BSS
  638. % CLUSTER┬UF = TRACKBUF+4608
  639. % FATBUF     = CLUSTER┬UF+1024
  640. % DIRBUF     = FATBUF+1536
  641. % END        = DIRBUF+4096
  642.  
  643. 5. ╒╙┼╥-╔╬╘┼╥╞┴├┼ ╨╥╧╟╥┴═
  644.  
  645. ╘HIS SECTION PRESENTS THE LISTING OF THE USER-INTERFACE ┬┴╙╔├ PROGRAM.  ┘OU
  646. SHOULD BE AWARE THAT YOU CAN EASILY CHANGE SOME OF THE DEFAULTS TO YOUR OWN
  647. PREFERENCES IF YOU WISH.  ╔N PARTICULAR, YOU MAY WISH TO CHANGE THE "DV" AND
  648. "DT" VARIABLES IN LINES 25 AND 26.  ╘HIS PROGRAM IS NOT LISTED IN THE "%"
  649. FORMAT THAT THE ASSEMBLER LISTING IS SINCE YOU CAN RECOVER THIS LISTING FROM
  650. THE UUENCODED BINARY PROGRAM FILE.  ╘HE LISTING IS HERE IN ITS ENTIRETY.
  651.  
  652. 10 PRINT CHR$(147);"LITTLE RED READER 128 VERSION 1.00"
  653. 11 PRINT : PRINT"BY CRAIG BRUCE 09-FEB-93 FOR C=HACKING" : PRINT
  654. 12 :
  655. 20 CD=PEEK(186):IF CD<8 THEN CD=8 : REM ** DEFAULT CBM-DOS DRIVE **
  656. 25 DV=9:DT=0 :  REM ** MS-DOS DRIVE, TYPE (0=1571,255=1581)
  657. 26 IF DV=CD THEN DV=8:DT=0 : REM ** ALTERNATE MS-DOS DRIVE
  658. 27 :
  659. 30 PRINT "INITIALIZING..." : PRINT
  660. 40 BANK0 : PK=DEC("8000") : PV=PK+30
  661. 50 IF PEEK(PV+0)=DEC("CB") AND PEEK(PV+1)=132 THEN 60
  662. 55 PRINT"LOADING MACHINE LANGUAGE ROUTINES..." : BLOAD"LRR.BIN",U(CD)
  663. 60 POKE PV+3,DV : POKE PV+4,DT : SYS PK
  664. 70 DIM T,R,B,I,A$,C,DT$,FL$,IL$,X,X$
  665. 71 CM$="DMFTC+-Q "+CHR$(13)+CHR$(145)+CHR$(17)+CHR$(157)+CHR$(29)+CHR$(19)
  666. 72 CM$=CM$+CHR$(147)+"/RNX"+CHR$(92)
  667. 75 DL=-1 : CF=-1 : ME=0 : CA=0 : MA=0
  668. 80 DIM DI$(1,300),CL(128),SZ(128),DP(128),CN$(300)
  669. 90 IF DT=255 THEN DT$="1581" :ELSE DT$="1571"
  670. 100 FL$=CHR$(19)+CHR$(17)+CHR$(17)+CHR$(17)+CHR$(17)
  671. 110 IL$=FL$:FORI=1TO19:IL$=IL$+CHR$(17):NEXT
  672. 120 GOTO 500
  673. 130 :
  674. 131 REM ** LOAD MS-DOS DIRECTORY **
  675. 140 PRINT"LOADING MS-DOS DIRECTORY..." : PRINT
  676. 150 SYS PK : SYS PK+3
  677. 160 DL=0
  678. 170 RREG BL,DC,BH,S : E=PEEK(PV+2)
  679. 180 IF (S AND 1) THEN GOSUB 380 : DL=-1 : RETURN
  680. 190 PRINT"SCANNING MS-DOS DIRECTORY..." : PRINT
  681. 200 DB=BL+256*BH
  682. 205 SYS PK+21 : RREG BL,X,BH : MA=BL+BH*256+X*65536
  683. 210 IF DC=0 THEN 360
  684. 220 FOR DP=DB TO DB+32*(DC-1) STEP 32
  685. 230 IF PEEK(DP)=0 OR PEEK(DP)=229 THEN 350
  686. 240 IF PEEK(DP+11) AND 24 THEN 350
  687. 250 DL=DL+1
  688.  
  689. ╠INE 260 SETS THE DEFAULT SELECTION, TRANSLATION, AND FILETYPES FOR ═╙-─╧╙
  690. FILES.  ├HANGE TO YOUR LIKING.
  691.  
  692. 260 D$=RIGHT$(" "+STR$(DL),3)+"     ASC  SEQ  " : REM ** DEFAULT SEL/TR/FT **
  693. 270 A$="" : FORI=0TO10 : A$=A$+CHR$(PEEK(DP+I)) : NEXT
  694. 280 A$=LEFT$(A$,8)+"  "+RIGHT$(A$,3)
  695. 290 PRINT DL; A$
  696. 300 D$=D$+A$+"  "
  697. 310 CL(DL)=PEEK(DP+26)+256*PEEK(DP+27)
  698. 320 SZ=PEEK(DP+28)+256*PEEK(DP+29)+65536*PEEK(DP+30)
  699. 330 DI$(0,DL)=D$+RIGHT$("    "+STR$(SZ),6)
  700. 335 DP(DL)=DP
  701. 340 SZ(DL)=SZ
  702. 350 NEXT DP
  703. 360 RETURN
  704. 370 :
  705. 371 REM ** REPORT MS-DOS DISK ERROR **
  706. 380 PRINT CHR$(18);"MS-DOS DISK ERROR #";MID$(STR$(E),2);
  707. 390 PRINT " ($";MID$(HEX$(E),3);"), PRESS KEY.";CHR$(146)
  708. 400 GETKEY A$ : RETURN
  709. 410 :
  710. 411 REM ** SCREEN HEADING **
  711. 420 PRINT CHR$(147);CHR$(18);
  712. 421 IF ME=0 THEN PRINT"MS-DOS";:X=MA:ELSE PRINT"CBMDOS";:X=CA
  713. 422 PRINT CHR$(146);"  MS=";MID$(STR$(DV),2);":";DT$;
  714. 430 PRINT"  CBM=";MID$(STR$(CD),2);"  FREE=";MID$(STR$(X),2)
  715. 440 PRINT : RETURN
  716. 450 :
  717. 451 REM ** SCREEN FOOTING **
  718. 460 PRINT IL$;"D=DIR M=MSDEV F=CBMDEV C=COPY Q=QUIT   "
  719. 470 PRINT     "T=TOGGLE R=REMOVE X=CBMCPY /=MENU +-=PG";
  720. 480 RETURN
  721. 490 :
  722. 491 REM ** MAIN ROUTINE **
  723. 500 T=1 : C=0
  724. 501 R=0
  725. 510 IF ME=0 THEN MF=DL:MC=2 : ELSE MF=CF:MC=1
  726. 520 GOSUB 420
  727. 521 IF ME<>0 THEN 542
  728. 530 PRINT "NUM  S  TRN  TYP  FILENAME  EXT  LENGTH"
  729. 540 PRINT "---  -  ---  ---  --------  ---  ------"
  730. 541 GOTO 550
  731. 542 PRINT "NUM  S  TRN  FILENAME         T  LENGTH"
  732. 543 PRINT "---  -  ---  ---------------- -  ------"
  733. 550 GOSUB 460
  734. 560 B=T+17 : IF B>MF THEN B=MF
  735. 570 PRINT FL$;: IF T>MF THEN 590
  736. 580 FOR I=T TO B : PRINT DI$(ME,I) : NEXT
  737. 590 IF MF<0 THEN PRINT CHR$(18);"<DIRECTORY NOT LOADED>";CHR$(146)
  738. 591 IF MF=0 THEN PRINT CHR$(18);"<NO FILES>";CHR$(146)
  739. 600 IF MF<=0 THEN 660
  740. 610 PRINT LEFT$(IL$,R+5);CHR$(18);
  741. 620 ON C+1 GOTO 630,640,650
  742. 630 PRINT SPC(4);MID$(DI$(ME,T+R),5,3) : GOTO 660
  743. 640 PRINT SPC(7);MID$(DI$(ME,T+R),8,5) : GOTO 660
  744. 650 PRINT SPC(12);MID$(DI$(ME,T+R),13,5) : GOTO 660
  745. 660 GETKEY A$
  746. 670 I=INSTR(CM$,A$)
  747. 680 IF MF>0 THEN PRINT LEFT$(IL$,R+5);DI$(ME,T+R)
  748. 690 IF I=0 THEN 600
  749. 700 ON I GOTO 760,1050,1110,950,1150,1000,1020,730,860,860,770,790,810,830,850
  750. 705 ON I-15 GOTO 500,713,1400,713,1500,713
  751. 710 STOP
  752. 711 :
  753. 712 REM ** VARIOUS MENU OPTIONS **
  754. 713 ME=-(ME=0)
  755. 714 GOTO500
  756. 730 PRINT CHR$(147);"HAVE AN AWESOME DAY." : BANK15
  757. 740 END
  758. 760 IF ME=1 THEN GOSUB 420 : GOSUB 2500 : GOTO 500
  759. 765 GOSUB 420 : GOSUB 140 : GOTO 500
  760. 770 R=R-1 : IF R<0 THEN R=B-T
  761. 780 GOTO 600
  762. 790 R=R+1 : IF T+R>B THEN R=0
  763. 800 GOTO 600
  764. 810 C=C-1 : IF C<0 THEN C=MC
  765. 820 GOTO 600
  766. 830 C=C+1 : IF C>MC THEN C=0
  767. 840 GOTO 600
  768. 850 R=0 : C=0 : GOTO 600
  769. 860 IF MF<=0 THEN 600
  770. 870 X=T+R : ON C+1 GOSUB 890,910,930
  771. 880 PRINT LEFT$(IL$,R+5);DI$(ME,X) : GOTO 600
  772. 890 IF MID$(DI$(ME,X),6,1)=" " THEN X$="*" :ELSE X$=" "
  773. 900 MID$(DI$(ME,X),6,1)=X$ : RETURN
  774. 910 IF MID$(DI$(ME,X),9,1)="A" THEN X$="BIN" :ELSE X$="ASC"
  775. 920 MID$(DI$(ME,X),9,3)=X$ : RETURN
  776. 930 IF MID$(DI$(ME,X),14,1)="S" THEN X$="PRG" :ELSE X$="SEQ"
  777. 940 MID$(DI$(ME,X),14,3)=X$ : RETURN
  778. 950 IF MF<=0 THEN 600
  779. 960 FOR X=1 TO MF
  780. 970 ON C+1 GOSUB 890,910,930
  781. 980 NEXT X
  782. 990 GOTO 520
  783. 1000 R=0:IF B=MF THEN T=1 : GOTO 510
  784. 1010 T=T+18 : GOTO 510
  785. 1020 IF MF<=0 THEN 660
  786. 1025 R=0:IF T=1 THEN T=MF-(MF-INT(MF/18)*18)+1 : IF T<=MF THEN 510
  787. 1030 T=T-18 : IF T<1 THEN T=1
  788. 1040 GOTO 510
  789. 1050 PRINT IL$;CHR$(27);"@";
  790. 1060 INPUT"MS-DOS DEVICE NUMBER (8-30)";DV
  791. 1061 IF CD=DV THENPRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1060
  792. 1070 X=71 : INPUT"MS-DOS DEVICE TYPE  (71/81)";X
  793. 1080 IF X=8 OR X=81 OR X=1581 THEN DT=255:DT$="1581" :ELSE DT=0:DT$="1571"
  794. 1090 POKE PV+3,DV : POKE PV+4,DT : SYS PK : DL=-1 : MA=0
  795. 1100 GOTO 500
  796. 1110 PRINT IL$;CHR$(27);"@";
  797. 1120 INPUT "CBM-DOS DEVICE NUMBER (0-30)";CD
  798. 1130 IF CD=DV THENPRINT"MS-DOS AND CBM-DOS DEVICES MUST BE DIFFERENT!":GOTO1120
  799. 1140 CF=-1 : CA=0 : GOTO 500
  800. 1141 :
  801.