home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / DISKROMSOURCE4.SDA / DISK / ROM8 (.txt) < prev    next >
Encoding:
Commodore BASIC  |  2019-04-13  |  18.8 KB  |  887 lines

  1. 1 JMP $D586; READ BAM TERM ROUT
  2. 3 AND #$0F; SET BAM CMND NUM
  3. 5 STA $F9
  4. 7 RTS
  5. 9 LDA #$06; BAM CHANNEL NUM
  6. 11 LDX $7F; DRV NUM
  7. 13 BNE $F118
  8. 15 CLC
  9. 17 ADC #$07; BAM CHANNEL DRV # 1
  10. 19 RTS
  11. 21 JSR $F10F
  12. 23 TAX
  13. 25 RTS
  14. 27 ; ** FIND NEXT AVAIL TRK & SECT **
  15. 29 JSR $DE3E; SET TRK & SEC FROM MOST RECENT HDR
  16. 31 LDA #$03
  17. 33 STA $6F; TEMP WORK
  18. 35 LDA #$01
  19. 37 ORA $02F9; DONT WRITE BAM FLAG
  20. 39 STA $02F9; PREVENT BAM WRITE
  21. 41 LDA $6F
  22. 43 PHA
  23. 45 JSR $F011; SET BAM IMAGE IN MEM
  24. 47 PLA
  25. 49 STA $6F
  26. 51 LDA ($6D),Y; BAM PTR
  27. 53 BNE $F173; NO SECTS FREE
  28. 55 LDA $80; TRK NUM BUFF
  29. 57 CMP $FE85; #$12 DIRECTORY TRK
  30. 59 BEQ $F15A
  31. 61 BCC $F15F; LESS THAN #$12
  32. 63 INC $80
  33. 65 LDA $80
  34. 67 CMP $FED7; #$24 MAX TRK + 1
  35. 69 BNE $F12D
  36. 71 LDX $FE85
  37. 73 DEX
  38. 75 STX $80
  39. 77 LDA #$00
  40. 79 STA $81; SECT NUM BUFF
  41. 81 DEC $6F
  42. 83 BNE $F12D
  43. 85 LDA #$72; CODE DISK FULL
  44. 87 JSR $C1C8; ERROR HANDLING
  45. 89 DEC $80; TRK NUM
  46. 91 BNE $F12D; CHK NEXT TRK
  47. 93 LDX $FE85; #$12 DIRECTORY TRK
  48. 95 INX
  49. 97 STX $80
  50. 99 LDA #$00
  51. 101 STA $81; SECT NUM BUFF
  52. 103 DEC $6F
  53. 105 BNE $F12D
  54. 107 BEQ $F15A; DISK FULL
  55. 109 ; ** FIND OPTIMUM NEXT SECT (+ 10) THIS TRK **
  56. 111 ; NORMAL INCREMENT ON DIRECTORY TRK IS 4 OTHERS 10
  57. 113 LDA $81; SECT NUM BUFF
  58. 115 CLC
  59. 117 ADC $69; #$0A SECT INCREMENT
  60. 119 STA $81
  61. 121 LDA $80; TRK NUM BUFF
  62. 123 JSR $F24B; FIND MAX SECT
  63. 125 STA $024E; TEMP WORK FOR BEST SEC
  64. 127 STA $024D; TEMP CMND NUM
  65. 129 CMP $81
  66. 131 BCS $F195; NEW SECT LESS THAN MAX
  67. 133 SEC
  68. 135 LDA $81
  69. 137 SBC $024E
  70. 139 STA $81
  71. 141 BEQ $F195
  72. 143 DEC $81; SECT NUM
  73. 145 JSR $F1FA; PUT BAM IN MEM
  74. 147 BEQ $F19D; NO SECT AVAIL
  75. 149 JMP $EF90; SET NEW SECT USED IN BAM
  76. 151 LDA #$00
  77. 153 STA $81
  78. 155 JSR $F1FA
  79. 157 BNE $F19A
  80. 159 JMP $F1F5; ABORT ROUT
  81. 161 ; ** FIND OPTIMUM INITIAL TRK & SECT **
  82. 163 LDA #$01
  83. 165 ORA $02F9; DONT WRITE BAM FLAG
  84. 167 STA $02F9; BAMWRITE PENDING
  85. 169 LDA $86; TEMP RESULT
  86. 171 PHA
  87. 173 LDA #$01
  88. 175 STA $86
  89. 177 LDA $FE85; #$12 DIRECTORY TRK
  90. 179 SEC
  91. 181 SBC $86; TRK CTR
  92. 183 STA $80; TRK NUM BUFF
  93. 185 BCC $F1CB; LESS THAN 0
  94. 187 BEQ $F1CB; EQUAL TO 0
  95. 189 JSR $F011; SET PTR TO BAM
  96. 191 LDA ($6D),Y; NUM OF FREE BLKS
  97. 193 BNE $F1E6; SECTS FREE THIS TRK
  98. 195 LDA $FE85; #$12 DIRECTORY TRK
  99. 197 CLC
  100. 199 ADC $86
  101. 201 STA $80; TRK NUM
  102. 203 INC $86
  103. 205 CMP $FED7; #$24 MAX TRK + 1
  104. 207 BCC $F1DF
  105. 209 LDA #$67; CODE SYSTEM TRK/SECT ERROR
  106. 211 JSR $E645; ERROR HANDLING
  107. 213 JSR $F011; SET PTR TO BAM
  108. 215 LDA ($6D),Y; NUM FREE BLKS
  109. 217 BEQ $F1B8; NO SECTS THIS TRK
  110. 219 PLA
  111. 221 STA $86; TRK CTR
  112. 223 LDA #$00
  113. 225 STA $81; SECT NUM
  114. 227 JSR $F1FA; SET BAM FIND 1ST AVAIL SEC
  115. 229 BEQ $F1F5; NO SECT
  116. 231 JMP $EF90; MARK SECT USED IN BAM
  117. 233 LDA #$71; CODE ERROR IN BAM
  118. 235 JSR $E645; ERROR HANDLING
  119. 237 ; ** SET BAM FIND FIRST AVAIL SECT **
  120. 239 JSR $F011; SET PTR TO BAM
  121. 241 TYA
  122. 243 PHA
  123. 245 JSR $F220; VALIDATE BIT MAP
  124. 247 LDA $80; TRK NUM BUFF
  125. 249 JSR $F24B; FIND MAX SEC THIS TRK
  126. 251 STA $024E; TEMP WORK BEST SECT
  127. 253 PLA
  128. 255 STA $6F; TEMP WORK
  129. 257 LDA $81; SECT NUM
  130. 259 CMP $024E
  131. 261 BCS $F21D; SECT NUM TOO LARGE
  132. 263 JSR $EFD5; CALCULATE INDEX IN BAM
  133. 265 BNE $F21F; SECT FREE
  134. 267 INC $81
  135. 269 BNE $F20D; FORCED BRANCH
  136. 271 LDA #$00
  137. 273 RTS
  138. 275 ; ** VALIDATE BIT MAP **
  139. 277 LDA $6F
  140. 279 PHA
  141. 281 LDA #$00
  142. 283 STA $6F; TEMP WORK
  143. 285 LDY $FE86; #$04 # BYTES/TRK IN BAM
  144. 287 DEY:LDX #$07; BIT CTR
  145. 289 LDA ($6D),Y; BAM BYTE THIS TRK
  146. 291 AND $EFE9,X; BIT MASK TABLE
  147. 293 BEQ $F236; SECT ALLOCATED
  148. 295 INC $6F; SECT FREE INC COUNT
  149. 297 DEX; DEC BIT COUNT 1 BIT/SECT
  150. 299 BPL $F22D
  151. 301 DEY; BUTE CTR 8 SEC/BYTE
  152. 303 BNE $F22B
  153. 305 LDA ($6D),Y; NUM OF BYTES FREE THIS TRK
  154. 307 CMP $6F
  155. 309 BNE $F246; ERROR
  156. 311 PLA
  157. 313 STA $6F
  158. 315 RTS
  159. 317 LDA #$71; CODE ERROR IN BAM
  160. 319 JSR $E645; ERROR HANDLING
  161. 321 ; ** GET NUM OF SECTS ALLOWED A TRK **
  162. 323 ; A = NUM OF SECTS ON RETURN
  163. 325 LDX $FED6; #$04 NUM OF ZONES
  164. 327 CMP $FED6,X; ZONE BOUNDRIES + 1
  165. 329 DEX
  166. 331 BCS $F24E; MORE
  167. 333 LDA $FED1,X; NUM OF SEC/TRK
  168. 335 RTS
  169. 337 ; ** KILL PROTECTION DOES NOTHING **
  170. 339 RTS
  171. 341 ; ** DISK CONTROLLER ROUTS **
  172. 343 ; ** CONTROLLER INITIALIZATION **
  173. 345 LDA $6F; 01101111
  174. 347 STA $1C02; DATA DIRECTION PORT B
  175. 349 AND #$F0; TURN OFF MOTOR & LED PHASE = A
  176. 351 STA $1C00; DISK CONTROLLER
  177. 353 LDA $1C0C; PERIPHIAL CONTROL REG
  178. 355 AND #$FE
  179. 357 ORA #$0E
  180. 359 ORA #$E0
  181. 361 STA $1C0C; NEG EDGE LATCH MODE
  182. 363 LDA #$41; DISABLE SER/OUT LINE
  183. 365 STA $1C0B; AUX CONTROL REG
  184. 367 LDA #$00; SET 20 MILSEC TIMER
  185. 369 STA $1C06; TIMER 1 LO LATCH
  186. 371 LDA #$3A
  187. 373 STA $1C07; TIMER 1 HI LATCH
  188. 375 STA $1C05; TIMER 1 HI COUNT
  189. 377 LDA #$7F; CLEAR ALL IRQ SOURCES
  190. 379 STA $1C0E; INTERRUPT ENABLE REG
  191. 381 LDA #$C0; CLEAR/ENABLE IRQ TIMER
  192. 383 STA $1C0D; INTERRUPT FLAG REG
  193. 385 STA $1C0E
  194. 387 LDA #$FF
  195. 389 STA $3E; CURRENT DRV #$FF INACTIVE
  196. 391 STA $51; TRK BEING FORMATTED BUFF #$FF INACT
  197. 393 LDA #$08; CODE HEADER BLK ID
  198. 395 STA $39; HEADER BLK ID BUFF
  199. 397 ; *** CHANGE THIS ONE FOR ILLEGAL TRKS ***
  200. 399 LDA #$07; CODE DATA BLK ID
  201. 401 STA $47; DATA BLK ID BUFF THIS ONE TOO
  202. 403 LDA #$05; LO BYTE
  203. 405 STA $62; PTR HEAD STEPPING
  204. 407 LDA #$FA; HI BYTE
  205. 409 STA $63
  206. 411 LDA #$C8; ASCII 200 STEPS
  207. 413 STA $64; MIN STEPS FAST TEPPING
  208. 415 LDA #$04; # OF STEPS ACCELERAT/DECELLERATE HEAD
  209. 417 STA $5E; NUM OF STEPS BUFF
  210. 419 LDA #$04; ACCELERATION/DECELERATION FACTOR
  211. 421 STA $5F; ACEL/DECEL FACTOR BUFF
  212. 423 ; ** MAIN CONTROLLER LOOP **
  213. 425 ; SCANS CMND BUFFS $00 TO $04
  214. 427 TSX; SAVE STACK PTR
  215. 429 STX $49; STACK PTR BUFF
  216. 431 LDA $1C04:LDA $1C0C; PERIPH CONT REG
  217. 433 ORA #$0E; SET BITS 1 2 3 ENABLE SER/OUT
  218. 435 STA $1C0C
  219. 437 LDY #$05; CMND BUFF COUNT
  220. 439 LDA $0000,Y; CMND BUFFS
  221. 441 BPL $F2F3; NO CMND
  222. 443 CMP #$D0; CODE JUMP
  223. 445 BNE $F2CD; NOT JUMP
  224. 447 TYA; USE FOR INDEX
  225. 449 JMP $F370; EXECUTE JUMP
  226. 451 AND #$01
  227. 453 BEQ $F2D8; VALID DRV NUM
  228. 455 STY $3F; POSISTION LAST CMND
  229. 457 LDA #$0F; CODE BAD DRV NUM
  230. 459 JMP $F969; ERROR HANDLING
  231. 461 TAX; CMND DRV NUM
  232. 463 STA $3D; DRV NUM ALWAYS 0
  233. 465 CMP $3E; CURRENT DRV
  234. 467 BEQ $F2E9; IF #$FF DRV OFF
  235. 469 JSR $F97E; TURN DRV ON
  236. 471 LDA $3D; ALWAYS 0
  237. 473 STA $3E; ACTIVE DRV BUFF
  238. 475 JMP $F99C; TERM ROUT
  239. 477 LDA $20; DISK DRV STATUS
  240. 479 BMI $F2F0; DRV NOT READY
  241. 481 ASL
  242. 483 BPL $F2F9; HEAD NOT STEPPING
  243. 485 JMP $F99C; HEAD STEPPER ROUT
  244. 487 DEY
  245. 489 BPL $F2C0; MORE CMND BUFFS
  246. 491 JMP $F99C; HEAD STEPPER ROUNTINE
  247. 493 LDA #$20; DRV RUNNING CODE
  248. 495 STA $20; DRV STATUS BUFF
  249. 497 LDY #$05
  250. 499 STY $3F; POS LAST CMND
  251. 501 JSR $F393; SET PTR TO BUFF
  252. 503 BMI $F320; CHECH STEP HEAD THIS CMND
  253. 505 DEC $3F; MORE TO CHK
  254. 507 BPL $F301; NO CMND BIT 7 0
  255. 509 LDY $41; POS NEXT CMND
  256. 511 JSR $F395; GET NEXT CMND
  257. 513 LDA $42; NEXT TRK MOVE HEAD
  258. 515 STA $4A; NUM STEPS MOVE HEAD
  259. 517 ASL $4A
  260. 519 LDA #$60; CODE HEAD STEPPING
  261. 521 STA $20; DRV STATUS REG
  262. 523 LDA ($32),Y; HEADER TABLE PTRS
  263. 525 STA $22; TRK UNDER HEAD
  264. 527 JMP $F99C; TERM ROUT
  265. 529 AND #$01
  266. 531 CMP $3D; ALWAYS 0
  267. 533 BNE $F306; NEVER BRANCH
  268. 535 LDA $22; TRK UNDER HEAD
  269. 537 BEQ $F33C; ON TRK
  270. 539 SEC
  271. 541 SBC ($32),Y; ACTIVE HEADER PTR TABLE
  272. 543 BEQ $F33C; ON TRK
  273. 545 EOR #$FF; FLIP ALL BITS
  274. 547 STA $42
  275. 549 INC $42:LDA $3F
  276. 551 STA $41
  277. 553 JMP $F306; CHK FOR MORE CMNDS
  278. 555 ; ** FIND ZONE FOR TRK **
  279. 557 LDX #$04; NUM OF ZONES
  280. 559 LDA ($32),Y
  281. 561 STA $40; BYTE CTR
  282. 563 CMP $FED6,Y; ZONE TABLE
  283. 565 DEX
  284. 567 BCS $F342
  285. 569 LDA $FED1,X; SECTS/TRK/ZONE
  286. 571 STA $43
  287. 573 TXA
  288. 575 ASL:ASL:ASL:ASL:ASL
  289. 577 STA $44; TEMP WORK
  290. 579 LDA $1C00; DISK CONTROLLER
  291. 581 AND #$9F
  292. 583 ORA $44
  293. 585 STA $1C00; DENSITY SET
  294. 587 LDX $3D; DRV NUM
  295. 589 LDA $45; CMND NUM
  296. 591 CMP #$40; CODE BUMP TO TRK 1
  297. 593 BEQ $F37C
  298. 595 CMP #$60; CODE EXECUTE
  299. 597 BEQ $F36E
  300. 599 JMP $F3B1; CHK IF SEEK
  301. 601 ; ** EXECUTE A CMND **
  302. 603 LDA $3F
  303. 605 CLC
  304. 607 ADC #$03
  305. 609 STA $31; HI BYTE BUFF PTR
  306. 611 LDA #$00
  307. 613 STA $30; LO BYTE
  308. 615 JMP ($0030)
  309. 617 ; ** BUMP HEAD TO TRK 1 **
  310. 619 LDA #$60
  311. 621 STA $20; DRV STATUS BUFF
  312. 623 LDA $1C00; DISK CONTROLLER
  313. 625 AND #$FC; SET TO PHASE A
  314. 627 STA $1C00
  315. 629 LDA #$A4; NUM OF TRKS TO MOVE
  316. 631 STA $4A
  317. 633 LDA #$01; NEW TRK NUM
  318. 635 STA $22; TACK UNDER HEAD
  319. 637 JMP $F969
  320. 639 ; ** SEARCH FOR (null)OD HEADER BLK **
  321. 641 LDY $3F; BUFF CMND IN
  322. 643 LDA $0000,Y; CMND
  323. 645 PHA
  324. 647 BPL $F3AB; NOT CMND BIT 7 0
  325. 649 AND #$78
  326. 651 STA $45; TEMP FOR CMND CODE
  327. 653 TYA
  328. 655 ASL
  329. 657 ADC #$06
  330. 659 STA $32; VALUES HEADER TABLE PTR
  331. 661 TYA
  332. 663 CLC
  333. 665 ADC #$03
  334. 667 STA #31
  335. 669 LDY #$00
  336. 671 STY $30; ACTIVE BUFF PTR
  337. 673 PLA; CMND CODE
  338. 675 RTS
  339. 677 LDX #$5A; NUM OF TRYS TO FIND HEADER
  340. 679 STX $4B
  341. 681 LDX #$00
  342. 683 LDA #$52; GCR FOR 8 HEADER ID
  343. 685 STA $24
  344. 687 JSR $F556; WAIT FOR SYNC (#$FF)
  345. 689 BVC $F3BE; WAIT FOR BYTE AFTER SYNC
  346. 691 CLV
  347. 693 LDA $1C01; HOLDS GCR BYTE HEAD READ
  348. 695 CMP $24; ID FOR HEADER
  349. 697 BNE $F407; TRY AGAIN
  350. 699 BVC $F3C8; WAIT FOR BYTE AFTER ID
  351. 701 CLV
  352. 703 LDA $1C01
  353. 705 STA $25,X; GCR STORAGE HEADER 8 BYTES
  354. 707 INX
  355. 709 CPX #$07
  356. 711 BNE $F3C8
  357. 713 JSR $F497; COVERT HEADER TO HEX
  358. 715 LDY #$04
  359. 717 LDA #$00
  360. 719 EOR $0016,Y; HEADER IMAGE
  361. 721 DEY
  362. 723 BPL $F3DC; MORE CHKSUM TO GET
  363. 725 CMP #$00
  364. 727 BNE $F41E; HEADER CHKSUM ERROR
  365. 729 LDX $3E
  366. 731 LDA $18; TRK IMAGE
  367. 733 STA $22,X; TRK UNDER HEAD
  368. 735 LDA $45; CMND NUM
  369. 737 CMP #$30; SEEK CODE
  370. 739 BEQ $F410
  371. 741 LDA $3E
  372. 743 ASL
  373. 745 TAY
  374. 747 LDA $0012,Y; DISK ID
  375. 749 CMP $16; 1ST ID
  376. 751 BNE $F41B; DISK ID MISMATCH ERROR
  377. 753 LDA $0013,Y; 2ND ID
  378. 755 CMP $17
  379. 757 BNE $F41B
  380. 759 JMP $F423; FIND BEST SECT
  381. 761 DEC $4B; SYNC CTR
  382. 763 BNE $F3BB; TRY AGAIN FOR HEADER
  383. 765 LDA #$02; CODE HEADER NOT FOUND
  384. 767 JSR $F969; ERROR HANDLING
  385. 769 LDA $16; 1ST ID THIS DISK
  386. 771 STA $12; 1ST ID BUFF
  387. 773 LDA $17; 2ND ID
  388. 775 STA $13
  389. 777 LDA #$01; ERROR CODE (OK)
  390. 779 BIT $0BA9; SKIP NEXT 2 BYTES
  391. 781 BIT 09A9; SKIP NEXT 2 BYTES
  392. 783 ;$F41B LDA #$0B
  393. 785 ;$F41E LDA #$09
  394. 787 JMP $F969; ERROR HANDLING
  395. 789 ; ** GET BEST SECT ON THIS TRK **
  396. 791 LDA #$7F
  397. 793 STA $4C; CURRENT SECT BUFF
  398. 795 LDA $19; SECT JUST READ FROM HEADER
  399. 797 CLC
  400. 799 ADC #$02
  401. 801 CMP $43; # OF SECTS THIS TRK
  402. 803 BCC $F432; TOO MANY SECTS
  403. 805 SBC $43
  404. 807 STA $4D; NEXT SECT TO CHK
  405. 809 LDX #$05
  406. 811 STX $3F; # OF CMND BUFFS
  407. 813 LDX #$FF
  408. 815 JSR $F393; SET PTRS
  409. 817 BPL $F483; DEC JOB BUFFS
  410. 819 STA $44; TEMP WORK
  411. 821 AND #$01
  412. 823 CMP $3E; CURRENT DRV
  413. 825 BNE $F483; WRONG DRV
  414. 827 LDY #$00
  415. 829 LDA ($32),Y
  416. 831 CMP $40
  417. 833 BNE $F483; WRONG TRK FOR CMND
  418. 835 LDA $45
  419. 837 CMP #$60; CODE FOR EXECUTE
  420. 839 BEQ $F461
  421. 841 LDY #$01
  422. 843 SEC
  423. 845 LDA ($32),Y; CMNDS SECT
  424. 847 SBC $4D; HOLDS NEXT SECT TO CHK
  425. 849 BPL $F461; ANOTHER SECT
  426. 851 CLC
  427. 853 ADC $43
  428. 855 CMP $4C; DISTANCE TO NEXT SECT
  429. 857 BCS $F483; DO OTHER CMND 1ST
  430. 859 PHA
  431. 861 LDA $45; HOLDS CMND
  432. 863 BEQ $F47E; READ CMND BRANCH
  433. 865 PLA; MUST BE WRITE CMND
  434. 867 CMP #$09; 9 OR LESS SECTS AWAY
  435. 869 BCC $F483; DO OTHER COMMANS FIRST
  436. 871 CMP #$0C; MORE THAN 12 SECTS AWAY
  437. 873 BCS $F483; DO OTHER CMND FIRST
  438. 875 STA $4C; HOLDS DISTANCE TO SECT
  439. 877 LDA $3F; BUFF PTR
  440. 879 TAX
  441. 881 ADC #$03
  442. 883 STA $31; ACTIVE BUFF PTR
  443. 885 BNE $F483; FORCED BRANCH
  444. 887 PLA; DISTANCE TO SECT FOR READ
  445. 889 CMP #$06; LESS THAN 6 SEC AHEAD
  446. 891 BCC $F473; READ SECT
  447. 893 DEC $3F; # CMND BUFFS
  448. 895 BPL $F43A; START OVER
  449. 897 TXA
  450. 899 BPL $F48D; READ CMND FOUND
  451. 901 JMP $F99C; FINISHED
  452. 903 STX $3F
  453. 905 JSR $F393
  454. 907 LDA $45
  455. 909 JMP $F4CA; READ TRK AND SECT
  456. 911 ; ** CONVERT HEADER FROM GCR TO HEX **
  457. 913 LDA $30; PTR ACTIVE BUFF
  458. 915 PHA
  459. 917 LDA $31
  460. 919 PHA
  461. 921 LDA #$24
  462. 923 STA $30
  463. 925 LDA #$00
  464. 927 STA $31; NOW POINTS $0024 WORK AREA
  465. 929 LDA #$00
  466. 931 STA $34; POINTS TO LAST CHAR TO CONVERT
  467. 933 JSR $F7E6; CONVERT GCR TO HEX
  468. 935 LDA $55
  469. 937 STA $18; IMAGE TRK #
  470. 939 LDA $54
  471. 941 STA $19; IMAGE SECT #
  472. 943 LDA $53
  473. 945 STA $1A; IMAGE HEADER CHKSUM
  474. 947 JSR $F7E6; CONVERT LAST 4 BYTES
  475. 949 LDA $52
  476. 951 STA $17; IMAGE 2ND ID
  477. 953 LDA $53
  478. 955 STA $16; IMAGE 1ST ID
  479. 957 PLA
  480. 959 STA $31; ACTIVE BUFF PTR
  481. 961 PLA
  482. 963 STA $30
  483. 965 RTS
  484. 967 ; ** READ TRK & SECT IN HEADER TABLE **
  485. 969 CMP #$00
  486. 971 BEQ $F4D1; READ CMND
  487. 973 JMP $F56E; WRITE CMND
  488. 975 JSR $F50A; FIND HEADER SET DATA BLK
  489. 977 BVC $F4D4; WAIT FOR CHAR AFTER SYNC
  490. 979 CLV
  491. 981 LDA $1C00;GCR BYTE FROM HEAD
  492. 983 STA ($30),Y; DATA BUFF
  493. 985 INY
  494. 987 BNE $F4D4; READ MORE
  495. 989 LDY #$BA; LOOP FOR LAST 70 BYTES
  496. 991 BVC $F4E1
  497. 993 CLV
  498. 995 LDA $1C01
  499. 997 STA $0100,Y; OVERFLOW BUFF
  500. 999 ; 256 HEX BYTES = 326 GCR BYTES
  501. 1001 INY
  502. 1003 BNE $F4E1; READ MORE
  503. 1005 JSR $F8E0; CONVERT GCR TO HEX
  504. 1007 LDA $38
  505. 1009 CMP #$47; #$07 HEADER ID
  506. 1011 BEQ $F4FB
  507. 1013 LDA #$04; CODE DATA BLK NOT FOUND
  508. 1015 JMP $F969; ERROR HANDLING
  509. 1017 JSR $F5E9; CALCULATE DATA CHKSUM
  510. 1019 CMP $3A
  511. 1021 BEQ $F505; CHKSUM OK
  512. 1023 LDA #$05; DATA BLK CHKSUM ERROR
  513. 1025 BIT $01A9; SKIP NEXT TWO BYTES
  514. 1027 ;$F505 LDA #$01
  515. 1029 JMP $F969; ERROR HANDLING
  516. 1031 ; ** FIND SPECIFIC HEADER **
  517. 1033 JSR $F510; SET UP HEADER IMAGE
  518. 1035 JMP $F556; WAIT FOR SYNC
  519. 1037 LDA $3D; DRV NUM ALWAYS 0
  520. 1039 ASL
  521. 1041 TAX; X = 0
  522. 1043 LDA $12,X; 1ST ID
  523. 1045 STA $16; IMAGE 1ST ID
  524. 1047 LDA $13,X; 2ND ID
  525. 1049 STA $17; IMAGE 2ND ID
  526. 1051 LDY #$00
  527. 1053 LDA ($32),Y
  528. 1055 STA $18; IMAGE TRK NUM
  529. 1057 INY
  530. 1059 LDA ($32),Y
  531. 1061 STA $19; IMAGE SECT NUM
  532. 1063 LDA #$00
  533. 1065 EOR $16
  534. 1067 EOR $17
  535. 1069 EOR $18
  536. 1071 EOR $19
  537. 1073 STA $1A; IMAGE HEADER CHKSUM
  538. 1075 JSR $F934; CONVERT HEADER TO GCR
  539. 1077 LDX #$5A; CTR # OF SYNC MARKS
  540. 1079 JSR $F556; WAIT FOR SYNC
  541. 1081 LDY #$00
  542. 1083 BVC $F53D; WAIT FOR CHAR AFTER SYNC
  543. 1085 CLV
  544. 1087 LDA $1C01; GCR BYTE FROM READ HEAD
  545. 1089 CMP $0024,Y; GCR IMAGE HEADER
  546. 1091 BNE $F54E; NOT RIGHT HEADER
  547. 1093 INY
  548. 1095 CPY #$08
  549. 1097 BNE $F53D; READ REST OF HEADER
  550. 1099 RTS
  551. 1101 DEX; SYNC MARK CTR
  552. 1103 BNE $F538; TRY FOR ANOTHER SYNC
  553. 1105 LDA #$02; BLK HEADER NOT FOUND
  554. 1107 JMP $F969; ERROR HANDLING
  555. 1109 ; ** WAIT FOR SYNC MARK (#$FF GCR) **
  556. 1111 LDA #$D0; 20 MILLISECONDS
  557. 1113 STA $1805; TIMER 1 HIGH COUNT
  558. 1115 LDA #$03; NO SYNC FOUND ERROR
  559. 1117 BIT $1805
  560. 1119 BPL $F553; TRY AGAIN
  561. 1121 BIT $1C00; DISK CONTROLLER
  562. 1123 BMI $F55D; TRY AGAIN
  563. 1125 LDA $1C01; GCR BYTE READ FROM HEAD
  564. 1127 CLV; RESET LATCH CLEAR OVERFLOW FLAG
  565. 1129 LDY #$00
  566. 1131 RTS
  567. 1133 ; ** WRITE DATA BUFF TO DISK **
  568. 1135 CMP #$10; CODE FOR WRITE
  569. 1137 BEQ $F575
  570. 1139 JMP $F969; CHK FOR VERIFY
  571. 1141 JSR $F5E9; GET CHKSUM FOR DATA BLK
  572. 1143 STA $3A
  573. 1145 LDA $1C00; DISK CONTROLLER
  574. 1147 AND #$10; CHK WRITE PROTECT SENSE
  575. 1149 BNE $F586
  576. 1151 LDA #$08; WRITE PROTECT ERROR
  577. 1153 JMP $F969; ERROR HANDLING
  578. 1155 JSR $F78F; CONVERT DATA TO GCR
  579. 1157 JSR $F510; FIND CORRECT HEADER BLK
  580. 1159 LDX #$09
  581. 1161 BVC $F58E; WAIT FOR 8 BYTES TO PASS
  582. 1163 CLV ; HEADER GAP BETWEEN HEADER &
  583. 1165 DEX; DATA BLK
  584. 1167 BNE $F58E
  585. 1169 LDA #$FF; OUTPUT FOR I/O
  586. 1171 STA $1C03; DATA DIRECTION REG
  587. 1173 LDA $1C0C; PERIPHIAL CONT REG
  588. 1175 AND #$1F; TURN ON WRITE MODE
  589. 1177 ORA #$C0
  590. 1179 STA $1C0C
  591. 1181 LDA #$FF; FOR HEADER GAP MARKS
  592. 1183 LDX #$05
  593. 1185 STA $1C01; GCR BYTE TO WRITE HEAD
  594. 1187 CLV
  595. 1189 BVC $F5AB; WAIT
  596. 1191 CLV
  597. 1193 DEX
  598. 1195 BNE $F5AB; WRITE MORE GAP MARKS
  599. 1197 LDY #$BB
  600. 1199 LDA $0100,Y; OVERFLOW FOR GCR
  601. 1201 BVC $F5B6
  602. 1203 CLV
  603. 1205 STA $1C01; GCR BYTE TO WRITE HEAD
  604. 1207 INY
  605. 1209 BNE $F5B3; WRITE MORE OVERFLOW BUFF
  606. 1211 LDA ($30),Y; RESI OF GCR BYTES BUFF
  607. 1213 BVC $F5C1; WAIT FOR BYTE TO BE WRITTEN
  608. 1215 CLV
  609. 1217 STA $1C01; GCR BYTE TO WRITE HEAD
  610. 1219 INY
  611. 1221 BNE $F5BF; WRITE MORE BUFF
  612. 1223 BVC $F5CA; WAIT FOR FINAL BYTE TO WRITE
  613. 1225 LDA $1C0C; PERIPHIAL CONTROL REG
  614. 1227 ORA #$E0; SET TO READ MODE
  615. 1229 STA $1C0C
  616. 1231 LDA #$00; INPUT I/O
  617. 1233 STA $1C03; DATA DIRECTION REG
  618. 1235 JSR $F5F2; CONVERT GCR TO HEX JUST WRITTEN
  619. 1237 ; IT WILL NOW BE VERIFIED
  620. 1239 LDA $3F; POSISTION OF WRITE CMND
  621. 1241 LDA $0000,Y; CMND BUFF
  622. 1243 EOR #$30; CHANGE TO VERIFY CMND
  623. 1245 STA $0000,Y
  624. 1247 JMP $F3B1; EXECUTE VERIFY
  625. 1249 ; ** CALCULATE DATA BLK CHKSUM **
  626. 1251 LDA #$00
  627. 1253 TAY; INDEX
  628. 1255 EOR ($30),Y; DATA BUFF
  629. 1257 INY
  630. 1259 BNE $F5EC; EOR MORE BYTES
  631. 1261 RTS
  632. 1263 ; ** CONVERT GCR 10 BITS TO HEXT 8 BITS **
  633. 1265 LDA #$00
  634. 1267 STA $2E; SET PTRS & BUFFS
  635. 1269 STA $30
  636. 1271 STA $4F
  637. 1273 LDA $31
  638. 1275 STA $4E
  639. 1277 LDA #$01; $01BB OVERFLOW BUFF
  640. 1279 STA $31
  641. 1281 STA $2F
  642. 1283 LDA #$BB
  643. 1285 STA $34
  644. 1287 STA $36
  645. 1289 JSR $F7E6; CONVERT 5 BYTES GCR 4 BYTES HEX
  646. 1291 LDA $52; DATA BLK ID
  647. 1293 STA $38
  648. 1295 LDY $36
  649. 1297 LDA $53
  650. 1299 STA ($2E),Y; HEX BYTES TO OVERFLOW BUFF
  651. 1301 INY
  652. 1303 LDA $54
  653. 1305 STA ($2E),Y
  654. 1307 INY
  655. 1309 LDA $55
  656. 1311 STA ($2E),Y
  657. 1313 INY
  658. 1315 STY $36; SAVE Y INDEX
  659. 1317 JSR $F7E6; CONVER NEXT 5 GCR BYTES
  660. 1319 ; SEE ABOVE FOR REST OF ROUT
  661. 1321 LDY $36
  662. 1323 LDA $52
  663. 1325 STA ($2E),Y
  664. 1327 INY
  665. 1329 LDA $53
  666. 1331 STA ($2E),Y
  667. 1333 INY
  668. 1335 BEQ $F643
  669. 1337 LDA $54
  670. 1339 STA ($2E),Y
  671. 1341 INY
  672. 1343 LDA $55
  673. 1345 STA ($2E),Y
  674. 1347 INY
  675. 1349 STY $36
  676. 1351 BNE $F624
  677. 1353 LDA $54
  678. 1355 STA ($30),Y; DATA BUFF
  679. 1357 INY
  680. 1359 LDA $55
  681. 1361 STA ($30),Y
  682. 1363 INY
  683. 1365 STY $36
  684. 1367 JSR $F7E6
  685. 1369 LDY $36
  686. 1371 LDA $52
  687. 1373 STA ($30),Y
  688. 1375 INY
  689. 1377 LDA $53
  690. 1379 STA ($30),Y; GCR DATA BUFF
  691. 1381 INY
  692. 1383 LDA $54
  693. 1385 STA ($30),Y
  694. 1387 INY
  695. 1389 LDA $55
  696. 1391 STA ($30),Y
  697. 1393 INY
  698. 1395 STY $36
  699. 1397 CPY #$BB; END OF OVERFLOW BUFF
  700. 1399 BCC $F64F; PUT MORE IN OVERFLOW
  701. 1401 ; ** REARRANGE CONVERTED BYTES TO PROPER BUFF **
  702. 1403 LDA #$45; BUFF PTR
  703. 1405 STA $2E
  704. 1407 LDA $31
  705. 1409 STA $2F
  706. 1411 LDA #$BA; BEGINNING OVERFLOW
  707. 1413 LDA ($30),Y
  708. 1415 STA ($2E),Y; BYTE IN PROPER PLACE
  709. 1417 DEY
  710. 1419 BNE $F678; MORE TO MOVE
  711. 1421 LDA ($30),Y
  712. 1423 STA ($2E),Y
  713. 1425 LDX #$BB; BEGINNING OF OVERFLOW
  714. 1427 LDA $0101,X
  715. 1429 STA ($30),Y
  716. 1431 INY
  717. 1433 INX
  718. 1435 BNE $F685; MORE TO MOVE
  719. 1437 STX $50; GCR FLAG (ALL BYTES MOVED)
  720. 1439 RTS
  721. 1441 ; ** VERIFY DATA BLK **
  722. 1443 CMP #$20; VERIFY CMND
  723. 1445 BEQ $F698
  724. 1447 JMP $F6CA; SECT SEEK
  725. 1449 JSR $F5E9; GET DATA BLK CHKSUM
  726. 1451 STA $3A
  727. 1453 JSR $F78F; CONVERT DATA TO GCR
  728. 1455 ; NEEDS TO BE DONE TO CHK HEADER
  729. 1457 JSR $F50A; FIND SECT GET DATA
  730. 1459 LDY #$BB; START OF OVERFLOW BUFF
  731. 1461 LDA $0100,Y
  732. 1463 BVC $F6A8; WAIT FOR DISK BYTE
  733. 1465 CLV
  734. 1467 EOR $1C01; GCR BYTE FROM READ HEAD
  735. 1469 BNE $F6C5; NO MATCH WITH BUFF
  736. 1471 INY
  737. 1473 BNE $F6A5; MATCH NEXT DISK BYTE W/BUFF
  738. 1475 LDA ($30),Y; GCR BYTES IN DATA BUFF
  739. 1477 BVC $F6B5; WAIT FOR DISK BYTE
  740. 1479 CLV
  741. 1481 EOR $1C01; GCR BYTE FROM READ HEAD
  742. 1483 BNE $F6C5; BUFF & DISK BYTE NO MATCH
  743. 1485 INY
  744. 1487 CMP #$FD
  745. 1489 BNE $F6B3; MATCH MORE BYTES
  746. 1491 JMP $F418; TERM ROUT
  747. 1493 LDA #$07; WRITE/VERIFY ERROR
  748. 1495 JMP $F969; ERROR HANDLING
  749. 1497 JSR $F510; SECT SEARCH
  750. 1499 JMP $F418; TERM ROUT
  751. 1501 ; ** CONVERT HEX (8 BITS) TO GCR (10 BITS) **
  752. 1503 LDA #$00
  753. 1505 STA $57; GCR STORAGE
  754. 1507 STA $5A
  755. 1509 LDY $34; LAST CHAR CONVERTED PTR
  756. 1511 LDA $52; 1ST 8 BIT BYTE
  757. 1513 AND #$F0; 11110000 MASK LO BITS
  758. 1515 LSR;01111000
  759. 1517 LSR;00111100
  760. 1519 LSR;00011110
  761. 1521 LSR;00001111
  762. 1523 TAX
  763. 1525 LDA $F77F,X; 5 BIT GCR EQUIVALENTS
  764. 1527 ; EXAMPLE 00011111
  765. 1529 ASL; 00111110
  766. 1531 ASL; 01111100
  767. 1533 ASL; 11111000
  768. 1535 STA $56; GCR STORAGE
  769. 1537 LDA $52; HEX STORAGE
  770. 1539 AND #$0F; 00001111
  771. 1541 TAX
  772. 1543 LDA $F77F,X; 00011111
  773. 1545 ROR; 00111110
  774. 1547 ROR $57
  775. 1549 ROR
  776. 1551 ROR $57
  777. 1553 AND #$07; 00000111
  778. 1555 ORA $56
  779. 1557 STA ($30),Y; GCR DATA BUFF
  780. 1559 INY
  781. 1561 LDA $53; 2ND 8 BIT BYTE
  782. 1563 ;FOLLOW LOGIC ABOVE
  783. 1565 AND #$F0
  784. 1567 LSR:LSR:LSR:LSR
  785. 1569 TAX
  786. 1571 LDA $F77F,X
  787. 1573 ASL
  788. 1575 ORA $57
  789. 1577 STA $57
  790. 1579 LDA $53
  791. 1581 AND #$0F
  792. 1583 TAX
  793. 1585 LDA $F77F,X
  794. 1587 ROL:ROL:ROL:ROL
  795. 1589 STA $58:ROL
  796. 1591 AND #$01
  797. 1593 ORA $57
  798. 1595 STA ($30),Y
  799. 1597 INY
  800. 1599 LDA $54; 3RD 8 BIT BYTE
  801. 1601 AND #$F0
  802. 1603 LSR:LSR:LSR:LSR
  803. 1605 TAX
  804. 1607 LDA $F77F,X
  805. 1609 CLC
  806. 1611 ROR
  807. 1613 ORA $58
  808. 1615 STA ($30),Y
  809. 1617 INY
  810. 1619 ROR
  811. 1621 AND #$80
  812. 1623 STA $59
  813. 1625 LDA $54
  814. 1627 AND #$0F
  815. 1629 TAX
  816. 1631 LDA $F77F,X
  817. 1633 ASL:ASL
  818. 1635 AND #$7C
  819. 1637 ORA $59
  820. 1639 STA $59
  821. 1641 LDA $55; 4TH 8 BIT BYTE
  822. 1643 AND #$F0
  823. 1645 LSR
  824. 1647 LSR
  825. 1649 LSR
  826. 1651 LSR
  827. 1653 TAX
  828. 1655 LDA $F77F,X
  829. 1657 ROR
  830. 1659 ROR $5A
  831. 1661 ROR
  832. 1663 ROR $5A
  833. 1665 ROR
  834. 1667 ROR $5A
  835. 1669 AND #$03
  836. 1671 ORA $59
  837. 1673 STA ($30),Y
  838. 1675 INY
  839. 1677 BNE $F76F
  840. 1679 LDA $2F
  841. 1681 STA $31
  842. 1683 LDA $55
  843. 1685 AND #$0F
  844. 1687 TAX
  845. 1689 LDA $F77F,X
  846. 1691 ORA $5A
  847. 1693 STA ($30),Y
  848. 1695 INY
  849. 1697 STY $34
  850. 1699 RTS
  851. 1701 ; ** 5 BIT GCR EQUIVALENTS **
  852. 1703 ; 4 BIT NIBBLE        5 BIT GCR
  853. 1705 ; #$00 0000           #$0A 01010
  854. 1707 ;   01 0001             0B 01011
  855. 1709 ;   02 0010             12 10010
  856. 1711 ;   03 0011             13 10011
  857. 1713 ;   04 0100             0E 01110
  858. 1715 ;   05 0101             0F 01111
  859. 1717 ;   06 0110             16 10110
  860. 1719 ;   07 0111             17 10111
  861. 1721 ;   08 1000             09 01001
  862. 1723 ;   09 1001             19 11001
  863. 1725 ;   0A 1010             1A 11010
  864. 1727 ;   0B 1011             1B 11011
  865. 1729 ;   0C 1100             0D 01101
  866. 1731 ;   0D 1101             1D 11101
  867. 1733 ;   0E 1110             1E 11110
  868. 1735 ;   0F 1111             15 10101
  869. 1737 *= $F78F
  870. 1739 ; ** INIT PTRS TO BUFFS **
  871. 1741 LDA #$00
  872. 1743 STA $30
  873. 1745 STA $2E
  874. 1747 STA $36
  875. 1749 LDA #$BB; LO BYTE OVERFLOW BUFF
  876. 1751 STA $34
  877. 1753 STA $50
  878. 1755 LDA $31
  879. 1757 STA $2F
  880. 1759 LDA #$01
  881. 1761 STA $31
  882. 1763 LDA $47
  883. 1765 STA $52
  884. 1767 LDA $36
  885. 1769 STA ($2E),Y
  886. 1771 .FILE DISK ROM 9
  887.