DOS 2.6 ROM LISTINGSVersion 1.0 (Feb. 11, 2000)Frank Kontros (frank@kontros.uzhgorod.ua) ****************************** C000 97 C001 AA ... C0FF ... AA ****************************** turn LED on C100 78 SEI C101 A9 F7 LDA #$F7 erase LED bit C103 2D 00 1C AND $1C00 C106 48 PHA C107 A5 7F LDA $7F drive number C109 F0 05 BEQ $C110 0? C10B 68 PLA C10C 09 00 ORA #$00 not drive 0, turn LED off C10E D0 03 BNE $C113 C110 68 PLA C111 09 08 ORA #$08 turn LED on C113 8D 00 1C STA $1C00 C116 58 CLI C117 60 RTS ****************************** turn LED on C118 78 SEI C119 A9 08 LDA #$08 C11B 0D 00 1C ORA $1C00 LED on C11E 8D 00 1C STA $1C00 C121 58 CLI C122 60 RTS ****************************** erase error flags C123 A9 00 LDA #$00 C125 8D 6C 02 STA $026C C128 8D 6D 02 STA $026D C12B 60 RTS ****************************** C12C 78 SEI C12D 8A TXA save X register C12E 48 PHA C12F A9 50 LDA #$50 C131 8D 6C 02 STA $026C C134 A2 00 LDX #$00 C136 BD CA FE LDA $FECA,X 8 C139 8D 6D 02 STA $026D C13C 0D 00 1C ORA $1C00 turn LED on C13F 8D 00 1C STA $1C00 C142 68 PLA C143 AA TAX get X register back C144 58 CLI C145 60 RTS ****************************** interpret command from computer C146 A9 00 LDA #$00 C148 8D F9 02 STA $02F9 C14B AD 8E 02 LDA $028E last drive number C14E 85 7F STA $7F drive number C150 20 BC E6 JSR $E6BC prepare 'ok' message C153 A5 84 LDA $84 secondary address C155 10 09 BPL $C160 C157 29 0F AND #$0F C159 C9 0F CMP #$0F 15, command channel C15B F0 03 BEQ $C160 yes C15D 4C B4 D7 JMP $D7B4 to OPEN command C160 20 B3 C2 JSR $C2B3 determine line length and erase flags C163 B1 A3 LDA ($A3),Y get first character C165 8D 75 02 STA $0275 and store C168 A2 0B LDX #$0B 11 C16A BD 89 FE LDA $FE89,X commands C16D CD 75 02 CMP $0275 compare to first character C170 F0 08 BEQ $C17A found? C172 CA DEX C173 10 F5 BPL $C16A C175 A9 31 LDA #$31 not found C177 4C C8 C1 JMP $C1C8 31, 'syntax error' C17A 8E 2A 02 STX $022A number of command words C17D E0 09 CPX #$09 C17F 90 03 BCC $C184 command number < 9? C181 20 EE C1 JSR $C1EE test for 'R', 'S', and 'N' C184 AE 2A 02 LDX $022A command number C187 BD 95 FE LDA $FE95,X jump address lo C18A 85 6F STA $6F C18C BD A1 FE LDA $FEA1,X jump address hi C18F 85 70 STA $70 C191 6C 6F 00 JMP ($006F) jump to command ****************************** prepare error message after executing command C194 A9 00 LDA #$00 C196 8D F9 02 STA $02F9 C199 AD 6C 02 LDA $026C flag set? C19C D0 2A BNE $C1C8 yes, then set error message C19E A0 00 LDY #$00 C1A0 98 TYA error number 0 C1A1 84 80 STY $80 track number 0 C1A3 84 81 STY $81 sector number 0 C1A5 84 A3 STY $A3 C1A7 20 C7 E6 JSR $E6C7 prepare 'ok' message C1AA 20 23 C1 JSR $C123 erase error flag C1AD A5 7F LDA $7F drive number C1AF 8D 8E 02 STA $028E save as last drive number C1B2 AA TAX C1B3 A9 00 LDA #$00 C1B5 95 FF STA $FF,X C1B7 20 BD C1 JSR $C1BD erase input buffer C1BA 4C DA D4 JMP $D4DA close internal channel ****************************** erase input buffer C1BD A0 28 LDY #$28 erase 41 characters C1BF A9 00 LDA #$00 C1C1 99 00 02 STA $0200,Y $200 to $228 C1C4 88 DEY C1C5 10 FA BPL $C1C1 C1C7 60 RTS ****************************** give error message (track & sector) C1C8 A0 00 LDY #$00 C1CA 84 80 STY $80 track = 0 C1CC 84 81 STY $81 sector = 0 C1CE 4C 45 E6 JMP $E645 error number acc, generate error message ****************************** check input line C1D1 A2 00 LDX #$00 C1D3 8E 7A 02 STX $027A pointer to drive number C1D6 A9 3A LDA #$3A ':' C1D8 20 68 C2 JSR $C268 test line to ':' or to end C1DB F0 05 BEQ $C1E2 no colon found? C1DD 88 DEY C1DE 88 DEY C1DF 8C 7A 02 STY $027A point to drive number (before colon) C1E2 4C 68 C3 JMP $C368 get drive number and turn LED on ****************************** check input line C1E5 A0 00 LDY #$00 pointer to input buffer C1E7 A2 00 LDX #$00 counter for commas C1E9 A9 3A LDA #$3A ':' C1EB 4C 68 C2 JMP $C268 test line to colon or to end ****************************** check input line C1EE 20 E5 C1 JSR $C1E5 test line to ':' or end C1F1 D0 05 BNE $C1F8 colon found? C1F3 A9 34 LDA #$34 C1F5 4C C8 C1 JMP $C1C8 34, 'syntax error' C1F8 88 DEY C1F9 88 DEY set pointer to colon C1FA 8C 7A 02 STY $027A position of the drive number C1FD 8A TXA comma before the colon C1FE D0 F3 BNE $C1F3 yes, then 'syntax error' C200 A9 3D LDA #$3D '=' C202 20 68 C2 JSR $C268 check input to '=' C205 8A TXA comma found? C206 F0 02 BEQ $C20A no C208 A9 40 LDA #$40 bit 6 C20A 09 21 ORA #$21 and set bit 0 and 5 C20C 8D 8B 02 STA $028B flag for syntax check C20F E8 INX C210 8E 77 02 STX $0277 C213 8E 78 02 STX $0278 C216 AD 8A 02 LDA $028A wildcard found? C219 F0 0D BEQ $C228 no C21B A9 80 LDA #$80 C21D 0D 8B 02 ORA $028B set bit 7 C220 8D 8B 02 STA $028B C223 A9 00 LDA #$00 C225 8D 8A 02 STA $028A reset wildcard flag C228 98 TYA '=' found? C229 F0 29 BEQ $C254 no C22B 9D 7A 02 STA $027A,X C22E AD 77 02 LDA $0277 number of commas before '=' C231 8D 79 02 STA $0279 C234 A9 8D LDA #$8D shift CR C236 20 68 C2 JSR $C268 check line to end C239 E8 INX increment comma counter C23A 8E 78 02 STX $0278 store number of commas C23D CA DEX C23E AD 8A 02 LDA $028A wildcard found? C241 F0 02 BEQ $C245 no C243 A9 08 LDA #$08 set bit 3 C245 EC 77 02 CPX $0277 comma after '='? C248 F0 02 BEQ $C24C no C24A 09 04 ORA #$04 set bit 2 C24C 09 03 ORA #$03 set bits 0 and 1 C24E 4D 8B 02 EOR $028B C251 8D 8B 02 STA $028B as flag for syntax check C254 AD 8B 02 LDA $028B syntax flag C257 AE 2A 02 LDX $022A command number C25A 3D A5 FE AND $FEA5,X combine with check byte C25D D0 01 BNE $C260 C25F 60 RTS C260 8D 6C 02 STA $026C set error flag C263 A9 30 LDA #$30 C265 4C C8 C1 JMP $C1C8 30, 'syntax error' ****************************** search characters in input buffer C268 8D 75 02 STA $0275 save character C26B CC 74 02 CPY $0274 already done? C26E B0 2E BCS $C29E yes C270 B1 A3 LDA ($A3),Y get char from buffer C272 C8 INY C273 CD 75 02 CMP $0275 compared with char C276 F0 28 BEQ $C2A0 found C278 C9 2A CMP #$2A '*' C27A F0 04 BEQ $C280 C27C C9 3F CMP #$3F '?' C27E D0 03 BNE $C283 C280 EE 8A 02 INC $028A set wildcard flag C283 C9 2C CMP #$2C ',' C285 D0 E4 BNE $C26B C287 98 TYA C288 9D 7B 02 STA $027B,X note comma position C28B AD 8A 02 LDA $028A wildcard flag C28E 29 7F AND #$7F C290 F0 07 BEQ $C299 no wildcard C292 A9 80 LDA #$80 C294 95 E7 STA $E7,X note flag C296 8D 8A 02 STA $028A and save as wildcard flag C299 E8 INX increment comma counter C29A E0 04 CPX #$04 4 commas already? C29C 90 CD BCC $C26B no, continue C29E A0 00 LDY #$00 C2A0 AD 74 02 LDA $0274 set flag for line end C2A3 9D 7B 02 STA $027B,X C2A6 AD 8A 02 LDA $028A wildcard flag C2A9 29 7F AND #$7F C2AB F0 04 BEQ $C2B1 no wildcard C2AD A9 80 LDA #$80 C2AF 95 E7 STA $E7,X set flag C2B1 98 TYA C2B2 60 RTS ****************************** check line length C2B3 A4 A3 LDY $A3 pointer to command input buffer C2B5 F0 14 BEQ $C2CB zero? C2B7 88 DEY C2B8 F0 10 BEQ $C2CA one? C2BA B9 00 02 LDA $0200,Y pointer to input buffer C2BD C9 0D CMP #$0D 'CR' C2BF F0 0A BEQ $C2CB yes, line end C2C1 88 DEY C2C2 B9 00 02 LDA $0200,Y preceding character C2C5 C9 0D CMP #$0D 'CR' C2C7 F0 02 BEQ $C2CB yes C2C9 C8 INY C2CA C8 INY pointer to old value again C2CB 8C 74 02 STY $0274 same line length C2CE C0 2A CPY #$2A compare with 42 characters C2D0 A0 FF LDY #$FF C2D2 90 08 BCC $C2DC smaller, ok C2D4 8C 2A 02 STY $022A C2D7 A9 32 LDA #$32 C2D9 4C C8 C1 JMP $C1C8 32, 'syntax error' line too long ****************************** erase flag for input command C2DC A0 00 LDY #$00 C2DE 98 TYA C2DF 85 A3 STA $A3 pointer to input buffer lo C2E1 8D 58 02 STA $0258 record length C2E4 8D 4A 02 STA $024A file type C2E7 8D 96 02 STA $0296 C2EA 85 D3 STA $D3 C2EC 8D 79 02 STA $0279 comma counter C2EF 8D 77 02 STA $0277 " C2F2 8D 78 02 STA $0278 " C2F5 8D 8A 02 STA $028A wildcard flag C2F8 8D 6C 02 STA $026C error flag C2FB A2 05 LDX #$05 C2FD 9D 79 02 STA $0279,X flags for line analysis C300 95 D7 STA $D7,X directory sectors C302 95 DC STA $DC,X buffer pointer C304 95 E1 STA $E1,X drive number C306 95 E6 STA $E6,X wildcard flag C308 9D 7F 02 STA $027F,X track number C30B 9D 84 02 STA $0284,X sector number C30E CA DEX C30F D0 EC BNE $C2FD C311 60 RTS ****************************** preserve drive number C312 AD 78 02 LDA $0278 number of commas C315 8D 77 02 STA $0277 save C318 A9 01 LDA #$01 C31A 8D 78 02 STA $0278 number of drive numbers C31D 8D 79 02 STA $0279 C320 AC 8E 02 LDY $028E last drive number C323 A2 00 LDX #$00 C325 86 D3 STX $D3 C327 BD 7A 02 LDA $027A,X position of the colon C32A 20 3C C3 JSR $C33C get drive number before colon C32D A6 D3 LDX $D3 C32F 9D 7A 02 STA $027A,X save exact position C332 98 TYA C333 95 E2 STA $E2,X drive number in table C335 E8 INX C336 EC 78 02 CPX $0278 got all drive numbers? C339 90 EA BCC $C325 no, continue C33B 60 RTS ****************************** search for drive number C33C AA TAX note position C33D A0 00 LDY #$00 C33F A9 3A LDA #$3A ':' C341 DD 01 02 CMP $0201,X colon behind it? C344 F0 0C BEQ $C352 yes C346 DD 00 02 CMP $0200,X colon here? C349 D0 16 BNE $C361 no C34B E8 INX C34C 98 TYA C34D 29 01 AND #$01 drive number C34F A8 TAY C350 8A TXA C351 60 RTS C352 BD 00 02 LDA $0200,X get drive number C355 E8 INX C356 E8 INX C357 C9 30 CMP #$30 '0'? C359 F0 F2 BEQ $C34D yes C35B C9 31 CMP #$31 '1'? C35D F0 EE BEQ $C34D yes C35F D0 EB BNE $C34C no, use last drive number C361 98 TYA last drive number C362 09 80 ORA #$80 set bit 7, uncertain drive number C364 29 81 AND #$81 erase remaining bits C366 D0 E7 BNE $C34F ****************************** get drive number C368 A9 00 LDA #$00 C36A 8D 8B 02 STA $028B erase syntax flag C36D AC 7A 02 LDY $027A position in command line C370 B1 A3 LDA ($A3),Y get chars from command buffer C372 20 BD C3 JSR $C3BD get drive number C375 10 11 BPL $C388 certain number? C377 C8 INY increment pointer C378 CC 74 02 CPY $0274 line end? C37B B0 06 BCS $C383 yes C37D AC 74 02 LDY $0274 C380 88 DEY C381 D0 ED BNE $C370 search line for drive number C383 CE 8B 02 DEC $028B C386 A9 00 LDA #$00 C388 29 01 AND #$01 C38A 85 7F STA $7F drive number C38C 4C 00 C1 JMP $C100 turn LED on ****************************** reverse drive number C38F A5 7F LDA $7F drive number C391 49 01 EOR #$01 switch bit 0 C393 29 01 AND #$01 C395 85 7F STA $7F C397 60 RTS ****************************** establish file type C398 A0 00 LDY #$00 C39A AD 77 02 LDA $0277 '=' found? C39D CD 78 02 CMP $0278 C3A0 F0 16 BEQ $C3B8 no C3A2 CE 78 02 DEC $0278 get pointer C3A5 AC 78 02 LDY $0278 C3A8 B9 7A 02 LDA $027A,Y set pointer to character behind '=' C3AB A8 TAY C3AC B1 A3 LDA ($A3),Y pointer to buffer C3AE A0 04 LDY #$04 compare with marker for file type C3B0 D9 BB FE CMP $FEBB,Y 'S', 'P', 'U', 'R' C3B3 F0 03 BEQ $C3B8 agreement C3B5 88 DEY C3B6 D0 F8 BNE $C3B0 C3B8 98 TYA C3B9 8D 96 02 STA $0296 note file type (1-4) C3BC 60 RTS ****************************** check drive number C3BD C9 30 CMP #$30 '0' C3BF F0 06 BEQ $C3C7 C3C1 C9 31 CMP #$31 '1' C3C3 F0 02 BEQ $C3C7 C3C5 09 80 ORA #$80 no zero or one, then set bit 7 C3C7 29 81 AND #$81 C3C9 60 RTS ****************************** verify drive number C3CA A9 00 LDA #$00 C3CC 85 6F STA $6F C3CE 8D 8D 02 STA $028D C3D1 48 PHA C3D2 AE 78 02 LDX $0278 number of drive numbers C3D5 68 PLA C3D6 05 6F ORA $6F C3D8 48 PHA C3D9 A9 01 LDA #$01 C3DB 85 6F STA $6F C3DD CA DEX C3DE 30 0F BMI $C3EF C3E0 B5 E2 LDA $E2,X C3E2 10 04 BPL $C3E8 C3E4 06 6F ASL $6F C3E6 06 6F ASL $6F C3E8 4A LSR A C3E9 90 EA BCC $C3D5 C3EB 06 6F ASL $6F C3ED D0 E6 BNE $C3D5 C3EF 68 PLA C3F0 AA TAX C3F1 BD 3F C4 LDA $C43F,X get syntax flag C3F4 48 PHA C3F5 29 03 AND #$03 C3F7 8D 8C 02 STA $028C C3FA 68 PLA C3FB 0A ASL A C3FC 10 3E BPL $C43C C3FE A5 E2 LDA $E2 C400 29 01 AND #$01 isolate drive number C402 85 7F STA $7F C404 AD 8C 02 LDA $028C C407 F0 2B BEQ $C434 C409 20 3D C6 JSR $C63D initialize drive C40C F0 12 BEQ $C420 error? C40E 20 8F C3 JSR $C38F switch to other drive C411 A9 00 LDA #$00 C413 8D 8C 02 STA $028C C416 20 3D C6 JSR $C63D initialize drive C419 F0 1E BEQ $C439 no error? C41B A9 74 LDA #$74 C41D 20 C8 C1 JSR $C1C8 74, 'drive not ready' C420 20 8F C3 JSR $C38F C423 20 3D C6 JSR $C63D initialize drive C426 08 PHP C427 20 8F C3 JSR $C38F switch to other drive C42A 28 PLP C42B F0 0C BEQ $C439 no error? C42D A9 00 LDA #$00 C42F 8D 8C 02 STA $028C number of drives C432 F0 05 BEQ $C439 C434 20 3D C6 JSR $C63D initialize drive C437 D0 E2 BNE $C41B error? C439 4C 00 C1 JMP $C100 turn LED on C43C 2A ROL drive number from carry after bit 0 C43D 4C 00 C4 JMP $C400 ****************************** flags for drive check C440 00 80 41 01 01 01 01 81 C448 81 81 81 42 42 42 42 ****************************** search for file in directory C44F 20 CA C3 JSR $C3CA initialize drive C452 A9 00 LDA #$00 C454 8D 92 02 STA $0292 pointer C457 20 AC C5 JSR $C5AC read first directory block C45A D0 19 BNE $C475 entry present? C45C CE 8C 02 DEC $028C drive number clear? C45F 10 01 BPL $C462 no C461 60 RTS C462 A9 01 LDA #$01 C464 8D 8D 02 STA $028D C467 20 8F C3 JSR $C38F change drive C46A 20 00 C1 JSR $C100 turn LED on C46D 4C 52 C4 JMP $C452 and search C470 20 17 C6 JSR $C617 search next file in directory C473 F0 10 BEQ $C485 not found? C475 20 D8 C4 JSR $C4D8 verify directory entry C478 AD 8F 02 LDA $028F C47B F0 01 BEQ $C47E more files? C47D 60 RTS C47E AD 53 02 LDA $0253 C481 30 ED BMI $C470 file not found? C483 10 F0 BPL $C475 yes C485 AD 8F 02 LDA $028F C488 F0 D2 BEQ $C45C C48A 60 RTS C48B 20 04 C6 JSR $C604 search next directory block C48E F0 1A BEQ $C4AA not found? C490 D0 28 BNE $C4BA C492 A9 01 LDA #$01 C494 8D 8D 02 STA $028D C497 20 8F C3 JSR $C38F change drive C49A 20 00 C1 JSR $C100 turn LED on C49D A9 00 LDA #$00 C49F 8D 92 02 STA $0292 C4A2 20 AC C5 JSR $C5AC read directory block C4A5 D0 13 BNE $C4BA found? C4A7 8D 8F 02 STA $028F C4AA AD 8F 02 LDA $028F C4AD D0 28 BNE $C4D7 C4AF CE 8C 02 DEC $028C C4B2 10 DE BPL $C492 C4B4 60 RTS C4B5 20 17 C6 JSR $C617 next entry in directory C4B8 F0 F0 BEQ $C4AA not found? C4BA 20 D8 C4 JSR $C4D8 check entry C4BD AE 53 02 LDX $0253 C4C0 10 07 BPL $C4C9 file found? C4C2 AD 8F 02 LDA $028F C4C5 F0 EE BEQ $C4B5 yes C4C7 D0 0E BNE $C4D7 no, then done C4C9 AD 96 02 LDA $0296 C4CC F0 09 BEQ $C4D7 C4CE B5 E7 LDA $E7,X file type C4D0 29 07 AND #$07 C4D2 CD 96 02 CMP $0296 same as desired file type? C4D5 D0 DE BNE $C4B5 no C4D7 60 RTS C4D8 A2 FF LDX #$FF C4DA 8E 53 02 STX $0253 flag for data found C4DD E8 INX C4DE 8E 8A 02 STX $028A C4E1 20 89 C5 JSR $C589 set pointer to data C4E4 F0 06 BEQ $C4EC C4E6 60 RTS C4E7 20 94 C5 JSR $C594 pointer to next file C4EA D0 FA BNE $C4E6 end, then done C4EC A5 7F LDA $7F drive number C4EE 55 E2 EOR $E2,X C4F0 4A LSR A C4F1 90 0B BCC $C4FE C4F3 29 40 AND #$40 C4F5 F0 F0 BEQ $C4E7 C4F7 A9 02 LDA #$02 C4F9 CD 8C 02 CMP $028C search both drives? C4FC F0 E9 BEQ $C4E7 yes C4FE BD 7A 02 LDA $027A,X C501 AA TAX C502 20 A6 C6 JSR $C6A6 get length of filename C505 A0 03 LDY #$03 C507 4C 1D C5 JMP $C51D C50A BD 00 02 LDA $0200,X get chars out of command line C50D D1 94 CMP ($94),Y same character in directory? C50F F0 0A BEQ $C51B yes C511 C9 3F CMP #$3F '?' C513 D0 D2 BNE $C4E7 no C515 B1 94 LDA ($94),Y C517 C9 A0 CMP #$A0 shift blank, end of name? C519 F0 CC BEQ $C4E7 yes C51B E8 INX increment pointer C51C C8 INY C51D EC 76 02 CPX $0276 end of the name in the command? C520 B0 09 BCS $C52B yes C522 BD 00 02 LDA $0200,X next character C525 C9 2A CMP #$2A '*' C527 F0 0C BEQ $C535 yes, file found C529 D0 DF BNE $C50A continue search C52B C0 13 CPY #$13 19 C52D B0 06 BCS $C535 reached end of name C52F B1 94 LDA ($94),Y C531 C9 A0 CMP #$A0 shift blank, end of name C533 D0 B2 BNE $C4E7 not found C535 AE 79 02 LDX $0279 C538 8E 53 02 STX $0253 C53B B5 E7 LDA $E7,X C53D 29 80 AND #$80 C53F 8D 8A 02 STA $028A C542 AD 94 02 LDA $0294 C545 95 DD STA $DD,X C547 A5 81 LDA $81 sector number of the directory C549 95 D8 STA $D8,X enter in table C54B A0 00 LDY #$00 C54D B1 94 LDA ($94),Y file type C54F C8 INY C550 48 PHA C551 29 40 AND #$40 isolate search-protect bit C553 85 6F STA $6F (6) and save C555 68 PLA C556 29 DF AND #$DF erase bit 7 C558 30 02 BMI $C55C C55A 09 20 ORA #$20 set bit 5 C55C 29 27 AND #$27 erase bits 3 and 4 C55E 05 6F ORA $6F get bit 6 again C560 85 6F STA $6F C562 A9 80 LDA #$80 C564 35 E7 AND $E7,X isolate flag for wildcard C566 05 6F ORA $6F C568 95 E7 STA $E7,X write in table C56A B5 E2 LDA $E2,X C56C 29 80 AND #$80 C56E 05 7F ORA $7F drive number C570 95 E2 STA $E2,X C572 B1 94 LDA ($94),Y C574 9D 80 02 STA $0280,X first track of file C577 C8 INY C578 B1 94 LDA ($94),Y C57A 9D 85 02 STA $0285,X get sector from directory C57D AD 58 02 LDA $0258 record length C580 D0 07 BNE $C589 C582 A0 15 LDY #$15 C584 B1 94 LDA ($94),Y record length C586 8D 58 02 STA $0258 get from directory C589 A9 FF LDA #$FF C58B 8D 8F 02 STA $028F C58E AD 78 02 LDA $0278 C591 8D 79 02 STA $0279 C594 CE 79 02 DEC $0279 C597 10 01 BPL $C59A C599 60 RTS C59A AE 79 02 LDX $0279 C59D B5 E7 LDA $E7,X wildcard flag set? C59F 30 05 BMI $C5A6 yes C5A1 BD 80 02 LDA $0280,X track number already set C5A4 D0 EE BNE $C594 yes C5A6 A9 00 LDA #$00 C5A8 8D 8F 02 STA $028F C5AB 60 RTS C5AC A0 00 LDY #$00 C5AE 8C 91 02 STY $0291 C5B1 88 DEY C5B2 8C 53 02 STY $0253 C5B5 AD 85 FE LDA $FE85 18, directory track C5B8 85 80 STA $80 C5BA A9 01 LDA #$01 C5BC 85 81 STA $81 sector 1 C5BE 8D 93 02 STA $0293 C5C1 20 75 D4 JSR $D475 read sector C5C4 AD 93 02 LDA $0293 C5C7 D0 01 BNE $C5CA C5C9 60 RTS C5CA A9 07 LDA #$07 C5CC 8D 95 02 STA $0295 number of directory entries (-1) C5CF A9 00 LDA #$00 C5D1 20 F6 D4 JSR $D4F6 get pointer from buffer C5D4 8D 93 02 STA $0293 save as track number C5D7 20 E8 D4 JSR $D4E8 set buffer pointer C5DA CE 95 02 DEC $0295 decrement counter C5DD A0 00 LDY #$00 C5DF B1 94 LDA ($94),Y first byte from directory C5E1 D0 18 BNE $C5FB C5E3 AD 91 02 LDA $0291 C5E6 D0 2F BNE $C617 C5E8 20 3B DE JSR $DE3B get track and sector number C5EB A5 81 LDA $81 C5ED 8D 91 02 STA $0291 sector number C5F0 A5 94 LDA $94 C5F2 AE 92 02 LDX $0292 C5F5 8D 92 02 STA $0292 buffer pointer C5F8 F0 1D BEQ $C617 C5FA 60 RTS C5FB A2 01 LDX #$01 C5FD EC 92 02 CPX $0292 buffer pointer to one? C600 D0 2D BNE $C62F C602 F0 13 BEQ $C617 C604 AD 85 FE LDA $FE85 18, track number of BAM C607 85 80 STA $80 track number C609 AD 90 02 LDA $0290 C60C 85 81 STA $81 sector number C60E 20 75 D4 JSR $D475 read block C611 AD 94 02 LDA $0294 C614 20 C8 D4 JSR $D4C8 set buffer pointer C617 A9 FF LDA #$FF C619 8D 53 02 STA $0253 erase-file found flag C61C AD 95 02 LDA $0295 C61F 30 08 BMI $C629 all directory entries checked? C621 A9 20 LDA #$20 C623 20 C6 D1 JSR $D1C6 increment buffer ptr by 32, next entry C626 4C D7 C5 JMP $C5D7 and continue C629 20 4D D4 JSR $D44D set buffer pointer C62C 4C C4 C5 JMP $C5C4 read next block C62F A5 94 LDA $94 C631 8D 94 02 STA $0294 C634 20 3B DE JSR $DE3B get track & sector number from buffer C637 A5 81 LDA $81 C639 8D 90 02 STA $0290 save sector number C63C 60 RTS ****************************** test and initalize drive C63D A5 68 LDA $68 C63F D0 28 BNE $C669 C641 A6 7F LDX $7F drive number C643 56 1C LSR $1C,X disk changed? C645 90 22 BCC $C669 no, then done C647 A9 FF LDA #$FF C649 8D 98 02 STA $0298 set error flag C64C 20 0E D0 JSR $D00E read directory track C64F A0 FF LDY #$FF C651 C9 02 CMP #$02 20, 'read error'? C653 F0 0A BEQ $C65F yes C655 C9 03 CMP #$03 21, 'read error'? C657 F0 06 BEQ $C65F yes C659 C9 0F CMP #$0F 74, 'drive not ready'? C65B F0 02 BEQ $C65F yes C65D A0 00 LDY #$00 C65F A6 7F LDX $7F drive number C661 98 TYA C662 95 FF STA $FF,X save error flag C664 D0 03 BNE $C669 error? C666 20 42 D0 JSR $D042 load BAM C669 A6 7F LDX $7F drive number C66B B5 FF LDA $FF,X transmit error code C66D 60 RTS ****************************** name of file in directory buffer C66E 48 PHA C66F 20 A6 C6 JSR $C6A6 get end of the name C672 20 88 C6 JSR $C688 write filename in buffer C675 68 PLA C676 38 SEC C677 ED 4B 02 SBC $024B compare length with maximal length C67A AA TAX C67B F0 0A BEQ $C687 C67D 90 08 BCC $C687 C67F A9 A0 LDA #$A0 pad with 'shift blank' C681 91 94 STA ($94),Y C683 C8 INY C684 CA DEX C685 D0 FA BNE $C681 C687 60 RTS ****************************** C688 98 TYA buffer number C689 0A ASL A C68A A8 TAY times 2 as pointer C68B B9 99 00 LDA $0099,Y C68E 85 94 STA $94 C690 B9 9A 00 LDA $009A,Y buffer pointer after $94/$95 C693 85 95 STA $95 C695 A0 00 LDY #$00 C697 BD 00 02 LDA $0200,X transmit characters in buffer C69A 91 94 STA ($94),Y C69C C8 INY C69D F0 06 BEQ $C6A5 buffer already full? C69F E8 INX C6A0 EC 76 02 CPX $0276 C6A3 90 F2 BCC $C697 C6A5 60 RTS ****************************** search for end of name in command C6A6 A9 00 LDA #$00 C6A8 8D 4B 02 STA $024B C6AB 8A TXA C6AC 48 PHA C6AD BD 00 02 LDA $0200,X get characters out of buffer C6B0 C9 2C CMP #$2C ',' C6B2 F0 14 BEQ $C6C8 C6B4 C9 3D CMP #$3D '=' C6B6 F0 10 BEQ $C6C8 C6B8 EE 4B 02 INC $024B increment length of name C6BB E8 INX C6BC A9 0F LDA #$0F 15 C6BE CD 4B 02 CMP $024B C6C1 90 05 BCC $C6C8 greater? C6C3 EC 74 02 CPX $0274 end of input line? C6C6 90 E5 BCC $C6AD C6C8 8E 76 02 STX $0276 C6CB 68 PLA C6CC AA TAX pointer to end of name C6CD 60 RTS ****************************** C6CE A5 83 LDA $83 C6D0 48 PHA secondary address and channel number C6D1 A5 82 LDA $82 C6D3 48 PHA C6D4 20 DE C6 JSR $C6DE create file entry for directory C6D7 68 PLA C6D8 85 82 STA $82 C6DA 68 PLA get data back C6DB 85 83 STA $83 C6DD 60 RTS ****************************** C6DE A9 11 LDA #$11 17 C6E0 85 83 STA $83 secondary address C6E2 20 EB D0 JSR $D0EB open channel to read C6E5 20 E8 D4 JSR $D4E8 set buffer pointer C6E8 AD 53 02 LDA $0253 C6EB 10 0A BPL $C6F7 not yet last entry? C6ED AD 8D 02 LDA $028D C6F0 D0 0A BNE $C6FC C6F2 20 06 C8 JSR $C806 write 'blocks free.' C6F5 18 CLC C6F6 60 RTS C6F7 AD 8D 02 LDA $028D C6FA F0 1F BEQ $C71B C6FC CE 8D 02 DEC $028D C6FF D0 0D BNE $C70E C701 CE 8D 02 DEC $028D C704 20 8F C3 JSR $C38F change drive C707 20 06 C8 JSR $C806 write 'blocks free.' C70A 38 SEC C70B 4C 8F C3 JMP $C38F change drive C70E A9 00 LDA #$00 C710 8D 73 02 STA $0273 drive no. for header, hi-byte C713 8D 8D 02 STA $028D C716 20 B7 C7 JSR $C7B7 write header C719 38 SEC C71A 60 RTS C71B A2 18 LDX #$18 C71D A0 1D LDY #$1D C71F B1 94 LDA ($94),Y number of blocks hi C721 8D 73 02 STA $0273 in buffer C724 F0 02 BEQ $C728 zero? C726 A2 16 LDX #$16 C728 88 DEY C729 B1 94 LDA ($94),Y number of blocks lo C72B 8D 72 02 STA $0272 in buffer C72E E0 16 CPX #$16 C730 F0 0A BEQ $C73C C732 C9 0A CMP #$0A 10 C734 90 06 BCC $C73C C736 CA DEX C737 C9 64 CMP #$64 100 C739 90 01 BCC $C73C C73B CA DEX C73C 20 AC C7 JSR $C7AC erase buffer C73F B1 94 LDA ($94),Y file type C741 48 PHA C742 0A ASL A bit 7 in carry C743 10 05 BPL $C74A bit 6 not set? C745 A9 3C LDA #$3C '<' for protected file C747 9D B2 02 STA $02B2,X write behind file type C74A 68 PLA C74B 29 0F AND #$0F isolate bits 0-3 C74D A8 TAY as file type marker C74E B9 C5 FE LDA $FEC5,Y 3rd letter of the file type C751 9D B1 02 STA $02B1,X in buffer C754 CA DEX C755 B9 C0 FE LDA $FEC0,Y 2nd letter of the file type C758 9D B1 02 STA $02B1,X in buffer C75B CA DEX C75C B9 BB FE LDA $FEBB,Y 1st letter of the file type C75F 9D B1 02 STA $02B1,X in buffer C762 CA DEX C763 CA DEX C764 B0 05 BCS $C76B file not closed? C766 A9 2A LDA #$2A '*' C768 9D B2 02 STA $02B2,X before file type in buffer C76B A9 A0 LDA #$A0 pad with 'shift blank' C76D 9D B1 02 STA $02B1,X in buffer C770 CA DEX C771 A0 12 LDY #$12 C773 B1 94 LDA ($94),Y filenames C775 9D B1 02 STA $02B1,X write in buffer C778 CA DEX C779 88 DEY C77A C0 03 CPY #$03 C77C B0 F5 BCS $C773 C77E A9 22 LDA #$22 '=' C780 9D B1 02 STA $02B1,X write before file type C783 E8 INX C784 E0 20 CPX #$20 C786 B0 0B BCS $C793 C788 BD B1 02 LDA $02B1,X character from buffer C78B C9 22 CMP #$22 '='? C78D F0 04 BEQ $C793 C78F C9 A0 CMP #$A0 'shift blank' at end of name C791 D0 F0 BNE $C783 C793 A9 22 LDA #$22 fill through '=' C795 9D B1 02 STA $02B1,X C798 E8 INX C799 E0 20 CPX #$20 C79B B0 0A BCS $C7A7 C79D A9 7F LDA #$7F bit 7 C79F 3D B1 02 AND $02B1,X C7A2 9D B1 02 STA $02B1,X erase in the remaining chars C7A5 10 F1 BPL $C798 C7A7 20 B5 C4 JSR $C4B5 search for the directory entry C7AA 38 SEC C7AB 60 RTS ****************************** erase directory buffer C7AC A0 1B LDY #$1B C7AE A9 20 LDA #$20 ' ' blank C7B0 99 B0 02 STA $02B0,Y write in buffer C7B3 88 DEY C7B4 D0 FA BNE $C7B0 C7B6 60 RTS ****************************** create header with disk name C7B7 20 19 F1 JSR $F119 initialize if needed C7BA 20 DF F0 JSR $F0DF read disk name C7BD 20 AC C7 JSR $C7AC erase buffer C7C0 A9 FF LDA #$FF C7C2 85 6F STA $6F C7C4 A6 7F LDX $7F drive number C7C6 8E 72 02 STX $0272 as block number lo in buffer C7C9 A9 00 LDA #$00 C7CB 8D 73 02 STA $0273 block number lo C7CE A6 F9 LDX $F9 buffer number C7D0 BD E0 FE LDA $FEE0,X hi-byte of the buffer address C7D3 85 95 STA $95 C7D5 AD 88 FE LDA $FE88 $90, position of disk name C7D8 85 94 STA $94 save C7DA A0 16 LDY #$16 C7DC B1 94 LDA ($94),Y pad buffer with 'shift blank' C7DE C9 A0 CMP #$A0 C7E0 D0 0B BNE $C7ED C7E2 A9 31 LDA #$31 '1' C7E4 2C .BYTE $2C C7E5 B1 94 LDA ($94),Y character from buffer C7E7 C9 A0 CMP #$A0 compare with 'shift blank' C7E9 D0 02 BNE $C7ED C7EB A9 20 LDA #$20 ' ' blank C7ED 99 B3 02 STA $02B3,Y in buffer C7F0 88 DEY C7F1 10 F2 BPL $C7E5 C7F3 A9 12 LDA #$12 'RVS ON' C7F5 8D B1 02 STA $02B1 in buffer C7F8 A9 22 LDA #$22 '"' C7FA 8D B2 02 STA $02B2 write before C7FD 8D C3 02 STA $02C3 and after disk name C800 A9 20 LDA #$20 ' ' blank C802 8D C4 02 STA $02C4 behind it C805 60 RTS ****************************** create last line C806 20 AC C7 JSR $C7AC erase buffer C809 A0 0B LDY #$0B 12 characters C80B B9 17 C8 LDA $C817,Y 'blocks free.' C80E 99 B1 02 STA $02B1,Y write in buffer C811 88 DEY C812 10 F7 BPL $C80B C814 4C 4D EF JMP $EF4D number of free blocks in front ****************************** C817 42 4C 4F 43 4B 53 20 46 'blocks f' C81D 52 45 45 2E 'ree.' ****************************** S command, 'scratch' C823 20 98 C3 JSR $C398 ascertain file type C826 20 20 C3 JSR $C320 get drive number C829 20 CA C3 JSR $C3CA initialize drive if needed C82C A9 00 LDA #$00 C82E 85 86 STA $86 counter for erased files C830 20 9D C4 JSR $C49D search for file in directory C833 30 3D BMI $C872 not found? C835 20 B7 DD JSR $DDB7 is file open C838 90 33 BCC $C86D yes C83A A0 00 LDY #$00 C83C B1 94 LDA ($94),Y file type C83E 29 40 AND #$40 scratch protect C840 D0 2B BNE $C86D yes C842 20 B6 C8 JSR $C8B6 erase file and note in directory C845 A0 13 LDY #$13 C847 B1 94 LDA ($94),Y track number of the first side-sector C849 F0 0A BEQ $C855 none present? C84B 85 80 STA $80 note track number C84D C8 INY C84E B1 94 LDA ($94),Y and sector number C850 85 81 STA $81 C852 20 7D C8 JSR $C87D erase side-sector C855 AE 53 02 LDX $0253 file number C858 A9 20 LDA #$20 C85A 35 E7 AND $E7,X bit 5 set? C85C D0 0D BNE $C86B yes, file not closed C85E BD 80 02 LDA $0280,X get track C861 85 80 STA $80 C863 BD 85 02 LDA $0285,X and sector C866 85 81 STA $81 C868 20 7D C8 JSR $C87D erase file C86B E6 86 INC $86 increment number of erased files C86D 20 8B C4 JSR $C48B search for next file C870 10 C3 BPL $C835 if present, erase C872 A5 86 LDA $86 number of erased files C874 85 80 STA $80 save as 'track' C876 A9 01 LDA #$01 1 as disk status C878 A0 00 LDY #$00 0 as 'sector' C87A 4C A3 C1 JMP $C1A3 message 'files scratched' ****************************** erase file C87D 20 5F EF JSR $EF5F free block in BAM C880 20 75 D4 JSR $D475 C883 20 19 F1 JSR $F119 get buffer number in BAM C886 B5 A7 LDA $A7,X C888 C9 FF CMP #$FF C88A F0 08 BEQ $C894 C88C AD F9 02 LDA $02F9 C88F 09 40 ORA #$40 C891 8D F9 02 STA $02F9 C894 A9 00 LDA #$00 C896 20 C8 D4 JSR $D4C8 buffer pointer to zero C899 20 56 D1 JSR $D156 get track C89C 85 80 STA $80 C89E 20 56 D1 JSR $D156 get sector C8A1 85 81 STA $81 C8A3 A5 80 LDA $80 track number C8A5 D0 06 BNE $C8AD not equal to zero C8A7 20 F4 EE JSR $EEF4 write BAM C8AA 4C 27 D2 JMP $D227 close channel C8AD 20 5F EF JSR $EF5F free block in BAM C8B0 20 4D D4 JSR $D44D read next block C8B3 4C 94 C8 JMP $C894 and continue ****************************** erase directory entry C8B6 A0 00 LDY #$00 C8B8 98 TYA C8B9 91 94 STA ($94),Y set file type to zero C8BB 20 5E DE JSR $DE5E write block C8BE 4C 99 D5 JMP $D599 and check ****************************** D command, 'backup' C8C1 A9 31 LDA #$31 C8C3 4C C8 C1 JMP $C1C8 31, 'syntax error' ****************************** format diskette C8C6 A9 4C LDA #$4C JMP-command C8C8 8D 00 06 STA $0600 C8CB A9 C7 LDA #$C7 C8CD 8D 01 06 STA $0601 JMP $FAC7 in $600 to $602 C8D0 A9 FA LDA #$FA C8D2 8D 02 06 STA $0602 C8D5 A9 03 LDA #$03 C8D7 20 D3 D6 JSR $D6D3 set track and sector number C8DA A5 7F LDA $7F drive number C8DC 09 E0 ORA #$E0 command code for formatting C8DE 85 03 STA $03 transmit C8E0 A5 03 LDA $03 C8E2 30 FC BMI $C8E0 wait until formatting done C8E4 C9 02 CMP #$02 C8E6 90 07 BCC $C8EF smaller than two, then ok C8E8 A9 03 LDA #$03 C8EA A2 00 LDX #$00 C8EC 4C 0A E6 JMP $E60A 21, 'read error' C8EF 60 RTS ****************************** C command, 'copy' C8F0 A9 E0 LDA #$E0 C8F2 8D 4F 02 STA $024F C8F5 20 D1 F0 JSR $F0D1 C8F8 20 19 F1 JSR $F119 get buffer number of BAM C8FB A9 FF LDA #$FF C8FD 95 A7 STA $A7,X C8FF A9 0F LDA #$0F C901 8D 56 02 STA $0256 C904 20 E5 C1 JSR $C1E5 check input line C907 D0 03 BNE $C90C C909 4C C1 C8 JMP $C8C1 31, 'syntax error' C90C 20 F8 C1 JSR $C1F8 check input C90F 20 20 C3 JSR $C320 test drive number C912 AD 8B 02 LDA $028B flag for syntax check C915 29 55 AND #$55 C917 D0 0F BNE $C928 C919 AE 7A 02 LDX $027A C91C BD 00 02 LDA $0200,X character of the command C91F C9 2A CMP #$2A '*' C921 D0 05 BNE $C928 C923 A9 30 LDA #$30 C925 4C C8 C1 JMP $C1C8 30, 'syntax error' C928 AD 8B 02 LDA $028B syntax flag C92B 29 D9 AND #$D9 C92D D0 F4 BNE $C923 30, 'syntax error' C92F 4C 52 C9 JMP $C952 C932 A9 00 LDA #$00 C934 8D 58 02 STA $0258 C937 8D 8C 02 STA $028C number of drives C93A 8D 80 02 STA $0280 track number in directory C93D 8D 81 02 STA $0281 C940 A5 E3 LDA $E3 C942 29 01 AND #$01 C944 85 7F STA $7F drive number C946 09 01 ORA #$01 C948 8D 91 02 STA $0291 C94B AD 7B 02 LDA $027B C94E 8D 7A 02 STA $027A C951 60 RTS C952 20 4F C4 JSR $C44F search for file in directory C955 AD 78 02 LDA $0278 number of filenames in command C958 C9 03 CMP #$03 smaller than three? C95A 90 45 BCC $C9A1 yes C95C A5 E2 LDA $E2 first drive number C95E C5 E3 CMP $E3 second drive number C960 D0 3F BNE $C9A1 not on same drive? C962 A5 DD LDA $DD directory block of the 1st file C964 C5 DE CMP $DE same directory block as second file? C966 D0 39 BNE $C9A1 no C968 A5 D8 LDA $D8 directory sector of first file C96A C5 D9 CMP $D9 same directory sector as second file? C96C D0 33 BNE $C9A1 no C96E 20 CC CA JSR $CACC is file present? C971 A9 01 LDA #$01 C973 8D 79 02 STA $0279 C976 20 FA C9 JSR $C9FA C979 20 25 D1 JSR $D125 get data type C97C F0 04 BEQ $C982 rel-file? yes C97E C9 02 CMP #$02 prg-file? C980 D0 05 BNE $C987 no C982 A9 64 LDA #$64 C984 20 C8 C1 JSR $C1C8 64, 'file type mismatch' C987 A9 12 LDA #$12 18 C989 85 83 STA $83 secondary address C98B AD 3C 02 LDA $023C C98E 8D 3D 02 STA $023D C991 A9 FF LDA #$FF C993 8D 3C 02 STA $023C C996 20 2A DA JSR $DA2A prepare append C999 A2 02 LDX #$02 C99B 20 B9 C9 JSR $C9B9 copy file C99E 4C 94 C1 JMP $C194 done C9A1 20 A7 C9 JSR $C9A7 copy file C9A4 4C 94 C1 JMP $C194 done C9A7 20 E7 CA JSR $CAE7 C9AA A5 E2 LDA $E2 drive number of first file C9AC 29 01 AND #$01 C9AE 85 7F STA $7F drive number C9B0 20 86 D4 JSR $D486 C9B3 20 E4 D6 JSR $D6E4 enter file in directory C9B6 AE 77 02 LDX $0277 C9B9 8E 79 02 STX $0279 C9BC 20 FA C9 JSR $C9FA C9BF A9 11 LDA #$11 17 C9C1 85 83 STA $83 C9C3 20 EB D0 JSR $D0EB C9C6 20 25 D1 JSR $D125 get data type C9C9 D0 03 BNE $C9CE no rel-file? C9CB 20 53 CA JSR $CA53 C9CE A9 08 LDA #$08 C9D0 85 F8 STA $F8 C9D2 4C D8 C9 JMP $C9D8 C9D5 20 9B CF JSR $CF9B write byte in buffer C9D8 20 35 CA JSR $CA35 and get byte C9DB A9 80 LDA #$80 C9DD 20 A6 DD JSR $DDA6 test bit 7 C9E0 F0 F3 BEQ $C9D5 not set? C9E2 20 25 D1 JSR $D125 check file type C9E5 F0 03 BEQ $C9EA rel-file? C9E7 20 9B CF JSR $CF9B get data byte in buffer C9EA AE 79 02 LDX $0279 C9ED E8 INX C9EE EC 78 02 CPX $0278 C9F1 90 C6 BCC $C9B9 C9F3 A9 12 LDA #$12 18 C9F5 85 83 STA $83 C9F7 4C 02 DB JMP $DB02 close channel C9FA AE 79 02 LDX $0279 C9FD B5 E2 LDA $E2,X drive number C9FF 29 01 AND #$01 CA01 85 7F STA $7F save CA03 AD 85 FE LDA $FE85 18, directory track CA06 85 80 STA $80 save CA08 B5 D8 LDA $D8,X directory sector CA0A 85 81 STA $81 CA0C 20 75 D4 JSR $D475 read block CA0F AE 79 02 LDX $0279 CA12 B5 DD LDA $DD,X pointer in block CA14 20 C8 D4 JSR $D4C8 set buffer pointer CA17 AE 79 02 LDX $0279 CA1A B5 E7 LDA $E7,X file type CA1C 29 07 AND #$07 isolate CA1E 8D 4A 02 STA $024A and save CA21 A9 00 LDA #$00 CA23 8D 58 02 STA $0258 CA26 20 A0 D9 JSR $D9A0 get parameters for rel-file CA29 A0 01 LDY #$01 CA2B 20 25 D1 JSR $D125 get file type CA2E F0 01 BEQ $CA31 rel-file? CA30 C8 INY CA31 98 TYA CA32 4C C8 D4 JMP $D4C8 set buffer pointer CA35 A9 11 LDA #$11 11 CA37 85 83 STA $83 CA39 20 9B D3 JSR $D39B open channel and get byte CA3C 85 85 STA $85 CA3E A6 82 LDX $82 channel number CA40 B5 F2 LDA $F2,X CA42 29 08 AND #$08 isolate end marker CA44 85 F8 STA $F8 CA46 D0 0A BNE $CA52 not set? CA48 20 25 D1 JSR $D125 get data type CA4B F0 05 BEQ $CA52 rel-file? CA4D A9 80 LDA #$80 CA4F 20 97 DD JSR $DD97 set bit 7 CA52 60 RTS CA53 20 D3 D1 JSR $D1D3 set drive number CA56 20 CB E1 JSR $E1CB CA59 A5 D6 LDA $D6 CA5B 48 PHA CA5C A5 D5 LDA $D5 CA5E 48 PHA CA5F A9 12 LDA #$12 18 CA61 85 83 STA $83 CA63 20 07 D1 JSR $D107 open write channel CA66 20 D3 D1 JSR $D1D3 set drive number CA69 20 CB E1 JSR $E1CB CA6C 20 9C E2 JSR $E29C CA6F A5 D6 LDA $D6 CA71 85 87 STA $87 CA73 A5 D5 LDA $D5 CA75 85 86 STA $86 CA77 A9 00 LDA #$00 CA79 85 88 STA $88 CA7B 85 D4 STA $D4 CA7D 85 D7 STA $D7 CA7F 68 PLA CA80 85 D5 STA $D5 CA82 68 PLA CA83 85 D6 STA $D6 CA85 4C 3B E3 JMP $E33B ****************************** R command, 'rename' CA88 20 20 C3 JSR $C320 get drive number from command line CA8B A5 E3 LDA $E3 CA8D 29 01 AND #$01 CA8F 85 E3 STA $E3 2nd drive number CA91 C5 E2 CMP $E2 compare with 1st drive number CA93 F0 02 BEQ $CA97 same? CA95 09 80 ORA #$80 CA97 85 E2 STA $E2 CA99 20 4F C4 JSR $C44F search for file in directory CA9C 20 E7 CA JSR $CAE7 does name exist? CA9F A5 E3 LDA $E3 CAA1 29 01 AND #$01 CAA3 85 7F STA $7F drive number CAA5 A5 D9 LDA $D9 CAA7 85 81 STA $81 sector number CAA9 20 57 DE JSR $DE57 read block from directory CAAC 20 99 D5 JSR $D599 ok? CAAF A5 DE LDA $DE pointer to directory entry CAB1 18 CLC CAB2 69 03 ADC #$03 pointer plus 3 to file name CAB4 20 C8 D4 JSR $D4C8 set buffer pointer CAB7 20 93 DF JSR $DF93 get buffer number CABA A8 TAY CABB AE 7A 02 LDX $027A CABE A9 10 LDA #$10 16 characters CAC0 20 6E C6 JSR $C66E write name in buffer CAC3 20 5E DE JSR $DE5E write block to directory CAC6 20 99 D5 JSR $D599 ok? CAC9 4C 94 C1 JMP $C194 done, prepare disk status ****************************** check if file present CACC A5 E8 LDA $E8 file type CACE 29 07 AND #$07 CAD0 8D 4A 02 STA $024A save CAD3 AE 78 02 LDX $0278 CAD6 CA DEX CAD7 EC 77 02 CPX $0277 CADA 90 0A BCC $CAE6 CADC BD 80 02 LDA $0280,X track number CADF D0 F5 BNE $CAD6 not zero? CAE1 A9 62 LDA #$62 CAE3 4C C8 C1 JMP $C1C8 62, 'file not found' CAE6 60 RTS CAE7 20 CC CA JSR $CACC does file exist with old name? CAEA BD 80 02 LDA $0280,X track number of new file CAED F0 05 BEQ $CAF4 file erased? CAEF A9 63 LDA #$63 CAF1 4C C8 C1 JMP $C1C8 63, 'file exists' CAF4 CA DEX CAF5 10 F3 BPL $CAEA CAF7 60 RTS ****************************** M command, 'memory' CAF8 AD 01 02 LDA $0201 2nd character from buffer CAFB C9 2D CMP #$2D '-' CAFD D0 4C BNE $CB4B CAFF AD 03 02 LDA $0203 CB02 85 6F STA $6F address in $6F/$70 CB04 AD 04 02 LDA $0204 CB07 85 70 STA $70 CB09 A0 00 LDY #$00 CB0B AD 02 02 LDA $0202 3rd character from buffer CB0E C9 52 CMP #$52 'R' CB10 F0 0E BEQ $CB20 to memory read CB12 20 58 F2 JSR $F258 (RTS) CB15 C9 57 CMP #$57 'W' CB17 F0 37 BEQ $CB50 to memory write CB19 C9 45 CMP #$45 'E' CB1B D0 2E BNE $CB4B CB1D 6C 6F 00 JMP ($006F) memory-execute ****************************** M-R command, 'Memory-Read' CB20 B1 6F LDA ($6F),Y read byte CB22 85 85 STA $85 CB24 AD 74 02 LDA $0274 length of command line CB27 C9 06 CMP #$06 less than 6? CB29 90 1A BCC $CB45 yes CB2B AE 05 02 LDX $0205 number CB2E CA DEX CB2F F0 14 BEQ $CB45 only one byte? CB31 8A TXA number of bytes CB32 18 CLC CB33 65 6F ADC $6F plus start address CB35 E6 6F INC $6F CB37 8D 49 02 STA $0249 end pointer CB3A A5 6F LDA $6F CB3C 85 A5 STA $A5 buffer pointer for error message CB3E A5 70 LDA $70 set to start address for 'M-R' CB40 85 A6 STA $A6 CB42 4C 43 D4 JMP $D443 byte out CB45 20 EB D0 JSR $D0EB open read channel CB48 4C 3A D4 JMP $D43A byte out CB4B A9 31 LDA #$31 CB4D 4C C8 C1 JMP $C1C8 31, 'syntax error' ****************************** M-W command, 'memory write' CB50 B9 06 02 LDA $0206,Y read character CB53 91 6F STA ($6F),Y and save CB55 C8 INY CB56 CC 05 02 CPY $0205 number of characters CB59 90 F5 BCC $CB50 all characters? CB5B 60 RTS ****************************** U command, 'user' CB5C AC 01 02 LDY $0201 second char CB5F C0 30 CPY #$30 '0' CB61 D0 09 BNE $CB6C no CB63 A9 EA LDA #$EA CB65 85 6B STA $6B pointer to table of user-addresses CB67 A9 FF LDA #$FF $FFEA CB69 85 6C STA $6C CB6B 60 RTS CB6C 20 72 CB JSR $CB72 CB6F 4C 94 C1 JMP $C194 done, prepare error message CB72 88 DEY CB73 98 TYA CB74 29 0F AND #$0F number CB76 0A ASL A times 2 CB77 A8 TAY CB78 B1 6B LDA ($6B),Y as pointer in table CB7A 85 75 STA $75 CB7C C8 INY address at $75/$76 CB7D B1 6B LDA ($6B),Y CB7F 85 76 STA $76 CB81 6C 75 00 JMP ($0075) execute function ****************************** open direct access channel, '#' CB84 AD 8E 02 LDA $028E last drive number CB87 85 7F STA $7F drive number CB89 A5 83 LDA $83 channel number CB8B 48 PHA CB8C 20 3D C6 JSR $C63D check drive and initialize CB8F 68 PLA CB90 85 83 STA $83 CB92 AE 74 02 LDX $0274 length of filename CB95 CA DEX CB96 D0 0D BNE $CBA5 greater than one? CB98 A9 01 LDA #$01 CB9A 20 E2 D1 JSR $D1E2 layout buffer and channel CB9D 4C F1 CB JMP $CBF1 set flags, done CBA0 A9 70 LDA #$70 CBA2 4C C8 C1 JMP $C1C8 70, 'no channel' CBA5 A0 01 LDY #$01 CBA7 20 7C CC JSR $CC7C get buffer number CBAA AE 85 02 LDX $0285 buffer number CBAD E0 05 CPX #$05 bigger than 5? CBAF B0 EF BCS $CBA0 70, 'no channel' CBB1 A9 00 LDA #$00 CBB3 85 6F STA $6F CBB5 85 70 STA $70 CBB7 38 SEC CBB8 26 6F ROL $6F CBBA 26 70 ROL $70 CBBC CA DEX CBBD 10 F9 BPL $CBB8 CBBF A5 6F LDA $6F CBC1 2D 4F 02 AND $024F CBC4 D0 DA BNE $CBA0 CBC6 A5 70 LDA $70 CBC8 2D 50 02 AND $0250 CBCB D0 D3 BNE $CBA0 CBCD A5 6F LDA $6F CBCF 0D 4F 02 ORA $024F CBD2 8D 4F 02 STA $024F CBD5 A5 70 LDA $70 CBD7 0D 50 02 ORA $0250 CBDA 8D 50 02 STA $0250 CBDD A9 00 LDA #$00 CBDF 20 E2 D1 JSR $D1E2 search channel CBE2 A6 82 LDX $82 channel number CBE4 AD 85 02 LDA $0285 buffer number CBE7 95 A7 STA $A7,X CBE9 AA TAX CBEA A5 7F LDA $7F drive number CBEC 95 00 STA $00,X CBEE 9D 5B 02 STA $025B,X CBF1 A6 83 LDX $83 secondary address CBF3 BD 2B 02 LDA $022B,X CBF6 09 40 ORA #$40 set READ and WRITE flags CBF8 9D 2B 02 STA $022B,X CBFB A4 82 LDY $82 channel number CBFD A9 FF LDA #$FF CBFF 99 44 02 STA $0244,Y end pointer CC02 A9 89 LDA #$89 CC04 99 F2 00 STA $00F2,Y set READ and WRITE flags CC07 B9 A7 00 LDA $00A7,Y buffer number CC0A 99 3E 02 STA $023E,Y CC0D 0A ASL A times 2 CC0E AA TAX CC0F A9 01 LDA #$01 CC11 95 99 STA $99,X buffer pointer to one CC13 A9 0E LDA #$0E CC15 99 EC 00 STA $00EC,Y flag for direct access CC18 4C 94 C1 JMP $C194 done ****************************** B-command, 'block' CC1B A0 00 LDY #$00 CC1D A2 00 LDX #$00 CC1F A9 2D LDA #$2D '-' CC21 20 68 C2 JSR $C268 search for minus sign CC24 D0 0A BNE $CC30 found? CC26 A9 31 LDA #$31 CC28 4C C8 C1 JMP $C1C8 31, 'syntax error' CC2B A9 30 LDA #$30 CC2D 4C C8 C1 JMP $C1C8 30, 'syntax error' CC30 8A TXA CC31 D0 F8 BNE $CC2B comma, then error CC33 A2 05 LDX #$05 CC35 B9 00 02 LDA $0200,Y char from buffer CC38 DD 5D CC CMP $CC5D,X compare with 'AFRWEP' CC3B F0 05 BEQ $CC42 found? CC3D CA DEX CC3E 10 F8 BPL $CC38 compare with all characters CC40 30 E4 BMI $CC26 not found, error CC42 8A TXA CC43 09 80 ORA #$80 command number, set bit 7 CC45 8D 2A 02 STA $022A CC48 20 6F CC JSR $CC6F get parameters CC4B AD 2A 02 LDA $022A CC4E 0A ASL A number times 2 CC4F AA TAX as index CC50 BD 64 CC LDA $CC63,X address of command hi CC53 85 70 STA $70 CC55 BD 63 CC LDA $CC63,X address lo CC58 85 6F STA $6F CC5A 6C 6F 00 JMP ($006F) jump to command ****************************** names of the various block cmds CC5D 41 46 52 57 45 50 'AFRWEP' ****************************** addresses of block commands CC63 03 CD CD03, B-A CC65 F5 CC CCF5, B-F CC67 56 CD CD56, B-R CC69 73 CD CD73, B-W CC6B A3 CD CDA3, B-E CC6D BD CD CDBD, B-P ****************************** get parameters for block commands CC6F A0 00 LDY #$00 CC71 A2 00 LDX #$00 CC73 A9 3A LDA #$3A ':' CC75 20 68 C2 JSR $C268 test line to colon CC78 D0 02 BNE $CC7C found? CC7A A0 03 LDY #$03 no, begin at 4th character CC7C B9 00 02 LDA $0200,Y search for separating char CC7F C9 20 CMP #$20 ' ' blank CC81 F0 08 BEQ $CC8B CC83 C9 1D CMP #$1D cursor right CC85 F0 04 BEQ $CC8B CC87 C9 2C CMP #$2C ',' comma CC89 D0 07 BNE $CC92 CC8B C8 INY CC8C CC 74 02 CPY $0274 line end? CC8F 90 EB BCC $CC7C CC91 60 RTS CC92 20 A1 CC JSR $CCA1 preserve next parameter CC95 EE 77 02 INC $0277 increment parameter counter CC98 AC 79 02 LDY $0279 CC9B E0 04 CPX #$04 compare with maximum number CC9D 90 EC BCC $CC8B CC9F B0 8A BCS $CC2B 30, 'syntax error' CCA1 A9 00 LDA #$00 CCA3 85 6F STA $6F CCA5 85 70 STA $70 erase storage area for decimal numbers CCA7 85 72 STA $72 CCA9 A2 FF LDX #$FF CCAB B9 00 02 LDA $0200,Y get characters from input buffer CCAE C9 40 CMP #$40 CCB0 B0 18 BCS $CCCA no digits? CCB2 C9 30 CMP #$30 '0' CCB4 90 14 BCC $CCCA no digits? CCB6 29 0F AND #$0F convert ASCII digits to hex CCB8 48 PHA and save CCB9 A5 70 LDA $70 CCBB 85 71 STA $71 move digits one further CCBD A5 6F LDA $6F CCBF 85 70 STA $70 CCC1 68 PLA CCC2 85 6F STA $6F note read number CCC4 C8 INY increment pointer in input buffer CCC5 CC 74 02 CPY $0274 line end reached CCC8 90 E1 BCC $CCAB no CCCA 8C 79 02 STY $0279 save pointer CCCD 18 CLC CCCE A9 00 LDA #$00 CCD0 E8 INX CCD1 E0 03 CPX #$03 CCD3 B0 0F BCS $CCE4 convert hex digits to one byte CCD5 B4 6F LDY $6F,X CCD7 88 DEY CCD8 30 F6 BMI $CCD0 CCDA 7D F2 CC ADC $CCF2,X add decimal value CCDD 90 F8 BCC $CCD7 CCDF 18 CLC CCE0 E6 72 INC $72 CCE2 D0 F3 BNE $CCD7 CCE4 48 PHA CCE5 AE 77 02 LDX $0277 counter for paramaters CCE8 A5 72 LDA $72 CCEA 9D 80 02 STA $0280,X hi-byte CCED 68 PLA CCEE 9D 85 02 STA $0285,X lo-byte CCF1 60 RTS ****************************** decimal values CCF2 01 0A 64 1, 10, 100 ****************************** B-F command, 'Block-Free' CCF5 20 F5 CD JSR $CDF5 get track, sector and drive number CCF8 20 5F EF JSR $EF5F free block CCFB 4C 94 C1 JMP $C194 done, prepare error message ****************************** CCFE A9 01 LDA #$01 CD00 8D F9 02 STA $02F9 ****************************** B-A command, 'Block-Allocate' CD03 20 F5 CD JSR $CDF5 get track, sector and drive number CD06 A5 81 LDA $81 sector CD08 48 PHA save CD09 20 FA F1 JSR $F1FA find block in BAM CD0C F0 0B BEQ $CD19 block allocated? CD0E 68 PLA desired sector CD0F C5 81 CMP $81 = next free sector? CD11 D0 19 BNE $CD2C no CD13 20 90 EF JSR $EF90 allocate block in BAM CD16 4C 94 C1 JMP $C194 done CD19 68 PLA CD1A A9 00 LDA #$00 CD1C 85 81 STA $81 sector 0 CD1E E6 80 INC $80 next track CD20 A5 80 LDA $80 track number CD22 CD D7 FE CMP $FED7 36, last track number + 1 CD25 B0 0A BCS $CD31 >=, then 'no block' CD27 20 FA F1 JSR $F1FA find free block in next track CD2A F0 EE BEQ $CD1A not found, check next track CD2C A9 65 LDA #$65 CD2E 20 45 E6 JSR $E645 65, 'no block' next free block CD31 A9 65 LDA #$65 CD33 20 C8 C1 JSR $C1C8 65, 'no block' no more free blocks ****************************** CD36 20 F2 CD JSR $CDF2 open channel, set parameters CD39 4C 60 D4 JMP $D460 read block from disk ****************************** get byte from buffer CD3C 20 2F D1 JSR $D12F set pointer to buffer CD3F A1 99 LDA ($99,X) get byte CD41 60 RTS ****************************** read block from disk CD42 20 36 CD JSR $CD36 open channel, read block CD45 A9 00 LDA #$00 CD47 20 C8 D4 JSR $D4C8 set buffer pointer to zero CD4A 20 3C CD JSR $CD3C get a byte from the buffer CD4D 99 44 02 STA $0244,Y CD50 A9 89 LDA #$89 set read and write flag CD52 99 F2 00 STA $00F2,Y CD55 60 RTS ****************************** B-R command, 'Block-Read' CD56 20 42 CD JSR $CD42 read block from disk CD59 20 EC D3 JSR $D3EC prepare byte from buffer CD5C 4C 94 C1 JMP $C194 prepare error message ****************************** U1 command, sub. for 'Block-Read' CD5F 20 6F CC JSR $CC6F get parameters of the command CD62 20 42 CD JSR $CD42 read block from disk CD65 B9 44 02 LDA $0244,Y end pointer CD68 99 3E 02 STA $023E,Y save as data byte CD6B A9 FF LDA #$FF CD6D 99 44 02 STA $0244,Y end pointer to $FF CD70 4C 94 C1 JMP $C194 done, prepare error message ****************************** B-W command, 'Block-Write' CD73 20 F2 CD JSR $CDF2 open channel CD76 20 E8 D4 JSR $D4E8 set buffer pointer CD79 A8 TAY CD7A 88 DEY CD7B C9 02 CMP #$02 buffer pointer lo less than 2? CD7D B0 02 BCS $CD81 no CD7F A0 01 LDY #$01 CD81 A9 00 LDA #$00 CD83 20 C8 D4 JSR $D4C8 buffer pointer to zero CD86 98 TYA CD87 20 F1 CF JSR $CFF1 write byte in buffer CD8A 8A TXA CD8B 48 PHA CD8C 20 64 D4 JSR $D464 write block to disk CD8F 68 PLA CD90 AA TAX CD91 20 EE D3 JSR $D3EE get byte from buffer CD94 4C 94 C1 JMP $C194 done, error message ****************************** U2 command, sub. for 'Block-Write' CD97 20 6F CC JSR $CC6F get command parameters CD9A 20 F2 CD JSR $CDF2 open channel CD9D 20 64 D4 JSR $D464 and write block to disk CDA0 4C 94 C1 JMP $C194 done ****************************** B-E command, 'Block-Execute' CDA3 20 58 F2 JSR $F258 (RTS) CDA6 20 36 CD JSR $CD36 open channel and read block CDA9 A9 00 LDA #$00 CDAB 85 6F STA $6F address low CDAD A6 F9 LDX $F9 buffer number CDAF BD E0 FE LDA $FEE0,X buffer address high CDB2 85 70 STA $70 CDB4 20 BA CD JSR $CDBA execute routine CDB7 4C 94 C1 JMP $C194 done CDBA 6C 6F 00 JMP ($006F) jump to routine ****************************** B-P command, 'Block-Pointer' CDBD 20 D2 CD JSR $CDD2 open channel, get buffer number CDC0 A5 F9 LDA $F9 buffer number CDC2 0A ASL A * 2 CDC3 AA TAX as index CDC4 AD 86 02 LDA $0286 pointer value CDC7 95 99 STA $99,X save as buffer pointer CDC9 20 2F D1 JSR $D12F prepare a byte in buffer CDCC 20 EE D3 JSR $D3EE for output CDCF 4C 94 C1 JMP $C194 done ****************************** open channel CDD2 A6 D3 LDX $D3 CDD4 E6 D3 INC $D3 CDD6 BD 85 02 LDA $0285,X buffer number CDD9 A8 TAY CDDA 88 DEY CDDB 88 DEY CDDC C0 0C CPY #$0C buffer number smaller than 14? CDDE 90 05 BCC $CDE5 yes CDE0 A9 70 LDA #$70 CDE2 4C C8 C1 JMP $C1C8 70, 'no channel' CDE5 85 83 STA $83 secondary address CDE7 20 EB D0 JSR $D0EB open channel CDEA B0 F4 BCS $CDE0 already allocated, 'no channel' CDEC 20 93 DF JSR $DF93 buffer number CDEF 85 F9 STA $F9 set CDF1 60 RTS ****************************** CDF2 20 D2 CD JSR $CDD2 check buffer number and open channel CDF5 A6 D3 LDX $D3 channel number CDF7 BD 85 02 LDA $0285,X buffer address CDFA 29 01 AND #$01 CDFC 85 7F STA $7F drive number CDFE BD 87 02 LDA $0287,X CE01 85 81 STA $81 sector CE03 BD 86 02 LDA $0286,X CE06 85 80 STA $80 track CE08 20 5F D5 JSR $D55F track and sector ok? CE0B 4C 00 C1 JMP $C100 turn LED on ****************************** set pointer for REL-file CE0E 20 2C CE JSR $CE2C record number * record length CE11 20 6E CE JSR $CE6E divide by 254 CE14 A5 90 LDA $90 remainder = pointer in data block CE16 85 D7 STA $D7 data pointer CE18 20 71 CE JSR $CE71 divide by 120 = side-sector number CE1B E6 D7 INC $D7 CE1D E6 D7 INC $D7 data pointer + 2 (track/sector pointer!) CE1F A5 8B LDA $8B result of division CE21 85 D5 STA $D5 equals side-sector number CE23 A5 90 LDA $90 remainder CE25 0A ASL A times 2 CE26 18 CLC CE27 69 10 ADC #$10 plus 16 CE29 85 D6 STA $D6 =pointer in side-sector to data block CE2B 60 RTS ****************************** CE2C 20 D9 CE JSR $CED9 erase work storage CE2F 85 92 STA $92 CE31 A6 82 LDX $82 channel number CE33 B5 B5 LDA $B5,X record number lo CE35 85 90 STA $90 CE37 B5 BB LDA $BB,X record number hi CE39 85 91 STA $91 CE3B D0 04 BNE $CE41 CE3D A5 90 LDA $90 CE3F F0 0B BEQ $CE4C record number not zero? CE41 A5 90 LDA $90 CE43 38 SEC CE44 E9 01 SBC #$01 then subtract one CE46 85 90 STA $90 CE48 B0 02 BCS $CE4C CE4A C6 91 DEC $91 CE4C B5 C7 LDA $C7,X record length CE4E 85 6F STA $6F CE50 46 6F LSR $6F CE52 90 03 BCC $CE57 CE54 20 ED CE JSR $CEED record number * record length CE57 20 E5 CE JSR $CEE5 shift register left CE5A A5 6F LDA $6F CE5C D0 F2 BNE $CE50 CE5E A5 D4 LDA $D4 CE60 18 CLC CE61 65 8B ADC $8B CE63 85 8B STA $8B CE65 90 06 BCC $CE6D result in $8B/$8C/$8D CE67 E6 8C INC $8C CE69 D0 02 BNE $CE6D CE6B E6 8D INC $8D CE6D 60 RTS ****************************** divide by 254, calculate block number CE6E A9 FE LDA #$FE 254 CE70 2C .BYTE $2C ****************************** divide by 120, calculate side-sector number CE71 A9 78 LDA #$78 CE73 85 6F STA $6F divisor CE75 A2 03 LDX #$03 CE77 B5 8F LDA $8F,X CE79 48 PHA CE7A B5 8A LDA $8A,X CE7C 95 8F STA $8F,X CE7E 68 PLA CE7F 95 8A STA $8A,X CE81 CA DEX CE82 D0 F3 BNE $CE77 CE84 20 D9 CE JSR $CED9 erase work storage CE87 A2 00 LDX #$00 CE89 B5 90 LDA $90,X CE8B 95 8F STA $8F,X CE8D E8 INX CE8E E0 04 CPX #$04 CE90 90 F7 BCC $CE89 CE92 A9 00 LDA #$00 CE94 85 92 STA $92 CE96 24 6F BIT $6F CE98 30 09 BMI $CEA3 CE9A 06 8F ASL $8F CE9C 08 PHP CE9D 46 8F LSR $8F CE9F 28 PLP CEA0 20 E6 CE JSR $CEE6 shift register 1 left CEA3 20 ED CE JSR $CEED add register 0 to register 1 CEA6 20 E5 CE JSR $CEE5 shift register 1 left CEA9 24 6F BIT $6F CEAB 30 03 BMI $CEB0 CEAD 20 E2 CE JSR $CEE2 left-shift register 1 twice CEB0 A5 8F LDA $8F CEB2 18 CLC CEB3 65 90 ADC $90 CEB5 85 90 STA $90 CEB7 90 06 BCC $CEBF CEB9 E6 91 INC $91 CEBB D0 02 BNE $CEBF CEBD E6 92 INC $92 CEBF A5 92 LDA $92 CEC1 05 91 ORA $91 CEC3 D0 C2 BNE $CE87 CEC5 A5 90 LDA $90 CEC7 38 SEC CEC8 E5 6F SBC $6F quotient in $8B/$8C/$8D CECA 90 0C BCC $CED8 CECC E6 8B INC $8B CECE D0 06 BNE $CED6 CED0 E6 8C INC $8C CED2 D0 02 BNE $CED6 CED4 E6 8D INC $8D CED6 85 90 STA $90 remainder in $90 CED8 60 RTS ****************************** erase work storage CED9 A9 00 LDA #$00 CEDB 85 8B STA $8B CEDD 85 8C STA $8C CEDF 85 8D STA $8D CEE1 60 RTS ****************************** left shift 3-byte register twice CEE2 20 E5 CE JSR $CEE5 ****************************** left shift 3-byte register once CEE5 18 CLC CEE6 26 90 ROL $90 CEE8 26 91 ROL $91 CEEA 26 92 ROL $92 CEEC 60 RTS ****************************** CEED 18 CLC CEEE A2 FD LDX #$FD CEF0 B5 8E LDA $8E,X register $90/$91/$92 CEF2 75 93 ADC $93,X add to register $8B/$8C/$8D CEF4 95 8E STA $8E,X CEF6 E8 INX CEF7 D0 F7 BNE $CEF0 CEF9 60 RTS CEFA A2 00 LDX #$00 CEFC 8A TXA CEFD 95 FA STA $FA,X CEFF E8 INX CF00 E0 04 CPX #$04 CF02 D0 F8 BNE $CEFC CF04 A9 06 LDA #$06 CF06 95 FA STA $FA,X CF08 60 RTS CF09 A0 04 LDY #$04 CF0B A6 82 LDX $82 channel number CF0D B9 FA 00 LDA $00FA,Y CF10 96 FA STX $FA,Y CF12 C5 82 CMP $82 channel number CF14 F0 07 BEQ $CF1D CF16 88 DEY CF17 30 E1 BMI $CEFA CF19 AA TAX CF1A 4C 0D CF JMP $CF0D CF1D 60 RTS CF1E 20 09 CF JSR $CF09 CF21 20 B7 DF JSR $DFB7 CF24 D0 46 BNE $CF6C CF26 20 D3 D1 JSR $D1D3 set drive number CF29 20 8E D2 JSR $D28E CF2C 30 48 BMI $CF76 CF2E 20 C2 DF JSR $DFC2 CF31 A5 80 LDA $80 track CF33 48 PHA CF34 A5 81 LDA $81 sector CF36 48 PHA CF37 A9 01 LDA #$01 CF39 20 F6 D4 JSR $D4F6 get byte 1 from buffer CF3C 85 81 STA $81 sector CF3E A9 00 LDA #$00 CF40 20 F6 D4 JSR $D4F6 get byte 0 from buffer CF43 85 80 STA $80 track CF45 F0 1F BEQ $CF66 CF47 20 25 D1 JSR $D125 check file type CF4A F0 0B BEQ $CF57 rel-file? CF4C 20 AB DD JSR $DDAB CF4F D0 06 BNE $CF57 CF51 20 8C CF JSR $CF8C CF54 4C 5D CF JMP $CF5D CF57 20 8C CF JSR $CF8C CF5A 20 57 DE JSR $DE57 CF5D 68 PLA CF5E 85 81 STA $81 get sector CF60 68 PLA CF61 85 80 STA $80 and track number CF63 4C 6F CF JMP $CF6F CF66 68 PLA CF67 85 81 STA $81 get back sector CF69 68 PLA CF6A 85 80 STA $80 and track number CF6C 20 8C CF JSR $CF8C CF6F 20 93 DF JSR $DF93 CF72 AA TAX CF73 4C 99 D5 JMP $D599 and verify CF76 A9 70 LDA #$70 CF78 4C C8 C1 JMP $C1C8 70, 'no channel' CF7B 20 09 CF JSR $CF09 CF7E 20 B7 DF JSR $DFB7 CF81 D0 08 BNE $CF8B CF83 20 8E D2 JSR $D28E CF86 30 EE BMI $CF76 CF88 20 C2 DF JSR $DFC2 CF8B 60 RTS ****************************** change buffer CF8C A6 82 LDX $82 channel number CF8E B5 A7 LDA $A7,X CF90 49 80 EOR #$80 CF92 95 A7 STA $A7,X CF94 B5 AE LDA $AE,X rotate bit 7 in table CF96 49 80 EOR #$80 CF98 95 AE STA $AE,X CF9A 60 RTS ****************************** write data byte in buffer CF9B A2 12 LDX #$12 channel 18 CF9D 86 83 STX $83 CF9F 20 07 D1 JSR $D107 open write channel CFA2 20 00 C1 JSR $C100 turn LED on CFA5 20 25 D1 JSR $D125 check file type CFA8 90 05 BCC $CFAF no rel-file CFAA A9 20 LDA #$20 CFAC 20 9D DD JSR $DD9D change buffer CFAF A5 83 LDA $83 secondary address CFB1 C9 0F CMP #$0F 15? CFB3 F0 23 BEQ $CFD8 yes CFB5 D0 08 BNE $CFBF no CFB7 A5 84 LDA $84 secondary address CFB9 29 8F AND #$8F CFBB C9 0F CMP #$0F greater than 15? CFBD B0 19 BCS $CFD8 then input buffer CFBF 20 25 D1 JSR $D125 check file type CFC2 B0 05 BCS $CFC9 rel-file or direct access? CFC4 A5 85 LDA $85 data byte CFC6 4C 9D D1 JMP $D19D write in buffer CFC9 D0 03 BNE $CFCE direct access file? CFCB 4C AB E0 JMP $E0AB write data byte in rel-file CFCE A5 85 LDA $85 CFD0 20 F1 CF JSR $CFF1 write data byte in buffer CFD3 A4 82 LDY $82 channel number CFD5 4C EE D3 JMP $D3EE prepare next byte for output CFD8 A9 04 LDA #$04 channel 4 CFDA 85 82 STA $82 corresponding input buffer CFDC 20 E8 D4 JSR $D4E8 set buffer pointer CFDF C9 2A CMP #$2A 40 CFE1 F0 05 BEQ $CFE8 buffer end? CFE3 A5 85 LDA $85 CFE5 20 F1 CF JSR $CFF1 write data byte in buffer CFE8 A5 F8 LDA $F8 end flag set? CFEA F0 01 BEQ $CFED yes CFEC 60 RTS CFED EE 55 02 INC $0255 set command flag CFF0 60 RTS ****************************** write data byte in buffer CFF1 48 PHA save data byte CFF2 20 93 DF JSR $DF93 get buffer number CFF5 10 06 BPL $CFFD associated buffer? CFF7 68 PLA CFF8 A9 61 LDA #$61 CFFA 4C C8 C1 JMP $C1C8 61, 'file not open' CFFD 0A ASL A buffer number times 2 CFFE AA TAX as index CFFF 68 PLA data byte D000 81 99 STA ($99,X) write in buffer D002 F6 99 INC $99,X increment buffer pointer D004 60 RTS ****************************** I command, 'initialize' D005 20 D1 C1 JSR $C1D1 find drive number D008 20 42 D0 JSR $D042 load BAM D00B 4C 94 C1 JMP $C194 prepare disk status ****************************** D00E 20 0F F1 JSR $F10F D011 A8 TAY D012 B6 A7 LDX $A7,Y D014 E0 FF CPX #$FF D016 D0 14 BNE $D02C D018 48 PHA D019 20 8E D2 JSR $D28E D01C AA TAX D01D 10 05 BPL $D024 D01F A9 70 LDA #$70 D021 20 48 E6 JSR $E648 70, 'no channel' D024 68 PLA D025 A8 TAY D026 8A TXA D027 09 80 ORA #$80 D029 99 A7 00 STA $00A7,Y D02C 8A TXA D02D 29 0F AND #$0F D02F 85 F9 STA $F9 D031 A2 00 LDX #$00 D033 86 81 STX $81 sector 0 D035 AE 85 FE LDX $FE85 18 D038 86 80 STX $80 track 18 D03A 20 D3 D6 JSR $D6D3 transmit parameter to disk controller D03D A9 B0 LDA #$B0 command code 'read block header' D03F 4C 8C D5 JMP $D58C transmit to disk controller ****************************** load BAM D042 20 D1 F0 JSR $F0D1 D045 20 13 D3 JSR $D313 D048 20 0E D0 JSR $D00E read block D04B A6 7F LDX $7F drive number D04D A9 00 LDA #$00 D04F 9D 51 02 STA $0251,X reset flag for "BAM changed' D052 8A TXA D053 0A ASL A D054 AA TAX D055 A5 16 LDA $16 D057 95 12 STA $12,X D059 A5 17 LDA $17 save ID D05B 95 13 STA $13,X D05D 20 86 D5 JSR $D586 D060 A5 F9 LDA $F9 buffer number D062 0A ASL A D063 AA TAX D064 A9 02 LDA #$02 buffer pointer to $200 D066 95 99 STA $99,X D068 A1 99 LDA ($99,X) get character from buffer D06A A6 7F LDX $7F drive number D06C 9D 01 01 STA $0101,X D06F A9 00 LDA #$00 D071 95 1C STA $1C,X flag for write protect D073 95 FF STA $FF,X flag for read error ****************************** calculate blocks free D075 20 3A EF JSR $EF3A buffer address to $6D/$6E D078 A0 04 LDY #$04 begin at position 4 D07A A9 00 LDA #$00 D07C AA TAX D07D 18 CLC D07E 71 6D ADC ($6D),Y add number of free blocks per track D080 90 01 BCC $D083 D082 E8 INX X as hi-byte D083 C8 INY D084 C8 INY plus 4 D085 C8 INY D086 C8 INY D087 C0 48 CPY #$48 track 18? D089 F0 F8 BEQ $D083 then skip D08B C0 90 CPY #$90 last track number? D08D D0 EE BNE $D07D no D08F 48 PHA lo-byte D090 8A TXA hi-byte D091 A6 7F LDX $7F drive number D093 9D FC 02 STA $02FC,X hi-byte to $2FC D096 68 PLA lo-byte D097 9D FA 02 STA $02FA,X to $2FA D09A 60 RTS ****************************** D09B 20 D0 D6 JSR $D6D0 parameters to disk controller D09E 20 C3 D0 JSR $D0C3 read block D0A1 20 99 D5 JSR $D599 ok? D0A4 20 37 D1 JSR $D137 get byte from buffer D0A7 85 80 STA $80 track D0A9 20 37 D1 JSR $D137 next byte from buffer D0AC 85 81 STA $81 sector D0AE 60 RTS D0AF 20 9B D0 JSR $D09B D0B2 A5 80 LDA $80 track D0B4 D0 01 BNE $D0B7 D0B6 60 RTS D0B7 20 1E CF JSR $CF1E change buffer D0BA 20 D0 D6 JSR $D6D0 parameters to disk controller D0BD 20 C3 D0 JSR $D0C3 read block D0C0 4C 1E CF JMP $CF1E change buffer ****************************** read block D0C3 A9 80 LDA #$80 code for 'read' D0C5 D0 02 BNE $D0C9 ****************************** write block D0C7 A9 90 LDA #$90 code for 'write' D0C9 8D 4D 02 STA $024D save D0CC 20 93 DF JSR $DF93 get buffer number D0CF AA TAX D0D0 20 06 D5 JSR $D506 get track/sector, read/write block D0D3 8A TXA D0D4 48 PHA D0D5 0A ASL A buffer pointer times 2 D0D6 AA TAX D0D7 A9 00 LDA #$00 D0D9 95 99 STA $99,X pointer in buffer to zero D0DB 20 25 D1 JSR $D125 get file type D0DE C9 04 CMP #$04 rel-file or direct access? D0E0 B0 06 BCS $D0E8 yes D0E2 F6 B5 INC $B5,X D0E4 D0 02 BNE $D0E8 increment block counter D0E6 F6 BB INC $BB,X D0E8 68 PLA D0E9 AA TAX D0EA 60 RTS ****************************** open channel for reading D0EB A5 83 LDA $83 secondary address D0ED C9 13 CMP #$13 19 D0EF 90 02 BCC $D0F3 smaller? D0F1 29 0F AND #$0F D0F3 C9 0F CMP #$0F D0F5 D0 02 BNE $D0F9 D0F7 A9 10 LDA #$10 16 D0F9 AA TAX D0FA 38 SEC D0FB BD 2B 02 LDA $022B,X D0FE 30 06 BMI $D106 D100 29 0F AND #$0F D102 85 82 STA $82 D104 AA TAX D105 18 CLC flag for ok D106 60 RTS ****************************** open channel for writing D107 A5 83 LDA $83 secondary address D109 C9 13 CMP #$13 19 D10B 90 02 BCC $D10F smaller? D10D 29 0F AND #$0F D10F AA TAX D110 BD 2B 02 LDA $022B,X channel number D113 A8 TAY D114 0A ASL A D115 90 0A BCC $D121 D117 30 0A BMI $D123 D119 98 TYA D11A 29 0F AND #$0F D11C 85 82 STA $82 D11E AA TAX D11F 18 CLC flag for ok D120 60 RTS D121 30 F6 BMI $D119 D123 38 SEC flag for channel allocated D124 60 RTS ****************************** check for file type 'REL' D125 A6 82 LDX $82 D127 B5 EC LDA $EC,X D129 4A LSR A D12A 29 07 AND #$07 D12C C9 04 CMP #$04 'REL'? D12E 60 RTS ****************************** get buffer and channel numbers D12F 20 93 DF JSR $DF93 get buffer number D132 0A ASL A D133 AA TAX D134 A4 82 LDY $82 D136 60 RTS ****************************** get a byte from buffer D137 20 2F D1 JSR $D12F get buffer and channel number D13A B9 44 02 LDA $0244,Y end pointer D13D F0 12 BEQ $D151 D13F A1 99 LDA ($99,X) get byte from buffer D141 48 PHA D142 B5 99 LDA $99,X buffer pointer D144 D9 44 02 CMP $0244,Y equal end pointer? D147 D0 04 BNE $D14D no D149 A9 FF LDA #$FF D14B 95 99 STA $99,X buffer pointer to -1 D14D 68 PLA data byte D14E F6 99 INC $99,X increment buffer pointer D150 60 RTS D151 A1 99 LDA ($99,X) get character from buffer D153 F6 99 INC $99,X increment buffer pointer D155 60 RTS ****************************** get byte and read next block D156 20 37 D1 JSR $D137 get byte from buffer D159 D0 36 BNE $D191 not last character? D15B 85 85 STA $85 save data byte D15D B9 44 02 LDA $0244,Y end pointer D160 F0 08 BEQ $D16A yes D162 A9 80 LDA #$80 D164 99 F2 00 STA $00F2,Y READ-flag D167 A5 85 LDA $85 data byte D169 60 RTS D16A 20 1E CF JSR $CF1E change buffer and read next block D16D A9 00 LDA #$00 D16F 20 C8 D4 JSR $D4C8 set buffer pointer to zero D172 20 37 D1 JSR $D137 get first byte from buffer D175 C9 00 CMP #$00 track number zero D177 F0 19 BEQ $D192 yes, then last block D179 85 80 STA $80 save last track number D17B 20 37 D1 JSR $D137 get next byte D17E 85 81 STA $81 save as following track D180 20 1E CF JSR $CF1E change buffer and read next block D183 20 D3 D1 JSR $D1D3 save drive number D186 20 D0 D6 JSR $D6D0 parameter to disk controller D189 20 C3 D0 JSR $D0C3 transmit read command D18C 20 1E CF JSR $CF1E change buffer and read block D18F A5 85 LDA $85 get data byte D191 60 RTS D192 20 37 D1 JSR $D137 get next byte from buffer D195 A4 82 LDY $82 D197 99 44 02 STA $0244,Y save as end pointer D19A A5 85 LDA $85 get data byte back D19C 60 RTS ****************************** byte in buffer and write block D19D 20 F1 CF JSR $CFF1 byte in buffer D1A0 F0 01 BEQ $D1A3 buffer full? D1A2 60 RTS D1A3 20 D3 D1 JSR $D1D3 get drive number D1A6 20 1E F1 JSR $F11E find free block in BAM D1A9 A9 00 LDA #$00 D1AB 20 C8 D4 JSR $D4C8 buffer pointer to zero D1AE A5 80 LDA $80 D1B0 20 F1 CF JSR $CFF1 track number as first byte D1B3 A5 81 LDA $81 D1B5 20 F1 CF JSR $CFF1 sector number as second byte D1B8 20 C7 D0 JSR $D0C7 write block D1BB 20 1E CF JSR $CF1E change buffer D1BE 20 D0 D6 JSR $D6D0 parameter to disk controller D1C1 A9 02 LDA #$02 D1C3 4C C8 D4 JMP $D4C8 buffer pointer to 2 ****************************** increment buffer pointer D1C6 85 6F STA $6F D1C8 20 E8 D4 JSR $D4E8 get buffer pointer D1CB 18 CLC D1CC 65 6F ADC $6F D1CE 95 99 STA $99,X and increment D1D0 85 94 STA $94 D1D2 60 RTS ****************************** get drive number D1D3 20 93 DF JSR $DF93 get drive number D1D6 AA TAX D1D7 BD 5B 02 LDA $025B,X D1DA 29 01 AND #$01 isolate drive number D1DC 85 7F STA $7F and save D1DE 60 RTS ****************************** find write channel and buffer D1DF 38 SEC flag for writing D1E0 B0 01 BCS $D1E3 ****************************** find read channel and buffer D1E2 18 CLC flag for reading D1E3 08 PHP save D1E4 85 6F STA $6F buffer number D1E6 20 27 D2 JSR $D227 close channel D1E9 20 7F D3 JSR $D37F allocate free channel D1EC 85 82 STA $82 channel number D1EE A6 83 LDX $83 secondary address D1F0 28 PLP D1F1 90 02 BCC $D1F5 read channel? D1F3 09 80 ORA #$80 flag for writing D1F5 9D 2B 02 STA $022B,X set D1F8 29 3F AND #$3F D1FA A8 TAY D1FB A9 FF LDA #$FF default value D1FD 99 A7 00 STA $00A7,Y D200 99 AE 00 STA $00AE,Y write in associated table D203 99 CD 00 STA $00CD,Y D206 C6 6F DEC $6F decrement buffer number D208 30 1C BMI $D226 done already? D20A 20 8E D2 JSR $D28E find buffer D20D 10 08 BPL $D217 found? D20F 20 5A D2 JSR $D25A erase flags in table D212 A9 70 LDA #$70 D214 4C C8 C1 JMP $C1C8 70, 'no channel' D217 99 A7 00 STA $00A7,Y buffer number in table D21A C6 6F DEC $6F buffer number D21C 30 08 BMI $D226 already done? D21E 20 8E D2 JSR $D28E find buffer D221 30 EC BMI $D20F not found? D223 99 AE 00 STA $00AE,Y buffer number in table D226 60 RTS ****************************** close channel D227 A5 83 LDA $83 secondary address D229 C9 0F CMP #$0F 15? D22B D0 01 BNE $D22E no D22D 60 RTS else done already D22E A6 83 LDX $83 D230 BD 2B 02 LDA $022B,X channel number D233 C9 FF CMP #$FF not associated? D235 F0 22 BEQ $D259 then done D237 29 3F AND #$3F D239 85 82 STA $82 channel number D23B A9 FF LDA #$FF D23D 9D 2B 02 STA $022B,X erase association in table D240 A6 82 LDX $82 D242 A9 00 LDA #$00 D244 95 F2 STA $F2,X erase READ and WRITE flag D246 20 5A D2 JSR $D25A free buffer D249 A6 82 LDX $82 channel number D24B A9 01 LDA #$01 set bit 0 D24D CA DEX D24E 30 03 BMI $D253 shift to correct position D250 0A ASL A D251 D0 FA BNE $D24D D253 0D 56 02 ORA $0256 free in allocation register D256 8D 56 02 STA $0256 D259 60 RTS ****************************** free buffer D25A A6 82 LDX $82 channel number D25C B5 A7 LDA $A7,X buffer number D25E C9 FF CMP #$FF D260 F0 09 BEQ $D26B not associated? D262 48 PHA D263 A9 FF LDA #$FF D265 95 A7 STA $A7,X erase buffer association D267 68 PLA D268 20 F3 D2 JSR $D2F3 erase buffer allocation register D26B A6 82 LDX $82 channel number D26D B5 AE LDA $AE,X D26F C9 FF CMP #$FF associated in second table? D271 F0 09 BEQ $D27C no D273 48 PHA D274 A9 FF LDA #$FF D276 95 AE STA $AE,X erase association D278 68 PLA D279 20 F3 D2 JSR $D2F3 erase buffer in allocation register D27C A6 82 LDX $82 channel number D27E B5 CD LDA $CD,X D280 C9 FF CMP #$FF associated in 3rd table? D282 F0 09 BEQ $D28D no D284 48 PHA D285 A9 FF LDA #$FF D287 95 CD STA $CD,X erase association D289 68 PLA D28A 20 F3 D2 JSR $D2F3 erase buffer in allocation register D28D 60 RTS ****************************** find buffer D28E 98 TYA D28F 48 PHA D290 A0 01 LDY #$01 D292 20 BA D2 JSR $D2BA D295 10 0C BPL $D2A3 D297 88 DEY D298 20 BA D2 JSR $D2BA D29B 10 06 BPL $D2A3 D29D 20 39 D3 JSR $D339 D2A0 AA TAX D2A1 30 13 BMI $D2B6 D2A3 B5 00 LDA $00,X D2A5 30 FC BMI $D2A3 D2A7 A5 7F LDA $7F D2A9 95 00 STA $00,X D2AB 9D 5B 02 STA $025B,X D2AE 8A TXA D2AF 0A ASL A D2B0 A8 TAY D2B1 A9 02 LDA #$02 D2B3 99 99 00 STA $0099,Y D2B6 68 PLA D2B7 A8 TAY D2B8 8A TXA D2B9 60 RTS D2BA A2 07 LDX #$07 D2BC B9 4F 02 LDA $024F,Y D2BF 3D E9 EF AND $EFE9,X erase bit D2C2 F0 04 BEQ $D2C8 D2C4 CA DEX D2C5 10 F5 BPL $D2BC D2C7 60 RTS D2C8 B9 4F 02 LDA $024F,Y D2CB 5D E9 EF EOR $EFE9,X rotate bit D2CE 99 4F 02 STA $024F,Y D2D1 8A TXA buffer number D2D2 88 DEY D2D3 30 03 BMI $D2D8 D2D5 18 CLC D2D6 69 08 ADC #$08 D2D8 AA TAX buffer number D2D9 60 RTS D2DA A6 82 LDX $82 D2DC B5 A7 LDA $A7,X D2DE 30 09 BMI $D2E9 D2E0 8A TXA D2E1 18 CLC D2E2 69 07 ADC #$07 D2E4 AA TAX D2E5 B5 A7 LDA $A7,X D2E7 10 F0 BPL $D2D9 D2E9 C9 FF CMP #$FF D2EB F0 EC BEQ $D2D9 D2ED 48 PHA D2EE A9 FF LDA #$FF D2F0 95 A7 STA $A7,X D2F2 68 PLA D2F3 29 0F AND #$0F D2F5 A8 TAY buffer number D2F6 C8 INY D2F7 A2 10 LDX #$10 16 D2F9 6E 50 02 ROR $0250 D2FC 6E 4F 02 ROR $024F rotate 16-bit allocation register D2FF 88 DEY D300 D0 01 BNE $D303 D302 18 CLC erase bit for buffer D303 CA DEX D304 10 F3 BPL $D2F9 D306 60 RTS ****************************** close all channels D307 A9 0E LDA #$0E 14 D309 85 83 STA $83 secondary address D30B 20 27 D2 JSR $D227 close channel D30E C6 83 DEC $83 next secondary address D310 D0 F9 BNE $D30B D312 60 RTS ****************************** close all channels of other drives D313 A9 0E LDA #$0E 14 D315 85 83 STA $83 secondary address D317 A6 83 LDX $83 D319 BD 2B 02 LDA $022B,X association table D31C C9 FF CMP #$FF channel associated? D31E F0 14 BEQ $D334 no D320 29 3F AND #$3F D322 85 82 STA $82 channel number D324 20 93 DF JSR $DF93 get buffer number D327 AA TAX D328 BD 5B 02 LDA $025B,X drive number D32B 29 01 AND #$01 isolate D32D C5 7F CMP $7F equal to actual drive number D32F D0 03 BNE $D334 no D331 20 27 D2 JSR $D227 close channel D334 C6 83 DEC $83 next channel D336 10 DF BPL $D317 D338 60 RTS ****************************** D339 A5 6F LDA $6F D33B 48 PHA D33C A0 00 LDY #$00 D33E B6 FA LDX $FA,Y D340 B5 A7 LDA $A7,X D342 10 04 BPL $D348 D344 C9 FF CMP #$FF D346 D0 16 BNE $D35E D348 8A TXA D349 18 CLC D34A 69 07 ADC #$07 D34C AA TAX D34D B5 A7 LDA $A7,X D34F 10 04 BPL $D355 D351 C9 FF CMP #$FF D353 D0 09 BNE $D35E D355 C8 INY D356 C0 05 CPY #$05 D358 90 E4 BCC $D33E D35A A2 FF LDX #$FF D35C D0 1C BNE $D37A D35E 86 6F STX $6F D360 29 3F AND #$3F D362 AA TAX D363 B5 00 LDA $00,X D365 30 FC BMI $D363 D367 C9 02 CMP #$02 D369 90 08 BCC $D373 D36B A6 6F LDX $6F D36D E0 07 CPX #$07 D36F 90 D7 BCC $D348 D371 B0 E2 BCS $D355 D373 A4 6F LDY $6F D375 A9 FF LDA #$FF D377 99 A7 00 STA $00A7,Y D37A 68 PLA D37B 85 6F STA $6F D37D 8A TXA D37E 60 RTS ****************************** find channel and allocate D37F A0 00 LDY #$00 D381 A9 01 LDA #$01 set bit 0 D383 2C 56 02 BIT $0256 D386 D0 09 BNE $D391 channel free? D388 C8 INY D389 0A ASL A rotate bit to left D38A D0 F7 BNE $D383 all channels checked? D38C A9 70 LDA #$70 D38E 4C C8 C1 JMP $C1C8 70, 'no channel' D391 49 FF EOR #$FF rotate bit model D393 2D 56 02 AND $0256 erase bit D396 8D 56 02 STA $0256 allocate channel D399 98 TYA D39A 60 RTS ****************************** get byte for output D39B 20 EB D0 JSR $D0EB open channel for reading D39E 20 00 C1 JSR $C100 turn LED on D3A1 20 AA D3 JSR $D3AA get byte in output register D3A4 A6 82 LDX $82 channel number D3A6 BD 3E 02 LDA $023E,X get byte D3A9 60 RTS D3AA A6 82 LDX $82 channel number D3AC 20 25 D1 JSR $D125 check file type D3AF D0 03 BNE $D3B4 no rel-file? D3B1 4C 20 E1 JMP $E120 get byte from rel-file D3B4 A5 83 LDA $83 secondary address D3B6 C9 0F CMP #$0F 15 D3B8 F0 5A BEQ $D414 yes, read error channel D3BA B5 F2 LDA $F2,X D3BC 29 08 AND #$08 end flag set? D3BE D0 13 BNE $D3D3 no D3C0 20 25 D1 JSR $D125 check file type D3C3 C9 07 CMP #$07 direct access file? D3C5 D0 07 BNE $D3CE no D3C7 A9 89 LDA #$89 set READ and WRITE flag D3C9 95 F2 STA $F2,X D3CB 4C DE D3 JMP $D3DE D3CE A9 00 LDA #$00 D3D0 95 F2 STA $F2,X erase READ and WRITE flag D3D2 60 RTS D3D3 A5 83 LDA $83 secondary address D3D5 F0 32 BEQ $D409 zero, LOAD? D3D7 20 25 D1 JSR $D125 check file type D3DA C9 04 CMP #$04 rel-file or direct access? D3DC 90 22 BCC $D400 no D3DE 20 2F D1 JSR $D12F get buffer and channel number D3E1 B5 99 LDA $99,X buffer pointer D3E3 D9 44 02 CMP $0244,Y equal end pointer? D3E6 D0 04 BNE $D3EC no D3E8 A9 00 LDA #$00 D3EA 95 99 STA $99,X buffer pointer to zero D3EC F6 99 INC $99,X increment buffer pointer D3EE A1 99 LDA ($99,X) get byte from buffer D3F0 99 3E 02 STA $023E,Y into output register D3F3 B5 99 LDA $99,X buffer pointer D3F5 D9 44 02 CMP $0244,Y equal end pointer? D3F8 D0 05 BNE $D3FF no D3FA A9 81 LDA #$81 D3FC 99 F2 00 STA $00F2,Y set flags D3FF 60 RTS D400 20 56 D1 JSR $D156 get byte from buffer D403 A6 82 LDX $82 channel number D405 9D 3E 02 STA $023E,X byte in output register D408 60 RTS D409 AD 54 02 LDA $0254 flag for directory? D40C F0 F2 BEQ $D400 no D40E 20 67 ED JSR $ED67 create directory line D411 4C 03 D4 JMP $D403 D414 20 E8 D4 JSR $D4E8 set buffer pointer D417 C9 D4 CMP #$D4 D419 D0 18 BNE $D433 D41B A5 95 LDA $95 D41D C9 02 CMP #$02 D41F D0 12 BNE $D433 D421 A9 0D LDA #$0D CR D423 85 85 STA $85 in output register D425 20 23 C1 JSR $C123 erase error flags D428 A9 00 LDA #$00 D42A 20 C1 E6 JSR $E6C1 create 'ok' message D42D C6 A5 DEC $A5 set buffer pointer back D42F A9 80 LDA #$80 set READ flag D431 D0 12 BNE $D445 D433 20 37 D1 JSR $D137 get byte from buffer D436 85 85 STA $85 into output register D438 D0 09 BNE $D443 D43A A9 D4 LDA #$D4 D43C 20 C8 D4 JSR $D4C8 set buffer pointer in front of error pointer D43F A9 02 LDA #$02 D441 95 9A STA $9A,X hi-address D443 A9 88 LDA #$88 set READ flag D445 85 F7 STA $F7 D447 A5 85 LDA $85 data byte D449 8D 43 02 STA $0243 into output register D44C 60 RTS ****************************** read next block D44D 20 93 DF JSR $DF93 get buffer number D450 0A ASL A times 2 D451 AA TAX D452 A9 00 LDA #$00 D454 95 99 STA $99,X buffer pointer to zero D456 A1 99 LDA ($99,X) get first byte from buffer D458 F0 05 BEQ $D45F no block following? D45A D6 99 DEC $99,X buffer pointer to -1 D45C 4C 56 D1 JMP $D156 read next block D45F 60 RTS ****************************** read block D460 A9 80 LDA #$80 command code for reading D462 D0 02 BNE $D466 ****************************** write block D464 A9 90 LDA #$90 command code for writing D466 05 7F ORA $7F drive number D468 8D 4D 02 STA $024D save code D46B A5 F9 LDA $F9 D46D 20 D3 D6 JSR $D6D3 parameter to disk controller D470 A6 F9 LDX $F9 D472 4C 93 D5 JMP $D593 execute command ****************************** allocate buffer and read block D475 A9 01 LDA #$01 D477 8D 4A 02 STA $024A file type to sequential D47A A9 11 LDA #$11 17 D47C 85 83 STA $83 secondary address D47E 20 46 DC JSR $DC46 allocate buffer and read block D481 A9 02 LDA #$02 D483 4C C8 D4 JMP $D4C8 buffer pointer to 2 ****************************** allocate new block D486 A9 12 LDA #$12 18 D488 85 83 STA $83 secondary address D48A 4C DA DC JMP $DCDA allocate new block ****************************** write dir block D48D 20 3B DE JSR $DE3B get track and sector number D490 A9 01 LDA #$01 D492 85 6F STA $6F a block D494 A5 69 LDA $69 save step width 10 for block D496 48 PHA allocation D497 A9 03 LDA #$03 D499 85 69 STA $69 D49B 20 2D F1 JSR $F12D find free block in BAM D49E 68 PLA D49F 85 69 STA $69 get step width back D4A1 A9 00 LDA #$00 D4A3 20 C8 D4 JSR $D4C8 buffer pointer to zero D4A6 A5 80 LDA $80 D4A8 20 F1 CF JSR $CFF1 track number in buffer D4AB A5 81 LDA $81 D4AD 20 F1 CF JSR $CFF1 sector number in buffer D4B0 20 C7 D0 JSR $D0C7 write block to disk D4B3 20 99 D5 JSR $D599 and verify D4B6 A9 00 LDA #$00 D4B8 20 C8 D4 JSR $D4C8 buffer pointer to zero D4BB 20 F1 CF JSR $CFF1 fill buffer with zeroes D4BE D0 FB BNE $D4BB D4C0 20 F1 CF JSR $CFF1 zero as following track D4C3 A9 FF LDA #$FF D4C5 4C F1 CF JMP $CFF1 $FF as number of bytes ****************************** set buffer pointer D4C8 85 6F STA $6F save pointer D4CA 20 93 DF JSR $DF93 get buffer number D4CD 0A ASL A times 2 D4CE AA TAX D4CF B5 9A LDA $9A,X buffer pointer hi D4D1 85 95 STA $95 D4D3 A5 6F LDA $6F D4D5 95 99 STA $99,X buffer pointer lo, new value D4D7 85 94 STA $94 D4D9 60 RTS ****************************** close internal channel D4DA A9 11 LDA #$11 17 D4DC 85 83 STA $83 D4DE 20 27 D2 JSR $D227 close channel D4E1 A9 12 LDA #$12 18 D4E3 85 83 STA $83 D4E5 4C 27 D2 JMP $D227 close channel ****************************** set buffer pointer D4E8 20 93 DF JSR $DF93 get buffer number D4EB 0A ASL A D4EC AA TAX D4ED B5 9A LDA $9A,X buffer pointer hi D4EF 85 95 STA $95 D4F1 B5 99 LDA $99,X buffer pointer lo D4F3 85 94 STA $94 D4F5 60 RTS ****************************** get byte from buffer D4F6 85 71 STA $71 pointer lo D4F8 20 93 DF JSR $DF93 get buffer number D4FB AA TAX D4FC BD E0 FE LDA $FEE0,X hi-byte buffer address D4FF 85 72 STA $72 pointer hi D501 A0 00 LDY #$00 D503 B1 71 LDA ($71),Y get byte from buffer D505 60 RTS ****************************** check track and sector numbers D506 BD 5B 02 LDA $025B,X command code for disk controller D509 29 01 AND #$01 drive number D50B 0D 4D 02 ORA $024D plus command code D50E 48 PHA save D50F 86 F9 STX $F9 buffer number D511 8A TXA D512 0A ASL A times 2 D513 AA TAX D514 B5 07 LDA $07,X sector D516 8D 4D 02 STA $024D save D519 B5 06 LDA $06,X track D51B F0 2D BEQ $D54A 66, 'illegal track or sector' D51D CD D7 FE CMP $FED7 36, highest track number + 1 D520 B0 28 BCS $D54A 66, 'illegal track or sector' D522 AA TAX D523 68 PLA command code D524 48 PHA D525 29 F0 AND #$F0 D527 C9 90 CMP #$90 code for writing? D529 D0 4F BNE $D57A no D52B 68 PLA D52C 48 PHA D52D 4A LSR A D52E B0 05 BCS $D535 D530 AD 01 01 LDA $0101 D533 90 03 BCC $D538 D535 AD 02 01 LDA $0102 D538 F0 05 BEQ $D53F D53A CD D5 FE CMP $FED5 'A', format marker D53D D0 33 BNE $D572 73, 'cbm dos v2.6 1541' D53F 8A TXA track number D540 20 4B F2 JSR $F24B get maximum sector number D543 CD 4D 02 CMP $024D compare with sector number D546 F0 02 BEQ $D54A equal, then error D548 B0 30 BCS $D57A smaller? D54A 20 52 D5 JSR $D552 get track and sector number D54D A9 66 LDA #$66 D54F 4C 45 E6 JMP $E645 66, 'illegal track or sector' ****************************** get track and sector number D552 A5 F9 LDA $F9 buffer number D554 0A ASL A *2 D555 AA TAX as index D556 B5 06 LDA $06,X D558 85 80 STA $80 track D55A B5 07 LDA $07,X D55C 85 81 STA $81 sector D55E 60 RTS D55F A5 80 LDA $80 track D561 F0 EA BEQ $D54D zero, then error D563 CD D7 FE CMP $FED7 36, maximum track number + 1 D566 B0 E5 BCS $D54D 66, 'illegal track and sector number' D568 20 4B F2 JSR $F24B get maximum sector number D56B C5 81 CMP $81 sector D56D F0 DE BEQ $D54D D56F 90 DC BCC $D54D error D571 60 RTS D572 20 52 D5 JSR $D552 get track and sector number D575 A9 73 LDA #$73 D577 4C 45 E6 JMP $E645 73, 'cbm dos v2.6 1541' D57A A6 F9 LDX $F9 buffer number D57C 68 PLA D57D 8D 4D 02 STA $024D command code for disk controller D580 95 00 STA $00,X in command register D582 9D 5B 02 STA $025B,X and write in table D585 60 RTS ****************************** read block D586 A9 80 LDA #$80 code for read D588 D0 02 BNE $D58C ****************************** write block D58A A9 90 LDA #$90 code for write D58C 05 7F ORA $7F drive number D58E A6 F9 LDX $F9 buffer number D590 8D 4D 02 STA $024D D593 AD 4D 02 LDA $024D command code D596 20 0E D5 JSR $D50E check track and sector ****************************** verify execution D599 20 A6 D5 JSR $D5A6 verify execution D59C B0 FB BCS $D599 wait for end D59E 48 PHA D59F A9 00 LDA #$00 D5A1 8D 98 02 STA $0298 erase error flag D5A4 68 PLA D5A5 60 RTS D5A6 B5 00 LDA $00,X command code (bit 7) still in register? D5A8 30 1A BMI $D5C4 yes D5AA C9 02 CMP #$02 D5AC 90 14 BCC $D5C2 error-free execution D5AE C9 08 CMP #$08 8 D5B0 F0 08 BEQ $D5BA write protect D5B2 C9 0B CMP #$0B 11 D5B4 F0 04 BEQ $D5BA ID mismatch D5B6 C9 0F CMP #$0F 15 D5B8 D0 0C BNE $D5C6 D5BA 2C 98 02 BIT $0298 D5BD 30 03 BMI $D5C2 D5BF 4C 3F D6 JMP $D63F create error message D5C2 18 CLC execution ended D5C3 60 RTS D5C4 38 SEC execution not yet ended D5C5 60 RTS D5C6 98 TYA D5C7 48 PHA D5C8 A5 7F LDA $7F drive number D5CA 48 PHA D5CB BD 5B 02 LDA $025B,X D5CE 29 01 AND #$01 drive number D5D0 85 7F STA $7F D5D2 A8 TAY D5D3 B9 CA FE LDA $FECA,Y bit model for drive D5D6 8D 6D 02 STA $026D D5D9 20 A6 D6 JSR $D6A6 read attempt D5DC C9 02 CMP #$02 D5DE B0 03 BCS $D5E3 not ok? D5E0 4C 6D D6 JMP $D66D done D5E3 BD 5B 02 LDA $025B,X command code D5E6 29 F0 AND #$F0 isolate D5E8 48 PHA D5E9 C9 90 CMP #$90 code for write D5EB D0 07 BNE $D5F4 no D5ED A5 7F LDA $7F drive number D5EF 09 B8 ORA #$B8 D5F1 9D 5B 02 STA $025B,X D5F4 24 6A BIT $6A D5F6 70 39 BVS $D631 D5F8 A9 00 LDA #$00 D5FA 8D 99 02 STA $0299 counter for searches next to track D5FD 8D 9A 02 STA $029A D600 AC 99 02 LDY $0299 counter D603 AD 9A 02 LDA $029A D606 38 SEC D607 F9 DB FE SBC $FEDB,Y constants for read attempts D60A 8D 9A 02 STA $029A D60D B9 DB FE LDA $FEDB,Y D610 20 76 D6 JSR $D676 position head next to track D613 EE 99 02 INC $0299 increment counter D616 20 A6 D6 JSR $D6A6 read attempt D619 C9 02 CMP #$02 return message D61B 90 08 BCC $D625 smaller than 2, ok? D61D AC 99 02 LDY $0299 load counter D620 B9 DB FE LDA $FEDB,Y get constants D623 D0 DB BNE $D600 not yet zero (table end)? D625 AD 9A 02 LDA $029A D628 20 76 D6 JSR $D676 position head D62B B5 00 LDA $00,X D62D C9 02 CMP #$02 return message D62F 90 2B BCC $D65C ok? D631 24 6A BIT $6A D633 10 0F BPL $D644 D635 68 PLA command code D636 C9 90 CMP #$90 for writing? D638 D0 05 BNE $D63F no D63A 05 7F ORA $7F drive number D63C 9D 5B 02 STA $025B,X command code in table D63F B5 00 LDA $00,X return message D641 20 0A E6 JSR $E60A set error message D644 68 PLA D645 2C 98 02 BIT $0298 D648 30 23 BMI $D66D D64A 48 PHA D64B A9 C0 LDA #$C0 command code for head positioning D64D 05 7F ORA $7F drive number D64F 95 00 STA $00,X in command register D651 B5 00 LDA $00,X D653 30 FC BMI $D651 wait for execution D655 20 A6 D6 JSR $D6A6 attempt command execution again D658 C9 02 CMP #$02 return message D65A B0 D9 BCS $D635 incorrect? D65C 68 PLA D65D C9 90 CMP #$90 command code for writing D65F D0 0C BNE $D66D no D661 05 7F ORA $7F drive number D663 9D 5B 02 STA $025B,X in table D666 20 A6 D6 JSR $D6A6 attempt execution again D669 C9 02 CMP #$02 return message D66B B0 D2 BCS $D63F error? D66D 68 PLA D66E 85 7F STA $7F get drive number back D670 68 PLA D671 A8 TAY D672 B5 00 LDA $00,X error code D674 18 CLC end-of-execution flag D675 60 RTS D676 C9 00 CMP #$00 D678 F0 18 BEQ $D692 D67A 30 0C BMI $D688 D67C A0 01 LDY #$01 D67E 20 93 D6 JSR $D693 transmit data for head position D681 38 SEC D682 E9 01 SBC #$01 D684 D0 F6 BNE $D67C D686 F0 0A BEQ $D692 D688 A0 FF LDY #$FF D68A 20 93 D6 JSR $D693 transmit data for head position D68D 18 CLC D68E 69 01 ADC #$01 D690 D0 F6 BNE $D688 D692 60 RTS D693 48 PHA D694 98 TYA D695 A4 7F LDY $7F drive number D697 99 FE 02 STA $02FE,Y D69A D9 FE 02 CMP $02FE,Y wait for return message from D69D F0 FB BEQ $D69A D69F A9 00 LDA #$00 disk controller D6A1 99 FE 02 STA $02FE,Y D6A4 68 PLA D6A5 60 RTS D6A6 A5 6A LDA $6A maximum number of repetitions D6A8 29 3F AND #$3F D6AA A8 TAY D6AB AD 6D 02 LDA $026D bit for LED D6AE 4D 00 1C EOR $1C00 D6B1 8D 00 1C STA $1C00 D6B4 BD 5B 02 LDA $025B,X command D6B7 95 00 STA $00,X transmit to disk controller D6B9 B5 00 LDA $00,X and return message D6BB 30 FC BMI $D6B9 wait D6BD C9 02 CMP #$02 ok? D6BF 90 03 BCC $D6C4 yes D6C1 88 DEY decrement counter D6C2 D0 E7 BNE $D6AB attempt again D6C4 48 PHA D6C5 AD 6D 02 LDA $026D D6C8 0D 00 1C ORA $1C00 LED off D6CB 8D 00 1C STA $1C00 D6CE 68 PLA D6CF 60 RTS ****************************** transmit parameter to disk controller D6D0 20 93 DF JSR $DF93 get buffer number D6D3 0A ASL A D6D4 A8 TAY D6D5 A5 80 LDA $80 track number D6D7 99 06 00 STA $0006,Y transmit D6DA A5 81 LDA $81 sector number D6DC 99 07 00 STA $0007,Y transmit D6DF A5 7F LDA $7F drive number D6E1 0A ASL A times 2 D6E2 AA TAX D6E3 60 RTS ****************************** enter file in directory D6E4 A5 83 LDA $83 secondary address D6E6 48 PHA D6E7 A5 82 LDA $82 channel number D6E9 48 PHA D6EA A5 81 LDA $81 sector number D6EC 48 PHA D6ED A5 80 LDA $80 track number D6EF 48 PHA save D6F0 A9 11 LDA #$11 D6F2 85 83 STA $83 secondary address 17 D6F4 20 3B DE JSR $DE3B get track and sector number D6F7 AD 4A 02 LDA $024A file type D6FA 48 PHA save D6FB A5 E2 LDA $E2 drive number D6FD 29 01 AND #$01 D6FF 85 7F STA $7F set D701 A6 F9 LDX $F9 buffer number D703 5D 5B 02 EOR $025B,X D706 4A LSR A D707 90 0C BCC $D715 equal drive number? D709 A2 01 LDX #$01 D70B 8E 92 02 STX $0292 pointer in directory D70E 20 AC C5 JSR $C5AC load dir and find first entry D711 F0 1D BEQ $D730 not found? D713 D0 28 BNE $D73D found? D715 AD 91 02 LDA $0291 sector number in directory D718 F0 0C BEQ $D726 equal zero D71A C5 81 CMP $81 equal sector number? D71C F0 1F BEQ $D73D yes D71E 85 81 STA $81 save sector number D720 20 60 D4 JSR $D460 read block D723 4C 3D D7 JMP $D73D D726 A9 01 LDA #$01 D728 8D 92 02 STA $0292 pointer to one D72B 20 17 C6 JSR $C617 find next entry in directory D72E D0 0D BNE $D73D found? D730 20 8D D4 JSR $D48D write directory block D733 A5 81 LDA $81 sector number D735 8D 91 02 STA $0291 D738 A9 02 LDA #$02 D73A 8D 92 02 STA $0292 pointer to 2 D73D AD 92 02 LDA $0292 D740 20 C8 D4 JSR $D4C8 set buffer pointer D743 68 PLA D744 8D 4A 02 STA $024A file type D747 C9 04 CMP #$04 rel-file? D749 D0 02 BNE $D74D no D74B 09 80 ORA #$80 set bit 7 D74D 20 F1 CF JSR $CFF1 and write in buffer D750 68 PLA D751 8D 80 02 STA $0280 following track D754 20 F1 CF JSR $CFF1 in buffer D757 68 PLA D758 8D 85 02 STA $0285 following sector D75B 20 F1 CF JSR $CFF1 in buffer D75E 20 93 DF JSR $DF93 get buffer number D761 A8 TAY D762 AD 7A 02 LDA $027A pointer to drive number D765 AA TAX D766 A9 10 LDA #$10 16, length of filename D768 20 6E C6 JSR $C66E write filename in buffer D76B A0 10 LDY #$10 D76D A9 00 LDA #$00 D76F 91 94 STA ($94),Y fill with zeroes at position 16 D771 C8 INY D772 C0 1B CPY #$1B position 27 already? D774 90 F9 BCC $D76F no D776 AD 4A 02 LDA $024A file type D779 C9 04 CMP #$04 rel-file? D77B D0 13 BNE $D790 no D77D A0 10 LDY #$10 D77F AD 59 02 LDA $0259 track D782 91 94 STA ($94),Y D784 C8 INY D785 AD 5A 02 LDA $025A and sector D788 91 94 STA ($94),Y the side-sectors in directory entry D78A C8 INY D78B AD 58 02 LDA $0258 record length D78E 91 94 STA ($94),Y in directory D790 20 64 D4 JSR $D464 write block D793 68 PLA D794 85 82 STA $82 channel number D796 AA TAX D797 68 PLA D798 85 83 STA $83 secondary address D79A AD 91 02 LDA $0291 D79D 85 D8 STA $D8 D79F 9D 60 02 STA $0260,X D7A2 AD 92 02 LDA $0292 D7A5 85 DD STA $DD D7A7 9D 66 02 STA $0266,X D7AA AD 4A 02 LDA $024A file type D7AD 85 E7 STA $E7 D7AF A5 7F LDA $7F drive number D7B1 85 E2 STA $E2 D7B3 60 RTS ****************************** OPEN command, secondary addr <> 15 D7B4 A5 83 LDA $83 secondary address D7B6 8D 4C 02 STA $024C D7B9 20 B3 C2 JSR $C2B3 get line length, erase flags D7BC 8E 2A 02 STX $022A D7BF AE 00 02 LDX $0200 first character from buffer D7C2 AD 4C 02 LDA $024C secondary address D7C5 D0 2C BNE $D7F3 not equal 0 (LOAD)? D7C7 E0 2A CPX #$2A '*' D7C9 D0 28 BNE $D7F3 D7CB A5 7E LDA $7E last track number D7CD F0 4D BEQ $D81C D7CF 85 80 STA $80 track number D7D1 AD 6E 02 LDA $026E last drive number D7D4 85 7F STA $7F drive number D7D6 85 E2 STA $E2 D7D8 A9 02 LDA #$02 D7DA 85 E7 STA $E7 set data type to program D7DC AD 6F 02 LDA $026F last sector number D7DF 85 81 STA $81 sector D7E1 20 00 C1 JSR $C100 turn LED on D7E4 20 46 DC JSR $DC46 allocate buffer, read block D7E7 A9 04 LDA #$04 file type D7E9 05 7F ORA $7F drive number D7EB A6 82 LDX $82 channel number D7ED 99 EC 00 STA $00EC,Y set flag D7F0 4C 94 C1 JMP $C194 done D7F3 E0 24 CPX #$24 '$' D7F5 D0 1E BNE $D815 no D7F7 AD 4C 02 LDA $024C secondary address D7FA D0 03 BNE $D7FF not equal to zero? D7FC 4C 55 DA JMP $DA55 OPEN $ D7FF 20 D1 C1 JSR $C1D1 analyze line to end D802 AD 85 FE LDA $FE85 18, directory track D805 85 80 STA $80 track D807 A9 00 LDA #$00 D809 85 81 STA $81 sector 0 D80B 20 46 DC JSR $DC46 allocate buffer, read block D80E A5 7F LDA $7F drive number D810 09 02 ORA #$02 D812 4C EB D7 JMP $D7EB continue as above D815 E0 23 CPX #$23 "#" D817 D0 12 BNE $D82B D819 4C 84 CB JMP $CB84 open direct access file D81C A9 02 LDA #$02 D81E 8D 96 02 STA $0296 file type program D821 A9 00 LDA #$00 D823 85 7F STA $7F drive 0 D825 8D 8E 02 STA $028E D828 20 42 D0 JSR $D042 load BAM D82B 20 E5 C1 JSR $C1E5 analyze line D82E D0 04 BNE $D834 colon found? D830 A2 00 LDX #$00 D832 F0 0C BEQ $D840 D834 8A TXA comma found? D835 F0 05 BEQ $D83C no D837 A9 30 LDA #$30 D839 4C C8 C1 JMP $C1C8 30, 'syntax error' D83C 88 DEY D83D F0 01 BEQ $D840 D83F 88 DEY D840 8C 7A 02 STY $027A pointer to drive number D843 A9 8D LDA #$8D shift CR D845 20 68 C2 JSR $C268 analyze line to end D848 E8 INX D849 8E 78 02 STX $0278 comma counter D84C 20 12 C3 JSR $C312 get drive number D84F 20 CA C3 JSR $C3CA check drive number D852 20 9D C4 JSR $C49D find file entry in directory D855 A2 00 LDX #$00 default values D857 8E 58 02 STX $0258 record length D85A 8E 97 02 STX $0297 D85D 8E 4A 02 STX $024A file type D860 E8 INX D861 EC 77 02 CPX $0277 comma before equal sign? D864 B0 10 BCS $D876 no D866 20 09 DA JSR $DA09 get file type and control mode D869 E8 INX D86A EC 77 02 CPX $0277 additional comma? D86D B0 07 BCS $D876 no D86F C0 04 CPY #$04 D871 F0 3E BEQ $D8B1 D873 20 09 DA JSR $DA09 get file type and control method D876 AE 4C 02 LDX $024C D879 86 83 STX $83 secondary address D87B E0 02 CPX #$02 greater than 2? D87D B0 12 BCS $D891 yes D87F 8E 97 02 STX $0297 0 or 1 (LOAD or SAVE) D882 A9 40 LDA #$40 D884 8D F9 02 STA $02F9 D887 AD 4A 02 LDA $024A file type D88A D0 1B BNE $D8A7 not deleted D88C A9 02 LDA #$02 PRG D88E 8D 4A 02 STA $024A as file type D891 AD 4A 02 LDA $024A D894 D0 11 BNE $D8A7 D896 A5 E7 LDA $E7 D898 29 07 AND #$07 get file type and command line D89A 8D 4A 02 STA $024A D89D AD 80 02 LDA $0280 track number D8A0 D0 05 BNE $D8A7 not equal zero? D8A2 A9 01 LDA #$01 D8A4 8D 4A 02 STA $024A file type sequential D8A7 AD 97 02 LDA $0297 control method D8AA C9 01 CMP #$01 'W' D8AC F0 18 BEQ $D8C6 yes D8AE 4C 40 D9 JMP $D940 D8B1 BC 7A 02 LDY $027A,X pointer behind second comma D8B4 B9 00 02 LDA $0200,Y get value D8B7 8D 58 02 STA $0258 record length D8BA AD 80 02 LDA $0280 track number D8BD D0 B7 BNE $D876 D8BF A9 01 LDA #$01 'W' D8C1 8D 97 02 STA $0297 as second method D8C4 D0 B0 BNE $D876 D8C6 A5 E7 LDA $E7 file type D8C8 29 80 AND #$80 isolate wildcard flag D8CA AA TAX D8CB D0 14 BNE $D8E1 wildcard in name D8CD A9 20 LDA #$20 D8CF 24 E7 BIT $E7 was file closed? D8D1 F0 06 BEQ $D8D9 yes D8D3 20 B6 C8 JSR $C8B6 byte 0 in buffer and write block D8D6 4C E3 D9 JMP $D9E3 D8D9 AD 80 02 LDA $0280 track number of the first block D8DC D0 03 BNE $D8E1 already existing D8DE 4C E3 D9 JMP $D9E3 D8E1 AD 00 02 LDA $0200 first character from input buffer D8E4 C9 40 CMP #$40 '@'? D8E6 F0 0D BEQ $D8F5 yes D8E8 8A TXA D8E9 D0 05 BNE $D8F0 wildcard set? D8EB A9 63 LDA #$63 D8ED 4C C8 C1 JMP $C1C8 63, 'file exists' D8F0 A9 33 LDA #$33 D8F2 4C C8 C1 JMP $C1C8 33, 'syntax error' ****************************** open a file with overwriting D8F5 A5 E7 LDA $E7 file type D8F7 29 07 AND #$07 isolate D8F9 CD 4A 02 CMP $024A D8FC D0 67 BNE $D965 file type different? D8FE C9 04 CMP #$04 rel-file? D900 F0 63 BEQ $D965 64, 'file type mismatch' D902 20 DA DC JSR $DCDA D905 A5 82 LDA $82 D907 8D 70 02 STA $0270 save channel number D90A A9 11 LDA #$11 D90C 85 83 STA $83 D90E 20 EB D0 JSR $D0EB open read channel D911 AD 94 02 LDA $0294 D914 20 C8 D4 JSR $D4C8 set buffer pointer for directory D917 A0 00 LDY #$00 D919 B1 94 LDA ($94),Y file type D91B 09 20 ORA #$20 set bit 5, open file D91D 91 94 STA ($94),Y D91F A0 1A LDY #$1A D921 A5 80 LDA $80 track D923 91 94 STA ($94),Y D925 C8 INY D926 A5 81 LDA $81 and sector D928 91 94 STA ($94),Y for open with at-sign D92A AE 70 02 LDX $0270 channel number D92D A5 D8 LDA $D8 D92F 9D 60 02 STA $0260,X pointer to directory block D932 A5 DD LDA $DD D934 9D 66 02 STA $0266,X D937 20 3B DE JSR $DE3B get track and sector number D93A 20 64 D4 JSR $D464 write block D93D 4C EF D9 JMP $D9EF prepare track, sector, and drive number D940 AD 80 02 LDA $0280 first track number D943 D0 05 BNE $D94A file not erased? D945 A9 62 LDA #$62 D947 4C C8 C1 JMP $C1C8 62, 'file not found' D94A AD 97 02 LDA $0297 control mode D94D C9 03 CMP #$03 'M' D94F F0 0B BEQ $D95C yes, then no test of unclosed file D951 A9 20 LDA #$20 bit 5 D953 24 E7 BIT $E7 test in file type D955 F0 05 BEQ $D95C not set, ok D957 A9 60 LDA #$60 D959 4C C8 C1 JMP $C1C8 D95C A5 E7 LDA $E7 D95E 29 07 AND #$07 isolate file type D960 CD 4A 02 CMP $024A D963 F0 05 BEQ $D96A D965 A9 64 LDA #$64 D967 4C C8 C1 JMP $C1C8 64, 'file type mismatch' D96A A0 00 LDY #$00 D96C 8C 79 02 STY $0279 D96F AE 97 02 LDX $0297 control mode D972 E0 02 CPX #$02 'A', append D974 D0 1A BNE $D990 no D976 C9 04 CMP #$04 rel-file? D978 F0 EB BEQ $D965 D97A B1 94 LDA ($94),Y D97C 29 4F AND #$4F D97E 91 94 STA ($94),Y D980 A5 83 LDA $83 D982 48 PHA D983 A9 11 LDA #$11 D985 85 83 STA $83 channel 17 D987 20 3B DE JSR $DE3B get track and sector number D98A 20 64 D4 JSR $D464 write block D98D 68 PLA D98E 85 83 STA $83 get channel number back D990 20 A0 D9 JSR $D9A0 D993 AD 97 02 LDA $0297 control mode D996 C9 02 CMP #$02 D998 D0 55 BNE $D9EF D99A 20 2A DA JSR $DA2A D99D 4C 94 C1 JMP $C194 done D9A0 A0 13 LDY #$13 D9A2 B1 94 LDA ($94),Y track D9A4 8D 59 02 STA $0259 D9A7 C8 INY D9A8 B1 94 LDA ($94),Y D9AA 8D 5A 02 STA $025A D9AD C8 INY D9AE B1 94 LDA ($94),Y record length D9B0 AE 58 02 LDX $0258 last record len D9B3 8D 58 02 STA $0258 D9B6 8A TXA D9B7 F0 0A BEQ $D9C3 D9B9 CD 58 02 CMP $0258 D9BC F0 05 BEQ $D9C3 D9BE A9 50 LDA #$50 D9C0 20 C8 C1 JSR $C1C8 50, 'record not present' D9C3 AE 79 02 LDX $0279 D9C6 BD 80 02 LDA $0280,X track D9C9 85 80 STA $80 D9CB BD 85 02 LDA $0285,X sector D9CE 85 81 STA $81 D9D0 20 46 DC JSR $DC46 D9D3 A4 82 LDY $82 D9D5 AE 79 02 LDX $0279 D9D8 B5 D8 LDA $D8,X D9DA 99 60 02 STA $0260,Y D9DD B5 DD LDA $DD,X D9DF 99 66 02 STA $0266,Y D9E2 60 RTS D9E3 A5 E2 LDA $E2 drive number D9E5 29 01 AND #$01 D9E7 85 7F STA $7F D9E9 20 DA DC JSR $DCDA D9EC 20 E4 D6 JSR $D6E4 D9EF A5 83 LDA $83 channel number D9F1 C9 02 CMP #$02 D9F3 B0 11 BCS $DA06 D9F5 20 3E DE JSR $DE3E D9F8 A5 80 LDA $80 D9FA 85 7E STA $7E D9FC A5 7F LDA $7F D9FE 8D 6E 02 STA $026E DA01 A5 81 LDA $81 DA03 8D 6F 02 STA $026F DA06 4C 99 C1 JMP $C199 ****************************** check file type and control mode DA09 BC 7A 02 LDY $027A,X pointer in command line DA0C B9 00 02 LDA $0200,Y get characters from line DA0F A0 04 LDY #$04 DA11 88 DEY DA12 30 08 BMI $DA1C DA14 D9 B2 FE CMP $FEB2,Y control modes 'R', 'W', 'A', 'M' DA17 D0 F8 BNE $DA11 DA19 8C 97 02 STY $0297 save DA1C A0 05 LDY #$05 DA1E 88 DEY DA1F 30 08 BMI $DA29 DA21 D9 B6 FE CMP $FEB6,Y file types 'D','S','P','U','L' DA24 D0 F8 BNE $DA1E DA26 8C 4A 02 STY $024A save DA29 60 RTS ****************************** preparation for append DA2A 20 39 CA JSR $CA39 open channel to read, get byte DA2D A9 80 LDA #$80 DA2F 20 A6 DD JSR $DDA6 last byte? DA32 F0 F6 BEQ $DA2A no DA34 20 95 DE JSR $DE95 get track and sector number DA37 A6 81 LDX $81 sector number DA39 E8 INX DA3A 8A TXA DA3B D0 05 BNE $DA42 not $FF? DA3D 20 A3 D1 JSR $D1A3 close buffer, write block DA40 A9 02 LDA #$02 DA42 20 C8 D4 JSR $D4C8 buffer pointer to 2 DA45 A6 82 LDX $82 channel number DA47 A9 01 LDA #$01 DA49 95 F2 STA $F2,X set flag for WRITE DA4B A9 80 LDA #$80 DA4D 05 82 ORA $82 DA4F A6 83 LDX $83 DA51 9D 2B 02 STA $022B,X channel number in table DA54 60 RTS ****************************** OPEN "$" DA55 A9 0C LDA #$0C command number 12 DA57 8D 2A 02 STA $022A DA5A A9 00 LDA #$00 DA5C AE 74 02 LDX $0274 DA5F CA DEX DA60 F0 0B BEQ $DA6D DA62 CA DEX DA63 D0 21 BNE $DA86 DA65 AD 01 02 LDA $0201 second character DA68 20 BD C3 JSR $C3BD get drive number DA6B 30 19 BMI $DA86 not a plain number? DA6D 85 E2 STA $E2 DA6F EE 77 02 INC $0277 DA72 EE 78 02 INC $0278 DA75 EE 7A 02 INC $027A DA78 A9 80 LDA #$80 DA7A 85 E7 STA $E7 set wildcard flag DA7C A9 2A LDA #$2A '*' DA7E 8D 00 02 STA $0200 as file name in command buffer DA81 8D 01 02 STA $0201 DA84 D0 18 BNE $DA9E absolute jump DA86 20 E5 C1 JSR $C1E5 test input line to ":" DA89 D0 05 BNE $DA90 found? DA8B 20 DC C2 JSR $C2DC erase flags DA8E A0 03 LDY #$03 DA90 88 DEY DA91 88 DEY DA92 8C 7A 02 STY $027A pointer to drive number in command DA95 20 00 C2 JSR $C200 analyze line DA98 20 98 C3 JSR $C398 ascertain file type DA9B 20 20 C3 JSR $C320 get drive number DA9E 20 CA C3 JSR $C3CA initialize drive if necessary DAA1 20 B7 C7 JSR $C7B7 prepare disk title DAA4 20 9D C4 JSR $C49D load directory DAA7 20 9E EC JSR $EC9E create and prepare directory DAAA 20 37 D1 JSR $D137 get byte from buffer DAAD A6 82 LDX $82 channel number DAAF 9D 3E 02 STA $023E,X byte in output register DAB2 A5 7F LDA $7F drive number DAB4 8D 8E 02 STA $028E save as last drive number DAB7 09 04 ORA #$04 DAB9 95 EC STA $EC,X PRG-flag DABB A9 00 LDA #$00 DABD 85 A3 STA $A3 set pointer back in input buffer DABF 60 RTS ****************************** CLOSE-routine DAC0 A9 00 LDA #$00 DAC2 8D F9 02 STA $02F9 DAC5 A5 83 LDA $83 secondary address DAC7 D0 0B BNE $DAD4 not zero? DAC9 A9 00 LDA #$00 secondary address 0, LOAD DACB 8D 54 02 STA $0254 DACE 20 27 D2 JSR $D227 close channel DAD1 4C DA D4 JMP $D4DA close internal channels 17 & 18 DAD4 C9 0F CMP #$0F 15 DAD6 F0 14 BEQ $DAEC yes, close all channels DAD8 20 02 DB JSR $DB02 close file DADB A5 83 LDA $83 secondary address DADD C9 02 CMP #$02 DADF 90 F0 BCC $DAD1 smaller than 2? DAE1 AD 6C 02 LDA $026C DAE4 D0 03 BNE $DAE9 DAE6 4C 94 C1 JMP $C194 termination DAE9 4C AD C1 JMP $C1AD DAEC A9 0E LDA #$0E 14 DAEE 85 83 STA $83 secondary address DAF0 20 02 DB JSR $DB02 close file DAF3 C6 83 DEC $83 next secondary address DAF5 10 F9 BPL $DAF0 DAF7 AD 6C 02 LDA $026C DAFA D0 03 BNE $DAFF DAFC 4C 94 C1 JMP $C194 termination DAFF 4C AD C1 JMP $C1AD ****************************** close file DB02 A6 83 LDX $83 secondary address DB04 BD 2B 02 LDA $022B,X get channel number DB07 C9 FF CMP #$FF no channel associated? DB09 D0 01 BNE $DB0C DB0B 60 RTS no, then none DB0C 29 0F AND #$0F isolate channel number DB0E 85 82 STA $82 DB10 20 25 D1 JSR $D125 check data type DB13 C9 07 CMP #$07 direct access? DB15 F0 0F BEQ $DB26 yes DB17 C9 04 CMP #$04 rel-file? DB19 F0 11 BEQ $DB2C yes DB1B 20 07 D1 JSR $D107 channel for writing open DB1E B0 09 BCS $DB29 no file for writing? DB20 20 62 DB JSR $DB62 write last block DB23 20 A5 DB JSR $DBA5 write entry in directory and block DB26 20 F4 EE JSR $EEF4 write BAM DB29 4C 27 D2 JMP $D227 close channel DB2C 20 F1 DD JSR $DDF1 get buffer number, write block DB2F 20 1E CF JSR $CF1E change buffer DB32 20 CB E1 JSR $E1CB get last side-sector DB35 A6 D5 LDX $D5 side-sector number DB37 86 73 STX $73 DB39 E6 73 INC $73 DB3B A9 00 LDA #$00 DB3D 85 70 STA $70 DB3F 85 71 STA $71 DB41 A5 D6 LDA $D6 DB43 38 SEC DB44 E9 0E SBC #$0E minus 14 for pointer DB46 85 72 STA $72 DB48 20 51 DF JSR $DF51 calculate block number of file DB4B A6 82 LDX $82 channel number DB4D A5 70 LDA $70 DB4F 95 B5 STA $B5,X record number lo DB51 A5 71 LDA $71 DB53 95 BB STA $BB,X record number hi DB55 A9 40 LDA #$40 DB57 20 A6 DD JSR $DDA6 bit 6 set? DB5A F0 03 BEQ $DB5F no DB5C 20 A5 DB JSR $DBA5 enter in directory DB5F 4C 27 D2 JMP $D227 close channel ****************************** write last block DB62 A6 82 LDX $82 channel number DB64 B5 B5 LDA $B5,X record number lo DB66 15 BB ORA $BB,X record number hi DB68 D0 0C BNE $DB76 not zero? DB6A 20 E8 D4 JSR $D4E8 set buffer pointer DB6D C9 02 CMP #$02 DB6F D0 05 BNE $DB76 not 2 DB71 A9 0D LDA #$0D CR DB73 20 F1 CF JSR $CFF1 in buffer DB76 20 E8 D4 JSR $D4E8 set buffer pointer DB79 C9 02 CMP #$02 now equal to 2? DB7B D0 0F BNE $DB8C no DB7D 20 1E CF JSR $CF1E change buffer DB80 A6 82 LDX $82 channel number DB82 B5 B5 LDA $B5,X record number lo DB84 D0 02 BNE $DB88 DB86 D6 BB DEC $BB,X decrement block number hi DB88 D6 B5 DEC $B5,X and block number lo DB8A A9 00 LDA #$00 DB8C 38 SEC DB8D E9 01 SBC #$01 set pointer DB8F 48 PHA DB90 A9 00 LDA #$00 DB92 20 C8 D4 JSR $D4C8 buffer pointer to zero DB95 20 F1 CF JSR $CFF1 write zero in buffer DB98 68 PLA second byte = pointer to end DB99 20 F1 CF JSR $CFF1 write in buffer DB9C 20 C7 D0 JSR $D0C7 write block to disk DB9F 20 99 D5 JSR $D599 and verify DBA2 4C 1E CF JMP $CF1E change buffer ****************************** directory entry DBA5 A6 82 LDX $82 channel number DBA7 8E 70 02 STX $0270 save DBAA A5 83 LDA $83 secondary address DBAC 48 PHA save DBAD BD 60 02 LDA $0260,X sector number in directory DBB0 85 81 STA $81 set DBB2 BD 66 02 LDA $0266,X pointer in directory DBB5 8D 94 02 STA $0294 DBB8 B5 EC LDA $EC,X DBBA 29 01 AND #$01 DBBC 85 7F STA $7F drive number DBBE AD 85 FE LDA $FE85 18, directory track DBC1 85 80 STA $80 set DBC3 20 93 DF JSR $DF93 increment buffer number DBC6 48 PHA DBC7 85 F9 STA $F9 DBC9 20 60 D4 JSR $D460 read directory block DBCC A0 00 LDY #$00 DBCE BD E0 FE LDA $FEE0,X buffer address DBD1 85 87 STA $87 DBD3 AD 94 02 LDA $0294 buffer pointer DBD6 85 86 STA $86 DBD8 B1 86 LDA ($86),Y file type DBDA 29 20 AND #$20 file closed? DBDC F0 43 BEQ $DC21 yes DBDE 20 25 D1 JSR $D125 check file type DBE1 C9 04 CMP #$04 rel-file? DBE3 F0 44 BEQ $DC29 yes DBE5 B1 86 LDA ($86),Y DBE7 29 8F AND #$8F erase bits 4,5, and 6 DBE9 91 86 STA ($86),Y in file type DBEB C8 INY DBEC B1 86 LDA ($86),Y track number DBEE 85 80 STA $80 DBF0 84 71 STY $71 DBF2 A0 1B LDY #$1B DBF4 B1 86 LDA ($86),Y sector number of the file for DBF6 48 PHA overwriting DBF7 88 DEY DBF8 B1 86 LDA ($86),Y track number for overwriting DBFA D0 0A BNE $DC06 set? DBFC 85 80 STA $80 set track number DBFE 68 PLA DBFF 85 81 STA $81 sector number DC01 A9 67 LDA #$67 DC03 20 45 E6 JSR $E645 67, 'illegal track or sector' DC06 48 PHA DC07 A9 00 LDA #$00 DC09 91 86 STA ($86),Y erase track number DC0B C8 INY DC0C 91 86 STA ($86),Y and sector number of the DC0E 68 PLA substitute file DC0F A4 71 LDY $71 DC11 91 86 STA ($86),Y DC13 C8 INY set track & sector number of the new file DC14 B1 86 LDA ($86),Y DC16 85 81 STA $81 DC18 68 PLA DC19 91 86 STA ($86),Y DC1B 20 7D C8 JSR $C87D erase all files DC1E 4C 29 DC JMP $DC29 DC21 B1 86 LDA ($86),Y get file type DC23 29 0F AND #$0F isolate bits 0-3 DC25 09 80 ORA #$80 set bit 7 for closed file DC27 91 86 STA ($86),Y DC29 AE 70 02 LDX $0270 channel number DC2C A0 1C LDY #$1C DC2E B5 B5 LDA $B5,X block number lo DC30 91 86 STA ($86),Y in directory entry DC32 C8 INY DC33 B5 BB LDA $BB,X and block number hi DC35 91 86 STA ($86),Y write DC37 68 PLA buffer number DC38 AA TAX DC39 A9 90 LDA #$90 code for 'writing' DC3B 05 7F ORA $7F DC3D 20 90 D5 JSR $D590 write block DC40 68 PLA DC41 85 83 STA $83 secondary address DC43 4C 07 D1 JMP $D107 open channel for writing ****************************** read block, layout buffer DC46 A9 01 LDA #$01 DC48 20 E2 D1 JSR $D1E2 find channel and buffer for read DC4B 20 B6 DC JSR $DCB6 set pointer DC4E AD 4A 02 LDA $024A file type DC51 48 PHA save DC52 0A ASL A DC53 05 7F ORA $7F drive number DC55 95 EC STA $EC,X DC57 20 9B D0 JSR $D09B read block in buffer DC5A A6 82 LDX $82 channel number DC5C A5 80 LDA $80 track DC5E D0 05 BNE $DC65 following track? DC60 A5 81 LDA $81 sector DC62 9D 44 02 STA $0244,X as end pointer DC65 68 PLA file type DC66 C9 04 CMP #$04 rel-file? DC68 D0 3F BNE $DCA9 no DC6A A4 83 LDY $83 secondary address DC6C B9 2B 02 LDA $022B,Y channel number DC6F 09 40 ORA #$40 DC71 99 2B 02 STA $022B,Y set flag for READ and WRITE DC74 AD 58 02 LDA $0258 record length DC77 95 C7 STA $C7,X DC79 20 8E D2 JSR $D28E find buffer for side-sector DC7C 10 03 BPL $DC81 found? DC7E 4C 0F D2 JMP $D20F 70, 'no channel' DC81 A6 82 LDX $82 channel number DC83 95 CD STA $CD,X DC85 AC 59 02 LDY $0259 DC88 84 80 STY $80 track for side-sector DC8A AC 5A 02 LDY $025A DC8D 84 81 STY $81 sector for side-sector DC8F 20 D3 D6 JSR $D6D3 transmit parameters to disk controller DC92 20 73 DE JSR $DE73 read block DC95 20 99 D5 JSR $D599 and verify DC98 A6 82 LDX $82 channel number DC9A A9 02 LDA #$02 DC9C 95 C1 STA $C1,X pointer for writing DC9E A9 00 LDA #$00 DCA0 20 C8 D4 JSR $D4C8 buffer pointer to zero DCA3 20 53 E1 JSR $E153 find next record DCA6 4C 3E DE JMP $DE3E get track and sector number DCA9 20 56 D1 JSR $D156 get byte from buffer DCAC A6 82 LDX $82 channel number DCAE 9D 3E 02 STA $023E,X byte in output register DCB1 A9 88 LDA #$88 set flag for READ DCB3 95 F2 STA $F2,X DCB5 60 RTS ****************************** reset pointer DCB6 A6 82 LDX $82 channel number DCB8 B5 A7 LDA $A7,X buffer number DCBA 0A ASL A times 2 DCBB A8 TAY DCBC A9 02 LDA #$02 DCBE 99 99 00 STA $0099,Y buffer pointer lo DCC1 B5 AE LDA $AE,X DCC3 09 80 ORA #$80 set bit 7 DCC5 95 AE STA $AE,X DCC7 0A ASL A DCC8 A8 TAY DCC9 A9 02 LDA #$02 DCCB 99 99 00 STA $0099,Y buffer pointer lo DCCE A9 00 LDA #$00 DCD0 95 B5 STA $B5,X block number lo DCD2 95 BB STA $BB,X block number hi DCD4 A9 00 LDA #$00 DCD6 9D 44 02 STA $0244,X end pointer DCD9 60 RTS ****************************** construct a new block DCDA 20 A9 F1 JSR $F1A9 find free sector in BAM DCDD A9 01 LDA #$01 DCDF 20 DF D1 JSR $D1DF open channel DCE2 20 D0 D6 JSR $D6D0 transmit parameter to disk controller DCE5 20 B6 DC JSR $DCB6 reset pointer DCE8 A6 82 LDX $82 channel number DCEA AD 4A 02 LDA $024A file type DCED 48 PHA DCEE 0A ASL A DCEF 05 7F ORA $7F drive number DCF1 95 EC STA $EC,X save as flag DCF3 68 PLA DCF4 C9 04 CMP #$04 rel-file? DCF6 F0 05 BEQ $DCFD yes DCF8 A9 01 LDA #$01 DCFA 95 F2 STA $F2,X set WRITE flag DCFC 60 RTS DCFD A4 83 LDY $83 secondary address DCFF B9 2B 02 LDA $022B,Y channel number in table DD02 29 3F AND #$3F erase the top two bits DD04 09 40 ORA #$40 set bit 6 DD06 99 2B 02 STA $022B,Y READ and WRITE flag DD09 AD 58 02 LDA $0258 record length DD0C 95 C7 STA $C7,X in table DD0E 20 8E D2 JSR $D28E find buffer DD11 10 03 BPL $DD16 found? DD13 4C 0F D2 JMP $D20F 70, 'no channel' DD16 A6 82 LDX $82 channel number DD18 95 CD STA $CD,X buffer number for side-sector DD1A 20 C1 DE JSR $DEC1 erase buffer DD1D 20 1E F1 JSR $F11E find free block in BAM DD20 A5 80 LDA $80 track DD22 8D 59 02 STA $0259 for side-sector DD25 A5 81 LDA $81 sector DD27 8D 5A 02 STA $025A for side-sector DD2A A6 82 LDX $82 channel number DD2C B5 CD LDA $CD,X buffer number DD2E 20 D3 D6 JSR $D6D3 transmit parameter to disk controller DD31 A9 00 LDA #$00 DD33 20 E9 DE JSR $DEE9 buffer pointer to zero DD36 A9 00 LDA #$00 DD38 20 8D DD JSR $DD8D DD3B A9 11 LDA #$11 17 DD3D 20 8D DD JSR $DD8D as end pointer in buffer DD40 A9 00 LDA #$00 zero DD42 20 8D DD JSR $DD8D as side-sector number in buffer DD45 AD 58 02 LDA $0258 record length DD48 20 8D DD JSR $DD8D in buffer DD4B A5 80 LDA $80 track number of this block DD4D 20 8D DD JSR $DD8D in buffer DD50 A5 81 LDA $81 sector number DD52 20 8D DD JSR $DD8D in buffer DD55 A9 10 LDA #$10 16 DD57 20 E9 DE JSR $DEE9 buffer pointer to 16 DD5A 20 3E DE JSR $DE3E get track and sector number DD5D A5 80 LDA $80 track number of the first data block DD5F 20 8D DD JSR $DD8D in buffer DD62 A5 81 LDA $81 sector number of the first data block DD64 20 8D DD JSR $DD8D in buffer DD67 20 6C DE JSR $DE6C write block to disk DD6A 20 99 D5 JSR $D599 and check DD6D A9 02 LDA #$02 DD6F 20 C8 D4 JSR $D4C8 buffer pointer to 2 DD72 A6 82 LDX $82 channel number DD74 38 SEC DD75 A9 00 LDA #$00 DD77 F5 C7 SBC $C7,X record length DD79 95 C1 STA $C1,X pointer for writing DD7B 20 E2 E2 JSR $E2E2 erase buffer DD7E 20 19 DE JSR $DE19 write link bytes in buffer DD81 20 5E DE JSR $DE5E write block to disk DD84 20 99 D5 JSR $D599 and check DD87 20 F4 EE JSR $EEF4 write BAM DD8A 4C 98 DC JMP $DC98 and done ****************************** write byte in side-sector block DD8D 48 PHA save byte DD8E A6 82 LDX $82 channel number DD90 B5 CD LDA $CD,X buffer number of the side-sector DD92 4C FD CF JMP $CFFD write byte in buffer ****************************** manipulate flags DD95 90 06 BCC $DD9D DD97 A6 82 LDX $82 channel number DD99 15 EC ORA $EC,X set flag DD9B D0 06 BNE $DDA3 DD9D A6 82 LDX $82 channel number DD9F 49 FF EOR #$FF DDA1 35 EC AND $EC,X erase flag DDA3 95 EC STA $EC,X DDA5 60 RTS DDA6 A6 82 LDX $82 channel number DDA8 35 EC AND $EC,X test flag DDAA 60 RTS ****************************** check command code for writing DDAB 20 93 DF JSR $DF93 get buffer number DDAE AA TAX DDAF BD 5B 02 LDA $025B,X DDB2 29 F0 AND #$F0 isolate command code DDB4 C9 90 CMP #$90 code for writing? DDB6 60 RTS ****************************** DDB7 A2 00 LDX #$00 DDB9 86 71 STX $71 counter for secondary address DDBB BD 2B 02 LDA $022B,X get channel number from table DDBE C9 FF CMP #$FF DDC0 D0 08 BNE $DDCA file open? DDC2 A6 71 LDX $71 DDC4 E8 INX increment counter DDC5 E0 10 CPX #$10 smaller than 16? DDC7 90 F0 BCC $DDB9 DDC9 60 RTS DDCA 86 71 STX $71 DDCC 29 3F AND #$3F isolate channel number DDCE A8 TAY DDCF B9 EC 00 LDA $00EC,Y DDD2 29 01 AND #$01 isolate drive number DDD4 85 70 STA $70 DDD6 AE 53 02 LDX $0253 DDD9 B5 E2 LDA $E2,X DDDB 29 01 AND #$01 isolate drive number DDDD C5 70 CMP $70 same drive? DDDF D0 E1 BNE $DDC2 no DDE1 B9 60 02 LDA $0260,Y sector number in directory DDE4 D5 D8 CMP $D8,X same as file? DDE6 D0 DA BNE $DDC2 no DDE8 B9 66 02 LDA $0266,Y DDEB D5 DD CMP $DD,X pointer same? DDED D0 D3 BNE $DDC2 no DDEF 18 CLC DDF0 60 RTS ****************************** write a block of a rel-file DDF1 20 9E DF JSR $DF9E get buffer number DDF4 50 06 BVC $DDFC no rel-file? DDF6 20 5E DE JSR $DE5E write block DDF9 20 99 D5 JSR $D599 and verify DDFC 60 RTS ****************************** write bytes for following track DDFD 20 2B DE JSR $DE2B set buffer pointer DE00 A5 80 LDA $80 track number DE02 91 94 STA ($94),Y in buffer DE04 C8 INY DE05 A5 81 LDA $81 sector number DE07 91 94 STA ($94),Y in buffer DE09 4C 05 E1 JMP $E105 set rel-flag ****************************** get following track and sector number DE0C 20 2B DE JSR $DE2B set buffer pointer DE0F B1 94 LDA ($94),Y following track number DE11 85 80 STA $80 DE13 C8 INY DE14 B1 94 LDA ($94),Y and get sector number DE16 85 81 STA $81 DE18 60 RTS ****************************** following track for last block DE19 20 2B DE JSR $DE2B set buffer pointer DE1C A9 00 LDA #$00 zero DE1E 91 94 STA ($94),Y as track number DE20 C8 INY DE21 A6 82 LDX $82 channel number DE23 B5 C1 LDA $C1,X pointer in block DE25 AA TAX DE26 CA DEX minus 1 DE27 8A TXA DE28 91 94 STA ($94),Y as pointer in block DE2A 60 RTS ****************************** buffer pointer to zero DE2B 20 93 DF JSR $DF93 get buffer number DE2E 0A ASL A times 2 DE2F AA TAX DE30 B5 9A LDA $9A,X buffer pointer hi DE32 85 95 STA $95 DE34 A9 00 LDA #$00 DE36 85 94 STA $94 buffer pointer lo DE38 A0 00 LDY #$00 DE3A 60 RTS ****************************** get track and sector DE3B 20 EB D0 JSR $D0EB get channel number DE3E 20 93 DF JSR $DF93 get buffer number DE41 85 F9 STA $F9 save DE43 0A ASL A times 2 DE44 A8 TAY DE45 B9 06 00 LDA $0006,Y get track DE48 85 80 STA $80 DE4A B9 07 00 LDA $0007,Y and sector number from disk controller DE4D 85 81 STA $81 DE4F 60 RTS ****************************** DE50 A9 90 LDA #$90 command code for writing DE52 8D 4D 02 STA $024D DE55 D0 28 BNE $DE7F DE57 A9 80 LDA #$80 command code for reading DE59 8D 4D 02 STA $024D DE5C D0 21 BNE $DE7F DE5E A9 90 LDA #$90 command code for writing DE60 8D 4D 02 STA $024D DE63 D0 26 BNE $DE8B DE65 A9 80 LDA #$80 command code for reading DE67 8D 4D 02 STA $024D DE6A D0 1F BNE $DE8B DE6C A9 90 LDA #$90 command code for writing DE6E 8D 4D 02 STA $024D DE71 D0 02 BNE $DE75 DE73 A9 80 LDA #$80 command code for reading DE75 8D 4D 02 STA $024D DE78 A6 82 LDX $82 channel number DE7A B5 CD LDA $CD,X side-sector buffer number DE7C AA TAX DE7D 10 13 BPL $DE92 buffer associated? DE7F 20 D0 D6 JSR $D6D0 generate header for disk controller DE82 20 93 DF JSR $DF93 get buffer number DE85 AA TAX DE86 A5 7F LDA $7F drive number DE88 9D 5B 02 STA $025B,X DE8B 20 15 E1 JSR $E115 buffer number DE8E 20 93 DF JSR $DF93 get buffer number DE91 AA TAX DE92 4C 06 D5 JMP $D506 write block ****************************** get following track and sector from buffer DE95 A9 00 LDA #$00 DE97 20 C8 D4 JSR $D4C8 buffer pointer to zero DE9A 20 37 D1 JSR $D137 get byte DE9D 85 80 STA $80 save as track DE9F 20 37 D1 JSR $D137 get byte DEA2 85 81 STA $81 as sector DEA4 60 RTS ****************************** copy buffer contents DEA5 48 PHA DEA6 A9 00 LDA #$00 DEA8 85 6F STA $6F DEAA 85 71 STA $71 DEAC B9 E0 FE LDA $FEE0,Y buffer address Y, hi DEAF 85 70 STA $70 DEB1 BD E0 FE LDA $FEE0,X buffer address X, lo DEB4 85 72 STA $72 DEB6 68 PLA DEB7 A8 TAY DEB8 88 DEY DEB9 B1 6F LDA ($6F),Y DEBB 91 71 STA ($71),Y DEBD 88 DEY DEBE 10 F9 BPL $DEB9 DEC0 60 RTS ****************************** erase buffer Y DEC1 A8 TAY buffer number DEC2 B9 E0 FE LDA $FEE0,Y get hi-address DEC5 85 70 STA $70 DEC7 A9 00 LDA #$00 lo-address DEC9 85 6F STA $6F DECB A8 TAY DECC 91 6F STA ($6F),Y erase buffer DECE C8 INY DECF D0 FB BNE $DECC DED1 60 RTS ****************************** get side-sector number DED2 A9 00 LDA #$00 DED4 20 DC DE JSR $DEDC buffer pointer to zero DED7 A0 02 LDY #$02 DED9 B1 94 LDA ($94),Y byte 2 contains the side-sector number DEDB 60 RTS ****************************** set buffer pointer to side-sector DEDC 85 94 STA $94 printer lo DEDE A6 82 LDX $82 channel number DEE0 B5 CD LDA $CD,X buffer number DEE2 AA TAX DEE3 BD E0 FE LDA $FEE0,X buffer address hi DEE6 85 95 STA $95 set DEE8 60 RTS ****************************** buffer pointer for side-sector DEE9 48 PHA pointer in side-sector DEEA 20 DC DE JSR $DEDC set buffer pointer DEED 48 PHA DEEE 8A TXA buffer number DEEF 0A ASL A times 2 DEF0 AA TAX DEF1 68 PLA DEF2 95 9A STA $9A,X buffer pointer hi DEF4 68 PLA DEF5 95 99 STA $99,X buffer pointer lo DEF7 60 RTS ****************************** get side-sector and buffer pointer DEF8 20 66 DF JSR $DF66 is side-sector in buffer? DEFB 30 0E BMI $DF0B no DEFD 50 13 BVC $DF12 ok DEFF A6 82 LDX $82 channel number DF01 B5 CD LDA $CD,X buffer number DF03 20 1B DF JSR $DF1B read side-sector DF06 20 66 DF JSR $DF66 and check if in buffer DF09 10 07 BPL $DF12 yes? DF0B 20 CB E1 JSR $E1CB get last side-sector DF0E 2C CE FE BIT $FECE set V bit DF11 60 RTS DF12 A5 D6 LDA $D6 side-sector and pointer DF14 20 E9 DE JSR $DEE9 set pointer in side-sector DF17 2C CD FE BIT $FECD erase V bit DF1A 60 RTS ****************************** read side-sector DF1B 85 F9 STA $F9 buffer number DF1D A9 80 LDA #$80 command code for reading DF1F D0 04 BNE $DF25 ****************************** write side-sector DF21 85 F9 STA $F9 buffer number DF23 A9 90 LDA #$90 command code for writing DF25 48 PHA DF26 B5 EC LDA $EC,X DF28 29 01 AND #$01 isolate drive number DF2A 85 7F STA $7F DF2C 68 PLA DF2D 05 7F ORA $7F command code plus drive number DF2F 8D 4D 02 STA $024D save DF32 B1 94 LDA ($94),Y track number DF34 85 80 STA $80 DF36 C8 INY DF37 B1 94 LDA ($94),Y sector number DF39 85 81 STA $81 DF3B A5 F9 LDA $F9 buffer number DF3D 20 D3 D6 JSR $D6D3 transmit parameter to disk controller DF40 A6 F9 LDX $F9 buffer number DF42 4C 93 D5 JMP $D593 transmit command to disk controller ****************************** set buffer pointer in side-sector DF45 A6 82 LDX $82 channel number DF47 B5 CD LDA $CD,X buffer number DF49 4C EB D4 JMP $D4EB set buffer pointer ****************************** calculate block number of a rel-file DF4C A9 78 LDA #$78 120 block pointers per side-sector DF4E 20 5C DF JSR $DF5C add to $70/$71 DF51 CA DEX side-sector number DF52 10 F8 BPL $DF4C next side-sector? DF54 A5 72 LDA $72 pointer value in last block DF56 4A LSR A divided by 2 DF57 20 5C DF JSR $DF5C add to previous sum DF5A A5 73 LDA $73 number of the side-sector block DF5C 18 CLC DF5D 65 70 ADC $70 DF5F 85 70 STA $70 add DF61 90 02 BCC $DF65 DF63 E6 71 INC $71 DF65 60 RTS ****************************** verify side-sector in buffer DF66 20 D2 DE JSR $DED2 get side-sector number DF69 C5 D5 CMP $D5 = number of necessary block? DF6B D0 0E BNE $DF7B no DF6D A4 D6 LDY $D6 pointer in side-sector DF6F B1 94 LDA ($94),Y track number DF71 F0 04 BEQ $DF77 DF73 2C CD FE BIT $FECD erase bits DF76 60 RTS DF77 2C CF FE BIT $FECF set N-bit DF7A 60 RTS DF7B A5 D5 LDA $D5 side-sector number DF7D C9 06 CMP #$06 6 or greater? DF7F B0 0A BCS $DF8B yes DF81 0A ASL A DF82 A8 TAY DF83 A9 04 LDA #$04 DF85 85 94 STA $94 DF87 B1 94 LDA ($94),Y track number DF89 D0 04 BNE $DF8F DF8B 2C D0 FE BIT $FED0 set N and V bits DF8E 60 RTS DF8F 2C CE FE BIT $FECE set V bit DF92 60 RTS ****************************** get buffer number DF93 A6 82 LDX $82 channel number DF95 B5 A7 LDA $A7,X buffer number DF97 10 02 BPL $DF9B DF99 B5 AE LDA $AE,X buffer number from second table DF9B 29 BF AND #$BF erase V bit DF9D 60 RTS DF9E A6 82 LDX $82 channel number DFA0 8E 57 02 STX $0257 save DFA3 B5 A7 LDA $A7,X get buffer number DFA5 10 09 BPL $DFB0 buffer allocated DFA7 8A TXA DFA8 18 CLC DFA9 69 07 ADC #$07 increment number by 7 DFAB 8D 57 02 STA $0257 and save DFAE B5 AE LDA $AE,X buffer number from table 2 DFB0 85 70 STA $70 DFB2 29 1F AND #$1F erase the highest 3 bits DFB4 24 70 BIT $70 DFB6 60 RTS DFB7 A6 82 LDX $82 channel number DFB9 B5 A7 LDA $A7,X buffer number DFBB 30 02 BMI $DFBF buffer free? DFBD B5 AE LDA $AE,X buffer number from table 2 DFBF C9 FF CMP #$FF free? DFC1 60 RTS DFC2 A6 82 LDX $82 DFC4 09 80 ORA #$80 DFC6 B4 A7 LDY $A7,X DFC8 10 03 BPL $DFCD DFCA 95 A7 STA $A7,X DFCC 60 RTS DFCD 95 AE STA $AE,X DFCF 60 RTS ****************************** get next record in rel-file DFD0 A9 20 LDA #$20 DFD2 20 9D DD JSR $DD9D erase bit 5 DFD5 A9 80 LDA #$80 DFD7 20 A6 DD JSR $DDA6 test bit 7 DFDA D0 41 BNE $E01D set? DFDC A6 82 LDX $82 channel number DFDE F6 B5 INC $B5,X increment record number DFE0 D0 02 BNE $DFE4 DFE2 F6 BB INC $BB,X record number hi DFE4 A6 82 LDX $82 channel number DFE6 B5 C1 LDA $C1,X write pointer DFE8 F0 2E BEQ $E018 zero? DFEA 20 E8 D4 JSR $D4E8 set buffer pointer DFED A6 82 LDX $82 channel number DFEF D5 C1 CMP $C1,X buffer pointer smaller than write pointer DFF1 90 03 BCC $DFF6 yes DFF3 20 3C E0 JSR $E03C write block, read next block DFF6 A6 82 LDX $82 channel number DFF8 B5 C1 LDA $C1,X write pointer DFFA 20 C8 D4 JSR $D4C8 set buffer pointer = write pointer DFFD A1 99 LDA ($99,X) byte from buffer DFFF 85 85 STA $85 put in output register E001 A9 20 LDA #$20 E003 20 9D DD JSR $DD9D erase bit 5 E006 20 04 E3 JSR $E304 add record length to write pointer E009 48 PHA and save E00A 90 28 BCC $E034 not yet in last block? E00C A9 00 LDA #$00 E00E 20 F6 D4 JSR $D4F6 get track number E011 D0 21 BNE $E034 does block exist? E013 68 PLA pointer E014 C9 02 CMP #$02 = 2 E016 F0 12 BEQ $E02A yes E018 A9 80 LDA #$80 E01A 20 97 DD JSR $DD97 set bit 7 E01D 20 2F D1 JSR $D12F get byte from buffer E020 B5 99 LDA $99,X buffer pointer E022 99 44 02 STA $0244,Y as end pointer E025 A9 0D LDA #$0D CR E027 85 85 STA $85 in output register E029 60 RTS E02A 20 35 E0 JSR $E035 E02D A6 82 LDX $82 channel number E02F A9 00 LDA #$00 E031 95 C1 STA $C1,X write pointer to zero E033 60 RTS E034 68 PLA E035 A6 82 LDX $82 channel number E037 95 C1 STA $C1,X set write pointer E039 4C 6E E1 JMP $E16E ****************************** write block and read next block E03C 20 D3 D1 JSR $D1D3 get drive number E03F 20 95 DE JSR $DE95 get track and sector number E042 20 9E DF JSR $DF9E get bufer number E045 50 16 BVC $E05D no rel-file? E047 20 5E DE JSR $DE5E write block E04A 20 1E CF JSR $CF1E change buffer E04D A9 02 LDA #$02 E04F 20 C8 D4 JSR $D4C8 buffer pointer to 2 E052 20 AB DD JSR $DDAB command code for writing? E055 D0 24 BNE $E07B no E057 20 57 DE JSR $DE57 read block E05A 4C 99 D5 JMP $D599 and verify E05D 20 1E CF JSR $CF1E change buffer E060 20 AB DD JSR $DDAB command code for writing? E063 D0 06 BNE $E06B no E065 20 57 DE JSR $DE57 read block E068 20 99 D5 JSR $D599 and verify E06B 20 95 DE JSR $DE95 get track and sector number E06E A5 80 LDA $80 track E070 F0 09 BEQ $E07B no following track E072 20 1E CF JSR $CF1E change buffer E075 20 57 DE JSR $DE57 read block E078 20 1E CF JSR $CF1E change buffer E07B 60 RTS ****************************** write a byte in a record E07C 20 05 E1 JSR $E105 E07F 20 93 DF JSR $DF93 get buffer number E082 0A ASL A times 2 E083 AA TAX E084 A5 85 LDA $85 data byte E086 81 99 STA ($99,X) write in buffer E088 B4 99 LDY $99,X buffer pointer E08A C8 INY increment E08B D0 09 BNE $E096 not equal zero? E08D A4 82 LDY $82 channel number E08F B9 C1 00 LDA $00C1,Y write pointer E092 F0 0A BEQ $E09E equal zero? E094 A0 02 LDY #$02 buffer pointer to 2 E096 98 TYA E097 A4 82 LDY $82 channel number E099 D9 C1 00 CMP $00C1,Y buffer pointer = write pointer? E09C D0 05 BNE $E0A3 no E09E A9 20 LDA #$20 E0A0 4C 97 DD JMP $DD97 set bit 5 E0A3 F6 99 INC $99,X increment buffer pointer E0A5 D0 03 BNE $E0AA not zero? E0A7 20 3C E0 JSR $E03C else write block, read next one E0AA 60 RTS ****************************** write byte in rel-file E0AB A9 A0 LDA #$A0 E0AD 20 A6 DD JSR $DDA6 test bits 6 & 7 E0B0 D0 27 BNE $E0D9 set? E0B2 A5 85 LDA $85 data byte E0B4 20 7C E0 JSR $E07C write in record E0B7 A5 F8 LDA $F8 end? E0B9 F0 0D BEQ $E0C8 yes E0BB 60 RTS E0BC A9 20 LDA #$20 E0BE 20 A6 DD JSR $DDA6 test bit 5 E0C1 F0 05 BEQ $E0C8 not set E0C3 A9 51 LDA #$51 51, 'overflow in record' E0C5 8D 6C 02 STA $026C set error flag E0C8 20 F3 E0 JSR $E0F3 fill remainder with zeroes E0CB 20 53 E1 JSR $E153 E0CE AD 6C 02 LDA $026C error flag set? E0D1 F0 03 BEQ $E0D6 no E0D3 4C C8 C1 JMP $C1C8 set error message E0D6 4C BC E6 JMP $E6BC error free execution E0D9 29 80 AND #$80 bit 7 set? E0DB D0 05 BNE $E0E2 yes E0DD A5 F8 LDA $F8 E0DF F0 DB BEQ $E0BC end? E0E1 60 RTS E0E2 A5 85 LDA $85 data byte E0E4 48 PHA E0E5 20 1C E3 JSR $E31C expand side-sector E0E8 68 PLA E0E9 85 85 STA $85 E0EB A9 80 LDA #$80 E0ED 20 9D DD JSR $DD9D erase bit 7 E0F0 4C B2 E0 JMP $E0B2 write byte in file ****************************** fill record with zeroes E0F3 A9 20 LDA #$20 E0F5 20 A6 DD JSR $DDA6 test bit 5 E0F8 D0 0A BNE $E104 set? E0FA A9 00 LDA #$00 E0FC 85 85 STA $85 zero as data byte E0FE 20 7C E0 JSR $E07C write in record E101 4C F3 E0 JMP $E0F3 until record full E104 60 RTS ****************************** write buffer number in table E105 A9 40 LDA #$40 E107 20 97 DD JSR $DD97 set bit 6 E10A 20 9E DF JSR $DF9E get buffer number E10D 09 40 ORA #$40 set bit 6 E10F AE 57 02 LDX $0257 channel number + 7 E112 95 A7 STA $A7,X write in table E114 60 RTS E115 20 9E DF JSR $DF9E get buffer number E118 29 BF AND #$BF erase bit 6 E11A AE 57 02 LDX $0257 channel number E11D 95 A7 STA $A7,X write in table E11F 60 RTS ****************************** get byte from rel-file E120 A9 80 LDA #$80 E122 20 A6 DD JSR $DDA6 test bit 7 E125 D0 37 BNE $E15E set? E127 20 2F D1 JSR $D12F get byte from buffer E12A B5 99 LDA $99,X buffer pointer E12C D9 44 02 CMP $0244,Y compare to end pointer E12F F0 22 BEQ $E153 equal? E131 F6 99 INC $99,X increment buffer pointer E133 D0 06 BNE $E13B not zero? E135 20 3C E0 JSR $E03C write block, read next one E138 20 2F D1 JSR $D12F get byte from buffer E13B A1 99 LDA ($99,X) E13D 99 3E 02 STA $023E,Y in output register E140 A9 89 LDA #$89 E142 99 F2 00 STA $00F2,Y set READ and WRITE flag E145 B5 99 LDA $99,X buffer pointer E147 D9 44 02 CMP $0244,Y compare to end pointer E14A F0 01 BEQ $E14D same? E14C 60 RTS E14D A9 81 LDA #$81 E14F 99 F2 00 STA $00F2,Y set flag for end E152 60 RTS E153 20 D0 DF JSR $DFD0 find next record E156 20 2F D1 JSR $D12F get buffer and channel number E159 A5 85 LDA $85 data byte E15B 4C 3D E1 JMP $E13D into output register E15E A6 82 LDX $82 channel number E160 A9 0D LDA #$0D CR E162 9D 3E 02 STA $023E,X into output register E165 A9 81 LDA #$81 E167 95 F2 STA $F2,X set flag for end E169 A9 50 LDA #$50 E16B 20 C8 C1 JSR $C1C8 50, 'record not present' E16E A6 82 LDX $82 channel number E170 B5 C1 LDA $C1,X write pointer E172 85 87 STA $87 save E174 C6 87 DEC $87 E176 C9 02 CMP #$02 equal 2? E178 D0 04 BNE $E17E no E17A A9 FF LDA #$FF E17C 85 87 STA $87 E17E B5 C7 LDA $C7,X record length E180 85 88 STA $88 E182 20 E8 D4 JSR $D4E8 set buffer pointer E185 A6 82 LDX $82 channel number E187 C5 87 CMP $87 buffer pointer > write pointer? E189 90 19 BCC $E1A4 E18B F0 17 BEQ $E1A4 no E18D 20 1E CF JSR $CF1E change buffer E190 20 B2 E1 JSR $E1B2 E193 90 08 BCC $E19D E195 A6 82 LDX $82 channel number E197 9D 44 02 STA $0244,X E19A 4C 1E CF JMP $CF1E change buffer E19D 20 1E CF JSR $CF1E change buffer E1A0 A9 FF LDA #$FF E1A2 85 87 STA $87 E1A4 20 B2 E1 JSR $E1B2 E1A7 B0 03 BCS $E1AC E1A9 20 E8 D4 JSR $D4E8 set buffer pointer E1AC A6 82 LDX $82 channel number E1AE 9D 44 02 STA $0244,X end pointer E1B1 60 RTS E1B2 20 2B DE JSR $DE2B buffer pointer to zero E1B5 A4 87 LDY $87 E1B7 B1 94 LDA ($94),Y byte from buffer E1B9 D0 0D BNE $E1C8 not zero? E1BB 88 DEY E1BC C0 02 CPY #$02 E1BE 90 04 BCC $E1C4 E1C0 C6 88 DEC $88 E1C2 D0 F3 BNE $E1B7 E1C4 C6 88 DEC $88 E1C6 18 CLC E1C7 60 RTS E1C8 98 TYA E1C9 38 SEC E1CA 60 RTS ****************************** get last side-sector E1CB 20 D2 DE JSR $DED2 get number of the side-sector E1CE 85 D5 STA $D5 save E1D0 A9 04 LDA #$04 E1D2 85 94 STA $94 pointer to side-sectors E1D4 A0 0A LDY #$0A E1D6 D0 04 BNE $E1DC E1D8 88 DEY E1D9 88 DEY E1DA 30 26 BMI $E202 E1DC B1 94 LDA ($94),Y track number of the previous block E1DE F0 F8 BEQ $E1D8 E1E0 98 TYA E1E1 4A LSR A divide by 2 E1E2 C5 D5 CMP $D5 = number of the actual block? E1E4 F0 09 BEQ $E1EF yes E1E6 85 D5 STA $D5 else save all numbers E1E8 A6 82 LDX $82 channel number E1EA B5 CD LDA $CD,X buffer number E1EC 20 1B DF JSR $DF1B read block E1EF A0 00 LDY #$00 E1F1 84 94 STY $94 buffer pointer E1F3 B1 94 LDA ($94),Y track number E1F5 D0 0B BNE $E202 another block? E1F7 C8 INY E1F8 B1 94 LDA ($94),Y sector number = end pointer E1FA A8 TAY E1FB 88 DEY E1FC 84 D6 STY $D6 save end pointer E1FE 98 TYA E1FF 4C E9 DE JMP $DEE9 set buffer pointer E202 A9 67 LDA #$67 E204 20 45 E6 JSR $E645 67, 'illegal track or sector' ****************************** P command, 'record' E207 20 B3 C2 JSR $C2B3 verify lines E20A AD 01 02 LDA $0201 secondary address E20D 85 83 STA $83 E20F 20 EB D0 JSR $D0EB find channel number E212 90 05 BCC $E219 found? E214 A9 70 LDA #$70 E216 20 C8 C1 JSR $C1C8 70, 'no block' E219 A9 A0 LDA #$A0 E21B 20 9D DD JSR $DD9D erase bits 6 & 7 E21E 20 25 D1 JSR $D125 verify if 'REL'-file E221 F0 05 BEQ $E228 yes E223 A9 64 LDA #$64 E225 20 C8 C1 JSR $C1C8 64, 'file type mismatch' E228 B5 EC LDA $EC,X E22A 29 01 AND #$01 E22C 85 7F STA $7F drive number E22E AD 02 02 LDA $0202 record number lo E231 95 B5 STA $B5,X E233 AD 03 02 LDA $0203 record number hi E236 95 BB STA $BB,X E238 A6 82 LDX $82 channel number E23A A9 89 LDA #$89 E23C 95 F2 STA $F2,X READ and WRITE flag E23E AD 04 02 LDA $0204 byte-pointer E241 F0 10 BEQ $E253 zero? E243 38 SEC E244 E9 01 SBC #$01 E246 F0 0B BEQ $E253 E248 D5 C7 CMP $C7,X compare with record length E24A 90 07 BCC $E253 E24C A9 51 LDA #$51 E24E 8D 6C 02 STA $026C 51, 'overflow in record' E251 A9 00 LDA #$00 E253 85 D4 STA $D4 E255 20 0E CE JSR $CE0E calculate pointer in rel-file E258 20 F8 DE JSR $DEF8 and read appropriate side-sector E25B 50 08 BVC $E265 does block exist? E25D A9 80 LDA #$80 E25F 20 97 DD JSR $DD97 set bit 7 E262 4C 5E E1 JMP $E15E and 50, 'record not present' E265 20 75 E2 JSR $E275 E268 A9 80 LDA #$80 E26A 20 A6 DD JSR $DDA6 test bit 7 E26D F0 03 BEQ $E272 not set E26F 4C 5E E1 JMP $E15E 50, 'record not present' E272 4C 94 C1 JMP $C194 done E275 20 9C E2 JSR $E29C E278 A5 D7 LDA $D7 pointer in rel-file E27A 20 C8 D4 JSR $D4C8 set buffer pointer E27D A6 82 LDX $82 channel number E27F B5 C7 LDA $C7,X record length E281 38 SEC E282 E5 D4 SBC $D4 minus position E284 B0 03 BCS $E289 positive? E286 4C 02 E2 JMP $E202 67, 'illegal track or sector' E289 18 CLC E28A 65 D7 ADC $D7 add pointer in data block E28C 90 03 BCC $E291 no overflow E28E 69 01 ADC #$01 plus 2 E290 38 SEC E291 20 09 E0 JSR $E009 set pointer E294 4C 38 E1 JMP $E138 get byte from buffer E297 A9 51 LDA #$51 E299 20 C8 C1 JSR $C1C8 51, 'overflow in record' E29C A5 94 LDA $94 buffer pointer lo E29E 85 89 STA $89 E2A0 A5 95 LDA $95 buffer pointer hi E2A2 85 8A STA $8A E2A4 20 D0 E2 JSR $E2D0 compare track and sector E2A7 D0 01 BNE $E2AA not equal? E2A9 60 RTS E2AA 20 F1 DD JSR $DDF1 E2AD 20 0C DE JSR $DE0C E2B0 A5 80 LDA $80 track E2B2 F0 0E BEQ $E2C2 no block following? E2B4 20 D3 E2 JSR $E2D3 compare track and sector number E2B7 D0 06 BNE $E2BF not equal? E2B9 20 1E CF JSR $CF1E change buffer E2BC 4C DA D2 JMP $D2DA E2BF 20 DA D2 JSR $D2DA E2C2 A0 00 LDY #$00 E2C4 B1 89 LDA ($89),Y track E2C6 85 80 STA $80 E2C8 C8 INY E2C9 B1 89 LDA ($89),Y and sector of the next block E2CB 85 81 STA $81 E2CD 4C AF D0 JMP $D0AF read block E2D0 20 3E DE JSR $DE3E E2D3 A0 00 LDY #$00 E2D5 B1 89 LDA ($89),Y track number E2D7 C5 80 CMP $80 compare E2D9 F0 01 BEQ $E2DC E2DB 60 RTS E2DC C8 INY E2DD B1 89 LDA ($89),Y sector number E2DF C5 81 CMP $81 compare E2E1 60 RTS ****************************** subdivide records in data block E2E2 20 2B DE JSR $DE2B set buffer pointer E2E5 A0 02 LDY #$02 E2E7 A9 00 LDA #$00 E2E9 91 94 STA ($94),Y erase buffer E2EB C8 INY E2EC D0 FB BNE $E2E9 E2EE 20 04 E3 JSR $E304 set pointer to next record E2F1 95 C1 STA $C1,X E2F3 A8 TAY E2F4 A9 FF LDA #$FF E2F6 91 94 STA ($94),Y $FF as 1st character in record E2F8 20 04 E3 JSR $E304 set pointer to next record E2FB 90 F4 BCC $E2F1 done in this block? E2FD D0 04 BNE $E303 block full? E2FF A9 00 LDA #$00 E301 95 C1 STA $C1,X write pointer to zero E303 60 RTS ****************************** set pointer to next record E304 A6 82 LDX $82 channel number E306 B5 C1 LDA $C1,X write pointer E308 38 SEC E309 F0 0D BEQ $E318 equal zero? E30B 18 CLC E30C 75 C7 ADC $C7,X add record length E30E 90 0B BCC $E31B smaller than 256? E310 D0 06 BNE $E318 equal 256? E312 A9 02 LDA #$02 E314 2C CC FE BIT $FECC E317 60 RTS E318 69 01 ADC #$01 add two E31A 38 SEC E31B 60 RTS ****************************** expand side-sector E31C 20 D3 D1 JSR $D1D3 get drive number E31F 20 CB E1 JSR $E1CB get last side-sector E322 20 9C E2 JSR $E29C E325 20 7B CF JSR $CF7B E328 A5 D6 LDA $D6 E32A 85 87 STA $87 E32C A5 D5 LDA $D5 side-sector number E32E 85 86 STA $86 E330 A9 00 LDA #$00 E332 85 88 STA $88 E334 A9 00 LDA #$00 E336 85 D4 STA $D4 E338 20 0E CE JSR $CE0E calculate side-sector number and pointer E33B 20 4D EF JSR $EF4D number of free blocks E33E A4 82 LDY $82 channel number E340 B6 C7 LDX $C7,Y record length E342 CA DEX E343 8A TXA E344 18 CLC E345 65 D7 ADC $D7 plus pointer in data block E347 90 0C BCC $E355 E349 E6 D6 INC $D6 E34B E6 D6 INC $D6 increment pointer to end by 2 E34D D0 06 BNE $E355 E34F E6 D5 INC $D5 increment side-sector number E351 A9 10 LDA #$10 E353 85 D6 STA $D6 set pointer to 16 E355 A5 87 LDA $87 E357 18 CLC E358 69 02 ADC #$02 E35A 20 E9 DE JSR $DEE9 set buffer pointer for side-sector E35D A5 D5 LDA $D5 side-sector number E35F C9 06 CMP #$06 E361 90 05 BCC $E368 smaller than 6? E363 A9 52 LDA #$52 E365 20 C8 C1 JSR $C1C8 52, 'file too large' E368 A5 D6 LDA $D6 end pointer E36A 38 SEC E36B E5 87 SBC $87 minus last end pointer E36D B0 03 BCS $E372 E36F E9 0F SBC #$0F minus 16 E371 18 CLC E372 85 72 STA $72 E374 A5 D5 LDA $D5 side-sector number E376 E5 86 SBC $86 minus last side-sector number E378 85 73 STA $73 save E37A A2 00 LDX #$00 E37C 86 70 STX $70 erase sum for calculation E37E 86 71 STX $71 E380 AA TAX E381 20 51 DF JSR $DF51 calculate block # of rel-file E384 A5 71 LDA $71 E386 D0 07 BNE $E38F E388 A6 70 LDX $70 E38A CA DEX E38B D0 02 BNE $E38F E38D E6 88 INC $88 E38F CD 73 02 CMP $0273 block number of rel-file E392 90 09 BCC $E39D greater than free blocks on disk? E394 D0 CD BNE $E363 52, 'file too large' E396 AD 72 02 LDA $0272 E399 C5 70 CMP $70 E39B 90 C6 BCC $E363 52, 'file too large' E39D A9 01 LDA #$01 E39F 20 F6 D4 JSR $D4F6 get byte from buffer E3A2 18 CLC E3A3 69 01 ADC #$01 plus 1 E3A5 A6 82 LDX $82 E3A7 95 C1 STA $C1,X as write pointer E3A9 20 1E F1 JSR $F11E find free block in BAM E3AC 20 FD DD JSR $DDFD track and sector in buffer E3AF A5 88 LDA $88 E3B1 D0 15 BNE $E3C8 only one block needed? E3B3 20 5E DE JSR $DE5E write block E3B6 20 1E CF JSR $CF1E change buffer E3B9 20 D0 D6 JSR $D6D0 transmit parameter to disk controller E3BC 20 1E F1 JSR $F11E find free block in BAM E3BF 20 FD DD JSR $DDFD track and sector in buffer E3C2 20 E2 E2 JSR $E2E2 erase buffer E3C5 4C D4 E3 JMP $E3D4 E3C8 20 1E CF JSR $CF1E change buffer E3CB 20 D0 D6 JSR $D6D0 transmit parameter to disk controller E3CE 20 E2 E2 JSR $E2E2 erase buffer E3D1 20 19 DE JSR $DE19 zero byte and end pointer in buffer E3D4 20 5E DE JSR $DE5E write block E3D7 20 0C DE JSR $DE0C get track and sector E3DA A5 80 LDA $80 track E3DC 48 PHA E3DD A5 81 LDA $81 and sector E3DF 48 PHA save E3E0 20 3E DE JSR $DE3E get track and sector from disk E3E3 A5 81 LDA $81 controller E3E5 48 PHA E3E6 A5 80 LDA $80 save track and sector E3E8 48 PHA E3E9 20 45 DF JSR $DF45 set buffer pointer for side-sector E3EC AA TAX E3ED D0 0A BNE $E3F9 pointer not zero? E3EF 20 4E E4 JSR $E44E write side-sector E3F2 A9 10 LDA #$10 E3F4 20 E9 DE JSR $DEE9 buffer pointer to 16 E3F7 E6 86 INC $86 increment side-sector number E3F9 68 PLA E3FA 20 8D DD JSR $DD8D track in side-sector E3FD 68 PLA E3FE 20 8D DD JSR $DD8D sector in side-sector E401 68 PLA E402 85 81 STA $81 sector E404 68 PLA E405 85 80 STA $80 and get track back E407 F0 0F BEQ $E418 no more blocks? E409 A5 86 LDA $86 side-sector number E40B C5 D5 CMP $D5 changed? E40D D0 A7 BNE $E3B6 yes E40F 20 45 DF JSR $DF45 set buffer pointer in side-sector E412 C5 D6 CMP $D6 end pointer E414 90 A0 BCC $E3B6 smaller? E416 F0 B0 BEQ $E3C8 same E418 20 45 DF JSR $DF45 set buffer pointer in side-sector E41B 48 PHA E41C A9 00 LDA #$00 E41E 20 DC DE JSR $DEDC buffer pointer to zero E421 A9 00 LDA #$00 E423 A8 TAY E424 91 94 STA ($94),Y zero as track number E426 C8 INY E427 68 PLA end pointer E428 38 SEC E429 E9 01 SBC #$01 minus one E42B 91 94 STA ($94),Y as sector E42D 20 6C DE JSR $DE6C write block E430 20 99 D5 JSR $D599 and verify E433 20 F4 EE JSR $EEF4 update BAM E436 20 0E CE JSR $CE0E update pointer for rel-file E439 20 1E CF JSR $CF1E change buffer E43C 20 F8 DE JSR $DEF8 right side-sector? E43F 70 03 BVS $E444 no E441 4C 75 E2 JMP $E275 E444 A9 80 LDA #$80 E446 20 97 DD JSR $DD97 set bit 7 E449 A9 50 LDA #$50 E44B 20 C8 C1 JSR $C1C8 50, 'record not present' ****************************** write side-sector and allocate new one E44E 20 1E F1 JSR $F11E find free block in BAM E451 20 1E CF JSR $CF1E change buffer E454 20 F1 DD JSR $DDF1 write block E457 20 93 DF JSR $DF93 get buffer number E45A 48 PHA E45B 20 C1 DE JSR $DEC1 erase buffer E45E A6 82 LDX $82 channel number E460 B5 CD LDA $CD,X buffer number E462 A8 TAY E463 68 PLA E464 AA TAX E465 A9 10 LDA #$10 16 bytes of the side-sector E467 20 A5 DE JSR $DEA5 copy in buffer E46A A9 00 LDA #$00 E46C 20 DC DE JSR $DEDC buffer pointer to 0, old side-sector E46F A0 02 LDY #$02 E471 B1 94 LDA ($94),Y side-sector number E473 48 PHA E474 A9 00 LDA #$00 E476 20 C8 D4 JSR $D4C8 buffer pointer to 0, new side-sector E479 68 PLA E47A 18 CLC E47B 69 01 ADC #$01 increment side-sector number E47D 91 94 STA ($94),Y and in buffer E47F 0A ASL A times 2 E480 69 04 ADC #$04 plus 4 E482 85 89 STA $89 E484 A8 TAY E485 38 SEC E486 E9 02 SBC #$02 minus 2 E488 85 8A STA $8A same pointer to old side-sector E48A A5 80 LDA $80 track E48C 85 87 STA $87 E48E 91 94 STA ($94),Y in buffer E490 C8 INY E491 A5 81 LDA $81 sector E493 85 88 STA $88 E495 91 94 STA ($94),Y in buffer E497 A0 00 LDY #$00 E499 98 TYA E49A 91 94 STA ($94),Y zero in buffer E49C C8 INY E49D A9 11 LDA #$11 17 E49F 91 94 STA ($94),Y number of bytes in block E4A1 A9 10 LDA #$10 16 E4A3 20 C8 D4 JSR $D4C8 buffer pointer to 16 E4A6 20 50 DE JSR $DE50 write block E4A9 20 99 D5 JSR $D599 and verify E4AC A6 82 LDX $82 channel number E4AE B5 CD LDA $CD,X buffer number of the side-sector E4B0 48 PHA E4B1 20 9E DF JSR $DF9E get buffer number E4B4 A6 82 LDX $82 channel number E4B6 95 CD STA $CD,X write in table E4B8 68 PLA E4B9 AE 57 02 LDX $0257 channel number + 7 E4BC 95 A7 STA $A7,X in table E4BE A9 00 LDA #$00 E4C0 20 C8 D4 JSR $D4C8 buffer pointer to zero E4C3 A0 00 LDY #$00 E4C5 A5 80 LDA $80 track E4C7 91 94 STA ($94),Y in buffer E4C9 C8 INY E4CA A5 81 LDA $81 sector E4CC 91 94 STA ($94),Y in buffer E4CE 4C DE E4 JMP $E4DE E4D1 20 93 DF JSR $DF93 get buffer number E4D4 A6 82 LDX $82 channel number E4D6 20 1B DF JSR $DF1B read block E4D9 A9 00 LDA #$00 E4DB 20 C8 D4 JSR $D4C8 buffer pointer to zero E4DE C6 8A DEC $8A E4E0 C6 8A DEC $8A counter for side-sector blocks E4E2 A4 89 LDY $89 E4E4 A5 87 LDA $87 track number E4E6 91 94 STA ($94),Y in buffer E4E8 C8 INY E4E9 A5 88 LDA $88 sector number E4EB 91 94 STA ($94),Y in buffer E4ED 20 5E DE JSR $DE5E write block E4F0 20 99 D5 JSR $D599 and verify E4F3 A4 8A LDY $8A counter for side-sector blocks E4F5 C0 03 CPY #$03 E4F7 B0 D8 BCS $E4D1 greater than or equal to 3? E4F9 4C 1E CF JMP $CF1E change buffer ****************************** table of error messages E4FC 00 00 E4FD A0 4F CB ' oK' E500 20 21 22 23 24 27 error numbers of 'read error' E506 D2 45 41 44 'Read' E50A 89 pointer to 'error' E50B 52 52 E50C 83 pointer to 'file' E50D 20 54 4F 4F 20 ' too ' E511 4C 41 52 47 C5 'largE' E517 50 50 E518 8B 06 pointer to 'record' and 'not' E51A 20 50 52 45 53 45 4E D4 ' presenT' E522 51 51 E523 CF 56 45 52 46 4C 4F 57 'Overflow' E52B 20 49 4E ' in' E52E 8B pointer to 'record' E52F 25 28 error numbers of 'write error' E531 8A 89 pointers to 'write' and 'error' E533 26 26 E534 8A pointer to 'write' E535 20 50 52 4F 54 45 43 54 ' protect' E53D 20 4F CE ' oN' E540 29 29 E541 88 pointer to 'disk' E542 20 49 44 ' id' E545 85 pointer to 'mismatch' E546 30 31 32 33 34 error numbers for 'syntax error' E54B D3 59 4E 54 41 58 'Syntax' E551 89 pointer to 'error' E552 60 60 E553 8A 03 84 pointers to 'write', 'file' and 'open' E556 63 63 E557 83 pointer to 'file' E558 20 45 58 49 53 54 D3 ' existS' E55F 64 64 E560 83 pointer to 'file' E561 20 54 59 50 45 ' type' E566 85 pointer to 'mismatch' E567 65 65 E568 CE 4F 20 42 4C 4F 43 CB 'No block' E570 66 67 error numbers for 'illegal track or sector' E572 C9 4C 4C 45 47 41 4C 20 'Illegal ' E579 54 52 41 43 4B 20 4F 52 'track or' E582 20 53 45 43 54 4F D2 ' sectoR' E589 61 61 E58A 83 06 84 pointer to 'file', 'not' and 'open' E58D 39 62 error numbers for 'file not found' E58F 83 06 87 pointers to 'file', 'not' and 'found' E592 01 01 E593 83 pointer to 'file' E594 53 20 53 43 52 41 54 43 48 45 C4 's scratcheD' E59F 70 70 E5A0 CE 4F 20 'No ' E5A3 43 48 41 4E 4E 45 CC 'channeL' E5AA 71 71 E5AB C4 49 52 'Dir' E5AE 89 pointer to 'error' E5AF 72 72 E5B0 88 pointer to 'disk' E5B1 20 46 55 4C CC ' fulL' E5B6 73 73 E5B7 C3 42 4D 20 44 4F 53 20 'Cbm dos ' E5BE 56 32 2E 36 20 31 35 34 B1 'v2.6 1541' E5C8 74 74 E5C9 C4 52 49 56 45 'Drive' E5CE 06 pointer to 'not' E5CF 20 52 45 41 44 D9 ' readY' E5D5 09 E5D6 C5 52 52 4F D2 'ErroR' E5DB 0A E5DC D7 52 49 54 C5 'WritE' E5E1 03 E5E2 C6 49 4C C5 'FilE' E5E6 04 E5E7 CF 50 45 CE 'OpeN' E5EB 05 E5EC CD 49 53 4D 41 54 43 C8 'MismatcH' E5F4 06 E5F5 CE 4F D4 'NoT' E5F8 07 E5F9 C6 4F 55 4E C4 'FounD' E5FE 08 E5FF C4 49 53 CB 'DisK' E603 0B E604 D2 45 43 4F 52 C4 'RecorD' ****************************** prepare error number and message E60A 48 PHA save error code E60B 86 F9 STX $F9 drive number E60D 8A TXA E60E 0A ASL A times 2 E60F AA TAX as pointer E610 B5 06 LDA $06,X E612 85 80 STA $80 get track E614 B5 07 LDA $07,X E616 85 81 STA $81 and sector number E618 68 PLA get error code back E619 29 0F AND #$0F isolate bits 0-3 E61B F0 08 BEQ $E625 zero, then 24, 'read error' E61D C9 0F CMP #$0F 15? E61F D0 06 BNE $E627 E621 A9 74 LDA #$74 74, 'drive not ready' E623 D0 08 BNE $E62D 6 E625 A9 06 LDA #$06 add $20 E627 09 20 ORA #$20 E629 AA TAX E62A CA DEX E62B CA DEX subtract two E62C 8A TXA E62D 48 PHA save error number E62E AD 2A 02 LDA $022A number of the disk command E631 C9 00 CMP #$00 OPEN or VALIDATE? E633 D0 0F BNE $E644 no E635 A9 FF LDA #$FF E637 8D 2A 02 STA $022A E63A 68 PLA get error number back E63B 20 C7 E6 JSR $E6C7 generate error message E63E 20 42 D0 JSR $D042 load BAM E641 4C 48 E6 JMP $E648 set error message E644 68 PLA E645 20 C7 E6 JSR $E6C7 set error message E648 20 BD C1 JSR $C1BD erase input buffer E64B A9 00 LDA #$00 E64D 8D F9 02 STA $02F9 erase error flag E650 20 2C C1 JSR $C12C turn LED off E653 20 DA D4 JSR $D4DA close channels 17 and 18 E656 A9 00 LDA #$00 E658 85 A3 STA $A3 input buffer pointer to zero E65A A2 45 LDX #$45 E65C 9A TXS initialize stack pointer E65D A5 84 LDA $84 secondary address E65F 29 0F AND #$0F E661 85 83 STA $83 E663 C9 0F CMP #$0F 15? E665 F0 31 BEQ $E698 yes, command channel E667 78 SEI E668 A5 79 LDA $79 LISTEN active? E66A D0 1C BNE $E688 yes E66C A5 7A LDA $7A TALK active? E66E D0 10 BNE $E680 yes E670 A6 83 LDX $83 channel number E672 BD 2B 02 LDA $022B,X open channel to this secondary addr E675 C9 FF CMP #$FF E677 F0 1F BEQ $E698 no E679 29 0F AND #$0F E67B 85 82 STA $82 channel E67D 4C 8E E6 JMP $E68E ****************************** TALK E680 20 EB D0 JSR $D0EB open channel for reading E683 20 4E EA JSR $EA4E accept byte E686 D0 06 BNE $E68E ****************************** LISTEN E688 20 07 D1 JSR $D107 open channel for writing E68B 20 4E EA JSR $EA4E accept byte E68E 20 25 D1 JSR $D125 verify file type E691 C9 04 CMP #$04 file type REL? E693 B0 03 BCS $E698 yes E695 20 27 D2 JSR $D227 close channel E698 4C E7 EB JMP $EBE7 ****************************** convert hex to decimal (2 bytes) E69B AA TAX E69C A9 00 LDA #$00 E69E F8 SED E69F E0 00 CPX #$00 E6A1 F0 07 BEQ $E6AA convert hex to BCD E6A3 18 CLC E6A4 69 01 ADC #$01 E6A6 CA DEX E6A7 4C 9F E6 JMP $E69F E6AA D8 CLD ****************************** divide BCD number into two bytes E6AB AA TAX E6AC 4A LSR A E6AD 4A LSR A shift hi-nibble down E6AE 4A LSR A E6AF 4A LSR A E6B0 20 B4 E6 JSR $E6B4 convert to ASCII E6B3 8A TXA E6B4 29 0F AND #$0F erase top 4 bits E6B6 09 30 ORA #$30 add '0' E6B8 91 A5 STA ($A5),Y write in buffer E6BA C8 INY increment buffer pointer E6BB 60 RTS ****************************** write 'ok' in buffer E6BC 20 23 C1 JSR $C123 erase error flag E6BF A9 00 LDA #$00 error number 0 E6C1 A0 00 LDY #$00 E6C3 84 80 STY $80 track 0 E6C5 84 81 STY $81 sector 0 ****************************** error message in buffer E6C7 A0 00 LDY #$00 buffer pointer E6C9 A2 D5 LDX #$D5 E6CB 86 A5 STX $A5 pointer $A5/$A6 to $2D5 E6CD A2 02 LDX #$02 E6CF 86 A6 STX $A6 E6D1 20 AB E6 JSR $E6AB error number to ASCII and in buffer E6D4 A9 2C LDA #$2C ',' comma E6D6 91 A5 STA ($A5),Y write in buffer E6D8 C8 INY increment buffer pointer E6D9 AD D5 02 LDA $02D5 first digit of the disk status E6DC 8D 43 02 STA $0243 in output register E6DF 8A TXA error number in accumulator E6E0 20 06 E7 JSR $E706 error message in buffer E6E3 A9 2C LDA #$2C ',' comma E6E5 91 A5 STA ($A5),Y write in buffer E6E7 C8 INY and increment buffer pointer E6E8 A5 80 LDA $80 track number E6EA 20 9B E6 JSR $E69B to ASCII and in buffer E6ED A9 2C LDA #$2C ',' comma E6EF 91 A5 STA ($A5),Y write in buffer E6F1 C8 INY increment buffer pointer E6F2 A5 81 LDA $81 sector E6F4 20 9B E6 JSR $E69B convert to ASCII and in buffer E6F7 88 DEY E6F8 98 TYA E6F9 18 CLC E6FA 69 D5 ADC #$D5 E6FC 8D 49 02 STA $0249 end pointer E6FF E6 A5 INC $A5 E701 A9 88 LDA #$88 set READ flag E703 85 F7 STA $F7 E705 60 RTS ****************************** write error message to buffer E706 AA TAX error code to X E707 A5 86 LDA $86 E709 48 PHA preserve pointer $86/$87 E70A A5 87 LDA $87 E70C 48 PHA E70D A9 FC LDA #$FC E70F 85 86 STA $86 E711 A9 E4 LDA #$E4 start of the error messages E713 85 87 STA $87 E4FC E715 8A TXA error number in accumulator E716 A2 00 LDX #$00 E718 C1 86 CMP ($86,X) compare with error number in table E71A F0 21 BEQ $E73D E71C 48 PHA E71D 20 75 E7 JSR $E775 bit 7 into carry and erase E720 90 05 BCC $E727 not set? E722 20 75 E7 JSR $E775 bit 7 into carry E725 90 FB BCC $E722 wait for character with bit 7 set E727 A5 87 LDA $87 E729 C9 E6 CMP #$E6 E72B 90 08 BCC $E735 $E60A, check to end of table E72D D0 0A BNE $E739 E72F A9 0A LDA #$0A E731 C5 86 CMP $86 E733 90 04 BCC $E739 E735 68 PLA E736 4C 18 E7 JMP $E718 no, continue E739 68 PLA E73A 4C 4D E7 JMP $E74D done E73D 20 67 E7 JSR $E767 get a character, bit 7 in carry E740 90 FB BCC $E73D wait for character with bit 7 set E742 20 54 E7 JSR $E754 and write in buffer E745 20 67 E7 JSR $E767 get next character E748 90 F8 BCC $E742 wait for character with bit 7 set E74A 20 54 E7 JSR $E754 put character in buffer E74D 68 PLA E74E 85 87 STA $87 E750 68 PLA get pointer $86/$87 back E751 85 86 STA $86 E753 60 RTS ****************************** get character and in buffer E754 C9 20 CMP #$20 ' ' blank E756 B0 0B BCS $E763 greater, then write in buffer E758 AA TAX save code E759 A9 20 LDA #$20 blank E75B 91 A5 STA ($A5),Y write in buffer E75D C8 INY increment buffer pointer E75E 8A TXA code in accumulator E75F 20 06 E7 JSR $E706 output previous text E762 60 RTS E763 91 A5 STA ($A5),Y write character in buffer E765 C8 INY and increment pointer E766 60 RTS ****************************** get a char of the error message E767 E6 86 INC $86 E769 D0 02 BNE $E76D increment pointer E76B E6 87 INC $87 E76D A1 86 LDA ($86,X) get character E76F 0A ASL A bit 7 into carry E770 A1 86 LDA ($86,X) get character E772 29 7F AND #$7F erase bit 7 E774 60 RTS ****************************** increment pointer E775 20 6D E7 JSR $E76D bit 7 into carry E778 E6 86 INC $86 E77A D0 02 BNE $E77E increment pointer E77C E6 87 INC $87 E77E 60 RTS ****************************** E77F 60 RTS ****************************** check for AUTO-start E780 AD 00 18 LDA $1800 read IEEE port E783 AA TAX E784 29 04 AND #$04 isolate 'CLOCK IN' bit E786 F0 F7 BEQ $E77F not set, then done E788 8A TXA E789 29 01 AND #$01 isolate 'DATA IN' bit E78B F0 02 BEQ $E77F not set, then done E78D 58 CLI E78E AD 00 18 LDA $1800 load IEEE port E791 29 05 AND #$05 test 'DATA IN' and 'CLOCK IN' E793 F0 F9 BNE E78E wait until both set E795 EE 78 02 INC $0278 file name E798 EE 74 02 INC $0274 character in the input line E79B A9 2A LDA #$2A '*' as filename E79D 8D 00 02 STA $0200 write in buffer E7A0 4C A8 E7 JMP $E7A8 ****************************** '&' command E7A3 A9 8D LDA #$8D E7A5 20 68 C2 JSR $C268 check command line to end E7A8 20 58 F2 JSR $F258 (RTS) E7AB AD 78 02 LDA $0278 number of file names E7AE 48 PHA save E7AF A9 01 LDA #$01 E7B1 8D 78 02 STA $0278 file name E7B4 A9 FF LDA #$FF E7B6 85 86 STA $86 E7B8 20 4F C4 JSR $C44F find file E7BB AD 80 02 LDA $0280 E7BE D0 05 BNE $E7C5 found? E7C0 A9 39 LDA #$39 E7C2 20 C8 C1 JSR $C1C8 39, 'file not found' E7C5 68 PLA E7C6 8D 78 02 STA $0278 get number of file names back E7C9 AD 80 02 LDA $0280 E7CC 85 80 STA $80 track E7CE AD 85 02 LDA $0285 E7D1 85 81 STA $81 and sector E7D3 A9 03 LDA #$03 file type 'USR' E7D5 20 77 D4 JSR $D477 buffer allocated, read 1st block E7D8 A9 00 LDA #$00 E7DA 85 87 STA $87 erase checksum E7DC 20 39 E8 JSR $E839 get byte from file E7DF 85 88 STA $88 save as start address lo E7E1 20 4B E8 JSR $E84B from checksum E7E4 20 39 E8 JSR $E839 get byte from file E7E7 85 89 STA $89 as start address hi E7E9 20 4B E8 JSR $E84B form checksum E7EC A5 86 LDA $86 E7EE F0 0A BEQ $E7FA E7F0 A5 88 LDA $88 E7F2 48 PHA save program start address E7F3 A5 89 LDA $89 E7F5 48 PHA E7F6 A9 00 LDA #$00 E7F8 85 86 STA $86 E7FA 20 39 E8 JSR $E839 get byte from file E7FD 85 8A STA $8A save as counter E7FF 20 4B E8 JSR $E84B form checksum E802 20 39 E8 JSR $E839 get byte from file E805 A0 00 LDY #$00 E807 91 88 STA ($88),Y save as program bytes E809 20 4B E8 JSR $E84B form checksum E80C A5 88 LDA $88 E80E 18 CLC E80F 69 01 ADC #$01 E811 85 88 STA $88 increment $88/$89 E813 90 02 BCC $E817 E815 E6 89 INC $89 E817 C6 8A DEC $8A decrement pointer E819 D0 E7 BNE $E802 E81B 20 35 CA JSR $CA35 get next byte E81E A5 85 LDA $85 data byte E820 C5 87 CMP $87 equal to checksum? E822 F0 08 BEQ $E82C yes E824 20 3E DE JSR $DE3E transmit parameter to disk controller E827 A9 50 LDA #$50 E829 20 45 E6 JSR $E645 50, 'record not present' E82C A5 F8 LDA $F8 end? E82E D0 A8 BNE $E7D8 no, next data block E830 68 PLA E831 85 89 STA $89 E833 68 PLA get program start address back E834 85 88 STA $88 E836 6C 88 00 JMP ($0088) and execute program E839 20 35 CA JSR $CA35 get byte from file E83C A5 F8 LDA $F8 end? E83E D0 08 BNE $E848 no E840 20 3E DE JSR $DE3E transmit parameter to disk controller E843 A9 51 LDA #$51 E845 20 45 E6 JSR $E645 51, 'overflow in record' E848 A5 85 LDA $85 data byte E84A 60 RTS ****************************** generate checksum E84B 18 CLC E84C 65 87 ADC $87 E84E 69 00 ADC #$00 E850 85 87 STA $87 E852 60 RTS ****************************** IRQ routine for serial bus E853 AD 01 18 LDA $1801 read port A, erase IRQ flag E856 A9 01 LDA #$01 E858 85 7C STA $7C set flag for 'ATN received' E85A 60 RTS ****************************** servicing the serial bus E85B 78 SEI E85C A9 00 LDA #$00 E85E 85 7C STA $7C erase flag for 'ATN received' E860 85 79 STA $79 erase flag for LISTEN E862 85 7A STA $7A erase flag for TALK E864 A2 45 LDX #$45 E866 9A TXS initialize stack pointer E867 A9 80 LDA #$80 E869 85 F8 STA $F8 erase end flag E86B 85 7D STA $7D erase EOI flag E86D 20 B7 E9 JSR $E9B7 CLOCK OUT lo E870 20 A5 E9 JSR $E9A5 DATA OUT, bit '0', hi E873 AD 00 18 LDA $1800 E876 09 10 ORA #$10 switch data lines to input E878 8D 00 18 STA $1800 E87B AD 00 18 LDA $1800 read IEEE port E87E 10 57 BPL $E8D7 EOI? E880 29 04 AND #$04 CLOCK IN? E882 D0 F7 BNE $E87B no E884 20 C9 E9 JSR $E9C9 get byte from bus E887 C9 3F CMP #$3F unlisten? E889 D0 06 BNE $E891 no E88B A9 00 LDA #$00 E88D 85 79 STA $79 reset flag for LISTEN E88F F0 71 BEQ $E902 E891 C9 5F CMP #$5F untalk? E893 D0 06 BNE $E89B no E895 A9 00 LDA #$00 E897 85 7A STA $7A reset flag for TALK E899 F0 67 BEQ $E902 E89B C5 78 CMP $78 TALK address? E89D D0 0A BNE $E8A9 no E89F A9 01 LDA #$01 E8A1 85 7A STA $7A set flag for TALK E8A3 A9 00 LDA #$00 E8A5 85 79 STA $79 reset flag for LISTEN E8A7 F0 29 BEQ $E8D2 E8A9 C5 77 CMP $77 LISTEN address? E8AB D0 0A BNE $E8B7 no E8AD A9 01 LDA #$01 E8AF 85 79 STA $79 set flag for LISTEN E8B1 A9 00 LDA #$00 E8B3 85 7A STA $7A reset flag for TALK E8B5 F0 1B BEQ $E8D2 E8B7 AA TAX E8B8 29 60 AND #$60 E8BA C9 60 CMP #$60 set bit 5 and 6 E8BC D0 3F BNE $E8FD no E8BE 8A TXA E8BF 85 84 STA $84 byte is secondary address E8C1 29 0F AND #$0F E8C3 85 83 STA $83 channel number E8C5 A5 84 LDA $84 E8C7 29 F0 AND #$F0 E8C9 C9 E0 CMP #$E0 CLOSE? E8CB D0 35 BNE $E902 E8CD 58 CLI E8CE 20 C0 DA JSR $DAC0 CLOSE routine E8D1 78 SEI E8D2 2C 00 18 BIT $1800 E8D5 30 AD BMI $E884 E8D7 A9 00 LDA #$00 E8D9 85 7D STA $7D set EOI E8DB AD 00 18 LDA $1800 IEEE port E8DE 29 EF AND #$EF switch data lines to output E8E0 8D 00 18 STA $1800 E8E3 A5 79 LDA $79 LISTEN active? E8E5 F0 06 BEQ $E8ED no E8E7 20 2E EA JSR $EA2E receive data E8EA 4C E7 EB JMP $EBE7 to delay loop E8ED A5 7A LDA $7A TALK active? E8EF F0 09 BEQ $E8FA no E8F1 20 9C E9 JSR $E99C DATA OUT, bit '1', lo E8F4 20 AE E9 JSR $E9AE CLOCK OUT hi E8F7 20 09 E9 JSR $E909 send data E8FA 4C 4E EA JMP $EA4E to delay loop E8FD A9 10 LDA #$10 either TALK or LISTEN, ignore byte E8FF 8D 00 18 STA $1800 switch data lines to input E902 2C 00 18 BIT $1800 E905 10 D0 BPL $E8D7 E907 30 F9 BMI $E902 wait for handshake ****************************** send data E909 78 SEI E90A 20 EB D0 JSR $D0EB open channel for read E90D B0 06 BCS $E915 channel active E90F A6 82 LDX $82 channel number E911 B5 F2 LDA $F2,X set READ flag? E913 30 01 BMI $E916 yes E915 60 RTS E916 20 59 EA JSR $EA59 check EOI E919 20 C0 E9 JSR $E9C0 read IEEE port E91C 29 01 AND #$01 isolate data bit E91E 08 PHP and save E91F 20 B7 E9 JSR $E9B7 CLOCK OUT lo E922 28 PLP E923 F0 12 BEQ $E937 E925 20 59 EA JSR $EA59 check EOI E928 20 C0 E9 JSR $E9C0 read IEEE port E92B 29 01 AND #$01 isolate data bit E92D D0 F6 BNE $E925 E92F A6 82 LDX $82 channel number E931 B5 F2 LDA $F2,X E933 29 08 AND #$08 E935 D0 14 BNE $E94B E937 20 59 EA JSR $EA59 check EOI E93A 20 C0 E9 JSR $E9C0 read IEEE port E93D 29 01 AND #$01 isolate data bit E93F D0 F6 BNE $E937 E941 20 59 EA JSR $EA59 check EOI E944 20 C0 E9 JSR $E9C0 read IEEE port E947 29 01 AND #$01 isolate data bit E949 F0 F6 BEQ $E941 E94B 20 AE E9 JSR $E9AE CLOCK OUT hi E94E 20 59 EA JSR $EA59 check EOI E951 20 C0 E9 JSR $E9C0 read IEEE port E954 29 01 AND #$01 isolate data bit E956 D0 F3 BNE $E94B E958 A9 08 LDA #$08 counter to 8 bits for serial E95A 85 98 STA $98 transmission E95C 20 C0 E9 JSR $E9C0 read IEEE port E95F 29 01 AND #$01 isolate data bit E961 D0 36 BNE $E999 E963 A6 82 LDX $82 E965 BD 3E 02 LDA $023E,X E968 6A ROR lowest data bit in carry E969 9D 3E 02 STA $023E,X E96C B0 05 BCS $E973 set bit E96E 20 A5 E9 JSR $E9A5 DATA OUT, output bit '0' E971 D0 03 BNE $E976 absolute jump E973 20 9C E9 JSR $E99C DATA OUT, output bit '1' E976 20 B7 E9 JSR $E9B7 set CLOCK OUT E979 A5 23 LDA $23 E97B D0 03 BNE $E980 E97D 20 F3 FE JSR $FEF3 delay for serial bus E980 20 FB FE JSR $FEFB set DATA OUT and CLOCK OUT E983 C6 98 DEC $98 all bits output? E985 D0 D5 BNE $E95C no E987 20 59 EA JSR $EA59 check EOI E98A 20 C0 E9 JSR $E9C0 read IEEE port E98D 29 01 AND #$01 isolate data bit E98F F0 F6 BEQ $E987 E991 58 CLI E992 20 AA D3 JSR $D3AA get next data byte E995 78 SEI E996 4C 0F E9 JMP $E90F and output E999 4C 4E EA JMP $EA4E to delay loop ****************************** DATA OUT lo E99C AD 00 18 LDA $1800 E99F 29 FD AND #$FD output bit '1' E9A1 8D 00 18 STA $1800 E9A4 60 RTS ****************************** DATA OUT hi E9A5 AD 00 18 LDA $1800 E9A8 09 02 ORA #$02 output bit '0' E9AA 8D 00 18 STA $1800 E9AD 60 RTS ****************************** CLOCK OUT hi E9AE AD 00 18 LDA $1800 E9B1 09 08 ORA #$08 set bit 3 E9B3 8D 00 18 STA $1800 E9B6 60 RTS ****************************** CLOCK OUT lo E9B7 AD 00 18 LDA $1800 E9BA 29 F7 AND #$F7 erase bit 3 E9BC 8D 00 18 STA $1800 E9BF 60 RTS ****************************** read IEEE port E9C0 AD 00 18 LDA $1800 read port E9C3 CD 00 18 CMP $1800 wait for constants E9C6 D0 F8 BNE $E9C0 E9C8 60 RTS E9C9 A9 08 LDA #$08 E9CB 85 98 STA $98 bit counter for serial output E9CD 20 59 EA JSR $EA59 check EOI E9D0 20 C0 E9 JSR $E9C0 read IEEE port E9D3 29 04 AND #$04 CLOCK IN? E9D5 D0 F6 BNE $E9CD no, wait E9D7 20 9C E9 JSR $E99C DATA OUT, bit '1' E9DA A9 01 LDA #$01 E9DC 8D 05 18 STA $1805 set timer E9DF 20 59 EA JSR $EA59 check EOI E9E2 AD 0D 18 LDA $180D E9E5 29 40 AND #$40 timer run down? E9E7 D0 09 BNE $E9F2 yes, EOI E9E9 20 C0 E9 JSR $E9C0 read IEEE port E9EC 29 04 AND #$04 CLOCK IN? E9EE F0 EF BEQ $E9DF no, wait E9F0 D0 19 BNE $EA0B E9F2 20 A5 E9 JSR $E9A5 DATA OUT bit '0' hi E9F5 A2 0A LDX #$0A 10 E9F7 CA DEX delay loop, approx 50 micro sec. E9F8 D0 FD BNE $E9F7 E9FA 20 9C E9 JSR $E99C DATA OUT, bit '1', lo E9FD 20 59 EA JSR $EA59 check EOI EA00 20 C0 E9 JSR $E9C0 read IEEE EA03 29 04 AND #$04 CLOCK IN? EA05 F0 F6 BEQ $E9FD no, wait EA07 A9 00 LDA #$00 EA09 85 F8 STA $F8 set EOI flag EA0B AD 00 18 LDA $1800 IEEE port EA0E 49 01 EOR #$01 invert data byte EA10 4A LSR A EA11 29 02 AND #$02 EA13 D0 F6 BNE $EA0B CLOCK IN? EA15 EA NOP EA16 EA NOP EA17 EA NOP EA18 66 85 ROR $85 prepare next bit EA1A 20 59 EA JSR $EA59 check EOI EA1D 20 C0 E9 JSR $E9C0 read IEEE port EA20 29 04 AND #$04 CLOCK IN? EA22 F0 F6 BEQ $EA1A no EA24 C6 98 DEC $98 decrement bit counter EA26 D0 E3 BNE $EA0B all bits output? EA28 20 A5 E9 JSR $E9A5 DATA OUT, bit '0', hi EA2B A5 85 LDA $85 load data byte again EA2D 60 RTS ****************************** accept data from serial bus EA2E 78 SEI EA2F 20 07 D1 JSR $D107 open channel for writing EA32 B0 05 BCS $EA39 channel not active? EA34 B5 F2 LDA $F2,X WRITE flag EA36 6A ROR EA37 B0 0B BCS $EA44 not set? EA39 A5 84 LDA $84 secondary address EA3B 29 F0 AND #$F0 EA3D C9 F0 CMP #$F0 OPEN command? EA3F F0 03 BEQ $EA44 yes EA41 4C 4E EA JMP $EA4E to wait loop EA44 20 C9 E9 JSR $E9C9 get data byte from bus EA47 58 CLI EA48 20 B7 CF JSR $CFB7 and write in buffer EA4B 4C 2E EA JMP $EA2E to loop beginning EA4E A9 00 LDA #$00 EA50 8D 00 18 STA $1800 reset IEEE port EA53 4C E7 EB JMP $EBE7 to wait loop EA56 4C 5B E8 JMP $E85B to serial bus main loop ****************************** EA59 A5 7D LDA $7D EOI received? EA5B F0 06 BEQ $EA63 yes EA5D AD 00 18 LDA $1800 IEEE port EA60 10 09 BPL $EA6B EA62 60 RTS EA63 AD 00 18 LDA $1800 IEEE port EA66 10 FA BPL $EA62 EA68 4C 5B E8 JMP $E85B to serial bus main loop EA6B 4C D7 E8 JMP $E8D7 set EOI, serial bus ****************************** blink LED for hardware defects EA6E A2 00 LDX #$00 blink once, zero page EA70 2C .BYTE $2C EA71 A6 6F LDX $6F blink X+1 times for RAM/ROM err EA73 9A TXS EA74 BA TSX EA75 A9 08 LDA #$08 select LED bit in the port EA77 0D 00 1C ORA $1C00 EA7A 4C EA FE JMP $FEEA turn LED on, back to $EA7D EA7D 98 TYA EA7E 18 CLC EA7F 69 01 ADC #$01 EA81 D0 FC BNE $EA7F EA83 88 DEY EA84 D0 F8 BNE $EA7E EA86 AD 00 1C LDA $1C00 EA89 29 F7 AND #$F7 turn LED off EA8B 8D 00 1C STA $1C00 EA8E 98 TYA EA8F 18 CLC EA90 69 01 ADC #$01 EA92 D0 FC BNE $EA90 delay loop EA94 88 DEY EA95 D0 F8 BNE $EA8F EA97 CA DEX EA98 10 DB BPL $EA75 EA9A E0 FC CPX #$FC EA9C D0 F0 BNE $EA8E wait for delay EA9E F0 D4 BEQ $EA74 ****************************** RESET routine EAA0 78 SEI EAA1 D8 CLD EAA2 A2 FF LDX #$FF EAA4 8E 03 18 STX $1803 port A to output EAA7 E8 INX EAA8 A0 00 LDY #$00 EAAA A2 00 LDX #$00 EAAC 8A TXA EAAD 95 00 STA $00,X erase zero page EAAF E8 INX EAB0 D0 FA BNE $EAAC EAB2 8A TXA EAB3 D5 00 CMP $00,X is byte erased? EAB5 D0 B7 BNE $EA6E no, then to error display (blink) EAB7 F6 00 INC $00,X EAB9 C8 INY EABA D0 FB BNE $EAB7 EABC D5 00 CMP $00,X EABE D0 AE BNE $EA6E error EAC0 94 00 STY $00,X EAC2 B5 00 LDA $00,X EAC4 D0 A8 BNE $EA6E error EAC6 E8 INX EAC7 D0 E9 BNE $EAB2 EAC9 E6 6F INC $6F EACB 86 76 STX $76 EACD A9 00 LDA #$00 EACF 85 75 STA $75 EAD1 A8 TAY EAD2 A2 20 LDX #$20 test 32 pages EAD4 18 CLC EAD5 C6 76 DEC $76 EAD7 71 75 ADC ($75),Y EAD9 C8 INY EADA D0 FB BNE $EAD7 EADC CA DEX EADD D0 F6 BNE $EAD5 test ROM EADF 69 00 ADC #$00 EAE1 AA TAX EAE2 C5 76 CMP $76 EAE4 D0 39 BNE $EB1F ROM error EAE6 E0 C0 CPX #$C0 EAE8 D0 DF BNE $EAC9 EAEA A9 01 LDA #$01 EAEC 85 76 STA $76 EAEE E6 6F INC $6F EAF0 A2 07 LDX #$07 test RAM, beginning at page 7 EAF2 98 TYA EAF3 18 CLC EAF4 65 76 ADC $76 EAF6 91 75 STA ($75),Y EAF8 C8 INY EAF9 D0 F7 BNE $EAF2 EAFB E6 76 INC $76 EAFD CA DEX EAFE D0 F2 BNE $EAF2 EB00 A2 07 LDX #$07 EB02 C6 76 DEC $76 EB04 88 DEY EB05 98 TYA EB06 18 CLC EB07 65 76 ADC $76 EB09 D1 75 CMP ($75),Y EB0B D0 12 BNE $EB1F RAM error EB0D 49 FF EOR #$FF EB0F 91 75 STA ($75),Y EB11 51 75 EOR ($75),Y EB13 91 75 STA ($75),Y EB15 D0 08 BNE $EB1F RAM error EB17 98 TYA EB18 D0 EA BNE $EB04 EB1A CA DEX EB1B D0 E5 BNE $EB02 continue test EB1D F0 03 BEQ $EB22 ok EB1F 4C 71 EA JMP $EA71 to error display EB22 A2 45 LDX #$45 EB24 9A TXS initialize stack pointer EB25 AD 00 1C LDA $1C00 EB28 29 F7 AND #$F7 turn LED off EB2A 8D 00 1C STA $1C00 EB2D A9 01 LDA #$01 EB2F 8D 0C 18 STA $180C CA1 (ATN IN) trigger on positive edge EB32 A9 82 LDA #$82 EB34 8D 0D 18 STA $180D interrupt possible through ATN IN EB37 8D 0E 18 STA $180E EB3A AD 00 18 LDA $1800 read port B EB3D 29 60 AND #$60 isolate bits 5 & 6 (device number) EB3F 0A ASL A EB40 2A ROL A EB41 2A ROL A rotate to bit positions 0 & 1 EB42 2A ROL A EB43 09 48 ORA #$48 add offset from 8 + $40 for TALK EB45 85 78 STA $78 device number for TALK (send) EB47 49 60 EOR #$60 erase bit 6, set bit 5 EB49 85 77 STA $77 device number + $20 for LISTEN EB4B A2 00 LDX #$00 EB4D A0 00 LDY #$00 EB4F A9 00 LDA #$00 EB51 95 99 STA $99,X low-byte of buffer address EB53 E8 INX EB54 B9 E0 FE LDA $FEE0,Y high-byte of address from table EB57 95 99 STA $99,X save EB59 E8 INX EB5A C8 INY EB5B C0 05 CPY #$05 EB5D D0 F0 BNE $EB4F EB5F A9 00 LDA #$00 EB61 95 99 STA $99,X EB63 E8 INX pointer $A3/$A4 to $200, input buffer EB64 A9 02 LDA #$02 EB66 95 99 STA $99,X EB68 E8 INX EB69 A9 D5 LDA #$D5 EB6B 95 99 STA $99,X EB6D E8 INX pointer $A5/$A6 to $2D5, error EB6E A9 02 LDA #$02 message pointer EB70 95 99 STA $99,X EB72 A9 FF LDA #$FF EB74 A2 12 LDX #$12 EB76 9D 2B 02 STA $022B,X fill channel table with $FF EB79 CA DEX EB7A 10 FA BPL $EB76 EB7C A2 05 LDX #$05 EB7E 95 A7 STA $A7,X erase buffer table EB80 95 AE STA $AE,X EB82 95 CD STA $CD,X erase side-sector table EB84 CA DEX EB85 10 F7 BPL $EB7E EB87 A9 05 LDA #$05 buffer 5 EB89 85 AB STA $AB associate with channel 4 EB8B A9 06 LDA #$06 buffer 4 EB8D 85 AC STA $AC associate with channel 5 EB8F A9 FF LDA #$FF EB91 85 AD STA $AD EB93 85 B4 STA $B4 EB95 A9 05 LDA #$05 EB97 8D 3B 02 STA $023B channel 5 WRITE flag erased EB9A A9 84 LDA #$84 EB9C 8D 3A 02 STA $023A channel 4 WRITE flag set EB9F A9 0F LDA #$0F initialize channel allocation register EBA1 8D 56 02 STA $0256 bit '1' equals channel free EBA4 A9 01 LDA #$01 EBA6 85 F6 STA $F6 WRITE flag EBA8 A9 88 LDA #$88 EBAA 85 F7 STA $F7 READ flag EBAC A9 E0 LDA #$E0 5 buffers free EBAE 8D 4F 02 STA $024F initialize buffer allocation register EBB1 A9 FF LDA #$FF $24F/$250, 16 bit EBB3 8D 50 02 STA $0250 EBB6 A9 01 LDA #$01 EBB8 85 1C STA $1C flag for WRITE protect EBBA 85 1D STA $1D EBBC 20 63 CB JSR $CB63 set vector for U0 EBBF 20 FA CE JSR $CEFA initialize channel table EBC2 20 59 F2 JSR $F259 initialization for disk controller EBC5 A9 22 LDA #$22 EBC7 85 65 STA $65 EBC9 A9 EB LDA #$EB pointer $65/$66 to $EB22 EBCB 85 66 STA $66 EBCD A9 0A LDA #$0A EBCF 85 69 STA $69 step width 10 EBD1 A9 05 LDA #$05 for sector assignment EBD3 85 6A STA $6A 5 read attempts EBD5 A9 73 LDA #$73 prepare power-up message EBD7 20 C1 E6 JSR $E6C1 73, 'cbm dos v2.6 1541' EBDA A9 1A LDA #$1A bit 1, 3 & 4 to output EBDC 8D 02 18 STA $1802 data direction of port B EBDF A9 00 LDA #$00 EBE1 8D 00 18 STA $1800 erase data register EBE4 20 80 E7 JSR $E780 check for auto-start EBE7 58 CLI EBE8 AD 00 18 LDA $1800 EBEB 29 E5 AND #$E5 reset serial port EBED 8D 00 18 STA $1800 EBF0 AD 55 02 LDA $0255 command flag set? EBF3 F0 0A BEQ $EBFF no EBF5 A9 00 LDA #$00 EBF7 8D 55 02 STA $0255 reset command flag EBFA 85 67 STA $67 EBFC 20 46 C1 JSR $C146 analyze and execute command ****************************** wait loop EBFF 58 CLI EC00 A5 7C LDA $7C ATN signal discovered? EC02 F0 03 BEQ $EC07 no EC04 4C 5B E8 JMP $E85B to IEEE routine EC07 58 CLI EC08 A9 0E LDA #$0E 14 EC0A 85 72 STA $72 as secondary address EC0C A9 00 LDA #$00 EC0E 85 6F STA $6F job counter EC10 85 70 STA $70 EC12 A6 72 LDX $72 EC14 BD 2B 02 LDA $022B,X secondary address EC17 C9 FF CMP #$FF channel associated? EC19 F0 10 BEQ $EC2B no EC1B 29 3F AND #$3F EC1D 85 82 STA $82 channel number EC1F 20 93 DF JSR $DF93 get buffer number EC22 AA TAX EC23 BD 5B 02 LDA $025B,X drive number EC26 29 01 AND #$01 EC28 AA TAX EC29 F6 6F INC $6F,X increment job counter EC2B C6 72 DEC $72 lo address EC2D 10 E3 BPL $EC12 continue search EC2F A0 04 LDY #$04 buffer counter EC31 B9 00 00 LDA $0000,Y disk controller in action? EC34 10 05 BPL $EC3B no EC36 29 01 AND #$01 isolate drive number EC38 AA TAX EC39 F6 6F INC $6F,X increment job counter EC3B 88 DEY EC3C 10 F3 BPL $EC31 next buffer EC3E 78 SEI EC3F AD 00 1C LDA $1C00 EC42 29 F7 AND #$F7 erase LED bit EC44 48 PHA EC45 A5 7F LDA $7F drive number EC47 85 86 STA $86 EC49 A9 00 LDA #$00 EC4B 85 7F STA $7F drive 0 EC4D A5 6F LDA $6F job for drive 0? EC4F F0 0B BEQ $EC5C no EC51 A5 1C LDA $1C write protect for drive 0? EC53 F0 03 BEQ $EC58 no EC55 20 13 D3 JSR $D313 close all channels to drive 0 EC58 68 PLA EC59 09 08 ORA #$08 set LED bit EC5B 48 PHA EC5C E6 7F INC $7F increment drive number EC5E A5 70 LDA $70 job for drive 1? EC60 F0 0B BEQ $EC6D no EC62 A5 1D LDA $1D write protect for drive 1? EC64 F0 03 BEQ $EC69 no EC66 20 13 D3 JSR $D313 close all channels to drive 1 EC69 68 PLA EC6A 09 00 ORA #$00 EC6C 48 PHA EC6D A5 86 LDA $86 EC6F 85 7F STA $7F get drive number back EC71 68 PLA bit for LED EC72 AE 6C 02 LDX $026C interrupt counter EC75 F0 21 BEQ $EC98 to zero? EC77 AD 00 1C LDA $1C00 EC7A E0 80 CPX #$80 EC7C D0 03 BNE $EC81 EC7E 4C 8B EC JMP $EC8B EC81 AE 05 18 LDX $1805 erase timer interrupt EC84 30 12 BMI $EC98 EC86 A2 A0 LDX #$A0 EC88 8E 05 18 STX $1805 set timer EC8B CE 6C 02 DEC $026C decrement counter EC8E D0 08 BNE $EC98 not yet zero? EC90 4D 6D 02 EOR $026D EC93 A2 10 LDX #$10 EC95 8E 6C 02 STX $026C reset counter EC98 8D 00 1C STA $1C00 turn LED on/off EC9B 4C FF EB JMP $EBFF back to wait loop ****************************** LOAD "$" EC9E A9 00 LDA #$00 ECA0 85 83 STA $83 secondary address 0 ECA2 A9 01 LDA #$01 ECA4 20 E2 D1 JSR $D1E2 find channel and buffer ECA7 A9 00 LDA #$00 ECA9 20 C8 D4 JSR $D4C8 initialize buffer pointer ECAC A6 82 LDX $82 channel number ECAE A9 00 LDA #$00 ECB0 9D 44 02 STA $0244,X pointer to end = zero ECB3 20 93 DF JSR $DF93 get buffer number ECB6 AA TAX ECB7 A5 7F LDA $7F drive number ECB9 9D 5B 02 STA $025B,X bring in table ECBC A9 01 LDA #$01 1 ECBE 20 F1 CF JSR $CFF1 write in buffer ECC1 A9 04 LDA #$04 4, start address $0401 ECC3 20 F1 CF JSR $CFF1 write in buffer ECC6 A9 01 LDA #$01 2 times 1 ECC8 20 F1 CF JSR $CFF1 ECCB 20 F1 CF JSR $CFF1 write in buffer as link address ECCE AD 72 02 LDA $0272 drive number ECD1 20 F1 CF JSR $CFF1 write in buffer as line number ECD4 A9 00 LDA #$00 line number hi ECD6 20 F1 CF JSR $CFF1 in buffer ECD9 20 59 ED JSR $ED59 directory entry in buffer ECDC 20 93 DF JSR $DF93 get buffer number ECDF 0A ASL A ECE0 AA TAX ECE1 D6 99 DEC $99,X decrement buffer pointer ECE3 D6 99 DEC $99,X ECE5 A9 00 LDA #$00 ECE7 20 F1 CF JSR $CFF1 0 as line end in buffer ECEA A9 01 LDA #$01 ECEC 20 F1 CF JSR $CFF1 2 times 1 as link address ECEF 20 F1 CF JSR $CFF1 ECF2 20 CE C6 JSR $C6CE directory entry in buffer ECF5 90 2C BCC $ED23 another entry? ECF7 AD 72 02 LDA $0272 block number lo ECFA 20 F1 CF JSR $CFF1 in buffer ECFD AD 73 02 LDA $0273 block number hi ED00 20 F1 CF JSR $CFF1 in buffer ED03 20 59 ED JSR $ED59 directory entry in buffer ED06 A9 00 LDA #$00 ED08 20 F1 CF JSR $CFF1 zero as end marker in buffer ED0B D0 DD BNE $ECEA buffer full? no ED0D 20 93 DF JSR $DF93 get buffer number ED10 0A ASL A ED11 AA TAX ED12 A9 00 LDA #$00 ED14 95 99 STA $99,X buffer pointer to zero ED16 A9 88 LDA #$88 set READ flag ED18 A4 82 LDY $82 channel number ED1A 8D 54 02 STA $0254 ED1D 99 F2 00 STA $00F2,Y flag for channel ED20 A5 85 LDA $85 data byte ED22 60 RTS ****************************** ED23 AD 72 02 LDA $0272 block number lo ED26 20 F1 CF JSR $CFF1 write in buffer ED29 AD 73 02 LDA $0273 block number hi ED2C 20 F1 CF JSR $CFF1 in buffer ED2F 20 59 ED JSR $ED59 'blocks free.' in buffer ED32 20 93 DF JSR $DF93 get buffer number ED35 0A ASL A ED36 AA TAX ED37 D6 99 DEC $99,X ED39 D6 99 DEC $99,X buffer pointer minus 2 ED3B A9 00 LDA #$00 ED3D 20 F1 CF JSR $CFF1 ED40 20 F1 CF JSR $CFF1 three zeroes as program end ED43 20 F1 CF JSR $CFF1 ED46 20 93 DF JSR $DF93 get buffer number ED49 0A ASL A times 2 ED4A A8 TAY ED4B B9 99 00 LDA $0099,Y buffer pointer ED4E A6 82 LDX $82 ED50 9D 44 02 STA $0244,X as end marker ED53 DE 44 02 DEC $0244,X ED56 4C 0D ED JMP $ED0D ****************************** transmit directory line ED59 A0 00 LDY #$00 ED5B B9 B1 02 LDA $02B1,Y character from buffer ED5E 20 F1 CF JSR $CFF1 write in output buffer ED61 C8 INY ED62 C0 1B CPY #$1B 27 characters? ED64 D0 F5 BNE $ED5B ED66 60 RTS ****************************** get byte from buffer ED67 20 37 D1 JSR $D137 get byte ED6A F0 01 BEQ $ED6D buffer pointer zero? ED6C 60 RTS ED6D 85 85 STA $85 save data byte ED6F A4 82 LDY $82 channel number ED71 B9 44 02 LDA $0244,Y set end marker ED74 F0 08 BEQ $ED7E zero (LOAD $)? ED76 A9 80 LDA #$80 ED78 99 F2 00 STA $00F2,Y set READ flag ED7B A5 85 LDA $85 data byte ED7D 60 RTS ED7E 48 PHA ED7F 20 EA EC JSR $ECEA create directory line in buffer ED82 68 PLA ED83 60 RTS ****************************** V command, 'collect' ED84 20 D1 C1 JSR $C1D1 find drive number in input line ED87 20 42 D0 JSR $D042 load BAM ED8A A9 40 LDA #$40 ED8C 8D F9 02 STA $02F9 ED8F 20 B7 EE JSR $EEB7 create new BAM in buffer ED92 A9 00 LDA #$00 ED94 8D 92 02 STA $0292 ED97 20 AC C5 JSR $C5AC load directory, find 1st flag ED9A D0 3D BNE $EDD9 found? ED9C A9 00 LDA #$00 ED9E 85 81 STA $81 sector 0 EDA0 AD 85 FE LDA $FE85 18 EDA3 85 80 STA $80 track 18 for BAM EDA5 20 E5 ED JSR $EDE5 mark directory blocks as allocated EDA8 A9 00 LDA #$00 EDAA 8D F9 02 STA $02F9 EDAD 20 FF EE JSR $EEFF write BAM back to disk EDB0 4C 94 C1 JMP $C194 done, prepare disk status ****************************** EDB3 C8 INY EDB4 B1 94 LDA ($94),Y save track EDB6 48 PHA EDB7 C8 INY EDB8 B1 94 LDA ($94),Y and sector EDBA 48 PHA EDBB A0 13 LDY #$13 pointer to side-sector block EDBD B1 94 LDA ($94),Y EDBF F0 0A BEQ $EDCB no track following? EDC1 85 80 STA $80 track and EDC3 C8 INY EDC4 B1 94 LDA ($94),Y EDC6 85 81 STA $81 sector of 1st side-sector block EDC8 20 E5 ED JSR $EDE5 mark side-sector block as EDCB 68 PLA allocated EDCC 85 81 STA $81 EDCE 68 PLA get track and sector back EDCF 85 80 STA $80 EDD1 20 E5 ED JSR $EDE5 mark blocks of file as allocated EDD4 20 04 C6 JSR $C604 read next entry in directory EDD7 F0 C3 BEQ $ED9C end of directory? EDD9 A0 00 LDY #$00 EDDB B1 94 LDA ($94),Y file type EDDD 30 D4 BMI $EDB3 bit 7 set, file closed? EDDF 20 B6 C8 JSR $C8B6 file type to zero and write BAM EDE2 4C D4 ED JMP $EDD4 ****************************** allocate file blocks in BAM EDE5 20 5F D5 JSR $D55F check track and sector number EDE8 20 90 EF JSR $EF90 allocate block in BAM EDEB 20 75 D4 JSR $D475 read next block EDEE A9 00 LDA #$00 EDF0 20 C8 D4 JSR $D4C8 buffer pointer zero EDF3 20 37 D1 JSR $D137 get byte from buffer EDF6 85 80 STA $80 track EDF8 20 37 D1 JSR $D137 get byte from buffer EDFB 85 81 STA $81 sector EDFD A5 80 LDA $80 another block? EDFF D0 03 BNE $EE04 yes EE01 4C 27 D2 JMP $D227 close channel EE04 20 90 EF JSR $EF90 allocate block in BAM EE07 20 4D D4 JSR $D44D read next block EE0A 4C EE ED JMP $EDEE continue ****************************** N command, 'header' EE0D 20 12 C3 JSR $C312 get drive number EE10 A5 E2 LDA $E2 drive number EE12 10 05 BPL $EE19 not clear? EE14 A9 33 LDA #$33 EE16 4C C8 C1 JMP $C1C8 33, 'syntax error' EE19 29 01 AND #$01 EE1B 85 7F STA $7F drive number EE1D 20 00 C1 JSR $C100 turn LED on EE20 A5 7F LDA $7F drive number EE22 0A ASL A times 2 EE23 AA TAX EE24 AC 7B 02 LDY $027B comma position EE27 CC 74 02 CPY $0274 compare with end name EE2A F0 1A BEQ $EE46 format without ID EE2C B9 00 02 LDA $0200,Y first character of ID EE2F 95 12 STA $12,X save EE31 B9 01 02 LDA $0201,Y second character EE34 95 13 STA $13,X EE36 20 07 D3 JSR $D307 close all channels EE39 A9 01 LDA #$01 EE3B 85 80 STA $80 track 1 EE3D 20 C6 C8 JSR $C8C6 format disk EE40 20 05 F0 JSR $F005 erase buffer EE43 4C 56 EE JMP $EE56 continue as below EE46 20 42 D0 JSR $D042 load BAM EE49 A6 7F LDX $7F drive number EE4B BD 01 01 LDA $0101,X EE4E CD D5 FE CMP $FED5 'A', marker for 1541 format EE51 F0 03 BEQ $EE56 ok EE53 4C 72 D5 JMP $D572 73, 'cbm dos v2.6 1541' EE56 20 B7 EE JSR $EEB7 create BAM EE59 A5 F9 LDA $F9 buffer number EE5B A8 TAY EE5C 0A ASL A EE5D AA TAX EE5E AD 88 FE LDA $FE88 $90, start of disk name EE61 95 99 STA $99,X buffer pointer to name EE63 AE 7A 02 LDX $027A EE66 A9 1B LDA #$1B 27 EE68 20 6E C6 JSR $C66E write filenames in buffer EE6B A0 12 LDY #$12 position 18 EE6D A6 7F LDX $7F drive number EE6F AD D5 FE LDA $FED5 'A', 1541 format EE72 9D 01 01 STA $0101,X EE75 8A TXA EE76 0A ASL A times 2 EE77 AA TAX EE78 B5 12 LDA $12,X ID, first character EE7A 91 94 STA ($94),Y in buffer EE7C C8 INY EE7D B5 13 LDA $13,X and second character EE7F 91 94 STA ($94),Y in buffer EE81 C8 INY EE82 C8 INY EE83 A9 32 LDA #$32 '2' EE85 91 94 STA ($94),Y in buffer EE87 C8 INY EE88 AD D5 FE LDA $FED5 'A' 1541 format EE8B 91 94 STA ($94),Y in buffer EE8D A0 02 LDY #$02 EE8F 91 6D STA ($6D),Y and at position 2 EE91 AD 85 FE LDA $FE85 18 EE94 85 80 STA $80 track number EE96 20 93 EF JSR $EF93 mark block as allocated EE99 A9 01 LDA #$01 1 EE9B 85 81 STA $81 sector number EE9D 20 93 EF JSR $EF93 mark block as allocated EEA0 20 FF EE JSR $EEFF write BAM EEA3 20 05 F0 JSR $F005 pointer $6D/$6E to buffer, erase buffer EEA6 A0 01 LDY #$01 EEA8 A9 FF LDA #$FF EEAA 91 6D STA ($6D),Y track following is zero EEAC 20 64 D4 JSR $D464 write BAM EEAF C6 81 DEC $81 decrement sector number, 0 EEB1 20 60 D4 JSR $D460 read block EEB4 4C 94 C1 JMP $C194 prepare disk status ****************************** create BAM EEB7 20 D1 F0 JSR $F0D1 EEBA A0 00 LDY #$00 EEBC A9 12 LDA #$12 18 EEBE 91 6D STA ($6D),Y pointer to directory track EEC0 C8 INY EEC1 98 TYA 1 EEC2 91 6D STA ($6D),Y pointer to directory sector EEC4 C8 INY EEC5 C8 INY EEC6 C8 INY EEC7 A9 00 LDA #$00 EEC9 85 6F STA $6F EECB 85 70 STA $70 3 bytes = 24 bits for sectors EECD 85 71 STA $71 EECF 98 TYA byte position EED0 4A LSR A EED1 4A LSR A divided by 4 = track number EED2 20 4B F2 JSR $F24B get number of sectors EED5 91 6D STA ($6D),Y and in BAM EED7 C8 INY EED8 AA TAX EED9 38 SEC EEDA 26 6F ROL $6F EEDC 26 70 ROL $70 create bit model EEDE 26 71 ROL $71 EEE0 CA DEX EEE1 D0 F6 BNE $EED9 EEE3 B5 6F LDA $6F,X 3 bytes EEE5 91 6D STA ($6D),Y the BAM in buffer EEE7 C8 INY EEE8 E8 INX EEE9 E0 03 CPX #$03 EEEB 90 F6 BCC $EEE3 EEED C0 90 CPY #$90 position 144? EEEF 90 D6 BCC $EEC7 no, next track EEF1 4C 75 D0 JMP $D075 calculate number of free blocks ****************************** write BAM if needed EEF4 20 93 DF JSR $DF93 get buffer number EEF7 AA TAX EEF8 BD 5B 02 LDA $025B,X command for disk controller EEFB 29 01 AND #$01 EEFD 85 7F STA $7F isolate drive number EEFF A4 7F LDY $7F EF01 B9 51 02 LDA $0251,Y BAM-changed flag set? EF04 D0 01 BNE $EF07 yes EF06 60 RTS EF07 A9 00 LDA #$00 EF09 99 51 02 STA $0251,Y reset BAM-changed flag EF0C 20 3A EF JSR $EF3A set buffer pointer for BAM EF0F A5 7F LDA $7F drive number EF11 0A ASL A times 2 EF12 48 PHA EF13 20 A5 F0 JSR $F0A5 verify BAM entry EF16 68 PLA EF17 18 CLC EF18 69 01 ADC #$01 inrement track number EF1A 20 A5 F0 JSR $F0A5 verify BAM entry EF1D A5 80 LDA $80 track EF1F 48 PHA EF20 A9 01 LDA #$01 track 1 EF22 85 80 STA $80 EF24 0A ASL A times 4 EF25 0A ASL A EF26 85 6D STA $6D EF28 20 20 F2 JSR $F220 verify BAM EF2B E6 80 INC $80 increment track number EF2D A5 80 LDA $80 EF2F CD D7 FE CMP $FED7 and compare with max val + 1 = 36 EF32 90 F0 BCC $EF24 ok, next track EF34 68 PLA EF35 85 80 STA $80 get track number back EF37 4C 8A D5 JMP $D58A write BAM to disk ****************************** set buffer pointer for BAM EF3A 20 0F F1 JSR $F10F get 6 for drive 0 EF3D AA TAX EF3E 20 DF F0 JSR $F0DF allocate buffer EF41 A6 F9 LDX $F9 buffer number EF43 BD E0 FE LDA $FEE0,X buffer address, hi byte EF46 85 6E STA $6E EF48 A9 00 LDA #$00 lo byte EF4A 85 6D STA $6D pointer to $6D/$6E EF4C 60 RTS ****************************** get number of free blocks for directory EF4D A6 7F LDX $7F drive number EF4F BD FA 02 LDA $02FA,X number of blocks, lo EF52 8D 72 02 STA $0272 EF55 BD FC 02 LDA $02FC,X number of blocks, hi EF58 8D 73 02 STA $0273 in buffer for directory EF5B 60 RTS ****************************** mark block as free EF5C 20 F1 EF JSR $EFF1 set buffer pointer EF5F 20 CF EF JSR $EFCF erase bit for sector in BAM EF62 38 SEC EF63 D0 22 BNE $EF87 block already free, then done EF65 B1 6D LDA ($6D),Y bit model of BAM EF67 1D E9 EF ORA $EFE9,X set bit X, marker for free EF6A 91 6D STA ($6D),Y EF6C 20 88 EF JSR $EF88 set flag for BAM changed EF6F A4 6F LDY $6F EF71 18 CLC EF72 B1 6D LDA ($6D),Y EF74 69 01 ADC #$01 increment number of free blocks/track EF76 91 6D STA ($6D),Y EF78 A5 80 LDA $80 track EF7A CD 85 FE CMP $FE85 equal to 18? EF7D F0 3B BEQ $EFBA then skip EF7F FE FA 02 INC $02FA,X increment number of free blocks in disk EF82 D0 03 BNE $EF87 EF84 FE FC 02 INC $02FC,X increment number of blocks hi EF87 60 RTS ****************************** set flag for 'BAM changed' EF88 A6 7F LDX $7F drive number EF8A A9 01 LDA #$01 EF8C 9D 51 02 STA $0251,X flag = 1 EF8F 60 RTS ****************************** mark block as allocated EF90 20 F1 EF JSR $EFF1 set buffer pointer EF93 20 CF EF JSR $EFCF erase bit for sector in BAM EF96 F0 36 BEQ $EFCE already allocated, then done EF98 B1 6D LDA ($6D),Y EF9A 5D E9 EF EOR $EFE9,X erase bit for block EF9D 91 6D STA ($6D),Y EF9F 20 88 EF JSR $EF88 set flag for BAM changed EFA2 A4 6F LDY $6F EFA4 B1 6D LDA ($6D),Y EFA6 38 SEC EFA7 E9 01 SBC #$01 decrement number of blocks per track EFA9 91 6D STA ($6D),Y EFAB A5 80 LDA $80 track EFAD CD 85 FE CMP $FE85 18? EFB0 F0 0B BEQ $EFBD EFB2 BD FA 02 LDA $02FA,X number of free blocks lo EFB5 D0 03 BNE $EFBA EFB7 DE FC 02 DEC $02FC,X decrement number of free blocks EFBA DE FA 02 DEC $02FA,X EFBD BD FC 02 LDA $02FC,X number of free blocks hi EFC0 D0 0C BNE $EFCE more than 255 blocks free? EFC2 BD FA 02 LDA $02FA,X free blocks lo EFC5 C9 03 CMP #$03 EFC7 B0 05 BCS $EFCE smaller than 3? EFC9 A9 72 LDA #$72 EFCB 20 C7 E6 JSR $E6C7 72, 'disk full' EFCE 60 RTS ****************************** erase bit for sector in BAM entry EFCF 20 11 F0 JSR $F011 find BAM field for this track EFD2 98 TYA EFD3 85 6F STA $6F EFD5 A5 81 LDA $81 sector EFD7 4A LSR A EFD8 4A LSR A divide by 8 EFD9 4A LSR A EFDA 38 SEC EFDB 65 6F ADC $6F EFDD A8 TAY byte number in BAM entry EFDE A5 81 LDA $81 sector number EFE0 29 07 AND #$07 EFE2 AA TAX bit number in BAM entry EFE3 B1 6D LDA ($6D),Y byte in BAM EFE5 3D E9 EF AND $EFE9,X erase bit for corresponding sector EFE8 60 RTS ****************************** powers of 2 EFE9 .BY $01,$02,$04,$08,$10,$20,$40,$80 ****************************** write BAM after change EFF1 A9 FF LDA #$FF EFF3 2C F9 02 BIT $02F9 EFF6 F0 0C BEQ $F004 EFF8 10 0A BPL $F004 EFFA 70 08 BVS $F004 EFFC A9 00 LDA #$00 EFFE 8D F9 02 STA $02F9 reset flag F001 4C 8A D5 JMP $D58A write block F004 60 RTS ****************************** erase BAM buffer F005 20 3A EF JSR $EF3A pointer $6D/$6E to BAM buffer F008 A0 00 LDY #$00 F00A 98 TYA F00B 91 6D STA ($6D),Y erase BAM buffer F00D C8 INY F00E D0 FB BNE $F00B F010 60 RTS ****************************** F011 A5 6F LDA $6F F013 48 PHA F014 A5 70 LDA $70 F016 48 PHA F017 A6 7F LDX $7F drive number F019 B5 FF LDA $FF,X F01B F0 05 BEQ $F022 drive zero? F01D A9 74 LDA #$74 F01F 20 48 E6 JSR $E648 'drive not ready' F022 20 0F F1 JSR $F10F get buffer number for BAM F025 85 6F STA $6F F027 8A TXA F028 0A ASL A F029 85 70 STA $70 F02B AA TAX F02C A5 80 LDA $80 track F02E DD 9D 02 CMP $029D,X F031 F0 0B BEQ $F03E F033 E8 INX F034 86 70 STX $70 F036 DD 9D 02 CMP $029D,X F039 F0 03 BEQ $F03E F03B 20 5B F0 JSR $F05B F03E A5 70 LDA $70 F040 A6 7F LDX $7F drive number F042 9D 9B 02 STA $029B,X F045 0A ASL A F046 0A ASL A times 4 F047 18 CLC F048 69 A1 ADC #$A1 F04A 85 6D STA $6D F04C A9 02 LDA #$02 F04E 69 00 ADC #$00 F050 85 6E STA $6E F052 A0 00 LDY #$00 F054 68 PLA F055 85 70 STA $70 F057 68 PLA F058 85 6F STA $6F F05A 60 RTS ****************************** F05B A6 6F LDX $6F F05D 20 DF F0 JSR $F0DF F060 A5 7F LDA $7F drive number F062 AA TAX F063 0A ASL A F064 1D 9B 02 ORA $029B,X F067 49 01 EOR #$01 F069 29 03 AND #$03 F06B 85 70 STA $70 F06D 20 A5 F0 JSR $F0A5 F070 A5 F9 LDA $F9 buffer number F072 0A ASL A F073 AA TAX F074 A5 80 LDA $80 track F076 0A ASL A F077 0A ASL A times 4 F078 95 99 STA $99,X equal pointer in BAM field F07A A5 70 LDA $70 F07C 0A ASL A F07D 0A ASL A F07E A8 TAY F07F A1 99 LDA ($99,X) F081 99 A1 02 STA $02A1,Y F084 A9 00 LDA #$00 F086 81 99 STA ($99,X) zero in buffer F088 F6 99 INC $99,X increment buffer pointer F08A C8 INY F08B 98 TYA F08C 29 03 AND #$03 F08E D0 EF BNE $F07F F090 A6 70 LDX $70 F092 A5 80 LDA $80 track F094 9D 9D 02 STA $029D,X F097 AD F9 02 LDA $02F9 F09A D0 03 BNE $F09F F09C 4C 8A D5 JMP $D58A write block F09F 09 80 ORA #$80 F0A1 8D F9 02 STA $02F9 F0A4 60 RTS F0A5 A8 TAY F0A6 B9 9D 02 LDA $029D,Y F0A9 F0 25 BEQ $F0D0 F0AB 48 PHA F0AC A9 00 LDA #$00 F0AE 99 9D 02 STA $029D,Y F0B1 A5 F9 LDA $F9 buffer number F0B3 0A ASL A times 2 F0B4 AA TAX F0B5 68 PLA F0B6 0A ASL A F0B7 0A ASL A F0B8 95 99 STA $99,X F0BA 98 TYA F0BB 0A ASL A F0BC 0A ASL A F0BD A8 TAY F0BE B9 A1 02 LDA $02A1,Y F0C1 81 99 STA ($99,X) write in buffer F0C3 A9 00 LDA #$00 F0C5 99 A1 02 STA $02A1,Y F0C8 F6 99 INC $99,X increment buffer pointer F0CA C8 INY F0CB 98 TYA F0CC 29 03 AND #$03 F0CE D0 EE BNE $F0BE F0D0 60 RTS F0D1 A5 7F LDA $7F drive number F0D3 0A ASL A F0D4 AA TAX F0D5 A9 00 LDA #$00 F0D7 9D 9D 02 STA $029D,X F0DA E8 INX F0DB 9D 9D 02 STA $029D,X F0DE 60 RTS F0DF B5 A7 LDA $A7,X F0E1 C9 FF CMP #$FF F0E3 D0 25 BNE $F10A F0E5 8A TXA F0E6 48 PHA F0E7 20 8E D2 JSR $D28E F0EA AA TAX F0EB 10 05 BPL $F0F2 F0ED A9 70 LDA #$70 F0EF 20 C8 C1 JSR $C1C8 70, 'no channel' F0F2 86 F9 STX $F9 F0F4 68 PLA F0F5 A8 TAY F0F6 8A TXA F0F7 09 80 ORA #$80 F0F9 99 A7 00 STA $00A7,Y F0FC 0A ASL A F0FD AA TAX F0FE AD 85 FE LDA $FE85 18, directory track F101 95 06 STA $06,X save F103 A9 00 LDA #$00 0 F105 95 07 STA $07,X as sector F107 4C 86 D5 JMP $D586 write block F10A 29 0F AND #$0F F10C 85 F9 STA $F9 buffer number F10E 60 RTS ****************************** get buffer number for BAM F10F A9 06 LDA #$06 F111 A6 7F LDX $7F drive number F113 D0 03 BNE $F118 F115 18 CLC F116 69 07 ADC #$07 gives 13 for drive 0 F118 60 RTS ****************************** buffer number for BAM F119 20 0F F1 JSR $F10F get buffer number F11C AA TAX F11D 60 RTS ****************************** find and allocate free block F11E 20 3E DE JSR $DE3E get track and sector number F121 A9 03 LDA #$03 F123 85 6F STA $6F counter F125 A9 01 LDA #$01 F127 0D F9 02 ORA $02F9 F12A 8D F9 02 STA $02F9 F12D A5 6F LDA $6F save counter F12F 48 PHA F130 20 11 F0 JSR $F011 find BAM field for this track F133 68 PLA F134 85 6F STA $6F get counter back F136 B1 6D LDA ($6D),Y number of free blocks in track F138 D0 39 BNE $F173 blocks still free? F13A A5 80 LDA $80 track F13C CD 85 FE CMP $FE85 18, directory track? F13F F0 19 BEQ $F15A yes, 'disk full' F141 90 1C BCC $F15F smaller, then next lower track F143 E6 80 INC $80 increment track number F145 A5 80 LDA $80 F147 CD D7 FE CMP $FED7 36, highest track number plus one F14A D0 E1 BNE $F12D no, continue searching this track F14C AE 85 FE LDX $FE85 18, directory track F14F CA DEX decrement F150 86 80 STX $80 save as track number F152 A9 00 LDA #$00 F154 85 81 STA $81 begin with sector number zero F156 C6 6F DEC $6F decrement counter F158 D0 D3 BNE $F12D not yet zero, then continue F15A A9 72 LDA #$72 F15C 20 C8 C1 JSR $C1C8 72, 'disk full' F15F C6 80 DEC $80 decrement track number F161 D0 CA BNE $F12D not yet 0, continue in this track F163 AE 85 FE LDX $FE85 18, directory track F166 E8 INX increment F167 86 80 STX $80 save as track number F169 A9 00 LDA #$00 F16B 85 81 STA $81 begin with sector zero F16D C6 6F DEC $6F decrement counter F16F D0 BC BNE $F12D not yet zero, then continue F171 F0 E7 BEQ $F15A else 'disk full' F173 A5 81 LDA $81 sector number F175 18 CLC F176 65 69 ADC $69 plus step width (10) F178 85 81 STA $81 as new number F17A A5 80 LDA $80 track number F17C 20 4B F2 JSR $F24B get maximum sector number F17F 8D 4E 02 STA $024E F182 8D 4D 02 STA $024D and save F185 C5 81 CMP $81 greater than selected sector number? F187 B0 0C BCS $F195 yes F189 38 SEC else F18A A5 81 LDA $81 sector number F18C ED 4E 02 SBC $024E minus maximum sector number F18F 85 81 STA $81 save as new sector number F191 F0 02 BEQ $F195 zero? F193 C6 81 DEC $81 else decrement sector number by one F195 20 FA F1 JSR $F1FA check BAM, find free sector F198 F0 03 BEQ $F19D not found? F19A 4C 90 EF JMP $EF90 allocate block in BAM F19D A9 00 LDA #$00 F19F 85 81 STA $81 sector zero F1A1 20 FA F1 JSR $F1FA find free sector F1A4 D0 F4 BNE $F19A found? F1A6 4C F5 F1 JMP $F1F5 no, 'dir sector' ****************************** find free sector and allocate F1A9 A9 01 LDA #$01 F1AB 0D F9 02 ORA $02F9 F1AE 8D F9 02 STA $02F9 F1B1 A5 86 LDA $86 F1B3 48 PHA F1B4 A9 01 LDA #$01 track counter F1B6 85 86 STA $86 F1B8 AD 85 FE LDA $FE85 18, directory track F1BB 38 SEC F1BC E5 86 SBC $86 minus counter F1BE 85 80 STA $80 save as track number F1C0 90 09 BCC $F1CB result <= zero? F1C2 F0 07 BEQ $F1CB then try top half of directory F1C4 20 11 F0 JSR $F011 find BAM field for this track F1C7 B1 6D LDA ($6D),Y number of free blocks in this track F1C9 D0 1B BNE $F1E6 free blocks exist F1CB AD 85 FE LDA $FE85 18, directory track F1CE 18 CLC F1CF 65 86 ADC $86 plus counter F1D1 85 80 STA $80 save as track number F1D3 E6 86 INC $86 increment counter F1D5 CD D7 FE CMP $FED7 36, max track number plus one F1D8 90 05 BCC $F1DF smaller, then ok F1DA A9 67 LDA #$67 F1DC 20 45 E6 JSR $E645 67, 'illegal track or sector' F1DF 20 11 F0 JSR $F011 find BAM field for this track F1E2 B1 6D LDA ($6D),Y number of free blocks? F1E4 F0 D2 BEQ $F1B8 no more free blocks? F1E6 68 PLA F1E7 85 86 STA $86 F1E9 A9 00 LDA #$00 F1EB 85 81 STA $81 sector 0 F1ED 20 FA F1 JSR $F1FA find free sector F1F0 F0 03 BEQ $F1F5 not found? F1F2 4C 90 EF JMP $EF90 allocate block in BAM F1F5 A9 71 LDA #$71 F1F7 20 45 E6 JSR $E645 71, 'dir error' ****************************** find free sectors in actual track F1FA 20 11 F0 JSR $F011 find BAM field for this track F1FD 98 TYA point to number of free blocks F1FE 48 PHA F1FF 20 20 F2 JSR $F220 verify BAM F202 A5 80 LDA $80 track F204 20 4B F2 JSR $F24B get max number of sectors of the track F207 8D 4E 02 STA $024E save F20A 68 PLA F20B 85 6F STA $6F save pointer F20D A5 81 LDA $81 compare sector F20F CD 4E 02 CMP $024E with maximum number F212 B0 09 BCS $F21D greater than or equal to? F214 20 D5 EF JSR $EFD5 get bit number of sector F217 D0 06 BNE $F21F sector free? F219 E6 81 INC $81 increment sector number F21B D0 F0 BNE $F20D and check if free F21D A9 00 LDA #$00 no sectors free F21F 60 RTS ****************************** verify number of free blocks in BAM F220 A5 6F LDA $6F F222 48 PHA F223 A9 00 LDA #$00 F225 85 6F STA $6F counter to zero F227 AC 86 FE LDY $FE86 4, number of bytes per track in BAM F22A 88 DEY F22B A2 07 LDX #$07 F22D B1 6D LDA ($6D),Y F22F 3D E9 EF AND $EFE9,X isolate bit F232 F0 02 BEQ $F236 F234 E6 6F INC $6F increment counter of free sectors F236 CA DEX F237 10 F4 BPL $F22D F239 88 DEY F23A D0 EF BNE $F22B F23C B1 6D LDA ($6D),Y compare with number on diskette F23E C5 6F CMP $6F F240 D0 04 BNE $F246 not equal, then error F242 68 PLA F243 85 6F STA $6F F245 60 RTS F246 A9 71 LDA #$71 F248 20 45 E6 JSR $E645 71, 'dir error' ****************************** establish number of sectors per track F24B AE D6 FE LDX $FED6 4 different values F24E DD D6 FE CMP $FED6,X track number F251 CA DEX F252 B0 FA BCS $F24E not greater? F254 BD D1 FE LDA $FED1,X get number of sectors F257 60 RTS F258 60 RTS ****************************** initialize disk controller F259 A9 6F LDA #$6F bit 4 (write prot) & 7 (SYNC) F25B 8D 02 1C STA $1C02 data direction register port B F25E 29 F0 AND #$F0 F260 8D 00 1C STA $1C00 port B, control port F263 AD 0C 1C LDA $1C0C PCR, control register F266 29 FE AND #$FE F268 09 0E ORA #$0E F26A 09 E0 ORA #$E0 F26C 8D 0C 1C STA $1C0C F26F A9 41 LDA #$41 F271 8D 0B 1C STA $1C0B timer 1 free running, enable F274 A9 00 LDA #$00 port A latch F276 8D 06 1C STA $1C06 timer 1 lo latch F279 A9 3A LDA #$3A F27B 8D 07 1C STA $1C07 timer 1 hi latch F27E 8D 05 1C STA $1C05 timer 1 hi F281 A9 7F LDA #$7F F283 8D 0E 1C STA $1C0E erase IRQs F286 A9 C0 LDA #$C0 F288 8D 0D 1C STA $1C0D F28B 8D 0E 1C STA $1C0E IER, allow interrupts F28E A9 FF LDA #$FF F290 85 3E STA $3E F292 85 51 STA $51 track counter for formatting F294 A9 08 LDA #$08 8 F296 85 39 STA $39 constants for block header F298 A9 07 LDA #$07 7 F29A 85 47 STA $47 constants for data block F29C A9 05 LDA #$05 F29E 85 62 STA $62 F2A0 A9 FA LDA #$FA pointer $62/$63 to $FA05 F2A2 85 63 STA $63 F2A4 A9 C8 LDA #$C8 200 F2A6 85 64 STA $64 F2A8 A9 04 LDA #$04 F2AA 85 5E STA $5E F2AC A9 04 LDA #$04 F2AE 85 5F STA $5F ****************************** IRQ routine for disk controller F2B0 BA TSX F2B1 86 49 STX $49 save stack pointer F2B3 AD 04 1C LDA $1C04 F2B6 AD 0C 1C LDA $1C0C erase interrupt flag from timer F2B9 09 0E ORA #$0E F2BB 8D 0C 1C STA $1C0C F2BE A0 05 LDY #$05 F2C0 B9 00 00 LDA $0000,Y command for buffer Y? F2C3 10 2E BPL $F2F3 no F2C5 C9 D0 CMP #$D0 execute code for program in buffer F2C7 D0 04 BNE $F2CD no F2C9 98 TYA F2CA 4C 70 F3 JMP $F370 execute program in buffer F2CD 29 01 AND #$01 isolate drive number F2CF F0 07 BEQ $F2D8 drive zero? F2D1 84 3F STY $3F F2D3 A9 0F LDA #$0F else F2D5 4C 69 F9 JMP $F969 74, 'drive not ready' F2D8 AA TAX F2D9 85 3D STA $3D F2DB C5 3E CMP $3E motor running? F2DD F0 0A BEQ $F2E9 yes F2DF 20 7E F9 JSR $F97E turn drive motor on F2E2 A5 3D LDA $3D F2E4 85 3E STA $3E set flag F2E6 4C 9C F9 JMP $F99C to job loop F2E9 A5 20 LDA $20 F2EB 30 03 BMI $F2F0 head transport programmed? F2ED 0A ASL A F2EE 10 09 BPL $F2F9 F2F0 4C 9C F9 JMP $F99C to job loop F2F3 88 DEY F2F4 10 CA BPL $F2C0 check next buffer F2F6 4C 9C F9 JMP $F99C to job loop F2F9 A9 20 LDA #$20 F2FB 85 20 STA $20 program head transport F2FD A0 05 LDY #$05 F2FF 84 3F STY $3F initialize buffer counter F301 20 93 F3 JSR $F393 set pointer in buffer F304 30 1A BMI $F320 command for buffer? F306 C6 3F DEC $3F decrement counter F308 10 F7 BPL $F301 check next buffer F30A A4 41 LDY $41 buffer number F30C 20 95 F3 JSR $F395 set pointer in buffer F30F A5 42 LDA $42 track difference for last job F311 85 4A STA $4A as counter for head transport F313 06 4A ASL $4A F315 A9 60 LDA #$60 set flag for head transport F317 85 20 STA $20 F319 B1 32 LDA ($32),Y get track number from buffer F31B 85 22 STA $22 F31D 4C 9C F9 JMP $F99C to job loop F320 29 01 AND #$01 isolate drive number F322 C5 3D CMP $3D equal drive number of last job? F324 D0 E0 BNE $F306 no F326 A5 22 LDA $22 last track number F328 F0 12 BEQ $F33C equal zero? F32A 38 SEC F32B F1 32 SBC ($32),Y equal track number of this job? F32D F0 0D BEQ $F33C yes F32F 49 FF EOR #$FF F331 85 42 STA $42 F333 E6 42 INC $42 F335 A5 3F LDA $3F drive number F337 85 41 STA $41 F339 4C 06 F3 JMP $F306 F33C A2 04 LDX #$04 F33E B1 32 LDA ($32),Y track number of the job F340 85 40 STA $40 save F342 DD D6 FE CMP $FED6,X compare with maximum track number F345 CA DEX F346 B0 FA BCS $F342 greater? F348 BD D1 FE LDA $FED1,X get number of sectors per track F34B 85 43 STA $43 and save F34D 8A TXA F34E 0A ASL A F34F 0A ASL A F350 0A ASL A F351 0A ASL A F352 0A ASL A F353 85 44 STA $44 gives 0, 32, 64, 96 F355 AD 00 1C LDA $1C00 F358 29 9F AND #$9F F35A 05 44 ORA $44 generate control byte for motor F35C 8D 00 1C STA $1C00 F35F A6 3D LDX $3D F361 A5 45 LDA $45 command code F363 C9 40 CMP #$40 position head? F365 F0 15 BEQ $F37C yes F367 C9 60 CMP #$60 command code for program execution? F369 F0 03 BEQ $F36E yes F36B 4C B1 F3 JMP $F3B1 read block header ****************************** execute program in buffer F36E A5 3F LDA $3F buffer number F370 18 CLC F371 69 03 ADC #$03 plus 3 F373 85 31 STA $31 F375 A9 00 LDA #$00 equals address of buffer F377 85 30 STA $30 F379 6C 30 00 JMP ($0030) execute program in buffer ****************************** position head F37C A9 60 LDA #$60 F37E 85 20 STA $20 set flag for head transport F380 AD 00 1C LDA $1C00 F383 29 FC AND #$FC turn stepper motors on F385 8D 00 1C STA $1C00 F388 A9 A4 LDA #$A4 164 F38A 85 4A STA $4A step counter for head transport F38C A9 01 LDA #$01 F38E 85 22 STA $22 track number F390 4C 69 F9 JMP $F969 ok ****************************** initialize pointer in buffer F393 A4 3F LDY $3F buffer number F395 B9 00 00 LDA $0000,Y command code F398 48 PHA save F399 10 10 BPL $F3AB F39B 29 78 AND #$78 erase bits 0,1,2, and 7 F39D 85 45 STA $45 F39F 98 TYA buffer number F3A0 0A ASL A times two F3A1 69 06 ADC #$06 plus 6 F3A3 85 32 STA $32 equals pointer to actual buffer F3A5 98 TYA buffer number F3A6 18 CLC F3A7 69 03 ADC #$03 plus 3 F3A9 85 31 STA $31 equals buffer address hi F3AB A0 00 LDY #$00 F3AD 84 30 STY $30 buffer address lo F3AF 68 PLA get command code back F3B0 60 RTS ****************************** read block header, verify ID F3B1 A2 5A LDX #$5A 90 F3B3 86 4B STX $4B counter F3B5 A2 00 LDX #$00 F3B7 A9 52 LDA #$52 82 F3B9 85 24 STA $24 F3BB 20 56 F5 JSR $F556 wait for SYNC F3BE 50 FE BVC $F3BE byte ready? F3C0 B8 CLV F3C1 AD 01 1C LDA $1C01 data from read head F3C4 C5 24 CMP $24 F3C6 D0 3F BNE $F407 20, 'read error' F3C8 50 FE BVC $F3C8 byte ready? F3CA B8 CLV F3CB AD 01 1C LDA $1C01 data byte from disk (block header) F3CE 95 25 STA $25,X save 7 bytes F3D0 E8 INX F3D1 E0 07 CPX #$07 F3D3 D0 F3 BNE $F3C8 continue reading F3D5 20 97 F4 JSR $F497 F3D8 A0 04 LDY #$04 4 bytes plus parity F3DA A9 00 LDA #$00 F3DC 59 16 00 EOR $0016,Y form checksum for header F3DF 88 DEY F3E0 10 FA BPL $F3DC F3E2 C9 00 CMP #$00 parity ok? F3E4 D0 38 BNE $F41E 27, 'read error' F3E6 A6 3E LDX $3E drive number F3E8 A5 18 LDA $18 track number of header F3EA 95 22 STA $22,X use as actual track number F3EC A5 45 LDA $45 F3EE C9 30 CMP #$30 code for 'preserve header' F3F0 F0 1E BEQ $F410 preserve header F3F2 A5 3E LDA $3E F3F4 0A ASL A F3F5 A8 TAY F3F6 B9 12 00 LDA $0012,Y F3F9 C5 16 CMP $16 command with ID1 F3FB D0 1E BNE $F41B F3FD B9 13 00 LDA $0013,Y F400 C5 17 CMP $17 command with ID2 F402 D0 17 BNE $F41B <>, then 29, 'disk id mismatch' F404 4C 23 F4 JMP $F423 F407 C6 4B DEC $4B decrement counter for attempts F409 D0 B0 BNE $F3BB and try again F40B A9 02 LDA #$02 else F40D 20 69 F9 JSR $F969 20, 'read error' ****************************** preserve block header F410 A5 16 LDA $16 ID1 F412 85 12 STA $12 F414 A5 17 LDA $17 and ID2 F416 85 13 STA $13 preserve F418 A9 01 LDA #$01 ok F41A 2C .BYTE $2C F41B A9 0B LDA #$0B 29, 'disk id mismatch' F41D 2C .BYTE $2C F41E A9 09 LDA #$09 27, 'write error' F420 4C 69 F9 JMP $F969 done ****************************** F423 A9 7F LDA #$7F F425 85 4C STA $4C F427 A5 19 LDA $19 F429 18 CLC F42A 69 02 ADC #$02 F42C C5 43 CMP $43 F42E 90 02 BCC $F432 F430 E5 43 SBC $43 F432 85 4D STA $4D F434 A2 05 LDX #$05 F436 86 3F STX $3F F438 A2 FF LDX #$FF F43A 20 93 F3 JSR $F393 set buffer pointer for disk controller F43D 10 44 BPL $F483 F43F 85 44 STA $44 F441 29 01 AND #$01 F443 C5 3E CMP $3E F445 D0 3C BNE $F483 F447 A0 00 LDY #$00 F449 B1 32 LDA ($32),Y F44B C5 40 CMP $40 F44D D0 34 BNE $F483 F44F A5 45 LDA $45 command code F451 C9 60 CMP #$60 F453 F0 0C BEQ $F461 F455 A0 01 LDY #$01 F457 38 SEC F458 B1 32 LDA ($32),Y F45A E5 4D SBC $4D F45C 10 03 BPL $F461 F45E 18 CLC F45F 65 43 ADC $43 F461 C5 4C CMP $4C F463 B0 1E BCS $F483 F465 48 PHA F466 A5 45 LDA $45 F468 F0 14 BEQ $F47E F46A 68 PLA F46B C9 09 CMP #$09 F46D 90 14 BCC $F483 F46F C9 0C CMP #$0C F471 B0 10 BCS $F483 F473 85 4C STA $4C F475 A5 3F LDA $3F F477 AA TAX F478 69 03 ADC #$03 F47A 85 31 STA $31 F47C D0 05 BNE $F483 F47E 68 PLA F47F C9 06 CMP #$06 F481 90 F0 BCC $F473 F483 C6 3F DEC $3F F485 10 B3 BPL $F43A F487 8A TXA F488 10 03 BPL $F48D F48A 4C 9C F9 JMP $F99C to job loop F48D 86 3F STX $3F F48F 20 93 F3 JSR $F393 get buffer number F492 A5 45 LDA $45 command code F494 4C CA F4 JMP $F4CA continue checking F497 A5 30 LDA $30 F499 48 PHA save pointer $30/$31 F49A A5 31 LDA $31 F49C 48 PHA F49D A9 24 LDA #$24 F49F 85 30 STA $30 F4A1 A9 00 LDA #$00 pointer $30/$31 to $24 F4A3 85 31 STA $31 F4A5 A9 00 LDA #$00 F4A7 85 34 STA $34 F4A9 20 E6 F7 JSR $F7E6 F4AC A5 55 LDA $55 F4AE 85 18 STA $18 F4B0 A5 54 LDA $54 F4B2 85 19 STA $19 F4B4 A5 53 LDA $53 F4B6 85 1A STA $1A F4B8 20 E6 F7 JSR $F7E6 F4BB A5 52 LDA $52 F4BD 85 17 STA $17 F4BF A5 53 LDA $53 F4C1 85 16 STA $16 F4C3 68 PLA F4C4 85 31 STA $31 F4C6 68 PLA get pointer $30/$31 back F4C7 85 30 STA $30 F4C9 60 RTS ****************************** F4CA C9 00 CMP #$00 command code for 'read'? F4CC F0 03 BEQ $F4D1 yes F4CE 4C 6E F5 JMP $F56E continue checking command F4D1 20 0A F5 JSR $F50A find beginning of data block F4D4 50 FE BVC $F4D4 byte ready? F4D6 B8 CLV F4D7 AD 01 1C LDA $1C01 get data byte F4DA 91 30 STA ($30),Y and write in buffer F4DC C8 INY 256 times F4DD D0 F5 BNE $F4D4 F4DF A0 BA LDY #$BA F4E1 50 FE BVC $F4E1 byte ready? F4E3 B8 CLV F4E4 AD 01 1C LDA $1C01 read bytes F4E7 99 00 01 STA $0100,Y from $1BA to $1FF F4EA C8 INY F4EB D0 F4 BNE $F4E1 F4ED 20 E0 F8 JSR $F8E0 F4F0 A5 38 LDA $38 F4F2 C5 47 CMP $47 equal 7, beginning of data block? F4F4 F0 05 BEQ $F4FB yes F4F6 A9 04 LDA #$04 22, 'read error' F4F8 4C 69 F9 JMP $F969 error termination F4FB 20 E9 F5 JSR $F5E9 calculate parity of data block F4FE C5 3A CMP $3A agreement? F500 F0 03 BEQ $F505 yes F502 A9 05 LDA #$05 23, 'read error' F504 2C .BYTE $2C F505 A9 01 LDA #$01 ok F507 4C 69 F9 JMP $F969 prepare error message ****************************** find start of data block F50A 20 10 F5 JSR $F510 read block header F50D 4C 56 F5 JMP $F556 wait for SYNC ****************************** read block header F510 A5 3D LDA $3D drive number F512 0A ASL A F513 AA TAX F514 B5 12 LDA $12,X ID1 F516 85 16 STA $16 save F518 B5 13 LDA $13,X ID2 F51A 85 17 STA $17 save F51C A0 00 LDY #$00 F51E B1 32 LDA ($32),Y get track and F520 85 18 STA $18 F522 C8 INY F523 B1 32 LDA ($32),Y sector number from buffer F525 85 19 STA $19 F527 A9 00 LDA #$00 F529 45 16 EOR $16 F52B 45 17 EOR $17 calculate parity for block header F52D 45 18 EOR $18 F52F 45 19 EOR $19 F531 85 1A STA $1A and save F533 20 34 F9 JSR $F934 F536 A2 5A LDX #$5A 90 attempts F538 20 56 F5 JSR $F556 wait for SYNC F53B A0 00 LDY #$00 F53D 50 FE BVC $F53D byte ready? F53F B8 CLV F540 AD 01 1C LDA $1C01 read data from block header F543 D9 24 00 CMP $0024,Y compare with saved data F546 D0 06 BNE $F54E not the same, try again F548 C8 INY F549 C0 08 CPY #$08 8 bytes read? F54B D0 F0 BNE $F53D no F54D 60 RTS F54E CA DEX decrement counter F54F D0 E7 BNE $F538 not yet zero? F551 A9 02 LDA #$02 F553 4C 69 F9 JMP $F969 20, 'read error' ****************************** wait for SYNC F556 A9 D0 LDA #$D0 208 F558 8D 05 18 STA $1805 start timer F55B A9 03 LDA #$03 error code F55D 2C 05 18 BIT $1805 F560 10 F1 BPL $F553 timer run down, then 'read error' F562 2C 00 1C BIT $1C00 SYNC signal F565 30 F6 BMI $F55D not yet found? F567 AD 01 1C LDA $1C01 read byte F56A B8 CLV F56B A0 00 LDY #$00 F56D 60 RTS ****************************** F56E C9 10 CMP #$10 command code for 'write' F570 F0 03 BEQ $F575 yes F572 4C 91 F6 JMP $F691 continue checking command code ****************************** write data block to disk F575 20 E9 F5 JSR $F5E9 calculate parity for buffer F578 85 3A STA $3A and save F57A AD 00 1C LDA $1C00 read port B F57D 29 10 AND #$10 isolate bit for 'write protect' F57F D0 05 BNE $F586 not set, ok F581 A9 08 LDA #$08 F583 4C 69 F9 JMP $F969 26, 'write protect' F586 20 8F F7 JSR $F78F F589 20 10 F5 JSR $F510 find block header F58C A2 09 LDX #$09 F58E 50 FE BVC $F58E byte ready? F590 B8 CLV F591 CA DEX F592 D0 FA BNE $F58E F594 A9 FF LDA #$FF F596 8D 03 1C STA $1C03 port A (read/write head) to output F599 AD 0C 1C LDA $1C0C F59C 29 1F AND #$1F F59E 09 C0 ORA #$C0 change PCR to output F5A0 8D 0C 1C STA $1C0C F5A3 A9 FF LDA #$FF F5A5 A2 05 LDX #$05 F5A7 8D 01 1C STA $1C01 write $FF to disk 5 times F5AA B8 CLV F5AB 50 FE BVC $F5AB as SYNC characters F5AD B8 CLV F5AE CA DEX F5AF D0 FA BNE $F5AB F5B1 A0 BB LDY #$BB F5B3 B9 00 01 LDA $0100,Y bytes $1BB to $1FF to disk F5B6 50 FE BVC $F5B6 F5B8 B8 CLV F5B9 8D 01 1C STA $1C01 F5BC C8 INY F5BD D0 F4 BNE $F5B3 F5BF B1 30 LDA ($30),Y write data buffer (256 bytes) F5C1 50 FE BVC $F5C1 F5C3 B8 CLV F5C4 8D 01 1C STA $1C01 F5C7 C8 INY F5C8 D0 F5 BNE $F5BF F5CA 50 FE BVC $F5CA byte ready? F5CC AD 0C 1C LDA $1C0C F5CF 09 E0 ORA #$E0 PCR to input again F5D1 8D 0C 1C STA $1C0C F5D4 A9 00 LDA #$00 F5D6 8D 03 1C STA $1C03 port A (read/write head) to input F5D9 20 F2 F5 JSR $F5F2 F5DC A4 3F LDY $3F F5DE B9 00 00 LDA $0000,Y F5E1 49 30 EOR #$30 convert command code 'write' to 'verify' F5E3 99 00 00 STA $0000,Y F5E6 4C B1 F3 JMP $F3B1 ****************************** calculate parity for data buffer F5E9 A9 00 LDA #$00 F5EB A8 TAY F5EC 51 30 EOR ($30),Y F5EE C8 INY F5EF D0 FB BNE $F5EC F5F1 60 RTS F5F2 A9 00 LDA #$00 F5F4 85 2E STA $2E F5F6 85 30 STA $30 F5F8 85 4F STA $4F F5FA A5 31 LDA $31 F5FC 85 4E STA $4E F5FE A9 01 LDA #$01 F600 85 31 STA $31 F602 85 2F STA $2F F604 A9 BB LDA #$BB F606 85 34 STA $34 F608 85 36 STA $36 F60A 20 E6 F7 JSR $F7E6 F60D A5 52 LDA $52 F60F 85 38 STA $38 F611 A4 36 LDY $36 F613 A5 53 LDA $53 F615 91 2E STA ($2E),Y F617 C8 INY F618 A5 54 LDA $54 F61A 91 2E STA ($2E),Y F61C C8 INY F61D A5 55 LDA $55 F61F 91 2E STA ($2E),Y F621 C8 INY F622 84 36 STY $36 F624 20 E6 F7 JSR $F7E6 F627 A4 36 LDY $36 F629 A5 52 LDA $52 F62B 91 2E STA ($2E),Y F62D C8 INY F62E A5 53 LDA $53 F630 91 2E STA ($2E),Y F632 C8 INY F633 F0 0E BEQ $F643 F635 A5 54 LDA $54 F637 91 2E STA ($2E),Y F639 C8 INY F63A A5 55 LDA $55 F63C 91 2E STA ($2E),Y F63E C8 INY F63F 84 36 STY $36 F641 D0 E1 BNE $F624 F643 A5 54 LDA $54 F645 91 30 STA ($30),Y F647 C8 INY F648 A5 55 LDA $55 F64A 91 30 STA ($30),Y F64C C8 INY F64D 84 36 STY $36 F64F 20 E6 F7 JSR $F7E6 F652 A4 36 LDY $36 F654 A5 52 LDA $52 F656 91 30 STA ($30),Y F658 C8 INY F659 A5 53 LDA $53 F65B 91 30 STA ($30),Y F65D C8 INY F65E A5 54 LDA $54 F660 91 30 STA ($30),Y F662 C8 INY F663 A5 55 LDA $55 F665 91 30 STA ($30),Y F667 C8 INY F668 84 36 STY $36 F66A C0 BB CPY #$BB F66C 90 E1 BCC $F64F F66E A9 45 LDA #$45 F670 85 2E STA $2E F672 A5 31 LDA $31 F674 85 2F STA $2F F676 A0 BA LDY #$BA F678 B1 30 LDA ($30),Y F67A 91 2E STA ($2E),Y F67C 88 DEY F67D D0 F9 BNE $F678 F67F B1 30 LDA ($30),Y F681 91 2E STA ($2E),Y F683 A2 BB LDX #$BB F685 BD 00 01 LDA $0100,X F688 91 30 STA ($30),Y F68A C8 INY F68B E8 INX F68C D0 F7 BNE $F685 F68E 86 50 STX $50 F690 60 RTS ****************************** F691 C9 20 CMP #$20 command code for 'verify'? F693 F0 03 BEQ $F698 yes F695 4C CA F6 JMP $F6CA continue checking command code F698 20 E9 F5 JSR $F5E9 calculate parity for data buffer F69B 85 3A STA $3A and save F69D 20 8F F7 JSR $F78F F6A0 20 0A F5 JSR $F50A find start of data block F6A3 A0 BB LDY #$BB F6A5 B9 00 01 LDA $0100,Y data from buffer F6A8 50 FE BVC $F6A8 byte ready? F6AA B8 CLV F6AB 4D 01 1C EOR $1C01 compare with data from disk F6AE D0 15 BNE $F6C5 not equal, then error F6B0 C8 INY F6B1 D0 F2 BNE $F6A5 F6B3 B1 30 LDA ($30),Y data from buffer F6B5 50 FE BVC $F6B5 F6B7 B8 CLV F6B8 4D 01 1C EOR $1C01 compare with data from disk F6BB D0 08 BNE $F6C5 not equal, then error F6BD C8 INY F6BE C0 FD CPY #$FD F6C0 D0 F1 BNE $F6B3 F6C2 4C 18 F4 JMP $F418 error free termination F6C5 A9 07 LDA #$07 F6C7 4C 69 F9 JMP $F969 25, 'write error' ****************************** F6CA 20 10 F5 JSR $F510 read block header F6CD 4C 18 F4 JMP $F418 done ****************************** F6D0 A9 00 LDA #$00 F6D2 85 57 STA $57 F6D4 85 5A STA $5A F6D6 A4 34 LDY $34 F6D8 A5 52 LDA $52 F6DA 29 F0 AND #$F0 isolate hi-nibble F6DC 4A LSR A F6DD 4A LSR A and rotate to lower nibble F6DE 4A LSR A F6DF 4A LSR A F6E0 AA TAX as index in table F6E1 BD 7F F7 LDA $F77F,X F6E4 0A ASL A F6E5 0A ASL A times 8 F6E6 0A ASL A F6E7 85 56 STA $56 F6E9 A5 52 LDA $52 F6EB 29 0F AND #$0F isolate lower nibble F6ED AA TAX as index in table F6EE BD 7F F7 LDA $F77F,X F6F1 6A ROR F6F2 66 57 ROR $57 F6F4 6A ROR F6F5 66 57 ROR $57 F6F7 29 07 AND #$07 F6F9 05 56 ORA $56 F6FB 91 30 STA ($30),Y in buffer F6FD C8 INY increment buffer F6FE A5 53 LDA $53 F700 29 F0 AND #$F0 isolate upper nibble F702 4A LSR A F703 4A LSR A F704 4A LSR A shift to upper nibble F705 4A LSR A F706 AA TAX as index in table F707 BD 7F F7 LDA $F77F,X F70A 0A ASL A F70B 05 57 ORA $57 F70D 85 57 STA $57 F70F A5 53 LDA $53 F711 29 0F AND #$0F lower nibble F713 AA TAX as index F714 BD 7F F7 LDA $F77F,X F717 2A ROL F718 2A ROL F719 2A ROL F71A 2A ROL F71B 85 58 STA $58 F71D 2A ROL F71E 29 01 AND #$01 F720 05 57 ORA $57 F722 91 30 STA ($30),Y in buffer F724 C8 INY increment buffer F725 A5 54 LDA $54 F727 29 F0 AND #$F0 isolate hi-nibble F729 4A LSR A F72A 4A LSR A F72B 4A LSR A F72C 4A LSR A F72D AA TAX F72E BD 7F F7 LDA $F77F,X F731 18 CLC F732 6A ROR F733 05 58 ORA $58 F735 91 30 STA ($30),Y in buffer F737 C8 INY increment buffer pointer F738 6A ROR F739 29 80 AND #$80 F73B 85 59 STA $59 F73D A5 54 LDA $54 F73F 29 0F AND #$0F lower nibble F741 AA TAX as index F742 BD 7F F7 LDA $F77F,X F745 0A ASL A F746 0A ASL A F747 29 7C AND #$7C F749 05 59 ORA $59 F74B 85 59 STA $59 F74D A5 55 LDA $55 F74F 29 F0 AND #$F0 isolate hi-nibble F751 4A LSR A F752 4A LSR A shift to lower nibble F753 4A LSR A F754 4A LSR A F755 AA TAX as index in table F756 BD 7F F7 LDA $F77F,X F759 6A ROR F75A 66 5A ROR $5A F75C 6A ROR F75D 66 5A ROR $5A F75F 6A ROR F760 66 5A ROR $5A F762 29 03 AND #$03 F764 05 59 ORA $59 F766 91 30 STA ($30),Y in buffer F768 C8 INY increment buffer pointer F769 D0 04 BNE $F76F F76B A5 2F LDA $2F F76D 85 31 STA $31 F76F A5 55 LDA $55 F771 29 0F AND #$0F lower nibble F773 AA TAX as index F774 BD 7F F7 LDA $F77F,X F777 05 5A ORA $5A F779 91 30 STA ($30),Y in buffer F77B C8 INY increment buffer pointer F77C 84 34 STY $34 and save F77E 60 RTS ****************************** F77F 0A 0B 12 13 0E 0F 16 17 F787 09 19 1A 1B 0D 1D 1E 15 ****************************** F78F A9 00 LDA #$00 F791 85 30 STA $30 F793 85 2E STA $2E F795 85 36 STA $36 F797 A9 BB LDA #$BB F799 85 34 STA $34 F79B 85 50 STA $50 F79D A5 31 LDA $31 F79F 85 2F STA $2F F7A1 A9 01 LDA #$01 F7A3 85 31 STA $31 F7A5 A5 47 LDA $47 F7A7 85 52 STA $52 F7A9 A4 36 LDY $36 F7AB B1 2E LDA ($2E),Y F7AD 85 53 STA $53 F7AF C8 INY F7B0 B1 2E LDA ($2E),Y F7B2 85 54 STA $54 F7B4 C8 INY F7B5 B1 2E LDA ($2E),Y F7B7 85 55 STA $55 F7B9 C8 INY F7BA 84 36 STY $36 F7BC 20 D0 F6 JSR $F6D0 F7BF A4 36 LDY $36 F7C1 B1 2E LDA ($2E),Y F7C3 85 52 STA $52 F7C5 C8 INY F7C6 F0 11 BEQ $F7D9 F7C8 B1 2E LDA ($2E),Y F7CA 85 53 STA $53 F7CC C8 INY F7CD B1 2E LDA ($2E),Y F7CF 85 54 STA $54 F7D1 C8 INY F7D2 B1 2E LDA ($2E),Y F7D4 85 55 STA $55 F7D6 C8 INY F7D7 D0 E1 BNE $F7BA F7D9 A5 3A LDA $3A F7DB 85 53 STA $53 F7DD A9 00 LDA #$00 F7DF 85 54 STA $54 F7E1 85 55 STA $55 F7E3 4C D0 F6 JMP $F6D0 F7E6 A4 34 LDY $34 F7E8 B1 30 LDA ($30),Y F7EA 29 F8 AND #$F8 F7EC 4A LSR A F7ED 4A LSR A F7EE 4A LSR A F7EF 85 56 STA $56 F7F1 B1 30 LDA ($30),Y F7F3 29 07 AND #$07 F7F5 0A ASL A F7F6 0A ASL A F7F7 85 57 STA $57 F7F9 C8 INY F7FA D0 06 BNE $F802 F7FC A5 4E LDA $4E F7FE 85 31 STA $31 F800 A4 4F LDY $4F F802 B1 30 LDA ($30),Y F804 29 C0 AND #$C0 F806 2A ROL F807 2A ROL F808 2A ROL F809 05 57 ORA $57 F80B 85 57 STA $57 F80D B1 30 LDA ($30),Y F80F 29 3E AND #$3E F811 4A LSR A F812 85 58 STA $58 F814 B1 30 LDA ($30),Y F816 29 01 AND #$01 F818 0A ASL A F819 0A ASL A F81A 0A ASL A F81B 0A ASL A F81C 85 59 STA $59 F81E C8 INY F81F B1 30 LDA ($30),Y F821 29 F0 AND #$F0 F823 4A LSR A F824 4A LSR A F825 4A LSR A F826 4A LSR A F827 05 59 ORA $59 F829 85 59 STA $59 F82B B1 30 LDA ($30),Y F82D 29 0F AND #$0F F82F 0A ASL A F830 85 5A STA $5A F832 C8 INY F833 B1 30 LDA ($30),Y F835 29 80 AND #$80 F837 18 CLC F838 2A ROL F839 2A ROL F83A 29 01 AND #$01 F83C 05 5A ORA $5A F83E 85 5A STA $5A F840 B1 30 LDA ($30),Y F842 29 7C AND #$7C F844 4A LSR A F845 4A LSR A F846 85 5B STA $5B F848 B1 30 LDA ($30),Y F84A 29 03 AND #$03 F84C 0A ASL A F84D 0A ASL A F84E 0A ASL A F84F 85 5C STA $5C F851 C8 INY F852 D0 06 BNE $F85A F854 A5 4E LDA $4E F856 85 31 STA $31 F858 A4 4F LDY $4F F85A B1 30 LDA ($30),Y F85C 29 E0 AND #$E0 F85E 2A ROL F85F 2A ROL F860 2A ROL F861 2A ROL F862 05 5C ORA $5C F864 85 5C STA $5C F866 B1 30 LDA ($30),Y F868 29 1F AND #$1F F86A 85 5D STA $5D F86C C8 INY F86D 84 34 STY $34 F86F A6 56 LDX $56 F871 BD A0 F8 LDA $F8A0,X F874 A6 57 LDX $57 F876 1D C0 F8 ORA $F8C0,X F879 85 52 STA $52 F87B A6 58 LDX $58 F87D BD A0 F8 LDA $F8A0,X F880 A6 59 LDX $59 F882 1D C0 F8 ORA $F8C0,X F885 85 53 STA $53 F887 A6 5A LDX $5A F889 BD A0 F8 LDA $F8A0,X F88C A6 5B LDX $5B F88E 1D C0 F8 ORA $F8C0,X F891 85 54 STA $54 F893 A6 5C LDX $5C F895 BD A0 F8 LDA $F8A0,X F898 A6 5D LDX $5D F89A 1D C0 F8 ORA $F8C0,X F89D 85 55 STA $55 F89F 60 RTS ****************************** F8A0 FF FF FF FF FF FF FF FF F8A8 FF 80 00 10 FF C0 40 50 F8B0 FF FF 20 30 FF F0 60 70 F8B8 FF 90 A0 B0 FF D0 E0 FF F8C0 FF FF FF FF FF FF FF FF F8C8 FF 08 00 01 FF 0C 04 05 F8D0 FF FF 02 03 FF 0F 06 07 F8D8 FF 09 0A 0B FF 0D 0E FF ****************************** F8E0 A9 00 LDA #$00 F8E2 85 34 STA $34 F8E4 85 2E STA $2E F8E6 85 36 STA $36 F8E8 A9 01 LDA #$01 F8EA 85 4E STA $4E F8EC A9 BA LDA #$BA F8EE 85 4F STA $4F F8F0 A5 31 LDA $31 F8F2 85 2F STA $2F F8F4 20 E6 F7 JSR $F7E6 F8F7 A5 52 LDA $52 F8F9 85 38 STA $38 F8FB A4 36 LDY $36 F8FD A5 53 LDA $53 F8FF 91 2E STA ($2E),Y F901 C8 INY F902 A5 54 LDA $54 F904 91 2E STA ($2E),Y F906 C8 INY F907 A5 55 LDA $55 F909 91 2E STA ($2E),Y F90B C8 INY F90C 84 36 STY $36 F90E 20 E6 F7 JSR $F7E6 F911 A4 36 LDY $36 F913 A5 52 LDA $52 F915 91 2E STA ($2E),Y F917 C8 INY F918 F0 11 BEQ $F92B F91A A5 53 LDA $53 F91C 91 2E STA ($2E),Y F91E C8 INY F91F A5 54 LDA $54 F921 91 2E STA ($2E),Y F923 C8 INY F924 A5 55 LDA $55 F926 91 2E STA ($2E),Y F928 C8 INY F929 D0 E1 BNE $F90C F92B A5 53 LDA $53 F92D 85 3A STA $3A F92F A5 2F LDA $2F F931 85 31 STA $31 F933 60 RTS F934 A5 31 LDA $31 F936 85 2F STA $2F F938 A9 00 LDA #$00 F93A 85 31 STA $31 F93C A9 24 LDA #$24 F93E 85 34 STA $34 F940 A5 39 LDA $39 F942 85 52 STA $52 F944 A5 1A LDA $1A F946 85 53 STA $53 F948 A5 19 LDA $19 F94A 85 54 STA $54 F94C A5 18 LDA $18 F94E 85 55 STA $55 F950 20 D0 F6 JSR $F6D0 F953 A5 17 LDA $17 F955 85 52 STA $52 F957 A5 16 LDA $16 F959 85 53 STA $53 F95B A9 00 LDA #$00 F95D 85 54 STA $54 F95F 85 55 STA $55 F961 20 D0 F6 JSR $F6D0 F964 A5 2F LDA $2F F966 85 31 STA $31 F968 60 RTS F969 A4 3F LDY $3F F96B 99 00 00 STA $0000,Y F96E A5 50 LDA $50 F970 F0 03 BEQ $F975 F972 20 F2 F5 JSR $F5F2 F975 20 8F F9 JSR $F98F F978 A6 49 LDX $49 get stack pointer back F97A 9A TXS F97B 4C BE F2 JMP $F2BE F97E A9 A0 LDA #$A0 F980 85 20 STA $20 F982 AD 00 1C LDA $1C00 F985 09 04 ORA #$04 turn drive motor on F987 8D 00 1C STA $1C00 F98A A9 3C LDA #$3C F98C 85 48 STA $48 F98E 60 RTS F98F A6 3E LDX $3E F991 A5 20 LDA $20 F993 09 10 ORA #$10 turn drive motor off F995 85 20 STA $20 F997 A9 FF LDA #$FF F999 85 48 STA $48 F99B 60 RTS F99C AD 07 1C LDA $1C07 F99F 8D 05 1C STA $1C05 F9A2 AD 00 1C LDA $1C00 F9A5 29 10 AND #$10 write protect? F9A7 C5 1E CMP $1E F9A9 85 1E STA $1E F9AB F0 04 BEQ $F9B1 F9AD A9 01 LDA #$01 F9AF 85 1C STA $1C F9B1 AD FE 02 LDA $02FE F9B4 F0 15 BEQ $F9CB F9B6 C9 02 CMP #$02 F9B8 D0 07 BNE $F9C1 F9BA A9 00 LDA #$00 F9BC 8D FE 02 STA $02FE F9BF F0 0A BEQ $F9CB F9C1 85 4A STA $4A F9C3 A9 02 LDA #$02 F9C5 8D FE 02 STA $02FE F9C8 4C 2E FA JMP $FA2E F9CB A6 3E LDX $3E F9CD 30 07 BMI $F9D6 F9CF A5 20 LDA $20 F9D1 A8 TAY F9D2 C9 20 CMP #$20 F9D4 D0 03 BNE $F9D9 F9D6 4C BE FA JMP $FABE F9D9 C6 48 DEC $48 F9DB D0 1D BNE $F9FA F9DD 98 TYA F9DE 10 04 BPL $F9E4 F9E0 29 7F AND #$7F F9E2 85 20 STA $20 F9E4 29 10 AND #$10 F9E6 F0 12 BEQ $F9FA F9E8 AD 00 1C LDA $1C00 F9EB 29 FB AND #$FB drive motor off F9ED 8D 00 1C STA $1C00 F9F0 A9 FF LDA #$FF F9F2 85 3E STA $3E F9F4 A9 00 LDA #$00 F9F6 85 20 STA $20 F9F8 F0 DC BEQ $F9D6 F9FA 98 TYA F9FB 29 40 AND #$40 F9FD D0 03 BNE $FA02 F9FF 4C BE FA JMP $FABE FA02 6C 62 00 JMP ($0062) FA05 A5 4A LDA $4A FA07 10 05 BPL $FA0E FA09 49 FF EOR #$FF FA0B 18 CLC FA0C 69 01 ADC #$01 FA0E C5 64 CMP $64 FA10 B0 0A BCS $FA1C FA12 A9 3B LDA #$3B FA14 85 62 STA $62 FA16 A9 FA LDA #$FA pointer $62/$63 to $FA3B FA18 85 63 STA $63 FA1A D0 12 BNE $FA2E FA1C E5 5E SBC $5E FA1E E5 5E SBC $5E FA20 85 61 STA $61 FA22 A5 5E LDA $5E FA24 85 60 STA $60 FA26 A9 7B LDA #$7B FA28 85 62 STA $62 FA2A A9 FA LDA #$FA pointer $62/$63 to $FA7B FA2C 85 63 STA $63 FA2E A5 4A LDA $4A step counter for head transport FA30 10 31 BPL $FA63 FA32 E6 4A INC $4A increment FA34 AE 00 1C LDX $1C00 FA37 CA DEX FA38 4C 69 FA JMP $FA69 ****************************** FA3B A5 4A LDA $4A step counter for head transport FA3D D0 EF BNE $FA2E not yet zero? FA3F A9 4E LDA #$4E FA41 85 62 STA $62 FA43 A9 FA LDA #$FA pointer $62/$63 to $FA4E FA45 85 63 STA $63 FA47 A9 05 LDA #$05 FA49 85 60 STA $60 counter to 5 FA4B 4C BE FA JMP $FABE ****************************** FA4E C6 60 DEC $60 decrement counter FA50 D0 6C BNE $FABE not yet zero? FA52 A5 20 LDA $20 FA54 29 BF AND #$BF erase bit 6 FA56 85 20 STA $20 FA58 A9 05 LDA #$05 FA5A 85 62 STA $62 FA5C A9 FA LDA #$FA pointer $62/$63 to $FA05 FA5E 85 63 STA $63 FA60 4C BE FA JMP $FABE ****************************** FA63 C6 4A DEC $4A step counter for head transport FA65 AE 00 1C LDX $1C00 FA68 E8 INX FA69 8A TXA FA6A 29 03 AND #$03 FA6C 85 4B STA $4B FA6E AD 00 1C LDA $1C00 FA71 29 FC AND #$FC FA73 05 4B ORA $4B stepper motor off FA75 8D 00 1C STA $1C00 FA78 4C BE FA JMP $FABE ****************************** FA7B 38 SEC FA7C AD 07 1C LDA $1C07 FA7F E5 5F SBC $5F FA81 8D 05 1C STA $1C05 FA84 C6 60 DEC $60 decrement counter FA86 D0 0C BNE $FA94 not yet zero? FA88 A5 5E LDA $5E FA8A 85 60 STA $60 FA8C A9 97 LDA #$97 FA8E 85 62 STA $62 FA90 A9 FA LDA #$FA pointer $62/$63 to $FA97 FA92 85 63 STA $63 FA94 4C 2E FA JMP $FA2E ****************************** FA97 C6 61 DEC $61 FA99 D0 F9 BNE $FA94 FA9B A9 A5 LDA #$A5 FA9D 85 62 STA $62 FA9F A9 FA LDA #$FA pointer $62/$63 to $FAA5 FAA1 85 63 STA $63 FAA3 D0 EF BNE $FA94 ****************************** FAA5 AD 07 1C LDA $1C07 FAA8 18 CLC FAA9 65 5F ADC $5F FAAB 8D 05 1C STA $1C05 FAAE C6 60 DEC $60 decrement counter FAB0 D0 E2 BNE $FA94 not yet zero? FAB2 A9 4E LDA #$4E FAB4 85 62 STA $62 FAB6 A9 FA LDA #$FA pointer $62/$63 to $FA4E FAB8 85 63 STA $63 FABA A9 05 LDA #$05 FABC 85 60 STA $60 counter to 5 FABE AD 0C 1C LDA $1C0C FAC1 29 FD AND #$FD erase bit 1 FAC3 8D 0C 1C STA $1C0C FAC6 60 RTS ****************************** formatting FAC7 A5 51 LDA $51 track number FAC9 10 2A BPL $FAF5 formatting already in progress FACB A6 3D LDX $3D drive number FACD A9 60 LDA #$60 flag for head transport FACF 95 20 STA $20,X set FAD1 A9 01 LDA #$01 FAD3 95 22 STA $22,X set destination track FAD5 85 51 STA $51 running track number for format FAD7 A9 A4 LDA #$A4 164 FAD9 85 4A STA $4A step counter for head transport FADB AD 00 1C LDA $1C00 FADE 29 FC AND #$FC stepper motor on FAE0 8D 00 1C STA $1C00 FAE3 A9 0A LDA #$0A 10 FAE5 8D 20 06 STA $0620 error counter FAE8 A9 A0 LDA #$A0 $621/$622 = 4000 FAEA 8D 21 06 STA $0621 initialize track capacity FAED A9 0F LDA #$0F 4000 < capacity < 2*4000 bytes FAEF 8D 22 06 STA $0622 FAF2 4C 9C F9 JMP $F99C back in job loop FAF5 A0 00 LDY #$00 FAF7 D1 32 CMP ($32),Y FAF9 F0 05 BEQ $FB00 FAFB 91 32 STA ($32),Y FAFD 4C 9C F9 JMP $F99C to job loop FB00 AD 00 1C LDA $1C00 FB03 29 10 AND #$10 write protect? FB05 D0 05 BNE $FB0C no FB07 A9 08 LDA #$08 FB09 4C D3 FD JMP $FDD3 26, 'write protect on' FB0C 20 A3 FD JSR $FDA3 write $FF to disk 10240 times FB0F 20 C3 FD JSR $FDC3 code ($621/$622) times to disk FB12 A9 55 LDA #$55 $55 FB14 8D 01 1C STA $1C01 to write head FB17 20 C3 FD JSR $FDC3 and ($621/$622) times to disk FB1A 20 00 FE JSR $FE00 switch to read FB1D 20 56 F5 JSR $F556 set timer, find $FF (SYNC) FB20 A9 40 LDA #$40 FB22 0D 0B 18 ORA $180B timer 1 free running FB25 8D 0B 18 STA $180B FB28 A9 62 LDA #$62 98 cycles, about 0.1 ms FB2A 8D 06 18 STA $1806 FB2D A9 00 LDA #$00 FB2F 8D 07 18 STA $1807 FB32 8D 05 18 STA $1805 start timer FB35 A0 00 LDY #$00 counter to zero FB37 A2 00 LDX #$00 FB39 2C 00 1C BIT $1C00 SYNC found? FB3C 30 FB BMI $FB39 no, wait FB3E 2C 00 1C BIT $1C00 SYNC found? FB41 10 FB BPL $FB3E wait for SYNC FB43 AD 04 18 LDA $1804 reset interrupt flag timer FB46 2C 00 1C BIT $1C00 SYNC found? FB49 10 11 BPL $FB5C not SYNC ($55)? FB4B AD 0D 18 LDA $180D interrupt flag register FB4E 0A ASL A shift timer flag FB4F 10 F5 BPL $FB46 timer not run down yet? FB51 E8 INX increment counter FB52 D0 EF BNE $FB43 FB54 C8 INY increment hi-byte of counter FB55 D0 EC BNE $FB43 FB57 A9 02 LDA #$02 overflow, then error FB59 4C D3 FD JMP $FDD3 20, 'read error' FB5C 86 71 STX $71 FB5E 84 72 STY $72 FB60 A2 00 LDX #$00 FB62 A0 00 LDY #$00 counter to zero again FB64 AD 04 18 LDA $1804 reset timer 1 interrupt flag FB67 2C 00 1C BIT $1C00 SYNC found? FB6A 30 11 BMI $FB7D yes FB6C AD 0D 18 LDA $180D interrupt-flag register FB6F 0A ASL A timer flag to bit 7 FB70 10 F5 BPL $FB67 no, wait until timer run down FB72 E8 INX FB73 D0 EF BNE $FB64 increment counter FB75 C8 INY FB76 D0 EC BNE $FB64 FB78 A9 02 LDA #$02 overflow, then error FB7A 4C D3 FD JMP $FDD3 20, 'read error' FB7D 38 SEC FB7E 8A TXA FB7F E5 71 SBC $71 difference between counter FB81 AA TAX FB82 85 70 STA $70 FB84 98 TYA and value for $FF-storage FB85 E5 72 SBC $72 FB87 A8 TAY bring to $70/$71 FB88 85 71 STA $71 FB8A 10 0B BPL $FB97 difference positive? FB8C 49 FF EOR #$FF FB8E A8 TAY FB8F 8A TXA FB90 49 FF EOR #$FF calculate absolute value of difference FB92 AA TAX FB93 E8 INX FB94 D0 01 BNE $FB97 FB96 C8 INY FB97 98 TYA FB98 D0 04 BNE $FB9E FB9A E0 04 CPX #$04 difference less than 4 * 0.1 ms FB9C 90 18 BCC $FBB6 yes FB9E 06 70 ASL $70 FBA0 26 71 ROL $71 double difference FBA2 18 CLC FBA3 A5 70 LDA $70 FBA5 6D 21 06 ADC $0621 FBA8 8D 21 06 STA $0621 add to 4000 FBAB A5 71 LDA $71 FBAD 6D 22 06 ADC $0622 FBB0 8D 22 06 STA $0622 FBB3 4C 0C FB JMP $FB0C repeat until difference < 4 * 0.1 ms FBB6 A2 00 LDX #$00 FBB8 A0 00 LDY #$00 counter to zero FBBA B8 CLV FBBB AD 00 1C LDA $1C00 SYNC? FBBE 10 0E BPL $FBCE no FBC0 50 F9 BVC $FBBB byte ready? FBC2 B8 CLV FBC3 E8 INX FBC4 D0 F5 BNE $FBBB increment counter FBC6 C8 INY FBC7 D0 F2 BNE $FBBB FBC9 A9 03 LDA #$03 overflow, then error FBCB 4C D3 FD JMP $FDD3 21, 'read error' FBCE 8A TXA FBCF 0A ASL A double counter FBD0 8D 25 06 STA $0625 FBD3 98 TYA FBD4 2A ROL FBD5 8D 24 06 STA $0624 and to $624/$625 as track capacity FBD8 A9 BF LDA #$BF FBDA 2D 0B 18 AND $180B FBDD 8D 0B 18 STA $180B FBE0 A9 66 LDA #$66 102 FBE2 8D 26 06 STA $0626 FBE5 A6 43 LDX $43 number of sectors in this track FBE7 A0 00 LDY #$00 FBE9 98 TYA FBEA 18 CLC FBEB 6D 26 06 ADC $0626 FBEE 90 01 BCC $FBF1 FBF0 C8 INY FBF1 C8 INY FBF2 CA DEX FBF3 D0 F5 BNE $FBEA calculate number of bytes FBF5 49 FF EOR #$FF FBF7 38 SEC FBF8 69 00 ADC #$00 FBFA 18 CLC FBFB 6D 25 06 ADC $0625 FBFE B0 03 BCS $FC03 FC00 CE 24 06 DEC $0624 FC03 AA TAX FC04 98 TYA FC05 49 FF EOR #$FF FC07 38 SEC FC08 69 00 ADC #$00 FC0A 18 CLC FC0B 6D 24 06 ADC $0624 result in A/X FC0E 10 05 BPL $FC15 FC10 A9 04 LDA #$04 FC12 4C D3 FD JMP $FDD3 22, 'read error' FC15 A8 TAY FC16 8A TXA FC17 A2 00 LDX #$00 FC19 38 SEC total divided by number FC1A E5 43 SBC $43 of sectors ($43) FC1C B0 03 BCS $FC21 FC1E 88 DEY FC1F 30 03 BMI $FC24 FC21 E8 INX FC22 D0 F5 BNE $FC19 FC24 8E 26 06 STX $0626 compare number of bytes per interval FC27 E0 04 CPX #$04 with minimum value FC29 B0 05 BCS $FC30 ok FC2B A9 05 LDA #$05 FC2D 4C D3 FD JMP $FDD3 23, 'read error' FC30 18 CLC remainder of division FC31 65 43 ADC $43 plus number of sectors FC33 8D 27 06 STA $0627 save FC36 A9 00 LDA #$00 FC38 8D 28 06 STA $0628 counter for sectors FC3B A0 00 LDY #$00 counter lo FC3D A6 3D LDX $3D drive number FC3F A5 39 LDA $39 constant 8, marker for header FC41 99 00 03 STA $0300,Y in buffer FC44 C8 INY FC45 C8 INY FC46 AD 28 06 LDA $0628 sector number FC49 99 00 03 STA $0300,Y in buffer FC4C C8 INY FC4D A5 51 LDA $51 track number FC4F 99 00 03 STA $0300,Y in buffer FC52 C8 INY FC53 B5 13 LDA $13,X ID 2 FC55 99 00 03 STA $0300,Y in buffer FC58 C8 INY FC59 B5 12 LDA $12,X ID 1 FC5B 99 00 03 STA $0300,Y in buffer FC5E C8 INY FC5F A9 0F LDA #$0F 15 FC61 99 00 03 STA $0300,Y in buffer FC64 C8 INY FC65 99 00 03 STA $0300,Y 15 in buffer FC68 C8 INY FC69 A9 00 LDA #$00 FC6B 59 FA 02 EOR $02FA,Y FC6E 59 FB 02 EOR $02FB,Y FC71 59 FC 02 EOR $02FC,Y generate checksum FC74 59 FD 02 EOR $02FD,Y FC77 99 F9 02 STA $02F9,Y FC7A EE 28 06 INC $0628 increment counter FC7D AD 28 06 LDA $0628 counter FC80 C5 43 CMP $43 compare with number of sectors FC82 90 BB BCC $FC3F smaller, then continue FC84 98 TYA FC85 48 PHA FC86 E8 INX FC87 8A TXA FC88 9D 00 05 STA $0500,X FC8B E8 INX FC8C D0 FA BNE $FC88 FC8E A9 03 LDA #$03 buffer pointer to $300 FC90 85 31 STA $31 FC92 20 30 FE JSR $FE30 FC95 68 PLA FC96 A8 TAY FC97 88 DEY FC98 20 E5 FD JSR $FDE5 copy buffer data FC9B 20 F5 FD JSR $FDF5 copy data in buffer FC9E A9 05 LDA #$05 FCA0 85 31 STA $31 buffer pointer to $500 FCA2 20 E9 F5 JSR $F5E9 calculate parity for data buffer FCA5 85 3A STA $3A and save FCA7 20 8F F7 JSR $F78F FCAA A9 00 LDA #$00 FCAC 85 32 STA $32 FCAE 20 0E FE JSR $FE0E FCB1 A9 FF LDA #$FF FCB3 8D 01 1C STA $1C01 to write head FCB6 A2 05 LDX #$05 write $FF 5 times FCB8 50 FE BVC $FCB8 byte ready FCBA B8 CLV FCBB CA DEX FCBC D0 FA BNE $FCB8 FCBE A2 0A LDX #$0A 10 times FCC0 A4 32 LDY $32 buffer pointer FCC2 50 FE BVC $FCC2 byte ready? FCC4 B8 CLV FCC5 B9 00 03 LDA $0300,Y data from buffer FCC8 8D 01 1C STA $1C01 write FCCB C8 INY FCCC CA DEX 10 data written? FCCD D0 F3 BNE $FCC2 FCCF A2 09 LDX #$09 9 times FCD1 50 FE BVC $FCD1 byte ready? FCD3 B8 CLV FCD4 A9 55 LDA #$55 $55 FCD6 8D 01 1C STA $1C01 write FCD9 CA DEX FCDA D0 F5 BNE $FCD1 9 times? FCDC A9 FF LDA #$FF $FF FCDE A2 05 LDX #$05 5 times FCE0 50 FE BVC $FCE0 byte ready? FCE2 B8 CLV FCE3 8D 01 1C STA $1C01 to write head FCE6 CA DEX FCE7 D0 F7 BNE $FCE0 FCE9 A2 BB LDX #$BB FCEB 50 FE BVC $FCEB FCED B8 CLV FCEE BD 00 01 LDA $0100,X area $1BB to $1FF FCF1 8D 01 1C STA $1C01 save FCF4 E8 INX FCF5 D0 F4 BNE $FCEB FCF7 A0 00 LDY #$00 FCF9 50 FE BVC $FCF9 byte ready? FCFB B8 CLV FCFC B1 30 LDA ($30),Y 256 bytes of data FCFE 8D 01 1C STA $1C01 write byte to disk FD01 C8 INY FD02 D0 F5 BNE $FCF9 FD04 A9 55 LDA #$55 $55 FD06 AE 26 06 LDX $0626 ($626) times FD09 50 FE BVC $FD09 FD0B B8 CLV FD0C 8D 01 1C STA $1C01 write FD0F CA DEX FD10 D0 F7 BNE $FD09 FD12 A5 32 LDA $32 FD14 18 CLC FD15 69 0A ADC #$0A plus 10 FD17 85 32 STA $32 FD19 CE 28 06 DEC $0628 decrement sector number FD1C D0 93 BNE $FCB1 FD1E 50 FE BVC $FD1E byte ready? FD20 B8 CLV FD21 50 FE BVC $FD21 byte ready? FD23 B8 CLV FD24 20 00 FE JSR $FE00 switch to reading FD27 A9 C8 LDA #$C8 200 FD29 8D 23 06 STA $0623 FD2C A9 00 LDA #$00 FD2E 85 30 STA $30 FD30 A9 03 LDA #$03 buffer pointer to $200 FD32 85 31 STA $31 FD34 A5 43 LDA $43 number of sectors per track FD36 8D 28 06 STA $0628 FD39 20 56 F5 JSR $F556 wait for SYNC FD3C A2 0A LDX #$0A 10 data FD3E A0 00 LDY #$00 FD40 50 FE BVC $FD40 byte ready? FD42 B8 CLV FD43 AD 01 1C LDA $1C01 read byte FD46 D1 30 CMP ($30),Y compare with data in buffer FD48 D0 0E BNE $FD58 not equal, error FD4A C8 INY FD4B CA DEX FD4C D0 F2 BNE $FD40 FD4E 18 CLC FD4F A5 30 LDA $30 FD51 69 0A ADC #$0A increment pointer by 10 FD53 85 30 STA $30 FD55 4C 62 FD JMP $FD62 FD58 CE 23 06 DEC $0623 decrement counter for attempts FD5B D0 CF BNE $FD2C not yet zero? FD5D A9 06 LDA #$06 else error FD5F 4C D3 FD JMP $FDD3 24, 'read error' FD62 20 56 F5 JSR $F556 wait for SYNC FD65 A0 BB LDY #$BB FD67 50 FE BVC $FD67 byte ready? FD69 B8 CLV FD6A AD 01 1C LDA $1C01 read byte FD6D D9 00 01 CMP $0100,Y compare with buffer contents FD70 D0 E6 BNE $FD58 not equal, error FD72 C8 INY FD73 D0 F2 BNE $FD67 next byte FD75 A2 FC LDX #$FC FD77 50 FE BVC $FD77 byte ready? FD79 B8 CLV FD7A AD 01 1C LDA $1C01 read byte FD7D D9 00 05 CMP $0500,Y compare with buffer contents FD80 D0 D6 BNE $FD58 not equal, then error FD82 C8 INY FD83 CA DEX next byte FD84 D0 F1 BNE $FD77 FD86 CE 28 06 DEC $0628 decrement sector counter FD89 D0 AE BNE $FD39 not yet zero? FD8B E6 51 INC $51 increment track number FD8D A5 51 LDA $51 FD8F C9 24 CMP #$24 compare with 36, highest track number + 1 FD91 B0 03 BCS $FD96 greater, then formatting done FD93 4C 9C F9 JMP $F99C continue FD96 A9 FF LDA #$FF FD98 85 51 STA $51 track number to $FF FD9A A9 00 LDA #$00 FD9C 85 50 STA $50 FD9E A9 01 LDA #$01 FDA0 4C 69 F9 JMP $F969 ok ****************************** write $FF 10240 times FDA3 AD 0C 1C LDA $1C0C FDA6 29 1F AND #$1F switch PCR to writing FDA8 09 C0 ORA #$C0 FDAA 8D 0C 1C STA $1C0C FDAD A9 FF LDA #$FF FDAF 8D 03 1C STA $1C03 port A (read/write head) to output FDB2 8D 01 1C STA $1C01 write $FF to disk FDB5 A2 28 LDX #$28 40 FDB7 A0 00 LDY #$00 FDB9 50 FE BVC $FDB9 byte ready? FDBB B8 CLV FDBC 88 DEY FDBD D0 FA BNE $FDB9 FDBF CA DEX FDC0 D0 F7 BNE $FDB9 FDC2 60 RTS ****************************** read/write ($621/$622) times FDC3 AE 21 06 LDX $0621 FDC6 AC 22 06 LDY $0622 FDC9 50 FE BVC $FDC9 byte ready? FDCB B8 CLV FDCC CA DEX FDCD D0 FA BNE $FDC9 FDCF 88 DEY FDD0 10 F7 BPL $FDC9 FDD2 60 RTS ****************************** attempt counter for formatting FDD3 CE 20 06 DEC $0620 decrement number of attempts FDD6 F0 03 BEQ $FDDB zero, then error FDD8 4C 9C F9 JMP $F99C continue FDDB A0 FF LDY #$FF FDDD 84 51 STY $51 flag for end of formatting FDDF C8 INY FDE0 84 50 STY $50 FDE2 4C 69 F9 JMP $F969 error termination ****************************** FDE5 B9 00 03 LDA $0300,Y FDE8 99 45 03 STA $0345,Y FDEB 88 DEY copy buffer contents FDEC D0 F7 BNE $FDE5 FDEE AD 00 03 LDA $0300 FDF1 8D 45 03 STA $0345 FDF4 60 RTS ****************************** copy data from overflow buffer FDF5 A0 44 LDY #$44 FDF7 B9 BB 01 LDA $01BB,Y $1BB to $1FF FDFA 91 30 STA ($30),Y write in buffer $30/$31 FDFC 88 DEY FDFD 10 F8 BPL $FDF7 FDFF 60 RTS ****************************** switch to reading FE00 AD 0C 1C LDA $1C0C FE03 09 E0 ORA #$E0 switch PCR to reading FE05 8D 0C 1C STA $1C0C FE08 A9 00 LDA #$00 FE0A 8D 03 1C STA $1C03 port A to input FE0D 60 RTS ****************************** write $55 10240 times FE0E AD 0C 1C LDA $1C0C FE11 29 1F AND #$1F FE13 09 C0 ORA #$C0 switch PCR to writing FE15 8D 0C 1C STA $1C0C FE18 A9 FF LDA #$FF FE1A 8D 03 1C STA $1C03 port A to output (write head) FE1D A9 55 LDA #$55 %01010101 FE1F 8D 01 1C STA $1C01 to port A (write head) FE22 A2 28 LDX #$28 FE24 A0 00 LDY #$00 FE26 50 FE BVC $FE26 byte ready for write electronics FE28 B8 CLV FE29 88 DEY FE2A D0 FA BNE $FE26 10240 times FE2C CA DEX FE2D D0 F7 BNE $FE26 FE2F 60 RTS ****************************** convert header in buffer 0 to GCR code FE30 A9 00 LDA #$00 FE32 85 30 STA $30 FE34 85 2E STA $2E FE36 85 36 STA $36 FE38 A9 BB LDA #$BB FE3A 85 34 STA $34 FE3C A5 31 LDA $31 FE3E 85 2F STA $2F FE40 A9 01 LDA #$01 FE42 85 31 STA $31 FE44 A4 36 LDY $36 FE46 B1 2E LDA ($2E),Y FE48 85 52 STA $52 FE4A C8 INY FE4B B1 2E LDA ($2E),Y FE4D 85 53 STA $53 FE4F C8 INY FE50 B1 2E LDA ($2E),Y FE52 85 54 STA $54 FE54 C8 INY FE55 B1 2E LDA ($2E),Y FE57 85 55 STA $55 FE59 C8 INY FE5A F0 08 BEQ $FE64 FE5C 84 36 STY $36 FE5E 20 D0 F6 JSR $F6D0 FE61 4C 44 FE JMP $FE44 FE64 4C D0 F6 JMP $F6D0 ****************************** interrupt routine FE67 48 PHA FE68 8A TXA FE69 48 PHA save registers FE6A 98 TYA FE6B 48 PHA FE6C AD 0D 18 LDA $180D interrupt from serial bus? FE6F 29 02 AND #$02 FE71 F0 03 BEQ $FE76 no FE73 20 53 E8 JSR $E853 serve serial bus FE76 AD 0D 1C LDA $1C0D interrupt from timer 1? FE79 0A ASL A FE7A 10 03 BPL $FE7F no FE7C 20 B0 F2 JSR $F2B0 IRQ routine for disk controller FE7F 68 PLA FE80 A8 TAY FE81 68 PLA get registers back FE82 AA TAX FE83 68 PLA FE84 40 RTI ****************************** constants for disk format FE85 12 18, track for BAM and directory FE86 04 start of BAM at position 4 FE87 04 4 bytes in BAM for each track FE88 90 $90 = 144, end of BAM, disk name ****************************** table of command words FE89 56 49 44 4D 42 55 'V', 'I', 'D', 'M', 'B', 'U' FE8F 50 26 43 52 53 4E 'P', '&', 'C', 'R', 'S', 'N' ****************************** low byte of command addresses FE95 84 05 C1 F8 1B 5C FE9B 07 A3 F0 88 23 0D ****************************** high byte of command addresses FEA1 ED D0 C8 CA CC CB FEA7 E2 E7 C8 CA C8 EE ****************************** bytes for syntax check FEAD 51 DD 1C 9E 1C ****************************** file control methods FEB2 52 57 41 4D 'R', 'W', 'A', 'M' ****************************** file types FEB6 44 53 50 55 4C 'D', 'S', 'P', 'U', 'L' ****************************** names of file types FEBB 44 53 50 55 52 1st letters 'D', 'S', 'P', 'U', 'R' FEC0 45 45 52 53 45 2nd letters 'E', 'E', 'R', 'S', 'E' FEC5 4C 51 47 52 4C 3rd letters 'L', 'Q', 'G', 'R', 'L' ****************************** FECA 08 00 00 ****************************** masks for bit command FECD 3F 7F BF FF ****************************** number of sectors per track FED1 11 12 13 15 17, 18, 19, 21 ****************************** constants for disk format FED5 41 'A' marker for 1541 format FED6 04 4 track numbers FED7 24 36, highest track number + 1 FED8 1F 19 12 31, 25, 18 tracks with change of number of sectors ****************************** control bytes for head postion FEDB 01 FF FF 01 00 ****************************** addresses of buffers FEE0 03 04 05 06 07 high bytes ****************************** FEE5 07 0E ****************************** for UI command FEE7 6C 65 00 JMP ($0065) ****************************** for diagnostic routine FEEA 8D 00 1C STA $1C00 turn LED on FEED 8D 02 1C STA $1C02 port to output FEF0 4C 7D EA JMP $EA7D back to diagnostic routine ****************************** delay loop for serial bus FEF3 8A TXA FEF4 A2 05 LDX #$05 FEF6 CA DEX about 40 microseconds FEF7 D0 FD BNE $FEF6 FEF9 AA TAX FEFA 60 RTS ****************************** data output to serial bus FEFB 20 AE E9 JSR $E9AE CLOCK OUT hi FEFE 4C 9C E9 JMP $E99C DATA OUT lo ****************************** UI vector FF01 AD 02 02 LDA $0202 FF04 C9 2D CMP #$2D '-' FF06 F0 05 BEQ $FF0D FF08 38 SEC FF09 E9 2B SBC #$2B '+' FF0B D0 DA BNE $FEE7 indirect jump over ($0065) FF0D 85 23 STA $23 FF0F 60 RTS ****************************** FF10 AA ... FFE1 ... AA ****************************** FFE2 52 53 52 AA FFE6 C6 C8 $C8C6 format FFE8 8F F9 $F98F turn motor off ****************************** USER vectors FFEA 5F CD UA, U1, $CD5F FFEC 97 CD UB, U2, $CD97 FFEE 00 05 UC, U3, $0500 FFF0 03 05 UD, U4, $0503 FFF2 06 05 UE, U5, $0506 FFF4 09 05 UF, U6, $0509 FFF6 0C 05 UG, U7, $050C FFF8 0F 05 UH, U8, $050F FFFA 01 FF UI, U9, $FF01 (NMI vector not used) ****************************** hardware vectors FFFC A0 EA $EAA0 RESET and UJ (U:) vector FFFE 67 FE $FE67 IRQ vector |