Automatic Generated Disassembly of `dos1'
; *** 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