; *** 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 .