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