; *** text follows ***
*=$E000
; This is a commented disassembly of the DOS V1 as used
; in the Commodore 2040 dual disk drive. The disassembly
; is taken from the images of the ROM chips named
; "901468-06.bin" and "901468-07.bin".
; ;
; Technically the disassembly was produced and merged
; with the comments using the "recomment" utility
; (version 4.08 at least).
; ;
; To create the comments, I compared the ROM source code
; of the 4040 dual disk drive with DOS V2. The uppercase
; comments are copied from the 4040 DOS. I have added the
; (few) lowercase comments myself.
; ;
; In general there is only littel code that remains unchanged,
; if any at all. A lot of code only has minor changes, though.
; Some code has major changes.
; ;
; I found an interesting comment for routine "USER" in the 4040
; ROM. The comment is "ROM 1.1 ADDITIONS" and seems to indicate
; that there was a version before the 2040 DOS version,
; because the USER command already exists in the 2040.
; ;
; I was unable to completely relate the code to the new version
; as used in the 4040. I could not relate the following methods:
; ED53
; F482
; F67A, F80F, F851
; ;
; 15. May 2005 Andre Fachat (afachat@gmx.de)
; ;
; INIT-DRIVE VEIFY-DIR DUPLICATE MEMORY-OP BLOCK-OP USER POSITION DSKCPY RENAME SCRATCH NEW
E000 CMDTBL .byte $49, $56, $44, $4D, $42, $55, $43, $52 ;ivdmbucr
E008 .byte $53, $4E ;sn
; <INTDRV, <VERDIR, <DUPLCT, <MEM, <BLOCK, <USER, <DSKCPY, <RENAME, <SCRTCH, <NEW
E00A CJUMPL .byte $A8, $37, $ED, $ED, $E5, $43, $47, $D3 ;(7...cgS
E012 .byte $73, $C8 ;SH
; >INTDRV, >VERDIR, >DUPLCT, >MEM, >BLOCK, >USER, >DSKCPY, >RENAME, >SCRTCH, >NEW
E014 CJUMPH .byte $E8, $FC, $F9, $FC, $FD, $FD, $FB, $FB ;........
E01C .byte $F9, $F8
; ;
; original 4040 comment for the next bytes
; the bytes for RENAMEi ($dd), SCRATCH ($1c) and NEW ($9e) seem to be the same at the
; same place, but DSKCPY is different (here $d9, in 4040 it's $51)
; and LOAD is missing here.
; e
; ; STRUCTURE IMAGES FOR CMDS
; PCMD =8
; .BYT %01010001 ; DSKCPY
; STRUCT =*-PCMD ; CMDS NOT PARSED
; .BYT %11011101 ; RENAME
; .BYT %00011100 ; SCRATCH
; .BYT %10011110 ; NEW
; LDCMD =*-STRUCT ; LOAD CMD IMAGE
; .BYT %00011100 ; LOAD
; ; --- ---
; ; PGDRPGDR
; ; FS1 FS2
; ;
; ; BIT REPS: NOT PATTERN
; ; NOT GREATER THAN ONE FILE
; ; NOT DEFAULT DRIVE(S)
; ; REQUIRED FILENAME
, $D9, $DD, $1C, $9E ;..Y.\.
; number of sectors per track (from hi to lo)
E022 TRKTBL .byte $15, $14, $12, $11 ;utrq
; highest track of each speed zone
E026 CHGTRACKS .byte $11, $18, $1E, $23 ;qx^#
; last byte of a BAM track entry per speed zone
E02A BAMEND .byte $1F, $0F, $03, $01 ;_oca
; list of file modes
E02E MODLST .byte $52, $57, $4D ;rwm
; filetypes available "DEL", "SEQ", "PRG", "USR". Note: no "REL"!
E031 TYPLST .byte $44, $53, $50, $55 ;dspu
E035 TP1LST .byte $45, $45, $52, $53 ;eers
E039 TP2LST .byte $4C, $51, $47, $52 ;lqgr
; ;
E03D .byte $AA, $AA, $DA ;**Z
; start of special routine to be copied to controller buffer
E040 CODE .byte $A5, $1B, $10, $3A, $78, $A9, $C1, $95 ;%[p:X)A.
E048 .byte $03, $A9, $0F, $3D, $EF, $FF, $05, $40 ;c)o=..e@
E050 .byte $85, $40, $A9, $8C, $95, $05, $58, $B5 ;.@)..ex5
E058 .byte $05, $D0, $FC, $98, $0A, $0A, $0A, $18 ;eP..jjjx
E060 .byte $69, $21, $85, $18, $A0, $00, $84, $1F ;I!.x .._
E068 .byte $C8, $84, $1B, $C8, $B1, $18, $29, $C0 ;H.[H1x).
E070 .byte $09, $01, $91, $18, $A4, $1A, $29, $3F ;ia.x$z)?
E078 .byte $99, $12, $04, $4C, $47, $FC, $D9, $12 ;.rdlg.Yr
E080 .byte $04, $D0, $F5, $78, $A9, $19, $85, $0A ;dP.X)y.j
E088 .byte $A0, $03, $A9, $00, $91, $18, $A9, $10 ; c)..x)p
E090 .byte $85, $4E, $A9, $DC, $85, $4C, $A9, $08 ;.n)..l)h
E098 .byte $25, $82, $F0, $05, $A9, $08, $4C, $C3 ;%..e)hlC
E0A0 .byte $FE, $A0, $03, $A9, $00, $51, $18, $88 ;. c).qx.
E0A8 .byte $10, $FB, $A0, $04, $91, $18, $A2, $FF ;p. d.x".
E0B0 .byte $86, $81, $84, $08, $E8, $A0, $00, $20 ;...h. .
E0B8 .byte $7C, $FF, $88, $D0, $FA, $C6, $08, $D0 ;|..P.FhP
E0C0 .byte $F6, $A2, $00, $A0, $00, $20, $7C, $FF ;.". . |.
E0C8 .byte $88, $D0, $FA, $A9, $DE, $86, $08, $CA ;.P.)..hJ
E0D0 .byte $20, $7C, $FF, $85, $4C, $20, $7C, $FF ; |..l |.
E0D8 .byte $A9, $DC, $A2, $08, $20, $7C, $FF, $85 ;)."h |..
E0E0 .byte $4C, $A0, $04, $B1, $18, $24, $4D, $10 ;l d1x$mp
E0E8 .byte $FC, $85, $80, $24, $41, $88, $10, $F3 ;...$a.p.
E0F0 .byte $A4, $0A, $20, $7C, $FF, $88, $D0, $FA ;$j |..P.
E0F8 .byte $A0, $03, $B1, $18, $85, $08, $18, $69 ; c1x.hxI
E100 .byte $01, $91, $18, $C5, $15, $F0, $0A, $C8 ;a.xEu.jH
E108 .byte $45, $08, $51, $18, $91, $18, $4C, $81 ;ehqx.xl.
E110 .byte $05, $20, $59, $FF, $A2, $FA, $20, $2D ;e y.". -
E118 .byte $FF, $70, $06, $C6, $0A, $F0, $1C, $D0 ;.PfFj.\P
E120 .byte $0F, $A2, $28, $20, $2D, $FF, $50, $0B ;o"( -.pk
E128 .byte $E6, $0A, $A5, $0A, $C9, $30, $F0, $0B ;.j%jI0.k
E130 .byte $4C, $48, $05, $A5, $1F, $C9, $30, $D0 ;lhe%_I0P
E138 .byte $0B, $06, $1E, $A9, $FF, $85, $1B, $A9 ;kf^)..[)
E140 .byte $0C, $4C, $F9, $FE, $A9, $80, $85, $1E ;ll..)..^
E148 .byte $A9, $00, $A0, $03, $91, $18, $20, $CE ;). c.x N
E150 .byte $FE, $A0, $03, $B1, $18, $18, $69, $01 ;. c1xxIa
E158 .byte $91, $18, $C5, $15, $D0, $F0, $06, $1E ;.xEuP.f^
E160 .byte $E6, $1B, $A5, $1B, $C9, $24, $F0, $12 ;.[%[I$.r
E168 .byte $A0, $02, $B1, $18, $29, $C0, $05, $1B ; b1x).e[
E170 .byte $91, $18, $A6, $12, $FE, $12, $04, $4C ;.x&r.rdl
E178 .byte $47, $FC, $A9, $FF, $85, $1B, $4C, $C1 ;g.)..[lA
E180 .byte $FE ;.
; test for diagnostic ROM
E181 A2 00 DROMTS LDX #$00 ; test for diagnostic ROM
E183 A9 55 LDA #$55
E185 CD 00 D0 iE185 CMP DIAGROM
E188 D0 03 BNE iE18D
E18A CA DEX
E18B D0 F8 BNE iE185
E18D 60 iE18D RTS
E18E D8 DSKINT CLD ; RESET drive
E18F 78 SEI
E190 A2 FF LDX #$FF
E192 9A TXS
E193 8E 02 02 STX RIOT1IEEEDO
E196 8E 03 02 STX RIOT1PBDD
E199 A9 1C LDA #$1C ; DAVO+EOIO+RFDO
E19B 8D 80 02 STA RIOT2PAD
E19E A9 1F LDA #$1F
E1A0 8D 81 02 STA RIOT2PADD
E1A3 A9 38 LDA #$38 ; ERRLED+ACTLDB+ACTLDA
E1A5 8D 82 02 STA RIOT2PBD
E1A8 8D 83 02 STA RIOT2PBDD
E1AB A2 00 LDX #$00 ; test zeropage
E1AD 8A TXA
E1AE A0 55 iE1AE LDY #$55
E1B0 94 00 STY CMDBUF,X
E1B2 CA DEX
E1B3 D0 F9 BNE iE1AE
E1B5 AA TAX
E1B6 A9 AA iE1B6 LDA #$AA
E1B8 16 00 ASL CMDBUF,X
E1BA 55 00 EOR CMDBUF,X
E1BC 95 00 STA CMDBUF,X
E1BE D0 1E BNE ZPBAD
E1C0 CA DEX
E1C1 D0 F3 BNE iE1B6
E1C3 20 81 E1 JSR DROMTS ; check for diagnostic ROM
E1C6 D0 1C BNE EROMCHK ; not here, goto E-ROM test
E1C8 4C 05 D0 JMP DIAGROM+5 ; diagnostic hook
E1CB A2 10 ROMTST LDX #$10
E1CD A0 00 LDY #$00
E1CF 98 TYA
E1D0 18 CLC
E1D1 71 30 iE1D1 ADC (IP),Y
E1D3 C8 INY
E1D4 D0 FB BNE iE1D1
E1D6 CA DEX
E1D7 F0 04 BEQ iE1DD
E1D9 E6 31 INC IP+1
E1DB D0 F4 BNE iE1D1
E1DD 60 iE1DD RTS
E1DE A9 FF ZPBAD LDA #$FF ; zeropage bad
E1E0 95 00 STA CMDBUF,X
E1E2 D0 FA BNE ZPBAD ; endless loop
E1E4 A9 30 EROMCHK LDA #$30
E1E6 8D 82 02 STA RIOT2PBD
E1E9 A9 E0 LDA #$E0
E1EB 85 31 STA IP+1
E1ED A9 00 LDA #$00
E1EF 85 30 STA IP
E1F1 20 CB E1 JSR ROMTST
E1F4 C9 00 CMP #$00
E1F6 F0 06 BEQ FROMCHK ; ok, goto F-ROM check
E1F8 8D 00 E0 BADE STA CMDTBL ; this stores into ROM?
E1FB 4C F8 E1 JMP BADE ; endless loop
E1FE A9 28 FROMCHK LDA #$28
E200 8D 82 02 STA RIOT2PBD
E203 A9 F0 LDA #$F0
E205 85 31 STA IP+1
E207 20 CB E1 JSR ROMTST
E20A C9 00 CMP #$00
E20C F0 06 BEQ DIAGOK
E20E 8D 00 F0 BADF STA xF000 ; this stores into ROM?
E211 4C 0E E2 JMP BADF ; endless loop
E214 A9 00 DIAGOK LDA #$00
E216 8D 82 02 STA RIOT2PBD
E219 AD 82 02 LDA RIOT2PBD ; compute primary IEEE address
E21C 29 07 AND #$07
E21E 09 48 ORA #$48
E220 85 33 STA TLKADR
E222 49 60 EOR #$60
E224 85 32 STA LSNADR
E226 A9 81 LDA #$81 ; init command channel
E228 85 C4 STA CHNRDY+6
E22A A9 30 LDA #$30
E22C 8D DF 10 STA CHNDAT+6
E22F 20 D6 ED JSR INTTAB
E232 A9 FF LDA #$FF
E234 A2 21 LDX #$21
E236 9D B7 10 iE236 STA LINTAB,X
E239 CA DEX
E23A 10 FA BPL iE236
E23C A9 07 LDA #$07 ; CMDRD
E23E 8D D5 10 STA LINTAB+30
E241 A9 06 LDA #$06 ; CMDWRT
E243 8D D6 10 STA LINTAB+31
E246 A9 3F LDA #$3F
E248 85 3C STA LINUSE
E24A A9 0F LDA #$0F
E24C 85 6B STA BUFNUM+12
E24E A9 10 LDA #$10
E250 85 6D STA BUFNUM+14
E252 A9 FF LDA #$FF
E254 85 6C STA BUFNUM+13
E256 85 6E STA BUFNUM+15
E258 A9 88 LDA #$88
E25A 85 C5 STA CHNRDY+7
E25C A9 01 LDA #$01
E25E 85 C4 STA CHNRDY+6
E260 A9 00 LDA #$00
E262 85 8B STA BUFUSE
E264 A9 E0 LDA #$E0
E266 85 8C STA BUFUSE+1
E268 20 49 FD JSR USRINT ; init user jump
E26B A9 0A LDA #$0A ; setup sector offset
E26D 85 92 STA SECINC
E26F 8D 87 02 STA RIOT2ATNPE ; allow ATN to interrupt
E272 A5 3A IDLE LDA CMDWAT
E274 F0 08 BEQ IDLE2
E276 A9 00 LDA #$00
E278 85 3A STA CMDWAT
E27A 78 SEI
E27B 20 44 F0 JSR PARSXQ ; parse and execute command
E27E 58 IDLE2 CLI ; test for drive running or openfile
E27F A9 1D LDA #$1D
E281 85 2D STA TEMP+3
E283 A9 00 LDA #$00
E285 85 2A STA TEMP
E287 85 2B STA TEMP+1
E289 A6 2D iE289 LDX TEMP+3 ; look thru LINTAB
E28B BD B7 10 LDA LINTAB,X
E28E C9 FF CMP #$FF ; for active file
E290 F0 0E BEQ iE2A0
E292 85 83 STA LINDX
E294 20 9D E8 JSR GETACT
E297 AA TAX
E298 BD 99 10 LDA LSTJOB,X ; determine which drv is on
E29B 29 01 AND #$01
E29D AA TAX
E29E F6 2A INC TEMP,X
E2A0 C6 2D iE2A0 DEC TEMP+3 ; set flag indicating drive
E2A2 10 E5 BPL iE289 ; has file open
E2A4 A0 0E LDY #$0E ; look through job queue
E2A6 B9 03 10 iE2A6 LDA JOBS,Y ; for jobs still running
E2A9 10 05 BPL iE2B0
E2AB 29 01 AND #$01
E2AD AA TAX
E2AE F6 2A INC TEMP,X ; set flag indicating drive
E2B0 88 iE2B0 DEY ; is active
E2B1 10 F3 BPL iE2A6
E2B3 AD 82 02 LDA RIOT2PBD
E2B6 29 E7 AND #$E7 ; 255-ACTLDA-ACTLDB
E2B8 8D 82 02 STA RIOT2PBD
E2BB A5 2A LDA TEMP
E2BD F0 08 BEQ iE2C7
E2BF AD 82 02 LDA RIOT2PBD ; turn on LED if drive flag
E2C2 09 10 ORA #$10 ; ACTLDB if not 0
E2C4 8D 82 02 STA RIOT2PBD
E2C7 A5 2B iE2C7 LDA TEMP+1
E2C9 F0 08 BEQ iE2D3
E2CB AD 82 02 LDA RIOT2PBD
E2CE 09 08 ORA #$08 ; ACTLDA
E2D0 8D 82 02 STA RIOT2PBD
E2D3 4C 7E E2 iE2D3 JMP IDLE2
E2D6 A2 FF ATNIRQ LDX #$FF ; IRQ routine (triggered by ATN), listen to PET
E2D8 9A TXS ; clear stack
E2D9 AD 87 02 LDA RIOT2ATNPE ; clear IRQ flag
E2DC A9 18 LDA #$18 ; DAVO+EOIO
E2DE 0D 80 02 ORA RIOT2PAD ; free control lines
E2E1 8D 80 02 STA RIOT2PAD
E2E4 A9 FF LDA #$FF
E2E6 8D 02 02 STA RIOT1IEEEDO ; clear data lines
E2E9 A9 07 iE2E9 LDA #$07 ; DACO+RFDO+ATNA
E2EB 0D 80 02 ORA RIOT2PAD
E2EE 8D 80 02 STA RIOT2PAD
E2F1 2C 80 02 iE2F1 BIT RIOT2PAD
E2F4 50 04 BVC iE2FA ; DAV LO
E2F6 30 F9 BMI iE2F1 ; ATN LO ATNI HI
E2F8 10 7B BPL iE375 ; ATN HI
E2FA A9 FB iE2FA LDA #$FB ; 255-RFDO; NRFD LO
E2FC 2D 80 02 AND RIOT2PAD
E2FF 8D 80 02 STA RIOT2PAD
E302 29 20 AND #$20 ; save EOI
E304 85 88 STA EOIFLG
E306 AD 00 02 LDA RIOT1IEEEDI
E309 49 FF EOR #$FF
E30B 85 87 STA DATA ; save command
E30D A9 FD LDA #$FD ; 255-DACO; NDAC HI
E30F 2D 80 02 AND RIOT2PAD
E312 8D 80 02 STA RIOT2PAD
E315 A0 00 LDY #$00
E317 A5 87 LDA DATA
E319 29 60 AND #$60
E31B C9 40 CMP #$40 ; TALK?
E31D F0 29 BEQ iE348
E31F C9 20 CMP #$20 ; LISTEN?
E321 F0 06 BEQ iE329
E323 C9 60 CMP #$60 ; SECONDARY?
E325 F0 2F BEQ iE356
E327 D0 44 BNE iE36D ; OTHER
E329 A5 87 iE329 LDA DATA
E32B C5 32 CMP LSNADR
E32D F0 0B BEQ iE33A ; my listen address
E32F C9 3F CMP #$3F ; UNLISTEN
E331 D0 02 BNE iE335
E333 84 34 STY LSNACT
E335 84 36 iE335 STY ADRSED ; not primary ADDRSED
E337 4C 6D E3 JMP iE36D
E33A 85 34 iE33A STA LSNACT
E33C 84 35 STY TLKACT
E33E A9 20 iE33E LDA #$20
E340 85 84 STA SA ; default SA
E342 85 85 STA ORGSA
E344 85 36 STA ADRSED ; PRIMARY ADDRESSED
E346 D0 25 BNE iE36D
E348 84 35 iE348 STY TLKACT
E34A A5 87 LDA DATA
E34C C5 33 CMP TLKADR
E34E D0 E5 BNE iE335
E350 85 35 STA TLKACT
E352 84 34 STY LSNACT
E354 F0 E8 BEQ iE33E
E356 A5 36 iE356 LDA ADRSED
E358 F0 13 BEQ iE36D
E35A A5 87 LDA DATA
E35C 85 85 STA ORGSA ; NOT ADDRESSED
E35E 48 PHA
E35F 29 0F AND #$0F
E361 85 84 STA SA
E363 68 PLA
E364 29 F0 AND #$F0 ; CLOSE?
E366 C9 E0 CMP #$E0
E368 D0 03 BNE iE36D
E36A 20 0F EC JSR CLOSE
E36D 2C 80 02 iE36D BIT RIOT2PAD
E370 50 FB BVC iE36D
E372 4C E9 E2 JMP iE2E9
E375 A5 34 iE375 LDA LSNACT
E377 F0 0F BEQ iE388
E379 A9 FA LDA #$FA ; 255-RFDO-ATNA
E37B 2D 80 02 AND RIOT2PAD
E37E 8D 80 02 STA RIOT2PAD
E381 58 CLI
E382 20 9B E3 JSR LISTEN
E385 4C 72 E2 JMP IDLE
E388 A9 FC iE388 LDA #$FC ; 255-RFDO-ATNA
E38A 2D 80 02 AND RIOT2PAD
E38D 8D 80 02 STA RIOT2PAD
E390 58 CLI
E391 A5 35 LDA TLKACT
E393 F0 03 BEQ iE398
E395 20 2B E4 JSR TALK
E398 4C 72 E2 iE398 JMP IDLE
E39B A9 04 LISTEN LDA #$04 ; RFD HI
E39D 0D 80 02 ORA RIOT2PAD
E3A0 8D 80 02 STA RIOT2PAD
E3A3 2C 80 02 iE3A3 BIT RIOT2PAD ; DAV LO
E3A6 70 FB BVS iE3A3
E3A8 20 AD E9 JSR FNDWCH ; WAS LDX SA
E3AB B0 05 BCS iE3B2
E3AD B5 BE LDA CHNRDY,X
E3AF 6A ROR ; ok, open for LISTEN
E3B0 B0 49 BCS iE3FB
E3B2 A5 85 iE3B2 LDA ORGSA ; WAS TXA
E3B4 29 F0 AND #$F0 ; SA=OPEN?
E3B6 C9 F0 CMP #$F0
E3B8 F0 41 BEQ iE3FB
E3BA A5 84 LDA SA
E3BC C9 01 CMP #$01 ; save?
E3BE F0 0E BEQ iE3CE
E3C0 2C 80 02 iE3C0 BIT RIOT2PAD
E3C3 50 FB BVC iE3C0
E3C5 A9 FD LDA #$FD ; 255-DACO
E3C7 2D 80 02 AND RIOT2PAD
E3CA 8D 80 02 STA RIOT2PAD
E3CD 60 RTS
E3CE A9 FB iE3CE LDA #$FB ; 255-RFDO, ACCEPT ALL DATA
E3D0 2D 80 02 AND RIOT2PAD
E3D3 8D 80 02 STA RIOT2PAD ; RFD LOW
E3D6 A9 FD LDA #$FD ; 255-DACO
E3D8 2D 80 02 AND RIOT2PAD
E3DB 8D 80 02 STA RIOT2PAD ; DAC HI
E3DE 2C 80 02 iE3DE BIT RIOT2PAD ; DAV HI
E3E1 50 FB BVC iE3DE
E3E3 A9 02 LDA #$02 ; DACO
E3E5 0D 80 02 ORA RIOT2PAD
E3E8 8D 80 02 STA RIOT2PAD ; DAC LOW
E3EB A9 04 LDA #$04 ; RFDO, RFD HI
E3ED 0D 80 02 ORA RIOT2PAD
E3F0 8D 80 02 STA RIOT2PAD
E3F3 2C 80 02 iE3F3 BIT RIOT2PAD ; WAIT DAV LOW
E3F6 50 FB BVC iE3F3
E3F8 4C CE E3 JMP iE3CE ; Do UNTIL ATn PULLED
E3FB A9 FB iE3FB LDA #$FB ; 255-RFDO
E3FD 2D 80 02 AND RIOT2PAD
E400 8D 80 02 STA RIOT2PAD
E403 29 20 AND #$20
E405 85 88 STA EOIFLG
E407 AD 00 02 LDA RIOT1IEEEDI
E40A 49 FF EOR #$FF
E40C 85 87 STA DATA
E40E 78 SEI
E40F A9 FD LDA #$FD ; 255-DACO
E411 2D 80 02 AND RIOT2PAD
E414 8D 80 02 STA RIOT2PAD
E417 2C 80 02 iE417 BIT RIOT2PAD
E41A 50 FB BVC iE417
E41C A9 02 LDA #$02 ; DACO
E41E 0D 80 02 ORA RIOT2PAD
E421 8D 80 02 STA RIOT2PAD
E424 20 FE E7 JSR PUT
E427 58 CLI
E428 4C 9B E3 JMP LISTEN
E42B 20 B0 E9 TALK JSR FNDRCH
E42E B0 06 BCS NOTLK ; TEST IF CHANNEL READY
E430 A6 83 iE430 LDX LINDX
E432 B5 BE LDA CHNRDY,X
E434 30 01 BMI iE437
E436 60 NOTLK RTS
E437 2C 82 02 iE437 BIT RIOT2PBD ; RFD HI
E43A 10 FB BPL iE437
E43C BD D9 10 LDA CHNDAT,X
E43F 49 FF EOR #$FF
E441 8D 02 02 STA RIOT1IEEEDO
E444 B5 BE LDA CHNRDY,X
E446 09 E7 ORA #$E7 ; 255-EOIO-DAVO, DAV LO
E448 2D 80 02 AND RIOT2PAD
E44B 8D 80 02 STA RIOT2PAD
E44E 2C 82 02 iE44E BIT RIOT2PBD
E451 10 0D BPL iE460
E453 50 F9 BVC iE44E
E455 A9 18 LDA #$18 ; DAVO+EOIO
E457 0D 80 02 ORA RIOT2PAD
E45A 8D 80 02 STA RIOT2PAD
E45D 4C 72 E2 JMP IDLE
E460 20 D6 EC iE460 JSR GET
E463 2C 82 02 iE463 BIT RIOT2PBD
E466 50 FB BVC iE463
E468 A9 FF LDA #$FF
E46A 8D 02 02 STA RIOT1IEEEDO
E46D A9 18 LDA #$18 ; DAVO+EOIO
E46F 0D 80 02 ORA RIOT2PAD
E472 8D 80 02 STA RIOT2PAD
E475 2C 82 02 iE475 BIT RIOT2PBD
E478 70 FB BVS iE475
E47A 50 B4 BVC iE430 ; END OF IEEE
; NEXT TRACK & SECTOR
; RETURNS NEXT AVAILABLE TRACK & SECTOR
; GIVEN CURRENT T & S
; ;
; ALLOCATION IS FROM TRACK 18
; TOWARDS 1 & 35, BY FULL TRACKS
E47C 20 9D E8 NXTTS JSR GETACT
E47F 0A ASL
E480 0A ASL
E481 0A ASL
E482 AA TAX
E483 BD 23 10 LDA HDRS+2,X
E486 85 81 STA TRACK
E488 BD 24 10 LDA HDRS+3,X
E48B 85 82 STA SECTOR
E48D A9 02 LDA #$02
E48F 85 2A STA TEMP
E491 A6 80 NXTDS LDX DRVNUM
E493 BD 40 E5 LDA IPBM,X
E496 85 29 STA BMPNT+1
E498 A9 00 LDA #$00
E49A 85 28 STA BMPNT
E49C A5 81 iE49C LDA TRACK
E49E 0A ASL
E49F 0A ASL
E4A0 A8 TAY
E4A1 B1 28 LDA (BMPNT),Y
E4A3 D0 33 BNE FNDNXT
E4A5 A5 81 LDA TRACK
E4A7 C9 12 CMP #$12
E4A9 F0 16 BEQ iE4C1
E4AB 90 19 BCC iE4C6
E4AD E6 81 INC TRACK
E4AF A5 81 LDA TRACK
E4B1 C9 24 CMP #$24
E4B3 D0 E7 BNE iE49C
E4B5 A9 11 LDA #$11
E4B7 85 81 STA TRACK
E4B9 A9 00 LDA #$00
E4BB 85 82 STA SECTOR
E4BD C6 2A DEC TEMP
E4BF D0 DB BNE iE49C
E4C1 A9 72 iE4C1 LDA #$72 ; DSKFUL
E4C3 4C 90 F0 JMP CMDERR
E4C6 C6 81 iE4C6 DEC TRACK
E4C8 D0 D2 BNE iE49C
E4CA A9 13 LDA #$13
E4CC 85 81 STA TRACK
E4CE A9 00 LDA #$00
E4D0 85 82 STA SECTOR
E4D2 C6 2A DEC TEMP
E4D4 D0 C6 BNE iE49C
E4D6 F0 E9 BEQ iE4C1
; FIND THE NEXT OPTIMUM SECTOR
; NEXT SECTOR=CURRENT SECTOR+N
E4D8 A5 82 FNDNXT LDA SECTOR
E4DA 18 CLC
E4DB 65 92 ADC SECINC
E4DD 85 82 STA SECTOR
E4DF A5 81 LDA TRACK
E4E1 20 B1 E5 JSR MAXSEC
E4E4 85 8A STA LSTSEC
E4E6 85 89 STA CMD
E4E8 C5 82 CMP SECTOR
E4EA B0 11 BCS iE4FD
E4EC 38 SEC
E4ED A5 82 LDA SECTOR
E4EF E5 8A SBC LSTSEC
E4F1 85 82 STA SECTOR
E4F3 F0 08 BEQ iE4FD
E4F5 C6 82 DEC SECTOR
E4F7 D0 04 BNE iE4FD
E4F9 A9 00 iE4F9 LDA #$00
E4FB 85 82 STA SECTOR
E4FD 20 6B E5 iE4FD JSR AVAIL
E500 20 87 E5 iE500 JSR AV2
E503 B0 13 BCS iE518
E505 C6 89 DEC CMD
E507 10 05 BPL iE50E
E509 A9 71 LDA #$71
E50B 4C D4 E6 JMP CMDER2
E50E A5 82 iE50E LDA SECTOR
E510 E6 82 INC SECTOR
E512 C5 8A CMP LSTSEC
E514 D0 EA BNE iE500
E516 F0 E1 BEQ iE4F9
E518 4C A0 E7 iE518 JMP USEDTS
; RETURNS OPTIMUM INITIAL TRACK, SECTOR
E51B A9 11 INTTS LDA #$11
E51D 85 81 STA TRACK
E51F 20 5F E5 JSR SETBMP
E522 A5 81 iE522 LDA TRACK
E524 0A ASL
E525 0A ASL
E526 A8 TAY
E527 B1 28 LDA (BMPNT),Y
E529 D0 17 BNE FNDSEC
E52B A9 24 LDA #$24
E52D 38 SEC
E52E E5 81 SBC TRACK
E530 0A ASL
E531 0A ASL
E532 A8 TAY
E533 B1 28 LDA (BMPNT),Y
E535 D0 0B BNE FNDSEC
E537 C6 81 DEC TRACK
E539 D0 E7 BNE iE522
E53B A9 72 LDA #$72 ; DSKFUL
E53D 4C 90 F0 JMP CMDERR
E540 IPBM .byte $42, $43 ;bc
E542 98 FNDSEC TYA
E543 4A LSR
E544 4A LSR
E545 85 81 STA TRACK
E547 A9 00 LDA #$00
E549 85 82 STA SECTOR
E54B 20 6B E5 JSR AVAIL
E54E 20 87 E5 iE54E JSR AV2
E551 B0 09 BCS iE55C
E553 E6 82 INC SECTOR
E555 D0 F7 BNE iE54E
E557 A9 71 LDA #$71 ; DIRERR
E559 4C D4 E6 JMP CMDER2
E55C 4C A0 E7 iE55C JMP USEDTS
; SET (INDIRECT) BAM PNTR BY DRVNUM
E55F A6 80 SETBMP LDX DRVNUM
E561 BD 40 E5 LDA IPBM,X
E564 85 29 STA BMPNT+1
E566 A9 00 LDA #$00
E568 85 28 STA BMPNT
E56A 60 RTS
; LOAD TRACK BAM INTO TEMP AND FINDS
; AVAILABLE SECTOR ON THE TRACK
E56B A5 81 AVAIL LDA TRACK
E56D 0A ASL
E56E 0A ASL
E56F A8 TAY
E570 B1 28 LDA (BMPNT),Y
E572 85 2D STA TEMP+3
E574 A2 02 LDX #$02
E576 C8 iE576 INY
E577 B1 28 LDA (BMPNT),Y
E579 95 2A STA TEMP,X
E57B CA DEX
E57C 10 F8 BPL iE576
E57E 20 93 E5 JSR AVCK
E581 A4 82 LDY SECTOR
E583 F0 0D BEQ iE592
E585 D0 02 BNE iE589
E587 A0 01 AV2 LDY #$01
E589 66 2A iE589 ROR TEMP
E58B 66 2B ROR TEMP+1
E58D 66 2C ROR TEMP+2
E58F 88 DEY
E590 D0 F7 BNE iE589
E592 60 iE592 RTS
; BIT MAP VALIDITY CHECK
E593 A2 00 AVCK LDX #$00
E595 A0 03 LDY #$03
E597 D0 06 BNE iE59F ; (BRANCH)
E599 E8 iE599 INX
E59A 4A iE59A LSR
E59B B0 FC BCS iE599
E59D D0 FB BNE iE59A
E59F B9 29 00 iE59F LDA BMPNT+1,Y
E5A2 88 DEY
E5A3 10 F5 BPL iE59A
E5A5 E4 2D CPX TEMP+3
E5A7 F0 07 BEQ iE5B0
E5A9 A9 71 LDA #$71 ; DIRERR
E5AB A0 00 LDY #$00
E5AD 4C D4 E6 JMP CMDER2
E5B0 60 iE5B0 RTS
; .A=TRACK # ,RETURNS #SECTORS ON THIS TRACK
E5B1 A2 04 MAXSEC LDX #$04
E5B3 DD BC E5 iE5B3 CMP TRKNUM-1,X
E5B6 CA DEX
E5B7 B0 FA BCS iE5B3
E5B9 BD C1 E5 LDA NUMSEC,X
E5BC 60 xE5BC RTS
E5BD TRKNUM .byte $24, $1F, $19, $12 ;$_yr
E5C1 NUMSEC .byte $11, $12, $14, $15 ;qrtu
; ;
; this is the original comment on the error table in the 4040
; of course the table here is similar, but still different.
; ;
; ; CONTROLLER ERRORS
; ; 0 (1) NO ERROR
; ; 20 (2) CAN'T FIND BLOCK HEADER
; ; 21 (3) NO SYNCH CHARACTER
; ; 22 (4) DATA BLOCK NOT PRESENT
; ; 23 (5) CHECKSUM ERROR IN DATA
; ; 24 (16) BYTE DECODING ERROR
; ; 25 (7) WRITE-VERIFY ERROR
; ; 26 (8) WRITE W/ WRITE PROTECT ON
; ; 27 (9) CHECKSUM ERROR IN HEADER
; ; 28 (10) DATA EXTENDS INTO NEXT BLOCK
; ; 29 (11) DISK I.D. MISMATCH
; .SKIP
; ; COMMAND ERRORS
; ; 30 GENERAL SYNTAX
; ; 31 INVALID COMMAND
; ; 32 LONG LINE
; ; 33 INVALID FILNAME
; ; 34 NO FILE GIVEN
; .SKIP
; ; 50 RECORD NOT PRESENT
; ; 51 OVERFLOW IN RECORD
; ; 52 FILE TOO LARGE
; .SKIP
; ; 60 FILE OPEN FOR WRITE
; ; 61 FILE NOT OPEN
; ; 62 FILE NOT FOUND
; ; 63 FILE EXISTS
; ; 64 FILE TYPE MISMATCH
; ; 65 NO BLOCK
; ; 66 ILLEGAL TRACK OR SECTOR
; ; 67 ILLEGAL SYSTEM T OR S
; .SKIP
; ; 70 NO CHANNELS AVAILABLE
; ; 71 DIRECTORY ERROR
; ; 72 DISK FULL
; ; 73 CBM DOS V2
; .SKIP
; ; 1 FILES SCRATCHED RESPONSE
; .SKIP2
; BADSYN =$30
; BADCMD =$31
; LONGLN =$32
; BADFN =$33
; NOFILE =$34
; NOREC =$50
; RECOVF =$51
; BIGFIL =$52
; FILOPN =$60
; FILNOP =$61
; FLNTFD =$62
; FLEXST =$63
; MISTYP =$64
; NOBLK =$65
; BADTS =$66
; NOCHNL =$70
; DIRERR =$71
; DSKFUL =$72
; CBMV2 =$73
; .PAGE
; ; ERROR MESSAGE TABLE
; ; LEADING ERRROR NUMBERS,
; ; TEXT WITH 1ST & LAST CHARS
; ; OR'ED WITH $80,
; ; TOKENS FOR KEY WORDS ARE
; ; LESS THAN $10 (AND'ED W/ $80)
E5C5 ERRTAB .byte $00, $A0, $4F, $CB ;. oK
E5C9 e_read .byte $20, $21, $22, $23, $24, $27, $D2, $45 ; !"#$'Re
E5D1 .byte $41, $44, $89 ;ad.
E5D4 e_write .byte $25, $28, $8A, $89 ;%(..
E5D8 e_prot .byte $26, $8A, $20, $50, $52, $4F, $54, $45 ;&. prote
E5E0 .byte $43, $54, $20, $4F, $CE ;ct oN
E5E5 e_id .byte $29, $88, $20, $49, $44, $85 ;). id.
E5EB e_synt .byte $30, $31, $32, $33, $34, $D3, $59, $4E ;01234Syn
E5F3 .byte $54, $41, $58, $89 ;tax.
E5F7 e_wfile .byte $60, $8A, $03, $84 ;`.c.
E5FB e_exist .byte $63, $83, $20, $45, $58, $49, $53, $54 ;C. exist
E603 .byte $D3 ;S
E604 e_type .byte $64, $83, $20, $54, $59, $50, $45, $85 ;D. type.
E60C e_block .byte $65, $CE, $4F, $20, $42, $4C, $4F, $43 ;ENo bloc
E614 .byte $CB ;K
E615 e_fnotop .byte $61, $83, $06, $84 ;A.f.
E619 e_fnotfnd .byte $62, $83, $06, $87 ;B.f.
E61D e_scratchd .byte $01, $83, $53, $20, $53, $43, $52, $41 ;a.s scra
E625 .byte $54, $43, $48, $45, $C4 ;tcheD
E62A e_nchanl .byte $70, $CE, $4F, $20, $43, $48, $41, $4E ;PNo chan
E632 .byte $4E, $45, $CC ;neL
E635 e_dir .byte $71, $C4, $49, $52, $89 ;QDir.
E63A e_dskfull .byte $72, $88, $20, $46, $55, $4C, $CC ;R. fulL
E641 t_error .byte $09, $C5, $52, $52, $4F, $D2 ;iErroR
E647 t_write .byte $0A, $D7, $52, $49, $54, $C5 ;jWritE
E64D t_file .byte $03, $C6, $49, $4C, $C5 ;cFilE
E652 t_open .byte $04, $CF, $50, $45, $CE ;dOpeN
E657 t_mismatch .byte $05, $CD, $49, $53, $4D, $41, $54, $43 ;eMismatc
E65F .byte $C8 ;H
E660 t_not .byte $06, $CE, $4F, $D4 ;fNoT
E664 t_found .byte $07, $C6, $4F, $55, $4E, $C4 ;gFounD
E66A t_disk .byte $08, $C4, $49, $53, $CB ;hDisK
; .A=BCD ERROR #
; RECURSIVE (2) ERROR MESSAGE ROUTINE
E66F DD C5 E5 MOVERR CMP ERRTAB,X ; .A=BCD ERROR #
E672 F0 06 BEQ iE67A
E674 E8 INX
E675 E0 AA CPX #$AA ; ERREND
E677 90 F6 BCC MOVERR
E679 60 RTS
E67A E8 iE67A INX ; SKIP PAST ERROR #'S
E67B BD C5 E5 LDA ERRTAB,X
E67E 10 FA BPL iE67A
E680 29 7F AND #$7F
E682 C9 10 iE682 CMP #$10
E684 90 17 BCC iE69D
E686 99 B4 43 STA ERRBUF,Y
E689 C8 INY
E68A E8 iE68A INX
E68B BD C5 E5 LDA ERRTAB,X
E68E 10 F2 BPL iE682
E690 48 PHA ; LAST CHARACTER
E691 29 7F AND #$7F
E693 C9 10 CMP #$10
E695 90 07 BCC iE69E ; TOKEN
E697 99 B4 43 STA ERRBUF,Y
E69A C8 INY
E69B 68 PLA
E69C 60 RTS
E69D 48 iE69D PHA ; TOKEN PROCESS
E69E 48 iE69E PHA
E69F A9 20 LDA #$20
E6A1 99 B4 43 STA ERRBUF,Y ; IMPLIED LEADING SPACE
E6A4 C8 INY
E6A5 68 PLA
E6A6 86 2D STX TEMP+3
E6A8 A2 7C LDX #$7C ; ERRTOK
E6AA 20 6F E6 JSR MOVERR ; RECURSIVE FOR TOKENS
E6AD A6 2D LDX TEMP+3
E6AF 68 PLA
E6B0 10 D8 BPL iE68A
E6B2 60 RTS
; CONTROLLER ERROR ENTRY
; .A= ERROR #
; .X= JOB #
E6B3 48 ERROR PHA
E6B4 86 8D STX JOBNUM
E6B6 8A TXA
E6B7 0A ASL
E6B8 0A ASL
E6B9 0A ASL
E6BA AA TAX
E6BB BD 23 10 LDA HDRS+2,X ; RECALL TRACK,SECTOR
E6BE 85 81 STA TRACK
E6C0 BD 24 10 LDA HDRS+3,X
E6C3 85 82 STA SECTOR
E6C5 68 PLA
E6C6 29 0F AND #$0F ; CONVERT CONTROLLER...
E6C8 D0 02 BNE iE6CC ; ...ERRORS TO DOS ERRORS
E6CA A9 06 LDA #$06 ; CODE=16-->14
E6CC 09 20 iE6CC ORA #$20
E6CE AA TAX
E6CF CA DEX
E6D0 CA DEX
E6D1 8A TXA
E6D2 A0 00 LDY #$00
E6D4 20 5D E7 CMDER2 JSR ERRMSG
E6D7 20 81 E1 JSR DROMTS ; check for diagnostic ROM
E6DA D0 03 BNE iE6DF
E6DC 4C 02 D0 JMP DIAGROM+2
E6DF AD 82 02 iE6DF LDA RIOT2PBD ; SET ERROR LED
E6E2 09 20 ORA #$20 ; ERRLED
E6E4 8D 82 02 STA RIOT2PBD
E6E7 20 A9 EE JSR FREICH ; FREE INTERNAL CHANNEL
E6EA A9 00 LDA #$00 ; CLEAR POINTERS
E6EC 85 5B STA x5B ; the 4040 purges the stack and SEI
E6EE 85 5C STA x5C
E6F0 A5 83 LDA LINDX
E6F2 C9 06 CMP #$06
E6F4 B0 08 BCS iE6FE
E6F6 A5 34 LDA LSNACT
E6F8 D0 21 BNE LSNERR ; error while listening
E6FA A5 35 LDA TLKACT
E6FC D0 03 BNE TLKERR ; error while talking
E6FE 4C 72 E2 iE6FE JMP IDLE
; TALKER ERROR RECOVERY
; IF COMMAND CHANNEL, RELEASE DAV
; IF DATA CHANNEL, FORCE NOT READY
; AND RELEASE CHANNEL
; this code is different from 4040
E701 A5 84 TLKERR LDA SA
E703 C9 0F CMP #$0F
E705 F0 09 BEQ iE710
E707 A6 83 LDX LINDX
E709 A9 80 LDA #$80
E70B 95 BE STA CHNRDY,X
E70D 20 32 EB JSR FRECHN
E710 AD 80 02 iE710 LDA RIOT2PAD
E713 09 10 ORA #$10 ; DAVO
E715 8D 80 02 STA RIOT2PAD
E718 4C 72 E2 JMP IDLE
; LISTENER ERROR RECOVERY
; IF COMMAND CHANNEL, RELEASE RFD
; IF DATA CHANNEL, FORCE NOT READY
; AND RELEASE CHANNEL
; this code is different from 4040
E71B A5 84 LSNERR LDA SA
E71D C9 0F CMP #$0F
E71F F0 0C BEQ iE72D
E721 20 AD E9 JSR FNDWCH
E724 A6 83 LDX LINDX
E726 A9 00 LDA #$00
E728 95 BE STA CHNRDY,X
E72A 20 32 EB JSR FRECHN
E72D A9 04 iE72D LDA #$04
E72F 0D 80 02 ORA RIOT2PAD
E732 29 FE AND #$FE
E734 8D 80 02 STA RIOT2PAD
E737 4C 72 E2 JMP IDLE
; CONVERT HEX TO BCD
E73A AA HEXDEC TAX
E73B A9 00 LDA #$00
E73D F8 SED
E73E E0 00 iE73E CPX #$00
E740 F0 07 BEQ iE749
E742 18 CLC
E743 69 01 ADC #$01
E745 CA DEX
E746 4C 3E E7 JMP iE73E
E749 D8 iE749 CLD
; CONVERT BCD TO ASCII DEC
; RETURN BCD IN .X
; STORE ASCII IN (TEMP)Y
E74A AA BCDDEC TAX
E74B 4A LSR
E74C 4A LSR
E74D 4A LSR
E74E 4A LSR
E74F 09 30 ORA #$30
E751 91 2A STA (TEMP),Y
E753 C8 INY
E754 8A TXA
E755 29 0F AND #$0F
E757 09 30 ORA #$30
E759 91 2A STA (TEMP),Y
E75B C8 INY
E75C 60 RTS
E75D A2 B4 ERRMSG LDX #$B4 ; <ERRBUF
E75F 86 2A STX TEMP
E761 A2 43 LDX #$43 ; >ERRBUF
E763 86 2B STX TEMP+1
E765 20 4A E7 JSR BCDDEC
E768 A9 2C LDA #$2C ; ","
E76A 99 B4 43 STA ERRBUF,Y
E76D C8 INY
E76E AD B4 43 LDA ERRBUF
E771 8D E0 10 STA CHNDAT+7 ; CHNDAT+ERRCHN
E774 A9 B5 LDA #$B5
E776 85 5D STA x5D
E778 8A TXA ; ERROR # IN .X
E779 A2 00 LDX #$00
E77B 20 6F E6 JSR MOVERR ; MOVE MESSAGE
E77E A9 2C LDA #$2C ; ","
E780 99 B4 43 STA ERRBUF,Y
E783 C8 INY
E784 A5 81 LDA TRACK ; CONVERT TRACK #
E786 20 3A E7 JSR HEXDEC
E789 A9 2C LDA #$2C
E78B 99 B4 43 STA ERRBUF,Y
E78E C8 INY
E78F A5 82 LDA SECTOR ; CONVERT SECTOR #
E791 20 3A E7 JSR HEXDEC
E794 A9 0D LDA #$0D
E796 99 B4 43 STA ERRBUF,Y
E799 18 CLC
E79A 98 TYA
E79B 69 B4 ADC #$B4 ; <ERRBUF
E79D 85 CD STA LSTCHR+7 ; LSTCHR++ERRCHN; SET LAST CHAR
E79F 60 RTS
; MARK TRACK, SECTOR, (BMPNT) AS USED
E7A0 A5 81 USEDTS LDA TRACK ; CALC INDEX INTO BAM
E7A2 0A ASL
E7A3 0A ASL ; 4 BYTES IN BAM PER TRACK
E7A4 85 2A STA TEMP ; SAVE INDEX
E7A6 A8 TAY
E7A7 B1 28 LDA (BMPNT),Y
E7A9 AA TAX
E7AA CA DEX
E7AB 8A TXA
E7AC 91 28 STA (BMPNT),Y
E7AE A5 82 LDA SECTOR ; A=SECTOR/8
E7B0 4A LSR
E7B1 4A LSR
E7B2 4A LSR ; FOR WHICH OF THREE BYTES
E7B3 18 CLC ; the 4040 has a "SEC" here (in routing FREUSE) and no "INY" in e7b7 :-)
E7B4 65 2A ADC TEMP ; CALC INDEX
E7B6 A8 TAY
E7B7 C8 INY
E7B8 A5 82 LDA SECTOR ; BIT IN THAT BYTE
E7BA 29 07 AND #$07
E7BC AA TAX
E7BD A9 01 LDA #$01 ; this routine calculates(!) the bitmask; the 4040 reads it of a table
E7BF CA iE7BF DEX
E7C0 30 03 BMI iE7C5
E7C2 0A ASL
E7C3 90 FA BCC iE7BF
E7C5 85 2A iE7C5 STA TEMP
E7C7 B1 28 LDA (BMPNT),Y ; GET THE BYTE
E7C9 25 2A AND TEMP ; TEST IT; Z=1=USED, Z=0=FREE
E7CB D0 0D BNE iE7DA ; jump when free
E7CD A5 81 LDA TRACK ; USED, "NO ACTION"
E7CF 0A ASL
E7D0 0A ASL
E7D1 A8 TAY
E7D2 B1 28 LDA (BMPNT),Y
E7D4 AA TAX
E7D5 E8 INX
E7D6 8A TXA
E7D7 91 28 STA (BMPNT),Y
E7D9 60 RTS
E7DA A5 2A iE7DA LDA TEMP
E7DC 49 FF EOR #$FF
E7DE 31 28 AND (BMPNT),Y ; MARK SEC USED
E7E0 91 28 STA (BMPNT),Y
E7E2 60 RTS ; note the count is not fixed here (as in 4040)!
E7E3 A5 83 DBLBUF LDA LINDX ; TOGGLE ACTIVE BUFFER # IN BUFNUM
E7E5 0A ASL
E7E6 AA TAX
E7E7 B5 5F LDA BUFNUM,X ; TOGGLE ACTIVE FLAG
E7E9 49 80 EOR #$80
E7EB 95 5F STA BUFNUM,X
E7ED 30 00 BMI iE7EF ; not needed...
E7EF B5 60 iE7EF LDA BUFNUM+1,X ; TOGGLE ACTIVE FLAG
E7F1 49 80 EOR #$80
E7F3 95 60 STA BUFNUM+1,X
E7F5 30 00 BMI iE7F7
E7F7 20 9D E8 iE7F7 JSR GETACT ; GET ACTIVE BUF#
E7FA AA TAX
E7FB 4C 59 E8 JMP WATJOB ; AND WAIT FOR BUFFER READY
; MAIN ROUTINE TO WRITE TO CHANL
E7FE A5 85 PUT LDA ORGSA ; IS CHANL CMD OR DATA
E800 29 8F AND #$8F
E802 C9 0F CMP #$0F ; <15
E804 B0 17 BCS iE81D
E806 A6 83 LDX LINDX
E808 B5 B6 LDA FILTYP,X
E80A 49 08 EOR #$08
E80C F0 05 BEQ iE813
E80E A5 87 LDA DATA ; SEQ FILE
E810 4C 35 EA JMP WRTBYT ; WRITE BYTE TO CHANL
E813 A5 87 iE813 LDA DATA ; RND FILE WRITE
E815 20 89 E8 JSR PUTBYT ; WRITE TO CHANL
E818 A4 83 LDY LINDX ; PREPARE NXT BYTE
E81A 4C 2E ED JMP RNGET2
E81D A9 06 iE81D LDA #$06 ; CMDCHN
E81F 85 83 STA LINDX
E821 20 B0 EE JSR GETPNT ; TEST IF COMM AND BUFFER FULL
E824 C9 29 CMP #$29
E826 F0 05 BEQ iE82D ; IT IS FULL (>40)
E828 A5 87 LDA DATA ; NOT FULL YET
E82A 20 89 E8 JSR PUTBYT ; STORE THE BYTE
E82D A5 88 iE82D LDA EOIFLG ; TST IF LST BYTE OF MSG
E82F F0 01 BEQ iE832 ; IT IS
E831 60 RTS ; NOT YET, RETURN
E832 A5 85 iE832 LDA ORGSA ; this test is missing in 4040, instead directly gone to e839
E834 10 03 BPL iE839
E836 4C 7A F6 JMP iF67A
E839 E6 3A iE839 INC CMDWAT ; SET CMD WAITING FLAG
E83B 60 RTS
; TEST IF JOB (.X) IS DONE YET
; IF NOT DONE RETURN
; IF OK THEN RETURN ELSE REDO IT
E83C BD 03 10 TSTJOB LDA JOBS,X
E83F 30 14 BMI NOTYET
E841 F0 14 BEQ OK
E843 C9 01 CMP #$01
E845 F0 10 BEQ OK
E847 DE A8 10 DEC ERRCNT,X ; REDO UNTIL ERRCNT=0
E84A 10 03 BPL AGAIN
E84C 4C B3 E6 JMP ERROR
E84F BD 99 10 AGAIN LDA LSTJOB,X
E852 9D 03 10 STA JOBS,X
E855 38 NOTYET SEC
E856 60 RTS
E857 18 OK CLC
E858 60 RTS
; WAIT UNTIL JOB(.X) IS DONE
; RETURN WHEN DONE
E859 20 3C E8 WATJOB JSR TSTJOB
E85C B0 FB BCS WATJOB
E85E 60 RTS
E85F A2 0E LDX #$0E ; this routine seems to be unused?
E861 20 59 E8 iE861 JSR WATJOB
E864 CA DEX
E865 10 FA BPL iE861
E867 60 RTS
; SET HEADER OF ACTIVE BUFFER OF THE
; CURRENT LINDX TO TRACK,SECTOR,ID
E868 20 9D E8 SETHDR JSR GETACT
E86B AA SETH TAX
E86C 0A ASL
E86D 0A ASL
E86E 0A ASL
E86F A8 TAY
E870 A5 81 LDA TRACK
E872 99 23 10 STA HDRS+2,Y ; SEt TRACK
E875 A5 82 LDA SECTOR
E877 99 24 10 STA HDRS+3,Y ; SET SECTOR
E87A A5 80 LDA DRVNUM ; GET PROPER ID(DRVNUM)
E87C 0A ASL
E87D AA TAX
E87E B5 8E LDA DISKID,X
E880 99 21 10 STA HDRS,Y
E883 B5 8F LDA DISKID+1,X
E885 99 22 10 STA HDRS+1,Y
E888 60 RTS
; PUT .A INTO ACTIVE BUFFER OF LINDX
E889 48 PUTBYT PHA ; SAVE .A
E88A 20 9D E8 JSR GETACT ; GET ACTIVE BUF#
E88D 10 06 BPL iE895 ; BRANCH IF THERE IS ONE
E88F 68 PLA ; NO BUFFER ERROR
E890 A9 61 LDA #$61 ; FILNOP
E892 4C 90 F0 JMP CMDERR ; JMP TO ERROR ROUTINE
E895 0A iE895 ASL ; SAVE THE BYTE IN BUFFER
E896 AA TAX
E897 68 PLA
E898 81 3D STA (BUFTAB,X)
E89A F6 3D INC BUFTAB,X ; INC THE BUFFER POINTER
E89C 60 RTS ; Z=1 IF LAST CHAR SLOT IN BUFFER
E89D A5 83 GETACT LDA LINDX
E89F 0A ASL
E8A0 AA TAX
E8A1 B5 5F LDA BUFNUM,X
E8A3 10 02 BPL iE8A7
E8A5 B5 60 LDA BUFNUM+1,X
E8A7 60 iE8A7 RTS
; INITIALIZE DRIVES (COMMAND)
E8A8 20 99 F0 INTDRV JSR SIMPRS
E8AB 20 C1 E8 JSR INITDR
E8AE A5 CF LDA IMAGE ; USED AS FLAG FOR BOTH DRIVES
E8B0 10 0C BPL iE8BE
E8B2 20 12 F2 JSR TOGDRV
E8B5 20 0A EF JSR SETLDS
E8B8 20 C1 E8 JSR INITDR
E8BB 20 12 F2 JSR TOGDRV
E8BE 4C 75 F0 iE8BE JMP ENDCMD
; INITIALIZE DRIVE (DRVNUM)
; in 4040 this is called INITSU
E8C1 20 CE EB INITDR JSR CLDCHN ; missing in 4040
E8C4 A5 80 LDA DRVNUM ; DO A BUMP TO TRK 1
E8C6 18 CLC ; READ IN BIT MAP (18.00)
E8C7 69 0D ADC #$0D ; BAMJOB; AND SAVE DISK ID
E8C9 85 8D STA JOBNUM
E8CB AA TAX
E8CC A9 01 LDA #$01
E8CE 9D 12 10 STA x1012,X
E8D1 A5 80 LDA DRVNUM
E8D3 09 C0 ORA #$C0 ; SEEK
E8D5 20 08 E9 JSR DOIT
E8D8 A9 12 LDA #$12
E8DA A6 8D LDX JOBNUM
E8DC 9D 12 10 STA x1012,X
E8DF A5 80 LDA DRVNUM
E8E1 09 B0 ORA #$B0 ; READ
E8E3 20 08 E9 JSR DOIT
E8E6 A5 8D LDA JOBNUM
E8E8 AA TAX
E8E9 0A ASL
E8EA 0A ASL
E8EB 0A ASL
E8EC A8 TAY
E8ED A9 00 LDA #$00
E8EF 99 24 10 STA HDRS+3,Y
E8F2 A5 80 LDA DRVNUM
E8F4 09 80 ORA #$80
E8F6 20 08 E9 JSR DOIT
E8F9 A5 80 LDA DRVNUM
E8FB 0A ASL
E8FC AA TAX
E8FD B9 21 10 LDA HDRS,Y
E900 95 8E STA DISKID,X
E902 B9 22 10 LDA HDRS+1,Y
E905 95 8F STA DISKID+1,X
E907 60 RTS
; DO JOB IN .A, SET UP ERROR COUNT
; AND LSTJOB. RETURN WHEN JOB DONE OK
; JMP TO ERROR IF ERROR RETURNS
; this code is vastly different from 4040
E908 85 89 DOIT STA CMD
E90A A9 0A DOIT2 LDA #$0A
E90C 9D A8 10 STA ERRCNT,X
E90F BD 12 10 LDA x1012,X
E912 F0 1E BEQ iE932
E914 C9 24 CMP #$24
E916 B0 1A BCS iE932
E918 A5 89 iE918 LDA CMD
E91A 9D 03 10 STA JOBS,X
E91D 9D 99 10 STA LSTJOB,X
E920 BD 03 10 iE920 LDA JOBS,X
E923 30 FB BMI iE920
E925 C9 01 CMP #$01
E927 F0 08 BEQ iE931
E929 DE A8 10 DEC ERRCNT,X
E92C D0 EA BNE iE918
E92E 4C B3 E6 JMP ERROR
E931 60 iE931 RTS
E932 85 81 iE932 STA TRACK
E934 8A TXA
E935 0A ASL
E936 0A ASL
E937 0A ASL
E938 AA TAX
E939 BD 24 10 LDA HDRS+3,X
E93C 85 82 STA SECTOR
E93E A9 20 LDA #$20
E940 4C D4 E6 JMP CMDER2
; START DOUBLE BUFFERING
; USE TRACK,SECTOR AS STARTING BLOCK
E943 20 9D E8 STRDBL JSR GETACT
E946 20 68 E8 JSR SETHDR
E949 20 6A E9 JSR RDBUF
E94C 20 59 E8 JSR WATJOB
E94F 20 D4 E9 JSR GETBYT
E952 85 81 STA TRACK
E954 20 D4 E9 JSR GETBYT
E957 85 82 STA SECTOR
E959 A5 81 LDA TRACK
E95B D0 01 BNE iE95E
E95D 60 RTS
E95E 20 E3 E7 iE95E JSR DBLBUF
E961 20 68 E8 JSR SETHDR
E964 20 6A E9 JSR RDBUF
E967 4C E3 E7 JMP DBLBUF
; START A READ JOB ON TRACK, SECTOR
E96A A9 80 RDBUF LDA #$80 ; READ
E96C D0 02 BNE iE970
; START A WRITE JOB ON TRACK, SECTOR
E96E A9 90 WRTBUF LDA #$90 ; WRITE
E970 85 89 iE970 STA CMD
E972 20 9D E8 JSR GETACT
E975 AA TAX
E976 0A ASL
E977 0A ASL
E978 0A ASL
E979 A8 TAY
E97A B9 23 10 LDA HDRS+2,Y
E97D F0 B3 BEQ iE932
E97F C9 24 CMP #$24
E981 B0 AF BCS iE932
E983 9D 12 10 STA x1012,X
E986 A9 0A LDA #$0A
E988 9D A8 10 STA ERRCNT,X
E98B BD 99 10 LDA LSTJOB,X
E98E 29 01 AND #$01
E990 05 89 ORA CMD
E992 9D 99 10 STA LSTJOB,X
E995 9D 03 10 STA JOBS,X
E998 8A TXA
E999 48 PHA
E99A 0A ASL
E99B AA TAX
E99C A9 00 LDA #$00
E99E 95 3D STA BUFTAB,X
E9A0 A5 83 LDA LINDX
E9A2 0A ASL
E9A3 AA TAX
E9A4 F6 6F INC BUFNUM+16,X
E9A6 D0 02 BNE iE9AA
E9A8 F6 70 INC BUFNUM+17,X
E9AA 68 iE9AA PLA
E9AB AA TAX
E9AC 60 RTS
E9AD 38 FNDWCH SEC
E9AE B0 01 BCS iE9B1
E9B0 18 FNDRCH CLC
E9B1 08 iE9B1 PHP
E9B2 A5 84 LDA SA
E9B4 C9 11 CMP #$11 ; MAXSA+1
E9B6 90 02 BCC iE9BA
E9B8 29 0F AND #$0F
E9BA 0A iE9BA ASL
E9BB 28 PLP
E9BC 69 00 ADC #$00
E9BE AA TAX
E9BF BD B7 10 LDA LINTAB,X
E9C2 85 83 STA LINDX
E9C4 AA TAX
E9C5 C9 FF CMP #$FF
E9C7 F0 01 BEQ iE9CA
E9C9 60 RTS
E9CA 38 iE9CA SEC
E9CB 60 RTS
E9CC 20 9D E8 GETPRE JSR GETACT
E9CF 0A ASL
E9D0 AA TAX
E9D1 A4 83 LDY LINDX
E9D3 60 RTS
; READ BYTE FROM ACTIVE BUFFER
; AND SET FLAG IF LAST DATA BYTE
; IF LAST THEN Z=1 ELSE Z=0
E9D4 20 CC E9 GETBYT JSR GETPRE
E9D7 B9 C6 00 LDA LSTCHR,Y
E9DA F0 12 BEQ iE9EE
E9DC A1 3D LDA (BUFTAB,X)
E9DE 48 PHA
E9DF B5 3D LDA BUFTAB,X
E9E1 D9 C6 00 CMP LSTCHR,Y
E9E4 D0 04 BNE iE9EA
E9E6 A9 FF LDA #$FF
E9E8 95 3D STA BUFTAB,X
E9EA 68 iE9EA PLA
E9EB F6 3D INC BUFTAB,X
E9ED 60 RTS
E9EE A1 3D iE9EE LDA (BUFTAB,X)
E9F0 F6 3D INC BUFTAB,X
E9F2 60 RTS
; READ A CHAR FROM FILE AND READ NEXT
; BLOCK OF FILE IF NEEDED.
; SET CHNRDY=EOI IF END OF FILE
E9F3 20 D4 E9 RDBYT JSR GETBYT
E9F6 D0 31 BNE iEA29
E9F8 85 87 STA DATA
E9FA B9 C6 00 LDA LSTCHR,Y
E9FD F0 08 BEQ iEA07
E9FF A9 80 LDA #$80 ; EOIOUT
EA01 99 BE 00 STA CHNRDY,Y
EA04 A5 87 LDA DATA
EA06 60 RTS
EA07 20 E3 E7 iEA07 JSR DBLBUF
EA0A 20 D4 E9 JSR GETBYT
EA0D C9 00 CMP #$00
EA0F F0 19 BEQ iEA2A
EA11 85 81 STA TRACK
EA13 20 D4 E9 JSR GETBYT
EA16 85 82 STA SECTOR
EA18 20 E3 E7 JSR DBLBUF
EA1B 20 66 EA JSR SETDRN
EA1E 20 68 E8 JSR SETHDR
EA21 20 6A E9 JSR RDBUF
EA24 20 E3 E7 JSR DBLBUF
EA27 A5 87 LDA DATA
EA29 60 iEA29 RTS
EA2A 20 D4 E9 iEA2A JSR GETBYT
EA2D A4 83 LDY LINDX
EA2F 99 C6 00 STA LSTCHR,Y
EA32 A5 87 LDA DATA
EA34 60 RTS
; WRITE A CHAR TO CHANL AND WRITE
; BUFFER OUT TO DISK IF ITS FULL
EA35 20 89 E8 WRTBYT JSR PUTBYT
EA38 F0 01 BEQ iEA3B
EA3A 60 RTS
EA3B 20 66 EA iEA3B JSR SETDRN
EA3E 20 7C E4 JSR NXTTS
EA41 A5 81 LDA TRACK
EA43 20 89 E8 JSR PUTBYT
EA46 A5 82 LDA SECTOR
EA48 20 89 E8 JSR PUTBYT
EA4B 20 6E E9 JSR WRTBUF
EA4E A9 02 LDA #$02
EA50 20 89 EE JSR SETPNT
EA53 20 E3 E7 JSR DBLBUF
EA56 4C 68 E8 JMP SETHDR
; INC POINTER OF ACTIVE BUFFER
; BY .A
EA59 85 2A INCPTR STA TEMP ; SCOTT PATCH
EA5B 20 B0 EE JSR GETPNT
EA5E 18 CLC
EA5F 65 2A ADC TEMP
EA61 95 3D STA BUFTAB,X
EA63 85 93 STA DIRBUF
EA65 60 RTS
; SET DRVNUM TO DRIVE INDICATED BY
; LSTJOB OF ACTIVE BUFFER
EA66 20 9D E8 SETDRN JSR GETACT
EA69 AA TAX
EA6A BD 99 10 LDA LSTJOB,X
EA6D 29 01 AND #$01
EA6F 85 80 STA DRVNUM
EA71 60 RTS
; OPEN A READ CHANL WITH 2 BUFFERS
; WILL INSERT SA IN LINTAB
; AND INITS ALL POINTERS.
EA72 A9 02 OPNRCH LDA #$02 ; GET TWO DATA BUFFERS
EA74 20 F3 EA JSR GETRCH
EA77 20 98 EA JSR INTPNT
EA7A 20 43 E9 JSR STRDBL ; READ 1ST ONE OR TWO BLOCKS
EA7D A6 83 LDX LINDX
EA7F A9 88 LDA #$88 ; RDYTLK
EA81 95 BE STA CHNRDY,X
EA83 A9 02 LDA #$02
EA85 95 B6 STA FILTYP,X
EA87 A5 81 LDA TRACK
EA89 D0 04 BNE iEA8F
EA8B A5 82 LDA SECTOR
EA8D 95 C6 STA LSTCHR,X ; SET LAST CHAR PTR
EA8F 20 F3 E9 iEA8F JSR RDBYT ; SEQUENTIAL SET UP
EA92 A6 83 LDX LINDX
EA94 9D D9 10 STA CHNDAT,X
EA97 60 RTS
; INITIALIZE VARIABLES FOR OPEN CHANL
; LSTJOB,SETS ACTIVE BUFFER#,LSTCHR,
; BUFFER POINTERS IN BUFTAB=2
EA98 A5 83 INTPNT LDA LINDX
EA9A 0A ASL
EA9B AA TAX
EA9C A5 80 LDA DRVNUM
EA9E B4 5F LDY BUFNUM,X
EAA0 99 99 10 STA LSTJOB,Y
EAA3 B4 60 LDY BUFNUM+1,X
EAA5 99 99 10 STA LSTJOB,Y
EAA8 99 03 10 STA JOBS,Y
EAAB B5 5F LDA BUFNUM,X
EAAD 0A ASL
EAAE A8 TAY
EAAF A9 02 LDA #$02
EAB1 99 3D 00 STA BUFTAB,Y
EAB4 B5 60 LDA BUFNUM+1,X
EAB6 09 80 ORA #$80
EAB8 95 60 STA BUFNUM+1,X
EABA 0A ASL
EABB A8 TAY
EABC A9 02 LDA #$02
EABE 99 3D 00 STA BUFTAB,Y
EAC1 A9 00 LDA #$00
EAC3 95 6F STA BUFNUM+16,X
EAC5 95 70 STA BUFNUM+17,X
EAC7 A6 83 LDX LINDX
EAC9 A9 00 LDA #$00
EACB 95 C6 STA LSTCHR,X
EACD 60 RTS
; OPEN A WRITE CHANNEL WITH 2 BUFFERS
EACE 20 1B E5 OPNWCH JSR INTTS ; GET FIRST TRACK,SECTOR
EAD1 A9 02 LDA #$02
EAD3 20 E6 EA JSR GETWCH
EAD6 A6 83 LDX LINDX
EAD8 A9 02 LDA #$02
EADA 95 B6 STA FILTYP,X
EADC A9 01 LDA #$01
EADE 95 BE STA CHNRDY,X
EAE0 20 98 EA JSR INTPNT
EAE3 4C 68 E8 JMP SETHDR
; .A=#BUFFERS NEEDED
; SETS UP BUFFER # AND ALLOCATES LINDX
; for write
EAE6 85 2A GETWCH STA TEMP ; SAVE #BUFS NEEDED
EAE8 20 AD E9 JSR FNDWCH
EAEB B0 03 BCS iEAF0
EAED 20 66 EB JSR iEB66
EAF0 38 iEAF0 SEC
EAF1 B0 0B BCS iEAFE
; .A=#BUFFERS NEEDED
; SETS UP BUFFER # AND ALLOCATES LINDX
; for read
EAF3 85 2A GETRCH STA TEMP ; SAVE #BUFS NEEDED
EAF5 20 B0 E9 JSR FNDRCH
EAF8 B0 03 BCS iEAFD
EAFA 20 5F EB JSR iEB5F
EAFD 18 iEAFD CLC
EAFE 08 iEAFE PHP ; save r/w flag (.C)
EAFF 20 F6 EB JSR FNDLNX
EB02 85 83 STA LINDX
EB04 A5 84 LDA SA
EB06 0A ASL
EB07 28 PLP
EB08 69 00 ADC #$00
EB0A AA TAX
EB0B A5 83 LDA LINDX
EB0D 9D B7 10 STA LINTAB,X
EB10 0A iEB10 ASL
EB11 A8 TAY
EB12 A9 FF LDA #$FF
EB14 99 5F 00 STA BUFNUM,Y
EB17 99 60 00 STA BUFNUM+1,Y
EB1A C6 2A iEB1A DEC TEMP
EB1C 30 13 BMI iEB31
EB1E 20 88 EB JSR GETBUF
EB21 10 08 BPL iEB2B
EB23 20 6E EB JSR RELBUF
EB26 A9 70 LDA #$70
EB28 4C 90 F0 JMP CMDERR
EB2B 99 5F 00 iEB2B STA BUFNUM,Y
EB2E C8 INY
EB2F D0 E9 BNE iEB1A
EB31 60 iEB31 RTS
; FREE CHANL ASSOCIATED WITH SA
; FREE READ AND WRITE CHANLS
; DONT FREE CHANL 15
EB32 A5 84 FRECHN LDA SA
EB34 C9 0F CMP #$0F
EB36 D0 01 BNE iEB39
EB38 60 RTS
EB39 20 5F EB iEB39 JSR iEB5F
EB3C 4C 66 EB JMP iEB66
EB3F BD B7 10 iEB3F LDA LINTAB,X
EB42 C9 FF CMP #$FF
EB44 F0 18 BEQ iEB5E
EB46 85 83 STA LINDX
EB48 A9 FF LDA #$FF
EB4A 9D B7 10 STA LINTAB,X
EB4D 20 6E EB JSR RELBUF
EB50 A6 83 LDX LINDX
EB52 A9 01 LDA #$01
EB54 CA iEB54 DEX
EB55 30 03 BMI iEB5A
EB57 0A ASL
EB58 D0 FA BNE iEB54
EB5A 05 3C iEB5A ORA LINUSE
EB5C 85 3C STA LINUSE
EB5E 60 iEB5E RTS
EB5F A5 84 iEB5F LDA SA
EB61 0A ASL
EB62 AA TAX
EB63 4C 3F EB JMP iEB3F
EB66 A5 84 iEB66 LDA SA
EB68 0A ASL
EB69 AA TAX
EB6A E8 INX
EB6B 4C 3F EB JMP iEB3F
; GIVEN SA, FREE ITS READ CHANL
; RELEASE BUFFERS (LINDX)
EB6E A5 83 RELBUF LDA LINDX
EB70 0A ASL
EB71 AA TAX
EB72 B5 5F LDA BUFNUM,X
EB74 C9 FF CMP #$FF
EB76 F0 03 BEQ iEB7B
EB78 20 B0 EB JSR FREBUF
EB7B A5 83 iEB7B LDA LINDX
EB7D 0A ASL
EB7E AA TAX
EB7F B5 60 LDA BUFNUM+1,X
EB81 C9 FF CMP #$FF
EB83 F0 D9 BEQ iEB5E
EB85 4C B0 EB JMP FREBUF
; GET A FREE BUFFER #
EB88 A9 FF GETBUF LDA #$FF
EB8A 85 2B STA TEMP+1
EB8C A2 0F LDX #$0F
EB8E 26 8B iEB8E ROL BUFUSE
EB90 26 8C ROL BUFUSE+1
EB92 B0 05 BCS iEB99
EB94 86 2B STX TEMP+1
EB96 38 SEC
EB97 B0 0E BCS iEBA7
EB99 CA iEB99 DEX
EB9A 10 F2 BPL iEB8E
EB9C A6 2B iEB9C LDX TEMP+1
EB9E 30 05 BMI iEBA5
EBA0 A9 00 LDA #$00
EBA2 9D 03 10 STA JOBS,X
EBA5 8A iEBA5 TXA
EBA6 60 RTS
EBA7 26 8B iEBA7 ROL BUFUSE
EBA9 26 8C ROL BUFUSE+1
EBAB CA DEX
EBAC 10 F9 BPL iEBA7
EBAE 30 EC BMI iEB9C
; ALLOCATE
EBB0 29 0F FREBUF AND #$0F
EBB2 A8 TAY
EBB3 C8 INY
EBB4 A2 10 LDX #$10
EBB6 66 8C iEBB6 ROR BUFUSE+1
EBB8 66 8B ROR BUFUSE
EBBA 88 DEY
EBBB D0 01 BNE iEBBE
EBBD 18 CLC
EBBE CA iEBBE DEX
EBBF 10 F5 BPL iEBB6
EBC1 60 RTS
EBC2 A9 0E CLRCHN LDA #$0E
EBC4 85 84 STA SA
EBC6 20 32 EB iEBC6 JSR FRECHN
EBC9 C6 84 DEC SA
EBCB D0 F9 BNE iEBC6
EBCD 60 RTS
EBCE A9 1D CLDCHN LDA #$1D
EBD0 85 2D STA TEMP+3
EBD2 A6 2D iEBD2 LDX TEMP+3
EBD4 BD B7 10 LDA LINTAB,X
EBD7 C9 FF CMP #$FF
EBD9 F0 16 BEQ iEBF1
EBDB 85 83 STA LINDX
EBDD 8A TXA
EBDE 4A LSR
EBDF 85 84 STA SA
EBE1 20 9D E8 JSR GETACT
EBE4 AA TAX
EBE5 BD 99 10 LDA LSTJOB,X
EBE8 29 01 AND #$01
EBEA C5 80 CMP DRVNUM
EBEC D0 03 BNE iEBF1
EBEE 20 32 EB JSR FRECHN
EBF1 C6 2D iEBF1 DEC TEMP+3
EBF3 10 DD BPL iEBD2
EBF5 60 RTS
; FIND A FREE LINDX TO USE
; MARK AS USED IN LINUSE
EBF6 A0 00 FNDLNX LDY #$00
EBF8 A9 01 LDA #$01
EBFA 24 3C iEBFA BIT LINUSE ; 1=FREE 0=USED
EBFC D0 09 BNE iEC07
EBFE C8 INY
EBFF 0A ASL
EC00 D0 F8 BNE iEBFA
EC02 A9 70 LDA #$70 ; NOCHNL; NO FREE LINDX AVAILABLE
EC04 4C 90 F0 JMP CMDERR
EC07 49 FF iEC07 EOR #$FF ; TOGGLE BIT MASK
EC09 25 3C AND LINUSE ; MARK BIT USED
EC0B 85 3C STA LINUSE
EC0D 98 TYA ; RETURN LINDX IN .A
EC0E 60 RTS
; CLOSE THE FILE ASSOCIATED WITH SA
; this routine is massively different, partly due to REL files in 4040
EC0F A5 84 CLOSE LDA SA
EC11 F0 3D BEQ iEC50 ; DIRECTORY CLOSE
EC13 C9 0F CMP #$0F
EC15 F0 1B BEQ CLSALL ; CLOSE CMD CHANL
EC17 20 AD E9 JSR FNDWCH
EC1A B0 13 BCS iEC2F
EC1C A6 83 LDX LINDX
EC1E B5 B6 LDA FILTYP,X
EC20 29 0E AND #$0E
EC22 C9 08 CMP #$08
EC24 F0 06 BEQ iEC2C
EC26 20 5E EC JSR iEC5E
EC29 20 53 ED JSR iED53
EC2C 20 87 EC iEC2C JSR MAPOUT
EC2F 4C 32 EB iEC2F JMP FRECHN
EC32 A9 00 CLSALL LDA #$00
EC34 85 84 STA SA
EC36 20 AD E9 iEC36 JSR FNDWCH
EC39 B0 09 BCS iEC44
EC3B 20 5E EC JSR iEC5E
EC3E 20 53 ED JSR iED53
EC41 20 87 EC JSR MAPOUT
EC44 20 32 EB iEC44 JSR FRECHN
EC47 E6 84 INC SA
EC49 A5 84 LDA SA
EC4B C9 0F CMP #$0F
EC4D D0 E7 BNE iEC36
EC4F 60 RTS
EC50 A9 00 iEC50 LDA #$00
EC52 85 38 STA DIRLST ; CLEAR DIR LIST
EC54 20 32 EB JSR FRECHN
EC57 A9 10 LDA #$10 ; in 4040 JMP FREICH
EC59 85 84 STA SA
EC5B 4C 32 EB JMP FRECHN
EC5E 20 B0 EE iEC5E JSR GETPNT
EC61 C9 02 CMP #$02
EC63 D0 07 BNE iEC6C
EC65 A9 0D LDA #$0D
EC67 20 89 E8 JSR PUTBYT
EC6A A9 03 LDA #$03
EC6C 85 2A iEC6C STA TEMP
EC6E C6 2A DEC TEMP
EC70 20 9D E8 JSR GETACT
EC73 0A ASL
EC74 AA TAX
EC75 A9 00 LDA #$00
EC77 95 3D STA BUFTAB,X
EC79 81 3D STA (BUFTAB,X)
EC7B F6 3D INC BUFTAB,X
EC7D A5 2A LDA TEMP
EC7F 81 3D STA (BUFTAB,X)
EC81 20 6E E9 JSR WRTBUF
EC84 4C 59 E8 JMP WATJOB
; WRITE OUT THE BIT MAP TO
; THE DRIVE IN LSTJOB(ACTIVE)
EC87 20 9D E8 MAPOUT JSR GETACT
EC8A AA TAX
EC8B BD 99 10 LDA LSTJOB,X
EC8E 29 01 AND #$01
EC90 48 PHA ; CHECK BAM BEFORE WRITING
EC91 AA TAX
EC92 A9 00 LDA #$00
EC94 85 82 STA SECTOR
EC96 BD 40 E5 LDA IPBM,X
EC99 85 2F STA TEMP+5
EC9B A9 00 LDA #$00
EC9D 85 2E STA TEMP+4
EC9F A9 01 LDA #$01
ECA1 85 81 STA TRACK
; VERIFY THE BAM BLOCK COUNT
; MATCHES THE BITS
ECA3 A5 81 MAPCHK LDA TRACK
ECA5 0A ASL
ECA6 0A ASL
ECA7 A8 TAY
ECA8 B1 2E LDA (TEMP+4),Y
ECAA 85 2D STA TEMP+3
ECAC C8 INY
ECAD B1 2E LDA (TEMP+4),Y
ECAF 85 2A STA TEMP
ECB1 C8 INY
ECB2 B1 2E LDA (TEMP+4),Y
ECB4 85 2B STA TEMP+1
ECB6 C8 INY
ECB7 B1 2E LDA (TEMP+4),Y
ECB9 85 2C STA TEMP+2
ECBB 20 93 E5 JSR AVCK
ECBE E6 81 INC TRACK
ECC0 A5 81 LDA TRACK
ECC2 C9 24 CMP #$24 ; MAXTRK
ECC4 D0 DD BNE MAPCHK
ECC6 A9 12 LDA #$12
ECC8 85 81 STA TRACK
ECCA 68 PLA
ECCB A8 TAY
ECCC 18 CLC
ECCD 69 0D ADC #$0D ; BAMJOB
ECCF AA TAX
ECD0 98 TYA
ECD1 09 90 ORA #$90 ; WRITE
ECD3 4C 08 E9 JMP DOIT
; GET NEXT CHAR FROM A CHANL
ECD6 A6 83 GET LDX LINDX
ECD8 B5 BE LDA CHNRDY,X
ECDA 29 08 AND #$08
ECDC D0 13 BNE iECF1
ECDE B5 B6 LDA FILTYP,X
ECE0 49 08 EOR #$08
ECE2 4A LSR
ECE3 D0 07 BNE iECEC
ECE5 A9 89 LDA #$89
ECE7 95 BE STA CHNRDY,X
ECE9 4C 1A ED JMP iED1A
ECEC A9 00 iECEC LDA #$00
ECEE 95 BE STA CHNRDY,X
ECF0 60 RTS
ECF1 A5 84 iECF1 LDA SA
ECF3 F0 54 BEQ iED49
ECF5 C9 0F CMP #$0F
ECF7 D0 19 BNE iED12
ECF9 20 D4 E9 JSR GETBYT
ECFC D0 45 BNE GET3
ECFE 85 87 STA DATA
ED00 A9 B4 LDA #$B4
ED02 20 89 EE JSR SETPNT
ED05 AD 82 02 LDA RIOT2PBD
ED08 29 DF AND #$DF
ED0A 8D 82 02 STA RIOT2PBD
ED0D A5 87 LDA DATA
ED0F 4C 43 ED JMP GET3
ED12 A6 83 iED12 LDX LINDX
ED14 B5 B6 LDA FILTYP,X
ED16 49 08 EOR #$08
ED18 D0 26 BNE SEQGET
ED1A 20 9D E8 iED1A JSR GETACT
ED1D 0A ASL
ED1E AA TAX
ED1F A4 83 LDY LINDX
ED21 B5 3D LDA BUFTAB,X
ED23 D9 C6 00 CMP LSTCHR,Y ; UP TO LST CHAR YET
ED26 D0 04 BNE RNGET1 ; NOT YET
ED28 A9 00 LDA #$00 ; READ THE WHOLE THING
ED2A 95 3D STA BUFTAB,X ; WRAP PNTR TO 0
ED2C F6 3D RNGET1 INC BUFTAB,X ; GET THE NEXT CHAR
ED2E A1 3D RNGET2 LDA (BUFTAB,X)
ED30 99 D9 10 STA CHNDAT,Y ; SAVE CHAR IN
ED33 B5 3D LDA BUFTAB,X
ED35 D9 C6 00 CMP LSTCHR,Y
ED38 D0 05 BNE RNGET3
ED3A A9 81 LDA #$81 ; RNDEOI
ED3C 99 BE 00 STA CHNRDY,Y ; THIS IS LAST CHAR
ED3F 60 RNGET3 RTS ; SEND EOI WITH IT
ED40 20 F3 E9 SEQGET JSR RDBYT ; READ THE NEXT BYTE
ED43 A6 83 GET3 LDX LINDX
ED45 9D D9 10 STA CHNDAT,X ; STORE IN CHNDAT
ED48 60 RTS
ED49 A5 38 iED49 LDA DIRLST
ED4B F0 C5 BEQ iED12
ED4D 20 F0 EF JSR GETDIR
ED50 4C 43 ED JMP GET3
ED53 A6 83 iED53 LDX LINDX
ED55 8E EB 10 STX x10EB
ED58 A5 84 LDA SA
ED5A 48 PHA
ED5B BD E1 10 LDA CHNDAT+8,X
ED5E 48 PHA
ED5F 29 1F AND #$1F
ED61 85 82 STA SECTOR
ED63 68 PLA
ED64 29 E0 AND #$E0
ED66 09 02 ORA #$02
ED68 85 D8 STA INDEX
ED6A B5 B6 LDA FILTYP,X
ED6C 29 01 AND #$01
ED6E 85 80 STA DRVNUM
ED70 A9 12 LDA #$12
ED72 85 81 STA TRACK
ED74 20 88 EB JSR GETBUF
ED77 48 PHA
ED78 85 8D STA JOBNUM
ED7A 20 1D EE JSR DRTRD
ED7D A0 00 LDY #$00
ED7F BD CE EE LDA BUFIND,X
ED82 85 9C STA F2PTR
ED84 A5 D8 LDA INDEX
ED86 85 9B STA F1PTR
ED88 B1 9B LDA (F1PTR),Y
ED8A 10 25 BPL iEDB1
ED8C 29 8F AND #$8F
ED8E 91 9B STA (F1PTR),Y
ED90 C8 INY
ED91 B1 9B LDA (F1PTR),Y
ED93 85 81 STA TRACK
ED95 84 2C STY TEMP+2
ED97 A0 1B LDY #$1B
ED99 B1 9B LDA (F1PTR),Y
ED9B 48 PHA
ED9C 88 DEY
ED9D B1 9B LDA (F1PTR),Y
ED9F A4 2C LDY TEMP+2
EDA1 91 9B STA (F1PTR),Y
EDA3 C8 INY
EDA4 B1 9B LDA (F1PTR),Y
EDA6 85 82 STA SECTOR
EDA8 68 PLA
EDA9 91 9B STA (F1PTR),Y
EDAB 20 B6 F9 JSR DELFIL
EDAE 4C B5 ED JMP iEDB5
EDB1 09 80 iEDB1 ORA #$80
EDB3 91 9B STA (F1PTR),Y
EDB5 AD EB 10 iEDB5 LDA x10EB
EDB8 0A ASL
EDB9 AA TAX
EDBA A0 1C LDY #$1C
EDBC B5 6F LDA BUFNUM+16,X
EDBE 91 9B STA (F1PTR),Y
EDC0 C8 INY
EDC1 B5 70 LDA BUFNUM+17,X
EDC3 91 9B STA (F1PTR),Y
EDC5 68 PLA
EDC6 AA TAX
EDC7 A9 90 LDA #$90
EDC9 05 80 ORA DRVNUM
EDCB 20 08 E9 JSR DOIT
EDCE 8A TXA
EDCF 20 B0 EB JSR FREBUF
EDD2 68 PLA
EDD3 85 84 STA SA
EDD5 60 RTS
; INITIALIZE BUFFER PNTR TABLE
; this function is much longer in 4040
EDD6 A2 00 INTTAB LDX #$00
EDD8 A0 00 LDY #$00
EDDA A9 00 iEDDA LDA #$00
EDDC 95 3D STA BUFTAB,X
EDDE E8 INX
EDDF B9 CE EE LDA BUFIND,Y
EDE2 95 3D STA BUFTAB,X
EDE4 E8 INX
EDE5 C8 INY
EDE6 C9 43 CMP #$43
EDE8 D0 F0 BNE iEDDA
EDEA A9 B4 LDA #$B4
EDEC 85 5D STA x5D
EDEE A9 43 LDA #$43
EDF0 85 5E STA x5E
EDF2 60 RTS
; READ NEXT BUFFER OF A FILE
; FOLLOW LINKS IN FIRST TWO BYTES
; END OF FILE IF 1ST BYTE=0
; 2ND CHAR LENGTH
EDF3 20 9D E8 NXTBUF JSR GETACT
EDF6 0A ASL
EDF7 AA TAX
EDF8 A9 00 LDA #$00
EDFA 95 3D STA BUFTAB,X
EDFC A1 3D LDA (BUFTAB,X)
EDFE F0 05 BEQ iEE05
EE00 D6 3D DEC BUFTAB,X
EE02 4C F3 E9 JMP RDBYT
EE05 60 iEE05 RTS
; READ TRACK, SECTOR FROM HEADER
EE06 20 B0 E9 CURBLK JSR FNDRCH
EE09 20 9D E8 JSR GETACT
EE0C 85 8D STA JOBNUM
EE0E 0A ASL
EE0F 0A ASL
EE10 0A ASL
EE11 AA TAX
EE12 BD 24 10 LDA HDRS+3,X
EE15 85 82 STA SECTOR
EE17 BD 23 10 LDA HDRS+2,X
EE1A 85 81 STA TRACK
EE1C 60 RTS
; DIRECT BLOCK READ
EE1D A9 80 DRTRD LDA #$80 ; READ
EE1F D0 02 BNE iEE23
; DIRECT BLOCK WRITE
EE21 A9 90 DRTWRT LDA #$90 ; WRITE
EE23 05 80 iEE23 ORA DRVNUM
EE25 85 89 STA CMD
EE27 A5 8D LDA JOBNUM
EE29 20 6B E8 JSR SETH
EE2C A6 8D LDX JOBNUM
EE2E A5 81 LDA TRACK
EE30 9D 12 10 STA x1012,X
EE33 4C 0A E9 JMP DOIT2
; OPEN INTERNAL READ CHANL (SA=16)
EE36 A9 10 OPNIRD LDA #$10 ; IRSA
EE38 85 84 STA SA
EE3A 20 72 EA JSR OPNRCH
EE3D A9 02 LDA #$02
EE3F 4C 89 EE JMP SETPNT
; OPEN INTERNAL WRITE CHANL (SA=16)
EE42 A9 10 iEE42 LDA #$10
EE44 85 84 STA SA
EE46 4C CE EA JMP OPNWCH
; ALLOCATE NEXT DIRECTORY BLOCK ON 18
; AND MARK AS USED IN BAM
EE49 20 06 EE NXDRBK JSR CURBLK
EE4C 20 9D E8 JSR GETACT
EE4F 85 3B STA x3B
EE51 A9 01 LDA #$01
EE53 85 2A STA TEMP
EE55 A5 92 LDA SECINC
EE57 48 PHA
EE58 A9 03 LDA #$03 ; INCR SECTOR BY 3 IN DIRECTORY
EE5A 85 92 STA SECINC
EE5C 20 91 E4 JSR NXTDS
EE5F 68 PLA
EE60 85 92 STA SECINC
EE62 A9 00 LDA #$00
EE64 20 89 EE JSR SETPNT
EE67 A5 81 LDA TRACK
EE69 20 89 E8 JSR PUTBYT
EE6C A5 82 LDA SECTOR
EE6E 20 89 E8 JSR PUTBYT
EE71 20 6E E9 JSR WRTBUF
EE74 20 59 E8 JSR WATJOB
EE77 A9 00 LDA #$00
EE79 20 89 EE JSR SETPNT
EE7C 20 89 E8 iEE7C JSR PUTBYT
EE7F D0 FB BNE iEE7C
EE81 20 89 E8 JSR PUTBYT
EE84 A9 FF LDA #$FF
EE86 4C 89 E8 JMP PUTBYT
; .A=NEW PNTR VALUE
EE89 85 2A SETPNT STA TEMP
EE8B 20 9D E8 JSR GETACT
EE8E 0A ASL
EE8F AA TAX
EE90 B5 3E LDA BUFTAB+1,X
EE92 85 94 STA DIRBUF+1
EE94 A5 2A LDA TEMP
EE96 95 3D STA BUFTAB,X
EE98 85 93 STA DIRBUF
EE9A 60 RTS
EE9B 85 2A STA TEMP
EE9D A9 07 LDA #$07
EE9F 85 83 STA LINDX
EEA1 20 6E EB JSR RELBUF
EEA4 A5 83 LDA LINDX
EEA6 4C 10 EB JMP iEB10
; FREE THE INTERNAL CHANL (SA=16)
EEA9 A9 10 FREICH LDA #$10 ; in the 4040 there are two calls to FRECHN, with .A as #IRSA and #IWSA
EEAB 85 84 STA SA
EEAD 4C 32 EB JMP FRECHN
; READ THE ACTIVE BUFFER POINTER
EEB0 20 9D E8 GETPNT JSR GETACT
EEB3 0A ASL
EEB4 AA TAX
EEB5 B5 3E LDA BUFTAB+1,X
EEB7 85 94 STA DIRBUF+1
EEB9 B5 3D LDA BUFTAB,X
EEBB 85 93 STA DIRBUF
EEBD 60 RTS
; DIRECT READ BYTE, .A=BYTE# TO READ
EEBE 85 2C DRDBYT STA TEMP+2
EEC0 20 9D E8 JSR GETACT
EEC3 AA TAX
EEC4 BD CE EE LDA BUFIND,X
EEC7 85 2D STA TEMP+3
EEC9 A0 00 LDY #$00
EECB B1 2C LDA (TEMP+2),Y
EECD 60 RTS
; INDEX TABLE CONTAINING HIGH
; BYTE ADRESS OF BUFFERS
EECE BUFIND .byte $11, $12, $13, $20, $21, $22, $23, $30 ;qrs !"#0
EED6 .byte $31, $32, $33, $40, $41, $42, $43 ;123@abc
; POINT BMPNT AT BAM
; MARK A TRACK, SECTOR AS FREE IN BAM
EEDD 20 5F E5 FRETS JSR SETBMP ; POINT BMPNT AT BAM
EEE0 A5 81 LDA TRACK ; CALC INDEX INTO BAM - in 4040 done in subrouting FREUSE
EEE2 0A ASL
EEE3 0A ASL
EEE4 85 2A STA TEMP
EEE6 A8 TAY
EEE7 B1 28 LDA (BMPNT),Y
EEE9 AA TAX
EEEA E8 INX
EEEB 8A TXA
EEEC 91 28 STA (BMPNT),Y
EEEE A5 82 LDA SECTOR
EEF0 4A LSR
EEF1 4A LSR
EEF2 4A LSR
EEF3 18 CLC
EEF4 65 2A ADC TEMP
EEF6 A8 TAY
EEF7 C8 INY
EEF8 A5 82 LDA SECTOR
EEFA 29 07 AND #$07
EEFC AA TAX
EEFD A9 01 LDA #$01
EEFF CA iEEFF DEX
EF00 30 03 BMI iEF05
EF02 0A ASL
EF03 90 FA BCC iEEFF
EF05 11 28 iEF05 ORA (BMPNT),Y ; free it
EF07 91 28 STA (BMPNT),Y
EF09 60 RTS
; TURN ON ACTIVITY LED SPECIFIED
; BY DRVNUM
EF0A A9 E7 SETLDS LDA #$E7 ; clear both LEDs
EF0C 2D 82 02 AND RIOT2PBD
EF0F 8D 82 02 STA RIOT2PBD ; the 4040 does not store it back, but puts it on stack. Avoiding possible IO side effects
EF12 A5 80 LDA DRVNUM
EF14 F0 09 BEQ iEF1F
EF16 A9 08 LDA #$08 ; LED1
EF18 0D 82 02 ORA RIOT2PBD
EF1B 8D 82 02 STA RIOT2PBD
EF1E 60 RTS
EF1F A9 10 iEF1F LDA #$10 ; LED0
EF21 0D 82 02 ORA RIOT2PBD
EF24 8D 82 02 STA RIOT2PBD
EF27 60 RTS
; START THE DIRECTORY LOADING FUNCTION
; GET THE BUFFER AND GET IT STARTED
EF28 A9 00 iEF28 LDA #$00
EF2A 85 84 STA SA
EF2C A9 01 LDA #$01 ; ALLOCATE CHANL AND 1 BUFFER
EF2E 20 F3 EA JSR GETRCH
EF31 A9 00 LDA #$00
EF33 20 89 EE JSR SETPNT
EF36 A6 83 LDX LINDX
EF38 A9 00 LDA #$00
EF3A 95 C6 STA LSTCHR,X
EF3C 20 9D E8 JSR GETACT
EF3F AA TAX
EF40 A5 80 LDA DRVNUM
EF42 9D 99 10 STA LSTJOB,X
EF45 A9 00 LDA #$00
EF47 95 3D STA BUFTAB,X
EF49 A9 01 LDA #$01 ; PUT SAL IN BUFFER
EF4B 20 89 E8 JSR PUTBYT
EF4E A9 04 LDA #$04 ; PUT SAH IN BUFFER
EF50 20 89 E8 JSR PUTBYT
EF53 A9 01 LDA #$01 ; INSERT FHONEY LINKS (0101)
EF55 20 89 E8 JSR PUTBYT
EF58 20 89 E8 JSR PUTBYT
EF5B A5 80 LDA DRVNUM ; the 4040 reads NBTEMP here
EF5D 20 89 E8 JSR PUTBYT ; PUT IN DRVNUM
EF60 A9 00 LDA #$00
EF62 20 89 E8 JSR PUTBYT
EF65 20 E2 EF JSR MOVBUF ; GET DISK NAME
EF68 20 9D E8 JSR GETACT
EF6B 0A ASL
EF6C AA TAX
EF6D D6 3D DEC BUFTAB,X
EF6F D6 3D DEC BUFTAB,X
EF71 A9 00 LDA #$00 ; END OF THIS LINE
EF73 20 89 E8 JSR PUTBYT
EF76 A9 01 DIR1 LDA #$01 ; INSERT FHONEY LINKS ($0101)
EF78 20 89 E8 JSR PUTBYT
EF7B 20 89 E8 JSR PUTBYT
EF7E 20 51 F5 JSR GETNAM ; GET #BUFRS AND FILE NAME
EF81 90 2B BCC DIR3 ; TEST IF LAST ENTRY
EF83 AD ED 10 LDA NBTEMP
EF86 20 89 E8 JSR PUTBYT
EF89 AD EE 10 LDA NBTEMP+1
EF8C 20 89 E8 JSR PUTBYT
EF8F 20 E2 EF JSR MOVBUF
EF92 A9 00 LDA #$00 ; END OF ENTRY
EF94 20 89 E8 JSR PUTBYT
EF97 D0 DD BNE DIR1
EF99 20 9D E8 DIR10 JSR GETACT
EF9C 0A ASL
EF9D AA TAX
EF9E A9 00 LDA #$00
EFA0 95 3D STA BUFTAB,X
EFA2 A9 88 LDA #$88 ; RDYTLK
EFA4 A4 83 LDY LINDX
EFA6 85 38 STA DIRLST
EFA8 99 BE 00 STA CHNRDY,Y ; DIRECTORY LIST BUFFER FULL
EFAB A5 87 LDA DATA
EFAD 60 RTS
EFAE AD ED 10 DIR3 LDA NBTEMP ; THIS IS END OF LOAD
EFB1 20 89 E8 JSR PUTBYT
EFB4 AD EE 10 LDA NBTEMP+1
EFB7 20 89 E8 JSR PUTBYT
EFBA 20 E2 EF JSR MOVBUF
EFBD 20 9D E8 JSR GETACT
EFC0 0A ASL
EFC1 AA TAX
EFC2 D6 3D DEC BUFTAB,X
EFC4 D6 3D DEC BUFTAB,X
EFC6 A9 00 LDA #$00 ; END OF LISTING (000)
EFC8 20 89 E8 JSR PUTBYT
EFCB 20 89 E8 JSR PUTBYT
EFCE 20 89 E8 JSR PUTBYT
EFD1 20 9D E8 JSR GETACT
EFD4 0A ASL
EFD5 A8 TAY
EFD6 B9 3D 00 LDA BUFTAB,Y
EFD9 A6 83 LDX LINDX
EFDB 95 C6 STA LSTCHR,X
EFDD D6 C6 DEC LSTCHR,X
EFDF 4C 99 EF JMP DIR10
; TRANSFRE FILE NAME TO LISTING BUFFER
EFE2 A0 00 MOVBUF LDY #$00
EFE4 B9 B4 42 iEFE4 LDA NAMBUF,Y
EFE7 20 89 E8 JSR PUTBYT
EFEA C8 INY
EFEB C0 1B CPY #$1B ; in 4040 src this is #27, not a constant
EFED D0 F5 BNE iEFE4
EFEF 60 RTS
; GET CHAR FOR DIRECTORY LOADING
EFF0 20 D4 E9 GETDIR JSR GETBYT
EFF3 F0 01 BEQ iEFF6
EFF5 60 RTS
EFF6 85 87 iEFF6 STA DATA
EFF8 A4 83 LDY LINDX
EFFA B9 C6 00 LDA LSTCHR,Y
EFFD F0 08 BEQ iF007
; *** EFFF: Warning: Possibly modifyable opcode. ***
EFFF A9 80 LDA #$80 ; EOIOUT
F001 99 BE 00 STA CHNRDY,Y
F004 A5 87 LDA DATA
F006 60 RTS
F007 4C 76 EF iF007 JMP DIR1
; CALC THE NUMBER OF FREE BLOCKS ON DRVNUM
F00A A6 80 NUMFRE LDX DRVNUM
F00C BD 40 E5 LDA IPBM,X
F00F 85 2B STA TEMP+1
F011 A9 04 LDA #$04
F013 85 2A STA TEMP ; 0 LOW PTR
F015 A9 00 LDA #$00
F017 8D ED 10 STA NBTEMP
F01A 8D EE 10 STA NBTEMP+1
F01D A9 22 LDA #$22
F01F 85 2C STA TEMP+2
F021 A0 00 iF021 LDY #$00
F023 18 CLC
F024 B1 2A LDA (TEMP),Y
F026 6D ED 10 ADC NBTEMP
F029 8D ED 10 STA NBTEMP
F02C AD EE 10 LDA NBTEMP+1
F02F 69 00 ADC #$00
F031 8D EE 10 STA NBTEMP+1
F034 A5 2A LDA TEMP
F036 18 iF036 CLC
F037 69 04 ADC #$04
F039 C9 48 CMP #$48 ; DON'T COUNT THE DIR
F03B F0 F9 BEQ iF036
F03D 85 2A STA TEMP
F03F C6 2C DEC TEMP+2
F041 D0 DE BNE iF021
F043 60 RTS
; PARSE & EXECUTE STRING IN CMDBUF
; in 4040 there is some code in PARSXQ before this code here
F044 20 59 F1 PARSXQ JSR CMDSET ; SET VARIABLES, REGS
F047 B9 00 00 LDA CMDBUF,Y
F04A 85 97 STA CHAR
F04C A2 09 LDX #$09 ; NCMDS-1
F04E BD 00 E0 iF04E LDA CMDTBL,X
F051 C5 97 CMP CHAR
F053 F0 08 BEQ iF05D
F055 CA DEX
F056 10 F6 BPL iF04E
F058 A9 31 LDA #$31 ; BADCMD, NO SUCH CMD
F05A 4C 90 F0 JMP CMDERR
F05D 86 96 iF05D STX CMDNUM ; X= CMD #
F05F E0 06 CPX #$06 ; PCMD, CMDS NOT PARSED
F061 90 03 BCC iF066
F063 20 AB F0 JSR TAGCMD ; SET TABLES, POINTERS &PATTERNS
F066 A6 96 iF066 LDX CMDNUM
F068 BD 0A E0 LDA CJUMPL,X
F06B 85 2A STA TEMP
F06D BD 14 E0 LDA CJUMPH,X
F070 85 2B STA TEMP+1
F072 6C 2A 00 JMP (TEMP) ; COMMAND TABLE JUMP
; SUCCESSFUL COMMAND TERMINATION
F075 A0 00 ENDCMD LDY #$00
F077 98 TYA
F078 84 81 STY TRACK
F07A 84 82 SCREND STY SECTOR ; SCRATCH ENTRY
F07C 84 5B STY x5B ; CB
F07E 20 5D E7 JSR ERRMSG
F081 A5 80 LDA DRVNUM
F083 85 D2 STA LSTDRV
F085 AD 82 02 LDA RIOT2PBD
F088 29 DF AND #$DF
F08A 8D 82 02 STA RIOT2PBD
F08D 4C A9 EE JMP FREICH ; FREE INTERNAL CHANNELS (? label should be FREICH)
; COMMAND LEVEL ERROR PROCESSING
F090 A0 00 CMDERR LDY #$00
F092 84 81 STY TRACK
F094 84 82 STY SECTOR
F096 4C D4 E6 JMP CMDER2
F099 A2 00 SIMPRS LDX #$00 ; SIMPLE PARSER
F09B 86 9D STX FILTBL
F09D A9 3A LDA #$3A ; ":"
F09F 20 17 F1 JSR PARSE
F0A2 F0 04 BEQ iF0A8
F0A4 88 DEY
F0A5 88 DEY
F0A6 84 9D STY FILTBL
F0A8 4C EC F1 iF0A8 JMP SETANY ; SET DRIVE#
; TAG COMMAND STRING
; SET UP CMD STRUCTURE
; IMAGE & FILE STREAM PTRS
; Note: in 4040 the code up to the first PARSE is in subroutine PRSCLN
F0AB A0 00 TAGCMD LDY #$00
F0AD A2 00 LDX #$00
F0AF A9 3A LDA #$3A ; ":"
F0B1 20 17 F1 JSR PARSE ; FIND POS'N OF ":"
F0B4 D0 05 BNE iF0BB
F0B6 A9 34 iF0B6 LDA #$34 ; NOFILE, NONE, NO FILES
F0B8 4C 90 F0 JMP CMDERR
F0BB 88 iF0BB DEY
F0BC 88 DEY
F0BD 84 9D STY FILTBL ; ":"-1 STARTS FS1
F0BF 8A TXA
F0C0 D0 F4 BNE iF0B6 ; ERR: "," BEFORE ":"
F0C2 A9 3D iF0C2 LDA #$3D ; SEARCH "="
F0C4 20 17 F1 JSR PARSE
F0C7 8A TXA ; ?FILE COUNT = 1-1?
F0C8 F0 02 BEQ iF0CC
F0CA A9 40 LDA #$40 ; %01000000, G1-BIT
F0CC 09 21 iF0CC ORA #$21 ; %00100001, E1,^E2-BITS
F0CE 85 CF STA IMAGE ; FS STRUCTURE
F0D0 E8 INX
F0D1 86 99 STX F1CNT
F0D3 86 9A STX R0 ; F2CNT, INIT FOR NO FS2
F0D5 A5 CE LDA PATFLG
F0D7 F0 0A BEQ iF0E3
F0D9 A9 80 LDA #$80 ; %10000000, P1-BIT
F0DB 05 CF ORA IMAGE
F0DD 85 CF STA IMAGE
F0DF A9 00 LDA #$00
F0E1 85 CE STA PATFLG ; CLEAR PATTERN FLAG
F0E3 98 iF0E3 TYA ; PTR TO FS2
F0E4 F0 21 BEQ iF107 ; FS2 NOT HERE
F0E6 95 9D STA FILTBL,X
F0E8 A5 99 LDA F1CNT ; FS2 IS HERE NOW,...
F0EA 85 9C STA F2PTR ; ...NOW SET F2 PTR
F0EC A9 8D LDA #$8D ; FIND CR-SHIFTED
F0EE 20 17 F1 JSR PARSE ; PARSE REST OF CMD STRING
F0F1 E8 INX ; ADVANCE FILTBL PTR TO END
F0F2 86 9A STX R0 ; F2CNT, SAVE IT
F0F4 CA DEX ; RESTORE FOR TEST
F0F5 A5 CE LDA PATFLG ; SAVE LAST PATTERN
F0F7 F0 02 BEQ iF0FB ; ?ANY PATTERN?
F0F9 A9 08 LDA #$08 ; %1000, YES, P2-BIT
F0FB E4 99 iF0FB CPX F1CNT ; ?F2CNT=F1CNT+1?
F0FD F0 02 BEQ iF101
F0FF 09 04 ORA #$04 ; %0100, G2-BIT
F101 09 03 iF101 ORA #$03 ; %0011, E2-BIT, ^E2-BIT
F103 45 CF EOR IMAGE ; EOR CLEARS ^E2-BIT
F105 85 CF STA IMAGE
F107 A6 96 iF107 LDX CMDNUM
F109 3D 18 E0 AND CJUMPH+4,X ; MATCH CMD TEMPLATE (orignal label: STRUCT)
F10C D0 01 BNE iF10F
F10E 60 RTS
F10F 8D E9 10 iF10F STA ERWORD ; **COULD BE WARNING
F112 A9 30 LDA #$30 ; BADSYN, ERR: BAD SYNTAX
F114 4C 90 F0 JMP CMDERR
; PARSE STRING
; LOOKS FOR SPECIAL CHARS,
; RETURNING WHEN VAR'BL CHAR
; IS FOUND
; A: VAR'BL CHAR
; X: IN,OUT: INDEX, FILTBL+1
; Y: IN: INDEX, CMDBUF
; OUT: NEW PTR, =0 IF NONE
; (Z=1) IF Y=0
F117 85 97 PARSE STA CHAR ; SAVE VAR'BL CHAR
F119 C4 95 iF119 CPY CMDSIZ ; STAY IN STRING
F11B B0 2A BCS iF147
F11D B9 00 00 LDA CMDBUF,Y ; MATCH CHAR
F120 C8 INY
F121 C5 97 CMP CHAR
F123 F0 24 BEQ iF149 ; FOUND CHAR
F125 C9 2A CMP #$2A ; MATCH PATTERN CHAR ("*" in this case)
F127 F0 04 BEQ iF12D
F129 C9 3F CMP #$3F ; "?"
F12B D0 02 BNE iF12F
F12D E6 CE iF12D INC PATFLG ; SET PATTERN FLAG
F12F C9 2C iF12F CMP #$2C ; MATCH FILE SEPARATOR (",")
F131 D0 E6 BNE iF119
F133 98 TYA
F134 95 9E STA FILTBL+1,X ; PUT PTRS IN TABLE
F136 A5 CE LDA PATFLG ; SAVE PATTERN FOR EA FILE
F138 29 7F AND #$7F
F13A F0 06 BEQ iF142
F13C A9 80 LDA #$80 ; RETAIN PATTERN PRESENCE...
F13E 95 AC STA FILTRK,X
F140 85 CE STA PATFLG ; ... BUT CLEAR COUNT
F142 E8 iF142 INX
F143 E0 04 CPX #$04 ; MXFILS-1
F145 90 D2 BCC iF119 ; NO MORE THAN MXFILS
F147 A0 00 iF147 LDY #$00 ; Y=0 (Z=1)
F149 A5 95 iF149 LDA CMDSIZ
F14B 95 9E STA FILTBL+1,X
F14D A5 CE LDA PATFLG
F14F 29 7F AND #$7F
F151 F0 04 BEQ iF157
F153 A9 80 LDA #$80
F155 95 AC STA FILTRK,X
F157 98 iF157 TYA ; Z IS SET
F158 60 RTS
; INITIALIZE COMMAND TABLES, PTRS, ETC.
F159 A4 5B CMDSET LDY x5B ; in 4040 source this is "LDY BUFTAB+CBPTR", but what does it mean?
F15B F0 14 BEQ iF171
F15D 88 DEY
F15E F0 10 BEQ iF170
F160 B9 00 00 LDA CMDBUF,Y
F163 C9 0D CMP #$0D ; CR
F165 F0 0A BEQ iF171
F167 88 DEY
F168 B9 00 00 LDA CMDBUF,Y
F16B C9 0D CMP #$0D ; CR
F16D F0 02 BEQ iF171
F16F C8 INY
F170 C8 iF170 INY
F171 84 95 iF171 STY CMDSIZ ; SEt CMD STRING SIZE
F173 C0 29 CPY #$29 ; CMDLEN-1
F175 A0 FF LDY #$FF
F177 90 07 BCC CMDRST
F179 84 96 STY CMDNUM
F17B A9 32 LDA #$32 ; LONGLN, LONG LINE ERROR
F17D 4C 90 F0 JMP CMDERR
; CLEAR VARIABLES, TABLES
F180 C8 CMDRST INY ; in 4040, .Y is explicitely set to 0
F181 84 5B iF181 STY x5B ; "BUFTAB+CBPTR"
F183 98 TYA
F184 85 DA STA TYPFLG
F186 85 9B STA F1PTR
F188 85 9C STA F2PTR
F18A 85 99 STA F1CNT
F18C 85 9A STA R0 ; F2CNT
F18E 85 CE STA PATFLG
F190 8D E9 10 STA ERWORD
F193 A2 05 LDX #$05 ; MXFILS
F195 95 9C iF195 STA F2PTR,X
F197 95 A1 STA xA1,X ; FILENT-1
F199 95 A6 STA xA6,X ; FILDAT-1
F19B 95 AB STA xAB,X ; FILTRK-1
F19D 95 B0 STA xB0,X ; FILSEC-1
F19F CA DEX
F1A0 D0 F3 BNE iF195
F1A2 60 RTS
; SET 1ST DRIVE AND TABLE POINTERS
F1A3 A5 9A ONEDRV LDA R0
F1A5 85 99 STA F1CNT
F1A7 A9 01 LDA #$01
F1A9 85 9A STA R0
F1AB 85 9C STA F2PTR
; SET UP ALL DRIVES FROM F2CNT
F1AD A4 D2 ALLDRS LDY LSTDRV ; ET UP DRIVE #'S...
F1AF A2 00 LDX #$00 ; ... INTO FILE ENTRY TABLE...
F1B1 86 9B iF1B1 STX F1PTR ; ... ON SECTOR PTR BYTE
F1B3 B5 9D LDA FILTBL,X
F1B5 20 C5 F1 JSR SETDRV
F1B8 A6 9B LDX F1PTR
F1BA 95 9D STA FILTBL,X ; INCR PTR PAST ":"
F1BC 98 TYA ; BITS REP DRIVES
F1BD 95 A7 STA FILDAT,X ; BIT7: DEFAULT
F1BF E8 INX ; BIT0: DRIVE #
F1C0 E4 9A CPX R0
F1C2 90 ED BCC iF1B1
F1C4 60 RTS
; SET DRIVE NUMBER
; DETERMINES DRIVE # FROm TEST OR
; USES DEFAULT (-D)
; A: IN,OUT: INDEX, CMDBUF
; Y: IN: DEFAULT DRIVE
; OUT: DRIVE NUMBER, - IF DEFAULT
F1C5 AA SETDRV TAX ; X=CMDBUF INDEX
F1C6 A9 3A LDA #$3A ; ":"
F1C8 D5 01 CMP CMDBUF+1,X ; FOR XXX:FILE
F1CA F0 0B BEQ iF1D7 ; ^
F1CC D5 00 CMP CMDBUF,X ; FOR XXX:FILE
F1CE D0 15 BNE iF1E5 ; ...^
F1D0 E8 INX ; FOUND ":", SO ...
F1D1 98 iF1D1 TYA ; DRIVE= DEFAULT
F1D2 29 01 iF1D2 AND #$01 ; CONVERT TO NUMERIC
F1D4 A8 iF1D4 TAY ; RESTORE DRIVE
F1D5 8A TXA ; A=INDEX && XXXXFILE
F1D6 60 RTS ; ...............^
F1D7 B5 00 iF1D7 LDA CMDBUF,X
F1D9 E8 INX ; XXX:FILE
F1DA E8 INX ; ..--^
F1DB C9 30 CMP #$30 ; FOR XX0:FILE
F1DD F0 F3 BEQ iF1D2 ; ........^
F1DF C9 31 CMP #$31 ; FOR XX1:FILE
F1E1 F0 EF BEQ iF1D2 ; ........^
F1E3 D0 EC BNE iF1D1 ; CMD:FILE OR XX,:FILE ; here points to the "F" in FILE twice
F1E5 98 iF1E5 TYA ; FOR XXX,FILE OR XX=FILE
F1E6 09 80 ORA #$80 ; ........^ ^
F1E8 29 81 AND #$81 ; DRIVE= -DEFAULT
F1EA D0 E8 BNE iF1D4 ; FINISH TESTING
; SET DRIVE FROM ANY CONFIG
F1EC A9 00 SETANY LDA #$00
F1EE 85 CF STA IMAGE
F1F0 A4 9D LDY FILTBL
F1F2 B9 00 00 iF1F2 LDA CMDBUF,Y
F1F5 C9 30 CMP #$30
F1F7 F0 12 BEQ iF20B
F1F9 C9 31 CMP #$31
F1FB F0 0E BEQ iF20B
F1FD C8 INY
F1FE C4 95 CPY CMDSIZ
F200 B0 05 BCS iF207
F202 A4 95 LDY CMDSIZ
F204 88 DEY
F205 D0 EB BNE iF1F2
F207 C6 CF iF207 DEC IMAGE
F209 A5 D2 LDA LSTDRV
F20B 29 01 iF20B AND #$01
F20D 85 80 STA DRVNUM
F20F 4C 0A EF JMP SETLDS
; TOGGLE DRVNUM
F212 A5 80 TOGDRV LDA DRVNUM
F214 49 01 EOR #$01
F216 29 01 AND #$01
F218 85 80 STA DRVNUM
F21A 60 RTS
; SET PTRS TO ONE FILE STREAM & CHK TYPE
F21B A0 00 FS1SET LDY #$00
F21D A5 99 LDA F1CNT
F21F C5 9A CMP R0 ; R0 aka F2CNT
F221 F0 15 BEQ iF238
F223 C6 9A DEC R0
F225 A4 9A LDY R0
F227 B9 9D 00 LDA FILTBL,Y
F22A A8 TAY
F22B B9 00 00 LDA CMDBUF,Y ; in 4040 this is an indirect indexed LDA (DB),Y
F22E A0 03 LDY #$03 ; NTYPES-1
F230 D9 31 E0 iF230 CMP TYPLST,Y
F233 F0 03 BEQ iF238
F235 88 DEY
F236 D0 F8 BNE iF230
F238 98 iF238 TYA
F239 0A ASL
F23A 85 DA STA TYPFLG
F23C 60 RTS
; TEST CHAR In ACCUM FOR "0" OR "1"
F23D C9 30 TST0V1 CMP #$30
F23F F0 06 BEQ iF247
F241 C9 31 CMP #$31
F243 F0 02 BEQ iF247
F245 09 80 ORA #$80
F247 29 81 iF247 AND #$81
F249 60 RTS
; OPTSCH OPTIMAL SEARCH FOR LOOKUP
; AND FNDFIL
F24A A9 00 OPTSCH LDA #$00 ; DETERMINE OPTIMAL SEARCH
F24C 85 2A STA TEMP ; INIT DRIVE MASK
F24E 85 D1 STA DRVFLG
F250 85 D1 STA DRVFLG
F252 48 PHA
F253 A6 9A LDX R0
F255 68 iF255 PLA
F256 05 2A ORA TEMP
F258 48 PHA
F259 A9 01 LDA #$01
F25B 85 2A STA TEMP
F25D CA DEX
F25E 30 0F BMI iF26F
F260 B5 A7 LDA FILDAT,X
F262 10 04 BPL iF268
F264 06 2A ASL TEMP
F266 06 2A ASL TEMP
F268 4A iF268 LSR
F269 90 EA BCC iF255
F26B 06 2A ASL TEMP
F26D D0 E6 BNE iF255 ; (BRANCH)
F26F 68 iF26F PLA
F270 AA TAX
F271 BD 89 F2 LDA SCHTBL-1,X
F274 48 PHA
F275 29 03 AND #$03
F277 85 D0 STA DRVCNT
F279 68 PLA
F27A 0A ASL
F27B 10 09 BPL iF286
F27D A5 A7 LDA FILDAT
F27F 29 01 iF27F AND #$01
F281 85 80 STA DRVNUM
F283 4C 0A EF JMP SETLDS ; in 4040 before JMP comment "*RSR ADD FOR AUTO INIT" and auto init code?
F286 2A iF286 ROL
; *** F287: Warning: Possibly modifyable opcode. ***
F287 4C 7F F2 JMP iF27F
; *** Invalid reference F28A ignored.
F28A SCHTBL .byte $00, $80, $41, $01, $01, $01, $01, $81 ;..aaaaa.
F292 .byte $81, $81, $81, $42, $42, $42, $42 ;...bbbb
; LOOK Up ALL FILES IN STREAM
; AND FILL TABLES W/ INFO
F299 20 4A F2 LOOKUP JSR OPTSCH
F29C A9 00 iF29C LDA #$00
F29E 85 D6 STA DELIND
F2A0 20 CE F3 JSR SRCHST ; START SEARCH
F2A3 D0 18 BNE iF2BD
F2A5 C6 D0 iF2A5 DEC DRVCNT
F2A7 10 01 BPL iF2AA
F2A9 60 RTS ; NO MORE DRIVE SEARCHES
F2AA A9 01 iF2AA LDA #$01 ; TOGGLE DRIVE #
F2AC 85 D1 STA DRVFLG
F2AE 20 12 F2 JSR TOGDRV
F2B1 20 0A EF JSR SETLDS ; TURN ON LEDS
F2B4 F0 E6 BEQ iF29C ; (BRANCH)
F2B6 D0 E4 BNE iF29C
F2B8 20 29 F4 iF2B8 JSR SEARCH ; FIND VALID FN
F2BB F0 0E BEQ iF2CB ; END OF SEARCH
F2BD 20 14 F3 iF2BD JSR COMPAR ; COMPARE DIR W/ TABLE
F2C0 A5 D3 LDA FOUND ; FOUND FLAG
F2C2 F0 01 BEQ iF2C5 ; ALL FN'S NOT FOUND, YET
F2C4 60 RTS
F2C5 A5 37 iF2C5 LDA ENTFND
F2C7 30 EF BMI iF2B8
F2C9 10 F2 BPL iF2BD
F2CB A5 D3 iF2CB LDA FOUND
F2CD F0 D6 BEQ iF2A5
F2CF 60 RTS
; FIND NEXT FILE NAME MATCHING
; ANY FILE IN STREAM & RETURN
; WITH ENTRY FOUND STUFFED INTO
; TABLES
F2D0 20 19 F4 FFRE JSR SRRE ; FIND FILE RE-ENTRY
F2D3 F0 17 BEQ iF2EC
F2D5 D0 23 BNE iF2FA
F2D7 A9 01 iF2D7 LDA #$01
F2D9 85 D1 STA DRVFLG
F2DB 20 12 F2 JSR TOGDRV
F2DE 20 0A EF JSR SETLDS
F2E1 A9 00 FFST LDA #$00 ; FIND FILE START ENTRY
F2E3 85 D6 STA DELIND
F2E5 20 CE F3 JSR SRCHST
F2E8 D0 10 BNE iF2FA
F2EA 85 D3 STA FOUND
F2EC A5 D3 iF2EC LDA FOUND
F2EE D0 23 BNE iF313
F2F0 C6 D0 DEC DRVCNT
F2F2 10 E3 BPL iF2D7
F2F4 60 RTS
F2F5 20 29 F4 FNDFIL JSR SEARCH ; FIND FILE CONTINUOUS...
F2F8 F0 F2 BEQ iF2EC ; ... RE-ENTRY, NO CHANNEL ACTIVITY
F2FA 20 14 F3 iF2FA JSR COMPAR ; COMPARE FILE NAMES
F2FD A6 37 LDX ENTFND
F2FF 10 06 BPL iF307
F301 A5 D3 LDA FOUND
F303 F0 F0 BEQ FNDFIL
F305 D0 0C BNE iF313
F307 A5 DA iF307 LDA TYPFLG
F309 F0 08 BEQ iF313 ; NO TYPE RESTRICTION
F30B B5 A7 LDA FILDAT,X
F30D 29 1E AND #$1E
F30F C5 DA CMP TYPFLG
F311 D0 E2 BNE FNDFIL
F313 60 iF313 RTS
; COMPARE ALL FILENAMES IN STREAM TABLE
; WITH EACH VALID ENTRY IN THE
; DIRECTORY. MATCHES ARE TABULATED
F314 A2 FF COMPAR LDX #$FF
F316 86 37 STX ENTFND
F318 E8 INX
F319 86 CE STX PATFLG
F31B 20 B4 F3 JSR CMPCHK
F31E F0 06 BEQ iF326
F320 60 iF320 RTS ; ALL ARE FOUND
F321 20 BC F3 iF321 JSR CC10
F324 D0 FA BNE iF320
F326 A5 80 iF326 LDA DRVNUM
F328 55 A7 EOR FILDAT,X
F32A 4A LSR
F32B 90 0A BCC iF337 ; RIGHT DRIVE
F32D 29 40 AND #$40
F32F F0 F0 BEQ iF321 ; NO DEFAULT
F331 A9 02 LDA #$02
F333 C5 D0 CMP DRVCNT
F335 F0 EA BEQ iF321 ; DON'T USE DEFAULT
F337 B5 9D iF337 LDA FILTBL,X ; GOOD DRIVE MATCH
F339 AA TAX
F33A 20 2F F5 JSR FNDLMT
F33D A0 03 LDY #$03
F33F B1 93 LDA (DIRBUF),Y ; in 4040 the CMDBUF,x and (DIRBUF),y are exchanged, so the char is always in .A and can directly compared with
F341 E4 98 iF341 CPX LIMIT ; this compare and the branch is later in 4040
F343 B0 DC BCS iF321 ; END OF PATTERN
F345 D5 00 CMP CMDBUF,X
F347 F0 06 BEQ iF34F ; CHARS ARE =
F349 A9 3F LDA #$3F ; "?"
F34B D5 00 CMP CMDBUF,X
F34D D0 5C BNE iF3AB ; NO SINGLE PATTERN
F34F C8 iF34F INY
F350 E8 INX
F351 B1 93 LDA (DIRBUF),Y
F353 C9 A0 CMP #$A0
F355 F0 04 BEQ iF35B ; END OF FILENAME
F357 C0 13 CPY #$13
F359 90 E6 BCC iF341 ; in 4040 this is at different place as BCS, with comment "END OF FILENAME"
F35B A9 2A iF35B LDA #$2A ; "*"
F35D D5 00 CMP CMDBUF,X ; STAR MATCHES ALL
F35F F0 04 BEQ iF365
F361 E4 98 CPX LIMIT
F363 90 BC BCC iF321
F365 A6 9C iF365 LDX F2PTR ; FILENAMES MATCH
F367 86 37 STX ENTFND
F369 B5 AC LDA FILTRK,X ; STORE INFO IN TABLES
F36B 29 80 AND #$80
F36D 85 CE STA PATFLG
F36F 95 AC STA FILTRK,X
F371 A5 D8 LDA INDEX
F373 29 E0 AND #$E0
F375 85 2A STA TEMP
F377 A5 82 LDA SECTOR
F379 05 2A ORA TEMP
F37B 95 A2 STA FILENT,X
F37D A0 00 LDY #$00
F37F B1 93 LDA (DIRBUF),Y
F381 C8 INY
F382 48 PHA
F383 29 40 AND #$40
F385 85 2A STA TEMP
F387 68 PLA
F388 0A ASL
F389 29 1E AND #$1E
F38B B0 02 BCS iF38F
F38D 09 20 ORA #$20
F38F 05 2A iF38F ORA TEMP
F391 85 2A STA TEMP
F393 A9 80 LDA #$80
F395 35 A7 AND FILDAT,X
F397 05 80 ORA DRVNUM
F399 05 2A ORA TEMP
F39B 95 A7 STA FILDAT,X
F39D B1 93 LDA (DIRBUF),Y
F39F 15 AC ORA FILTRK,X
F3A1 95 AC STA FILTRK,X
F3A3 C8 INY
F3A4 B1 93 LDA (DIRBUF),Y
F3A6 95 B1 STA FILSEC,X
F3A8 4C B4 F3 JMP CMPCHK ; here is a change from 4040
F3AB A9 2A iF3AB LDA #$2A
F3AD D5 00 CMP CMDBUF,X
F3AF F0 B4 BEQ iF365
F3B1 4C 21 F3 JMP iF321
; CHECK TABLES FOR UNFOUND FILES
F3B4 A9 FF CMPCHK LDA #$FF
F3B6 85 D3 STA FOUND
F3B8 A5 9A LDA R0
F3BA 85 9C STA F2PTR
F3BC C6 9C CC10 DEC F2PTR
F3BE 10 01 BPL iF3C1
F3C0 60 RTS ; TABLE EXHAUSTED
F3C1 A6 9C iF3C1 LDX F2PTR
F3C3 B5 AC LDA FILTRK,X
F3C5 30 02 BMI iF3C9
F3C7 D0 F3 BNE CC10
F3C9 A9 00 iF3C9 LDA #$00
F3CB 85 D3 STA FOUND
F3CD 60 RTS
; SEARCH DIRECTORY
; RETURNS WITH VALID ENTRY W/ DELIND=0
; OR RETURNS W/ 1ST DELETED ENTRY
; DELIND=1
; e
; SRCHST WILL INITIATE A SEARCH
; SEARCH WILL CONTINUE A SEARCH
F3CE A0 00 SRCHST LDY #$00 ; INIT DELETED SECTOR
F3D0 84 D5 STY DELSEC
F3D2 88 DEY
F3D3 84 37 STY ENTFND
F3D5 A9 12 LDA #$12 ; START SEARCH AT BEGINNING
F3D7 85 81 STA TRACK
F3D9 A9 01 LDA #$01
F3DB 85 82 STA SECTOR
F3DD 85 D7 STA LSTBUF
F3DF 20 36 EE JSR OPNIRD ; OPEN INTERNAL READ CHNL
F3E2 A5 D7 iF3E2 LDA LSTBUF ; LAST BUFFER IF 0
F3E4 D0 01 BNE iF3E7
F3E6 60 RTS ; (Z=1)
F3E7 A9 07 iF3E7 LDA #$07
F3E9 85 D9 STA FILCNT
F3EB A9 00 LDA #$00 ; READ TRACK #
F3ED 20 BE EE JSR DRDBYT
F3F0 85 D7 STA LSTBUF ; UPDATE END FLAG
F3F2 20 B0 EE iF3F2 JSR GETPNT
F3F5 C6 D9 DEC FILCNT
F3F7 A0 00 LDY #$00
F3F9 B1 93 LDA (DIRBUF),Y ; READ FILE TYPE
F3FB D0 14 BNE iF411
F3FD A5 D5 LDA DELSEC ; DELETED ENTRY FOUND
F3FF D0 28 BNE SEARCH ; DELETED ENTRY ALREADY FOUND
F401 20 06 EE JSR CURBLK ; GET CURRENT SECTOR
F404 A5 82 LDA SECTOR
F406 85 D5 STA DELSEC
F408 A5 93 LDA DIRBUF ; GET CURRENT INDEX
F40A A6 D6 LDX DELIND ; BIT1: WANT DELETED ENTRY
F40C 85 D6 STA DELIND
F40E F0 19 BEQ SEARCH ; NEED VALID ENTRY
F410 60 RTS
F411 A2 01 iF411 LDX #$01
F413 E4 D6 CPX DELIND ; ?LOOKING FOR DELETED?
F415 D0 2A BNE iF441 ; NO!
F417 F0 10 BEQ SEARCH
F419 A9 12 SRRE LDA #$12
F41B 85 81 STA TRACK
F41D A5 D4 LDA DIRSEC
F41F 85 82 STA SECTOR
F421 20 36 EE JSR OPNIRD
F424 A5 D8 LDA INDEX
F426 20 89 EE JSR SETPNT
F429 A9 FF SEARCH LDA #$FF
F42B 85 37 STA ENTFND
F42D A5 D9 LDA FILCNT ; ADJUST FILE COUNT
F42F 30 09 BMI iF43A
F431 A9 20 LDA #$20 ; INCR BY 32
F433 20 59 EA JSR INCPTR
F436 D0 BA BNE iF3F2 ; these two branches are later replaced by a JMP :-)
F438 F0 B8 BEQ iF3F2
F43A 20 F3 ED iF43A JSR NXTBUF ; NEW BUFFER
F43D D0 A3 BNE iF3E2 ; in 4040 replaced by JMP, with comment "(BRANCH)" :-)
F43F F0 A1 BEQ iF3E2
F441 A5 93 iF441 LDA DIRBUF ; FOUND VALID ENTRY
F443 85 D8 STA INDEX ; SAVE INDEX
F445 20 06 EE JSR CURBLK ; GET SECTOR
F448 A5 82 LDA SECTOR
F44A 85 D4 STA DIRSEC
F44C 60 RTS ; (Z=0)
; TRANSFER FILENAME FROM CMD TO BUFFER.
; A=STRING SIZE.
; X=STARTING INDEX IN CMDBUF.
; Y=BUFFER #
F44D 48 TRNAME PHA
F44E 20 2F F5 JSR FNDLMT
F451 20 66 F4 JSR TRCMBF
F454 68 PLA
F455 38 SEC
F456 E5 2D SBC TEMP+3
F458 AA TAX
F459 F0 0A BEQ iF465
F45B 90 08 BCC iF465
F45D A9 A0 LDA #$A0
F45F 91 93 iF45F STA (DIRBUF),Y
F461 C8 INY
F462 CA DEX
F463 D0 FA BNE iF45F
F465 60 iF465 RTS
; TRANSFER CMD BUFFER TO OTHER BUFFER
; USES CURRENT BUFFER PTR.
; LIMIT ENDING INDEX+1 IN CMD BUF
; X=STARTING INDEX IN CMD BUF
; Y=BUFFER#
F466 98 TRCMBF TYA
F467 0A ASL
F468 A8 TAY
F469 B9 3D 00 LDA BUFTAB,Y
F46C 85 93 STA DIRBUF
F46E B9 3E 00 LDA BUFTAB+1,Y
F471 85 94 STA DIRBUF+1
F473 A0 00 LDY #$00
F475 B5 00 iF475 LDA CMDBUF,X
F477 91 93 STA (DIRBUF),Y
F479 C8 INY
F47A F0 05 BEQ iF481
F47C E8 INX
F47D E4 98 CPX LIMIT
F47F 90 F4 BCC iF475
F481 60 iF481 RTS
; TODO
F482 A5 84 iF482 LDA SA
F484 48 PHA
F485 A5 83 LDA LINDX
F487 48 PHA
F488 A5 82 LDA SECTOR
F48A 48 PHA
F48B A5 81 LDA TRACK
F48D 48 PHA
F48E A9 10 LDA #$10
F490 85 84 STA SA
F492 20 06 EE JSR CURBLK
F495 A6 8D LDX JOBNUM
F497 BD 99 10 LDA LSTJOB,X
F49A A6 9B LDX F1PTR
F49C 55 A7 EOR FILDAT,X
F49E 4A LSR
F49F 90 14 BCC iF4B5
F4A1 B5 A7 LDA FILDAT,X
F4A3 29 01 AND #$01
F4A5 85 80 STA DRVNUM
F4A7 A2 01 LDX #$01
F4A9 86 D6 STX DELIND
F4AB CA DEX
F4AC 86 D5 STX DELSEC
F4AE 20 CE F3 JSR SRCHST
F4B1 F0 1B BEQ iF4CE
F4B3 D0 24 BNE iF4D9
F4B5 A5 D5 iF4B5 LDA DELSEC
F4B7 F0 0C BEQ iF4C5
F4B9 C5 82 CMP SECTOR
F4BB F0 1C BEQ iF4D9
F4BD 85 82 STA SECTOR
F4BF 20 1D EE JSR DRTRD
F4C2 4C D9 F4 JMP iF4D9
F4C5 A9 01 iF4C5 LDA #$01
F4C7 85 D6 STA DELIND
F4C9 20 29 F4 JSR SEARCH
F4CC D0 0B BNE iF4D9
F4CE 20 49 EE iF4CE JSR NXDRBK
F4D1 A5 82 LDA SECTOR
F4D3 85 D5 STA DELSEC
F4D5 A9 02 LDA #$02
F4D7 85 D6 STA DELIND
F4D9 A5 D6 iF4D9 LDA DELIND
F4DB 20 89 EE JSR SETPNT
F4DE A5 DC LDA xDC
F4E0 20 89 E8 JSR PUTBYT
F4E3 68 PLA
F4E4 A6 9B LDX F1PTR
F4E6 95 AC STA FILTRK,X
F4E8 20 89 E8 JSR PUTBYT
F4EB 68 PLA
F4EC A6 9B LDX F1PTR
F4EE 95 B1 STA FILSEC,X
F4F0 20 89 E8 JSR PUTBYT
F4F3 20 9D E8 JSR GETACT
F4F6 A8 TAY
F4F7 A6 9B LDX F1PTR
F4F9 B5 9D LDA FILTBL,X
F4FB AA TAX
F4FC A9 10 LDA #$10
F4FE 20 4D F4 JSR TRNAME
F501 A0 17 LDY #$17
F503 A9 00 LDA #$00
F505 91 93 iF505 STA (DIRBUF),Y
F507 C8 INY
F508 C0 1B CPY #$1B
F50A 90 F9 BCC iF505
F50C 20 21 EE JSR DRTWRT
F50F 68 PLA
F510 85 83 STA LINDX
F512 68 PLA
F513 85 84 STA SA
F515 A6 9B LDX F1PTR
F517 A5 D5 LDA DELSEC
F519 29 1F AND #$1F
F51B 95 A2 STA FILENT,X
F51D A5 D6 LDA DELIND
F51F 29 E0 AND #$E0
F521 15 A2 ORA FILENT,X
F523 95 A2 STA FILENT,X
F525 A5 DC LDA xDC
F527 0A ASL
F528 29 1E AND #$1E
F52A 05 80 ORA DRVNUM
F52C 95 A7 STA FILDAT,X
F52E 60 RTS
; FIND THE LIMIT OF THE STRING IN CMDBUF
; POINTED TO BY X
F52F A9 00 FNDLMT LDA #$00
F531 85 2D STA TEMP+3
F533 8A TXA
F534 48 PHA
F535 B5 00 iF535 LDA CMDBUF,X
F537 C9 2C CMP #$2C ; "."
F539 F0 11 BEQ iF54C
F53B C9 3D CMP #$3D ; "="
F53D F0 0D BEQ iF54C
F53F E6 2D INC TEMP+3
F541 E8 INX
F542 A9 0F LDA #$0F
F544 C5 2D CMP TEMP+3
F546 90 04 BCC iF54C
F548 E4 95 CPX CMDSIZ
F54A 90 E9 BCC iF535
F54C 86 98 iF54C STX LIMIT
F54E 68 PLA
F54F AA TAX
F550 60 RTS
; GET FILE ENTRY FROM DIRECTORY
; CALLED BY STDIR, GETDIR; SAVE VARIABLES
F551 A5 84 GETNAM LDA SA ; SAVE VARIABLES
F553 48 PHA
F554 A5 83 LDA LINDX
F556 48 PHA
F557 20 61 F5 JSR GNSUB
F55A 68 PLA
F55B 85 83 STA LINDX
F55D 68 PLA
F55E 85 84 STA SA
F560 60 RTS
F561 A9 10 GNSUB LDA #$10 ; IRSA
F563 85 84 STA SA
F565 20 B0 E9 JSR FNDRCH
F568 20 B0 EE JSR GETPNT
F56B A5 37 LDA ENTFND
F56D 10 07 BPL iF576 ; MORE FILES
F56F 20 5D F6 JSR MSGFRE ; SEND BLOCKS FREE
F572 18 CLC ; (C=0) = END
F573 4C 22 F6 JMP iF622 ; TERMINATE
F576 A5 D1 iF576 LDA DRVFLG
F578 F0 1F BEQ iF599
F57A C6 D1 DEC DRVFLG ; (DRVFLG=-1) = NEW DIR
F57C D0 0C BNE iF58A
F57E C6 D1 DEC DRVFLG ; (DRVFLG=-1) =
F580 20 12 F2 JSR TOGDRV ; SEND BLOCKS FREE
F583 20 5D F6 JSR MSGFRE
F586 38 SEC
F587 4C 12 F2 JMP TOGDRV
F58A A9 00 iF58A LDA #$00
F58C 8D EE 10 STA NBTEMP+1
F58F 85 D1 STA DRVFLG
F591 20 2E F6 JSR NEWDIR
F594 8E ED 10 STX NBTEMP
F597 38 SEC
F598 60 RTS
F599 A2 18 iF599 LDX #$18 ; DIRLEN; SET NUMBER BLOCKS
F59B A0 1D LDY #$1D ; & ADJUST SPACING
F59D B1 93 LDA (DIRBUF),Y
F59F 8D EE 10 STA NBTEMP+1
F5A2 F0 02 BEQ iF5A6
F5A4 A2 16 LDX #$16 ; DIRLEN-2
F5A6 88 iF5A6 DEY
F5A7 B1 93 LDA (DIRBUF),Y
F5A9 8D ED 10 STA NBTEMP
F5AC E0 16 CPX #$16 ; DIRLEN-2
F5AE F0 0A BEQ iF5BA
F5B0 C9 0A CMP #$0A
F5B2 90 06 BCC iF5BA
F5B4 CA DEX
F5B5 C9 64 CMP #$64
F5B7 90 01 BCC iF5BA
F5B9 CA DEX
F5BA 20 23 F6 iF5BA JSR BLKNB ; CLEAR NAME BUFFER
F5BD B1 93 LDA (DIRBUF),Y ; SEt TYPE CHARS
F5BF 48 PHA
F5C0 0A ASL ; (USED IN BCS)
F5C1 68 PLA
F5C2 29 0F AND #$0F
F5C4 A8 TAY
F5C5 B9 39 E0 LDA TP2LST,Y
F5C8 9D B4 42 STA NAMBUF,X
F5CB CA DEX
F5CC B9 35 E0 LDA TP1LST,Y
F5CF 9D B4 42 STA NAMBUF,X
F5D2 CA DEX
F5D3 B9 31 E0 LDA TYPLST,Y
F5D6 9D B4 42 STA NAMBUF,X
F5D9 CA DEX
F5DA CA DEX
F5DB B0 05 BCS iF5E2 ; (FROM ASL)
F5DD A9 2A LDA #$2A ; "*"; FILE NOT CLOSED
F5DF 9D B5 42 STA NAMBUF+1,X
F5E2 A9 A0 iF5E2 LDA #$A0
F5E4 9D B4 42 STA NAMBUF,X
F5E7 CA DEX
F5E8 A0 12 LDY #$12
F5EA B1 93 iF5EA LDA (DIRBUF),Y
F5EC 9D B4 42 STA NAMBUF,X
F5EF CA DEX
F5F0 88 DEY
F5F1 C0 03 CPY #$03
F5F3 B0 F5 BCS iF5EA
F5F5 A9 22 LDA #$22 ; '"' SEND NAME IN QUOTES
F5F7 9D B4 42 STA NAMBUF,X
F5FA E8 iF5FA INX
F5FB E0 20 CPX #$20
F5FD B0 0B BCS iF60A
F5FF BD B4 42 LDA NAMBUF,X
F602 C9 22 CMP #$22 ; '"'
F604 F0 04 BEQ iF60A
F606 C9 A0 CMP #$A0
F608 D0 F0 BNE iF5FA
F60A A9 22 iF60A LDA #$22 ; '"'
F60C 9D B4 42 STA NAMBUF,X
F60F E8 iF60F INX
F610 E0 20 CPX #$20
F612 B0 0A BCS iF61E
F614 A9 7F LDA #$7F
F616 3D B4 42 AND NAMBUF,X
F619 9D B4 42 STA NAMBUF,X
F61C 10 F1 BPL iF60F
F61E 20 F5 F2 iF61E JSR FNDFIL
F621 38 SEC
F622 60 iF622 RTS
F623 A0 1B BLKNB LDY #$1B ; BLANK NAMBUF
F625 A9 20 LDA #$20
F627 99 B3 42 iF627 STA NAMBUF-1,Y
F62A 88 DEY
F62B D0 FA BNE iF627
F62D 60 RTS
; NEW DIRECTORY IN LISTING
F62E 20 23 F6 NEWDIR JSR BLKNB
F631 A9 FF LDA #$FF
F633 85 2A STA TEMP
F635 A6 80 LDX DRVNUM
F637 BD 40 E5 LDA IPBM,X
F63A 85 94 STA DIRBUF+1
F63C A9 90 LDA #$90
F63E 85 93 STA DIRBUF
F640 A0 15 LDY #$15
F642 B1 93 iF642 LDA (DIRBUF),Y ; the 4040 adds version check here (write out "1" when no version on disk)
F644 99 B6 42 STA NAMBUF+2,Y
F647 88 DEY
F648 10 F8 BPL iF642
F64A A9 12 LDA #$12
F64C 8D B4 42 STA NAMBUF
F64F A9 22 LDA #$22
F651 8D B5 42 STA NAMBUF+1
F654 8D C6 42 STA NAMBUF+18
F657 A9 20 LDA #$20
F659 8D C7 42 STA NAMBUF+19
F65C 60 RTS
F65D 20 23 F6 MSGFRE JSR BLKNB
F660 A0 0B LDY #$0B ; MSGLEN-1
F662 B9 6E F6 iF662 LDA FREMSG,Y
F665 99 B4 42 STA NAMBUF,Y
F668 88 DEY
F669 10 F7 BPL iF662
F66B 4C 0A F0 JMP NUMFRE
; blocks free message
F66E FREMSG .byte $42, $4C, $4F, $43, $4B, $53, $20, $46 ;blocks f
F676 .byte $52, $45, $45, $2E ;ree.
; TODO
F67A A5 84 iF67A LDA SA
F67C C9 0F CMP #$0F
F67E D0 06 BNE iF686
F680 20 C2 EB JSR CLRCHN
F683 4C 44 F0 JMP PARSXQ
F686 85 86 iF686 STA x86
F688 20 59 F1 JSR CMDSET
F68B 86 96 STX CMDNUM
F68D A6 00 LDX CMDBUF
F68F A5 86 LDA x86
F691 D0 26 BNE iF6B9
F693 E0 2A CPX #$2A
F695 D0 22 BNE iF6B9
F697 A5 7F LDA x7F
F699 F0 45 BEQ iF6E0
F69B 4A LSR
F69C 85 81 STA TRACK
F69E A9 00 LDA #$00
F6A0 2A ROL
F6A1 85 80 STA DRVNUM
F6A3 09 04 ORA #$04
F6A5 85 A7 STA FILDAT
F6A7 AD EA 10 LDA x10EA
F6AA 85 82 STA SECTOR
F6AC 20 72 EA JSR OPNRCH
F6AF A5 A7 LDA FILDAT
F6B1 A6 83 iF6B1 LDX LINDX
F6B3 99 B6 00 STA FILTYP,Y
F6B6 4C 75 F0 JMP ENDCMD
F6B9 E0 24 iF6B9 CPX #$24
F6BB D0 1C BNE iF6D9
F6BD A5 86 LDA x86
F6BF D0 03 BNE iF6C4
F6C1 4C 51 F8 JMP iF851
F6C4 20 99 F0 iF6C4 JSR SIMPRS
F6C7 A9 12 LDA #$12
F6C9 85 81 STA TRACK
F6CB A9 00 LDA #$00
F6CD 85 82 STA SECTOR
F6CF 20 72 EA JSR OPNRCH
F6D2 A5 80 LDA DRVNUM
F6D4 09 02 ORA #$02
F6D6 4C B1 F6 JMP iF6B1
F6D9 E0 23 iF6D9 CPX #$23
F6DB D0 0A BNE iF6E7
F6DD 4C 6A FD JMP OPNBLK
F6E0 A9 04 iF6E0 LDA #$04
F6E2 85 DA STA TYPFLG
F6E4 20 C1 E8 JSR INITDR
F6E7 A2 00 iF6E7 LDX #$00
F6E9 A9 3A LDA #$3A
F6EB 20 17 F1 JSR PARSE
F6EE F0 0C BEQ iF6FC
F6F0 8A TXA
F6F1 F0 05 BEQ iF6F8
F6F3 A9 30 LDA #$30
F6F5 4C 90 F0 JMP CMDERR
F6F8 88 iF6F8 DEY
F6F9 F0 01 BEQ iF6FC
F6FB 88 DEY
F6FC 84 9D iF6FC STY FILTBL
F6FE A9 8D LDA #$8D
F700 20 17 F1 JSR PARSE
F703 E8 INX
F704 86 9A STX R0
F706 20 A3 F1 JSR ONEDRV
F709 20 4A F2 JSR OPTSCH
F70C 20 E1 F2 JSR FFST
F70F A6 86 LDX x86
F711 86 84 STX SA
F713 E0 02 CPX #$02
F715 B0 0C BCS iF723
F717 A9 02 LDA #$02
F719 85 DC STA xDC
F71B 86 DB STX xDB
F71D 8A TXA
F71E D0 3D BNE iF75D
F720 4C C9 F7 JMP iF7C9
F723 A2 00 iF723 LDX #$00
F725 86 DB STX xDB
F727 E8 INX
F728 86 DC STX xDC
F72A E4 99 CPX F1CNT
F72C B0 2B BCS iF759
F72E B5 9D LDA FILTBL,X
F730 A8 TAY
F731 B9 00 00 LDA CMDBUF,Y
F734 A0 03 LDY #$03
F736 D9 31 E0 iF736 CMP TYPLST,Y
F739 F0 04 BEQ iF73F
F73B 88 DEY
F73C D0 F8 BNE iF736
F73E C8 INY
F73F 84 DC iF73F STY xDC
F741 E8 INX
F742 E4 99 CPX F1CNT
F744 B0 13 BCS iF759
F746 B5 9D LDA FILTBL,X
F748 A8 TAY
F749 B9 00 00 LDA CMDBUF,Y
F74C A0 02 LDY #$02
F74E D9 2E E0 iF74E CMP MODLST,Y
F751 F0 04 BEQ iF757
F753 88 DEY
F754 10 F8 BPL iF74E
F756 C8 INY
F757 84 DB iF757 STY xDB
F759 A6 DB iF759 LDX xDB
F75B F0 6C BEQ iF7C9
F75D A5 CE iF75D LDA PATFLG
F75F F0 05 BEQ iF766
F761 A9 33 LDA #$33
F763 4C 90 F0 JMP CMDERR
F766 A9 20 iF766 LDA #$20
F768 24 A7 BIT FILDAT
F76A F0 0C BEQ iF778
F76C A5 DB LDA xDB
F76E C9 02 CMP #$02
F770 F0 6D BEQ iF7DF
F772 20 DE F9 JSR DELDIR
F775 4C 0F F8 JMP iF80F
F778 A5 AC iF778 LDA FILTRK
F77A 29 3F AND #$3F
F77C D0 03 BNE iF781
F77E 4C 0F F8 JMP iF80F
F781 A5 00 iF781 LDA CMDBUF
F783 C9 40 CMP #$40
F785 F0 05 BEQ iF78C
F787 A9 63 LDA #$63
F789 4C 90 F0 JMP CMDERR
F78C A5 A7 iF78C LDA FILDAT
F78E 29 1F AND #$1F
F790 48 PHA
F791 4A LSR
F792 C5 DC CMP xDC
F794 D0 52 BNE iF7E8
F796 20 CE EA JSR OPNWCH
F799 A5 83 LDA LINDX
F79B 8D EB 10 STA x10EB
F79E A9 10 LDA #$10
F7A0 85 84 STA SA
F7A2 20 B0 E9 JSR FNDRCH
F7A5 A5 D8 LDA INDEX
F7A7 20 89 EE JSR SETPNT
F7AA A0 1A LDY #$1A
F7AC A5 81 LDA TRACK
F7AE 91 93 STA (DIRBUF),Y
F7B0 C8 INY
F7B1 A5 82 LDA SECTOR
F7B3 91 93 STA (DIRBUF),Y
F7B5 A5 A2 LDA FILENT
F7B7 AE EB 10 LDX x10EB
F7BA 9D E1 10 STA CHNDAT+8,X
F7BD 68 PLA
F7BE 95 B6 STA FILTYP,X
F7C0 20 06 EE JSR CURBLK
F7C3 20 21 EE JSR DRTWRT
F7C6 4C 75 F0 JMP ENDCMD
F7C9 A5 AC iF7C9 LDA FILTRK
F7CB 29 3F AND #$3F
F7CD D0 05 BNE iF7D4
F7CF A9 62 LDA #$62
F7D1 4C 90 F0 JMP CMDERR
F7D4 A9 20 iF7D4 LDA #$20
F7D6 24 A7 BIT FILDAT
F7D8 F0 05 BEQ iF7DF
F7DA A9 60 LDA #$60
F7DC 4C 90 F0 JMP CMDERR
F7DF A5 A7 iF7DF LDA FILDAT
F7E1 4A LSR
F7E2 29 0F AND #$0F
F7E4 C5 DC CMP xDC
F7E6 F0 05 BEQ iF7ED
F7E8 A9 64 iF7E8 LDA #$64
F7EA 4C 90 F0 JMP CMDERR
F7ED A5 AC iF7ED LDA FILTRK
F7EF 29 3F AND #$3F
F7F1 85 81 STA TRACK
F7F3 85 2E STA TEMP+4
F7F5 A5 B1 LDA FILSEC
F7F7 85 82 STA SECTOR
F7F9 85 2F STA TEMP+5
F7FB 20 72 EA JSR OPNRCH
F7FE A4 83 LDY LINDX
F800 A5 A2 LDA FILENT
F802 99 E1 10 STA CHNDAT+8,Y
F805 A5 A7 LDA FILDAT
F807 29 1F AND #$1F
F809 99 B6 00 STA FILTYP,Y
F80C 4C 3B F8 JMP iF83B
F80F 20 CE EA iF80F JSR OPNWCH
F812 A5 81 LDA TRACK
F814 48 PHA
F815 A5 82 LDA SECTOR
F817 48 PHA
F818 20 82 F4 JSR iF482
F81B A6 83 LDX LINDX
F81D A5 D5 LDA DELSEC
F81F 29 1F AND #$1F
F821 9D E1 10 STA CHNDAT+8,X
F824 A5 D6 LDA DELIND
F826 29 E0 AND #$E0
F828 1D E1 10 ORA CHNDAT+8,X
F82B 9D E1 10 STA CHNDAT+8,X
F82E A5 DC LDA xDC
F830 0A ASL
F831 05 80 ORA DRVNUM
F833 95 B6 STA FILTYP,X
F835 68 PLA
F836 85 2F STA TEMP+5
F838 68 PLA
F839 85 2E STA TEMP+4
F83B A6 86 iF83B LDX x86
F83D CA DEX
F83E CA DEX
F83F 10 0D BPL iF84E
F841 A5 80 LDA DRVNUM
F843 4A LSR
F844 A5 2E LDA TEMP+4
F846 2A ROL
F847 85 7F STA x7F
F849 A5 2F LDA TEMP+5
F84B 8D EA 10 STA x10EA
F84E 4C 75 F0 iF84E JMP ENDCMD
F851 A9 08 iF851 LDA #$08
F853 85 96 STA CMDNUM
F855 A6 95 LDX CMDSIZ
F857 CA DEX
F858 D0 12 BNE iF86C
F85A A9 2A LDA #$2A
F85C 85 00 STA CMDBUF
F85E A9 80 LDA #$80
F860 85 AC STA FILTRK
F862 05 D2 ORA LSTDRV
F864 85 A7 STA FILDAT
F866 E6 99 INC F1CNT
F868 E6 9A INC R0
F86A D0 3B BNE iF8A7
F86C CA iF86C DEX
F86D D0 1B BNE iF88A
F86F A5 01 LDA CMDBUF+1
F871 20 3D F2 JSR TST0V1
F874 30 14 BMI iF88A
F876 29 01 AND #$01
F878 85 A7 STA FILDAT
F87A E6 99 INC F1CNT
F87C E6 9A INC R0
F87E E6 9D INC FILTBL
F880 A9 80 LDA #$80
F882 85 AC STA FILTRK
F884 A9 2A LDA #$2A
F886 85 01 STA CMDBUF+1
F888 D0 1D BNE iF8A7
F88A A2 00 iF88A LDX #$00
F88C A9 3A LDA #$3A
F88E 20 17 F1 JSR PARSE
F891 D0 07 BNE iF89A
F893 A0 00 LDY #$00
F895 20 81 F1 JSR iF181
F898 A0 03 LDY #$03
F89A 88 iF89A DEY
F89B 88 DEY
F89C 84 9D STY FILTBL
F89E 20 C2 F0 JSR iF0C2
F8A1 20 1B F2 JSR FS1SET
F8A4 20 AD F1 JSR ALLDRS
F8A7 20 4A F2 iF8A7 JSR OPTSCH
F8AA 20 2E F6 JSR NEWDIR
F8AD 20 E1 F2 JSR FFST
F8B0 20 28 EF JSR iEF28
F8B3 20 D4 E9 JSR GETBYT
F8B6 A6 83 LDX LINDX
F8B8 9D D9 10 STA CHNDAT,X
F8BB A5 80 LDA DRVNUM
F8BD 85 D2 STA LSTDRV
F8BF 09 04 ORA #$04
F8C1 95 B6 STA FILTYP,X
F8C3 A9 00 LDA #$00
F8C5 85 5B STA x5B
F8C7 60 RTS
; NEW: INITIALIZE A DISK, DISK IS
; SOFT-SECTORED, BIT AVAIL. MAP,
; DIRECTORY, & 1ST BLOCK ARE ALL INITED
F8C8 20 A3 F1 NEW JSR ONEDRV
F8CB A5 A7 LDA FILDAT ; SET UP DRIVE#
F8CD 10 05 BPL iF8D4
F8CF A9 33 LDA #$33 ; BADFN
F8D1 4C 90 F0 JMP CMDERR
F8D4 29 01 iF8D4 AND #$01
F8D6 85 80 STA DRVNUM
F8D8 0A ASL
F8D9 AA TAX
F8DA 20 0A EF JSR SETLDS
F8DD A4 9E LDY FILTBL+1 ; GET DISK ID
F8DF C4 95 CPY CMDSIZ ; IS THIS NEW OR CLEAR?
F8E1 F0 13 BEQ iF8F6 ; END OF CMD STRING
F8E3 B9 00 00 LDA CMDBUF,Y
F8E6 95 8E STA DISKID,X ; STORE IN PROPER DRIVE
F8E8 B9 01 00 LDA CMDBUF+1,Y ; (Y=0)
F8EB 95 8F STA DISKID+1,X
F8ED A9 01 LDA #$01 ; ...IN TRACK, TRACK=1
F8EF 85 81 STA TRACK
F8F1 20 14 FB JSR FORMAT ; TRANSFER FORMAT TO RAM
F8F4 F0 03 BEQ iF8F9
F8F6 20 C1 E8 iF8F6 JSR INITDR
F8F9 A6 80 iF8F9 LDX DRVNUM
F8FB BD 40 E5 LDA IPBM,X ; load high byte of buffer for drive, either $4200 or $4300?
F8FE 85 31 STA IP+1
F900 A9 00 LDA #$00
F902 85 30 STA IP
F904 A8 TAY
F905 91 30 iF905 STA (IP),Y ; clear buffer
F907 C8 INY
F908 D0 FB BNE iF905
F90A 8A TXA ; X contains the drive
F90B 18 CLC
F90C 69 0D ADC #$0D ; BAMJOB, BUF#13 + DRVNUM
F90E 85 8D STA JOBNUM ; either 13 or 14 (dezimal)
F910 0A ASL
F911 AA TAX ; either 26 or 28 (dezimal) = $1a or $1c
F912 A9 90 LDA #$90
F914 95 3D STA BUFTAB,X ; store either into $57 or $59
F916 A9 04 LDA #$04
F918 85 82 STA SECTOR
F91A A9 12 LDA #$12 ; directory track (18)
F91C 85 81 STA TRACK
F91E 20 21 EE iF91E JSR DRTWRT ; loop over directory starting with SECTOR=4 until SECTOR contains #1
F921 A5 82 LDA SECTOR ; write each sector with interleave of 3
F923 18 CLC
F924 69 03 ADC #$03 ; secs 4,7,10,13,16,19,22, 3,6,9,12,15,18,21, 2,5,8,11,14,17,20
F926 85 82 STA SECTOR
F928 C9 14 CMP #$14
F92A 90 F2 BCC iF91E
F92C E9 13 SBC #$13
F92E 85 82 STA SECTOR
F930 AA TAX
F931 CA DEX
F932 D0 EA BNE iF91E
F934 A0 01 LDY #$01 ; end of loop, SECTOR contains $01
F936 A9 FF LDA #$FF
F938 91 30 STA (IP),Y ; end of file marker (followup sector in second byte in sector = $ff)
F93A 20 21 EE JSR DRTWRT ; CLEAR DIRECTORY (write t=18/s=1)
F93D C6 82 DEC SECTOR ; move pointer to BAM block
F93F 20 AC FC JSR iFCAC
F942 A0 48 LDY #$48
F944 A9 12 LDA #$12
F946 91 30 STA (IP),Y
F948 C8 INY
F949 A9 FC LDA #$FC
F94B 91 30 STA (IP),Y
F94D A4 8D LDY JOBNUM
F94F A6 9D LDX FILTBL
F951 A9 1B LDA #$1B
F953 20 4D F4 JSR TRNAME ; TRANSFER CMD BUF TO BUF0
F956 A0 12 LDY #$12
F958 A5 80 LDA DRVNUM ; SET UP CURRENT I.D.
F95A 0A ASL
F95B AA TAX
F95C B5 8E LDA DISKID,X
F95E 91 93 STA (DIRBUF),Y
F960 C8 INY
F961 B5 8F LDA DISKID+1,X
F963 91 93 STA (DIRBUF),Y
F965 C8 INY
F966 A9 20 LDA #$20 ; add two spaces. Newer versions add "DOSVER+$30" and "VERNUM" -> "2A"
F968 91 93 STA (DIRBUF),Y
F96A C8 INY
F96B 91 93 STA (DIRBUF),Y
F96D 20 21 EE JSR DRTWRT ; WRITE IT OUT
F970 4C 75 F0 JMP ENDCMD
; SCRATCH FILE(S)
F973 20 1B F2 SCRTCH JSR FS1SET ; SET UP FOR 1 STREAM
F976 20 AD F1 JSR ALLDRS
F979 20 4A F2 JSR OPTSCH
F97C A9 00 LDA #$00
F97E 8D EB 10 STA x10EB
F981 20 E1 F2 JSR FFST
F984 30 22 BMI iF9A8
F986 20 DE F9 iF986 JSR DELDIR ; DELETE DIRECTORY; in 4040 before this a test for active file is inserted
F989 A6 37 LDX ENTFND ; in 4040 before this a REL-file test is inserted
F98B A9 20 LDA #$20
F98D 35 A7 AND FILDAT,X
F98F D0 0F BNE iF9A0 ; CREATED, NOT CLOSED
F991 A6 37 LDX ENTFND ; no needed
F993 B5 AC LDA FILTRK,X ; DELETE BY LINKS
F995 29 7F AND #$7F
F997 85 81 STA TRACK
F999 B5 B1 LDA FILSEC,X
F99B 85 82 STA SECTOR
F99D 20 B6 F9 JSR DELFIL
F9A0 EE EB 10 iF9A0 INC x10EB
F9A3 20 D0 F2 JSR FFRE
F9A6 10 DE BPL iF986
F9A8 AD EB 10 iF9A8 LDA x10EB ; FINISHED SET
F9AB 85 81 STA TRACK ; FILE COUNT
F9AD A9 01 LDA #$01
F9AF A0 00 LDY #$00
F9B1 84 82 STY SECTOR
F9B3 4C 7A F0 JMP SCREND ; END OF SCRATCH
F9B6 20 DD EE DELFIL JSR FRETS ; DELETE FILE BY LINKS
F9B9 20 36 EE JSR OPNIRD ; UPDATE BAM
F9BC A9 00 DEL2 LDA #$00
F9BE 20 89 EE JSR SETPNT
F9C1 20 F3 E9 JSR RDBYT
F9C4 85 81 STA TRACK
F9C6 20 F3 E9 JSR RDBYT
F9C9 85 82 STA SECTOR
F9CB A5 81 LDA TRACK
F9CD D0 06 BNE iF9D5
F9CF 20 87 EC JSR MAPOUT
F9D2 4C 32 EB JMP FRECHN
F9D5 20 DD EE iF9D5 JSR FRETS
F9D8 20 F3 ED JSR NXTBUF
F9DB 4C BC F9 JMP DEL2
F9DE A0 00 DELDIR LDY #$00
F9E0 98 TYA
F9E1 91 93 STA (DIRBUF),Y
F9E3 C8 INY
F9E4 91 93 STA (DIRBUF),Y
F9E6 88 DEY
F9E7 20 9D E8 JSR GETACT
F9EA 4C 21 EE JMP DRTWRT
; DUPLICATE DISK
F9ED A9 3D DUPLCT LDA #$3D ; "=" SPECIAL CASE
F9EF 20 17 F1 JSR PARSE
F9F2 D0 05 BNE iF9F9
F9F4 A9 30 iF9F4 LDA #$30
F9F6 4C 90 F0 JMP CMDERR
F9F9 B9 00 00 iF9F9 LDA CMDBUF,Y
F9FC 20 3D F2 JSR TST0V1
F9FF 30 F3 BMI iF9F4
FA01 AA TAX
FA02 88 DEY
FA03 88 DEY
FA04 B9 00 00 LDA CMDBUF,Y
FA07 20 3D F2 JSR TST0V1
FA0A 30 E8 BMI iF9F4
FA0C 49 01 EOR #$01
FA0E 85 80 STA DRVNUM
FA10 A9 18 LDA #$18 ; LED0+LED1
FA12 0D 82 02 ORA RIOT2PBD
FA15 8D 82 02 STA RIOT2PBD
FA18 20 C1 E8 JSR INITDR ; INIT SRC
FA1B A5 80 LDA DRVNUM
FA1D 49 01 EOR #$01
FA1F 85 80 STA DRVNUM
FA21 0A ASL
FA22 A8 TAY
FA23 49 02 EOR #$02
FA25 AA TAX
FA26 B5 8E LDA DISKID,X
FA28 99 8E 00 STA DISKID,Y
FA2B B5 8F LDA DISKID+1,X
FA2D 99 8F 00 STA DISKID+1,Y
FA30 A9 01 LDA #$01
FA32 85 81 STA TRACK
FA34 20 14 FB JSR FORMAT ; FORMAT DST DRIVE
; COPY BLOCKS FROM ONE DRIVE TO OTHER
FA37 A5 81 CPYD1 LDA TRACK
FA39 20 B1 E5 JSR MAXSEC
FA3C 85 82 STA SECTOR
FA3E C6 82 DEC SECTOR
FA40 20 51 FA JSR CPYTRK ; COPY ONE TRACK
FA43 E6 81 INC TRACK
FA45 A5 81 LDA TRACK
FA47 C9 24 CMP #$24 ; MAXTRK
FA49 D0 EC BNE CPYD1
FA4B 20 C1 E8 JSR INITDR
FA4E 4C 75 F0 JMP ENDCMD
; COPY ONE TRACK
FA51 20 62 FA CPYTRK JSR iFA62
FA54 20 6D FA iFA54 JSR SETRH
FA57 20 A0 FA JSR READS ; READ 10 SECTORS
FA5A 20 D8 FA JSR WRITES ; WRITE 10 SECTORS
FA5D A5 82 LDA SECTOR
FA5F 10 F3 BPL iFA54
FA61 60 RTS
FA62 A2 0A iFA62 LDX #$0A
FA64 A5 81 LDA TRACK
FA66 9D 12 10 iFA66 STA x1012,X
FA69 CA DEX
FA6A 10 FA BPL iFA66
FA6C 60 RTS
FA6D A5 80 SETRH LDA DRVNUM
FA6F 49 01 EOR #$01
FA71 85 89 STA CMD
FA73 A9 0A LDA #$0A
FA75 85 2C STA TEMP+2
FA77 A5 2C iFA77 LDA TEMP+2 ; the 4040 has this up to fa95 in subroutine SETH
FA79 0A ASL
FA7A 0A ASL
FA7B 0A ASL
FA7C A8 TAY
FA7D A5 80 LDA DRVNUM
FA7F 0A ASL
FA80 AA TAX
FA81 B5 8E LDA DISKID,X
FA83 99 21 10 STA HDRS,Y
FA86 B5 8F LDA DISKID+1,X
FA88 99 22 10 STA HDRS+1,Y
FA8B A5 81 LDA TRACK
FA8D 99 23 10 STA HDRS+2,Y
FA90 A5 82 LDA SECTOR
FA92 99 24 10 STA HDRS+3,Y
FA95 C6 82 DEC SECTOR
FA97 30 06 BMI iFA9F
FA99 C6 2C DEC TEMP+2
FA9B 10 DA BPL iFA77
FA9D E6 2C INC TEMP+2
FA9F 60 iFA9F RTS
; READ TEMP+2 BLOCKS IN
FAA0 A5 89 READS LDA CMD
FAA2 09 80 ORA #$80 ; READ
FAA4 85 89 STA CMD
FAA6 A6 2C LDX TEMP+2
FAA8 9D 03 10 iFAA8 STA JOBS,X
FAAB E0 0A CPX #$0A
FAAD F0 03 BEQ iFAB2
FAAF E8 INX
FAB0 D0 F6 BNE iFAA8
FAB2 A6 2C iFAB2 LDX TEMP+2
FAB4 A0 0A LDY #$0A
FAB6 BD 03 10 iFAB6 LDA JOBS,X
FAB9 30 FB BMI iFAB6
FABB C9 04 CMP #$04
FABD F0 11 BEQ iFAD0
FABF C9 01 CMP #$01
FAC1 F0 0D BEQ iFAD0
FAC3 88 DEY
FAC4 10 03 BPL iFAC9
FAC6 4C B3 E6 JMP ERROR
FAC9 A5 89 iFAC9 LDA CMD
FACB 9D 03 10 STA JOBS,X
FACE 30 E6 BMI iFAB6
FAD0 E0 0A iFAD0 CPX #$0A
FAD2 F0 03 BEQ iFAD7
FAD4 E8 INX
FAD5 D0 DF BNE iFAB6
FAD7 60 iFAD7 RTS
; WRITE TEMP+2 BUFFERS OUT
FAD8 A9 90 WRITES LDA #$90 ; #WRITE
FADA 05 80 ORA DRVNUM
FADC 85 89 STA CMD
FADE A6 2C LDX TEMP+2
FAE0 BC 03 10 iFAE0 LDY JOBS,X
FAE3 C0 04 CPY #$04
FAE5 D0 09 BNE iFAF0
FAE7 A9 01 LDA #$01
FAE9 9D 03 10 STA JOBS,X
FAEC A5 89 LDA CMD
FAEE D0 03 BNE iFAF3
FAF0 9D 03 10 iFAF0 STA JOBS,X
FAF3 E0 0A iFAF3 CPX #$0A
FAF5 F0 03 BEQ iFAFA
FAF7 E8 INX
FAF8 D0 E6 BNE iFAE0
FAFA A6 2C iFAFA LDX TEMP+2
FAFC BD 03 10 iFAFC LDA JOBS,X
FAFF 30 FB BMI iFAFC
FB01 C9 01 CMP #$01
FB03 F0 07 BEQ iFB0C
FB05 A5 89 LDA CMD
FB07 9D 03 10 STA JOBS,X
FB0A 30 F0 BMI iFAFC
FB0C E0 0A iFB0C CPX #$0A
FB0E F0 03 BEQ iFB13
FB10 E8 INX
FB11 D0 E9 BNE iFAFC
FB13 60 iFB13 RTS
; TRANSFER FORMAT CODE TO BUFFER 0
; & START CONTROLLER FORMATTING
FB14 A0 00 FORMAT LDY #$00
FB16 B9 40 E0 iFB16 LDA CODE,Y
FB19 99 00 11 STA BUFS,Y
FB1C B9 40 E1 LDA CODE+256,Y
FB1F 99 00 12 STA BUFS+256,Y
FB22 C8 INY
FB23 D0 F1 BNE iFB16
FB25 A9 00 LDA #$00
FB27 20 6B E8 JSR SETH
FB2A A9 01 LDA #$01
FB2C 8D 12 10 STA x1012
FB2F A5 80 LDA DRVNUM
FB31 09 E0 ORA #$E0 ; or with EXEC
FB33 8D 03 10 STA JOBS
FB36 AD 03 10 iFB36 LDA JOBS
FB39 30 FB BMI iFB36
FB3B C9 01 CMP #$01
FB3D F0 07 BEQ iFB46
FB3F A9 03 LDA #$03
FB41 A2 00 LDX #$00
FB43 4C B3 E6 JMP ERROR
FB46 60 iFB46 RTS
; DSKCPY CHECK FOR TYPE AND PARSES SPECIAL CASE
FB47 20 AD F1 DSKCPY JSR ALLDRS
FB4A 20 4A F2 JSR OPTSCH
FB4D 20 99 F2 JSR LOOKUP
FB50 A5 A8 LDA FILDAT+1
FB52 4A LSR
FB53 29 0F AND #$0F
FB55 85 DC STA xDC
FB57 20 16 FC JSR CHKIO
FB5A A5 A7 LDA FILDAT
FB5C 29 01 AND #$01
FB5E 85 80 STA DRVNUM
FB60 A9 00 LDA #$00
FB62 85 9B STA F1PTR
FB64 20 42 EE JSR iEE42
FB67 20 82 F4 JSR iF482
FB6A A4 83 LDY LINDX
FB6C 8C EB 10 STY x10EB
FB6F A6 9B LDX F1PTR
FB71 B5 A2 LDA FILENT,X
FB73 99 E1 10 STA CHNDAT+8,Y
FB76 A5 80 LDA DRVNUM
FB78 4A LSR
FB79 A5 DC LDA xDC
FB7B 2A ROL
FB7C 99 B6 00 STA FILTYP,Y
FB7F A6 99 LDX F1CNT
FB81 86 9C iFB81 STX F2PTR
FB83 B5 B1 LDA FILSEC,X
FB85 85 82 STA SECTOR
FB87 B5 AC LDA FILTRK,X
FB89 29 3F AND #$3F
FB8B 85 81 STA TRACK
FB8D B5 A7 LDA FILDAT,X
FB8F 29 01 AND #$01
FB91 85 80 STA DRVNUM
FB93 20 36 EE JSR OPNIRD
FB96 A5 83 LDA LINDX
FB98 8D EC 10 STA x10EC
FB9B 10 11 BPL iFBAE
FB9D AD EB 10 iFB9D LDA x10EB
FBA0 85 83 STA LINDX
FBA2 68 PLA
FBA3 20 35 EA JSR WRTBYT
FBA6 20 0A EF JSR SETLDS
FBA9 AD EC 10 LDA x10EC
FBAC 85 83 STA LINDX
FBAE 20 F3 E9 iFBAE JSR RDBYT
FBB1 48 PHA
FBB2 20 0A EF JSR SETLDS
FBB5 A6 83 LDX LINDX
FBB7 B5 BE LDA CHNRDY,X
FBB9 C9 80 CMP #$80
FBBB D0 E0 BNE iFB9D
FBBD AD EB 10 LDA x10EB
FBC0 85 83 STA LINDX
FBC2 68 PLA
FBC3 20 35 EA JSR WRTBYT
FBC6 A6 9C LDX F2PTR
FBC8 E8 INX
FBC9 E4 9A CPX R0
FBCB 90 B4 BCC iFB81
FBCD 20 0F EC JSR CLOSE
FBD0 4C 75 F0 JMP ENDCMD
; RENAME FILE NAME IN DIRECTORY
FBD3 20 AD F1 RENAME JSR ALLDRS ; SET BOTH DRIVE #'S
FBD6 A5 A8 LDA FILDAT+1
FBD8 29 01 AND #$01
FBDA 85 A8 STA FILDAT+1
FBDC C5 A7 CMP FILDAT
FBDE F0 02 BEQ iFBE2 ; SAME DRIVE #'S
FBE0 09 80 ORA #$80 ; CHECK BOTH DRIVES FOR NAME
FBE2 85 A7 iFBE2 STA FILDAT
FBE4 20 4A F2 JSR OPTSCH
FBE7 20 99 F2 JSR LOOKUP ; LOOK UP BOTH NAMES
FBEA 20 16 FC JSR CHKIO ; CHECK FOR EXISTENCE
FBED A5 A8 LDA FILDAT+1
FBEF 29 01 AND #$01
FBF1 85 80 STA DRVNUM
FBF3 A5 A3 LDA xA3
FBF5 48 PHA
FBF6 29 1F AND #$1F
FBF8 85 82 STA SECTOR
FBFA 20 1D EE JSR DRTRD ; in 4040 different code with comment "POSIBLE BUG"
FBFD 68 PLA
FBFE 29 E0 AND #$E0 ; SET SECTOR INDEX
FC00 09 05 ORA #$05 ; ;+5
FC02 20 89 EE JSR SETPNT
FC05 20 9D E8 JSR GETACT
FC08 A8 TAY
FC09 A6 9D LDX FILTBL
FC0B A9 10 LDA #$10
FC0D 20 4D F4 JSR TRNAME ; TRANSFER NAME
FC10 20 21 EE JSR DRTWRT ; WRITE SECTOR OUT
FC13 4C 75 F0 JMP ENDCMD
; CHECK I/O FILE FOR EXIST
; this is different from 4040
FC16 A6 9A CHKIO LDX R0
FC18 CA iFC18 DEX
FC19 E4 99 CPX F1CNT
FC1B 90 0B BCC iFC28
FC1D B5 AC LDA FILTRK,X
FC1F 29 7F AND #$7F
FC21 D0 F5 BNE iFC18
FC23 A9 62 LDA #$62
FC25 4C 90 F0 JMP CMDERR
FC28 B5 AC iFC28 LDA FILTRK,X
FC2A 29 7F AND #$7F
FC2C F0 05 BEQ iFC33
FC2E A9 63 LDA #$63
FC30 4C 90 F0 JMP CMDERR
FC33 CA iFC33 DEX
FC34 10 F2 BPL iFC28
FC36 60 RTS
; VALIDATE FILES WITH BAM
; CREATE NEW BAM ACCORDING TO
; CONTENTS OF FILES ENTERED IN DIR
FC37 20 99 F0 VERDIR JSR SIMPRS ; EXTRACT DRIVE #
FC3A 20 0A EF JSR SETLDS
FC3D 20 C1 E8 JSR INITDR ; INIT THE DRIVE FOR NAME, ID
FC40 20 A1 FC JSR NEWMAP ; SET NEW BAM
FC43 A9 00 LDA #$00
FC45 85 D6 STA DELIND
FC47 20 CE F3 JSR SRCHST ; SEARCH FOR FIRST FILE
FC4A D0 23 BNE iFC6F ; FOUND ONE
FC4C A9 00 iFC4C LDA #$00 ; SET DIRECTORY SECTORS...
FC4E 85 82 STA SECTOR ; ... IN BAM
FC50 A9 12 LDA #$12
FC52 85 81 STA TRACK
FC54 20 79 FC JSR MRKBAM
FC57 20 87 EC JSR MAPOUT ; WRITE OUT BAM
FC5A 4C 75 F0 JMP ENDCMD
FC5D C8 iFC5D INY
FC5E B1 93 LDA (DIRBUF),Y
FC60 85 81 STA TRACK
FC62 C8 INY
FC63 B1 93 LDA (DIRBUF),Y
FC65 85 82 STA SECTOR ; in 4040 here is inserted PHA .... REL-File Side Sector code ... PLA; NOW DO DATA BLOCKS
FC67 20 79 FC JSR MRKBAM ; SET BIT USED IN BAM
FC6A 20 19 F4 iFC6A JSR SRRE ; SEARCH FOR MORE
FC6D F0 DD BEQ iFC4C ; NO MORE FILES
FC6F B1 93 iFC6F LDA (DIRBUF),Y
FC71 30 EA BMI iFC5D
FC73 20 DE F9 JSR DELDIR ; NOT CLOSED DELETE DIR
FC76 4C 6A FC JMP iFC6A
; MARK BAM WITH FILE SECTORS
FC79 20 5F E5 MRKBAM JSR SETBMP
FC7C 20 A0 E7 JSR USEDTS
FC7F 20 36 EE JSR OPNIRD
FC82 A9 00 iFC82 LDA #$00
FC84 20 89 EE JSR SETPNT
FC87 20 D4 E9 JSR GETBYT
FC8A 85 81 STA TRACK
FC8C 20 D4 E9 JSR GETBYT
FC8F 85 82 STA SECTOR
FC91 A5 81 LDA TRACK
FC93 D0 03 BNE iFC98
FC95 4C 32 EB JMP FRECHN
FC98 20 A0 E7 iFC98 JSR USEDTS
FC9B 20 F3 ED JSR NXTBUF
FC9E 4C 82 FC JMP iFC82
FCA1 A5 80 NEWMAP LDA DRVNUM ; create BAM
FCA3 18 CLC
FCA4 69 42 ADC #$42
FCA6 85 31 STA IP+1 ; buffer is $4200 for drive 0 or $4300 for drive 1
FCA8 A9 00 LDA #$00
FCAA 85 30 STA IP
FCAC A5 82 iFCAC LDA SECTOR ; track(!) count, not sector
FCAE 48 PHA
FCAF A2 00 LDX #$00
FCB1 A0 00 LDY #$00 ; start with track=0 (=illegal), place for link address
FCB3 84 82 STY SECTOR
FCB5 BD 22 E0 iFCB5 LDA TRKTBL,X
FCB8 91 30 STA (IP),Y ; fill buffer with data (sector/track, #$ff, #$ff, e02a+x) for each track
FCBA C8 INY ; i.e. about 35*4=140 bytes, where x is number of speedzone
FCBB A9 FF LDA #$FF
FCBD 91 30 STA (IP),Y
FCBF C8 INY
FCC0 91 30 STA (IP),Y
FCC2 C8 INY
FCC3 BD 2A E0 LDA BAMEND,X ; lookup, do not compute (as in later DOS versions) last entry in BAM sector map for track
FCC6 91 30 STA (IP),Y
FCC8 C8 INY
FCC9 E6 82 INC SECTOR
FCCB BD 26 E0 LDA CHGTRACKS,X ; check track with track where speed zone changes
FCCE C5 82 CMP SECTOR
FCD0 B0 E3 BCS iFCB5 ; if not new speed zone, go to next track
FCD2 E8 INX
FCD3 E0 04 CPX #$04 ; compare with number of speed zones
FCD5 90 DE BCC iFCB5
FCD7 A0 00 LDY #$00 ; write track link address
FCD9 A9 12 LDA #$12 ; track 18
FCDB 91 30 STA (IP),Y
FCDD C8 INY
FCDE 98 TYA ; sector 1
FCDF 91 30 STA (IP),Y
FCE1 C8 INY
FCE2 91 30 STA (IP),Y ; version 1
FCE4 C8 INY
FCE5 A9 00 LDA #$00 ; fill byte 0
FCE7 91 30 STA (IP),Y
FCE9 68 PLA
FCEA 85 82 STA SECTOR
FCEC 60 RTS
; MEMORY ACCESS COMMANDS
; "-" MUST BE 2ND CHAR
FCED A5 01 MEM LDA CMDBUF+1
FCEF C9 2D CMP #$2D ; "-"
FCF1 D0 30 BNE MEMERR
FCF3 A5 02 LDA CMDBUF+2
FCF5 C9 57 CMP #$57 ; "W"
FCF7 F0 2F BEQ MEMWRT ; WRITE
FCF9 C9 52 CMP #$52 ; "R"
FCFB F0 12 BEQ MEMRD ; READ
FCFD C9 45 CMP #$45 ; "E"
FCFF D0 22 BNE MEMERR ; ERROR
FD01 20 38 FD JSR iFD38 ; copy address
FD04 20 0C FD JSR MEMEX ; EXECUTE
FD07 A9 00 iFD07 LDA #$00
FD09 85 5B STA x5B
FD0B 60 RTS
FD0C 6C 2A 00 MEMEX JMP (TEMP)
FD0F 20 38 FD MEMRD JSR iFD38 ; copy address
FD12 B1 2A LDA (TEMP),Y
FD14 8D B4 42 STA NAMBUF
FD17 8D E0 10 STA CHNDAT+7
FD1A A9 B4 LDA #$B4
FD1C 85 5D STA x5D
FD1E 85 CD STA LSTCHR+7
FD20 4C 07 FD JMP iFD07
FD23 A9 31 MEMERR LDA #$31 ; BADCMD
FD25 4C 90 F0 JMP CMDERR
FD28 20 38 FD MEMWRT JSR iFD38 ; WRITE; copy address
FD2B B9 06 00 iFD2B LDA CMDBUF+6,Y
FD2E 91 2A STA (TEMP),Y ; TRANSFER FROM CMDBUF
FD30 C8 INY
FD31 C4 05 CPY CMDBUF+5 ; # OF BYTES TO WRITE
FD33 90 F6 BCC iFD2B
FD35 4C 07 FD JMP iFD07
FD38 A5 03 iFD38 LDA CMDBUF+3 ; copy address from command to tmp
FD3A 85 2A STA TEMP
FD3C A5 04 LDA CMDBUF+4
FD3E 85 2B STA TEMP+1
FD40 A0 00 LDY #$00
FD42 60 RTS
; ROM 1.1 ADDITIONS
; USER COMMANDS
FD43 A4 01 USER LDY CMDBUF+1
FD45 C0 30 CPY #$30
FD47 D0 09 BNE iFD52 ; "0" RESETS PNTR
FD49 A9 EA USRINT LDA #$EA ; #<UBLOCK; SET DEFAULT BLOCK ADD
FD4B 85 DD STA USRJMP
FD4D A9 FF LDA #$FF ; #>UBLOCK
FD4F 85 DE STA USRJMP+1
FD51 60 RTS
FD52 20 58 FD iFD52 JSR USREXC ; EXECUTE CODE BY TABLE
FD55 4C 75 F0 JMP ENDCMD
FD58 88 USREXC DEY ; ENTRY IS (((INDEX-1)AND$F)*2)
FD59 98 TYA
FD5A 29 0F AND #$0F
FD5C 0A ASL
FD5D A8 TAY
FD5E B1 DD LDA (USRJMP),Y
FD60 85 30 STA IP
FD62 C8 INY
FD63 B1 DD LDA (USRJMP),Y
FD65 85 31 STA IP+1
FD67 6C 30 00 JMP (IP)
; OPEN DIRECT ACCESS BUFFER
; FROM OPEN "#"
FD6A A6 95 OPNBLK LDX CMDSIZ
FD6C CA DEX
FD6D D0 0D BNE iFD7C
FD6F A9 01 LDA #$01 ; GET ANY BUFFER
FD71 20 F3 EA JSR GETRCH
FD74 4C BA FD JMP iFDBA
FD77 A9 70 iFD77 LDA #$70 ; NOCHNL
FD79 4C 90 F0 JMP CMDERR
FD7C A0 01 iFD7C LDY #$01 ; BUFFER # IS REQUESTED
FD7E 20 41 FE JSR iFE41
FD81 A6 B1 LDX FILSEC
FD83 E0 0D CPX #$0D ; BAMJOB; MUST BE LESS THAN 13
FD85 B0 F0 BCS iFD77
FD87 A9 00 LDA #$00
FD89 85 2A STA TEMP
FD8B 85 2B STA TEMP+1
FD8D 38 SEC
FD8E 26 2A iFD8E ROL TEMP
FD90 26 2B ROL TEMP+1
FD92 CA DEX
FD93 10 F9 BPL iFD8E
FD95 A5 2A LDA TEMP
FD97 25 8B AND BUFUSE
FD99 D0 DC BNE iFD77 ; BUFFER IS USED
FD9B A5 2B LDA TEMP+1
FD9D 25 8C AND BUFUSE+1
FD9F D0 D6 BNE iFD77 ; BUF IS USED
FDA1 A5 2A LDA TEMP
FDA3 05 8B ORA BUFUSE ; SET BUFFER AS USED
FDA5 85 8B STA BUFUSE
FDA7 A5 2B LDA TEMP+1
FDA9 05 8C ORA BUFUSE+1
FDAB 85 8C STA BUFUSE+1
FDAD A9 00 LDA #$00 ; SET UP CHANNEL
FDAF 20 F3 EA JSR GETRCH
FDB2 A5 83 LDA LINDX
FDB4 0A ASL
FDB5 AA TAX
FDB6 A5 B1 LDA FILSEC
FDB8 95 5F STA BUFNUM,X
FDBA A5 84 iFDBA LDA SA
FDBC 0A ASL
FDBD AA TAX
FDBE BD B7 10 LDA LINTAB,X ; SET LINDX TABLE
FDC1 9D B8 10 STA LINTAB+1,X ; the 4040 has LINTAB and LINTAB+1 folded together by ORing with #$40
FDC4 A8 TAY
FDC5 A9 FF LDA #$FF
FDC7 99 C6 00 STA LSTCHR,Y
FDCA A9 89 LDA #$89 ; RNDRDY
FDCC 99 BE 00 STA CHNRDY,Y ; SET CHANNEL READY
FDCF 98 TYA
FDD0 0A ASL
FDD1 AA TAX
FDD2 B5 5F LDA BUFNUM,X
FDD4 99 D9 10 STA CHNDAT,Y ; BUFFER # AS 1ST CHAR
FDD7 0A ASL
FDD8 AA TAX
FDD9 A9 01 LDA #$01
FDDB 95 3D STA BUFTAB,X
FDDD A9 08 LDA #$08 ; DIRTYP+DIRTYP
FDDF 99 B6 00 STA FILTYP,Y ; SET DIRECT FILE TYPE
FDE2 4C 75 F0 JMP ENDCMD
; BLOCK COMMANDS
FDE5 A0 00 BLOCK LDY #$00
FDE7 A2 00 LDX #$00
FDE9 A9 2D LDA #$2D ; "-" SEPARATES CMD FROM SUBCMD
FDEB 20 17 F1 JSR PARSE ; LOCATE SUB-CMD
FDEE D0 0A BNE iFDFA
FDF0 A9 31 iFDF0 LDA #$31 ; BADCMD
FDF2 4C 90 F0 JMP CMDERR
FDF5 A9 30 iFDF5 LDA #$30 ; BADSYN
FDF7 4C 90 F0 JMP CMDERR
FDFA 8A iFDFA TXA
FDFB D0 F8 BNE iFDF5
FDFD A2 05 LDX #$05 ; NBCMDS-1; FIND COMMAND
FDFF B9 00 00 LDA CMDBUF,Y
FE02 DD 22 FE iFE02 CMP BCTAB,X
FE05 F0 05 BEQ iFE0C
FE07 CA DEX
FE08 10 F8 BPL iFE02
FE0A 30 E4 BMI iFDF0
FE0C 86 96 iFE0C STX CMDNUM ; found command
FE0E 20 34 FE JSR BLKPAR ; PARSE PARAMS
FE11 A5 96 LDA CMDNUM
FE13 0A ASL
FE14 AA TAX
FE15 BD 29 FE LDA BCJMP+1,X
FE18 85 2B STA TEMP+1
FE1A BD 28 FE LDA BCJMP,X
FE1D 85 2A STA TEMP
FE1F 6C 2A 00 JMP (TEMP) ; GOTO COMMAND
FE22 BCTAB .byte $41, $46, $52, $57, $45, $50 ;afrwep
; NBCMDS = *-BCTAB
; BLOCK-ALLOCATE, BLOCK-FREE, BLOCK-READ, BLOCK-WRITE, BLOCK-EXECUTE, BLOCK-POINTER
FE28 BCJMP .word BLKALC
xFE29 = * - 1 ; referenced;
FE2A .word BLKFRE , BLKRD , BLKWT , BLKEXC
FE32 .word BLKPTR
; PARSE BLOCK PARMS
FE34 A0 00 BLKPAR LDY #$00 ; PARSE BLOCK PARMS
FE36 A2 00 LDX #$00
FE38 A9 3A LDA #$3A ; ":"
FE3A 20 17 F1 JSR PARSE
FE3D D0 02 BNE iFE41 ; FOUND ":"
FE3F A0 03 LDY #$03 ; ELSE CHAR #3 IS BEGINNING
FE41 B9 00 00 iFE41 LDA CMDBUF,Y
FE44 C9 20 CMP #$20 ; " "
FE46 F0 08 BEQ iFE50
FE48 C9 1D CMP #$1D ; SKIP CHARACTER
FE4A F0 04 BEQ iFE50
FE4C C9 2C CMP #$2C ; ","
FE4E D0 06 BNE iFE56
FE50 C8 iFE50 INY
FE51 C4 95 CPY CMDSIZ
FE53 90 EC BCC iFE41
FE55 60 RTS ; THAT'S ALL
FE56 20 63 FE iFE56 JSR ASCHEX
FE59 E6 99 INC F1CNT
FE5B A4 9C LDY F2PTR
FE5D E0 04 CPX #$04 ; MXFILS-1
FE5F 90 EF BCC iFE50
FE61 B0 92 BCS iFDF5 ; BAD SYNTAX
; CONVERT ASCII TO HEX (BINARY)
; & STORE CONVERSION IN TABLES
; .Y=PTR INTO CMDBUF
FE63 A9 00 ASCHEX LDA #$00
FE65 85 2A STA TEMP
FE67 85 2B STA TEMP+1
FE69 85 2D STA TEMP+3
FE6B A2 FF LDX #$FF
FE6D B9 00 00 iFE6D LDA CMDBUF,Y ; TEST FOR DEC #
FE70 C9 40 CMP #$40
FE72 B0 17 BCS iFE8B ; NON-NUMERIC TERMINATES
FE74 C9 30 CMP #$30
FE76 90 13 BCC iFE8B ; NON-NUMERIC
FE78 29 0F AND #$0F
FE7A 48 PHA
FE7B A5 2B LDA TEMP+1 ; SHIFT DIGITS (*10)
FE7D 85 2C STA TEMP+2
FE7F A5 2A LDA TEMP
FE81 85 2B STA TEMP+1
FE83 68 PLA
FE84 85 2A STA TEMP
FE86 C8 INY
FE87 C4 95 CPY CMDSIZ
FE89 90 E2 BCC iFE6D ; STILL IN STRING
FE8B 84 9C iFE8B STY F2PTR ; CONVERT DIGITS TO...
FE8D 18 CLC ; ...BINARY BY DEC TABLE
FE8E A9 00 LDA #$00
FE90 E8 iFE90 INX
FE91 E0 03 CPX #$03
FE93 B0 0F BCS iFEA4
FE95 B4 2A LDY TEMP,X
FE97 88 iFE97 DEY
FE98 30 F6 BMI iFE90
FE9A 7D AF FE ADC DECTAB,X
FE9D 90 F8 BCC iFE97
FE9F 18 CLC
FEA0 E6 2D INC TEMP+3
FEA2 D0 F3 BNE iFE97
FEA4 48 iFEA4 PHA
FEA5 A6 99 LDX F1CNT
FEA7 A5 2D LDA TEMP+3
FEA9 95 AC STA FILTRK,X ; STORE RESULT IN TABLE
FEAB 68 PLA
FEAC 95 B1 STA FILSEC,X
FEAE 60 RTS
; DECIMAL TABLE
FEAF DECTAB .byte $01, $0A, $64 ;ajD
; BLOCK-FREE
FEB2 20 B9 FF BLKFRE JSR BLKTST
FEB5 20 DD EE JSR FRETS
FEB8 4C 75 F0 JMP ENDCMD
; BLOCK-ALLOCATE
FEBB 20 B9 FF BLKALC JSR BLKTST
FEBE A6 80 LDX DRVNUM
FEC0 BD 40 E5 LDA IPBM,X
FEC3 85 29 STA BMPNT+1
FEC5 20 6B E5 iFEC5 JSR AVAIL
FEC8 20 87 E5 iFEC8 JSR AV2
FECB B0 25 BCS iFEF2
FECD A6 82 LDX SECTOR
FECF E8 INX
FED0 86 82 STX SECTOR
FED2 8E E9 10 STX ERWORD ; SET NOT AVAIL FLAG
FED5 E4 9A CPX R0
FED7 90 EF BCC iFEC8
FED9 A9 00 LDA #$00
FEDB 85 82 STA SECTOR
FEDD A6 81 LDX TRACK
FEDF E8 INX
FEE0 86 81 STX TRACK
FEE2 E0 24 CPX #$24
FEE4 B0 05 BCS iFEEB
FEE6 20 C9 FF JSR iFFC9 ; similar to TSCHK in 4040
FEE9 90 DA BCC iFEC5
FEEB 85 81 iFEEB STA TRACK
FEED A9 65 iFEED LDA #$65 ; NOBLK
FEEF 4C D4 E6 JMP CMDER2
FEF2 AE E9 10 iFEF2 LDX ERWORD ; FINISHED SEARCH
FEF5 D0 F6 BNE iFEED ; BLOCK WASN'T AVAILABLE
FEF7 20 A0 E7 JSR USEDTS ; BLOCK AVAIL, SET AS USED
FEFA 4C 75 F0 JMP ENDCMD
FEFD 20 E4 FF BLKRD2 JSR BKOTST ; TEST PARAMS
FF00 4C 1D EE JMP DRTRD ; GET BYTE W/O INC
FF03 20 CC E9 GETSIM JSR GETPRE
FF06 A1 3D LDA (BUFTAB,X)
FF08 60 RTS
; BLOCK READ
FF09 20 FD FE BLKRD JSR BLKRD2
FF0C A9 00 LDA #$00
FF0E 20 89 EE JSR SETPNT
FF11 20 03 FF JSR GETSIM ; Y=LINDX
FF14 20 1D FF JSR iFF1D
FF17 20 2C ED JSR RNGET1
FF1A 4C 75 F0 JMP ENDCMD
FF1D 99 C6 00 iFF1D STA LSTCHR,Y
FF20 A9 89 LDA #$89 ; RNDRDY
FF22 99 D9 10 STA CHNDAT,Y
FF25 60 RTS
; USER DIRECT READ, LSTCHR=$FF
FF26 20 34 FE UBLKRD JSR BLKPAR
FF29 20 FD FE JSR BLKRD2
FF2C A4 83 LDY LINDX
FF2E B9 C6 00 LDA LSTCHR,Y
FF31 99 D9 10 STA CHNDAT,Y
FF34 A9 FF LDA #$FF
FF36 20 1D FF JSR iFF1D
FF39 A9 00 LDA #$00
FF3B 20 89 EE JSR SETPNT
FF3E 4C 75 F0 JMP ENDCMD ; (RTS)
; BLOCK WRITE
FF41 20 E4 FF BLKWT JSR BKOTST
FF44 20 B0 EE JSR GETPNT
FF47 A8 TAY
FF48 88 DEY
FF49 C9 02 CMP #$02
FF4B B0 02 BCS iFF4F
FF4D A0 01 LDY #$01
FF4F A9 00 iFF4F LDA #$00 ; SET RECORD SIZE
FF51 20 89 EE JSR SETPNT
FF54 98 TYA
FF55 20 89 E8 JSR PUTBYT
FF58 8A TXA
FF59 48 PHA
FF5A 20 21 EE JSR DRTWRT ; WRITE BLOCK
FF5D 68 PLA
FF5E AA TAX
FF5F 20 2E ED JSR RNGET2
FF62 4C 75 F0 JMP ENDCMD
; USER DIRECT WRITE, NO LSTCHR
FF65 20 34 FE UBLKWT JSR BLKPAR
FF68 20 E4 FF JSR BKOTST
FF6B 20 21 EE JSR DRTWRT
FF6E 4C 75 F0 JMP ENDCMD
; BLOCK-EXECUTE
FF71 20 FD FE BLKEXC JSR BLKRD2 ; READ BLOCK & EXECUTE
FF74 A9 00 LDA #$00
FF76 85 2A STA TEMP
FF78 A6 8D LDX JOBNUM
FF7A BD CE EE LDA BUFIND,X
FF7D 85 2B STA TEMP+1
FF7F 20 85 FF JSR iFF85 ; INDIRECT JSR
FF82 4C 75 F0 JMP ENDCMD
FF85 6C 2A 00 iFF85 JMP (TEMP)
; BUFFER-POINTER, SET BUFFER POINTER
FF88 20 9A FF BLKPTR JSR BUFTST
FF8B A5 8D LDA JOBNUM
FF8D 0A ASL
FF8E AA TAX
FF8F A4 B2 LDY FILSEC+1
FF91 88 DEY
FF92 94 3D STY BUFTAB,X
FF94 20 1A ED JSR iED1A ; in 4040 JSR GETPRE, JSR RNDGET2; SET UP GET
FF97 4C 75 F0 JMP ENDCMD
; TEST FOR ALLOCATED BUFFER..
; ..RELATED TO SA
FF9A A6 9B BUFTST LDX F1PTR
FF9C E6 9B INC F1PTR
FF9E B5 B1 LDA FILSEC,X
FFA0 A8 TAY
FFA1 88 DEY
FFA2 88 DEY
FFA3 C0 0D CPY #$0D ; BAMJOB
FFA5 90 05 BCC iFFAC
FFA7 A9 70 iFFA7 LDA #$70 ; NOCHNL
FFA9 4C 90 F0 JMP CMDERR
FFAC 85 84 iFFAC STA SA
FFAE 20 B0 E9 JSR FNDRCH
FFB1 B0 F4 BCS iFFA7
FFB3 20 9D E8 JSR GETACT
FFB6 85 8D STA JOBNUM
FFB8 60 RTS
; TEST FOR LEGAL BLOCK &..
; ..SET UP DRV, TRK, SEC
FFB9 A6 9B BLKTST LDX F1PTR
FFBB B5 B1 LDA FILSEC,X
FFBD 29 01 AND #$01
FFBF 85 80 STA DRVNUM
FFC1 B5 B3 LDA FILSEC+2,X
FFC3 85 82 STA SECTOR
FFC5 B5 B2 LDA FILSEC+1,X
FFC7 85 81 STA TRACK
FFC9 A5 81 iFFC9 LDA TRACK ; in 4040 separated out into TSCHK
FFCB AA TAX
FFCC CA DEX
FFCD E0 23 CPX #$23
FFCF B0 0E BCS iFFDF
FFD1 20 B1 E5 JSR MAXSEC
FFD4 85 9A STA R0
FFD6 A5 82 LDA SECTOR
FFD8 C5 9A CMP R0
FFDA B0 03 BCS iFFDF
FFDC 4C 0A EF JMP SETLDS
FFDF A9 22 iFFDF LDA #$22
FFE1 4C D4 E6 JMP CMDER2
FFE4 20 9A FF BKOTST JSR BUFTST ; TEST BLOCK OPERATION PARAMS
FFE7 4C B9 FF JMP BLKTST
FFEA xFFEA .word UBLKRD , UBLKWT , BUFS+512 , BUFS+515
FFF2 .word BUFS+518 , DIAGROM+8 , DIAGROM+11 , DIAGROM+14
FFFA .word DIAGROM+213 , DSKINT , ATNIRQ
; Misassembly source 4.08 15 May 2005 Generated Sun May 15 20:12:16 CEST 2005
Formatted to HTML by recomment 4.08 15 May 2005 reassembler.
Misassembled from dos1 by fachat@newton using header file dos1.hdr in a 2-pass run at Sun May 15 20:12:16 CEST 2005 .