DOS 2.6 ROM LISTINGS
Version 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 8