AppleII_DOS/appdos31.lst

5947 lines
244 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

0001 0000 ;
0002 0000 ; Apple DOS 3.1 Disassembly - (Patched Release - RAWDOS)
0003 0000 ;
0004 0000 ; This disassembly is based on the original pre-release Apple DOS source
0005 0000 ; code written in 1978 by Paul Laughton, then an employee of Shepardson
0006 0000 ; Microsystems. The source document is identified on the title page with
0007 0000 ; the following text:
0008 0000 ;
0009 0000 ; .TITLE SHEP,'APPLE DOS'
0010 0000 ; 6.3 10-6-78
0011 0000 ; 8 BIT ASSEMBLER
0012 0000 ; .M6502
0013 0000 ;
0014 0000 ; The binary produced by assembling this source has been compared to
0015 0000 ; the RAWDOS binary included on the Apple DOS 3.1 Master Disk and was
0016 0000 ; was found to be identical with one exception:
0017 0000 ;
0018 0000 ; Assembling this source code into a binary will generally initialize
0019 0000 ; reserved memory byte (RMB) address spaces as well as any unused address
0020 0000 ; space (addresses located between the end of a given section of code and
0021 0000 ; a new ORG directive) to 0x00 or 0xff, depending on the assembler used.
0022 0000 ;
0023 0000 ; Accordingly, all comparisons to the original DOS 3.1 binary insured
0024 0000 ; that the only differences were with byte values that were located in
0025 0000 ; unused address locations or in RMB address locations.
0026 0000 ;
0027 0000 ;
0028 0000 ; Scott LaBombard
0029 0000 ; labomb@rochester.rr.com
0030 0000 ; 12/04/2013
0031 0000 ;
0032 0000
0033 0000 #INCLUDE "MOTO.H"
0040+ 0000 .LIST
0034 0000
0035 0000 .TITLE "APPLE DOS 3.1"
0036 0000 *
0037 0000 **************************************************************************************
0038 0000 * (C) COPYRIGHT 1978 APPLE COMPUTER, INC
0039 0000 **************************************************************************************
0040 0000 ORG1 EQU $1B00
0041 0000 ORG2 EQU $3600
0042 0000 DISKIO EQU $3D00
0043 0000 ASC1 EQU $3800
0044 0000 AEC1 EQU $3A8F
0045 0000 ASC2 EQU $3D00
0046 0000 AEC2 EQU $3FFF
0047 0000 EDOS EQU $4000
Page 1 APPLE DOS 3.1
0048 0000 PAGE
0049 1B00 ORG ORG1
0050 1B00 4C 7E 1D BEGIN JMP DBINIT
0051 1B03 ;
0052 1B03 DOSREL
0053 1B03 ;
0054 1B03 ; GET RELOCATION PARMS
0055 1B03 ;
0056 1B03 DR0
0057 1B03 LOC1 EQU $26
0058 1B03 A9 BF LDA #$BF ; START AT BF00
0059 1B05 8D 41 00 STA !ZPGWRK+1 ; TO LOOK FOR
0060 1B08 A2 00 LDX #0 ; HIGH RAM
0061 1B0A 8E 40 00 STX !ZPGWRK
0062 1B0D DR1B
0063 1B0D A0 00 LDY #0 ;APPLE TEST
0064 1B0F A1 40 LDA (ZPGWRK,X)
0065 1B11 85 26 STA LOC1
0066 1B13 98 DR1 TYA
0067 1B14 45 26 EOR LOC1
0068 1B16 85 26 STA LOC1
0069 1B18 98 TYA
0070 1B19 41 40 EOR (ZPGWRK,X)
0071 1B1B 81 40 STA (ZPGWRK,X)
0072 1B1D C5 26 CMP LOC1
0073 1B1F D0 05 BNE DR1A
0074 1B21 C8 INY
0075 1B22 D0 EF BNE DR1
0076 1B24 F0 05 BEQ DR2 ; BR IF TOOK
0077 1B26 DR1A
0078 1B26 CE 41 00 DEC !ZPGWRK+1 ; NOT RAM
0079 1B29 D0 E2 BNE DR1B ; TRY NEXT PAGE
0080 1B2B ;
0081 1B2B DR2
0082 1B2B ;
0083 1B2B 20 40 35 JSR DR2PAT ; *** PATCH ***
0084 1B2E C8 INY ; NEW END OF DOS
0085 1B2F 8C 6A 1C STY NEPAGE
0086 1B32 38 SEC
0087 1B33 98 TYA
0088 1B34 ED 6B 1C SBC DOSLNG ; MINUS DOS LENGTH
0089 1B37 8D 69 1C STA NSPAGE ; IS NEW START OF DOS
0090 1B3A 38 SEC
0091 1B3B ED 67 1C SBC RSPAGE ; MINUS OLD DOS START
0092 1B3E F0 C0 BEQ BEGIN ; (BREIF NO DELTA)
0093 1B40 8D 6C 1C STA DELTA ; IS DELTA
Page 2 APPLE DOS 3.1
0094 1B43 PAGE
0095 1B43 AD 67 1C LDA RSPAGE ; RESET START PAGE TO NORMAL
0096 1B46 8D 0D 1D STA ASTART+1
0097 1B49 ;
0098 1B49 A9 1D LDA #DBINIT/256 ;RESET PI RTN TO NORMAL
0099 1B4B 8D 49 37 STA DI3+2
0100 1B4E A9 7E LDA #DBINIT&255
0101 1B50 8D 48 37 STA DI3+1
0102 1B53 ;
0103 1B53 ;
Page 3 APPLE DOS 3.1
0104 1B53 PAGE
0105 1B53 ;
0106 1B53 ;
0107 1B53 ; RELOCATE ADR TABLES
0108 1B53 ;
0109 1B53 A2 00 LDX #0
0110 1B55 8E 40 00 STX !ZPGWRK
0111 1B58 DR3
0112 1B58 BD 1A 1C LDA ADRTAB+1,X
0113 1B5B A8 TAY
0114 1B5C BD 1B 1C LDA ADRTAB+2,X
0115 1B5F 8D 41 00 STA !ZPGWRK+1
0116 1B62 4C 73 1B JMP DR5
0117 1B65 ;
0118 1B65 DR4
0119 1B65 18 CLC
0120 1B66 B1 40 LDA (ZPGWRK),Y
0121 1B68 6D 6C 1C ADC DELTA
0122 1B6B 91 40 STA (ZPGWRK),Y
0123 1B6D C8 INY
0124 1B6E D0 03 BNE DR5
0125 1B70 EE 41 00 INC !ZPGWRK+1
0126 1B73 C8 DR5 INY
0127 1B74 D0 03 BNE DR6
0128 1B76 EE 41 00 INC !ZPGWRK+1
0129 1B79 ;
0130 1B79 DR6
0131 1B79 AD 41 00 LDA !ZPGWRK+1
0132 1B7C DD 1D 1C CMP ADRTAB+4,X
0133 1B7F 90 E4 BCC DR4
0134 1B81 98 TYA
0135 1B82 DD 1C 1C CMP ADRTAB+3,X
0136 1B85 90 DE BCC DR4
0137 1B87 ;
0138 1B87 8A TXA
0139 1B88 18 CLC
0140 1B89 69 04 ADC #4
0141 1B8B AA TAX
0142 1B8C EC 19 1C CPX ADRTAB
0143 1B8F 90 C7 BCC DR3
Page 4 APPLE DOS 3.1
0144 1B91 PAGE
0145 1B91 ;
0146 1B91 ; RELOCATE CODE
0147 1B91 ;
0148 1B91 A2 00 LDX #0
0149 1B93 8E D4 32 DR7 STX TEMP1
0150 1B96 ;
0151 1B96 BD 4B 1C LDA CDETAB+1,X ; GET A START OF CODE ADR
0152 1B99 8D 40 00 STA !ZPGWRK ; PUT IN ZPG
0153 1B9C BD 4C 1C LDA CDETAB+2,X
0154 1B9F 8D 41 00 STA !ZPGWRK+1
0155 1BA2 ;
0156 1BA2 A2 00 DR8 LDX #0
0157 1BA4 A1 40 LDA (ZPGWRK,X) ; GET OP CODE
0158 1BA6 20 8E F8 JSR INSDS2 ; GO FIND OUT HOW LONG
0159 1BA9 ;
0160 1BA9 AC 2F 00 LDY !LENGTH ; GET HOW LONG
0161 1BAC C0 02 CPY #2 ; IF IT AIN<49>T
0162 1BAE D0 11 BNE DR9 ; 3 THEN DON<4F>T RELOC
0163 1BB0 B1 40 LDA (ZPGWRK),Y ; GET PAGE FROM INST
0164 1BB2 CD 67 1C CMP RSPAGE ; IF PAGE < REL START
0165 1BB5 90 0A BCC DR9 ; THEN IGNORE
0166 1BB7 CD 68 1C CMP REPAGE ; IF PAGE >= REL END
0167 1BBA B0 05 BCS DR9 ; THEN IGNORE
0168 1BBC 6D 6C 1C ADC DELTA ; ELSE ADD DELTA
0169 1BBF 91 40 STA (ZPGWRK),Y ; TO RELOCATE
0170 1BC1 ;
0171 1BC1 38 DR9 SEC
0172 1BC2 AD 2F 00 LDA !LENGTH ; ADD LENGTH
0173 1BC5 6D 40 00 ADC !ZPGWRK ; TO PC
0174 1BC8 8D 40 00 STA !ZPGWRK
0175 1BCB A9 00 LDA #0
0176 1BCD 6D 41 00 ADC !ZPGWRK+1
0177 1BD0 8D 41 00 STA !ZPGWRK+1
0178 1BD3 ;
0179 1BD3 AE D4 32 LDX TEMP1 ; CHECK FOR END
0180 1BD6 DD 4E 1C CMP CDETAB+4,X ; OF CODE SEGMENT
0181 1BD9 90 C7 BCC DR8 ; BR NOT END
0182 1BDB AD 40 00 LDA !ZPGWRK
0183 1BDE DD 4D 1C CMP CDETAB+3,X
0184 1BE1 90 BF BCC DR8 ; BR NOT END
0185 1BE3 ;
0186 1BE3 8A TXA
0187 1BE4 18 CLC
0188 1BE5 69 04 ADC #4 ; INCREMENT TABLE INDEX
0189 1BE7 AA TAX
0190 1BE8 EC 4A 1C CPX CDETAB ; DONE
0191 1BEB 90 A6 BCC DR7 ; BR IF NOT
0192 1BED ;
Page 5 APPLE DOS 3.1
0193 1BED PAGE
0194 1BED ;
0195 1BED ; MOVE TO RELOCATED CODE
0196 1BED ;
0197 1BED A9 3F LDA #DEPAGE-1
0198 1BEF 8D 41 00 STA !ZPGWRK+1 ; ZPGWRK=FROM
0199 1BF2 AC 6A 1C LDY NEPAGE
0200 1BF5 88 DEY
0201 1BF6 8C 43 00 STY !ZPGFCB+1 ; ZPGFCB = TOO
0202 1BF9 A9 00 LDA #0
0203 1BFB 8D 40 00 STA !ZPGWRK
0204 1BFE 8D 42 00 STA !ZPGFCB
0205 1C01 A8 TAY
0206 1C02 ;
0207 1C02 B1 40 DR10 LDA (ZPGWRK),Y ; BYTE FROM
0208 1C04 91 42 STA (ZPGFCB),Y ; BYTE TO
0209 1C06 C8 INY ; INCREMENT
0210 1C07 D0 F9 BNE DR10 ; BR NOT FULL PAGE
0211 1C09 CE 6D 1C DEC DPGCNT ; DECREMENT PAGE CNT
0212 1C0C F0 08 BEQ DR11 ; BR IF DONE
0213 1C0E CE 41 00 DEC !ZPGWRK+1 ; INC FROM PAGE
0214 1C11 CE 43 00 DEC !ZPGFCB+1 ; INC TOO PAGE
0215 1C14 D0 EC BNE DR10 ; MOVE PAGE
0216 1C16 ;
0217 1C16 4C 36 1E DR11 JMP DBVECT+3 ; DONE
Page 6 APPLE DOS 3.1
0218 1C19 PAGE
0219 1C19 DEPAGE EQU EDOS/256
0220 1C19 DSPAGE EQU STARTT/256
0221 1C19 INSDS2 EQU $F88E
0222 1C19 LENGTH EQU $2F
0223 1C19 24 ADRTAB DB 9*4
0224 1C1A 00 1D 56 1D DW @@SAT1,@@EAT1
0225 1C1E 58 1D 5A 1D DW @@RUN,@@RUN+2
0226 1C22 62 1D 64 1D DW @@IBVT+2,@@IBVT+4
0227 1C26 6A 1D 6E 1D DW @@AS1VT,@@AS1VT+4
0228 1C2A 74 1D 78 1D DW @@AS2VT,@@AS2VT+4
0229 1C2E 7A 1D 7C 1D DW @@AS2VT+6,@@AS2VT+8
0230 1C32 03 2A 3F 2A DW @@SAT2,@@EAT2
0231 1C36 E4 37 E8 37 DW @@BAIOB,@@ADOSLD+2
0232 1C3A EE 37 F0 37 DW @@IBDCTP,@@IBDCTP+2
0233 1C3E 00 00 00 00 DW @0,@0
0234 1C42 00 00 00 00 DW @0,@0
0235 1C46 00 00 00 00 DW @0,@0
0236 1C4A CDETAB
0237 1C4A 18 DB 6*4
0238 1C4B 7E 1D E0 27 DW @@SC1,@@EC1
0239 1C4F 3F 2A CF 32 DW @@SC2,@@EC2
0240 1C53 00 37 E0 37 DW @@SC3,@@EC3
0241 1C57 32 35 FE 35 DW @@SDP1,@@EDP1
0242 1C5B 00 38 8F 3A DW @@ASC1,@@AEC1
0243 1C5F 00 3D FF 3F DW @@ASC2,@@AEC2
0244 1C63 00 00 00 00 DW @0,@0
0245 1C67 ;
0246 1C67 1D RSPAGE DB DSPAGE
0247 1C68 40 REPAGE DB DEPAGE
0248 1C69 ;
0249 1C69 00 NSPAGE DB 0
0250 1C6A 00 NEPAGE DB 0
0251 1C6B ;
0252 1C6B 23 DOSLNG DB DEPAGE-DSPAGE
0253 1C6C ;
0254 1C6C 00 DELTA DB 0
0255 1C6D 23 DPGCNT DB DEPAGE-DSPAGE
Page 7 APPLE DOS 3.1
0256 1C6E PAGE
0257 1D00 BOUND 256
0258 1D00 ;
0259 1D00 ; RELOCATION TABLES
0260 1D00 ;
0261 1D00 START
0262 1D00 SAT1
0263 1D00 D3 1C FTAB DW @@*-45 ;START OF FTABS
0264 1D02 4D 1E CINA DW @@CHRIN ;CHAR IN ADR
0265 1D04 7E 1E COUTA DW @@CHROUT ;CHAR OUT ADR
0266 1D06 B8 29 FN1ADR DW @@FNAME1
0267 1D08 D6 29 FN2ADR DW @@FNAME2
0268 1D0A A3 29 SVBLA DW @@SVBL
0269 1D0C 00 1B ASTART DW @@BEGIN ; CHANGED TO START BY RELOCATE
0270 1D0E EF 34 CCBADR DW @@CCB
0271 1D10 ;
0272 1D10 OUTSVT ;CHAR OUTPUT STATE VECTOR TABLE
0273 1D10 AB 1E DW @@COS0-1
0274 1D12 CA 1E DW @@COS1-1
0275 1D14 DB 1E DW @@COS2-1
0276 1D16 E7 1E DW @@COS3-1
0277 1D18 FD 1E DW @@COS4-1
0278 1D1A 0C 1F DW @@COS5-1
0279 1D1C 1C 1F DW @@COS6-1
0280 1D1E ; COMMAND EXECUTION TABLE
0281 1D1E CMDETB
0282 1D1E E3 24 DW @@EINIT-1
0283 1D20 A4 23 DW @@ELOAD-1
0284 1D22 2F 23 DW @@ESAVE-1
0285 1D24 75 24 DW @@ERUN-1
0286 1D26 8C 24 DW @@ECHAIN-1
0287 1D28 ED 21 DW @@EDEL-1
0288 1D2A FB 21 DW @@ELOCK-1
0289 1D2C FF 21 DW @@EUNLK-1
0290 1D2E 77 22 DW @@ECLOSE-1
0291 1D30 AF 24 DW @@EREAD-1
0292 1D32 4E 25 DW @@EEXEC-1
0293 1D34 A4 24 DW @@EWRITE-1
0294 1D36 65 25 DW @@EPOS-1
0295 1D38 35 22 DW @@EOPEN-1
0296 1D3A 22 22 DW @@EAPND-1
0297 1D3C 0B 22 DW @@EREN-1
0298 1D3E 00 25 DW @@ECAT-1
0299 1D40 BD 21 DW @@EMON-1
0300 1D42 C7 21 DW @@ENOMON-1
0301 1D44 B3 21 DW @@EPR-1
0302 1D46 B8 21 DW @@EIN-1
0303 1D48 DB 21 DW @@EMAXF-1
0304 1D4A 0C 25 DW @@EAS-1
0305 1D4C 30 25 DW @@EINT-1
0306 1D4E BF 22 DW @@EBSV-1
0307 1D50 EB 22 DW @@EBLD-1
0308 1D52 26 23 DW @@EBRUN-1
0309 1D54 07 22 DW @@EVAR-1
0310 1D56 EAT1
Page 8 APPLE DOS 3.1
0311 1D56 PAGE
0312 1D56 ;
0313 1D56 ; NON-RELOCATING ADRS
0314 1D56 ;
0315 1D56 IBASVT
0316 1D56 36 E8 CHAIN DW @@IBCHN
0317 1D58 82 24 RUN DW @@IBRUN
0318 1D5A E3 E3 BREAK DW @@IBBRK
0319 1D5C 00 E0 GO DW @@IBGO
0320 1D5E 03 E0 CONT DW @@IBCONT ;BASIC CONT ENTRY POINT
0321 1D60 36 E8 82 24 IBVT DW @@IBCHN,@@IBRUN,@@IBBRK
0321 1D64 E3 E3
0322 1D66 00 E0 03 E0 DW @@IBGO,@@IBCONT
0323 1D6A IBVTL EQU *-IBVT
0324 1D6A ;
0325 1D6A 99 24 99 24 AS1VT DW @@ASRUN1,@@ASRUN1,@@ASBRK1
0325 1D6E 65 D8
0326 1D70 00 E0 00 00 DW @@IBGO,@@0
0327 1D74 AS1VTL EQU *-AS1VT
0328 1D74 ;
0329 1D74 9F 24 9F 24 AS2VT DW @@ASRUN2,@@ASRUN2,@@ASBRK2
0329 1D78 67 10
0330 1D7A 7E 1D 00 00 DW @@DBINIT,@@0
0331 1D7E AS2VTL EQU *-AS2VT
Page 9 APPLE DOS 3.1
0332 1D7E PAGE
0333 1D7E ;
0334 1D7E ; EQUATES REQD TO FIND THINGS IN APPLE II
0335 1D7E ;
0336 1D7E SETVID EQU $FE93
0337 1D7E SETKBD EQU $FE89
0338 1D7E PROMPT EQU $33 ; PROMPT CHAR
0339 1D7E OUTSW EQU $36 ;OUTPUT VECTOR SWITCH
0340 1D7E INSW EQU $38 ;INPUT VECTOR SWITCH
0341 1D7E ZPGWRK EQU $40 ;ZERO PAGE WORK CELL
0342 1D7E CNUM EQU $44 ;CONVERTED NUMERIC
0343 1D7E LBUFF EQU $200 ;LINE BUFFER
0344 1D7E MULT EQU $FB63 ;MULT ROUTINE
0345 1D7E INPRT EQU $FE8B ;SET IN PORT
0346 1D7E OUTPRT EQU $FE95 ; SET OUT PORT
0347 1D7E IBCHN EQU $E836 ;BASIC RUN
0348 1D7E IBLMEM EQU $4A ;BASIC LOW MEMORY
0349 1D7E IBHMEM EQU $4C ;INTEGER BASIC HIMEM
0350 1D7E IBSOP EQU $CA ;INTEGER BASIC START OF CGM
0351 1D7E IBBRK EQU $E3E3 ; BASIC BREAK
0352 1D7E IBGO EQU $E000 ; BASIC ENTRY POINT
0353 1D7E IBCONT EQU $E003 ; BASIC CONTINUE ENTRY POINT
0354 1D7E IBSOV EQU $CC ; BASIC START OF VARIABLES
0355 1D7E ASSOP EQU $67 ; AS START OF PROGRAM
0356 1D7E ASEOP EQU $AF ; AS END OF PROGRAM
0357 1D7E ASEOP2 EQU $69 ;AS END-OF PGM 2
0358 1D7E ASHM1 EQU $73 ; AS HIGH MEM 1
0359 1D7E ASHM2 EQU $6F ; AS HIGH MEM 2
0360 1D7E ASLMEM EQU ASSOP ; AS LOW MEM
0361 1D7E ASBRK1 EQU $D865 ; AS ROM BREAK
0362 1D7E ASBRK2 EQU $1067 ; AS RAM BREAK
0363 1D7E AITSTL EQU $E000 ; AS 1 IB TEST LOC
0364 1D7E ATSTV EQU $4C ; AS TEST VALUE
0365 1D7E ITSTV EQU $20 ; IB TEST VALUE
0366 1D7E BOOTSL EQU $2E ;BOOT FROM SLOT
0367 1D7E ZPGFCB EQU $42 ;ZERO PAGE WORK CELL
0368 1D7E HOME EQU $FC58
0369 1D7E PRINT EQU $FDED
0370 1D7E GETKEY EQU $FD0C
Page 10 APPLE DOS 3.1
0371 1D7E PAGE
0372 1D7E ;
0373 1D7E ; DOS BASIC INTERPRETER <20> INITIAL ENTRY
0374 1D7E ;
0375 1D7E SC1
0376 1D7E DBINIT
0377 1D7E AD E9 37 LDA IBSLOT ;GET BOOT SLOT
0378 1D81 4A LSRA
0379 1D82 4A LSRA
0380 1D83 4A LSRA
0381 1D84 4A LSRA
0382 1D85 8D AD 29 STA CS ;SET AS CURRENT SLOT
0383 1D88 AD EA 37 LDA IBDRVN ;GET BOOT DRIVE NUMBER
0384 1D8B 8D AB 29 STA CD ;SET AS CURRENT DRIVE
0385 1D8E AD 00 E0 LDA AITSTL ; GET APPLESOFT/IB TEST
0386 1D91 49 20 EOR #ITSTV ; IF AS THEN
0387 1D93 D0 11 BNE IAS1 ; GO TO AS INIT
0388 1D95 ; ; ELSE INIT FOR IB
0389 1D95 8D F9 29 STA ASIBSW ; SET SW FOR IB
0390 1D98 A2 0A LDX #IBVTL ; GET IB VT LENGTH
0391 1D9A BD 5F 1D IIB1 LDA IBVT-1,X ; MOVE IB ADDR
0392 1D9D 9D 55 1D STA IBASVT-1,X
0393 1DA0 CA DEX
0394 1DA1 D0 F7 BNE IIB1
0395 1DA3 4C B6 1D JMP INITAA
0396 1DA6 ;
0397 1DA6 IAS1
0398 1DA6 A9 40 LDA #$40 ; INDICATE ROM APPLESOFT
0399 1DA8 8D F9 29 STA ASIBSW
0400 1DAB A2 0A LDX #AS1VTL
0401 1DAD BD 69 1D IAS1A LDA AS1VT-1,X ; MOVE ROM AS ADRS
0402 1DB0 9D 55 1D STA IBASVT-1,X
0403 1DB3 CA DEX
0404 1DB4 D0 F7 BNE IAS1A
0405 1DB6 ;
0406 1DB6 INITAA
0407 1DB6 38 SEC ; INDICATE INIT
0408 1DB7 B0 01 BCS INITA
0409 1DB9 DBRST
0410 1DB9 18 CLC ; INDICATE RESET
0411 1DBA ;
0412 1DBA INITA
0413 1DBA 08 PHP ; SAVE INIT/RESET
0414 1DBB 20 AD 27 JSR MVCSW ; GO MOVE CHAR SWITCH
0415 1DBE A9 70 LDA #MC+MI+MO ; SET MONITOR MODES
0416 1DC0 8D A1 29 STA MONMOD
0417 1DC3 A9 00 LDA #0
0418 1DC5 8D 95 29 STA OSTATE ; CLEAR OUTSTATE AND EXECUTE STATE
0419 1DC8 28 PLP ; GET INIT/RESET
0420 1DC9 6A RORA ;SHIFT CARRY TO MSB
0421 1DCA 8D 94 29 STA ISTATE ; SAVE INSTATE
0422 1DCD 30 03 BMI INITB ; BR IF INIT
0423 1DCF 6C 5E 1D JMP (CONT) ;GO TO CONTINUE ENTRY
0424 1DD2 6C 5C 1D INITB JMP (GO) ; GO TO ENTRY
Page 11 APPLE DOS 3.1
0425 1DD5 PAGE
0426 1DD5 INITC
0427 1DD5 0A ASLA ; OF ISTATE NOT ON
0428 1DD6 10 19 BPL INITD ; THEN NOT RAM AS
0429 1DD8 8D F9 29 STA ASIBSW ; SET RAM AS
0430 1DDB A2 0A LDX #AS2VTL
0431 1DDD BD 73 1D IAS2A LDA AS2VT-1,X ; MOVE RAM AS ADRS
0432 1DE0 9D 55 1D STA IBASVT-1,X
0433 1DE3 CA DEX
0434 1DE4 D0 F7 BNE IAS2A
0435 1DE6 A2 1D LDX #29
0436 1DE8 BD D6 29 IAS2B LDA FNAME2,X
0437 1DEB 9D B8 29 STA FNAME1,X
0438 1DEE CA DEX
0439 1DEF 10 F7 BPL IAS2B
0440 1DF1 ;
0441 1DF1 INITD
0442 1DF1 AD F4 29 LDA DFNFTS ; GO BUILD FILE TABS
0443 1DF4 8D 9A 29 STA CNFTBS ; AND SET MEM BOUNDS
0444 1DF7 20 30 27 JSR BLDFTB
0445 1DFA AD F6 29 LDA ESTATE ;GET EXEC STATE
0446 1DFD F0 09 BEQ INITZ ; BR IF NOT EXECTUTE
0447 1DFF 48 PHA ;SVE CHAR
0448 1E00 20 01 26 JSR MVEFTA ;GO MOVE EX FILE TAB ADR TO ZP
0449 1E03 68 PLA ;GET SAVED CHAR
0450 1E04 A0 00 LDY #0
0451 1E06 91 40 STA (ZPGWRK),Y ;
0452 1E08 INITZ
0453 1E08 20 B7 26 JSR CLRSTS ; SET IN AND OUT STATES TO ZERO
0454 1E0B A2 27 LDX #IFBL
0455 1E0D BD 33 1E INITE LDA DBVECT,X ;MOVE RESTART VECTORS
0456 1E10 9D D0 03 STA $3D0,X
0457 1E13 CA DEX
0458 1E14 10 F7 BPL INITE
0459 1E16 AD A2 29 LDA CMDNO ; IF NOT BOOT
0460 1E19 D0 0A BNE INITF ; THEN DONE
0461 1E1B AD B8 29 LDA FNAME1 ; IF FN1
0462 1E1E 49 A0 EOR #$A0 ; NOT DONE
0463 1E20 F0 03 BEQ INITF ; THEN DONE
0464 1E22 4C 76 24 JMP ERUN ; ELSE
0465 1E25 ;
0466 1E25 IFB
0467 1E25 INITF
0468 1E25 AD A5 29 LDA SVCMD
0469 1E28 F0 06 BEQ INITG
0470 1E2A 8D A2 29 STA CMDNO
0471 1E2D 4C FF 20 JMP CMDGO
0472 1E30 INITG
0473 1E30 4C 50 1F JMP ORTN
0474 1E33 ;
0475 1E33 4C B9 1D DBVECT JMP DBRST
0476 1E36 4C 7E 1D JMP DBINIT
0477 1E39 4C 3F 2A JMP DOSENT
0478 1E3C 4C 00 3D JMP DISKIO
0479 1E3F CCBLDR
0480 1E3F AD 0F 1D LDA CCBADR+1
0481 1E42 AC 0E 1D LDY CCBADR
0482 1E45 60 RTS
0483 1E46 IOBLDR
0484 1E46 AD 04 2A LDA AIOB+1
0485 1E49 AC 03 2A LDY AIOB
0486 1E4C 60 RTS
0487 1E4D IFBL EQU *-IFB-1
Page 12 APPLE DOS 3.1
0488 1E4D PAGE
0489 1E4D ;
0490 1E4D ; CHRIN <20> CHAR RCVD VIA IN SWITCH
0491 1E4D ;
0492 1E4D CHRIN
0493 1E4D 20 92 1E JSR SVREGS
0494 1E50 AD 94 29 LDA ISTATE ;IF NOT DISKIN
0495 1E53 F0 0D BEQ CHIN1 ;THEN BRANCH, ELSE
0496 1E55 10 03 BPL CHIN0
0497 1E57 4C D5 1D JMP INITC
0498 1E5A CHIN0
0499 1E5A AD 9F 29 LDA SVA
0500 1E5D 91 28 STA ($28),Y
0501 1E5F 4C AD 25 JMP INCFD ;AND GET CHAR FROM DISK
0502 1E62 CHIN1
0503 1E62 AD F6 29 LDA ESTATE
0504 1E65 F0 03 BEQ CHIN2
0505 1E67 4C E6 25 JMP NXTEXC
0506 1E6A CHIN2
0507 1E6A A9 03 LDA #3 ;SET OUT CHAR
0508 1E6C 8D 95 29 STA OSTATE ;STATE TO INPUT ECHO
0509 1E6F 20 57 1F JSR LDREGS
0510 1E72 20 7B 1E JSR GETIN
0511 1E75 8D 9F 29 STA SVA
0512 1E78 4C 50 1F JMP ORTN
0513 1E7B ;
0514 1E7B 6C 38 00 GETIN JMP (INSW)
0515 1E7E ;
0516 1E7E ; CHROUT <20> CHAR RCVD VIA OUTPUT SWITCH
0517 1E7E ;
0518 1E7E CHROUT
0519 1E7E 20 92 1E JSR SVREGS ;SAVE REGS
0520 1E81 ;
0521 1E81 AD 95 29 LDA OSTATE ;GET OUT SPARE
0522 1E84 0A ASLA
0523 1E85 AA TAX
0524 1E86 BD 11 1D LDA OUTSVT+1,x ;GET ROUTINE ADR
0525 1E89 48 PHA
0526 1E8A BD 10 1D LDA OUTSVT,x
0527 1E8D 48 PHA
0528 1E8E AD 9F 29 LDA SVA
0529 1E91 60 RTS ;GO TO ROUTINE
0530 1E92 ;
0531 1E92 ; SVREGS <20> SAVE REGS WHILE PROCESSING CHARS
0532 1E92 ;
0533 1E92 SVREGS
0534 1E92 8D 9F 29 STA SVA ;SAVE ACU
0535 1E95 8E 9D 29 STX SVX
0536 1E98 8C 9E 29 STY SVY
0537 1E9B BA TSX
0538 1E9C E8 INX
0539 1E9D E8 INX
0540 1E9E 8E 9C 29 STX SVSTK
0541 1EA1 A2 03 LDX #3 ;SET FOR FOUR BYTE MOVE
0542 1EA3 BD 96 29 SVRB LDA SVOUTS,X ;MOVE SAVED OUT AND IN SW
0543 1EA6 95 36 STA OUTSW,X ;TO APPLE OUT/IN SW
0544 1EA8 CA DEX
0545 1EA9 10 F8 BPL SVRB
0546 1EAB 60 RTS ;DONE
Page 13 APPLE DOS 3.1
0547 1EAC PAGE
0548 1EAC ;
0549 1EAC ; COS0 <20> 1ST CHAR OF PRINTED OUTPUT LINE
0550 1EAC ; CHECK FOR CNTL-D
0551 1EAC ;
0552 1EAC COS0
0553 1EAC AE 94 29 LDX ISTATE ; IS IN STATE NOT ZERO
0554 1EAF F0 08 BEQ COS01
0555 1EB1 C9 BF CMP #'?'+$80 ;THEN IS THIS ?
0556 1EB3 F0 68 BEQ COS6 ;THEN PRINT ONLY IF MONITOR
0557 1EB5 C5 33 CMP PROMPT
0558 1EB7 F0 64 BEQ COS6
0559 1EB9 COS01
0560 1EB9 A2 02 LDX #2
0561 1EBB 8E 95 29 STX OSTATE
0562 1EBE CD F5 29 CMP CCHAR ;IF NOT CNTL-D
0563 1EC1 D0 19 BNE COS2 ; THEN GO TO STATE 2
0564 1EC3 CA DEX
0565 1EC4 8E 95 29 STX OSTATE ;ELSE STATE = 1
0566 1EC7 CA DEX
0567 1EC8 8E A0 29 STX LBUFD ;AND LBUFD=0
0568 1ECB ;
0569 1ECB ; COS1 <20> ACCUMULATE CMD FROM PRINTED OUTPUT
0570 1ECB ;
0571 1ECB COS1
0572 1ECB AE A0 29 LDX LBUFD ;GET LINE BUFF DISPL
0573 1ECE 9D 00 02 COS1A STA LBUFF,X ;PUT CHAR IN BUFF
0574 1ED1 E8 INX ;INCR PTR
0575 1ED2 8E A0 29 STX LBUFD ;SAVE PTR
0576 1ED5 C9 8D CMP #$8D ;WAS THIS A CR
0577 1ED7 D0 62 BNE CMDRTN ;IF NOT THEN PR CHAR
0578 1ED9 ;
0579 1ED9 4C 6F 1F JMP SCNCMD ;GO SCAN COMMAND
0580 1EDC ;
0581 1EDC ; COS2 <20> PRINTED OUTPUT, NOT FIRST CHAR
0582 1EDC ;
0583 1EDC COS2
0584 1EDC C9 8D CMP #$8D ;IS IT A CR
0585 1EDE D0 6A BNE PRRTN ;BR IF NOT
0586 1EE0 A2 00 LDX #0 ;SET FOR POSSIBLE C-D NEXT
0587 1EE2 8E 95 29 STX OSTATE ;NEXT STATE
0588 1EE5 4C 4A 1F JMP PRRTN ;GO PRINT CHAR
Page 14 APPLE DOS 3.1
0589 1EE8 PAGE
0590 1EE8 ;
0591 1EE8 ; COS3 <20> KEY IN ECHO PRINT
0592 1EE8 ;
0593 1EE8 COS3
0594 1EE8 A2 00 LDX #0
0595 1EEA 8E 95 29 STX OSTATE ;RESET OUT STATE
0596 1EED C9 8D CMP #$8D ;IS IT CR
0597 1EEF F0 07 BEQ COS3A ; IF CR THEN CMD CHECK
0598 1EF1 AD F6 29 LDA ESTATE ;ELSE: IF NOT EXECUTE
0599 1EF4 F0 54 BEQ PRRTN ; THEN PRINT CHAR
0600 1EF6 D0 4B BNE DRTNI ; ELSE: PRINT IF MON INPUT
0601 1EF8 COS3A
0602 1EF8 AE 9D 29 LDX SVX ;GET LINE INDEX
0603 1EFB 4C CE 1E JMP COS1A
0604 1EFE ;
0605 1EFE ; COS4 <20> DISK OUTPUT MODE
0606 1EFE ;
0607 1EFE COS4
0608 1EFE C9 8D CMP #$8D ;IS IT CR
0609 1F00 D0 05 BNE COS4A ;BR IF NOT CR
0610 1F02 A9 05 LDA #5 ;SET STATE FOR CNTL-D
0611 1F04 8D 95 29 STA OSTATE ;EXAMINE
0612 1F07 20 97 25 COS4A JSR OCTD ;GO OUTPUT CHAR TO DISK
0613 1F0A 4C 3F 1F JMP DRTNO ;GO TO DATA RETURN (OUT)
0614 1F0D ;
0615 1F0D ; COS5 <20> DISK OUTPUT MODE <20> 1ST CHAR OF A LINE
0616 1F0D ;
0617 1F0D COS5
0618 1F0D CD F5 29 CMP CCHAR ;IS IT CNTL D
0619 1F10 F0 9A BEQ COS0 ;BR IF CNTL<54> D
0620 1F12 C9 8A CMP #$8A ;LINE FEED?
0621 1F14 F0 F1 BEQ COS4A
0622 1F16 A2 04 LDX #4
0623 1F18 8E 95 29 STX OSTATE ;SET NEW OUT STATE
0624 1F1B D0 E1 BNE COS4 ;BR IF NOT CNTL D
0625 1F1D ;
0626 1F1D ; COS6 <20> DISK INPUT ECHO
0627 1F1D ;
0628 1F1D A9 00 COS6 LDA #0
0629 1F1F 8D 95 29 STA OSTATE ;RESET OUT STATE = 0
0630 1F22 F0 1F BEQ DRTNI ;GO TO DATA IN RETURN
Page 15 APPLE DOS 3.1
0631 1F24 PAGE
0632 1F24 ;
0633 1F24 ; PRRTN <20> PRINT CHAR RETURN
0634 1F24 ;
0635 1F24 ;
0636 1F24 ; CMDRTN <20> PRINT CHAR IF MONITOR CMBS MODE
0637 1F24 ; DRTNO <20> PRINT CHAR IF MONITOR DATA OUT
0638 1F24 ; DRTNI <20> PRINT CHAR IF MONITOR DATA IN
0639 1F24 ;
0640 1F24 CERTN
0641 1F24 AD 00 02 LDA LBUFF ; CHECK FOR PRINTED COMMAND
0642 1F27 CD F5 29 CMP CCHAR
0643 1F2A F0 0F BEQ CMDRTN ; IF PC THEN NO RESET X REG
0644 1F2C A9 A0 LDA #$A0 ;BLANK
0645 1F2E 8D 00 02 STA LBUFF
0646 1F31 A9 8D LDA #$8D ;PLUS CR
0647 1F33 8D 01 02 STA LBUFF+1 ; TO OUT BUFFER
0648 1F36 A2 00 LDX #0 ;RESET TO SOL
0649 1F38 8E 9D 29 STX SVX
0650 1F3B A9 40 CMDRTN LDA #MC
0651 1F3D D0 06 BNE MODECK
0652 1F3F A9 10 DRTNO LDA #MO
0653 1F41 D0 02 BNE MODECK
0654 1F43 A9 20 DRTNI LDA #MI
0655 1F45 ;
0656 1F45 MODECK
0657 1F45 2D A1 29 AND MONMOD ;AND WITH MODE
0658 1F48 F0 06 BEQ ORTN ;BR IF NOT PRINT
0659 1F4A 20 57 1F PRRTN JSR LDREGS
0660 1F4D 20 61 1F JSR ORTN1
0661 1F50 ORTN
0662 1F50 20 AD 27 JSR MVCSW
0663 1F53 AE 9C 29 LDX SVSTK
0664 1F56 9A TXS
0665 1F57 LDREGS
0666 1F57 AD 9F 29 LDA SVA ;ACU
0667 1F5A AC 9E 29 LDY SVY ;Y
0668 1F5D AE 9D 29 LDX SVX ;X
0669 1F60 60 RTS ;BY PASS PRINT
0670 1F61 ;
0671 1F61 6C 36 00 ORTN1 JMP (OUTSW)
0672 1F64 ;
0673 1F64 ; PRCRIF <20> PRINT CR IF MON CMDS
0674 1F64 ;
0675 1F64 PRCRIF
0676 1F64 2C A1 29 BIT MONMOD ; IF NOT MON CMDS
0677 1F67 50 05 BVC PRCIFR ; THEN RETURN
0678 1F69 A9 8D LDA #$8D ; ELSE PRINT CR
0679 1F6B 20 61 1F JSR ORTN1
0680 1F6E 60 PRCIFR RTS
Page 16 APPLE DOS 3.1
0681 1F6F PAGE
0682 1F6F ;
0683 1F6F ; SCNCMD <20> SCAN COMMAND
0684 1F6F ;
0685 1F6F SCNCMD
0686 1F6F A0 FF LDY #$FF
0687 1F71 8C A2 29 STY CMDNO ;RESET COMMAND NUMBER
0688 1F74 C8 INY
0689 1F75 8C A5 29 STY SVCMD
0690 1F78 SC0
0691 1F78 EE A2 29 INC CMDNO ;INCR CMD NO
0692 1F7B A2 00 LDX #0 ;RESET LINE INDEX TO 0
0693 1F7D 08 PHP ; SAVE EQ STATUS
0694 1F7E BD 00 02 LDA LBUFF,X ;GET 1ST LINE CHAR
0695 1F81 CD F5 29 CMP CCHAR ; IS IT CONTROL D
0696 1F84 D0 01 BNE SC0A ; BR /IF NOT
0697 1F86 E8 INX ;INCR OVER CNTLD
0698 1F87 8E A0 29 SC0A STX LBUFD
0699 1F8A ;
0700 1F8A SC1X
0701 1F8A 20 29 21 JSR GNBC ; GET NON BLANK INPUT CHAR
0702 1F8D 29 7F AND #$7F ; MSB OF CHAR OFF
0703 1F8F 59 E0 27 EOR CMDNTB,Y ; EOR WITH INPUT
0704 1F92 C8 INY ; INCREMENT TABLE INDEX
0705 1F93 0A ASLA ; IF MSB OF EOR RESULT ON
0706 1F94 F0 02 BEQ SC1A ; IF RESULT NOT NOW ZERO
0707 1F96 68 PLA ; THEN INPUT DOES NOT
0708 1F97 08 PHP ; EQUAL ENTRY
0709 1F98 90 F0 SC1A BCC SC1X ; LOOP FOR END ENTRY
0710 1F9A ;
0711 1F9A 28 PLP ; IF INPUT EQUALS END
0712 1F9B F0 20 BEQ SYNTAX ; THEN GO SYNTAX
0713 1F9D ;
0714 1F9D B9 E0 27 LDA CMDNTB,Y ; IF NEXT TABLE CHAR NOT ZERO
0715 1FA0 D0 D6 BNE SC0 ; THEN SCAN THE NEXT TABLE ENTRY
0716 1FA2 CNF ;COMMAND NOT FOUND
0717 1FA2 AD 00 02 LDA LBUFF ;LINE IS A CONTROL-D
0718 1FA5 CD F5 29 CMP CCHAR ; THEN THIS IS A
0719 1FA8 F0 03 BEQ CNF1 ;POSSIBLE SYNTAX ERROR, ELSE
0720 1FAA 4C 4A 1F JMP PRRTN ;IT<49>S A BASIC INPUT LINE
0721 1FAD CNF1
0722 1FAD AD 01 02 LDA LBUFF+1 ;GET NEXT CHAR
0723 1FB0 C9 8D CMP #$8D ;IS IT A CR
0724 1FB2 D0 06 BNE CSERR ;BR IF CR
0725 1FB4 20 B7 26 JSR CLRSTS ; CLEAR THE STATES
0726 1FB7 4C 3B 1F JMP CMDRTN ;CNTL-D ONLY
0727 1FBA ;
0728 1FBA 4C 22 26 CSERR JMP ESYNTX
Page 17 APPLE DOS 3.1
0729 1FBD PAGE
0730 1FBD ;
0731 1FBD ; SYNTAX <20> FIGURE OUT WHAT WE GOT HERE
0732 1FBD ;
0733 1FBD SYNTAX
0734 1FBD AD A2 29 LDA CMDNO ;CMDNO=CMDNO*2
0735 1FC0 0A ASLA
0736 1FC1 8D A2 29 STA CMDNO
0737 1FC4 ;
0738 1FC4 A8 TAY
0739 1FC5 A9 20 LDA #FN1
0740 1FC7 39 65 28 AND CMDSTB,Y ;IS FN1 REGD
0741 1FCA F0 63 BEQ SN10 ;BR IF NOT
0742 1FCC 20 22 20 JSR CLRFNS
0743 1FCF 08 PHP ; SAVE EG STATUS
0744 1FD0 SN2
0745 1FD0 20 29 21 JSR GNBC ;GET NON BLANK CHAR
0746 1FD3 F0 1E BEQ SN6 ;BR IF CR OR COMMA
0747 1FD5 0A ASLA ; TEST FOR ALPHA
0748 1FD6 90 05 BCC SN2A ; BR IF ALPHA
0749 1FD8 30 03 BMI SN2A ; BR IS ALPHA
0750 1FDA 4C A2 1F JMP CNF ; LURCH IF NOT ALPHA
0751 1FDD 6A SN2A RORA ;RESTORE BITS
0752 1FDE 4C E6 1F JMP SN4 ;AWAY WE GO
0753 1FE1 20 18 21 SN3 JSR GNXTC ;GO GET NEXT CHAR
0754 1FE4 F0 0D BEQ SN6 ;BR IF COMMA OR CHAR
0755 1FE6 99 B8 29 SN4 STA FNAME1,Y ;PUT INTO FILENAME
0756 1FE9 C8 INY ;INC FN INDEX
0757 1FEA C0 3C CPY #60 ; ATFN FN INDEX
0758 1FEC 90 F3 BCC SN3 ;BR IF NOT
0759 1FEE 20 18 21 SN5 JSR GNXTC ;LOOP UNTIL CR OR COMMA
0760 1FF1 F0 FB BEQ SN5
0761 1FF3 ;
0762 1FF3 28 SN6 PLP ;WAS THIS FN2 L OO
0763 1FF4 D0 0F BNE SN7 ;BR IF IT WAS
0764 1FF6 ;
0765 1FF6 AC A2 29 LDY CMDNO
0766 1FF9 A9 10 LDA #FN2
0767 1FFB 39 65 28 AND CMDSTB,Y ;IF FN2 NOT REGD THEN
0768 1FFE F0 0C BEQ SN8 ;BRANCH
0769 2000 ;
0770 2000 A0 1E LDY #30 ; SET FN2 INDEX
0771 2002 08 PHP ; INDICATE FN2 SEEK
0772 2003 D0 CB BNE SN2 ;GO LOOK FOR FN2
0773 2005 ;
0774 2005 AD D6 29 SN7 LDA FNAME2 ;IF 1ST CHAR OF
0775 2008 C9 A0 CMP #$A0 ;FN2 IS BLANK THEN
0776 200A F0 13 BEQ SERR1 ;SYNTAX ERROR
0777 200C ;
0778 200C AD B8 29 SN8 LDA FNAME1 ;IF 1ST CHAR OF
0779 200F C9 A0 CMP #$A0 ;FN1 IS NOT BLANK
0780 2011 D0 45 BNE SOPTS ;THEN GO LOOK FOR OPTIONS
0781 2013 ;
0782 2013 AC A2 29 LDY CMDNO
0783 2016 A9 C0 LDA #NPB+NPE ;IF CMD MUST HAVE FILENAME
0784 2018 39 65 28 AND CMDSTB,Y ;THEN
0785 201B F0 02 BEQ SERR1 ;THIS IS ERROR ELSE
0786 201D ;
0787 201D 10 39 BPL SOPTS ; ITS EXECUTABLE WITHOUT
0788 201F ;
0789 201F 4C A2 1F SERR1 JMP CNF
0790 2022 ;
0791 2022 CLRFNS
0792 2022 A9 00 LDA #0
0793 2024 A0 3C LDY #60
0794 2026 CLRFNA
0795 2026 A9 A0 LDA #$A0
0796 2028 99 B7 29 SN1 STA FNAME1-1,Y ;CLEAR FN1, FN2
0797 202B 88 DEY
0798 202C D0 FA BNE SN1
0799 202E 60 RTS
Page 18 APPLE DOS 3.1
0800 202F PAGE
0801 202F SN10 ;FILE NAMES NOT REGD
0802 202F 8D B8 29 STA FNAME1
0803 2032 A9 0C LDA #NUM1+NUM2 ;IF NEITHER NUM1
0804 2034 39 65 28 AND CMDSTB,Y ;OR NUM2 IS REGD
0805 2037 F0 1F BEQ SOPTS ;THEN GO LOOK AT OPTIONS
0806 2039 ;
0807 2039 20 3E 21 JSR GETNUM ;GO GET NUMERICS
0808 203C B0 E1 BCS SERR1
0809 203E ;
0810 203E A8 TAY ; IF HIGH DIGIT NOT
0811 203F D0 DE BNE SERR1 ;ZERO THEN BAD
0812 2041 ;
0813 2041 E0 11 CPX #17 ;IF LOW DIGIT GT 16
0814 2043 B0 DA BCS SERR1 ;THEN BAD
0815 2045 ;
0816 2045 AC A2 29 LDY CMDNO
0817 2048 A9 08 LDA #NUM1
0818 204A 39 65 28 AND CMDSTB,Y ;IF WE WANT NUM2
0819 204D F0 06 BEQ SN11
0820 204F ;
0821 204F E0 08 CPX #8 ;IF NUM2>1
0822 2051 B0 CC BCS SERR1 ;THEN ERROR, ELSE
0823 2053 90 03 BCC SOPTS ;GO SCAN OPTIONS
0824 2055 ;
0825 2055 SN11
0826 2055 8A TXA ;IF NUM1=0
0827 2056 F0 C7 BEQ SERR1 ;THEN ERROR, ELSE
0828 2058 ;
Page 19 APPLE DOS 3.1
0829 2058 PAGE
0830 2058 ;
0831 2058 ; SOPTS <20> LOOK FOR SYNTAX OPTIONS
0832 2058 ;
0833 2058 SOPTS
0834 2058 A9 00 LDA #0
0835 205A 8D A8 29 STA INOPTS ;CLEAR INPUT OPTIONS
0836 205D 8D B7 29 STA IMBITS
0837 2060 8D AF 29 STA CL
0838 2063 8D B0 29 STA CL+1
0839 2066 8D A6 29 STA TEMP1A
0840 2069 AD A0 29 LDA LBUFD ;SET PASS 1
0841 206C ;
0842 206C 20 29 21 SP1 JSR GNBC ;GO GET NON-BLANK CHAR
0843 206F D0 1F BNE SP2 ;BR IF NOT COMMA OR CR
0844 2071 C9 8D CMP #$8D ;IF CHAR IS COMMA
0845 2073 D0 F7 BNE SP1 ;THEN GO GET CHAR
0846 2075 ;
0847 2075 AE A2 29 LDX CMDNO ;OPTIONS INPUT = I
0848 2078 AD A8 29 LDA INOPTS ;ALLOW OPTS = A
0849 207B 1D 66 28 ORA CMDSTB+1,X ;IF (A OR I)
0850 207E 5D 66 28 EOR CMDSTB+1,X ;OR A NOT = 0 THEN
0851 2081 D0 9C BNE SERR1 ;WE HAVE UNALLOWED OPTIONS
0852 2083 ;
0853 2083 AE A6 29 LDX TEMP1A ;IF THIS IS PASS 2
0854 2086 F0 77 BEQ CMDGO ;THEN DONE,
0855 2088 8D A6 29 STA TEMP1A ;ELSE SET PASS
0856 208B 8E A0 29 STX LBUFD ;RESTORE LBUFD AND
0857 208E D0 DC BNE SP1 ;GO DO PASS 2
0858 2090 ;
0859 2090 A2 0A SP2 LDX #OPT1L ;COMPARE CHAR HAVE WITH
0860 2092 DD 9C 28 SP3 CMP OPTAB1-1,X ;CHARS IN OPT TABLE
0861 2095 F0 05 BEQ SP4 ;IF NOT FOUND CONTINUE
0862 2097 CA DEX
0863 2098 D0 F8 BNE SP3 ;IF NOT FOUND
0864 209A F0 60 BEQ SERR2 ;THEN SYNTAX ERROR
0865 209C ;
0866 209C BD A6 28 SP4 LDA OPTAB2-1,X ;IF CORRESPONDING OP TAB 2 IS
0867 209F 30 47 BMI SP8 ;MINUS THEN IT MONITOR BITS
0868 20A1 0D A8 29 ORA INOPTS
0869 20A4 8D A8 29 STA INOPTS
0870 20A7 CA DEX
0871 20A8 ;
0872 20A8 8E A7 29 STX TEMP2A ;ELSE A NUMERIC MUST FOLLOW
0873 20AB 20 3E 21 JSR GETNUM ;FOLLOW
0874 20AE B0 4C BCS SERR2
0875 20B0 ;
0876 20B0 AD A7 29 LDA TEMP2A ; GET IOTION NUMBER
0877 20B3 0A ASLA ;MULT BY 4
0878 20B4 0A ASLA
0879 20B5 A8 TAY
0880 20B6 ;
0881 20B6 A5 45 LDA CNUM+1 ;IF RESULT NUM HI IS
0882 20B8 D0 09 BNE SP5 ;GT 0, THEN GT LOW RANGE
0883 20BA A5 44 LDA CNUM ;TEST RESULT LOW
0884 20BC D9 B1 28 CMP OPTAB3,Y ;WITH LOW RANGE (LOW)
0885 20BF 90 3B BCC SERR2 ;BR IF RESULT < LR
0886 20C1 A5 45 LDA CNUM+1
0887 20C3 D9 B4 28 SP5 CMP OPTAB3+3,Y
0888 20C6 90 0B BCC SP6 ;BR IF LESS
0889 20C8 D0 32 BNE SERR2 ;BR IF GRREATER
0890 20CA A5 44 LDA CNUM
0891 20CC D9 B3 28 CMP OPTAB3+2,Y
0892 20CF 90 02 BCC SP6 ;BR IF LESS
0893 20D1 D0 29 BNE SERR2 ;BR IF GREATER
0894 20D3 ;
0895 20D3 AD A6 29 SP6 LDA TEMP1A ;IF PASS 1,THEN
0896 20D6 D0 94 BNE SP1 ;DON<4F>T STORE RESULT
0897 20D8 98 TYA
0898 20D9 4A LSRA
0899 20DA A8 TAY
0900 20DB ;
0901 20DB A5 45 LDA CNUM+1 ;STORE THE RESULT
0902 20DD 99 AA 29 STA CUROPT+1,Y
0903 20E0 A5 44 LDA CNUM
0904 20E2 99 A9 29 STA CUROPT,Y
0905 20E5 4C 6C 20 SP7 JMP SP1 ;GO FOR NEXT OPT
0906 20E8 ;
0907 20E8 SP8 ;MONITOR REG
0908 20E8 48 PHA ;SAVE TYPE REG
0909 20E9 A9 80 LDA #CIO ;SET OPTION OF CIO
0910 20EB 0D A8 29 ORA INOPTS
0911 20EE 8D A8 29 STA INOPTS
0912 20F1 68 PLA ;RESTORE REG
0913 20F2 29 7F AND #$7F ;CLEAR CIO
0914 20F4 0D B7 29 ORA IMBITS ;OR WITH PREV IMBITS
0915 20F7 8D B7 29 STA IMBITS
0916 20FA D0 E9 BNE SP7 ;GO FOR NEXT
0917 20FC ;
0918 20FC 4C A2 1F SERR2 JMP CNF
Page 20 APPLE DOS 3.1
0919 20FF PAGE
0920 20FF ;
0921 20FF ; CMDGO <20> EXECUTE COMMAND
0922 20FF ;
0923 20FF CMDGO
0924 20FF 20 B7 26 JSR CLRSTS
0925 2102 20 33 21 JSR CLRCCB ;GO CLEAR CCB
0926 2105 20 0B 21 JSR ECMD ;GO EXECUTE
0927 2108 4C 24 1F JMP CERTN
0928 210B ECMD
0929 210B AD A2 29 LDA CMDNO ;COMMAND NO
0930 210E AA TAX ;IS CMD EXEC TAB INDEX
0931 210F BD 1F 1D LDA CMDETB+1,X ;GET CMD ADR
0932 2112 48 PHA ;ONTO STACK
0933 2113 BD 1E 1D LDA CMDETB,X
0934 2116 48 PHA
0935 2117 60 RTS ;AND GOTO COMMAND
0936 2118 ;
0937 2118 ; GNXTC <20> GET NEXT CHAR
0938 2118 ;
0939 2118 GNXTC
0940 2118 AE A0 29 LDX LBUFD
0941 211B BD 00 02 LDA LBUFF,X ;GET NEXT CHAR AND IF
0942 211E C9 8D CMP #$8D ;IT IS A CR
0943 2120 F0 06 BEQ GNXTCR ;THEN RETURN WITHOUT
0944 2122 E8 INX ;INCR TO NEXT CHAR
0945 2123 8E A0 29 STX LBUFD
0946 2126 C9 AC CMP #','+$80 ;TEST FOR COMMA
0947 2128 60 GNXTCR RTS
0948 2129 ;
0949 2129 ; GNBC <20> GET NON BLANK CHAR
0950 2129 ;
0951 2129 GNBC:
0952 2129 20 18 21 JSR GNXTC ;GO GET NEXT CHAR
0953 212C F0 FA BEQ GNXTCR ;BR IF COMMA OR CR
0954 212E C9 A0 CMP #$A0 ;IS IT BLANK
0955 2130 F0 F7 BEQ GNBC ;BR IF BLANK
0956 2132 60 RTS ;DONE
0957 2133 ;
0958 2133 ; CLRCCB <20> CLEAR CCB
0959 2133 ;
0960 2133 CLRCCB
0961 2133 A9 00 LDA #0
0962 2135 A0 16 LDY #CCBLEN ;CCB LENGTH
0963 2137 99 EE 34 CLC1 STA CCB-1,Y ;CLEAR BYTE
0964 213A 88 DEY
0965 213B D0 FA BNE CLC1
0966 213D 60 RTS
Page 21 APPLE DOS 3.1
0967 213E PAGE
0968 213E ;
0969 213E ; GETNUM <20> COVERT ASCII INPUT TO NUMERIC
0970 213E ;
0971 213E GETNUM
0972 213E A9 00 LDA #0 ;CLEAR WORK AREA
0973 2140 85 44 STA CNUM
0974 2142 85 45 STA CNUM+1
0975 2144 20 29 21 JSR GNBC
0976 2147 08 PHP
0977 2148 C9 A4 CMP #$A4
0978 214A F0 3E BEQ HEXNUM
0979 214C 28 PLP
0980 214D 4C 53 21 JMP GN2A
0981 2150 ;
0982 2150 20 29 21 GN2 JSR GNBC ;GET NEXT NON BLANK
0983 2153 GN2A
0984 2153 D0 06 BNE GN3 ;BR NOT COMMA OR CR
0985 2155 A6 44 LDX CNUM ;X=RESULT LOW
0986 2157 A5 45 LDA CNUM+1 ;Y=RESULT HI
0987 2159 18 CLC
0988 215A 60 RTS ;DONE
0989 215B ;
0990 215B 38 GN3 SEC
0991 215C E9 B0 SBC #$B0 ;SUBTRACT ASCII 0
0992 215E 30 21 BMI GN4 ;BR IF NOT NUM
0993 2160 C9 0A CMP #10
0994 2162 B0 1D BCS GN4 ;BR IF NOT NUM
0995 2164 20 83 21 JSR GN5 ;OLD*2
0996 2167 65 44 ADC CNUM ;PLUS NEW
0997 2169 AA TAX
0998 216A A9 00 LDA #0
0999 216C 65 45 ADC CNUM+1
1000 216E A8 TAY
1001 216F 20 83 21 JSR GN5 ;OLD*4
1002 2172 20 83 21 JSR GN5 ;OLD*8
1003 2175 8A TXA ;OLD*8 + OLD*2 + NEW
1004 2176 65 44 ADC CNUM
1005 2178 85 44 STA CNUM ;=OLD*10 + NEW
1006 217A 98 TYA
1007 217B 65 45 ADC CNUM+1
1008 217D 85 45 STA CNUM+1
1009 217F 90 CF BCC GN2
1010 2181 ;
1011 2181 GN4
1012 2181 38 SEC
1013 2182 60 RTS ;DONE
1014 2183 GN5
1015 2183 06 44 ASL CNUM ;CNUM * 2
1016 2185 26 45 ROL CNUM+1
1017 2187 B0 F8 BCS GN4
1018 2189 60 RTS
Page 22 APPLE DOS 3.1
1019 218A PAGE
1020 218A ;
1021 218A HEXNUM
1022 218A 28 PLP
1023 218B HN0
1024 218B 20 29 21 JSR GNBC ;GO GET CHAR
1025 218E F0 C3 BEQ GN2A ;BR IF CR OR COMMA
1026 2190 ;
1027 2190 38 SEC
1028 2191 E9 B0 SBC #$B0 ;CHAR <20> ASCII0
1029 2193 30 EC BMI GN4 ;BR IF LT0
1030 2195 C9 0A CMP #10 ;IS IT LT10
1031 2197 90 08 BCC HN1 ;BR IF LT
1032 2199 E9 07 SBC #$7 ;SUB 7 FOR ASCII A
1033 219B 30 E4 BMI GN4 ;BR IF LT A
1034 219D C9 10 CMP #16 ;TEST GT 15
1035 219F B0 E0 BCS GN4 ;BR GT 15
1036 21A1 20 83 21 HN1 JSR GN5 ;OLD*2
1037 21A4 20 83 21 JSR GN5 ;OLD*4
1038 21A7 20 83 21 JSR GN5 ;OLD*8
1039 21AA 20 83 21 JSR GN5 ;OLD*16
1040 21AD 05 44 ORA CNUM ;OR IN NEW
1041 21AF 85 44 STA CNUM ;SAVE NEW
1042 21B1 4C 8B 21 JMP HN0 ;GO FOR NEXT CHAR
Page 23 APPLE DOS 3.1
1043 21B4 PAGE
1044 21B4 ;
1045 21B4 ; EPR <20> EXECUTE PR#
1046 21B4 ;
1047 21B4 EPR
1048 21B4 A5 44 LDA CNUM ;GET PORT
1049 21B6 4C 95 FE JMP OUTPRT ;GO DO IT
1050 21B9 ;
1051 21B9 ; EIN <20> EXECUTE IN#
1052 21B9 ;
1053 21B9 EIN
1054 21B9 A5 44 LDA CNUM ;GET PORT
1055 21BB 4C 8B FE JMP INPRT ; GO DO IT
1056 21BE ;
1057 21BE ; EMON <20> EXECUTE MONITOR CMD
1058 21BE ;
1059 21BE EMON
1060 21BE AD A1 29 LDA MONMOD ;GET CURRETN BITS
1061 21C1 0D B7 29 ORA IMBITS ;OR IN NEW BITS
1062 21C4 8D A1 29 STA MONMOD ;SET NEW MODE
1063 21C7 60 RTS
1064 21C8 ;
1065 21C8 ; ENOMON <20> EXECUTE NO MONITOR CMD
1066 21C8 ;
1067 21C8 ENOMON
1068 21C8 2C B7 29 BIT IMBITS
1069 21CB 50 03 BVC ENM1
1070 21CD 20 64 1F JSR PRCRIF
1071 21D0 ENM1
1072 21D0 A9 70 LDA #$70
1073 21D2 4D B7 29 EOR IMBITS ;INVERT INPUT BITS
1074 21D5 2D A1 29 AND MONMOD ;AND WITH CURRENT
1075 21D8 8D A1 29 STA MONMOD ;SET NEW MODE
1076 21DB 60 RTS
Page 24 APPLE DOS 3.1
1077 21DC PAGE
1078 21DC ;
1079 21DC ; EMAXF <20> EXECUTE MAX FILES
1080 21DC ;
1081 21DC EMAXF
1082 21DC A9 00 LDA #0 ; RESET EXECUTE
1083 21DE 8D F6 29 STA ESTATE
1084 21E1 A5 44 LDA CNUM ;SAVE NEW NO FILES
1085 21E3 48 PHA
1086 21E4 20 A5 22 JSR CLALL ;GO CLOSE ALL TBLS
1087 21E7 68 PLA
1088 21E8 8D 9A 29 STA CNFTBS ;SET NEW NO FILE TBLS
1089 21EB 4C 30 27 JMP BLDFTB ; GO BUILD NEW ONES
1090 21EE ;
1091 21EE ; EDEL <20> DELETE A FILE
1092 21EE ;
1093 21EE EDEL
1094 21EE A9 05 LDA #CRQDEL ;DELETE REQUEST
1095 21F0 20 38 22 JSR OPEN ;GO OPEN
1096 21F3 20 C0 26 JSR FILSRC ;FIND FILE
1097 21F6 A0 00 LDY #0
1098 21F8 98 TYA
1099 21F9 91 40 STA (ZPGWRK),Y ;RESET FN
1100 21FB 60 RTS
1101 21FC ;
1102 21FC ; ELOCK <20> LOCK A FILE
1103 21FC ;
1104 21FC ELOCK
1105 21FC A9 07 LDA #CRQLCK ;SET LOCK
1106 21FE D0 02 BNE ELGO
1107 2200 ;
1108 2200 ; EUNLK <20> UNLOCK A FILE
1109 2200 ;
1110 2200 EUNLK
1111 2200 A9 08 LDA #CRQUNL ;SET UNLOCK
1112 2202 ELGO
1113 2202 20 38 22 JSR OPEN ;OPEN FILE & UNLOCK
1114 2205 4C 78 22 JMP ECLOSE ; CLOSE IT
1115 2208 ;
1116 2208 ; EVAR <20> VERIFY A FILE
1117 2208 ;
1118 2208 EVAR
1119 2208 4C B5 37 JMP DP1 ;*** PATCH ***
1120 220B 00 BRK
Page 25 APPLE DOS 3.1
1121 220C PAGE
1122 220C ;
1123 220C ; EREN <20> RENAME A FILE
1124 220C ;
1125 220C EREN
1126 220C AD 08 1D LDA FN2ADR ;MOVE FILE NAME2
1127 220F 8D F1 34 STA CCBFN2
1128 2212 AD 09 1D LDA FN2ADR+1
1129 2215 8D F2 34 STA CCBFN2+1
1130 2218 A9 09 LDA #CRQRNM
1131 221A 8D A6 29 STA TEMP1A ;SET RENAME
1132 221D 20 56 22 JSR EO3 ;GO OPEN AND RENAME
1133 2220 4C 78 22 JMP ECLOSE ; GO CLOSE
1134 2223 ;
1135 2223 ; EAPND <20> OPEN FILE FOR APPEND
1136 2223 ;
1137 2223 EAPND
1138 2223 20 36 22 JSR EOPEN ; GO OPEN
1139 2226 A9 06 LDA #CREFNF
1140 2228 CD F9 34 CMP CCBSTA ; IF FILE CREATED
1141 222B D0 01 BNE AP1
1142 222D 60 RTS
1143 222E AP1
1144 222E 20 F0 25 JSR RBYTE ; READ A BYTE
1145 2231 D0 FB BNE AP1 ; BR IF NOT ZERO
1146 2233 ;
1147 2233 4C DB 24 JMP RWP3 ;GO RE-POSITION
Page 26 APPLE DOS 3.1
1148 2236 PAGE
1149 2236 ;
1150 2236 ; EOPEN <20> OPEN A FILE
1151 2236 ;
1152 2236 EOPEN
1153 2236 A9 01 LDA #CRQOPN
1154 2238 OPEN
1155 2238 8D A6 29 STA TEMP1A
1156 223B AD AF 29 LDA CL ;IF NO LENGTH ENTERED
1157 223E D0 0A BNE EO1 ;THEN SET DEFAULT OF 1
1158 2240 AD B0 29 LDA CL+1
1159 2243 D0 05 BNE EO1
1160 2245 A9 01 LDA #1
1161 2247 8D AF 29 STA CL
1162 224A EO1
1163 224A AD AF 29 LDA CL ;MOVE REC LENGTH
1164 224D 8D F1 34 STA CCBRLN
1165 2250 AD B0 29 LDA CL+1
1166 2253 8D F2 34 STA CCBRLN+1
1167 2256 EO3
1168 2256 20 78 22 JSR ECLOSE ;GO CLOSE IF OPEN
1169 2259 A5 45 LDA CNUM+1 ;GET AVALL ENTRY
1170 225B D0 03 BNE EO5 ;BR IF ONE AVAIL
1171 225D 4C 26 26 JMP ENFA ;DONE - NO FILES AVAIL
1172 2260 EO5
1173 2260 85 41 STA ZPGWRK+1 ;MOVE AVAIL SLOT TO ZPG
1174 2262 A5 44 LDA CNUM
1175 2264 85 40 STA ZPGWRK
1176 2266 20 9F 26 JSR MVFN1 ;GO MOVE FILE NAME
1177 2269 20 AA 26 JSR MVBUFP ;GO MOVE BUF PTRS
1178 226C 20 76 26 JSR OPNSUP ;GO SET UP OPEN
1179 226F AD A6 29 LDA TEMP1A ;SET OPEN REG
1180 2272 8D EF 34 STA CCBREQ
1181 2275 4C 0C 26 JMP DOSGO ; GO OPEN
Page 27 APPLE DOS 3.1
1182 2278 PAGE
1183 2278 ;
1184 2278 ; ECLOSE <20> EXECUTE CLOSE FILE COMMAND
1185 2278 ;
1186 2278 ECLOSE
1187 2278 AD B8 29 LDA FNAME1
1188 227B C9 A0 CMP #$A0
1189 227D F0 26 BEQ CLALL
1190 227F 20 C0 26 JSR FILSRC ;GO FIND FILE
1191 2282 B0 06 BCS ECL1 ; BR IF NOT FOUND
1192 2284 20 8B 22 JSR CLOSE ;GO CLOSE
1193 2287 4C 78 22 JMP ECLOSE ;GO SEE IF ANY MORE OPEN
1194 228A 60 ECL1 RTS
1195 228B ;
1196 228B ; CLOSE <20> CLOSE A FILE
1197 228B ;
1198 228B CLOSE
1199 228B 20 0B 27 JSR TSTEXC
1200 228E D0 05 BNE CLX
1201 2290 A9 00 LDA #0
1202 2292 8D F6 29 STA ESTATE
1203 2295 CLX
1204 2295 A0 00 LDY #0 ;CLEAR 1ST FN
1205 2297 98 TYA ;CHAR TO ZERO
1206 2298 91 40 STA (ZPGWRK),Y
1207 229A 20 AA 26 JSR MVBUFP ;MOVE BUFFER PTRS
1208 229D A9 02 LDA #CRQCLS ;SET CLOSE
1209 229F 8D EF 34 STA CCBREQ
1210 22A2 4C 0C 26 JMP DOSGO ;GO CLOSE
1211 22A5 ;
1212 22A5 ; CLALL <20> CLOSE ALL FILES
1213 22A5 ;
1214 22A5 CLALL
1215 22A5 20 EE 26 JSR TSINIT ;GO INIT FILE SEARCH
1216 22A8 D0 05 BNE CL1
1217 22AA CL0
1218 22AA 20 F6 26 JSR TSNXT ;NEXT ENTRY
1219 22AD F0 10 BEQ CL2 ;BR IF NO MORE
1220 22AF CL1
1221 22AF 20 0B 27 JSR TSTEXC
1222 22B2 F0 F6 BEQ CL0
1223 22B4 20 06 27 JSR TSTOPN ;GO TEST OPEN
1224 22B7 F0 F1 BEQ CL0 ;BR NOT OPEN
1225 22B9 20 8B 22 JSR CLOSE ;GO CLOSE
1226 22BC 4C A5 22 JMP CLALL ;START OVER
1227 22BF 60 CL2 RTS ;DONE
Page 28 APPLE DOS 3.1
1228 22C0 PAGE
1229 22C0 ;
1230 22C0 ; EBSV <20> EXECUTE BINARY SAVE
1231 22C0 ;
1232 22C0 EBSV
1233 22C0 A9 09 LDA #A+L ; IF A+L
1234 22C2 2D A8 29 AND INOPTS
1235 22C5 C9 09 CMP #A+L
1236 22C7 F0 03 BEQ EBSV1
1237 22C9 4C A2 1F JMP CNF ;THEN ERROR
1238 22CC EBSV1
1239 22CC A9 04 LDA #4 ; SET BINARY FILE
1240 22CE 20 67 23 JSR SV1 ; GO OPEN & TEST
1241 22D1 AD B6 29 LDA CA+1 ; OUTPUTADR OF BLOCK
1242 22D4 AC B5 29 LDY CA
1243 22D7 20 72 23 JSR SV2
1244 22DA AD B0 29 LDA CL+1 ; GO OPEN AND TEST
1245 22DD AC AF 29 LDY CL
1246 22E0 20 72 23 JSR SV2 ; OUTPUT LENGTH
1247 22E3 AD B6 29 LDA CA+1 ; GET ADR GIVEN
1248 22E6 AC B5 29 LDY CA
1249 22E9 4C 91 23 JMP SV3 ; OUTPUT BLOCK
1250 22EC ;
1251 22EC ; EBLD <20> EXECUTE BINARY LOAD
1252 22EC ;
1253 22EC EBLD
1254 22EC 20 36 22 JSR EOPEN
1255 22EF A9 06 LDA #CREFNF
1256 22F1 CD F9 34 CMP CCBSTA
1257 22F4 D0 03 BNE EBLD2
1258 22F6 4C B2 23 JMP KLUTZ
1259 22F9 EBLD2
1260 22F9 A9 7F LDA #$7F
1261 22FB 2D F6 34 AND CCBFUC
1262 22FE C9 04 CMP #4
1263 2300 F0 03 BEQ EBLD3
1264 2302 4C 32 26 JMP ENBF
1265 2305 EBLD3
1266 2305 A9 04 LDA #4 ; SET BINARY FILE
1267 2307 20 67 23 JSR SV1 ; GO OPEN $ TEST
1268 230A 20 13 24 JSR LD2 ; GO GET ADR
1269 230D AA TAX
1270 230E AD A8 29 LDA INOPTS
1271 2311 29 01 AND #A ; IF ADR NOT GIVEN
1272 2313 D0 06 BNE EBLD1
1273 2315 8E B5 29 STX CA ; THEN USE ADR FROM FILE
1274 2318 8C B6 29 STY CA+1
1275 231B EBLD1
1276 231B 20 13 24 JSR LD2 ; GET LENGTH
1277 231E AE B5 29 LDX CA ; GET GIVEN ADR
1278 2321 AC B6 29 LDY CA+1
1279 2324 4C 44 24 JMP LD3 ; GO GET BLOCK
1280 2327 ;
1281 2327 ; EBRUN <20> EXECUTE BINARY RUN
1282 2327 ;
1283 2327 EBRUN
1284 2327 20 EC 22 JSR EBLD ; GO LOAD FILE
1285 232A 20 AD 27 JSR MVCSW ;GO RESTORE CHAR I/O SW
1286 232D 6C B5 29 JMP (CA) ; GO EXEC THE STUFF
Page 29 APPLE DOS 3.1
1287 2330 PAGE
1288 2330 ;
1289 2330 ; ESAVE <20> EXECUTE SAVE REQUEST
1290 2330 ;
1291 2330 ESAVE
1292 2330 AD F9 29 LDA ASIBSW ; IF IB THEN
1293 2333 F0 19 BEQ EIBSV ; GO TO IB SAVE
1294 2335 A9 02 LDA #2 ; GET APPLESOFT PGM
1295 2337 20 67 23 JSR SV1 ; GO OPEN AND TEST
1296 233A ;
1297 233A 38 SEC ; BLOCK LENGTH
1298 233B A5 AF LDA ASEOP ; =EOP-SOP
1299 233D E5 67 SBC ASSOP
1300 233F A8 TAY
1301 2340 A5 B0 LDA ASEOP+1
1302 2342 E5 68 SBC ASSOP+1
1303 2344 20 72 23 JSR SV2 ; GO OUTPUT LRNGTH
1304 2347 ;
1305 2347 A5 68 LDA ASSOP+1 ; BLOCK ADR
1306 2349 A4 67 LDY ASSOP ; =SOP
1307 234B 4C 91 23 JMP SV3 ; GO OUTPUT BLOCK
1308 234E ;
1309 234E EIBSV
1310 234E A9 01 LDA #1 ; SET IB PGM
1311 2350 20 67 23 JSR SV1 ; GO OPEN AND TEST
1312 2353 ;
1313 2353 38 SEC ; BLOCK LENGTH
1314 2354 A5 4C LDA IBHMEM ; =HIMEM-SOP
1315 2356 E5 CA SBC IBSOP
1316 2358 A8 TAY
1317 2359 A5 4D LDA IBHMEM+1
1318 235B E5 CB SBC IBSOP+1
1319 235D 20 72 23 JSR SV2 ; GO OUTPUT LENGTH
1320 2360 ;
1321 2360 A5 CB LDA IBSOP+1 ; BLOCK ADR
1322 2362 A4 CA LDY IBSOP ; =SOP
1323 2364 4C 91 23 JMP SV3 ; GO OUTPUT BLOCK
1324 2367 ;
1325 2367 SV1
1326 2367 SV1A
1327 2367 8D F6 34 STA CCBFUC ; SET PGM TYPE
1328 236A 48 PHA ; SAVE PGM TYPE
1329 236B 20 36 22 JSR EOPEN ; GO OPEN FILE
1330 236E 68 PLA ; GET SAVE TYPE
1331 236F 4C 20 27 JMP TSTFUC ; GO CHECK
1332 2372 ;
1333 2372 SV2
1334 2372 8C F5 34 STY CCBBLN ; SET BLOCK LENGTH
1335 2375 8C F7 34 STY CCBDAT ; AND DATA BYTE
1336 2378 8D F6 34 STA CCBBLN+1
1337 237B A9 04 LDA #CRQWR ; INDICATE WRITE
1338 237D 8D EF 34 STA CCBREQ
1339 2380 A9 01 LDA #CRMNBT ; NEXT BYTE
1340 2382 8D F0 34 STA CCBRQM
1341 2385 20 0C 26 JSR DOSGO ; GO WRITE
1342 2388 AD F6 34 LDA CCBBLN+1 ; OTHER BYTE TOO
1343 238B 8D F7 34 STA CCBDAT
1344 238E 4C 0C 26 JMP DOSGO
1345 2391 ;
1346 2391 8C F7 34 SV3 STY CCBBBA ; SET BLOCK ADR
1347 2394 8D F8 34 STA CCBBBA+1
1348 2397 A9 02 LDA #CRMNBL ; INDICATE BLOCK I/O
1349 2399 8D F0 34 STA CCBRQM
1350 239C 20 0C 26 JSR DOSGO ; GO DO IT
1351 239F 4C 78 22 JMP ECLOSE ; CLOSE FILE
Page 30 APPLE DOS 3.1
1352 23A2 PAGE
1353 23A2 4C 2E 26 NBPER JMP ERNUl
1354 23A5 ;
1355 23A5 ; ELOAD <20> EXECUTE LOAD REQUEST
1356 23A5 ;
1357 23A5 ELOAD
1358 23A5 20 A5 22 JSR CLALL ;GO CLOSE ALL
1359 23A8 20 36 22 JSR EOPEN ; OPEN FILE
1360 23AB A9 06 LDA #CREFNF
1361 23AD CD F9 34 CMP CCBSTA ; WAS FILE FOUND
1362 23B0 D0 08 BNE ELD1 ; BR IF FOUND
1363 23B2 ;
1364 23B2 20 EE 21 KLUTZ JSR EDEL ; DELETE NEW FILE
1365 23B5 A9 06 LDA #CREFNF ; FILE NOT FOUND MSG
1366 23B7 4C 34 26 JMP ERROR ; GO
1367 23BA ;
1368 23BA ELD1
1369 23BA A9 7F LDA #$7F ; MASK PROTECT BIT
1370 23BC 2D F6 34 AND CCBFUC ; OUT OF FUC
1371 23BF F0 E1 BEQ NBPER ; BR IF ERROR
1372 23C1 29 03 AND #$03 ; ISOLOLATE IB & AS
1373 23C3 F0 DD BEQ NBPER ; BR IF ERROR
1374 23C5 8D F6 34 STA CCBFUC ; SAVE IB/AS ONLY
1375 23C8 AD F9 29 LDA ASIBSW ; IF IB THEN
1376 23CB F0 22 BEQ EIBL ; GO TO IB LOAD
1377 23CD A9 02 LDA #2
1378 23CF 20 56 24 JSR LD1 ; GO OPEN AND TEST
1379 23D2 ;
1380 23D2 20 13 24 JSR LD2 ; GO GET BLOCK LENGTH
1381 23D5 ;
1382 23D5 18 CLC
1383 23D6 65 67 ADC ASSOP ; ADD BLOCK LENGTH TO SOP
1384 23D8 AA TAX
1385 23D9 98 TYA
1386 23DA 65 68 ADC ASSOP+1
1387 23DC ;
1388 23DC C5 74 CMP ASHM1+1 ; IF BL+SOP >=HMEM
1389 23DE B0 70 BCS MFULL ; THEN WON<4F>T FIT
1390 23E0 ;
1391 23E0 85 B0 STA ASEOP+1 ; SET NEW EOP ADR
1392 23E2 85 6A STA ASEOP2+1
1393 23E4 86 AF STX ASEOP
1394 23E6 86 69 STX ASEOP2
1395 23E8 A6 67 LDX ASSOP ; GET ADR WHERE TO LOAD
1396 23EA A4 68 LDY ASSOP+1
1397 23EC 4C 44 24 JMP LD3 ; GO LOAD
1398 23EF ;
1399 23EF EIBL
1400 23EF A9 01 LDA #1 ; SET IB PGM
1401 23F1 20 56 24 JSR LD1 ; GO OPEN AND TEST
1402 23F4 ;
1403 23F4 20 13 24 JSR LD2 ; GO GET BLOCK LENGTH
1404 23F7 ;
1405 23F7 38 SEC ; HMEM - BLOK LENGTH
1406 23F8 A5 4C LDA IBHMEM ; IS NEW SOP
1407 23FA ED A3 29 SBC SVBL
1408 23FD AA TAX
1409 23FE A5 4D LDA IBHMEM+1
1410 2400 ED A4 29 SBC SVBL+1
1411 2403 90 4B BCC MFULL
1412 2405 A8 TAY
1413 2406 ;
1414 2406 C4 4B CPY IBLMEM+1 ; IF NEW SOP <= LMEM
1415 2408 90 46 BCC MFULL
1416 240A F0 44 BEQ MFULL
1417 240C 84 CB STY IBSOP+1 ; SET NEW SOP
1418 240E 86 CA STX IBSOP
1419 2410 4C 44 24 JMP LD3
1420 2413 ;
1421 2413 LD2
1422 2413 AD 0A 1D LDA SVBLA ; MOVE ADR OF WHERE
1423 2416 8D F7 34 STA CCBBBA ; TO PUT DATA TO
1424 2419 AD 0B 1D LDA SVBLA+1 ; CCBN
1425 241C 8D F8 34 STA CCBBBA+1
1426 241F A9 00 LDA #0
1427 2421 8D F6 34 STA CCBBLN+1 ; READ INTO
1428 2424 A9 02 LDA #2
1429 2426 8D F5 34 STA CCBBLN
1430 2429 A9 03 LDA #CRQRD ; READ
1431 242B 8D EF 34 STA CCBREQ
1432 242E A9 02 LDA #CRMNBL ; BLOCK
1433 2430 8D F0 34 STA CCBRQM
1434 2433 20 0C 26 JSR DOSGO
1435 2436 AD A4 29 LDA SVBL+1
1436 2439 8D F6 34 STA CCBBLN+1
1437 243C A8 TAY
1438 243D AD A3 29 LDA SVBL
1439 2440 8D F5 34 STA CCBBLN
1440 2443 60 RTS
1441 2444 ;
1442 2444 LD3
1443 2444 8E F7 34 STX CCBBBA ; SET BLOCK ADR
1444 2447 8C F8 34 STY CCBBBA+1
1445 244A 20 0C 26 JSR DOSGO ; GET BLOCK
1446 244D 4C 78 22 JMP ECLOSE ; GO CLOSE FILE
1447 2450 ;
1448 2450 MFULL
1449 2450 20 78 22 JSR ECLOSE ; GO CLOSE FILE
1450 2453 4C 2A 26 JMP MFERR ; AND GIVE ERR MSG
1451 2456 LD1
1452 2456 CD F6 34 CMP CCBFUC ; TEST TYP
1453 2459 F0 1A BEQ LD1C ; BR IF MATCH
1454 245B AE A2 29 LDX CMDNO
1455 245E 8E A5 29 STX SVCMD
1456 2461 4A LSRA
1457 2462 F0 03 BEQ LD1A ; BR IF PGM IS AS
1458 2464 4C 31 25 JMP EINT ; GO FOR INTG BASIC
1459 2467 ;
1460 2467 LD1A
1461 2467 A2 1D LDX #29 ; SAVE FILE NAME
1462 2469 BD B8 29 LD1B LDA FNAME1,X ; INCASE IS RAM APPLESOFT
1463 246C 9D D6 29 STA FNAME2,X
1464 246F CA DEX
1465 2470 10 F7 BPL LD1B
1466 2472 4C 0D 25 JMP EAS ; GO FOR AS
1467 2475 ;
1468 2475 60 LD1C RTS
Page 31 APPLE DOS 3.1
1469 2476 PAGE
1470 2476 ;
1471 2476 ; ERUN <20> EXECUTE RUN REQUEST
1472 2476 ;
1473 2476 ERUN
1474 2476 20 A5 23 JSR ELOAD ;LOAD PGM
1475 2479 20 64 1F JSR PRCRIF
1476 247C 20 AD 27 JSR MVCSW ;GO RESTORE CHAR I/O SW
1477 247F 6C 58 1D JMP (RUN)
1478 2482 ;
1479 2482 ; IBRUN <20> INT BASIC RUN
1480 2482 ;
1481 2482 IBRUN
1482 2482 A5 4A LDA IBLMEM ;RESET START OF VARS
1483 2484 85 CC STA IBSOV
1484 2486 A5 4B LDA IBLMEM+1
1485 2488 85 CD STA IBSOV+1
1486 248A 6C 56 1D JMP (CHAIN)
1487 248D ;
1488 248D ; EHCAIN <20> EXECUTE CHAIN REQUEST
1489 248D ;
1490 248D ECHAIN
1491 248D 20 A5 23 JSR ELOAD ;LOAD PGM
1492 2490 20 64 1F JSR PRCRIF
1493 2493 20 AD 27 JSR MVCSW ;GO RESTORE CHAR I/O SW
1494 2496 6C 56 1D JMP (CHAIN)
1495 2499 20 65 D6 ASRUN1 JSR $D665 ;ROM
1496 249C 4C D2 D7 JMP $D7D2
1497 249F 20 65 0E ASRUN2 JSR $E65 ; RAM
1498 24A2 4C D4 0F JMP $FD4
Page 32 APPLE DOS 3.1
1499 24A5 PAGE
1500 24A5 ;
1501 24A5 ; EWRITE <20> WRITE CMD EXECUTE
1502 24A5 ;
1503 24A5 EWRITE
1504 24A5 20 BB 24 JSR RWPOSN ;GO POSITION FILE IF REQD
1505 24A8 A9 05 LDA #5
1506 24AA 8D 95 29 STA OSTATE ;SET OSTATE=5
1507 24AD 4C 24 1F JMP CERTN ;DONE
1508 24B0 ;
1509 24B0 ; EREAD <20> READ COMD EXECUTE
1510 24B0 ;
1511 24B0 EREAD
1512 24B0 20 BB 24 JSR RWPOSN ;GO POSITION FILE IF REGD
1513 24B3 A9 01 LDA #1
1514 24B5 8D 94 29 STA ISTATE ;SET ISTATE = DISK INPUT
1515 24B8 4C 24 1F JMP CERTN ;DONE
1516 24BB ;
1517 24BB ; RWPOSN <20> POSITION FOR READ/WRITE
1518 24BB ;
1519 24BB RWPOSN
1520 24BB 20 C0 26 JSR FILSRC ;FIND THE FILE
1521 24BE 90 06 BCC RWP1 ;BR IF FILE FOUND
1522 24C0 20 36 22 JSR EOPEN ;GO OPEN FOR KLUTZ
1523 24C3 4C C9 24 JMP RWP2 ;THEN SKIP NEXT LINE
1524 24C6 RWP1
1525 24C6 20 AA 26 JSR MVBUFP ;MOVE BUFF POINTERS
1526 24C9 RWP2
1527 24C9 AD A8 29 LDA INOPTS ;GET IN OPTIONS
1528 24CC 29 06 AND #R+B ;WAS IT B OR R
1529 24CE F0 13 BEQ RWPR ;BR IF NOT
1530 24D0 A2 03 LDX #3
1531 24D2 BD B1 29 RWP2A LDA CR,X ;MOVE REL REC
1532 24D5 9D F1 34 STA CCBRRN,X ;AND REL BYTE
1533 24D8 CA DEX
1534 24D9 10 F7 BPL RWP2A
1535 24DB RWP3
1536 24DB A9 0A LDA #CRQPOS ;INDICATE POSITION REQUIRED
1537 24DD 8D EF 34 STA CCBREQ
1538 24E0 20 0C 26 JSR DOSGO
1539 24E3 60 RWPR RTS ;DONE
Page 33 APPLE DOS 3.1
1540 24E4 PAGE
1541 24E4 ;
1542 24E4 ;
1543 24E4 ; EINIT <20> EXECUTE INIT COMMAND
1544 24E4 ;
1545 24E4 EINIT
1546 24E4 A9 40 LDA #V ; MUST HAVE
1547 24E6 2D A8 29 AND INOPTS ; VOL OPTION
1548 24E9 F0 13 BEQ INER
1549 24EB AD A9 29 LDA CV ; AND VOL MUST
1550 24EE F0 0E BEQ INER ; BR GT 0
1551 24F0 AD 0D 1D LDA ASTART+1
1552 24F3 8D F0 34 STA CCBBSA
1553 24F6 A9 0B LDA #CRQFMT
1554 24F8 20 38 22 JSR OPEN
1555 24FB 4C 30 23 JMP ESAVE
1556 24FE ;
1557 24FE 4C A2 1F INER JMP CNF
1558 2501 ;
1559 2501 ; ECAT <20> PRINT CATALOG
1560 2501 ;
1561 2501 ECAT
1562 2501 A9 06 LDA #CRQDIR
1563 2503 20 38 22 JSR OPEN ;GO PRETEND OPEN
1564 2506 AD F3 34 LDA CCBVOL
1565 2509 8D A9 29 STA CV
1566 250C 60 RTS
Page 34 APPLE DOS 3.1
1567 250D PAGE
1568 250D ;
1569 250D ; EAS <20> EXECUTE APPLESOFT REQUEST
1570 250D ;
1571 250D EAS
1572 250D A9 4C LDA #ATSTV ; GET APPLESOFT TEST VALUE
1573 250F 20 3B 25 JSR SWTST ; GO SWITCH AND TEST
1574 2512 F0 24 BEQ GOINIT ; GO SWITCH AND TEST
1575 2514 A9 00 LDA #0
1576 2516 8D F9 29 STA ASIBSW
1577 2519 ;
1578 2519 A0 1E LDY #30
1579 251B 20 26 20 JSR CLRFNA
1580 251E A2 09 LDX #FASBL
1581 2520 BD F9 29 EAS1 LDA FASB-1,X ; MOVE SYSTEM FILE NAME
1582 2523 9D B7 29 STA FNAME1-1,X
1583 2526 CA DEX
1584 2527 D0 F7 BNE EAS1
1585 2529 ;
1586 2529 A9 C0 LDA #$C0
1587 252B 8D 94 29 STA ISTATE ; FOR RAM APPLESOFT
1588 252E 4C 76 24 JMP ERUN ; GO LOAD AND RUN
1589 2531 ;
1590 2531 ; EINT <20> EXECUTE INTEGER REQUEST
1591 2531 ;
1592 2531 EINT
1593 2531 A9 20 LDA #ITSTV ; GET IB TEST VALUE
1594 2533 20 3B 25 JSR SWTST ; GO SWITCH AND RUN
1595 2536 D0 D5 BNE EAS ; BR IF NOT IB
1596 2538 GOINIT
1597 2538 4C 7E 1D JMP DBINIT ; GO INIT DOS
1598 253B SWTST
1599 253B CD 00 E0 CMP AITSTL ; TEST CURRENT VALUE
1600 253E F0 0E BEQ SWTR
1601 2540 8D 80 C0 STA $C080 ; TRY SWITCH 1
1602 2543 CD 00 E0 CMP AITSTL ; TEST AGAIN
1603 2546 F0 06 BEQ SWTR ; BR IF NOW SAME
1604 2548 8D 81 C0 STA $C081 ; TRY SWITCH 2
1605 254B CD 00 E0 CMP AITSTL ; TEST AND
1606 254E 60 SWTR RTS ; RETURN
1607 254F ;
Page 35 APPLE DOS 3.1
1608 254F PAGE
1609 254F ;
1610 254F ; EEXEC <20> EXEC CMD
1611 254F ;
1612 254F EEXEC
1613 254F 20 36 22 JSR EOPEN ; OPEN FILE
1614 2552 AD 92 29 LDA CFTABA
1615 2555 8D F7 29 STA EFTABA ; MOVE TABLE POINTERS
1616 2558 AD 93 29 LDA CFTABA+1
1617 255B 8D F8 29 STA EFTABA+1
1618 255E AD B8 29 LDA FNAME1 ;USE FILENAME
1619 2561 8D F6 29 STA ESTATE ; SET EX STATE NON ZERO
1620 2564 D0 0E BNE EXP2
1621 2566 ;
1622 2566 ;
1623 2566 ; EPOS <20> EXECUTE POSITION
1624 2566 ;
1625 2566 EPOS
1626 2566 20 C0 26 JSR FILSRC
1627 2569 90 06 BCC EXP1
1628 256B 20 36 22 JSR EOPEN
1629 256E 4C 74 25 JMP EXP2
1630 2571 20 AA 26 EXP1 JSR MVBUFP
1631 2574 EXP2
1632 2574 AD A8 29 LDA INOPTS ; GET OPTIONS
1633 2577 29 04 AND #R ; TEST R
1634 2579 F0 1B BEQ EX2 ; BR IF NOT R
1635 257B ;
1636 257B AD B1 29 EX0 LDA CR ; IF CR NOT ZERO
1637 257E D0 08 BNE EX1A ; THEN DECREMENT
1638 2580 AE B2 29 LDX CR+1
1639 2583 F0 11 BEQ EX2
1640 2585 CE B2 29 DEC CR+1
1641 2588 CE B1 29 EX1A DEC CR
1642 258B 20 F0 25 EX1 JSR RBYTE ; AND READ A RECORD
1643 258E F0 34 BEQ ICFD4
1644 2590 C9 8D CMP #$8D ; UNTIL CR
1645 2592 D0 F7 BNE EX1
1646 2594 F0 E5 BEQ EX0 ; THEN TEST CR AGAIN
1647 2596 ;
1648 2596 60 EX2 RTS ; DONE
Page 36 APPLE DOS 3.1
1649 2597 PAGE
1650 2597 ;
1651 2597 ; OCTD <20> OUTPUT A CHAR TO DISK
1652 2597 ;
1653 2597 OCTD
1654 2597 20 CF 25 JSR TSTRUN ;GO TEST RUN
1655 259A AD 9F 29 LDA SVA ;CHAR IN SAVED ACU
1656 259D 8D F7 34 STA CCBDAT ;PUT IN CCDBDATA AREA
1657 25A0 A9 04 LDA #CRQWR ;SET WRITE
1658 25A2 8D EF 34 STA CCBREQ
1659 25A5 A9 01 LDA #CRMNBT ;SET NEXT BYTE
1660 25A7 8D F0 34 STA CCBRQM
1661 25AA 4C 0C 26 JMP DOSGO ; GO WRITE BYTE
1662 25AD ;
1663 25AD ; INCFD <20> INPUT A CHAR FROM DISK
1664 25AD ;
1665 25AD INCFD
1666 25AD 20 CF 25 JSR TSTRUN ;GO TEST RUN
1667 25B0 A9 06 LDA #6 ;SET OUT STE = 6
1668 25B2 ICFD3
1669 25B2 8D 95 29 STA OSTATE ;TO CATCH ECHO
1670 25B5 20 F0 25 JSR RBYTE
1671 25B8 D0 0F BNE ICFD1 ;BR IF NOT ZERO CHAR
1672 25BA ;
1673 25BA 20 8B 22 JSR CLOSE
1674 25BD A9 03 LDA #3
1675 25BF CD 95 29 CMP OSTATE
1676 25C2 F0 08 BEQ ICFD0
1677 25C4 ICFD4
1678 25C4 A9 05 LDA #CREEOF
1679 25C6 4C 34 26 JMP ERROR ;GO TO ERROR
1680 25C9 ICFD1
1681 25C9 8D 9F 29 STA SVA ;PUT INTO SAVED ACU
1682 25CC ICFD0
1683 25CC 4C 50 1F JMP ORTN ;GO RESTORE REGS AND RTS
1684 25CF ;
1685 25CF TSTRUN
1686 25CF AD F9 29 LDA ASIBSW ;GET AS/INT BASIC SWITCH
1687 25D2 F0 05 BEQ TR1 ; BR IF INT
1688 25D4 A6 76 LDX $76 ;TEST AS RUN
1689 25D6 4C D5 3F JMP ASRWPAT ;AS READ/WRITE > LINE # 255 PATCH
1690 25D9 TR1
1691 25D9 A5 D9 LDA $D9 ;GET INT RUN FLAG
1692 25DB 30 2E BMI MVEFRT ; BR IF RUN
1693 25DD ICFDB ; NOT RUN MODE
1694 25DD 20 8B 22 JSR CLOSE ;GO CLOSE FILE
1695 25E0 20 B7 26 JSR CLRSTS ;GO CLEAR STATES
1696 25E3 4C 50 1F JMP ORTN
Page 37 APPLE DOS 3.1
1697 25E6 PAGE
1698 25E6 ;
1699 25E6 ; NXTEXC <20> NEXT EXECUTE CHAR
1700 25E6 ;
1701 25E6 NXTEXC
1702 25E6 20 01 26 JSR MVEFTA
1703 25E9 20 AA 26 JSR MVBUFP ; GO MOVE PTRS
1704 25EC A9 03 LDA #3
1705 25EE D0 C2 BNE ICFD3
1706 25F0 ;
1707 25F0 ; RBYTE <20> READ NEXT BYTE
1708 25F0 ;
1709 25F0 RBYTE
1710 25F0 A9 03 LDA #CRQRD ;SET READ
1711 25F2 8D EF 34 STA CCBREQ
1712 25F5 A9 01 LDA #CRMNBT ;SET NEXT BYTE
1713 25F7 8D F0 34 STA CCBRQM
1714 25FA 20 0C 26 JSR DOSGO ;GO TO DOS
1715 25FD AD F7 34 LDA CCBDAT ;GET THE DATA BYTE
1716 2600 60 RTS
1717 2601 MVEFTA
1718 2601 AD F8 29 LDA EFTABA+1 ; MOVE TABLE ADR
1719 2604 85 41 STA ZPGWRK+1 ; NO ZPG
1720 2606 AD F7 29 LDA EFTABA
1721 2609 85 40 STA ZPGWRK
1722 260B 60 MVEFRT RTS
Page 38 APPLE DOS 3.1
1723 260C PAGE
1724 260C ;
1725 260C ; DOSGO <20> GOTO DOS
1726 260C ;
1727 260C DOSGO
1728 260C 20 3F 2A JSR DOSENT ;GO TO DOS
1729 260F B0 01 BCS DG1 ;BR IF ERROR
1730 2611 60 RTS ;DONE
1731 2612 ;
1732 2612 DG1
1733 2612 AD F9 34 LDA CCBSTA ;GET STATUS OF I/O
1734 2615 C9 05 CMP #CREEOF ;EOF ?
1735 2617 D0 06 BNE DG2 ;BR IF NOT
1736 2619 A2 00 LDX #0 ;SET OTHER EIF
1737 261B 8E F7 34 STX CCBDAT ; DONE
1738 261E 60 RTS
1739 261F DG2
1740 261F 4C 34 26 JMP ERROR ;GO DO ERROR
1741 2622 ;
Page 39 APPLE DOS 3.1
1742 2622 PAGE
1743 2622 ;
1744 2622 ; ERROR ROUTINE
1745 2622 ;
1746 2622 A9 0B ESYNTX LDA #CREFLK+1
1747 2624 D0 0E BNE ERROR
1748 2626 A9 0C ENFA LDA #CREFLK+2
1749 2628 D0 0A BNE ERROR
1750 262A A9 0E MFERR LDA #CREFLK+4
1751 262C D0 06 BNE ERROR
1752 262E A9 0D ERNUl LDA #CREFLK+3
1753 2630 D0 02 BNE ERROR
1754 2632 A9 0F ENBF LDA #CREFLK+5
1755 2634 ;
1756 2634 ERROR
1757 2634 8D 9F 29 STA SVA ;SAVE MSG NUMBER
1758 2637 20 B7 26 JSR CLRSTS
1759 263A AD F9 29 LDA ASIBSW ;GET AS/IN BASIC SWITCH
1760 263D F0 04 BEQ ERNAS ;BR IF NOT APPLESOFT
1761 263F A5 D8 LDA $D8 ;GET ON ERR FLAG
1762 2641 30 10 BMI ERRTN ;BRT IF ON ERR IS GO
1763 2643 ERNAS
1764 2643 A2 00 LDX #0
1765 2645 20 5E 26 JSR EMPR ;GO OUTPUT
1766 2648 AE 9F 29 LDX SVA ;GET SAVE MSG
1767 264B 20 5E 26 JSR EMPR ;GO OUTPUT MSG
1768 264E A2 10 LDX #CREFLK+6
1769 2650 20 5E 26 JSR EMPR
1770 2653 20 AD 27 ERRTN JSR MVCSW ;GO MOVE CHAR I/O SW
1771 2656 AE 9F 29 LDX SVA
1772 2659 A9 03 LDA #03
1773 265B 6C 5A 1D JMP (BREAK)
1774 265E ;
1775 265E EMPR
1776 265E BD 81 29 LDA EMDTB,X ;GET ITS DISPL
1777 2661 AA TAX ;INTO X
1778 2662 EMPR1
1779 2662 8E A6 29 STX TEMP1A ;SAVE DISPL
1780 2665 BD CD 28 LDA EMSG,X ;GET MSG CHAR
1781 2668 48 PHA ;SAVE CHAR
1782 2669 09 80 ORA #$80 ;SET MSB ON
1783 266B 20 61 1F JSR ORTN1 ;OUTPUT CHAR
1784 266E AE A6 29 LDX TEMP1A ;GET INDEX
1785 2671 E8 INX ;INCREMENT IT
1786 2672 68 PLA ;RE-LOAD CHAR
1787 2673 10 ED BPL EMPR1 ;BR IF MORE CHARS
1788 2675 60 RTS ;DONE
Page 40 APPLE DOS 3.1
1789 2676 PAGE
1790 2676 ;
1791 2676 ; OPNSUP <20> OPEN SET UP
1792 2676 ;
1793 2676 OPNSUP
1794 2676 AD A9 29 LDA CV ;VOLUME
1795 2679 8D F3 34 STA CCBVOL
1796 267C AD AB 29 LDA CD ;DRIVE
1797 267F 8D F4 34 STA CCBDRV
1798 2682 AD AD 29 LDA CS ;SLOT
1799 2685 8D F5 34 STA CCBSLT
1800 2688 AD 06 1D LDA FN1ADR ;FILENAME 1 ADR
1801 268B 8D F7 34 STA CCBFN1
1802 268E AD 07 1D LDA FN1ADR+1
1803 2691 8D F8 34 STA CCBFN1+1
1804 2694 A5 40 LDA ZPGWRK
1805 2696 8D 92 29 STA CFTABA
1806 2699 A5 41 LDA ZPGWRK+1
1807 269B 8D 93 29 STA CFTABA+1
1808 269E 60 RTS
1809 269F ;
1810 269F ; MVFN1 <20> MOVE FILE NAME 1 TO FILE PTR
1811 269F ;
1812 269F MVFN1
1813 269F A0 1D LDY #29
1814 26A1 B9 B8 29 MVFN1A LDA FNAME1,Y
1815 26A4 91 40 STA (ZPGWRK),Y
1816 26A6 88 DEY
1817 26A7 10 F8 BPL MVFN1A
1818 26A9 60 RTS
1819 26AA ;
1820 26AA ; MVBUFP <20> MOVE BUFFER PTRS TO CCB
1821 26AA ;
1822 26AA MVBUFP
1823 26AA A0 1E LDY #30
1824 26AC B1 40 MVBP1 LDA (ZPGWRK),Y
1825 26AE 99 DD 34 STA CCBFCB-30,Y
1826 26B1 C8 INY
1827 26B2 C0 26 CPY #38
1828 26B4 D0 F6 BNE MVBP1
1829 26B6 60 RTS
1830 26B7 ;
1831 26B7 ; CLRSTS <20> CLEAR STATES
1832 26B7 ;
1833 26B7 CLRSTS
1834 26B7 A0 00 LDY #0
1835 26B9 8C 94 29 STY ISTATE
1836 26BC 8C 95 29 STY OSTATE
1837 26BF 60 RTS
Page 41 APPLE DOS 3.1
1838 26C0 PAGE
1839 26C0 ;
1840 26C0 ; FILSRC <20> SEARCH FOR FILE NAME1
1841 26C0 ;
1842 26C0 FILSRC
1843 26C0 A9 00 LDA #0 ;CLEAR SV AVAIL
1844 26C2 85 45 STA CNUM+1
1845 26C4 ;
1846 26C4 20 EE 26 JSR TSINIT ;GO INIT SEARCH
1847 26C7 4C CF 26 JMP FLS1A
1848 26CA 20 F6 26 FLS1 JSR TSNXT ;LOOK AT NEXT
1849 26CD F0 1D BEQ FLS4 ;BR IF NO NEXT
1850 26CF ;
1851 26CF 20 06 27 FLS1A JSR TSTOPN ;GO TEST OPEN
1852 26D2 D0 0A BNE FLS2 ;BR IF OPEN
1853 26D4 ;
1854 26D4 A5 40 LDA ZPGWRK ;SAVE AVAIL ENTRY ADR
1855 26D6 85 44 STA CNUM
1856 26D8 A5 41 LDA ZPGWRK+1
1857 26DA 85 45 STA CNUM+1
1858 26DC D0 EC BNE FLS1 ;GO LOOK SOME MORE
1859 26DE ;
1860 26DE A0 1D FLS2 LDY #29 ; FILE HAD 30 CHARS
1861 26E0 B1 40 FLS3 LDA (ZPGWRK),Y ;GET CHAR
1862 26E2 D9 B8 29 CMP FNAME1,Y ;TEST CHAR
1863 26E5 D0 E3 BNE FLS1 ;BR NOT
1864 26E7 88 DEY
1865 26E8 10 F6 BPL FLS3 ; LOOK AT 30 CHARS
1866 26EA 18 CLC ;FOUND
1867 26EB 60 RTS ;DONE
1868 26EC ;
1869 26EC 38 FLS4 SEC ;NOT FOUND
1870 26ED 60 RTS ;DONE
Page 42 APPLE DOS 3.1
1871 26EE PAGE
1872 26EE ;
1873 26EE ; TSINIT <20> INITIALIZE FOR FTAB SEARCH
1874 26EE ; TSNXT <20> GET NEXT FTAB ENTRY
1875 26EE ;
1876 26EE TSINIT
1877 26EE AD 00 1D LDA FTAB ;GET 1ST PTR ADR
1878 26F1 AE 01 1D LDX FTAB+1
1879 26F4 D0 0A BNE TSST
1880 26F6 TSNXT
1881 26F6 A0 25 LDY #37 ; GET LINK
1882 26F8 B1 40 LDA (ZPGWRK),Y
1883 26FA F0 09 BEQ TSR ;BR IF NO LINK
1884 26FC ;
1885 26FC AA TAX
1886 26FD 88 DEY
1887 26FE B1 40 LDA (ZPGWRK),Y
1888 2700 TSST
1889 2700 86 41 STX ZPGWRK+1
1890 2702 85 40 STA ZPGWRK
1891 2704 8A TXA ;SET NE CC
1892 2705 60 TSR RTS
1893 2706 ;
1894 2706 ; TSTOPN <20> TST FOR OPEN FILE
1895 2706 ;
1896 2706 TSTOPN
1897 2706 A0 00 LDY #0 ;GET 1ST CHAR OF FN
1898 2708 B1 40 LDA (ZPGWRK),Y
1899 270A 60 RTS
1900 270B ;
1901 270B ; TSTEXC <20> TEST CURRENT FILE FOR EXECUTE
1902 270B ;
1903 270B TSTEXC
1904 270B AD F6 29 LDA ESTATE ; IF ESTATE = 0
1905 270E F0 0E BEQ TXC1 ; THEN NO EXECUTE FILE
1906 2710 AD F7 29 LDA EFTABA ; TEST CURRENT
1907 2713 C5 40 CMP ZPGWRK
1908 2715 D0 08 BNE TXC2 ; IS NOT
1909 2717 AD F8 29 LDA EFTABA+1
1910 271A C5 41 CMP ZPGWRK+1
1911 271C F0 01 BEQ TXC2 ; IS
1912 271E CA TXC1 DEX ; IS NOT
1913 271F 60 TXC2 RTS ; DONE
Page 43 APPLE DOS 3.1
1914 2720 PAGE
1915 2720 ;
1916 2720 ; TSTFUC <20> TEST FILE USE CODE FOR PGM
1917 2720 ;
1918 2720 TSTFUC
1919 2720 4D F6 34 EOR CCBFUC
1920 2723 F0 0A BEQ TFUCR
1921 2725 29 7F AND #$7F
1922 2727 F0 06 BEQ TFUCR
1923 2729 20 78 22 JSR ECLOSE ; GO CLOSE THE SOB
1924 272C 4C 2E 26 JMP ERNUl
1925 272F 60 TFUCR RTS
Page 44 APPLE DOS 3.1
1926 2730 PAGE
1927 2730 ;
1928 2730 ; BLDFTB <20> BUILD FILE TABLES
1929 2730 ; TABLE MAP:
1930 2730 ; HIMEM,SOP
1931 2730 ; SBUFF N (256)
1932 2730 ; DBUFF N (256)
1933 2730 ; FTB N (FCBLEN)
1934 2730 ; HEADER N (38)
1935 2730 ;
1936 2730 ;
1937 2730 ; SBUFF 1
1938 2730 ; DBUFF 1
1939 2730 ; FTB 1
1940 2730 ; HEADER 1
1941 2730 ; THIS PROGRAM
1942 2730 ;
1943 2730 ; HEADER MAP:
1944 2730 ; FILENAME (30)
1945 2730 ; FTB PTR (2)
1946 2730 ; DBUF PTR (2)
1947 2730 ; SBUF PTR (2)
1948 2730 ; LINK (2)
1949 2730 ;
1950 2730 BLDFTB
1951 2730 38 SEC
1952 2731 AD 00 1D LDA FTAB ;START OF FTAB AREA
1953 2734 85 40 STA ZPGWRK ;IS 1ST FTB PTR
1954 2736 AD 01 1D LDA FTAB+1 ;HEADER
1955 2739 85 41 STA ZPGWRK+1
1956 273B AD 9A 29 LDA CNFTBS ;MOVE NO FTABS
1957 273E 8D A6 29 STA TEMP1A ;TO TEMP
1958 2741 ;
1959 2741 A0 00 BFT1 LDY #0
1960 2743 98 TYA
1961 2744 91 40 STA (ZPGWRK),Y ;1ST CHAR FN=0
1962 2746 A0 1E LDY #30 ; INC Y TO FCB PTR
1963 2748 38 SEC
1964 2749 A5 40 LDA ZPGWRK ;END OF PTR HEADER
1965 274B E9 2D SBC #FCBLEN ;MINUS FTAB LENGTH
1966 274D 91 40 STA (ZPGWRK),Y ;IS START OF FTB
1967 274F 48 PHA ;SAVE LOW ADR BYTE
1968 2750 A5 41 LDA ZPGWRK+1
1969 2752 E9 00 SBC #0
1970 2754 C8 INY
1971 2755 91 40 STA (ZPGWRK),Y
1972 2757 AA TAX
1973 2758 CA DEX ;FTB ADR <20> 256
1974 2759 68 PLA ;IS ADR DIR BUFF
1975 275A 48 PHA
1976 275B C8 INY
1977 275C 91 40 STA (ZPGWRK),Y ;SET DIR BUF PTR
1978 275E 8A TXA
1979 275F C8 INY
1980 2760 91 40 STA (ZPGWRK),Y
1981 2762 AA TAX
1982 2763 CA DEX ;DIR BUFF - 256
1983 2764 68 PLA ;IS SBUFF ADR
1984 2765 48 PHA
1985 2766 C8 INY
1986 2767 91 40 STA (ZPGWRK),Y
1987 2769 C8 INY
1988 276A 8A TXA
1989 276B 91 40 STA (ZPGWRK),Y
1990 276D ;
1991 276D CE A6 29 DEC TEMP1A ;DECREMENT TABLE INDEX
1992 2770 F0 17 BEQ BFT2 ;COUNT AND BR IF DONE
1993 2772 AA TAX
1994 2773 68 PLA
1995 2774 38 SEC
1996 2775 E9 26 SBC #38 ; SBUFF ADR - 38
1997 2777 C8 INY
1998 2778 91 40 STA (ZPGWRK),Y ;IF ADR OF NEXT TAB
1999 277A 48 PHA ;WHICH GOES INTO
2000 277B 8A TXA ;LINK
2001 277C E9 00 SBC #0
2002 277E C8 INY
2003 277F 91 40 STA (ZPGWRK),Y
2004 2781 85 41 STA ZPGWRK+1 ;AND INTO ZPGWRK
2005 2783 68 PLA ;FOR NEXT ENTRY
2006 2784 85 40 STA ZPGWRK ;BUILD
2007 2786 4C 41 27 JMP BFT1 ;GO BUILD NEXT
2008 2789 ;
2009 2789 BFT2
2010 2789 48 PHA
2011 278A A9 00 LDA #0 ;SET LAST LINK
2012 278C C8 INY ;TO ZERO
2013 278D 91 40 STA (ZPGWRK),Y
2014 278F C8 INY
2015 2790 91 40 STA (ZPGWRK),Y
2016 2792 ;
2017 2792 AD F9 29 LDA ASIBSW ;IF IB THEN GO
2018 2795 F0 0B BEQ BFT1B
2019 2797 ;
2020 2797 68 PLA ; SET APPLESOFT
2021 2798 85 74 STA ASHM1+1 ; UPPER MEM LIMITS
2022 279A 85 70 STA ASHM2+1
2023 279C 68 PLA
2024 279D 85 73 STA ASHM1
2025 279F 85 6F STA ASHM2
2026 27A1 60 RTS
2027 27A2 ;
2028 27A2 BFT1B
2029 27A2 68 PLA ; SET IB
2030 27A3 85 4D STA IBHMEM+1 ; UPPER MEM LIMITS
2031 27A5 85 CB STA IBSOP+1
2032 27A7 68 PLA
2033 27A8 85 4C STA IBHMEM
2034 27AA 85 CA STA IBSOP
2035 27AC 60 RTS
Page 45 APPLE DOS 3.1
2036 27AD PAGE
2037 27AD ;
2038 27AD ; MVISW <20> MOVE INPUT SWITCH
2039 27AD ;
2040 27AD MVCSW
2041 27AD A5 39 LDA INSW+1
2042 27AF CD 03 1D CMP CINA+1
2043 27B2 F0 12 BEQ MVOSW
2044 27B4 8D 99 29 STA SVINS+1
2045 27B7 A5 38 LDA INSW ;SAVE CHAR IN SWITCH
2046 27B9 8D 98 29 STA SVINS
2047 27BC ;
2048 27BC AD 02 1D LDA CINA ;SET DB CHAR IN ADR
2049 27BF 85 38 STA INSW
2050 27C1 AD 03 1D LDA CINA+1
2051 27C4 85 39 STA INSW+1
2052 27C6 ;
2053 27C6 ;
2054 27C6 ; MVOSW <20> MOVE OUTPUT SWITCH
2055 27C6 ;
2056 27C6 MVOSW
2057 27C6 A5 37 LDA OUTSW+1
2058 27C8 CD 05 1D CMP COUTA+1
2059 27CB F0 12 BEQ MVSRTN
2060 27CD 8D 97 29 STA SVOUTS+1
2061 27D0 A5 36 LDA OUTSW ;SAVE CHAR OUT SWITCH
2062 27D2 8D 96 29 STA SVOUTS
2063 27D5 ;
2064 27D5 AD 04 1D LDA COUTA ;SET DB CHAR OUT ADR
2065 27D8 85 36 STA OUTSW
2066 27DA AD 05 1D LDA COUTA+1
2067 27DD 85 37 STA OUTSW+1
2068 27DF MVSRTN
2069 27DF 60 RTS
Page 46 APPLE DOS 3.1
2070 27E0 PAGE
2071 27E0 ;
2072 27E0 ; COMMAND NAME TABLE
2073 27E0 ;
2074 27E0 EC1
2075 27E0 CMDNTB
2076 27E0 49 4E 49 D4 DB01 "INIT"
2077 27E4 4C 4F 41 C4 DB01 "LOAD"
2078 27E8 53 41 56 C5 DB01 "SAVE"
2079 27EC 52 55 CE DB01 "RUN"
2080 27EF 43 48 41 49 DB01 "CHAIN"
2080 27F3 CE
2081 27F4 44 45 4C 45 DB01 "DELETE"
2081 27F8 54 C5
2082 27FA 4C 4F 43 CB DB01 "LOCK"
2083 27FE 55 4E 4C 4F DB01 "UNLOCK"
2083 2802 43 CB
2084 2804 43 4C 4F 53 DB01 "CLOSE"
2084 2808 C5
2085 2809 52 45 41 C4 DB01 "READ"
2086 280D 45 58 45 C3 DB01 "EXEC"
2087 2811 57 52 49 54 DB01 "WRITE"
2087 2815 C5
2088 2816 50 4F 53 49 DB01 "POSITION"
2088 281A 54 49 4F CE
2089 281E 4F 50 45 CE DB01 "OPEN"
2090 2822 41 50 50 45 DB01 "APPEND"
2090 2826 4E C4
2091 2828 52 45 4E 41 DB01 "RENAME"
2091 282C 4D C5
2092 282E 43 41 54 41 DB01 "CATALOG"
2092 2832 4C 4F C7
2093 2835 4D 4F CE DB01 "MON"
2094 2838 4E 4F 4D 4F DB01 "NOMON"
2094 283C CE
2095 283D 50 52 A3 DB01 "PR#"
2096 2840 49 4E A3 DB01 "IN#"
2097 2843 4D 41 58 46 DB01 "MAXFILES"
2097 2847 49 4C 45 D3
2098 284B 46 D0 DB01 "FP"
2099 284D 49 4E D4 DB01 "INT"
2100 2850 42 53 41 56 DB01 "BSAVE"
2100 2854 C5
2101 2855 42 4C 4F 41 DB01 "BLOAD"
2101 2859 C4
2102 285A 42 52 55 CE DB01 "BRUN"
2103 285E 56 45 52 49 DB01 "VERIFY"
2103 2862 46 D9
2104 2864 00 DB 0
Page 47 APPLE DOS 3.1
2105 2865 PAGE
2106 2865 ;
2107 2865 ; COMMAND SYNTAX OP EQUATES FOR SYNTAX BYTE ONE
2108 2865 ;
2109 2865 NPB EQU $80 ;NO PARMS OK, COMMAND GOES TO BASIC
2110 2865 NPE EQU $40 ;NO PARMS OK, COMMAND TO EXECUTION RTN
2111 2865 FN1 EQU $20 ;FILE NAME1 REGD
2112 2865 FN2 EQU $10 ;FILE NAME2 REGD
2113 2865 NUM1 EQU $08 ;NUMERIC 0-7 REGD
2114 2865 NUM2 EQU $04 ;NUMERIC 1-10 REGD
2115 2865 ;
2116 2865 ; COMMAND SYNTAX OP EQUATES FOR SYNTAX BYTE TWO
2117 2865 ;
2118 2865 V EQU $40 ;VOLUME ALLOWED
2119 2865 D EQU $20 ;DRIVE ALLOWED
2120 2865 S EQU $10 ;SLOT ALLOWED
2121 2865 L EQU $08 ;LENGTH ALLOWED
2122 2865 R EQU $04 ;RECORD NUMBER ALLOWED
2123 2865 B EQU $02 ;BYTE NUMBER ALLOWED
2124 2865 A EQU $01 ; ADDRESS
2125 2865 CIO EQU $80 ;C,I, OR O ALLOWED
2126 2865 ;
2127 2865 ; COMMAND SYNTAX TABLE
2128 2865 ; EACH COMMAND HAS TWO BYTE ENTRY
2129 2865 ;
2130 2865 CMDSTB
2131 2865 20 70 DB FN1,V+D+S ; INIT
2132 2867 A0 70 DB NPB+FN1,V+D+S ;LOAD
2133 2869 A0 70 DB NPB+FN1,V+D+S ;SAVE
2134 286B A0 70 DB NPB+FN1,V+D+S ;RUN
2135 286D 20 70 DB FN1,V+D+S ;CHAIN
2136 286F 20 70 DB FN1,V+D+S ;DELETE
2137 2871 20 70 DB FN1,V+D+S ;LOCK
2138 2873 20 70 DB FN1,V+D+S ;UNLOCK
2139 2875 60 00 DB NPE+FN1,0 ;CLOSE
2140 2877 20 06 DB FN1,B+R ;READ
2141 2879 20 74 DB FN1,R+V+D+S ; EXEC
2142 287B 20 06 DB FN1,B+R ;WRITE
2143 287D 20 04 DB FN1,R ;POSITION
2144 287F 20 78 DB FN1,L+V+D+S ;OPEN
2145 2881 20 78 DB FN1,L+V+D+S ; APPEND
2146 2883 30 70 DB FN1+FN2,V+D+S ;RENAME
2147 2885 40 70 DB NPE,V+D+S ;CATALOG
2148 2887 40 80 DB NPE,CIO ;MONITOR
2149 2889 40 80 DB NPE,CIO ;NO MONITOR
2150 288B 08 00 DB NUM1,0 ;PR#
2151 288D 08 00 DB NUM1,0 ;IN#
2152 288F 04 00 DB NUM2,0 ;MAXFILES
2153 2891 40 70 DB NPE,V+D+S ;APPLESOFT
2154 2893 40 00 DB NPE,0 ; INT
2155 2895 20 79 DB FN1,V+D+S+A+L ; BSAVE
2156 2897 20 71 DB FN1,V+D+S+A ; BLOAD
2157 2899 20 71 DB FN1,V+D+S+A ; BRUN
2158 289B 20 70 DB FN1,V+D+S ; VERIFY
Page 48 APPLE DOS 3.1
2159 289D PAGE
2160 289D ;
2161 289D ; OPTAB <20> OPTIONAL PARMS SYNTAX TABLES
2162 289D ;
2163 289D OPTAB1
2164 289D D6 C4 D3 CC DB11 "VDSLRBACIO"
2164 28A1 D2 C2 C1 C3
2164 28A5 C9 CF
2165 28A7 OPT1L EQU *-OPTAB1
2166 28A7 OPTAB2
2167 28A7 40 20 10 08 DB V,D,S,L,R,B,A,CIO+MC,CIO+MI,CIO+MO
2167 28AB 04 02 01 C0
2167 28AF A0 90
2168 28B1 OPTAB3
2169 28B1 00 00 FE 00 DW @@0,254 ;VOL RANGE
2170 28B5 01 00 02 00 DW @@1,@@2 ;DRIVE RANGE
2171 28B9 01 00 07 00 DW @@1,@@7 ;SLOT RANGE
2172 28BD 01 00 FF 7F DW @@1,32767 ;LENGTH RANGE
2173 28C1 00 00 FF 7F DW @@0,32767 ;REC NO RANGE
2174 28C5 00 00 FF 7F DW @@0,32767 ;REC BYTE NO RANGE
2175 28C9 00 00 00 C0 DW @@0,@@$C000 ;ADDRESS RANGE
Page 49 APPLE DOS 3.1
2176 28CD PAGE
2177 28CD ;
2178 28CD ; ERROR MESSAGE TABLES
2179 28CD ;
2180 28CD EMSG
2181 28CD 0D 07 DB $0D,$07
2182 28CF 2A 2A 2A 44 DB01 "***DISK: "
2182 28D3 49 53 4B 3A
2182 28D7 A0
2183 28D8 EM1 EQU *-EMSG
2184 28D8 EM2 EQU *-EMSG
2185 28D8 EM3 EQU *-EMSG
2186 28D8 53 59 D3 DB01 "SYS"
2187 28DB EM4 EQU *-EMSG
2188 28DB 57 52 49 54 DB01 "WRITE PROTECT"
2188 28DF 45 20 50 52
2188 28E3 4F 54 45 43
2188 28E7 D4
2189 28E8 EM5 EQU *-EMSG
2190 28E8 45 4E 44 20 DB01 "END OF DATA"
2190 28EC 4F 46 20 44
2190 28F0 41 54 C1
2191 28F3 EM6 EQU *-EMSG
2192 28F3 46 49 4C 45 DB01 "FILE NOT FOUND"
2192 28F7 20 4E 4F 54
2192 28FB 20 46 4F 55
2192 28FF 4E C4
2193 2901 EM7 EQU *-EMSG
2194 2901 56 4F 4C 55 DB01 "VOLUME MISMATCH"
2194 2905 4D 45 20 4D
2194 2909 49 53 4D 41
2194 290D 54 43 C8
2195 2910 EM8 EQU *-EMSG
2196 2910 44 49 53 4B DB01 "DISK I/O"
2196 2914 20 49 2F CF
2197 2918 EM9 EQU *-EMSG
2198 2918 44 49 53 4B DB01 "DISK FULL"
2198 291C 20 46 55 4C
2198 2920 CC
2199 2921 EM10 EQU *-EMSG
2200 2921 46 49 4C 45 DB01 "FILE LOCKED"
2200 2925 20 4C 4F 43
2200 2929 4B 45 C4
2201 292C EM11 EQU *-EMSG
2202 292C 43 4D 44 20 DB01 "CMD SYNTAX"
2202 2930 53 59 4E 54
2202 2934 41 D8
2203 2936 EM12 EQU *-EMSG
2204 2936 4E 4F 20 46 DB01 "NO FILE BUFFS AVAIL"
2204 293A 49 4C 45 20
2204 293E 42 55 46 46
2204 2942 53 20 41 56
2204 2946 41 49 CC
2205 2949 EM13 EQU *-EMSG
2206 2949 4E 4F 54 20 DB01 "NOT BASIC PROGRAM"
2206 294D 42 41 53 49
2206 2951 43 20 50 52
2206 2955 4F 47 52 41
2206 2959 CD
2207 295A EM14 EQU *-EMSG
2208 295A 50 52 4F 47 DB01 "PROGRAM TOO LARGE"
2208 295E 52 41 4D 20
2208 2962 54 4F 4F 20
2208 2966 4C 41 52 47
2208 296A C5
2209 296B EM15 EQU *-EMSG
2210 296B 4E 4F 54 20 DB01 "NOT BINARY FILE"
2210 296F 42 49 4E 41
2210 2973 52 59 20 46
2210 2977 49 4C C5
2211 297A ;
2212 297A EML EQU *-EMSG
2213 297A 20 45 52 52 DB " ERROR"
2213 297E 4F 52
2214 2980 8D DB $8D
2215 2981 EMDTB
2216 2981 00 0B 0B 0B DB 0,EM1,EM2,EM3,EM4
2216 2985 0E
2217 2986 1B 26 34 43 DB EM5,EM6,EM7,EM8,EM9
2217 298A 4B
2218 298B 54 5F 69 7C DB EM10,EM11,EM12,EM13,EM14
2218 298F 8D
2219 2990 9E AD DB EM15,EML
Page 50 APPLE DOS 3.1
2220 2992 PAGE
2221 2992 ;
2222 2992 ; MISC BUT REQD CELLS
2223 2992 ;
2224 2992 2D 18 CFTABA DW @@$182D ;CURRENT FILE TABLE POINTER
2225 2994 00 ISTATE DB $00 ;INPUT STATE
2226 2995 03 OSTATE DB $03 ;OUTPUT STATE
2227 2996 F0 FD SVOUTS DW @@$FDF0 ;SAVED OUT SWITCH
2228 2998 1B FD SVINS DW @@$FD1B ;SAVED IN SWITCH
2229 299A 03 CNFTBS DB $03 ;CURRENT NO FILE TABLES
2230 299B 03 DFNFTB DB $03 ;DEFAULT NO FILE TABLES
2231 299C F7 SVSTK DB $F7 ;SAVED STACK PTR
2232 299D 00 SVX DB $00 ;DSAVED X REG
2233 299E 01 SVY DB $01 ;SAVED Y REG
2234 299F A0 SVA DB $A0 ;SAVED ACU
2235 29A0 0E LBUFD DB $0E ;LINE BUFF DSPL
2236 29A1 70 MONMOD DB $70 ;MONITOR MODE BITS
2237 29A2 MC EQU $40 ;MONITOR CMDS
2238 29A2 MI EQU $20 ;MONITOR INPUT
2239 29A2 MO EQU $10 ;MONITOR OUTPUT
2240 29A2 20 CMDNO DB $20 ;COMMAND NO
2241 29A3 00 00 SVBL DB 0,0
2242 29A5 00 SVCMD DB 0
2243 29A6 06 TEMP1A DB $06
2244 29A7 01 TEMP2A DB 1
2245 29A8 30 INOPTS DB $30 ;INPUT OPTIONS
2246 29A9 CUROPT ;CURRENT OPTIONS
2247 29A9 10 00 CV DW @@$10 ;VOLUME
2248 29AB 01 00 CD DW @@1 ;DRIVE
2249 29AD 07 00 CS DW @@7 ;SLOT
2250 29AF 01 00 CL DW @@1 ;RECORD LENGTH
2251 29B1 00 00 CR DW @@0 ;RECORD NUMBER
2252 29B3 00 00 CB DW @@0 ;RECORD BYTE
2253 29B5 00 00 CA DW @@0 ;ADDRESS
2254 29B7 00 IMBITS DB 0
2255 29B8 FNAME1 RMB 30 ;FILENAME 1
2256 29D6 FNAME2 RMB 30 ;FILENAME 2
2257 29F4 03 DFNFTS DB 3 ;DEFAULT FILE TABLES = 3
2258 29F5 84 CCHAR DB $84 ;CONTROL CHAR
2259 29F6 00 ESTATE DB 0 ;EXECUTE STATE
2260 29F7 00 00 EFTABA DB 0,0 ;EXECUTE FILE TABLE POINTER
2261 29F9 00 ASIBSW DB 0 ;APPLESOFT, IB SWITCH
2262 29FA C1 D0 D0 CC FASB DB11 "APPLESOFT"
2262 29FE C5 D3 CF C6
2262 2A02 D4
2263 2A03 FASBL EQU *-FASB
Page 51 APPLE DOS 3.1
2264 2A03 PAGE
2265 2A03 ;
2266 2A03 ; DOS ADR TABLES (RELOCATED)
2267 2A03 ;
2268 2A03 SAT2
2269 2A03 E8 37 AIOB DW @@IOB ;5-ADR IOB
2270 2A05 EF 32 AVTOC DW @@VTOC ;6-ADR VTOC
2271 2A07 EF 33 AVOLDR DW @@VOLDIR ;7-ADR VOLDIR
2272 2A09 00 40 AEND DW @@EDOS ;END OF DOS
2273 2A0B ;
2274 2A0B BA 32 CMDVT DW @@GOODIO-1 ;0-NULL
2275 2A0D 5A 2A DW @@FOPEN-1 ;1-OPEN FILE
2276 2A0F 22 2B DW @@FCLOSE-1 ;2-CLOSE FILE
2277 2A11 74 2B DW @@FREAD-1 ;3-READ FILE
2278 2A13 8C 2B DW @@FWRITE-1 ;4-WRITE DATA
2279 2A15 4A 2C DW @@FDEL-1 ;5-DELETE FILE
2280 2A17 B7 2C DW @@RDIR-1 ;6-READ DIRECTORY
2281 2A19 0B 2C DW @@FLOCK-1 ;7-LOCK A FILE
2282 2A1B 12 2C DW @@FUNLCK-1 ;8-UNLOCK A FILE
2283 2A1D 56 2B DW @@FRNME-1 ;9-RENAME
2284 2A1F 2E 2C DW @@FPOSTN-1 ;10-POSITION A FILE
2285 2A21 AC 2D DW @@FFMT-1 ;FORMAT
2286 2A23 34 2C DW @@FVAR-1 ; VARIFY
2287 2A25 BA 32 DW @@GOODIO-1 ;11-SPARE
2288 2A27 ;
2289 2A27 RVT
2290 2A27 BA 32 DW @@GOODIO-1
2291 2A29 A6 2B DW @@RNXBYT-1 ;1-RD NEXT BYTE
2292 2A2B B2 2B DW @@RNXBLK-1 ;1-RD NEXT BLOCK
2293 2A2D A3 2B DW @@RSPBYT-1 ;2-RD SPECIFIC BYTE
2294 2A2F AF 2B DW @@RSPBLK-1 ;3-RD SPECIFIC BLOCK
2295 2A31 BA 32 DW @@GOODIO-1 ;4-SPARE
2296 2A33 ;
2297 2A33 WVT
2298 2A33 BA 32 DW @@GOODIO-1
2299 2A35 DA 2B DW @@WNXBYT-1 ;1-WR NEXT BYTE
2300 2A37 E6 2B DW @@WNXBLK-1 ;WR NEXT BLOCK
2301 2A39 D7 2B DW @@WSPBYT-1 ;2-WR SPECIFIC BYTE
2302 2A3B E3 2B DW @@WSPBLK-1 ;3-WR SPECIFIC BLOCK
2303 2A3D BA 32 DW @@GOODIO-1 ;4- SPARE
2304 2A3F EAT2
Page 52 APPLE DOS 3.1
2305 2A3F PAGE
2306 2A3F ;
2307 2A3F ; DOSENT <20> DOS EXTERNAL ENTRY POINT
2308 2A3F ; EXIT PARM
2309 2A3F ; CARRY CLEAR = OPERATION OK
2310 2A3F ; CARRY SET = ERROR
2311 2A3F ;
2312 2A3F SC2
2313 2A3F DOSENT
2314 2A3F BA TSX
2315 2A40 8E D3 32 STX ENTSTK
2316 2A43 20 89 2D JSR CLCFCB ;GO CALCULATE FCB
2317 2A46 AD EF 34 LDA CCBREQ ;GET REQUEST
2318 2A49 C9 0D CMP #CRQMAX ;TTEST REQ RANGE
2319 2A4B B0 0B BCS ERR2 ;BR OUT OF RANGE
2320 2A4D 0A ASLA ;REQ CODE *2
2321 2A4E AA TAX
2322 2A4F BD 0C 2A LDA CMDVT+1,X ;PUSH ADR ONTO STACK
2323 2A52 48 PHA
2324 2A53 BD 0B 2A LDA CMDVT,X
2325 2A56 48 PHA
2326 2A57 60 RTS
2327 2A58 4C 9F 32 ERR2 JMP ERROR2
Page 53 APPLE DOS 3.1
2328 2A5B PAGE
2329 2A5B ;
2330 2A5B ; FOPEN <20> OPEN A FILE
2331 2A5B ;
2332 2A5B FOPEN
2333 2A5B 20 61 2A JSR DOPEN
2334 2A5E 4C BB 32 JMP GOODIO
2335 2A61 ;
2336 2A61 DOPEN
2337 2A61 ;
2338 2A61 20 F9 2A JSR DCBSUP
2339 2A64 ;
2340 2A64 ;
2341 2A64 A9 01 LDA #1
2342 2A66 8D 17 35 STA DCBSDL+1
2343 2A69 AE F2 34 LDX CCBRLN+1 ;MOVE RECORD LENGTH
2344 2A6C AD F1 34 LDA CCBRLN
2345 2A6F D0 05 BNE FO2
2346 2A71 E0 00 CPX #0
2347 2A73 D0 01 BNE FO2
2348 2A75 E8 INX ;SET RL=256
2349 2A76 8D 1C 35 FO2 STA DCBRCL
2350 2A79 8E 1D 35 STX DCBRCL+1
2351 2A7C ;
2352 2A7C 20 05 31 JSR FNDFIL ;GO FIND FILE
2353 2A7F 90 45 BCC FO3 ;BR IF FOUND
2354 2A81 ; ;CREATE FILE
2355 2A81 A9 00 LDA #0
2356 2A83 9D 1C 34 STA VDFILE+34,X
2357 2A86 A9 01 LDA #1
2358 2A88 9D 1B 34 STA VDFILE+33,X
2359 2A8B 8E D4 32 STX TEMP1 ;SAVE VDIR INDEX
2360 2A8E 8E 0D 35 STX DCBVDI
2361 2A91 20 80 31 JSR GETSEC ;GO ALLOCATE SECTOR
2362 2A94 AE D4 32 LDX TEMP1
2363 2A97 9D FB 33 STA VDFILE+1,X ;PUT SECTOR INTO VDIR
2364 2A9A 8D 06 35 STA DCBFDS ;PUT SECTOR AS FIRST FILE DIR
2365 2A9D 8D 08 35 STA DCBCDS ;PUT SECTOR AS CURRENT FILE DIR
2366 2AA0 ;
2367 2AA0 AD 25 35 LDA DCBATK ;GET ALLOCATED TRACK
2368 2AA3 9D FA 33 STA VDFILE,X ;PUT INTO VDIR
2369 2AA6 8D 05 35 STA DCBFDT ;AND AS 1ST FILE DIR
2370 2AA9 8D 07 35 STA DCBCDT ;AND AS CURRENT FILE DIR
2371 2AAC ;
2372 2AAC AD F6 34 LDA CCBFUC ;SET USE CODE
2373 2AAF 9D FC 33 STA VDFILE+2,X ;INTO DIRECTORY
2374 2AB2 ;
2375 2AB2 20 73 2F JSR WRVDIR ;GO WRITE VOL DIRECTORY
2376 2AB5 ;
2377 2AB5 20 3F 2E JSR MVFCBD ;MOVE FILE DIR ADR TO ZP
2378 2AB8 20 50 2E JSR CLRSEC ;GO CLEAR IT
2379 2ABB 20 76 2E JSR WRFDGO ;GO WRITE FILE DIRECTORY DONE CREATION
2380 2ABE ; DONE CREATION
2381 2ABE AE D4 32 LDX TEMP1 ;RE-GET INDEX
2382 2AC1 A9 06 LDA #CREFNF
2383 2AC3 8D F9 34 STA CCBSTA
2384 2AC6 ;
2385 2AC6 FO3
2386 2AC6 BD FA 33 LDA VDFILE,X ;MOVE FILE DIR TRACK
2387 2AC9 8D 05 35 STA DCBFDT
2388 2ACC BD FB 33 LDA VDFILE+1,X ;MOVE FILE DIR SECTOR
2389 2ACF 8D 06 35 STA DCBFDS
2390 2AD2 BD FC 33 LDA VDFILE+2,X ;MOVE FILE USE CODE
2391 2AD5 8D F6 34 STA CCBFUC
2392 2AD8 8D 2A 35 STA DCBFUC
2393 2ADB BD 1B 34 LDA VDFILE+33,X
2394 2ADE 8D 22 35 STA DCBNSA
2395 2AE1 BD 1C 34 LDA VDFILE+34,X
2396 2AE4 8D 23 35 STA DCBNSA+1
2397 2AE7 ;
2398 2AE7 A9 FF LDA #255 ;INDICATE NO SECTOR
2399 2AE9 8D 14 35 STA DCBCMS ;IN MEMORY
2400 2AEC 8D 15 35 STA DCBCMS+1
2401 2AEF AD 16 33 LDA VTDMS ;MOVE MAX FD SECS
2402 2AF2 8D 0E 35 STA DCBDMS ;TO DCB
2403 2AF5 18 CLC
2404 2AF6 4C 9A 2E JMP RDFDIR ; READ 1ST DIRECTORY RECORD
2405 2AF9 ;
2406 2AF9 ;
2407 2AF9 ;
2408 2AF9 ;
2409 2AF9 DCBSUP
2410 2AF9 A9 00 LDA #0
2411 2AFB AA TAX
2412 2AFC 9D 05 35 FO1 STA FCBDCB,X ;CLEAR DCB
2413 2AFF E8 INX
2414 2B00 E0 2D CPX #DCBLEN
2415 2B02 D0 F8 BNE FO1
2416 2B04 ;
2417 2B04 AD F3 34 LDA CCBVOL ;MOVE VOL
2418 2B07 49 FF EOR #$FF ;INVERT VOL BITS
2419 2B09 8D 2D 35 STA DCBVOL
2420 2B0C AD F4 34 LDA CCBDRV ;MOVE DRIVE
2421 2B0F 8D 2C 35 STA DCBDRV
2422 2B12 AD F5 34 LDA CCBSLT ;GET USER SPEC SLOT
2423 2B15 0A ASLA ;SLOT*16
2424 2B16 0A ASLA
2425 2B17 0A ASLA
2426 2B18 0A ASLA
2427 2B19 AA TAX
2428 2B1A 8E 2B 35 STX DCBSLT
2429 2B1D A9 11 LDA #17
2430 2B1F 8D 2E 35 STA DCBVTN
2431 2B22 60 RTS
Page 54 APPLE DOS 3.1
2432 2B23 PAGE
2433 2B23 ;
2434 2B23 ; FCLOSE <20> CLOSE A FILE
2435 2B23 ;
2436 2B23 FCLOSE
2437 2B23 20 59 2E JSR WRSECT ;WRITE OPEN SECTOR
2438 2B26 20 70 2E JSR WRFDIR ;GO WRITE FILE DIRECTORY
2439 2B29 20 FF 31 JSR FRETRK ;FREE UNUSED SECTORS
2440 2B2C A9 02 LDA #IBCWTS
2441 2B2E 2D 09 35 AND DCBWRF
2442 2B31 F0 21 BEQ FC2
2443 2B33 ;
2444 2B33 20 33 2F JSR RDVTOC ; READ VTOC
2445 2B36 A9 00 LDA #0
2446 2B38 18 CLC
2447 2B39 FC1
2448 2B39 20 4D 2F JSR RDVDIR ; READ VDIR
2449 2B3C 38 SEC
2450 2B3D CE 0C 35 DEC DCBVDR
2451 2B40 D0 F7 BNE FC1 ; BR IF NOT
2452 2B42 AE 0D 35 LDX DCBVDI ; GET FILES INDEX
2453 2B45 AD 22 35 LDA DCBNSA ; MOVE NO SECTIONS ALLOCATED
2454 2B48 9D 1B 34 STA VDFILE+33,X
2455 2B4B AD 23 35 LDA DCBNSA+1
2456 2B4E 9D 1C 34 STA VDFILE+34,X
2457 2B51 20 73 2F JSR WRVDIR ; WRITE VOL DIR REC
2458 2B54 ;
2459 2B54 ;
2460 2B54 FC2
2461 2B54 4C BB 32 JMP GOODIO ;DONE
Page 55 APPLE DOS 3.1
2462 2B57 PAGE
2463 2B57 ;
2464 2B57 ; FRNME <20> RENAME A FILE
2465 2B57 ;
2466 2B57 FRNME
2467 2B57 20 61 2A JSR DOPEN ;GO OPEN FILE
2468 2B5A AD 2A 35 LDA DCBFUC ;GET USE CODE
2469 2B5D 30 2B BMI ER10 ;BR IF LOCKED
2470 2B5F AD F1 34 LDA CCBFN2 ;MOVE NEW FN
2471 2B62 85 42 STA ZPGFCB ;PTR TO ZPG
2472 2B64 AD F2 34 LDA CCBFN2+1
2473 2B67 85 43 STA ZPGFCB+1
2474 2B69 AE D4 32 LDX TEMP1 ;GET VDIR INDEX
2475 2B6C 20 58 31 JSR MVFN ;GO MOVE FILE NAME
2476 2B6F 20 73 2F JSR WRVDIR ;GO WRITE FILE VDIR
2477 2B72 4C BB 32 JMP GOODIO ;DONE RENAME
Page 56 APPLE DOS 3.1
2478 2B75 PAGE
2479 2B75 ;
2480 2B75 ; FREAD <20> READ A FILE
2481 2B75 ;
2482 2B75 FREAD
2483 2B75 ;
2484 2B75 AD F0 34 LDA CCBRQM ;GET REQ MOD
2485 2B78 C9 05 CMP #CRMMAX ;TEST LIMIT
2486 2B7A B0 0B BCS ERR3A
2487 2B7C ;
2488 2B7C 0A ASLA ;CODE*2
2489 2B7D AA TAX
2490 2B7E BD 28 2A LDA RVT+1,X ;GET READ ROUTINE
2491 2B81 48 PHA ;VECTOR ADR
2492 2B82 BD 27 2A LDA RVT,X
2493 2B85 48 PHA ;AND
2494 2B86 60 RTS ;GO TO IT
2495 2B87 ;
2496 2B87 4C A3 32 ERR3A JMP ERROR3
2497 2B8A 4C B7 32 ER10 JMP ERRR10
2498 2B8D ;
2499 2B8D ; FWRITE <20> WRITE A FILE
2500 2B8D ;
2501 2B8D FWRITE
2502 2B8D AD 2A 35 LDA DCBFUC ;IS FILE LOCKED
2503 2B90 30 F8 BMI ER10 ;BR IF LOCKED
2504 2B92 AD F0 34 LDA CCBRQM ;GET REQ MOD
2505 2B95 C9 05 CMP #CRMMAX ;IN RANGE
2506 2B97 B0 EE BCS ERR3A ;BR IF NOT IN RANGE
2507 2B99 ;
2508 2B99 0A ASLA
2509 2B9A AA TAX
2510 2B9B BD 34 2A LDA WVT+1,X ;GET ROUTINE ADR
2511 2B9E 48 PHA
2512 2B9F BD 33 2A LDA WVT,X
2513 2BA2 48 PHA
2514 2BA3 60 RTS ;AND GO TO IT
Page 57 APPLE DOS 3.1
2515 2BA4 PAGE
2516 2BA4 ;
2517 2BA4 ; RSPBYT <20> READ A SPECIFIC BYTE
2518 2BA4 ;
2519 2BA4 RSPBYT
2520 2BA4 20 3C 32 JSR LOCSEC ;GO GET REQD REL SECTOR
2521 2BA7 ;
2522 2BA7 ; RNXBYT <20> READ NEXT BYTE
2523 2BA7 ;
2524 2BA7 20 C5 2B RNXBYT JSR GETBYT ;GO GET BYTE
2525 2BAA 8D F7 34 STA CCBDAT ;PUT IN CCB
2526 2BAD 4C BB 32 JMP GOODIO ;DONE
2527 2BB0 ;
2528 2BB0 ; RSPBLK <20> READ A SPECIFIC BLOCK
2529 2BB0 ;
2530 2BB0 20 3C 32 RSPBLK JSR LOCSEC ;GO LOCATE REL SECTOR
2531 2BB3 ;
2532 2BB3 ; RNXBLK <20> READ NEXT BLOCK
2533 2BB3 ;
2534 2BB3 RNXBLK
2535 2BB3 20 F1 30 JSR DTBLN ;GO DECR LEN (NOT RTN IF=0)
2536 2BB6 20 C5 2B JSR GETBYT ;GO GET BYTE
2537 2BB9 48 PHA
2538 2BBA 20 DE 30 JSR MIBDA ;GO MOVE BLOCK ADR AND INCR
2539 2BBD A0 00 LDY #0
2540 2BBF 68 PLA
2541 2BC0 91 42 STA (ZPGFCB),Y ;SET DATA BYTE
2542 2BC2 4C B3 2B JMP RNXBLK ;GO FOR NEXT BYTE
2543 2BC5 ;
2544 2BC5 ; GETBYT <20> GET A DATA BYTE
2545 2BC5 ;
2546 2BC5 GETBYT
2547 2BC5 20 F2 2F JSR LOCNXB ;LOCATE NEXT BYTE
2548 2BC8 B0 0B BCS EOFIN ;BR IF EOF
2549 2BCA B1 42 LDA (ZPGFCB),Y ;BR IF EOF
2550 2BCC 48 PHA ;SAVE IT
2551 2BCD 20 97 30 JSR INCRRB ;INCR REC BYTE
2552 2BD0 20 D0 30 JSR INCSCB ;INCR SAVED BYTE
2553 2BD3 68 PLA ;GET SAVED BYTE
2554 2BD4 60 RTS ;RETURN
2555 2BD5 ;
2556 2BD5 4C AB 32 EOFIN JMP ERROR5 ;GO TO EOF RTN
Page 58 APPLE DOS 3.1
2557 2BD8 PAGE
2558 2BD8 ;
2559 2BD8 ; WSPBYT <20> WRITE SPECIFIC BYTE
2560 2BD8 ;
2561 2BD8 WSPBYT
2562 2BD8 20 3C 32 JSR LOCSEC ;GO LOCATE SECTOR
2563 2BDB ;
2564 2BDB ; WNXBYT <20> WRITE NEXT BYTE
2565 2BDB ;
2566 2BDB WNXBYT
2567 2BDB AD F7 34 LDA CCBDAT ;GET THE BYTE
2568 2BDE 20 F7 2B JSR PUTBYT ;GO WRITE BYTE
2569 2BE1 4C BB 32 JMP GOODIO ;DONE
2570 2BE4 ;
2571 2BE4 ; WSPBLK <20> WRITE NEXT BLOCK
2572 2BE4 ;
2573 2BE4 WSPBLK
2574 2BE4 20 3C 32 JSR LOCSEC ;GO LOCATE SECTOR
2575 2BE7 ;
2576 2BE7 ; WNXBLK <20> WRITE BLOCK
2577 2BE7 ;
2578 2BE7 WNXBLK
2579 2BE7 20 DE 30 JSR MIBDA ;GO MOVE ADR TO ZPG AND DEC
2580 2BEA A0 00 LDY #0
2581 2BEC B1 42 LDA (ZPGFCB),Y ;GET DATA BYTE
2582 2BEE 20 F7 2B JSR PUTBYT ;GO PUT IT
2583 2BF1 20 F1 30 JSR DTBLN ;GO DEC BLK LEN (NOT RTN IF = 0)
2584 2BF4 4C E7 2B JMP WNXBLK
2585 2BF7 ;
2586 2BF7 ; PUTBYT <20> PUT OUT ONE BYTE
2587 2BF7 ;
2588 2BF7 PUTBYT
2589 2BF7 48 PHA ;SAVE DATA BYTE
2590 2BF8 20 F2 2F JSR LOCNXB ;GO LOCATE NEXT BYTE
2591 2BFB ;
2592 2BFB 68 PLA ;GO SAVED BYTE
2593 2BFC 91 42 STA (ZPGFCB),Y ;PUT THE BYTE
2594 2BFE A9 40 LDA #$40 ;SET WRITE SECTOR REQD
2595 2C00 0D 09 35 ORA DCBWRF
2596 2C03 8D 09 35 STA DCBWRF
2597 2C06 ;
2598 2C06 20 97 30 JSR INCRRB ;INCR REL REC BYTE
2599 2C09 4C D0 30 JMP INCSCB ; INCR SECTOR BYTE
Page 59 APPLE DOS 3.1
2600 2C0C PAGE
2601 2C0C ;
2602 2C0C ; FLOCK <20> LOCK A FILE
2603 2C0C ;
2604 2C0C A9 80 FLOCK LDA #$80 ;REMEMBER LOCK
2605 2C0E 8D D6 32 STA TEMP3
2606 2C11 D0 05 BNE LCKGO
2607 2C13 ;
2608 2C13 ; FUNLCK <20> UNLOCK A FILE
2609 2C13 ;
2610 2C13 A9 00 FUNLCK LDA #00 ;REMEMBER UNLOCK
2611 2C15 8D D6 32 STA TEMP3
2612 2C18 ;
2613 2C18 LCKGO
2614 2C18 ;
2615 2C18 20 61 2A JSR DOPEN ;GO OPEN FILE
2616 2C1B AE D4 32 LDX TEMP1
2617 2C1E BD FC 33 LDA VDFILE+2,X ;GET FILE USE CODE
2618 2C21 29 7F AND #$7F ;TURN OFF LOCK
2619 2C23 0D D6 32 ORA TEMP3
2620 2C26 9D FC 33 STA VDFILE+2,X
2621 2C29 20 73 2F JSR WRVDIR
2622 2C2C 4C BB 32 JMP GOODIO
2623 2C2F ;
2624 2C2F ; FPOSTN <20> POSITION A FILE
2625 2C2F 20 3C 32 FPOSTN JSR LOCSEC ;GO POSITION
2626 2C32 4C BB 32 JMP GOODIO ;DONE
2627 2C35 ;
2628 2C35 ;
2629 2C35 ; FVAR <20> VARIFY A FILE
2630 2C35 ;
2631 2C35 FVAR
2632 2C35 20 61 2A JSR DOPEN ; OPEN FILE
2633 2C38 20 F2 2F VAR1 JSR LOCNXB ; READ A SECTOR
2634 2C3B B0 0B BCS VAR2 ; BR IF EOF
2635 2C3D EE 18 35 INC DCBCRS ; INCREMENT SECTOR
2636 2C40 D0 F6 BNE VAR1
2637 2C42 EE 19 35 INC DCBCRS+1
2638 2C45 4C 38 2C JMP VAR1 ; READ THIS ONE
2639 2C48 4C BB 32 VAR2 JMP GOODIO ; DONE
Page 60 APPLE DOS 3.1
2640 2C4B PAGE
2641 2C4B ;
2642 2C4B ; FDEL <20> DELETE A FILE
2643 2C4B ;
2644 2C4B FDEL
2645 2C4B 20 61 2A JSR DOPEN ;GO OPEN FILE
2646 2C4E ;
2647 2C4E AE D4 32 LDX TEMP1 ;SAVED INDEX
2648 2C51 BD FC 33 LDA VDFILE+2,X ;IS FILE LOCKED
2649 2C54 10 03 BPL FD3 ;BR NOT LOCKED
2650 2C56 4C B7 32 JMP ERRR10
2651 2C59 ;
2652 2C59 FD3
2653 2C59 AE D4 32 LDX TEMP1 ;GET SAVED INDEX
2654 2C5C BD FA 33 LDA VDFILE,X ;GET DIR TRACK
2655 2C5F 8D 05 35 STA DCBFDT ;SET AS 1ST FD TRACK
2656 2C62 9D 1A 34 STA VDFILE+32,X ;SAVE IN LC OF FN
2657 2C65 A9 FF LDA #$FF ;DELETED FILE MARKER
2658 2C67 9D FA 33 STA VDFILE,X ;CLEAR ENTRY
2659 2C6A BC FB 33 LDY VDFILE+1,X ;GET DIR SECTOR
2660 2C6D 8C 06 35 STY DCBFDS ;SET AS 1ST FD SEC
2661 2C70 20 73 2F JSR WRVDIR ;GO WRITE VOLUME DIR
2662 2C73 18 CLC
2663 2C74 20 9A 2E FD4 JSR RDFDIR ;GET 1ST FILE DIR SECTOR
2664 2C77 B0 2A BCS FD7 ;BR IF NO MORE
2665 2C79 20 3F 2E JSR MVFCBD ;MOVE DIR TO ZPG
2666 2C7C A0 0C LDY #FDENT ;POINT Y TO 1ST SEC ENT
2667 2C7E 8C D4 32 FD5 STY TEMP1 ;SAVE Y
2668 2C81 B1 42 LDA (ZPGFCB),Y ;GET REACK
2669 2C83 30 0B BMI FD6 ;BR IF DONE
2670 2C85 F0 09 BEQ FD6 ;BR IF END OF FILE
2671 2C87 48 PHA ;SAVE TRK
2672 2C88 C8 INY
2673 2C89 B1 42 LDA (ZPGFCB),Y ;GET SECTOR
2674 2C8B A8 TAY ;TO Y
2675 2C8C 68 PLA ;GET TRK
2676 2C8D 20 A9 2C JSR FDSUB ;GO FREE SECTOR
2677 2C90 AC D4 32 FD6 LDY TEMP1 ;GET DIR INDEX
2678 2C93 C8 INY ;INCR TO NEXT ENTRY
2679 2C94 C8 INY
2680 2C95 D0 E7 BNE FD5 ;BR NOT DONE THIS DIR
2681 2C97 AD 07 35 LDA DCBCDT ;GET THIS DIR TRK
2682 2C9A AC 08 35 LDY DCBCDS ;AND SECTOR
2683 2C9D 20 A9 2C JSR FDSUB ;AND GO FREE IT
2684 2CA0 38 SEC ;GO
2685 2CA1 B0 D1 BCS FD4 ;READ NEXT DIR
2686 2CA3 FD7
2687 2CA3 20 37 2F JSR WRVTOC
2688 2CA6 4C BB 32 JMP GOODIO
2689 2CA9 ;
2690 2CA9 FDSUB
2691 2CA9 38 SEC ;SET FOR RE USE OF SEC
2692 2CAA 20 19 32 JSR FRESEC ;GO FREE SECTOR
2693 2CAD A9 00 LDA #0 ;CLEAR DCB BIT MAP
2694 2CAF A2 03 LDX #3
2695 2CB1 9D 24 35 FDS1 STA DCBALS,X
2696 2CB4 CA DEX
2697 2CB5 10 FA BPL FDS1
2698 2CB7 60 RTS
Page 61 APPLE DOS 3.1
2699 2CB8 PAGE
2700 2CB8 ;
2701 2CB8 ; RDIR <20> PRINT DIRECTORY
2702 2CB8 ;
2703 2CB8 RDIR
2704 2CB8 20 F9 2A JSR DCBSUP
2705 2CBB A9 FF LDA #$FF
2706 2CBD 8D 2D 35 STA DCBVOL
2707 2CC0 20 33 2F JSR RDVTOC
2708 2CC3 A9 16 LDA #22 ; SET 21 LINES
2709 2CC5 8D D5 32 STA TEMP2
2710 2CC8 20 4E 2D JSR PRCR ;GO PRINT
2711 2CCB 20 4E 2D JSR PRCR ; PRINT ANOTHER CHAR
2712 2CCE A2 0B LDX #VML ; VOLUME MSG LENGTH
2713 2CD0 BD E3 32 RD0 LDA VOLMES,X ; GET MSG CHAR
2714 2CD3 20 ED FD JSR PRINT ; PRINT IT
2715 2CD6 CA DEX ; DECREMENT COUNT
2716 2CD7 10 F7 BPL RD0 ; BR IF MORE
2717 2CD9 ;
2718 2CD9 86 45 STX CNUM+1
2719 2CDB AD F6 37 LDA IBSMOD ; MOVE VOL NO FOR
2720 2CDE 85 44 STA CNUM ; CONVERSION
2721 2CE0 20 61 2D JSR PRNUM ; GO PRINT VOL NO
2722 2CE3 ;
2723 2CE3 20 4E 2D JSR PRCR ; PRINT CR
2724 2CE6 20 4E 2D JSR PRCR ; AND AGAIN
2725 2CE9 ;
2726 2CE9 18 CLC ;FIRST RECORD
2727 2CEA ;
2728 2CEA 20 4D 2F RD1 JSR RDVDIR ;GO READ REC
2729 2CED B0 5C BCS RD5
2730 2CEF A2 00 LDX #0 ;SET INDEX=0
2731 2CF1 8E D4 32 RD2 STX TEMP1 ;SAVE INDEX
2732 2CF4 BD FA 33 LDA VDFILE,X ;GET TRACK
2733 2CF7 F0 52 BEQ RD5 ;BR IF END OF DIR
2734 2CF9 30 49 BMI RD4 ;BR IF DELETED
2735 2CFB ;
2736 2CFB A0 A0 LDY #$A0 ; BLANK
2737 2CFD BD FC 33 LDA VDFILE+2,X ; GET TYPE
2738 2D00 10 02 BPL RD2A ; BR IF NOT LOCKED
2739 2D02 A0 AA LDY #'*'+$80 ; AST
2740 2D04 98 RD2A TYA ; ACU = AST OR BLANK
2741 2D05 20 ED FD JSR PRINT ; PRINT ACU
2742 2D08 ;
2743 2D08 BD FC 33 LDA VDFILE+2,X ; GET TYPE
2744 2D0B 29 07 AND #$07 ; MASK OUT MISC
2745 2D0D A0 03 LDY #3 ; SET INDEX = 3
2746 2D0F 4A RD2B LSRA ; SHIFT OUT LSB
2747 2D10 B0 03 BCS RD2C ;BR IF TYPE BIT OUT
2748 2D12 88 DEY ; DEC INDEX
2749 2D13 D0 FA BNE RD2B ; BR IF NOT ACC BITS
2750 2D15 RD2C
2751 2D15 B9 DF 32 LDA FTTAB,Y ; GET TYPE CODE
2752 2D18 20 ED FD JSR PRINT ; PRINT IT
2753 2D1B A9 A0 LDA #$A0 ; BLANK
2754 2D1D 20 ED FD JSR PRINT ; PRINT
2755 2D20 ;
2756 2D20 BD 1B 34 LDA VDFILE+33,X ; MOVE FILE LENGTH
2757 2D23 85 44 STA CNUM ; TO CNUM
2758 2D25 BD 1C 34 LDA VDFILE+34,X
2759 2D28 85 45 STA CNUM+1
2760 2D2A 20 61 2D JSR PRNUM ; GO PRINT NUMBER
2761 2D2D A9 A0 LDA #$A0 ; BLANK
2762 2D2F 20 ED FD JSR PRINT ; PRINT
2763 2D32 ;
2764 2D32 E8 INX
2765 2D33 E8 INX
2766 2D34 E8 INX
2767 2D35 A0 1D LDY #29
2768 2D37 BD FA 33 RD3 LDA VDFILE,X ;GET CHAR
2769 2D3A 20 ED FD JSR PRINT ;PRINT CHAR
2770 2D3D E8 INX
2771 2D3E 88 DEY
2772 2D3F 10 F6 BPL RD3
2773 2D41 20 4E 2D JSR PRCR ;GO PRINT CR
2774 2D44 20 6C 31 RD4 JSR VDINC ;INCR INDEX
2775 2D47 90 A8 BCC RD2 ;BR IF MORE IN DIR
2776 2D49 B0 9F BCS RD1 ;GO READ NEXT DIR SECT
2777 2D4B ;
2778 2D4B 4C BB 32 RD5 JMP GOODIO ;DONE
2779 2D4E ;
2780 2D4E PRCR
2781 2D4E A9 8D LDA #$8D ;CR
2782 2D50 20 ED FD JSR PRINT ;PRINTED
2783 2D53 CE D5 32 DEC TEMP2 ;DEC LINE COUNTER
2784 2D56 D0 08 BNE PRCR1 ;BR IF NOT ZERO
2785 2D58 20 0C FD JSR GETKEY ;WAIT FOR INPUT
2786 2D5B A9 15 LDA #21 ; RESET LINE COUNTER
2787 2D5D 8D D5 32 STA TEMP2
2788 2D60 60 PRCR1 RTS ;DONE
Page 62 APPLE DOS 3.1
2789 2D61 PAGE
2790 2D61 PRNUM
2791 2D61 A0 02 LDY #2 ; 3 DIGITS
2792 2D63 A9 00 PRN1 LDA #0 ; INIT DIGIT TO ZERO
2793 2D65 48 PHA ; SAVE IT
2794 2D66 ;
2795 2D66 A5 44 PRN2 LDA CNUM ; GET NUMBER
2796 2D68 D9 DC 32 CMP CVTAB,Y ; IF NUM < CVTAB ENTRY
2797 2D6B 90 12 BCC PRN3 ; THEN DONE THIS DIGIT
2798 2D6D ;
2799 2D6D F9 DC 32 SBC CVTAB,Y ; SUBTRACT TABLE ENTRY
2800 2D70 85 44 STA CNUM ; FROM NUM
2801 2D72 A5 45 LDA CNUM+1
2802 2D74 E9 00 SBC #0
2803 2D76 85 45 STA CNUM+1
2804 2D78 68 PLA ; INCREMENT DIGIT
2805 2D79 69 00 ADC #0
2806 2D7B 48 PHA
2807 2D7C 4C 66 2D JMP PRN2 ; TRY AGAIN
2808 2D7F ;
2809 2D7F PRN3
2810 2D7F 68 PLA ; GET DIGIT
2811 2D80 09 B0 ORA #$B0 ; ADD ASCII
2812 2D82 20 ED FD JSR PRINT ; PRINT IT
2813 2D85 88 DEY ; DECREMENT DIGIT COUNT
2814 2D86 10 DB BPL PRN1 ; BR IF MORE DIGIT
2815 2D88 ;
2816 2D88 60 RTS ; DONE
Page 63 APPLE DOS 3.1
2817 2D89 PAGE
2818 2D89 ;
2819 2D89 ; CLCFCB <20> GET FCB VIA INDEX AND MOVE IT
2820 2D89 ;
2821 2D89 CLCFCB
2822 2D89 ;
2823 2D89 20 3B 2E JSR MVFCBP ;MOVE FCB PTR TO ZPG
2824 2D8C A0 00 LDY #0
2825 2D8E 8C F9 34 STY CCBSTA
2826 2D91 B1 42 CF3 LDA (ZPGFCB),Y ;MOVE FCB TO
2827 2D93 99 05 35 STA FCBB,Y ;FCB WORK AREA
2828 2D96 C8 INY
2829 2D97 C0 2D CPY #FCBLEN
2830 2D99 D0 F6 BNE CF3
2831 2D9B ;
2832 2D9B 18 CLC ;DONE
2833 2D9C 60 RTS
2834 2D9D ;
2835 2D9D ; RTNFCB <20> MOVE FCB FROM WORK AREA TO FCB
2836 2D9D ;
2837 2D9D RTNFCB
2838 2D9D 20 3B 2E JSR MVFCBP ;MOVE FCB ADR TO ZPG
2839 2DA0 ;
2840 2DA0 A0 00 LDY #0
2841 2DA2 B9 05 35 RF1 LDA FCBB,Y
2842 2DA5 91 42 STA (ZPGFCB),Y
2843 2DA7 C8 INY
2844 2DA8 C0 2D CPY #FCBLEN
2845 2DAA D0 F6 BNE RF1
2846 2DAC 60 RTS
Page 64 APPLE DOS 3.1
2847 2DAD PAGE
2848 2DAD ;
2849 2DAD ; FFMT <20> EXECUTE FORMAT REQUEST
2850 2DAD ;
2851 2DAD FFMT
2852 2DAD 20 F9 2A JSR DCBSUP ; SET UP DCB
2853 2DB0 A9 04 LDA #IBFMT
2854 2DB2 20 94 2F JSR DCBIO2
2855 2DB5 AD 2D 35 LDA DCBVOL ; SET VOL NO
2856 2DB8 49 FF EOR #$FF
2857 2DBA 8D F5 32 STA VVOLNO
2858 2DBD A9 11 LDA #17
2859 2DBF 8D 1F 33 STA VALCA1 ; ALOCATE BYTE 1
2860 2DC2 A9 01 LDA #1
2861 2DC4 8D 20 33 STA VALCA2 ; ADD BYTE 2
2862 2DC7 ;
2863 2DC7 A2 38 LDX #VSECAL-VTOC
2864 2DC9 A9 00 LDA #0
2865 2DCB 9D EF 32 NT1 STA VTOC,X ; CLEAR SECTOR AREA
2866 2DCE E8 INX
2867 2DCF D0 FA BNE NT1
2868 2DD1 ;
2869 2DD1 A2 0C LDX #3*4 ;START AT TRACK 3
2870 2DD3 E0 8C NT2 CPX #35*4 ; END AT TRACK 35
2871 2DD5 F0 14 BEQ NT4
2872 2DD7 A0 03 LDY #3 ; 4 BYTES OF INFO
2873 2DD9 B9 D8 32 NT3 LDA ALC10S,Y ; 10 SECTORS ALLOCATE
2874 2DDC 9D 27 33 STA VSECAL,X
2875 2DDF E8 INX
2876 2DE0 88 DEY
2877 2DE1 10 F6 BPL NT3
2878 2DE3 E0 44 CPX #17*4 ; AT TRACK 17
2879 2DE5 D0 EC BNE NT2 ; BR IF NOT
2880 2DE7 A2 48 LDX #18*4 ; SKIP TO 18
2881 2DE9 D0 E8 BNE NT2
2882 2DEB ;
2883 2DEB 20 37 2F NT4 JSR WRVTOC ; WRITE NEW VTOC
2884 2DEE ;
2885 2DEE A2 00 LDX #0
2886 2DF0 8A TXA
2887 2DF1 9D EF 33 NT5 STA VOLDIR,X ; CLEAR VOLDIR
2888 2DF4 E8 INX
2889 2DF5 D0 FA BNE NT5
2890 2DF7 ;
2891 2DF7 20 81 2F JSR MVVDBA ; MOVE BUF PTRS
2892 2DFA ;
2893 2DFA A9 11 LDA #17 ; TRACK 17
2894 2DFC AC 24 33 LDY VNOSEC
2895 2DFF 88 DEY
2896 2E00 88 DEY
2897 2E01 8D EC 37 STA IBTRK ; INTO IOB
2898 2E04 8D F0 33 NT6 STA VDLTRK ; INTO LINK
2899 2E07 8C F1 33 NT7 STY VDLSEC
2900 2E0A C8 INY
2901 2E0B 8C ED 37 STY IBSECT
2902 2E0E A9 02 LDA #IBCWTS
2903 2E10 20 94 2F JSR DCBIO2
2904 2E13 AC F1 33 LDY VDLSEC
2905 2E16 88 DEY ; DECREMENT SECTOR
2906 2E17 30 05 BMI NT8 ; BR LAST WRITTEN
2907 2E19 D0 EC BNE NT7 ; BR NOT LAST
2908 2E1B 98 TYA ; LAST, SET LINK TRK=0
2909 2E1C F0 E6 BEQ NT6
2910 2E1E ;
2911 2E1E NT8
2912 2E1E 20 27 2E JSR DLDSUP ; GO SET UP FOR DOSLDR
2913 2E21 20 4A 37 JSR WBOOT ;GO WRITE THE BOOT
2914 2E24 4C BB 32 JMP GOODIO ; DONE
Page 65 APPLE DOS 3.1
2915 2E27 PAGE
2916 2E27 ;
2917 2E27 ; DLDSUP <20> SET UP FOR DOSLDR
2918 2E27 ;
2919 2E27 DLDSUP
2920 2E27 AD F0 34 LDA CCBBSA
2921 2E2A 8D F1 37 STA IBBUFP+1 ; START ADR
2922 2E2D A9 00 LDA #0
2923 2E2F 8D F0 37 STA IBBUFP
2924 2E32 AD 2D 35 LDA DCBVOL ; VOL
2925 2E35 49 FF EOR #$FF
2926 2E37 8D EB 37 STA IBVOL
2927 2E3A 60 RTS
Page 66 APPLE DOS 3.1
2928 2E3B PAGE
2929 2E3B ;
2930 2E3B ; MVFCBX <20> MOVE FCB ADRS TO ZPGFCB
2931 2E3B ;
2932 2E3B A2 00 MVFCBP LDX #0 ;MOVE FCB ADR
2933 2E3D F0 06 BEQ MVF1
2934 2E3F A2 02 MVFCBD LDX #2 ;MOVE FCB DIR BUFF
2935 2E41 D0 02 BNE MVF1
2936 2E43 A2 04 MVFCBS LDX #4 ;MOVE FCB SECTOR BUFF
2937 2E45 ;
2938 2E45 MVF1
2939 2E45 BD FB 34 LDA CFCBAD,X ;DO THE MOVE
2940 2E48 85 42 STA ZPGFCB
2941 2E4A BD FC 34 LDA CFCBAD+1,X
2942 2E4D 85 43 STA ZPGFCB+1
2943 2E4F 60 RTS
2944 2E50 ;
2945 2E50 ; CLRSEC <20> CLEAR SECTOR
2946 2E50 ;
2947 2E50 CLRSEC
2948 2E50 A9 00 LDA #0
2949 2E52 A8 TAY
2950 2E53 91 42 CS1 STA (ZPGFCB),Y
2951 2E55 C8 INY
2952 2E56 D0 FB BNE CS1
2953 2E58 60 RTS
Page 67 APPLE DOS 3.1
2954 2E59 PAGE
2955 2E59 ;
2956 2E59 ; WRSECT <20> WRITE CURRENT SECTOR IF REQD
2957 2E59 ;
2958 2E59 WRSECT
2959 2E59 2C 09 35 BIT DCBWRF ;GET WRITE REQD FLAG
2960 2E5C 70 01 BVS WRSGO ;BR IF WRITE SECTOR REQD
2961 2E5E 60 RTS ;RTS
2962 2E5F ;
2963 2E5F WRSGO
2964 2E5F 20 20 2F JSR MVSBA ;GO MOVE SECT BUFF ADR
2965 2E62 ;
2966 2E62 A9 02 LDA #IBCWTS ;GET COMMAND
2967 2E64 20 8E 2F JSR DCBIO ;GO FILL IN IOB AND DO IO
2968 2E67 ;
2969 2E67 A9 BF LDA #$BF ;SET WRITE SECTOR REQD BIT OFF
2970 2E69 2D 09 35 AND DCBWRF
2971 2E6C 8D 09 35 STA DCBWRF
2972 2E6F 60 RTS ;DONE
Page 68 APPLE DOS 3.1
2973 2E70 PAGE
2974 2E70 ;
2975 2E70 ; WRFDIR <20> WRITE FILE DIRECTORY IF REQD
2976 2E70 ;
2977 2E70 WRFDIR
2978 2E70 AD 09 35 LDA DCBWRF ;GET WRITE REQD FLAG
2979 2E73 30 01 BMI WRFDGO ;BR IF WRITE DIR REQD
2980 2E75 60 RTS ;DONE IF NOT
2981 2E76 ;
2982 2E76 WRFDGO
2983 2E76 20 87 2E JSR MVFDBA
2984 2E79 ;
2985 2E79 A9 02 LDA #IBCWTS ;GET WRITE CMD
2986 2E7B 20 8E 2F JSR DCBIO ;GO FILL IN IOB AND DO I/O
2987 2E7E ;
2988 2E7E A9 7F LDA #$7F ;TURN WRITE DIR REQD BIT OFF
2989 2E80 2D 09 35 AND DCBWRF
2990 2E83 8D 09 35 STA DCBWRF
2991 2E86 60 RTS ;DONE
2992 2E87 ;
2993 2E87 ; MVFDBA <20> MOVE FILE DIRECTORY BUFF ASDR TO IOD
2994 2E87 ;
2995 2E87 MVFDBA
2996 2E87 AD FD 34 LDA CFCBDR ;MOVE ADR
2997 2E8A 8D F0 37 STA IBBUFP
2998 2E8D AD FE 34 LDA CFCBDR+1
2999 2E90 8D F1 37 STA IBBUFP+1
3000 2E93 AE 07 35 LDX DCBCDT ;GET TRACK
3001 2E96 AC 08 35 LDY DCBCDS ;GET SECTOR
3002 2E99 60 RTS
Page 69 APPLE DOS 3.1
3003 2E9A PAGE
3004 2E9A ;
3005 2E9A ; RDFDIR <20> READ FILE DIRECTORY
3006 2E9A ;
3007 2E9A RDFDIR
3008 2E9A 08 PHP ;SAVE STATUS
3009 2E9B 20 70 2E JSR WRFDIR ;GO WRITE CURRENT DIR IF REQD
3010 2E9E 20 87 2E JSR MVFDBA ;GO MOVE DBUFF ADR TO ZPG
3011 2EA1 20 3F 2E JSR MVFCBD ;MOVE DBUFF ADR TO ZPG
3012 2EA4 28 PLP ;GET SAVED STATUS
3013 2EA5 B0 09 BCS RFDNXT ;BR IF RD NEXT
3014 2EA7 ;
3015 2EA7 AE 05 35 LDX DCBFDT ;TRACK
3016 2EAA AC 06 35 LDY DCBFDS ;SECTOR
3017 2EAD 4C F1 2E JMP RFDIO1 ;GO READ
3018 2EB0 ;
3019 2EB0 RFDNXT
3020 2EB0 A0 01 LDY #FDLTRK ;GET LINK TRACK
3021 2EB2 B1 42 LDA (ZPGFCB),Y
3022 2EB4 F0 08 BEQ RFDNL ;NR NO LINK
3023 2EB6 AA TAX ;PUT TRACK INTO X
3024 2EB7 C8 INY
3025 2EB8 B1 42 LDA (ZPGFCB),Y ;SET LINK SECTOR
3026 2EBA A8 TAY ;PUT SECTOR INTO Y
3027 2EBB 4C F1 2E JMP RFDIO1 ;GO DO I/O
3028 2EBE ;
3029 2EBE RFDNL
3030 2EBE AD EF 34 LDA CCBREQ ;THIS A WRITE
3031 2EC1 C9 04 CMP #CRQWR
3032 2EC3 F0 02 BEQ RFDNL1 ;BR IF WRITE
3033 2EC5 38 SEC ;SET EOF
3034 2EC6 60 RTS ;RETURN
3035 2EC7 ;
3036 2EC7 RFDNL1
3037 2EC7 20 80 31 JSR GETSEC ;GET A SECTOR
3038 2ECA A0 02 LDY #FDLSEC
3039 2ECC 91 42 STA (ZPGFCB),Y ;PUT IN LINK
3040 2ECE 48 PHA ;SAVE SECTOR
3041 2ECF 88 DEY
3042 2ED0 AD 25 35 LDA DCBATK ;GET TRACK
3043 2ED3 91 42 STA (ZPGFCB),Y ;PUT IN LINK
3044 2ED5 48 PHA ;SAVE TRACK
3045 2ED6 20 76 2E JSR WRFDGO ;GO WRITE OLD DIR DEC
3046 2ED9 ;
3047 2ED9 20 50 2E JSR CLRSEC ;CLEAN OUT DIR
3048 2EDC A0 05 LDY #FDFRS ;SET NEW DIR SEC 1ST REL
3049 2EDE AD 12 35 LDA DCBDNF ;FILE SECTOR
3050 2EE1 91 42 STA (ZPGFCB),Y
3051 2EE3 C8 INY
3052 2EE4 AD 13 35 LDA DCBDNF+1
3053 2EE7 91 42 STA (ZPGFCB),Y
3054 2EE9 ;
3055 2EE9 68 PLA ;GET SAVED TRACK
3056 2EEA AA TAX ;INTO X
3057 2EEB 68 PLA ;GET SAVED SECTOR
3058 2EEC A8 TAY ;INTO Y
3059 2EED A9 02 LDA #IBCWTS ;SET WRITE CMD
3060 2EEF D0 02 BNE RFDIO2 ;GO DO I/O
3061 2EF1 ;
3062 2EF1 A9 01 RFDIO1 LDA #IBCRTS ;SET READ CMD
3063 2EF3 8E 07 35 RFDIO2 STX DCBCDT ;SET CURR TRACK
3064 2EF6 8C 08 35 STY DCBCDS ;SET CURR SECTOR
3065 2EF9 20 8E 2F JSR DCBIO ;GO I/O
3066 2EFC ;
3067 2EFC A0 05 LDY #FDFRS ;GET POINTER TO FIRST RE SECTOR
3068 2EFE B1 42 LDA (ZPGFCB),Y ;GET FRS
3069 2F00 8D 10 35 STA DCBDFS ;SET INTO DCB
3070 2F03 18 CLC
3071 2F04 6D 0E 35 ADC DCBDMS ;ADD MAX SECTORS
3072 2F07 8D 12 35 STA DCBDNF ;PUT INTO DCB
3073 2F0A ;
3074 2F0A C8 INY ;DO SAME FOR HI BYTE
3075 2F0B B1 42 LDA (ZPGFCB),Y
3076 2F0D 8D 11 35 STA DCBDFS+1
3077 2F10 6D 0F 35 ADC DCBDMS+1
3078 2F13 8D 13 35 STA DCBDNF+1
3079 2F16 ;
3080 2F16 18 CLC
3081 2F17 60 RTS ;DONE
Page 70 APPLE DOS 3.1
3082 2F18 PAGE
3083 2F18 ;
3084 2F18 ; RDSECT <20> READ A SECTOR
3085 2F18 ;
3086 2F18 RDSECT
3087 2F18 20 20 2F JSR MVSBA ;GO MOVE SECTOR BUFFER ADR
3088 2F1B ;
3089 2F1B A9 01 LDA #IBCRTS
3090 2F1D 4C 8E 2F JMP DCBIO ;GO DO I/O
3091 2F20 ;
3092 2F20 ; MVSBA <20> MOVE SECTOR BUFFER ADR FOR I/O
3093 2F20 ;
3094 2F20 MVSBA
3095 2F20 AC FF 34 LDY CFCBSB ;GET SECTOR BUFF ADR
3096 2F23 AD 00 35 LDA CFCBSB+1
3097 2F26 8C F0 37 STY IBBUFP ;SET IOB SECTOR
3098 2F29 8D F1 37 STA IBBUFP+1 ;BUFF PTR
3099 2F2C AE 0A 35 LDX DCBTRK ;GET TRACK
3100 2F2F AC 0B 35 LDY DCBSEC ;GET SECTOR
3101 2F32 60 RTS ;RTN
Page 71 APPLE DOS 3.1
3102 2F33 PAGE
3103 2F33 ;
3104 2F33 ; RDVTOC <20> READ VTOC
3105 2F33 ; WRVTOC <20> WRITE VTOC
3106 2F33 ;
3107 2F33 RDVTOC
3108 2F33 A9 01 LDA #IBCRTS ;READ
3109 2F35 D0 02 BNE VTIO
3110 2F37 WRVTOC
3111 2F37 A9 02 LDA #IBCWTS ;WRITE
3112 2F39 ;
3113 2F39 AC 05 2A VTIO LDY AVTOC ;MOVE BUFF ADR
3114 2F3C 8C F0 37 STY IBBUFP
3115 2F3F AC 06 2A LDY AVTOC+1
3116 2F42 8C F1 37 STY IBBUFP+1
3117 2F45 ;
3118 2F45 AE 2E 35 LDX DCBVTN ;GET TRACK
3119 2F48 A0 00 LDY #0
3120 2F4A 4C 8E 2F JMP DCBIO ;GO DO I/O
Page 72 APPLE DOS 3.1
3121 2F4D PAGE
3122 2F4D ;
3123 2F4D ; RDVDIR <20> READ VOLUME DIRECTOR
3124 2F4D ;
3125 2F4D RDVDIR
3126 2F4D 08 PHP ;SAVES STATUS
3127 2F4E 20 81 2F JSR MVVDBA
3128 2F51 ;
3129 2F51 28 PLP ;GET STATUS
3130 2F52 B0 08 BCS RVDA ;BR IF R0 NEXT
3131 2F54 ;
3132 2F54 AC F1 32 LDY VDIRSC ;GET LINK SECTOR
3133 2F57 AE F0 32 LDX VDIRTK ;GET FIRST TRK
3134 2F5A D0 0A BNE RDVGO ;GO READ
3135 2F5C ;
3136 2F5C RVDA
3137 2F5C AE F0 33 LDX VDLTRK ;GET SECTOR
3138 2F5F D0 02 BNE RDVC ;BR IF A LINK
3139 2F61 38 SEC ; SET END OF DIR
3140 2F62 60 RTS
3141 2F63 ;
3142 2F63 AC F1 33 RDVC LDY VDLSEC ;GET SECTOR
3143 2F66 RDVGO
3144 2F66 8E CF 32 STX CVDTRK ;SET CUR TRACK
3145 2F69 8C D0 32 STY CVDSEC ;SET CUR SECTOR
3146 2F6C A9 01 LDA #IBCRTS ;GET CMD
3147 2F6E 20 8E 2F JSR DCBIO ; GO DO I/O
3148 2F71 18 CLC
3149 2F72 60 RTS
Page 73 APPLE DOS 3.1
3150 2F73 PAGE
3151 2F73 ;
3152 2F73 ; WRVDIR <20> WRITE VOLUME DIRECTORY SECTOR
3153 2F73 ;
3154 2F73 WRVDIR
3155 2F73 20 81 2F JSR MVVDBA
3156 2F76 ;
3157 2F76 AE CF 32 LDX CVDTRK ;CURRENT TRACK
3158 2F79 AC D0 32 LDY CVDSEC ;CURRENT SECTOR
3159 2F7C A9 02 LDA #IBCWTS ;WRITE COMMAND
3160 2F7E 4C 8E 2F JMP DCBIO ;GO DO I/O
3161 2F81 ;
3162 2F81 ; MVVDBA <20> MOVE VOL DIR BUF ADR TO IOB
3163 2F81 ;
3164 2F81 MVVDBA
3165 2F81 AD 07 2A LDA AVOLDR ;MOVE ADR
3166 2F84 8D F0 37 STA IBBUFP
3167 2F87 AD 08 2A LDA AVOLDR+1
3168 2F8A 8D F1 37 STA IBBUFP+1
3169 2F8D 60 RTS
Page 74 APPLE DOS 3.1
3170 2F8E PAGE
3171 2F8E ;
3172 2F8E ; DCBIO <20> DO I/O FOR A DCB
3173 2F8E ;
3174 2F8E DCBIO
3175 2F8E 8E EC 37 STX IBTRK ;TRACK
3176 2F91 8C ED 37 STY IBSECT ;SECTOR
3177 2F94 DCBIO2
3178 2F94 8D F4 37 STA IBCMD ;COMMAND
3179 2F97 C9 02 CMP #IBCWTS
3180 2F99 D0 06 BNE DCBIO1
3181 2F9B 0D 09 35 ORA DCBWRF
3182 2F9E 8D 09 35 STA DCBWRF
3183 2FA1 DCBIO1
3184 2FA1 AD 2D 35 LDA DCBVOL ;VOL
3185 2FA4 49 FF EOR #$FF ;UNINVERT VOL BITS
3186 2FA6 8D EB 37 STA IBVOL
3187 2FA9 AD 2B 35 LDA DCBSLT ;SLOT
3188 2FAC 8D E9 37 STA IBSLOT
3189 2FAF AD 2C 35 LDA DCBDRV ;DRIVE
3190 2FB2 8D EA 37 STA IBDRVN
3191 2FB5 AD 16 35 LDA DCBSDL ;LENGTH
3192 2FB8 8D F2 37 STA IBDLEN
3193 2FBB AD 17 35 LDA DCBSDL+1
3194 2FBE 8D F3 37 STA IBDLEN+1
3195 2FC1 A9 01 LDA #1 ;IOB TYPE
3196 2FC3 8D E8 37 STA IBTYPE
3197 2FC6 ;
3198 2FC6 AC 03 2A LDY AIOB ;IOB ADR
3199 2FC9 AD 04 2A LDA AIOB+1
3200 2FCC 20 00 3D JSR DISKIO ;GO DO I/O
3201 2FCF ;
3202 2FCF AD F6 37 LDA IBSMOD
3203 2FD2 8D F3 34 STA CCBVOL
3204 2FD5 A9 FF LDA #$FF ;RESET VOL
3205 2FD7 8D EB 37 STA IBVOL
3206 2FDA B0 01 BCS BADIO ;BR IF BAD
3207 2FDC 60 RTS ;RTN IF GOOD
3208 2FDD ;
3209 2FDD AD F5 37 BADIO LDA IBSTAT ; GET STATUS
3210 2FE0 A0 07 LDY #CREVMM
3211 2FE2 C9 20 CMP #IBVMME ; WAS IT VOLUME MISMATCH
3212 2FE4 F0 08 BEQ BD2 ; BR IF YES
3213 2FE6 A0 04 LDY #CREPRO
3214 2FE8 C9 10 CMP #IBWPER
3215 2FEA F0 02 BEQ BD2
3216 2FEC A0 08 LDY #CREIOE
3217 2FEE 98 BD2 TYA
3218 2FEF 4C C1 32 JMP ERRORB ;GO RTN
Page 75 APPLE DOS 3.1
3219 2FF2 PAGE
3220 2FF2 ;
3221 2FF2 ; LOCNXB <20> LOCATE NEXT BYTE
3222 2FF2 ;
3223 2FF2 LOCNXB
3224 2FF2 AD 18 35 LDA DCBCRS ;IS THE CURRENT RELATIVE SECTOR
3225 2FF5 CD 14 35 CMP DCBCMS ;EQUAL TO THE CURRENT MEM SECTOR
3226 2FF8 D0 08 BNE LNB1 ;BR IF NOT EQ
3227 2FFA AD 19 35 LDA DCBCRS+1
3228 2FFD CD 15 35 CMP DCBCMS+1
3229 3000 F0 66 BEQ LNB8 ;BR IF REQD SECTOR IN MEM
3230 3002 ;
3231 3002 LNB1 ;NEED A DIFFERENT SECTOR IN MEM
3232 3002 20 59 2E JSR WRSECT ;GO WRITE SECTOR(IF REQD)
3233 3005 ;
3234 3005 AD 19 35 LNB2 LDA DCBCRS+1 ;IS CURRENT REL SECTORY
3235 3008 CD 11 35 CMP DCBDFS+1 ;IS CURRENT DIRECTORY (LOW LIMIT)
3236 300B 90 1C BCC LNB4 ;BR IF IN A PREVIOUS DIR
3237 300D D0 08 BNE LNB3 ;BR IF MAYBE IN THIS ONE
3238 300F AD 18 35 LDA DCBCRS ;TEST LOW BYTES
3239 3012 CD 10 35 CMP DCBDFS
3240 3015 90 12 BCC LNB4 ;BR IF IN PREVIOUS DIR
3241 3017 ;
3242 3017 AD 19 35 LNB3 LDA DCBCRS+1 ;IS CURRENT REL SECTOR
3243 301A CD 13 35 CMP DCBDNF+1 ;IN CURRENT DIRECTOR (HI LIMIT)
3244 301D 90 10 BCC LNB6 ;BR IF IN THIS ONE
3245 301F D0 08 BNE LNB4 ;BR IF IN A NEXT DIR
3246 3021 AD 18 35 LDA DCBCRS
3247 3024 CD 12 35 CMP DCBDNF
3248 3027 90 06 BCC LNB6 ;BR IF IN THIS ONE
3249 3029 ; ;REQD SECTOR IN A NEXT DIRECTORY
3250 3029 20 9A 2E LNB4 JSR RDFDIR ;GO READ NEXT FILE DIR
3251 302C 90 D7 BCC LNB2 ;BR NXT AVAIL
3252 302E 60 RTS ;RETURN IF EOF DIR
3253 302F ;
3254 302F ;
3255 302F LNB6
3256 302F 38 SEC ;CALCULATE DISPL INTO DIR
3257 3030 AD 18 35 LDA DCBCRS ;REQD REL SECTOR MINUS
3258 3033 ED 10 35 SBC DCBDFS
3259 3036 0A ASLA ;TIMES 2
3260 3037 69 0C ADC #FDENT ;PLUS DISPL TO 1ST
3261 3039 A8 TAY
3262 303A 20 3F 2E JSR MVFCBD ;MOVE ADR TO ZPG
3263 303D B1 42 LDA (ZPGFCB),Y ;GET TRACK
3264 303F D0 0F BNE LNB7 ;BR IF NOT ZERO
3265 3041 AD EF 34 LDA CCBREQ
3266 3044 C9 04 CMP #CRQWR ;WRITE!
3267 3046 F0 02 BEQ LNB7A
3268 3048 38 SEC
3269 3049 60 RTS
3270 304A 20 70 30 LNB7A JSR GNWSEC ;GO GET A NEW SECTOR
3271 304D 4C 5C 30 JMP LNBCON
3272 3050 8D 0A 35 LNB7 STA DCBTRK ;SET TRK INTO DCB
3273 3053 C8 INY
3274 3054 B1 42 LDA (ZPGFCB),Y ;GET SECTOR
3275 3056 8D 0B 35 STA DCBSEC ;PUT INTO DCB
3276 3059 20 18 2F JSR RDSECT ;GO READ SECTOR
3277 305C AD 18 35 LNBCON LDA DCBCRS ;MOVE CUR REL SECTOR
3278 305F 8D 14 35 STA DCBCMS
3279 3062 AD 19 35 LDA DCBCRS+1 ;TO CUR MEM SECTOR
3280 3065 8D 15 35 STA DCBCMS+1
3281 3068 ;
3282 3068 LNB8
3283 3068 20 43 2E JSR MVFCBS ;MOVE SECTOR BUFF ADR TO ZP
3284 306B AC 1A 35 LDY DCBCSB ;GET SECT BYTE
3285 306E 18 CLC ;CARRY CLEAR = ALL OK
3286 306F 60 RTS ;DONE
Page 76 APPLE DOS 3.1
3287 3070 PAGE
3288 3070 ;
3289 3070 ;
3290 3070 GNWSEC ;NEED NEW SECTOR
3291 3070 8C D5 32 STY TEMP2 ;SAVE DIR INDEX
3292 3073 20 80 31 JSR GETSEC ;GET A SECTOR
3293 3076 AC D5 32 LDY TEMP2
3294 3079 C8 INY
3295 307A 91 42 STA (ZPGFCB),Y ;SET NEW TRACK
3296 307C 8D 0B 35 STA DCBSEC
3297 307F 88 DEY
3298 3080 AD 25 35 LDA DCBATK
3299 3083 91 42 STA (ZPGFCB),Y ;SET NEW TRACK
3300 3085 8D 0A 35 STA DCBTRK
3301 3088 ;
3302 3088 20 43 2E JSR MVFCBS
3303 308B 20 50 2E JSR CLRSEC ;GO CLEAR SECTOR
3304 308E ;
3305 308E ;
3306 308E A9 C0 LDA #$C0 ;INDICATE BOTH
3307 3090 0D 09 35 ORA DCBWRF ;DIR AND SECTOR
3308 3093 8D 09 35 STA DCBWRF ;MUST BE WRITTEN
3309 3096 60 RTS ;DONE
Page 77 APPLE DOS 3.1
3310 3097 PAGE
3311 3097 ;
3312 3097 ; INCRRB <20> INCREMENT RELATIVE RECORD BYTE
3313 3097 ;
3314 3097 INCRRB
3315 3097 AE 1E 35 LDX DCBCRR ;MOVE BYTE JUST READ OR WRITTEN
3316 309A 8E F1 34 STX CCBRRN
3317 309D AE 1F 35 LDX DCBCRR+1
3318 30A0 8E F2 34 STX CCBRRN+1
3319 30A3 AE 20 35 LDX DCBCRB ;X=REL BYTE (LOW)
3320 30A6 AC 21 35 LDY DCBCRB+1 ;Y=REL BYTE HI
3321 30A9 8E F3 34 STX CCBBYT
3322 30AC 8C F4 34 STY CCBBYT+1
3323 30AF E8 INX ;INC REL BYTE (LOW)
3324 30B0 D0 01 BNE INCR1 ;BR IF NO CARRY
3325 30B2 C8 INY ;INC REL BYTE (HI)
3326 30B3 ;
3327 30B3 CC 1D 35 INCR1 CPY DCBRCL+1 ;REL BYTE=REC LENGTH
3328 30B6 D0 11 BNE INCR2 ;BR IF NOT
3329 30B8 EC 1C 35 CPX DCBRCL ;TEST LOW BYTES
3330 30BB D0 0C BNE INCR2
3331 30BD A2 00 LDX #0
3332 30BF A0 00 LDY #0 ;RESET REL BYTE TO ZERO
3333 30C1 EE 1E 35 INC DCBCRR ;AND INCR
3334 30C4 D0 03 BNE INCR2 ;RELATIVE RECORD
3335 30C6 EE 1F 35 INC DCBCRR+1
3336 30C9 ;
3337 30C9 8E 20 35 INCR2 STX DCBCRB ;SAVE NEW RELATIVE BYTE
3338 30CC 8C 21 35 STY DCBCRB+1
3339 30CF ;
3340 30CF 60 RTS
Page 78 APPLE DOS 3.1
3341 30D0 PAGE
3342 30D0 ;
3343 30D0 ; INCSCB <20> INCREMENT SECTOR BYTE
3344 30D0 ;
3345 30D0 INCSCB
3346 30D0 EE 1A 35 INC DCBCSB ;INC SECTOR BYTE
3347 30D3 D0 08 BNE INCS2 ;BR IF NOT FULL
3348 30D5 EE 18 35 INC DCBCRS ;AND INCR
3349 30D8 D0 03 BNE INCS2 ;RELATIVE SECTOR
3350 30DA EE 19 35 INC DCBCRS+1
3351 30DD ;
3352 30DD ;
3353 30DD INCS2
3354 30DD 60 RTS ;DONE
Page 79 APPLE DOS 3.1
3355 30DE PAGE
3356 30DE ;
3357 30DE ; MIBDA <20> MOVE AND INCREMENT CCBDAT
3358 30DE ;
3359 30DE MIBDA
3360 30DE AC F7 34 LDY CCBBBA ;Y=ADR LOW
3361 30E1 AE F8 34 LDX CCBBBA+1 ;X=ADR HI
3362 30E4 84 42 STY ZPGFCB ;PUT ADR INTO ZPG
3363 30E6 86 43 STX ZPGFCB+1
3364 30E8 ;
3365 30E8 EE F7 34 INC CCBBBA ;INC ADR LOW
3366 30EB D0 03 BNE MIB1 ;BR IF NOT ZERO
3367 30ED EE F8 34 INC CCBBBA+1 ;INC ADR HI
3368 30F0 60 MIB1 RTS ;DONE
3369 30F1 ;
3370 30F1 ; DTBLN <20> DECREMENT BLOCK LENGTH AND TEST ZERO
3371 30F1 ;
3372 30F1 DTBLN
3373 30F1 AC F5 34 LDY CCBBLN ;GET LEN LOW
3374 30F4 D0 08 BNE DTB1 ;BR IF NOT ZERO
3375 30F6 AE F6 34 LDX CCBBLN+1 ;GET LEN HI
3376 30F9 F0 07 BEQ DTB2 ;BR IF LEN=0
3377 30FB CE F6 34 DEC CCBBLN+1 ;DEC LEN (HIGH)
3378 30FE CE F5 34 DTB1 DEC CCBBLN ;DEC LEN (LOW)
3379 3101 60 RTS ;DONE
3380 3102 ;
3381 3102 4C BB 32 DTB2 JMP GOODIO ;FINISHED BLOCK
Page 80 APPLE DOS 3.1
3382 3105 PAGE
3383 3105 ;
3384 3105 ; FNDFIL <20> FIND FILE NAME IN VOLUME DIR
3385 3105 ;
3386 3105 FNDFIL
3387 3105 20 33 2F JSR RDVTOC ;GO GET VTOC
3388 3108 AD F7 34 LDA CCBFN1 ;MOVE FN PTR
3389 310B 85 42 STA ZPGFCB ;TO ZERO PAGE
3390 310D AD F8 34 LDA CCBFN1+1
3391 3110 85 43 STA ZPGFCB+1
3392 3112 A9 01 LDA #1
3393 3114 8D D5 32 FF1 STA TEMP2
3394 3117 A9 00 LDA #0
3395 3119 8D 0C 35 STA DCBVDR
3396 311C 18 CLC
3397 311D FF2
3398 311D EE 0C 35 INC DCBVDR
3399 3120 20 4D 2F JSR RDVDIR ;GO GET VDIR SECTOR
3400 3123 B0 51 BCS FF4A
3401 3125 A2 00 LDX #0 ;SET FOR 1ST FILE
3402 3127 ;
3403 3127 8E D4 32 FF3 STX TEMP1 ;SAVE INDEX
3404 312A BD FA 33 LDA VDFILE,X ;GET FILE TRK
3405 312D F0 1F BEQ FF6 ;BR IF LAST ENTRY
3406 312F 30 22 BMI FF7 ;BR DELETED ENTRY
3407 3131 A0 00 LDY #0 ;X=X+3
3408 3133 E8 INX
3409 3134 E8 INX
3410 3135 E8 FF4 INX
3411 3136 B1 42 LDA (ZPGFCB),Y ;GET FN CHAR
3412 3138 DD FA 33 CMP VDFILE,X ;COMPARE TO ENTRY CHAR
3413 313B D0 0A BNE FF5 ;BR IF NOT SAME
3414 313D C8 INY
3415 313E C0 1E CPY #30 ; ALL 30 CHARS
3416 3140 D0 F3 BNE FF4 ;BR IF NOT
3417 3142 AE D4 32 LDX TEMP1 ;GET INDEX
3418 3145 18 CLC ;FILE FOUND
3419 3146 60 RTS ;RETURN
3420 3147 ;
3421 3147 FF5
3422 3147 20 6C 31 JSR VDINC
3423 314A 90 DB BCC FF3
3424 314C B0 CF BCS FF2
3425 314E ;
3426 314E AC D5 32 FF6 LDY TEMP2 ;LOOKING FOR DELETED
3427 3151 D0 C1 BNE FF1 ;BR IF NOT (DO)
3428 3153 ;
3429 3153 AC D5 32 FF7 LDY TEMP2 ;LOOKING FOR EMPTY
3430 3156 D0 EF BNE FF5 ;BR IF NOT
3431 3158 ;
3432 3158 MVFN
3433 3158 A0 00 LDY #0 ;HAVE NEW ENTTRY
3434 315A E8 INX
3435 315B E8 INX
3436 315C E8 FF8 INX
3437 315D B1 42 LDA (ZPGFCB),Y ;MOVE FILE NAME
3438 315F 9D FA 33 STA VDFILE,X
3439 3162 C8 INY
3440 3163 C0 1E CPY #30
3441 3165 D0 F5 BNE FF8
3442 3167 ;
3443 3167 AE D4 32 LDX TEMP1 ;GET INDEX
3444 316A 38 SEC ;SET NOT OLD
3445 316B 60 RTS ;DONE
3446 316C VDINC
3447 316C 18 CLC
3448 316D AD D4 32 LDA TEMP1
3449 3170 69 23 ADC #35
3450 3172 AA TAX
3451 3173 E0 F5 CPX #VDFLEN
3452 3175 60 RTS
3453 3176 FF4A
3454 3176 A9 00 LDA #0
3455 3178 AC D5 32 LDY TEMP2
3456 317B D0 97 BNE FF1
3457 317D 4C B3 32 JMP ERROR9
Page 81 APPLE DOS 3.1
3458 3180 PAGE
3459 3180 ;
3460 3180 ; GETSEC <20> GET A SECTOR
3461 3180 ;
3462 3180 GETSEC
3463 3180 AD 25 35 LDA DCBATK ;GET ALLOCATED TRK
3464 3183 F0 21 BEQ GSS1 ;BR IF NONE
3465 3185 ;
3466 3185 GS0
3467 3185 CE 24 35 DEC DCBALS ;DECREMENT SECTOR NO
3468 3188 30 17 BMI CS2 ;BR IF NO SECTORS REM
3469 318A ;
3470 318A 18 CLC
3471 318B A2 04 LDX #4 ;4 BYTE SHIFT
3472 318D 3E 25 35 GS1 ROL DCBABM-1,X ;SHIFT BYTE LEFT
3473 3190 CA DEX
3474 3191 D0 FA BNE GS1
3475 3193 90 F0 BCC GS0 ;BR IF NO SECTOR
3476 3195 ;
3477 3195 EE 22 35 INC DCBNSA
3478 3198 D0 03 BNE GS1A
3479 319A EE 23 35 INC DCBNSA+1
3480 319D GS1A
3481 319D AD 24 35 LDA DCBALS ;GET ALLOCATED SECTOR
3482 31A0 60 RTS ;RETURN
3483 31A1 ;
3484 31A1 A9 00 CS2 LDA #0 ;CLEAR ALLOCATED
3485 31A3 8D 25 35 STA DCBATK ;TRK
3486 31A6 ;
3487 31A6 A9 00 GSS1 LDA #0 ;SET SEARCH STATE=0
3488 31A8 8D D6 32 STA TEMP3
3489 31AB 20 33 2F JSR RDVTOC ;GET VTOC
3490 31AE ;
3491 31AE GS2
3492 31AE 18 CLC
3493 31AF AD 1F 33 LDA VALCA1 ;GET LAST ALLOCATED TRK
3494 31B2 6D 20 33 ADC VALCA2 ;AD (+1) OR (-1)
3495 31B5 F0 09 BEQ GS3 ;BR IF DECK TO ZERO
3496 31B7 CD 23 33 CMP VNOTRK
3497 31BA 90 14 BCC GS5 ;BR IF NOT AT OUTER LIMIT
3498 31BC A9 FF LDA #$FF ;SET (-1)
3499 31BE D0 0A BNE GS4
3500 31C0 AD D6 32 GS3 LDA TEMP3 ;GET SEARCH STATE
3501 31C3 D0 37 BNE ERR9 ;BR IF NOT ZERO
3502 31C5 A9 01 LDA #1 ;SET (+1)
3503 31C7 8D D6 32 STA TEMP3 ;SET SEARCH STATE = 1
3504 31CA 8D 20 33 GS4 STA VALCA2 ;SET NEW (+1) OR (-1)
3505 31CD 18 CLC
3506 31CE 69 11 ADC #17 ; ADD VTOC TRK NO
3507 31D0 8D 1F 33 GS5 STA VALCA1 ;SET NEW LAST ALLOCATED
3508 31D3 8D 25 35 STA DCBATK ;PUT IN DCB
3509 31D6 ;
3510 31D6 A8 TAY ;ALLOCATED TRACK
3511 31D7 0A ASLA ;TIME 4
3512 31D8 0A ASLA
3513 31D9 A8 TAY
3514 31DA A2 04 LDX #4
3515 31DC 18 CLC
3516 31DD B9 2A 33 GS6 LDA VSECAL+3,Y ;MOVE BIT MAP BYTE
3517 31E0 9D 25 35 STA DCBABM-1,X
3518 31E3 F0 06 BEQ GS7 ;BR IF NO BITS ON
3519 31E5 38 SEC ;SET HAVE A SECTOR
3520 31E6 A9 00 LDA #0 ;CLEAR VTOC BYTE
3521 31E8 99 2A 33 STA VSECAL+3,Y
3522 31EB 88 GS7 DEY
3523 31EC CA DEX
3524 31ED D0 EE BNE GS6 ;BR IF MORE TO MOVE
3525 31EF 90 BD BCC GS2
3526 31F1 20 37 2F JSR WRVTOC ;GO WRITE VTOC
3527 31F4 AD 24 33 LDA VNOSEC ;GET NO SECTORS
3528 31F7 8D 24 35 STA DCBALS ;SET IN DCB SECTOR BYTE
3529 31FA D0 89 BNE GS0 ;GO ALLOCATED SECTOR
3530 31FC 4C B3 32 ERR9 JMP ERROR9
Page 82 APPLE DOS 3.1
3531 31FF PAGE
3532 31FF ;
3533 31FF ; FRETRK <20> FREE TRACK OF SECTORS
3534 31FF ;
3535 31FF FRETRK
3536 31FF AD 25 35 LDA DCBATK ;GET ALLOCATED TRACK
3537 3202 D0 01 BNE FT1 ;BR IF NONE
3538 3204 60 RTS ;DONE
3539 3205 48 FT1 PHA
3540 3206 20 33 2F JSR RDVTOC ;GET VTOC
3541 3209 AC 24 35 LDY DCBALS ;GET SECTORS
3542 320C 68 PLA ;GET TRACK
3543 320D 18 CLC ;SET FREE
3544 320E 20 19 32 JSR FRESEC ;GO FREE
3545 3211 A9 00 LDA #0 ;CLEAR ALLOCATED TRK
3546 3213 8D 25 35 STA DCBATK
3547 3216 4C 37 2F JMP WRVTOC ;WRITE VTOC
3548 3219 ;
3549 3219 ; FRESEC <20> FREE A SECTOR
3550 3219 ; A=TRK, Y=SECTOR, C=ON/OFF
3551 3219 ;
3552 3219 FRESEC
3553 3219 A2 FC FS1 LDX #252 ;4 BYTE SHIFT
3554 321B 7E 2A 34 FS2 ROR DCBABM-252,X ;SHIFT IN CARRY
3555 321E E8 INX ;NEXT BYTE
3556 321F D0 FA BNE FS2 ;BR IF NOT DONE
3557 3221 C8 INY ;INC SECTOR NO
3558 3222 CC 24 33 CPY VNOSEC ;NORMAL
3559 3225 D0 F2 BNE FS1 ;BR IF NOT
3560 3227 ;
3561 3227 0A ASLA ;TRACK*4
3562 3228 0A ASLA
3563 3229 A8 TAY
3564 322A F0 0F BEQ FS4
3565 322C A2 04 LDX #4
3566 322E BD 25 35 FS3 LDA DCBABM-1,X ;GET BIT MAP BYTE
3567 3231 19 2A 33 ORA VSECAL+3,Y ;GET BIT MAP BYTE
3568 3234 99 2A 33 STA VSECAL+3,Y ;OR WITH VTOC BM
3569 3237 88 DEY
3570 3238 CA DEX
3571 3239 D0 F3 BNE FS3
3572 323B 60 FS4 RTS ;DONE
Page 83 APPLE DOS 3.1
3573 323C PAGE
3574 323C ;
3575 323C ; LOCSEC <20> LOCATE SECTOR FOR RECORD I/O
3576 323C ;
3577 323C ; RELSEC = (REL REC * RECLEN + RELBYTE)/256
3578 323C ; SECBYT = REMAINDER
3579 323C ;
3580 323C LOCSEC
3581 323C AD F1 34 LDA CCBRRN ;RELATIVE RECORD NUMBER
3582 323F 8D 1A 35 STA DCBCSB ;TO CSB FOR MULT
3583 3242 8D 1E 35 STA DCBCRR ;AND CRR FOR SAVE
3584 3245 AD F2 34 LDA CCBRRN+1
3585 3248 8D 18 35 STA DCBCRS
3586 324B 8D 1F 35 STA DCBCRR+1
3587 324E A9 00 LDA #0
3588 3250 8D 19 35 STA DCBCRS+1 ;HIGH CRS=0
3589 3253 A0 10 LDY #16 ;16 BIT MULT
3590 3255 ;
3591 3255 AA LS1 TAX ;SAVE MS BYTE
3592 3256 AD 1A 35 LDA DCBCSB
3593 3259 4A LSRA ;IF NO CARRY THEN NO PART PROD
3594 325A B0 03 BCS LS1A
3595 325C 8A TXA
3596 325D 90 0E BCC LS2
3597 325F 18 LS1A CLC
3598 3260 AD 19 35 LDA DCBCRS+1 ;FPORM PARTIAL PROD
3599 3263 6D 1C 35 ADC DCBRCL
3600 3266 8D 19 35 STA DCBCRS+1
3601 3269 8A TXA
3602 326A 6D 1D 35 ADC DCBRCL+1
3603 326D ;
3604 326D 6A LS2 RORA ;MULT BY 2
3605 326E 6E 19 35 ROR DCBCRS+1
3606 3271 6E 18 35 ROR DCBCRS
3607 3274 6E 1A 35 ROR DCBCSB
3608 3277 88 DEY ;DEC BIT COUNT
3609 3278 D0 DB BNE LS1 ;BR IF MORE BITS
3610 327A ;
3611 327A AD F3 34 LDA CCBBYT ;ADD REL BYTE RESULT
3612 327D 8D 20 35 STA DCBCRB ;(SAVE REL BYTE)
3613 3280 6D 1A 35 ADC DCBCSB
3614 3283 8D 1A 35 STA DCBCSB
3615 3286 AD F4 34 LDA CCBBYT+1
3616 3289 8D 21 35 STA DCBCRB+1 ;(SAVE REL BYTE)
3617 328C 6D 18 35 ADC DCBCRS
3618 328F 8D 18 35 STA DCBCRS
3619 3292 A9 00 LDA #0
3620 3294 6D 19 35 ADC DCBCRS+1
3621 3297 8D 19 35 STA DCBCRS+1
3622 329A 60 RTS
Page 84 APPLE DOS 3.1
3623 329B PAGE
3624 329B A9 01 ERROR1 LDA #CREFUN
3625 329D D0 22 BNE ERRORA
3626 329F A9 02 ERROR2 LDA #CRERR
3627 32A1 D0 1E BNE ERRORA
3628 32A3 A9 03 ERROR3 LDA #CREMRE
3629 32A5 D0 1A BNE ERRORA
3630 32A7 A9 04 ERROR4 LDA #CREPRO
3631 32A9 D0 16 BNE ERRORA
3632 32AB A9 05 ERROR5 LDA #CREEOF
3633 32AD D0 12 BNE ERRORA
3634 32AF A9 06 ERROR6 LDA #CREFNF
3635 32B1 D0 0E BNE ERRORA
3636 32B3 A9 09 ERROR9 LDA #CRENSA
3637 32B5 D0 0A BNE ERRORA
3638 32B7 A9 0A ERRR10 LDA #CREFLK
3639 32B9 D0 06 BNE ERRORA
3640 32BB AD F9 34 GOODIO LDA CCBSTA
3641 32BE 18 CLC ;CARRY=CLR
3642 32BF 90 01 BCC RETURN ;GO RETURN
3643 32C1 ERRORA
3644 32C1 38 ERRORB SEC ;CARRY=SET
3645 32C2 RETURN
3646 32C2 08 PHP
3647 32C3 8D F9 34 STA CCBSTA ;SET STA
3648 32C6 20 9D 2D JSR RTNFCB ;GO RTN FCB
3649 32C9 28 PLP ;GET STATUS
3650 32CA AE D3 32 LDX ENTSTK ;GET ENT STACK
3651 32CD 9A TXS ;RESTORE STACK
3652 32CE 60 RTS ;DONE
3653 32CF EC2
Page 85 APPLE DOS 3.1
3654 32CF PAGE
3655 32CF ;
3656 32CF ; MISC DOS WORK CELLS
3657 32CF ;
3658 32CF 11 CVDTRK DB $11 ;CUR VOL DIR TRK
3659 32D0 0B CVDSEC DB $0B ;CUR VOL DIR SECTOR
3660 32D1 00 00 CURCCB DB 0,0 ;CURRENT CCB ADR
3661 32D3 F5 ENTSTK DB $F5 ;ENTRY STACK POINTER
3662 32D4 00 TEMP1 DB 0 ;TEMP BYTE 1
3663 32D5 0C TEMP2 DB $0C ;TEMP BYTE 2
3664 32D6 00 TEMP3 DB 0 ;TEMP BYTE 3
3665 32D7 00 ENTSLT DB 0 ;BOOT SLOT SAVED
3666 32D8 00 00 F8 FF ALC10S DB 0,0,$F8,$FF ;ALLOCATATION TRACK BIT MAP
3667 32DC 01 0A 64 CVTAB DB 1,10,100 ; CONVERSION TABLE
3668 32DF D4 C2 C1 C9 FTTAB DB11 "TBAI" ; FILE TYPE CONVERSION TABLE
3669 32E3 A0 C5 CD D5 VOLMES DB11 " EMULOV KSID"
3669 32E7 CC CF D6 A0
3669 32EB CB D3 C9 C4
3670 32EF VML EQU *-VOLMES-1
Page 86 APPLE DOS 3.1
3671 32EF PAGE
3672 32EF ;
3673 32EF ; VTOC RECORD AREA
3674 32EF ;
3675 32EF VTOC
3676 32EF 01 VDOST DB 1 ; DOS TYPE
3677 32F0 11 VDIRTK DB 17 ;COLUME DIRECTORY SECTOR
3678 32F1 0C VDIRSC DB 12 ;VOLUME DIRECTORY SECTOR
3679 32F2 01 VDOSRN DB 1 ; DOS RELEASE NUMBER
3680 32F3 01 DB 1 ; SPARE
3681 32F4 01 DB 1 ; SPARE
3682 32F5 10 VVOLNO DB 16 ;VOLUME NUMBER
3683 32F6 RMB 32 ; SPARE
3684 3316 7A VTDMS DB 122 ;MAX SECTORS IN A FILE DIR
3685 3317 VSPARE RMB 8 ;SPARES
3686 331F ;
3687 331F 1E VALCA1 DB 30 ;ALOCATION ALGORITHM BYTE 1
3688 3320 01 VALCA2 DB 1 ;AA BYTE 2
3689 3321 00 VALCA3 DB 0 ;AA BYTE 3
3690 3322 00 VALCA4 DB 0 ;AA BYTE 4
3691 3323 23 VNOTRK DB 35 ;NO TRACKS ON VOL
3692 3324 0D VNOSEC DB 13 ; NO SECTORS PER TRACK
3693 3325 00 01 VSECLN DW 256 ;NO BYTES PER SECTOR
3694 3327 ;
3695 3327 VSECAL EQU * ;SECTOR ALLOCATION AREA
3696 3327 ; SECTORS ALLOCATED BY BIT MAP
3697 3327 ; 4 BYTES OF BITS PER TRACK
3698 3327 ; LEFT MOST BIT REPRESENTS SECTOR N
3699 3327 ; WHERE N=NO SECTORS PER TRACK
3700 3327 ;
3701 3327 ;
Page 87 APPLE DOS 3.1
3702 3327 PAGE
3703 33EF ORG VTOC+256
3704 33EF ;
3705 33EF ; VOLUME DIRECTORY AREA
3706 33EF ;
3707 33EF VOLDIR
3708 33EF 00 VDTCDE DB 0 ; VOLUME DIRECTORY TYPECODE
3709 33F0 VDLTRK RMB 1 ;VD LINK TRACK
3710 33F1 VDLSEC RMB 1 ;VD LINK SECTOR
3711 33F2 VDNF RMB 1 ;VD NUMBER FILES THIS SECTOR
3712 33F3 VDSPAR RMB 7 ;SPARES
3713 33FA ;
3714 33FA VDFILE EQU * ;FILE ALLOCATION AREA (7 FILES)
3715 33FA ; EACH FILE
3716 33FA ; FILE DIR TRK
3717 33FA ; FILE DIR SECTOR
3718 33FA ; FILE USE CODE
3719 33FA ; FILE NAME (30)
3720 33FA ; FILE SECTOR COUNT (2)
3721 34EF ORG VOLDIR+256
3722 34EF VDEND EQU *
3723 34EF VDLEN EQU *-VOLDIR
3724 34EF VDFLEN EQU *-VDFILE
3725 34EF ;
Page 88 APPLE DOS 3.1
3726 34EF PAGE
3727 34EF ;
3728 34EF ; COMMAND CONTROL BLOCK (CCB)
3729 34EF ;
3730 34EF CCB
3731 34EF CCBREQ RMB 1 ;USER REQUEST BYTE
3732 34F0 CRQNUL EQU 0 ;0-NO REQUEST
3733 34F0 CRQOPN EQU 1 ;1-OPEN FILE
3734 34F0 CRQCLS EQU 2 ;2-CLOSE FILE
3735 34F0 CRQRD EQU 3 ;3-READ DATA
3736 34F0 CRQWR EQU 4 ;WRITE DATA
3737 34F0 CRQDEL EQU 5 ;5-DELETE FILE
3738 34F0 CRQDIR EQU 6 ;6-READ DIRECTORY
3739 34F0 CRQLCK EQU 7 ;7-LOCK FILE
3740 34F0 CRQUNL EQU 8 ;8-UNLOCK FILE
3741 34F0 CRQRNM EQU 9 ;9-RENAME
3742 34F0 CRQPOS EQU 10 ;10-POSITION FILE
3743 34F0 CRQFMT EQU 11 ;11-FORMAT
3744 34F0 CRQVAR EQU 12 ; 12-VERIFY
3745 34F0 CRQMAX EQU 13
3746 34F0 ;
3747 34F0 CCBBSA ; FORMAT <20> BOOT START ADR PAGE
3748 34F0 CCBRQM RMB 1 ;REQUEST MODIFIER BYTE
3749 34F1 CRMNUL EQU 0 ;NO MODIFIER
3750 34F1 CRMNBT EQU 1 ;R/W <20> 1 <20> NEXT BYTE
3751 34F1 CRMNBL EQU 2 ;R/W <20> 2 <20> NEXT BLOCK
3752 34F1 CRMSBT EQU 3 ;R/W <20> 3 <20> SPECIFC BYTE
3753 34F1 CRMSBL EQU 4 ;R/W <20> 4 <20> SPECIFIC BLOCK
3754 34F1 CRMMAX EQU 5
3755 34F1 ;
3756 34F1 CCBRRN ;I/O <20> RELATIVE RECORD NUMBER
3757 34F1 CCBFN2 ;RENAME <20> FILE NAME 2 PTR
3758 34F1 CCBRLN RMB 2 ;OPEN <20> RECORD LENGTH
3759 34F3 ;
3760 34F3 CCBBYT ;I/O <20> RELATIVE RECORD NO(2 BYTES)
3761 34F3 CCBVOL RMB 1 ;OPEN <20> VOL NO.
3762 34F4 CCBDRV RMB 1 ;OPEN <20> DRIVE
3763 34F5 ;
3764 34F5 CCBBLN ;I/O <20> BLOCK LENGTH (2 BYTES)
3765 34F5 CCBSLT RMB 1 ;OPEN <20> SLOT NO.
3766 34F6 CCBFUC RMB 1 ;OPEN - FILE USE CODE
3767 34F7 ;
3768 34F7 CCBFN1 ;OPEN, DELETE, LOCK, UNLOCK, RENAME <20> FILENAME P
3769 34F7 CCBBBA ;BLCOKK I/O <20> BLOCK BUFFER PTR
3770 34F7 CCBDAT RMB 2 ;BYTE I/O <20> DTA BYTE
3771 34F9 ;
3772 34F9 CCBSTA RMB 1 ;RESULT STATUS
3773 34FA CREFUN EQU 1 ;FCB UNALLOCATED
3774 34FA CRERR EQU 2 ;CCB REQ RANGE ERR
3775 34FA CREMRE EQU 3 ;REQ MOD RANGE ERR
3776 34FA CREPRO EQU 4 ; WRITE PROTECT
3777 34FA CREEOF EQU 5 ;END OF FILE ON READ
3778 34FA CREFNF EQU 6 ;FILE NOT FOUND
3779 34FA CREVMM EQU 7 ;VOL MIS MATCH
3780 34FA CREIOE EQU 8 ;I/O ERR
3781 34FA CRENSA EQU 9 ;NO SECTORS AVAILABLE
3782 34FA CREFLK EQU 10 ;FILE LOCKED
3783 34FA ;
3784 34FA CCBSM RMB 1 ;STATUS MODIFIER
3785 34FB CCBFCB RMB 2 ;FCB PTR
3786 34FD CCBDBP RMB 2 ;DIR BUF PTR
3787 34FF CCBSBP RMB 2 ;SECTOR BUF PTR
3788 3501 CCBSPR RMB 4 ;SPARE
3789 3505 CCBLEN EQU *-CCB ;CCB LENGTH
3790 3505 CFCBAD EQU CCBFCB
3791 3505 CFCBDR EQU CCBDBP
3792 3505 CFCBSB EQU CCBSBP
Page 89 APPLE DOS 3.1
3793 3505 PAGE
3794 3505 ;
3795 3505 ; FILE CONTROL BLOCK (FCB) DEFINITION
3796 3505 ; DCB <20> FILE DATA CONTROL BLOCK
3797 3505 ;
3798 3505 FCBB
3799 3505 ;
3800 3505 ; DATA CONTROL BLOCK
3801 3505 ;
3802 3505 FCBDCB
3803 3505 DCBFDT RMB 1 ;1ST FILE DIRECTORY TRACK
3804 3506 DCBFDS RMB 1 ;1ST FILE DIRECTORY SECTOR
3805 3507 DCBCDT RMB 1 ;CURRENT FILE DIRECTORY
3806 3508 DCBCDS RMB 1 ;CURRENT FILE DIRECTORY
3807 3509 DCBWRF RMB 1 ;WRITE REQD FLAG
3808 350A ; ;$80=WRITE FILE DIR
3809 350A ; ;$40=WRITE SECTOR DIR
3810 350A DCBTRK RMB 1 ;SECTOR TRACK ADR
3811 350B DCBSEC RMB 1 ;SECTOR ADR
3812 350C DCBVDR RMB 1 ; VOL DIR REC
3813 350D DCBVDI RMB 1 ; VOL DIR INDEX
3814 350E DCBDMS RMB 2 ;MAX NO DIRECTORY SECTORS
3815 3510 DCBDFS RMB 2 ;CURRENT DIR 1ST REL SECTRO
3816 3512 DCBDNF RMB 2 ;REL SECTOR OF NXT DIR
3817 3514 DCBCMS RMB 2 ;SECTOR CURRENTLY IN MEMORY
3818 3516 DCBSDL RMB 2 ;SECTOR DATA LENGTH
3819 3518 DCBCRS RMB 2 ;CURRENT RELATIVE SECTOR
3820 351A DCBCSB RMB 2 ;REL SECTOR OF NXT DIR
3821 351C DCBRCL RMB 2 ;SECTOR CURRENTLY IN MEMORY
3822 351E DCBCRR RMB 2 ;SECTOR DATA LENGTH
3823 3520 DCBCRB RMB 2 ;CURRENT RELATIVE SECTOR
3824 3522 DCBNSA RMB 2 ; NO SECTORS ALLOCATED
3825 3524 ;
3826 3524 DCBALS RMB 1 ;ALLOCATION SECTOR BYTE
3827 3525 DCBATK RMB 1 ;ALLOCATION TRACK
3828 3526 DCBABM RMB 4 ;ALLOCATION TRACK SECTOR BIT MAP
3829 352A ;
3830 352A DCBFUC RMB 1 ;FILE USE CODE
3831 352B DCBSLT RMB 1 ;SLOT NUMBER
3832 352C DCBDRV RMB 1 ;DRIVE NUMBER
3833 352D DCBVOL RMB 1 ;VOLUME DRIVER
3834 352E DCBVTN RMB 1 ;VTOC TRACK NUMBER
3835 352F ;
3836 352F DCBSPR RMB 3 ;SPARES
3837 3532 ;
3838 3532 DCBLEN EQU *-FCBDCB ;DCB LENGTH
3839 3532 FCBLEN EQU *-FCBB ;FCB LENGTH
Page 90 APPLE DOS 3.1
3840 3532 PAGE
3841 3532 ;
3842 3532 ; DOS PATCH AREA 1
3843 3532 SDP1
3844 3532 EDP1 EQU ORG2-2
3845 3532 00 00 00 00 DB 0,0,0,0,0,0,0
3845 3536 00 00 00
3846 3539 00 00 00 00 DB 0,0,0,0,0,0,0
3846 353D 00 00 00
3847 3540 DR2PAT ;*** PATCH *** (DOSREL - FIND END OF DOS)
3848 3540 A5 41 LDA ZPGWRK+1 ;GET TOP OF RAM PAGE FOUND
3849 3542 29 DF AND #$DF ;SAVE 8K LESS THAN TOP OF RAM IF 16K, 32K, OR 48K SYS
3850 3544 85 43 STA ZPGFCB+1 ;LEAVE AS IS IF 20K, 24K, OR 36K SYSTEM
3851 3546 86 42 STX ZPGFCB ;ZERO LO
3852 3548 A1 42 LDA (ZPGFCB,X) ;GET BYTE FROM (POSSIBLY NEW) TOP OF RAM
3853 354A 48 PHA ;SAVE IT TO STACK
3854 354B 85 26 STA LOC1 ;TEST FOR RAM AGAIN
3855 354D DR2P1
3856 354D 98 TYA ;FIRST PASS=0
3857 354E 45 26 EOR LOC1
3858 3550 85 26 STA LOC1
3859 3552 98 TYA
3860 3553 41 40 EOR (ZPGWRK,X)
3861 3555 81 42 STA (ZPGFCB,X)
3862 3557 C5 26 CMP LOC1
3863 3559 D0 07 BNE DR2P3 ;BR IF NOT RAM
3864 355B C8 INY ;NEXT VERIFY PASS
3865 355C D0 EF BNE DR2P1
3866 355E A4 43 LDY ZPGFCB+1 ;GET TOP OF RAM PAGE IF TOOK
3867 3560 68 PLA ;RESTORE LAST BYTE READ FROM RAM
3868 3561 60 RTS ;RTN WITH (POSSIBLY NEW) TOP OF RAM PAGE
3869 3562 ;
3870 3562 DR2P3
3871 3562 68 PLA ;RESTORE LAST BYTE READ FROM RAM
3872 3563 81 42 STA (ZPGFCB,X) ;PUT IT BACK IN RAM
3873 3565 A4 41 LDY ZPGWRK+1 ;GET ORIG TOP OF RAM PAGE
3874 3567 60 RTS ;AND RETURN
3875 3568 ;
3876 3568 ; DOSLDR <20> DOS LOADER AND WRITTER
3877 3568 ;
3878 3600 ORG ORG2
3879 3600 DOSLDR
3880 3600 ; GARBAGED BOOT REC 0 HERE
3881 3600 RMB 254
3882 36FE 36 GRSPG DB $36
3883 36FF 48 GRPGC DB $48
Page 91 APPLE DOS 3.1
3884 3700 PAGE
3885 3700 SC3
3886 3700 ;
3887 3700 ; READ DOS AFTER BOOT
3888 3700 ;;
3889 3700 8E E9 37 STX IBSLOT ;SET BOOT SLOT
3890 3703 8E F7 37 STX IBPSLT ; SET PREVIOUS SLOT
3891 3706 A9 01 LDA #1 ;SET PREV DRIVE
3892 3708 8D F8 37 STA IBPDRV
3893 370B 8D EA 37 STA IBDRVN
3894 370E ;
3895 370E AD E0 37 LDA NDPGS ;COPY NO PAGES TO GET
3896 3711 8D E1 37 STA BRWCNT
3897 3714 A9 00 LDA #0
3898 3716 8D EC 37 STA IBTRK ; SET TRACK 0
3899 3719 ;
3900 3719 AD E2 37 LDA BSDSEC ;COPY START DOS SECTOR
3901 371C 8D ED 37 STA IBSECT
3902 371F ;
3903 371F AD E3 37 LDA BGNDOS ;COPY STARTR DOS ADR
3904 3722 8D F1 37 STA IBBUFP+1
3905 3725 ;
3906 3725 A9 01 LDA #IBCRTS ;SET READ
3907 3727 8D F4 37 STA IBCMD
3908 372A ;
3909 372A 8A TXA ;SET PREV TRACK = 0
3910 372B 4A LSRA
3911 372C 4A LSRA
3912 372D 4A LSRA
3913 372E 4A LSRA
3914 372F AA TAX
3915 3730 A9 00 LDA #0
3916 3732 9D F8 04 STA $4F8,X
3917 3735 9D 78 04 STA $478,X
3918 3738 20 93 37 JSR BOOTIO ; GO READ DOS
3919 373B ;
3920 373B ; DOSINT <20> INITIALIZE DOS
3921 373B ;
3922 373B DOSINT
3923 373B A2 FF LDX #$FF
3924 373D 9A TXS
3925 373E 8E EB 37 STX IBVOL
3926 3741 20 93 FE JSR SETVID
3927 3744 20 89 FE JSR SETKBD
3928 3747 ;
3929 3747 4C 03 1B DI3 JMP DOSREL ; GO TO POST INIT ROUTINE
Page 92 APPLE DOS 3.1
3930 374A PAGE
3931 374A WBOOT
3932 374A AD F1 37 LDA IBBUFP+1 ;GET START OF DOS
3933 374D 8D E3 37 STA BGNDOS ;SAVE IR
3934 3750 38 SEC
3935 3751 AD E7 37 LDA ADOSLD+1 ;CALCULATE
3936 3754 ED E3 37 SBC BGNDOS
3937 3757 8D E0 37 STA NDPGS ;NO DOS PAGES
3938 375A ;
3939 375A A9 00 LDA #0
3940 375C 8D EC 37 STA IBTRK ;TRACK=0
3941 375F 8D ED 37 STA IBSECT ;SECTOR=0
3942 3762 8D F0 37 STA IBBUFP
3943 3765 ;
3944 3765 AD E7 37 LDA ADOSLD+1 ;GET BOOT START ADR
3945 3768 8D F1 37 STA IBBUFP+1 ;TO BUFP
3946 376B 8D FE 36 STA GRSPG ;TO GARBAGE RECORD
3947 376E ;
3948 376E A9 0A LDA #10 ;NO OF BOOT PAGES
3949 3770 8D E1 37 STA BRWCNT ;TO BOOT I/O COUNTER
3950 3773 8D E2 37 STA BSDSEC
3951 3776 A9 48 LDA #$48
3952 3778 8D FF 36 STA GRPGC
3953 377B ;
3954 377B A9 02 LDA #IBCWTS ;SET WRITE
3955 377D 8D F4 37 STA IBCMD
3956 3780 ;
3957 3780 20 93 37 JSR BOOTIO ; GO WRITE BOOT SECTORS
3958 3783 ;
3959 3783 AD E3 37 LDA BGNDOS ;SET START OF DOS
3960 3786 8D F1 37 STA IBBUFP+1
3961 3789 ;
3962 3789 AD E0 37 LDA NDPGS
3963 378C 8D E1 37 STA BRWCNT
3964 378F 20 93 37 JSR BOOTIO ;GO WRITE DOS
3965 3792 ;
3966 3792 60 RTS ;DONE
Page 93 APPLE DOS 3.1
3967 3793 PAGE
3968 3793 BOOTIO
3969 3793 AD E5 37 LDA BAIOB+1
3970 3796 AC E4 37 LDY BAIOB
3971 3799 20 00 3D JSR DISKIO
3972 379C
3973 379C AC ED 37 LDY IBSECT ;GET SECTOR
3974 379F C8 INY ;INCREMENT TO NEXT
3975 37A0 C0 0D CPY #13 ;AT END OF TRACK
3976 37A2 D0 05 BNE BIO1 ;BR IF NOT SECTOR ZERO
3977 37A4 A0 00 LDY #0 ;SET TO SECTOR ZERO
3978 37A6 EE EC 37 INC IBTRK
3979 37A9 8C ED 37 BIO1 STY IBSECT ;SET NEXT SECTOR
3980 37AC ;
3981 37AC EE F1 37 INC IBBUFP+1 ; INCREMENT BUFFER POINTER
3982 37AF CE E1 37 DEC BRWCNT ;DECREMENT PAGE COUNTER
3983 37B2 D0 DF BNE BOOTIO ;BR IF NOT DONE
3984 37B4 60 RTS
3985 37B5 ;
Page 94 APPLE DOS 3.1
3986 37B5 PAGE
3987 37B5 ;
3988 37B5 ; DOS PATCH AREA 1
3989 37B5 ;
3990 37B5 DP1 EQU * ;*** PATCH *** (EVAR)
3991 37B5 A9 0C LDA #CRQVAR ;VERIFY COMMAND
3992 37B7 20 38 22 JSR OPEN ;TRY VERIFY
3993 37BA A9 06 LDA #CREFNF ;FILE NOT FOUND ERROR CODE
3994 37BC CD F9 34 CMP CCBSTA ;TEST FILE NOT FOUND
3995 37BF D0 03 BNE DP11 ;BR IF FOUND
3996 37C1 4C B2 23 JMP KLUTZ ;ELSE GO FIX THINGS
3997 37C4 DP11
3998 37C4 4C 78 22 JMP ECLOSE ; FILE FOUND, CLOSE AND RTN
3999 37C7 ;
4000 3800 BOUND 256
4001 37E0 ORG *-$20
4002 37E0 EC3
4003 37E0 00 NDPGS DB 0
4004 37E1 00 BRWCNT DB 0
4005 37E2 00 BSDSEC DB 0
4006 37E3 00 BGNDOS DB 0
4007 37E4 E8 37 BAIOB DW @@IOB
4008 37E6 00 36 ADOSLD DW @@DOSLDR
Page 95 APPLE DOS 3.1
4009 37E8 PAGE
4010 37E8 ;
4011 37E8 ; IOB <20> INPUT / OUTPUT CONTROL BLOCK
4012 37E8 ; THE IOB IS USED FOR THE INTERFACE
4013 37E8 ; BETWEEN DOS AND THE DISK I/O ROUTINES
4014 37E8 ;
4015 37E8 IOB
4016 37E8 01 IBTYPE DB 1 ;IOB TYPE CODE
4017 37E9 60 IBSLOT DB $60 ;CONTROLLER SLOT NO.
4018 37EA 01 IBDRVN DB 1 ;DRIVE NUMBER
4019 37EB FF IBVOL DB $FF ;VOLUME NUMBER
4020 37EC 11 IBTRK DB $11 ;TRACK NUMBER
4021 37ED 0B IBSECT DB $0B ;SECTOR NUMBER
4022 37EE FB 37 IBDCTP DW @@DCT
4023 37F0 EF 33 IBBUFP DW @@$33EF ;POINTER TO BUFFER
4024 37F2 00 00 IBDLEN DW @@0 ;DATA LENGTH
4025 37F4 01 IBCMD DB 1 ;COMMAND
4026 37F5 IBCNUL EQU 0 ;0-NULL COMMAND
4027 37F5 IBCRTS EQU 1 ;1-READ TRACK, SECTOR
4028 37F5 IBCWTS EQU 2 ;2-WRITE TRACK, SECTOR
4029 37F5 IBFMT EQU 4 ;4-FORMAT DISK
4030 37F5 IBBOOT EQU 8 ;8-WRITE BOOT
4031 37F5 00 IBSTAT DB 0 ;STATUS
4032 37F6 IBRERR EQU $80 ;READ ERR
4033 37F6 IBDERR EQU $40 ;DRIVE ERR
4034 37F6 IBVMME EQU $20 ;VOLUME MISMATCH
4035 37F6 IBWPER EQU $10 ;WRITE PROTECT ERROR
4036 37F6 10 IBSMOD DB $10 ;STATUS MODIFIER BYTE
4037 37F7 60 IBPSLT DB $60 ;PREVIOUS SLOT
4038 37F8 01 IBPDRV DB 1 ;PREVIOUS DRIVE
4039 37F9 IBSPAR RMB 2 ;IOB SPARES
4040 37FB 00 01 EF D8 DCT DB 0,1,$EF,$D8
4041 37FF 00 DB 0
Page 96 APPLE DOS 3.1
4042 3800 PAGE
4043 3800 ;
4044 3800 ; FILE DIRECTORY DEFINITION
4045 3800 ;
4046 3800 ; ORG 0
4047 3800 ;FILDIR
4048 3800 ;FDUCDE RMB 1 ;FILE USE CODE
4049 3800 ;FDLTRK RMB 1 ;LINK TO NXT DIR TRACK
4050 3800 ;FDLSEC RMB 1 ;LINK TO NEXT DIR SECTOR
4051 3800 ;FDNSA RMB 1 ;NO SECTOR ALLOCATED
4052 3800 ;FDLSDL RMB 1 ;LAST SECTOR DATA LENGTH
4053 3800 ;FDFRS RMB 2 ;1ST RELATIVE SECTOR IN THIS DIR
4054 3800 ;FDSPAR RMB 5 ;SPARES
4055 3800 ;;
4056 3800 ;FDENT RMB 1 ;START OF FILE ENTRIES (122)
4057 3800 ;FDTRK EQU 0 ;TRACK
4058 3800 ;FDSEC EQU 1 ;SECTOR
4059 3800 ;;
4060 3800 ;FDLAST EQU FILDIR+256
4061 3800 ;
4062 3800 ZPORG EQU 0
4063 3800 FILDIR EQU ZPORG
4064 3800 FDUCDE EQU ZPORG ;FILE USE CODE
4065 3800 FDLTRK EQU ZPORG+1 ;LINK TO NXT DIR TRACK
4066 3800 FDLSEC EQU ZPORG+2 ;LINK TO NEXT DIR SECTOR
4067 3800 FDNSA EQU ZPORG+3 ;NO SECTOR ALLOCATED
4068 3800 FDLSDL EQU ZPORG+4 ;LAST SECTOR DATA LENGTH
4069 3800 FDFRS EQU ZPORG+5 ;1ST RELATIVE SECTOR IN THIS DIR
4070 3800 FDSPAR EQU ZPORG+7 ;SPARES
4071 3800 ;
4072 3800 FDENT EQU ZPORG+12 ;START OF FILE ENTRIES (122)
4073 3800 FDTRK EQU 0 ;TRACK
4074 3800 FDSEC EQU 1 ;SECTOR
4075 3800 ;
4076 3800 FDLAST EQU FILDIR+256
Page 97 APPLE DOS 3.1
4077 3800 PAGE
4078 3800 ;
4079 3800 ***************************
4080 3800 * DISC-II *
4081 3800 * 13-SECTOR FORMAT *
4082 3800 * READ AND WRITE *
4083 3800 * SUBROUTINES *
4084 3800 * *
4085 3800 ***************************
4086 3800 * *
4087 3800 * *
4088 3800 * COPYRIGHT 1978 *
4089 3800 * APPLE COMPUTER INC. *
4090 3800 * *
4091 3800 * ALL RIGHTS RESERVED *
4092 3800 * *
4093 3800 ***************************
4094 3800 * *
4095 3800 * MAY 25, 1978 *
4096 3800 * WOZ *
4097 3800 * R. WIGGINTON *
4098 3800 * *
4099 3800 ***************************
Page 98 APPLE DOS 3.1
4100 3800 EJECT
4101 3800 ***************************
4102 3800 * *
4103 3800 * CRITICAL TIMING *
4104 3800 * REQUIRES PAGE BOUND *
4105 3800 * CONSIDERATIONS FOR *
4106 3800 * CODE AND DATA *
4107 3800 * *
4108 3800 * -----CODE----- *
4109 3800 * *
4110 3800 * VIRTUALLY THE ENTIRE *
4111 3800 * 'WRITE' ROUTINE *
4112 3800 * MUST NOT CROSS *
4113 3800 * PAGE BOUNDARIES. *
4114 3800 * *
4115 3800 * CRITICAL BRANCHES IN *
4116 3800 * THE 'WRITE', 'READ', *
4117 3800 * AND 'READ ADR' SUBRS *
4118 3800 * WHICH MUST NOT CROSS *
4119 3800 * PAGE BOUNDARIES ARE *
4120 3800 * NOTED IN COMMENTS. *
4121 3800 * *
4122 3800 * -----DATA----- *
4123 3800 * *
4124 3800 * NBUF1, NBUF2, NBUF3, *
4125 3800 * NBUF4, AND NBUF5 ARE *
4126 3800 * 51-BYTE RAM BUFFERS *
4127 3800 * WHICH SHOULD ALL BE *
4128 3800 * LOCATED ON A SINGLE *
4129 3800 * PAGE BEGINNING WITH *
4130 3800 * NBUF1. (NBUF5 IS 52). *
4131 3800 * *
4132 3800 * NBUF6, NBUF7, AND *
4133 3800 * NBUF8 MUST NOT CROSS *
4134 3800 * PAGE BOUNDARIES AND *
4135 3800 * SHOULD BE LOCATED *
4136 3800 * ON A PAGE BEGINNING *
4137 3800 * WITH NBUF6. NBUF6 *
4138 3800 * AND NBUF7 ARE 51 BYTES *
4139 3800 * WHILE NBUF8 IS 52. *
4140 3800 * *
4141 3800 * NIBLIZING TABLE 'NIBL' *
4142 3800 * (32 BYTES) MUST NOT *
4143 3800 * CROSS PAGE BOUNDARY. *
4144 3800 * CONVERTS 5-BIT NIBLS *
4145 3800 * TO 7-BIT NIBLS. *
4146 3800 * *
4147 3800 * DENIBLIZING TABLE *
4148 3800 * 'DNIBL' MUST BE ON A *
4149 3800 * PAGE BOUNDARY, BUT *
4150 3800 * ONLY DNIBL,$AB TO *
4151 3800 * DNIBL,$FF NEED BE *
4152 3800 * USED. CONVERTS 7-BIT *
4153 3800 * NIBLS TO 5-BIT NIBLS. *
4154 3800 * *
4155 3800 ***************************
Page 99 APPLE DOS 3.1
4156 3800 EJECT
4157 3800 ***************************
4158 3800 * *
4159 3800 * EQUATES *
4160 3800 * *
4161 3800 ***************************
4162 3800 * *
4163 3800 * -----PRENIBL---- *
4164 3800 * AND POSTNIBL *
4165 3800 * *
4166 3800 ***************************
4167 3800 BUF EQU $3E ;TWO BYTE POINTER.
4168 3800 *
4169 3800 * POINTS TO 256-BYTE
4170 3800 * USER BUFFER ANYWHERE
4171 3800 * IN MEMORY. PRENIBL
4172 3800 * CONVERTS USER DATA
4173 3800 * (IN BUF) INTO 5-BIT
4174 3800 * NIBLS 000ABCDE IN
4175 3800 * NBUF1 THROUGH NBUF8
4176 3800 * PRIOR TO 'WRITE'.
4177 3800 * POSTNIBL CONVERTS
4178 3800 * 5-BIT NIBLS ABCDE000
4179 3800 * BACK TO USER DATA
4180 3800 * (IN BUF) AFTER 'READ'.
4181 3800 *
4182 3800 NBUF1 EQU $3B00
4183 3800 NBUF2 EQU $3B33 ;OBSERVE THESE
4184 3800 NBUF3 EQU $3B66 ;PLACEMENTS
4185 3800 NBUF4 EQU $3B99 ;RELATIVE TO
4186 3800 NBUF5 EQU $3BCC ;PAGE STARTS!
4187 3800 NBUF6 EQU $3C00
4188 3800 NBUF7 EQU $3C33
4189 3800 NBUF8 EQU $3C66 ;(TO $BC99)
4190 3800 *
4191 3800 T0 EQU $26 ;TEMPS USED BY PRENIBL
4192 3800 T1 EQU $27 ; AND POSTNIBL.
4193 3800 T2 EQU $2A ;TEMP USED BY PRENIBL.
4194 3800 *
4195 3800 ************************
4196 3800 * *
4197 3800 * ----READADR---- *
4198 3800 * *
4199 3800 ************************
4200 3800 COUNT EQU $26 ;'MUST FIND' COUNT.
4201 3800 LAST EQU $26 ;'ODD BIT' NIBLS.
4202 3800 CSUM EQU $27 ;CHECKSUM BYTE.
4203 3800 CSSTV EQU $2C ;FOUR BYTES,
4204 3800 * CHECKSUM, SECTOR, TRACK, AND VOLUME.
4205 3800 *
4206 3800 ************************
4207 3800 * *
4208 3800 * ----WRITE---- *
4209 3800 * *
4210 3800 * USES ALL NBUFS *
4211 3800 * AND 32-BYTE *
4212 3800 * DATA TABLE 'NIBL' *
4213 3800 * *
4214 3800 ************************
4215 3800 WTEMP EQU $26 ;TEMP FOR DATA AT NBUF6,0.
4216 3800 SLOTZ EQU $27 ;SLOTNUM IN Z-PAG LOC.
4217 3800 SLOTABS EQU $678 ;SLOTNUM IN NON-ZPAG LOC.
4218 3800 *
4219 3800 ************************
4220 3800 * *
4221 3800 * -----READ---- *
4222 3800 * *
4223 3800 * USES ALL NBUFS *
4224 3800 * USES LAST 54 BYTES *
4225 3800 * OF A CODE PAGE FOR *
4226 3800 * USED BYTES OF DNIBL *
4227 3800 * TABLE. *
4228 3800 * *
4229 3800 ************************
4230 3800 IDX EQU $26 ;INDEX INTO (BUF).
4231 3800 DNIBL EQU $3A00 ;7-BIT TO 5-BIT NIBLS.
4232 3800 *
4233 3800 ************************
4234 3800 * *
4235 3800 * ---- SEEK ---- *
4236 3800 * *
4237 3800 ************************
4238 3800 TRKCNT EQU $26 ;HALFTRKS MOVED COUNT.
4239 3800 PRIOR EQU $27 ;PRIOR HALFTRACK.
4240 3800 TRKN EQU $2A ;DESIRED TRACK.
4241 3800 SLOTTEMP EQU $2B ;SLOT NUM TIMES $10.
4242 3800 CURTRK EQU $478 ;CURRENT TRACK ON ENTYR.
4243 3800 *
4244 3800 ************************
4245 3800 * *
4246 3800 * ---- MSWAIT ---- *
4247 3800 * *
4248 3800 ************************
4249 3800 MONTIMEL EQU $46
4250 3800 MONTIMEH EQU $47
4251 3800 *
4252 3800 ************************
4253 3800 * *
4254 3800 * DEVICE ADDRESS *
4255 3800 * ASSIGNMENTS *
4256 3800 * *
4257 3800 ************************
4258 3800 PHASEOFF EQU $C080 ;STEPPER PHASE OFF.
4259 3800 PHASEON EQU $C081 ;STEPPER PHASE ON.
4260 3800 Q6L EQU $C08C ;Q7L,Q6L=READ
4261 3800 Q6H EQU $C08D ;Q7L,Q6H=SENSE WPROT
4262 3800 Q7L EQU $C08E ;Q7H,Q6L=WRITE
4263 3800 Q7H EQU $C08F ;Q7H,Q6H=WRITE STORE
Page 100 APPLE DOS 3.1
4264 3800 EJECT
4265 3800 ****************************
4266 3800 * *
4267 3800 * PRENIBLIZE SUBR *
4268 3800 * *
4269 3800 ****************************
4270 3800 * *
4271 3800 * CONVERTS 256 BYTES OF *
4272 3800 * USER DATA IN (BUF),0 *
4273 3800 * TO (BUF),255 INTO 410 *
4274 3800 * 5-BIT NIBLS (000ABCDE) *
4275 3800 * IN NBUF1 THROUGH NBUF8. *
4276 3800 * *
4277 3800 * ---- ON ENTRY ---- *
4278 3800 * *
4279 3800 * BUF IS 2-BYTE POINTER *
4280 3800 * TO 256 BYTES OF USER *
4281 3800 * DATA. *
4282 3800 * *
4283 3800 * ---- ON EXIT ----- *
4284 3800 * *
4285 3800 * A-REG: UNCERTAIN. *
4286 3800 * X-REG: UNCERTAIN. *
4287 3800 * Y-REG: HOLDS $FF. *
4288 3800 * CARRY: UNCERTAIN. *
4289 3800 * *
4290 3800 * NBUF1 THROUGH NBUF8 *
4291 3800 * CONTAIN 5-BIT NIBLS *
4292 3800 * OF FORM 000ABCDE. *
4293 3800 * *
4294 3800 * TEMPS T0, T1, T2 USED. *
4295 3800 * *
4296 3800 ****************************
4297 3800 ORG $3800
4298 3800 * OBJ $B800
4299 3800 A2 32 PRENIBL LDX #$32 ;INDEX FOR (51) 5-BYTE PASSES.
4300 3802 A0 00 LDY #$0 ;USER BUF INDEX.
4301 3804 B1 3E PNIB1 LDA (BUF),Y ;FIRST OF 5 USER BYTES.
4302 3806 85 26 STA T0 ;(ONLY 3 LSB'S USED)
4303 3808 4A LSRA
4304 3809 4A LSRA ;5 MSB'S TO LOW BITS.
4305 380A 4A LSRA
4306 380B 9D 00 3B STA NBUF1,X ;FIRST OF 8 5-BIT NIBLS.
4307 380E C8 INY
4308 380F B1 3E LDA (BUF),Y ;SECOND OF 5 USER BYTES.
4309 3811 85 27 STA T1 ;ONLY 3 LSB'S USED)
4310 3813 4A LSRA
4311 3814 4A LSRA ;5 MSB'S TO LOW BITS.
4312 3815 4A LSRA
4313 3816 9D 33 3B STA NBUF2,X ;SECOND OF 8 5-BIT NIBLS.
4314 3819 C8 INY
4315 381A B1 3E LDA (BUF),Y ;THIRD OF 5 USER BYTES.
4316 381C 85 2A STA T2 ;(ONLY 3 LSB'S USED)
4317 381E 4A LSRA
4318 381F 4A LSRA ;5 MSB'S TO LOW BITS.
4319 3820 4A LSRA
4320 3821 9D 66 3B STA NBUF3,X ;THIRD OF 8 5-BIT NIBLS.
4321 3824 C8 INY
4322 3825 B1 3E LDA (BUF),Y ;FOURTH OF 5 USER BYTES.
4323 3827 4A LSRA
4324 3828 26 2A ROL T2 ;LSB INTO T2.
4325 382A 4A LSRA
4326 382B 26 27 ROL T1 ;NEXT LSB INTO T1.
4327 382D 4A LSRA
4328 382E 26 26 ROL T0 ;NEXT LSB INTO T0.
4329 3830 9D 99 3B STA NBUF4,X ;FOURTH OF 8 5-BIT NIBLS.
4330 3833 C8 INY
4331 3834 B1 3E LDA (BUF),Y ;FIFTH OF 5 USER BYTES.
4332 3836 4A LSRA
4333 3837 26 2A ROL T2 ;LSB INTO T2.
4334 3839 4A LSRA
4335 383A 26 27 ROL T1 ;NEXT LSB INTO T1.
4336 383C 4A LSRA
4337 383D 9D CC 3B STA NBUF5,X ;FIFTH OF 8 5-BIT NIBLS.
4338 3840 A5 26 LDA T0
4339 3842 2A ROLA ;NEXT LSB.
4340 3843 29 1F AND #$1F ;TRUNCATE TO 5 BITS.
4341 3845 9D 00 3C STA NBUF6,X ;SIXTH OF 8 5-BIT NIBLS.
4342 3848 A5 27 LDA T1
4343 384A 29 1F AND #$1F ;TRUNCATE TO 5 BITS.
4344 384C 9D 33 3C STA NBUF7,X ;SEVENTH OF 8 5-BIT NIBLS.
4345 384F A5 2A LDA T2
4346 3851 29 1F AND #$1F ;TRUNCATE TO 5 BITS.
4347 3853 9D 66 3C STA NBUF8,X ;EIGHTH OF 8 5-BIT NIBLS.
4348 3856 C8 INY
4349 3857 CA DEX ;NEXT OF (51) 5-BYTE PASSES.
4350 3858 10 AA BPL PNIB1
4351 385A B1 3E LDA (BUF),Y
4352 385C AA TAX
4353 385D 29 07 AND #$7 ;3 LSB'S OF LAST
4354 385F 8D 99 3C STA NBUF8+$33 ; USER BYTE.
4355 3862 8A TXA
4356 3863 4A LSRA
4357 3864 4A LSRA
4358 3865 4A LSRA ;5 MSB'S OF LAST
4359 3866 8D FF 3B STA NBUF5+$33 ; USER BYTE.
4360 3869 60 RTS
Page 101 APPLE DOS 3.1
4361 386A EJECT
4362 386A ************************
4363 386A * *
4364 386A * WRITE SUBR *
4365 386A * *
4366 386A ************************
4367 386A * *
4368 386A * WRITES DATA FROM *
4369 386A * NBUF1 TO NBUF8 *
4370 386A * CONVERTING 5-BIT *
4371 386A * TO 7-BIT NIBLS *
4372 386A * VIA 'NIBL' TABLE. :
4373 386A * *
4374 386A * FIRST, NBUF6 TO *
4375 386A * NBUF8, HIGH TO LOW *
4376 386A * THEN, NBUF1 TO *
4377 386A * NBUF5, LOW TO HIGH *
4378 386A * *
4379 386A * ---- ON ENTRY ---- *
4380 386A * *
4381 386A * X-REG: SLOTNUM *
4382 386A * TIMES $10. *
4383 386A * *
4384 386A * NBUF1 TO NBUF8 *
4385 386A * HOLD NIBLS FROM *
4386 386A * PRENIBL SUBR. *
4387 386A * (000ABCDE) *
4388 386A * *
4389 386A * ---- ON EXIT ----- *
4390 386A * *
4391 386A * CARRY SET IF ERROR. *
4392 386A * (W PROT VIOLATION) *
4393 386A * *
4394 386A * IF NO ERROR: *
4395 386A * *
4396 386A * A-REG: UNCERTAIN. *
4397 386A * X-REG: UNCHANGED. *
4398 386A * Y-REG: HOLDS $00. *
4399 386A * CARRY CLEAR. *
4400 386A * *
4401 386A * SLOTABS, SLOTZ, *
4402 386A * AND WTEMP USED. *
4403 386A * *
4404 386A * ---- ASSUMES ---- *
4405 386A * *
4406 386A * 1 USEC CYCLE TIME *
4407 386A * *
4408 386A ************************
4409 386A 38 WRITE SEC ;ANTICIPATE WPROT ERR.
4410 386B BD 8D C0 LDA Q6H,X
4411 386E BD 8E C0 LDA Q7L,X ;SENSE WPROT FLAG.
4412 3871 30 7C BMI WEXIT ; IF HIGH, THEN ERR.
4413 3873 86 27 STX SLOTZ ;FOR ZERO PAGE ACCESS.
4414 3875 8E 78 06 STX SLOTABS ;FOR NON-ZERO PAGE.
4415 3878 AD 00 3C LDA NBUF6
4416 387B 85 26 STA WTEMP ;FOR ZERO-PAGE ACCESS.
4417 387D A9 FF LDA #$FF ;SYNC DATA.
4418 387F 9D 8F C0 STA Q7H,X ;(5) WRITE 1ST NIBL.
4419 3882 1D 8C C0 ORA Q6L,X ;(4)
4420 3885 48 PHA ;(3)
4421 3886 68 PLA ;(4) CRITICAL TIMING!
4422 3887 EA NOP ;(2)
4423 3888 A0 0A LDY #$A ;(2) FOR 11 NIBLS.
4424 388A 05 26 WSYNC ORA WTEMP ;(3) FOR TIMING.
4425 388C 20 F4 38 JSR WNIBL7 ;(13,9,6) WRITE SYNC.
4426 388F 88 DEY ;(2)
4427 3890 D0 F8 BNE WSYNC ;(2*) MUST NOT CROSS PAGE!
4428 3892 A9 D5 LDA #$D5 ;(2) 1ST DATA MARK.
4429 3894 20 F3 38 JSR WNIBL9 ;(15,9,6)
4430 3897 A9 AA LDA #$AA ;(2) 2ND DATA MARK.
4431 3899 20 F3 38 JSR WNIBL9 ;(15,9,6)
4432 389C A9 AD LDA #$AD ;(2) 3RD DATA MARK.
4433 389E 20 F3 38 JSR WNIBL9 ;(15,9,6)
4434 38A1 98 TYA ;(2) CLEAR CHKSUM.
4435 38A2 A0 9A LDY #$9A ;(2) NBUF6-8 INDEX.
4436 38A4 D0 03 BNE WDATA1 ;(3) ALWAYS. NO PAGE CROSS!!
4437 38A6 B9 00 3C WDATA0 LDA NBUF6,Y ;(4) PRIOR 5-BIT NIBL.
4438 38A9 59 FF 3B WDATA1 EOR NBUF6-1,Y ;(5) XOR WITH CURRENT.
4439 38AC * (NBUF6 MUST BE ON PAGE BOUNDARY FOR TIMING!!)
4440 38AC AA TAX ;(2) INDEX TO 7-BIT NIBL.
4441 38AD BD 9A 3C LDA NIBL,X ;(4) MUST NOT CROSS PAGE!
4442 38B0 A6 27 LDX SLOTZ ;(3) CRITICAL TIMING!
4443 38B2 9D 8D C0 STA Q6H,X ;(5) WRITE NIBL.
4444 38B5 BD 8C C0 LDA Q6L,X ;(4)
4445 38B8 88 DEY ;(2) NEXT NIBL.
4446 38B9 D0 EB BNE WDATA0 ;(2*) MUST NOT CROSS PAGE!
4447 38BB A5 26 LDA WTEMP ;(3) PRIOR NIBL FROM BUF6.
4448 38BD EA NOP ;(2) CRITICAL TIMING.
4449 38BE 59 00 3B WDATA2 EOR NBUF1,Y ;(4) XOR NBUF1 NIBL.
4450 38C1 AA TAX ;(2) INDEX TO 7-BIT NIBL.
4451 38C2 BD 9A 3C LDA NIBL,X ;(4)
4452 38C5 AE 78 06 LDX SLOTABS ;(4) TIMING CRITICAL.
4453 38C8 9D 8D C0 STA Q6H,X ;(5) WRITE NIBL.
4454 38CB BD 8C C0 LDA Q6L,X ;(4)
4455 38CE B9 00 3B LDA NBUF1,Y ;(4) PRIOR 5-BIT NIBL.
4456 38D1 C8 INY ;(2) NEXT NBUF1 NIBL.
4457 38D2 D0 EA BNE WDATA2 ;(2*) MUST NOT CROSS PAGE!
4458 38D4 AA TAX ;(2) LAST NIBL AS CHKSUM.
4459 38D5 BD 9A 3C LDA NIBL,X ;(4) INDEX TO 7-BIT NIBL.
4460 38D8 A6 27 LDX SLOTZ ;(3)
4461 38DA 20 F6 38 JSR WNIBL ;(6,9,6) WRITE CHKSUM.
4462 38DD A9 DE LDA #$DE ;(2) DM4, BIT SLIP MARK.
4463 38DF 20 F3 38 JSR WNIBL9 ;(15,9,6) WRITE IT.
4464 38E2 A9 AA LDA #$AA ;(2) DM5, BIT SLIP MARK.
4465 38E4 20 F3 38 JSR WNIBL9 ;(15,9,6) WRITE IT.
4466 38E7 A9 EB LDA #$EB ;(2) DM6, BIT SLIP MARK.
4467 38E9 20 F3 38 JSR WNIBL9 ;(15,9,6) WRITE IT.
4468 38EC BD 8E C0 LDA Q7L,X ; OUT OF WRITE MODE.
4469 38EF BD 8C C0 WEXIT LDA Q6L,X ; TO READ MODE.
4470 38F2 60 RTS ; RETURN FROM WRITE.
4471 38F3 *****************************
4472 38F3 * *
4473 38F3 * 7-BIT NIBL WRITE SUBRS *
4474 38F3 * *
4475 38F3 * A-REG OR'D PRIOR EXIT *
4476 38F3 * CARRY CLEARED *
4477 38F3 * *
4478 38F3 *****************************
4479 38F3 18 WNIBL9 CLC ;(2) 9 CYCLES, THEN WRITE.
4480 38F4 48 WNIBL7 PHA ;(3) 7 CYCLES, THEN WRITE.
4481 38F5 68 PLA ;(4)
4482 38F6 9D 8D C0 WNIBL STA Q6H,X ;(5) NIBL WRITE SUB.
4483 38F9 1D 8C C0 ORA Q6L,X ;(4) CLOBBERS ACC, NOT CARRY.
4484 38FC 60 RTS
Page 102 APPLE DOS 3.1
4485 38FD EJECT
4486 38FD **************************
4487 38FD * *
4488 38FD * READ SUBROUTINE *
4489 38FD * *
4490 38FD **************************
4491 38FD * *
4492 38FD * READS 5-BIT NIBLS *
4493 38FD * (ABCDE000) INTO *
4494 38FD * NBUF1 THROUGH NBUF8 *
4495 38FD * CONVERTING 7-BIT *
4496 38FD * NIBLS TO 5-BIT *
4497 38FD * VIA 'DNIBL' TABLE *
4498 38FD * *
4499 38FD * FIRST READS NBUF6 TO *
4500 38FD * NBUF8 HIGH TO LOW, *
4501 38FD * THEN READS NBUF1 TO *
4502 38FD * NBUF5 LOW TO HIGH *
4503 38FD * *
4504 38FD * ---- ON ENTRY ---- *
4505 38FD * *
4506 38FD * X-REG: SLOTNUM *
4507 38FD * TIMES $10. *
4508 38FD * *
4509 38FD * READ MODE (Q6L, Q7L) *
4510 38FD * *
4511 38FD * ---- ON EXIT ----- *
4512 38FD * *
4513 38FD * CARRY SET IF ERROR. *
4514 38FD * *
4515 38FD * IF NO ERROR: *
4516 38FD * A-REG: HOLDS $AA *
4517 38FD * X-REG: UNCHANGED. *
4518 38FD * Y-REG: HOLDS $00 *
4519 38FD * CARRY CLEAR. *
4520 38FD * *
4521 38FD * NBUF1 TO NBUF8 *
4522 38FD * HOLD 5-BIT *
4523 38FD * NIBLS ABCDE000. *
4524 38FD * *
4525 38FD * USES TEMP 'IDX'. *
4526 38FD * *
4527 38FD * ---- CAUTION ----- *
4528 38FD * *
4529 38FD * OBSERVE *
4530 38FD * 'NO PAGE CROSS' *
4531 38FD * WARNINGS ON *
4532 38FD * SOME BRANCHES!! *
4533 38FD * *
4534 38FD * ---- ASSUMES ---- *
4535 38FD * *
4536 38FD * 1 USEC CYCLE TIME *
4537 38FD * *
4538 38FD **************************
4539 38FD A0 20 READ LDY #$20 ;'MUST FIND' COUNT.
4540 38FF 88 RSYNC DEY ;IF CAN'T FIND MARKS
4541 3900 F0 61 BEQ RDERR ;THEN EXIT WITH CARRY SET.
4542 3902 BD 8C C0 RDD1 LDA Q6L,X ;READ NIBL.
4543 3905 10 FB BPL RDD1 ;*** NO PAGE CROSS! ***
4544 3907 49 D5 RSYNC1 EOR #$D5 ;DATA MARK 1?
4545 3909 D0 F4 BNE RSYNC ; LOOP IF NOT.
4546 390B EA NOP ;DELAY BETWEEN NIBLS.
4547 390C BD 8C C0 RDD2 LDA Q6L,X
4548 390F 10 FB BPL RDD2 ;*** NO PAGE CROSS! ***
4549 3911 C9 AA CMP #$AA ;DATA MARK 2?
4550 3913 D0 F2 BNE RSYNC1 ; (IF NOT, IS IT DM1?)
4551 3915 A0 9A LDY #$9A ;INIT NBUF6 INDEX.
4552 3917 * (ADDED NIBL DELAY)
4553 3917 BD 8C C0 RDD3 LDA Q6L,X
4554 391A 10 FB BPL RDD3 ;*** NO PAGE CROSS! ***
4555 391C C9 AD CMP #$AD ;DATA MARK 3?
4556 391E D0 E7 BNE RSYNC1 ; (IF NOT, IS IT DM1?)
4557 3920 * (CARRY SET IF DM3!)
4558 3920 A9 00 LDA #$00 ;INIT CHECKSUM.
4559 3922 88 RDATA1 DEY
4560 3923 84 26 STY IDX
4561 3925 BC 8C C0 RDD4 LDY Q6L,X
4562 3928 10 FB BPL RDD4 ;*** NO PAGE CROSS! ***
4563 392A 59 00 3A EOR DNIBL,Y ;XOR 5-BIT NIBL.
4564 392D A4 26 LDY IDX
4565 392F 99 00 3C STA NBUF6,Y ;STORE IN NBUF6 PAGE.
4566 3932 D0 EE BNE RDATA1 ;TAKEN IF Y-REG NONZERO.
4567 3934 84 26 RDATA2 STY IDX
4568 3936 BC 8C C0 RDD5 LDY Q6L,X
4569 3939 10 FB BPL RDD5 ;*** NO PAGE CROSS! ***
4570 393B 59 00 3A EOR DNIBL,Y ;XOR 5-BIT NIBL.
4571 393E A4 26 LDY IDX
4572 3940 99 00 3B STA NBUF1,Y ;STORE IN NBUF1 PAGE.
4573 3943 C8 INY
4574 3944 D0 EE BNE RDATA2
4575 3946 BC 8C C0 RDD6 LDY Q6L,X ;READ 7-BIT CSUM NIBL.
4576 3949 10 FB BPL RDD6 ;*** NO PAGE CROSS! ***
4577 394B D9 00 3A CMP DNIBL,Y ;IF LAST NBUF1 NIBL NOT
4578 394E D0 13 BNE RDERR ;EQUAL CHKSUM NIBL THEN ERR.
4579 3950 BD 8C C0 RDD7 LDA Q6L,X
4580 3953 10 FB BPL RDD7 ;*** NO PAGE CROSS! ***
4581 3955 C9 DE CMP #$DE ;FIRST BIT SLIP MARK?
4582 3957 D0 0A BNE RDERR ; (ERR IF NOT)
4583 3959 EA NOP ;DELAY BETWEEN NIBLS.
4584 395A BD 8C C0 RDD8 LDA Q6L,X
4585 395D 10 FB BPL RDD8 ;*** NO PAGE CROSS! ***
4586 395F C9 AA CMP #$AA ;SECOND BIT SLIP MARK?
4587 3961 F0 5C BEQ RDEXIT ; (DONE IF IT IS)
4588 3963 38 RDERR SEC ;INDICATE 'ERROR EXIT'.
4589 3964 60 RTS ;RETURN FROM READ OR READADR.
Page 103 APPLE DOS 3.1
4590 3965 EJECT
4591 3965 ****************************
4592 3965 * *
4593 3965 * READ ADDRESS FIELD *
4594 3965 * *
4595 3965 * SUBROUTINE *
4596 3965 * *
4597 3965 ****************************
4598 3965 * *
4599 3965 * READS VOLUME, TRACK *
4600 3965 * AND SECTOR *
4601 3965 * *
4602 3965 * ---- ON ENTRY ---- *
4603 3965 * *
4604 3965 * XREG: SLOTNUM TIMES $10 *
4605 3965 * *
4606 3965 * READ MODE (Q6L, Q7L) *
4607 3965 * *
4608 3965 * ---- ON EXIT ----- *
4609 3965 * *
4610 3965 * CARRY SET IF ERROR. *
4611 3965 * *
4612 3965 * IF NO ERROR: *
4613 3965 * A-REG: HOLDS $AA. *
4614 3965 * Y-REG: HOLDS $00. *
4615 3965 * X-REG: UNCHANGED. *
4616 3965 * CARRY CLEAR. *
4617 3965 * *
4618 3965 * CSSTV HOLDS CHKSUM, *
4619 3965 * SECTOR, TRACK, AND *
4620 3965 * VOLUME READ. *
4621 3965 * *
4622 3965 * USES TEMPS COUNT, *
4623 3965 * LAST, CSUM, AND *
4624 3965 * 4 BYTES AT CSSTV. *
4625 3965 * *
4626 3965 * ---- EXPECTS ---- *
4627 3965 * *
4628 3965 * NORMAL DENSITY NIBLS *
4629 3965 * (4-BIT), ODD BITS, *
4630 3965 * THEN EVEN. *
4631 3965 * *
4632 3965 * ---- CAUTION ---- *
4633 3965 * *
4634 3965 * OBSERVE *
4635 3965 * 'NO PAGE CROSS' *
4636 3965 * WARNINGS ON *
4637 3965 * SOME BRANCHES!! *
4638 3965 * *
4639 3965 * ---- ASSUMES ---- *
4640 3965 * *
4641 3965 * 1 USEC CYCLE TIME *
4642 3965 * *
4643 3965 ****************************
4644 3965 A0 F8 RDADR LDY #$F8
4645 3967 84 26 STY COUNT ;'MUST FIND' COUNT.
4646 3969 C8 RDASYN INY
4647 396A D0 04 BNE RDA1 ;LOW ORDER OF COUNT.
4648 396C E6 26 INC COUNT ;(2K NIBLS TO FIND
4649 396E F0 F3 BEQ RDERR ; ADR MARK, ELSE ERR)
4650 3970 BD 8C C0 RDA1 LDA Q6L,X ;READ NIBL.
4651 3973 10 FB BPL RDA1 ;*** NO PAGE CROSS! ***
4652 3975 C9 D5 RDASN1 CMP #$D5 ;ADR MARK 1?
4653 3977 D0 F0 BNE RDASYN ; (LOOP IF NOT)
4654 3979 EA NOP ;ADDED NIBL DELAY.
4655 397A BD 8C C0 RDA2 LDA Q6L,X
4656 397D 10 FB BPL RDA2 ;*** NO PAGE CROSS! ***
4657 397F C9 AA CMP #$AA ;ADR MARK 2?
4658 3981 D0 F2 BNE RDASN1 ; (IF NOT, IS IT AM1?)
4659 3983 A0 03 LDY #$3 ;INDEX FOR 4-BYTE READ.
4660 3985 * (ADDED NIBL DELAY)
4661 3985 BD 8C C0 RDA3 LDA Q6L,X
4662 3988 10 FB BPL RDA3 ;*** NO PAGE CROSS! ***
4663 398A C9 B5 CMP #$B5 ;ADR MARK 3?
4664 398C D0 E7 BNE RDASN1 ; (IF NOT, IS IT AM1?)
4665 398E * (LEAVES CARRY SET!)
4666 398E A9 00 LDA #$0 ;INIT CHECKSUM.
4667 3990 85 27 RDAFLD STA CSUM
4668 3992 BD 8C C0 RDA4 LDA Q6L,X ;READ 'ODD BIT' NIBL.
4669 3995 10 FB BPL RDA4 ;*** NO PAGE CROSS! ***
4670 3997 2A ROLA ;ALIGN ODD BITS, '1' INTO LSB.
4671 3998 85 26 STA LAST ; (SAVE THEM)
4672 399A BD 8C C0 RDA5 LDA Q6L,X ;READ 'EVEN BIT' NIBL.
4673 399D 10 FB BPL RDA5 ;*** NO PAGE CROSS! ***
4674 399F 25 26 AND LAST ;MERGE ODD AND EVEN BITS.
4675 39A1 99 2C 00 STA CSSTV,Y ;STORE DATA BYTE.
4676 39A4 45 27 EOR CSUM ;XOR CHECKSUM.
4677 39A6 88 DEY
4678 39A7 10 E7 BPL RDAFLD ;LOOP ON 4 DATA BYTES.
4679 39A9 A8 TAY ;IF FINAL CHECKSUM
4680 39AA D0 B7 BNE RDERR ; NONZERO, THEN ERROR.
4681 39AC BD 8C C0 RDA6 LDA Q6L,X ;FIRST BIT-SLIP NIBL.
4682 39AF 10 FB BPL RDA6 ;*** NO PAGE CROSS! ***
4683 39B1 C9 DE CMP #$DE
4684 39B3 D0 AE BNE RDERR ;ERROR IF NONMATCH.
4685 39B5 EA NOP ;DELAY BETWEEN NIBLS.
4686 39B6 BD 8C C0 RDA7 LDA Q6L,X ;SECOND BIT-SLIP NIBL.
4687 39B9 10 FB BPL RDA7 ;*** NO PAGE CROSS! ***
4688 39BB C9 AA CMP #$AA
4689 39BD D0 A4 BNE RDERR ;ERROR IF NONMATCH.
4690 39BF 18 RDEXIT CLC ;CLEAR CARRY ON
4691 39C0 60 RTS ;NORMAL READ EXITS.
Page 104 APPLE DOS 3.1
4692 39C1 EJECT
4693 39C1 ***************************
4694 39C1 * *
4695 39C1 * POSTNIBLIZE SUBR *
4696 39C1 * *
4697 39C1 ***************************
4698 39C1 * *
4699 39C1 * CONVERTS 5-BIT NIBLS *
4700 39C1 * OF FORM ABCDE000 IN *
4701 39C1 * NBUF1 THROUGH NBUF8 *
4702 39C1 * INTO 256 BYTES OF *
4703 39C1 * USER DATA IN BUF. *
4704 39C1 * *
4705 39C1 * ---- ON ENTRY ---- *
4706 39C1 * *
4707 39C1 * X-REG: HOLDS SLOTNUM *
4708 39C1 * TIMES $10. *
4709 39C1 * *
4710 39C1 * BUF IS 2-BYTE POINTER *
4711 39C1 * TO 256 BYTES OF USER *
4712 39C1 * DATA TO BE CONVERTED *
4713 39C1 * TO 5-BIT NIBLS IN *
4714 39C1 * NBUF1 THROUGH NBUF8 *
4715 39C1 * PRIOR TO WRITE. *
4716 39C1 * *
4717 39C1 * ---- ON EXIT ----- *
4718 39C1 * *
4719 39C1 * A-REG: UNCERTAIN. *
4720 39C1 * Y-REG: HOLDS $FF. *
4721 39C1 * X-REG: HOLDS $FF. *
4722 39C1 * CARRY: UNCERTAIN. *
4723 39C1 * *
4724 39C1 * 5-BIT NIBLS OF FORM *
4725 39C1 * 000ABCDE IN 410 *
4726 39C1 * BYTES FROM NBUF1 *
4727 39C1 * TO NBUF8. *
4728 39C1 * *
4729 39C1 ***************************
4730 39C1 A2 32 POSTNIB LDX #$32 ;INDEX FOR 51 PASSES.
4731 39C3 A0 00 LDY #$0 ;INDEX TO USER BUF.
4732 39C5 BD 00 3C POSTNB1 LDA NBUF6,X
4733 39C8 4A LSRA
4734 39C9 4A LSRA
4735 39CA 4A LSRA
4736 39CB 85 27 STA T1
4737 39CD 4A LSRA
4738 39CE 85 26 STA T0
4739 39D0 4A LSRA
4740 39D1 1D 00 3B ORA NBUF1,X
4741 39D4 91 3E STA (BUF),Y ;FIRST OF 5 USER BYTES.
4742 39D6 C8 INY
4743 39D7 BD 33 3C LDA NBUF7,X
4744 39DA 4A LSRA
4745 39DB 4A LSRA
4746 39DC 4A LSRA
4747 39DD 4A LSRA
4748 39DE 26 27 ROL T1
4749 39E0 4A LSRA
4750 39E1 26 26 ROL T0
4751 39E3 1D 33 3B ORA NBUF2,X
4752 39E6 91 3E STA (BUF),Y ;SECOND OF 5 USER BYTES.
4753 39E8 C8 INY
4754 39E9 BD 66 3C LDA NBUF8,X
4755 39EC 4A LSRA
4756 39ED 4A LSRA
4757 39EE 4A LSRA
4758 39EF 4A LSRA
4759 39F0 26 27 ROL T1
4760 39F2 4A LSRA
4761 39F3 26 26 ROL T0
4762 39F5 1D 66 3B ORA NBUF3,X
4763 39F8 91 3E STA (BUF),Y ;THIRD OF 5 USER BYTES.
4764 39FA C8 INY
4765 39FB A5 26 LDA T0
4766 39FD 29 07 AND #$7
4767 39FF 1D 99 3B ORA NBUF4,X
4768 3A02 91 3E STA (BUF),Y ;FOURTH OF 5 USER BYTES.
4769 3A04 C8 INY
4770 3A05 A5 27 LDA T1
4771 3A07 29 07 AND #$7
4772 3A09 1D CC 3B ORA NBUF5,X
4773 3A0C 91 3E STA (BUF),Y ;FIFTH OF 5 USER BYTES.
4774 3A0E C8 INY
4775 3A0F CA DEX ;NEXT OF 51 PASSES.
4776 3A10 10 B3 BPL POSTNB1 ;HANDLE LAST USER
4777 3A12 AD 99 3C LDA NBUF8+$33 ; BYTE DIFFERENTLY.
4778 3A15 4A LSRA
4779 3A16 4A LSRA
4780 3A17 4A LSRA
4781 3A18 0D FF 3B ORA NBUF5+$33
4782 3A1B 91 3E STA (BUF),Y
4783 3A1D 60 RTS
Page 105 APPLE DOS 3.1
4784 3A1E EJECT
4785 3A1E **************************
4786 3A1E * *
4787 3A1E * FAST SEEK SUBROUTINE *
4788 3A1E * *
4789 3A1E **************************
4790 3A1E * *
4791 3A1E * ---- ON ENTRY ---- *
4792 3A1E * *
4793 3A1E * X-REG HOLDS SLOTNUM *
4794 3A1E * TIMES $10. *
4795 3A1E * *
4796 3A1E * A-REG HOLDS DESIRED *
4797 3A1E * HALFTRACK. *
4798 3A1E * (SINGLE PHASE) *
4799 3A1E * *
4800 3A1E * CURTRK HOLDS CURRENT *
4801 3A1E * HALFTRACK. *
4802 3A1E * *
4803 3A1E * ---- ON EXIT ----- *
4804 3A1E * *
4805 3A1E * A-REG UNCERTAIN. *
4806 3A1E * Y-REG UNCERTAIN. *
4807 3A1E * X-REG UNDISTURBED. *
4808 3A1E * *
4809 3A1E * CURTRK AND TRKN HOLD *
4810 3A1E * FINAL HALFTRACK. *
4811 3A1E * *
4812 3A1E * PRIOR HOLDS PRIOR *
4813 3A1E * HALFTRACK IF SEEK *
4814 3A1E * WAS REQUIRED. *
4815 3A1E * *
4816 3A1E * MONTIMEL AND MONTIMEH *
4817 3A1E * ARE INCREMENTED BY *
4818 3A1E * THE NUMBER OF *
4819 3A1E * 100 USEC QUANTUMS *
4820 3A1E * REQUIRED BY SEEK *
4821 3A1E * FOR MOTOR ON TIME *
4822 3A1E * OVERLAP. *
4823 3A1E * *
4824 3A1E * --- VARIABLES USED --- *
4825 3A1E * *
4826 3A1E * CURTRK, TRKN, COUNT, *
4827 3A1E * PRIOR, SLOTTEMP *
4828 3A1E * MONTIMEL, MONTIMEH *
4829 3A1E * *
4830 3A1E **************************
4831 3A1E 85 2A SEEK STA TRKN ;TARGET TRACK.
4832 3A20 CD 78 04 CMP CURTRK ;ON DESIRED TRACK?
4833 3A23 F0 59 BEQ SEEKXIT ; YES, HIT IT AND RETURN.
4834 3A25 86 2B STX SLOTTEMP ;SAVE X-REG.
4835 3A27 A9 00 LDA #$0
4836 3A29 85 26 STA TRKCNT ;HALFTRACK COUNT.
4837 3A2B AD 78 04 SEEK2 LDA CURTRK ;SAVE CURTRK FOR
4838 3A2E 85 27 STA PRIOR ; DELAYED TURNOFF.
4839 3A30 38 SEC
4840 3A31 E5 2A SBC TRKN ;DELTA-TRACKS.
4841 3A33 F0 42 BEQ SEEKEND ;DONE, FINISH SEEK.
4842 3A35 B0 07 BCS OUT ;(MOVE OUT, NOT IN)
4843 3A37 49 FF EOR #$FF ;CALC TRKS TO GO.
4844 3A39 EE 78 04 INC CURTRK ;INCR CURRENT TRACK (IN).
4845 3A3C 90 05 BCC MINTST ;(ALWAYS TAKEN)
4846 3A3E 69 FE OUT ADC #$FE ;CALC TRKS TO GO.
4847 3A40 CE 78 04 DEC CURTRK ;DECR CURRENT TRACK (OUT).
4848 3A43 C5 26 MINTST CMP TRKCNT
4849 3A45 90 02 BCC MAXTST ; AND 'TRKS MOVED'.
4850 3A47 A5 26 LDA TRKCNT
4851 3A49 C9 0C MAXTST CMP #$C
4852 3A4B 90 02 BCC STEP ;IF > $B, USE $B.
4853 3A4D A9 0B LDA #$B
4854 3A4F A8 STEP TAY ;ACCELLERATION INDEX.
4855 3A50 AD 78 04 LDA CURTRK
4856 3A53 29 03 AND #$3 ;INDEX TO 'CURRENT
4857 3A55 0A ASLA ; PHASE' OF 4-PHASE
4858 3A56 05 2B ORA SLOTTEMP ; STEPPER.
4859 3A58 AA TAX
4860 3A59 BD 81 C0 LDA PHASEON,X ;HIT NEXT PHASE
4861 3A5C B9 90 3A LDA ONTABLE,Y ; FOR 'ONTIME'.
4862 3A5F 20 7F 3A JSR MSWAIT ;(100 USEC INTERVALS)
4863 3A62 A5 27 LDA PRIOR
4864 3A64 29 03 AND #$3 ;INDEX TO 'PRIOR PHASE'
4865 3A66 0A ASLA ; OF 4-PHASE STEPPER.
4866 3A67 05 2B ORA SLOTTEMP
4867 3A69 AA TAX
4868 3A6A BD 80 C0 LDA PHASEOFF,X ;PRIOR PHASE OFF,
4869 3A6D B9 9C 3A LDA OFFTABLE,Y ; THEN WAIT 'OFFTIME'.
4870 3A70 20 7F 3A JSR MSWAIT ;(100 USEC INTERVALS)
4871 3A73 E6 26 INC TRKCNT ;'TRACKS MOVED' COUNT.
4872 3A75 D0 B4 BNE SEEK2 ;(ALWAYS TAKEN)
4873 3A77 A9 FF SEEKEND LDA #$FF ;DELAY 9.5 MSEC FOR
4874 3A79 20 7F 3A JSR MSWAIT ; SETTLING TIME.
4875 3A7C A6 2B LDX SLOTTEMP ;RESTORE X-REG.
4876 3A7E 60 SEEKXIT RTS ;RETURN.
Page 106 APPLE DOS 3.1
4877 3A7F EJECT
4878 3A7F **************************
4879 3A7F * *
4880 3A7F * MSWAIT SUBROUTINE *
4881 3A7F * *
4882 3A7F **************************
4883 3A7F * *
4884 3A7F * DELAYS A SPECIFIED *
4885 3A7F * NUMBER OF 100 USEC *
4886 3A7F * INTERVALS FOR MOTOR *
4887 3A7F * ON TIMING. *
4888 3A7F * *
4889 3A7F * ---- ON ENTRY ---- *
4890 3A7F * *
4891 3A7F * A-REG: HOLDS NUMBER *
4892 3A7F * OF 100 USEC *
4893 3A7F * INTERVALS TO *
4894 3A7F * DELAY. *
4895 3A7F * *
4896 3A7F * ---- ON EXIT ----- *
4897 3A7F * *
4898 3A7F * A-REG: HOLDS $00. *
4899 3A7F * X-REG: HOLDS $00. *
4900 3A7F * Y-REG: UNCHANGED. *
4901 3A7F * CARRY: SET. *
4902 3A7F * *
4903 3A7F * MONTIMEL, MONTIMEH *
4904 3A7F * ARE INCREMENTED ONCE *
4905 3A7F * PER 100 USEC INTERVAL*
4906 3A7F * FOR MOTON ON TIMING. *
4907 3A7F * *
4908 3A7F * ---- ASSUMES ---- *
4909 3A7F * *
4910 3A7F * 1 USEC CYCLE TIME *
4911 3A7F * *
4912 3A7F **************************
4913 3A7F A2 11 MSWAIT LDX #$11
4914 3A81 CA MSW1 DEX ;DELAY 86 USEC.
4915 3A82 D0 FD BNE MSW1
4916 3A84 E6 46 INC MONTIMEL
4917 3A86 D0 02 BNE MSW2 ;DOUBLE-BYTE
4918 3A88 E6 47 INC MONTIMEH ; INCREMENT.
4919 3A8A 38 MSW2 SEC
4920 3A8B E9 01 SBC #$1 ;DONE 'N' INTERVALS?
4921 3A8D D0 F0 BNE MSWAIT ;(A-REG COUNTS)
4922 3A8F 60 RTS
Page 107 APPLE DOS 3.1
4923 3A90 EJECT
4924 3A90 **************************
4925 3A90 * *
4926 3A90 * PHASE ON-, OFF-TIME *
4927 3A90 * TABLES IN 100-USEC *
4928 3A90 * INTERVALS. (SEEK) *
4929 3A90 * *
4930 3A90 **************************
4931 3A90 01 30 28 ONTABLE DB $01,$30,$28
4932 3A93 24 20 1E DB $24,$20,$1E
4933 3A96 1D 1C 1C DB $1D,$1C,$1C
4934 3A99 1C 1C 1C DB $1C,$1C,$1C
4935 3A9C 70 2C 26 OFFTABLE DB $70,$2C,$26
4936 3A9F 22 1F 1E DB $22,$1F,$1E
4937 3AA2 1D 1C 1C DB $1D,$1C,$1C
4938 3AA5 1C 1C 1C DB $1C,$1C,$1C
Page 108 APPLE DOS 3.1
4939 3AA8 EJECT
4940 3AA8 **************************
4941 3AA8 * *
4942 3AA8 * 7-BIT TO 5-BIT *
4943 3AA8 * 'DENIBLIZE' TABL *
4944 3AA8 * *
4945 3AA8 * VALID CODES *
4946 3AA8 * $AB TO $FF ONLY. *
4947 3AA8 * ($DA NOT VALID) *
4948 3AA8 * *
4949 3AA8 * ---- CAUTION ---- *
4950 3AA8 * *
4951 3AA8 * INSURE THAT FOLLOWING *
4952 3AA8 * 'RE-ORG' IS OK. *
4953 3AA8 * *
4954 3AA8 **************************
4955 3AAB ORG $3AAB
4956 3AAB * OBJ $BAAB
4957 3AAB 00 01 08 DB $00,$01,$08
4958 3AAE 10 18 02 DB $10,$18,$02
4959 3AB1 03 04 05 DB $03,$04,$05
4960 3AB4 06 20 28 DB $06,$20,$28
4961 3AB7 30 07 09 DB $30,$07,$09
4962 3ABA 38 40 0A DB $38,$40,$0A
4963 3ABD 48 50 58 DB $48,$50,$58
4964 3AC0 0B 0C 0D DB $0B,$0C,$0D
4965 3AC3 0E 0F 11 DB $0E,$0F,$11
4966 3AC6 12 13 14 DB $12,$13,$14
4967 3AC9 15 16 17 DB $15,$16,$17
4968 3ACC 19 1A 1B DB $19,$1A,$1B
4969 3ACF 1C 1D 1E DB $1C,$1D,$1E
4970 3AD2 21 22 23 DB $21,$22,$23
4971 3AD5 24 60 68 DB $24,$60,$68
4972 3AD8 25 26 70 DB $25,$26,$70
4973 3ADB 78 27 80 DB $78,$27,$80
4974 3ADE 88 90 29 DB $88,$90,$29
4975 3AE1 2A 2B 2C DB $2A,$2B,$2C
4976 3AE4 2D 2E 2F DB $2D,$2E,$2F
4977 3AE7 31 32 33 DB $31,$32,$33
4978 3AEA 98 A0 34 DB $98,$A0,$34
4979 3AED A8 B0 B8 DB $A8,$B0,$B8
4980 3AF0 35 36 37 DB $35,$36,$37
4981 3AF3 39 3A C0 DB $39,$3A,$C0
4982 3AF6 C8 D0 3B DB $C8,$D0,$3B
4983 3AF9 3C D8 E0 DB $3C,$D8,$E0
4984 3AFC 3E E8 F0 DB $3E,$E8,$F0
4985 3AFF F8 DB $F8
Page 109 APPLE DOS 3.1
4986 3B00 EJECT
4987 3B00 **************************
4988 3B00 * *
4989 3B00 * 5-BIT TO 7-BIT *
4990 3B00 * NIBL CONVERSION *
4991 3B00 * TABLE *
4992 3B00 * *
4993 3B00 **************************
4994 3B00 * *
4995 3B00 * CODES $AA, $D5 *
4996 3B00 * NOT USED *
4997 3B00 * *
4998 3B00 **************************
4999 3C9A ORG $3C9A
5000 3C9A * OBJ $BC9A
5001 3C9A AB AD AE NIBL DB $AB,$AD,$AE
5002 3C9D AF B5 B6 DB $AF,$B5,$B6
5003 3CA0 B7 BA BB DB $B7,$BA,$BB
5004 3CA3 BD BE BF DB $BD,$BE,$BF
5005 3CA6 D6 D7 DA DB $D6,$D7,$DA
5006 3CA9 DB DD DE DB $0DB,$DD,$DE
5007 3CAC DF EA EB DB $DF,$EA,$EB
5008 3CAF ED EE EF DB $ED,$EE,$EF
5009 3CB2 F5 F6 F7 DB $F5,$F6,$F7
5010 3CB5 FA FB FD DB $FA,$FB,$FD
5011 3CB8 FE FF DB $FE,$FF
5012 3CBA 1C 1C 1C DB $1C,$1C,$1C
5013 3CBD *
5014 3CBD 00 00 00 DB $00,$00,$00
5015 3CC0 A4 2D B9 D0 DB $A4,$2D,$B9,$D0,$3C,$A0,$05,$4C
5015 3CC4 3C A0 05 4C
5016 3CC8 0A 3E 00 00 DB $0A,$3E,$00,$00,$00,$00,$00,$00
5016 3CCC 00 00 00 00
5017 3CD0 00 05 0A 02 DB $00,$05,$0A,$02,$07,$0C,$04,$09
5017 3CD4 07 0C 04 09
5018 3CD8 01 06 0B 03 DB $01,$06,$0B,$03,$08,$00,$00,$00
5018 3CDC 08 00 00 00
5019 3CE0 00 00 00 00 DB $00,$00,$00,$00,$00,$00,$00,$00
5019 3CE4 00 00 00 00
5020 3CE8 00 00 00 00 DB $00,$00,$00,$00,$00,$00,$00,$00
5020 3CEC 00 00 00 00
5021 3CF0 00 00 00 00 DB $00,$00,$00,$00,$00,$00,$00,$00
5021 3CF4 00 00 00 00
5022 3CF8 00 00 00 00 DB $00,$00,$00,$00,$00,$00,$00,$00
5022 3CFC 00 00 00 00
5023 3D00 **************************
5024 3D00 * *
5025 3D00 * RWTS ENTRY POINT *
5026 3D00 * *
5027 3D00 **************************
5028 3D00 VOLFND EQU $2F
5029 3D00 TRKFND EQU $2E
5030 3D00 SECFND EQU $2D
5031 3D00 DRIVNO EQU $35
5032 3D00 DEVCTBL EQU $3C
5033 3D00 FMTTRKC EQU $41
5034 3D00 IOBPL EQU $48
5035 3D00 FMTMASK EQU $4A
5036 3D00 FMTSEC EQU $4B
5037 3D00 RETRYCNT EQU $578
5038 3D00 SLOT EQU $5F8
5039 3D00 SETWRT EQU $C08F
5040 3D00 SETRD EQU $C08E
5041 3D00 WRTDAT EQU $C08D
5042 3D00 RDDATA EQU $C08C
5043 3D00 DRVSL2 EQU $C08B
5044 3D00 DRVSL1 EQU $C08A
5045 3D00 DRVON EQU $C089
5046 3D00 DRVOFF EQU $C088
5047 3D00 PHASE1OFF EQU $C082
5048 3D00 PHASE2OFF EQU $C084
5049 3D00 PHASE3OFF EQU $C086
5050 3D00 ORG DISKIO
5051 3D00 * OBJ $BD00
5052 3D00 RWTS
5053 3D00 84 48 STY IOBPL ;SAVE IOB ADDRESS
5054 3D02 85 49 STA IOBPL+1
5055 3D04 A0 01 LDY #$1 ;GET NEW SLOT #
5056 3D06 B1 48 LDA (IOBPL),Y
5057 3D08 AA TAX ;SAVE SLOT # TO X
5058 3D09 8C F8 04 STY $4F8 ;SET SEEK CNT=1
5059 3D0C A0 0F LDY #$F ;SEE IF SLOT HAS CHANGED
5060 3D0E D1 48 CMP (IOBPL),Y
5061 3D10 F0 1B BEQ L3D2D ;BR IF SAME SLOT
5062 3D12 8A TXA ;SAVE NEW SLOT #
5063 3D13 48 PHA
5064 3D14 B1 48 LDA (IOBPL),Y ;GET OLD SLOT #
5065 3D16 AA TAX
5066 3D17 68 PLA
5067 3D18 48 PHA ;NEW SLOT # BACK TO STACK
5068 3D19 91 48 STA (IOBPL),Y ;SET NEW SLOT NUMBER
5069 3D1B BD 8E C0 LDA SETRD,X ;SET READ MODE
5070 3D1E L3D1E
5071 3D1E A0 08 LDY #$8 ;DELAY UNTIL DATA IS STABLE
5072 3D20 BD 8C C0 LDA RDDATA,X
5073 3D23 L3D23
5074 3D23 DD 8C C0 CMP RDDATA,X
5075 3D26 D0 F6 BNE L3D1E ;BR IF DRIVE STILL SPINNING
5076 3D28 88 DEY
5077 3D29 D0 F8 BNE L3D23 ;LONG ENOUGH? BR UNTIL OLD DRIVE OFF
5078 3D2B 68 PLA ;GET NEW SLOT #
5079 3D2C AA TAX
5080 3D2D L3D2D
5081 3D2D BD 8E C0 LDA SETRD,X ;INSURE IN READ MODE
5082 3D30 BD 8C C0 LDA RDDATA,X ;GET THE DATA
5083 3D33 BD 8C C0 LDA RDDATA,X
5084 3D36 48 PHA ;DELAY FOR DISK DATA TO CHANGE
5085 3D37 68 PLA
5086 3D38 8E F8 05 STX SLOT ;SET SLOT
5087 3D3B DD 8C C0 CMP RDDATA,X ;CHECK RUNNING
5088 3D3E 08 PHP ;SAVE CHECK RESULTS TO STACK
5089 3D3F BD 89 C0 LDA DRVON,X ;TURN DRIVE ON
5090 3D42 A0 06 LDY #$6 ;MOVE IBDCTP & IBBUFP PTRS TO PAGE 0
5091 3D44 L3D44
5092 3D44 B1 48 LDA (IOBPL),Y
5093 3D46 99 36 00 STA $0036,Y ;PTRS DESTINATION ON PG 0
5094 3D49 C8 INY
5095 3D4A C0 0A CPY #$A ;ALL PTRS MOVED?
5096 3D4C D0 F6 BNE L3D44 ;MOVE MORE IF NOT
5097 3D4E A0 02 LDY #2 ;GET DRIVE #
5098 3D50 B1 48 LDA (IOBPL),Y
5099 3D52 A0 10 LDY #$10 ;SAME DRIVE USED BEFORE?
5100 3D54 D1 48 CMP (IOBPL),Y
5101 3D56 F0 06 BEQ L3D5E ;BR IS SO
5102 3D58 91 48 STA (IOBPL),Y ;ELSE SET CURR DRV #
5103 3D5A 28 PLP ;RESTORE CHECK RUNNING STATUS
5104 3D5B A0 00 LDY #$0 ;SET Z FLAG
5105 3D5D 08 PHP
5106 3D5E L3D5E
5107 3D5E 6A RORA ;BY GOING INTO CARRY
5108 3D5F BD 8A C0 LDA DRVSL1,X ;SELECT DRIVE 1
5109 3D62 B0 03 BCS L3D67 ;CARRY STILL SET - DRIVE 1 IT IS
5110 3D64 BD 8B C0 LDA DRVSL2,X ;ELSE SELECT DRIVE 2
5111 3D67 L3D67
5112 3D67 66 35 ROR DRIVNO ;SAVE SELECTED DRV TO PG 0
5113 3D69 A0 02 LDY #$2 ;GET MOT ON TIME LO FROM DEVCTBL
5114 3D6B B1 3C LDA (DEVCTBL),Y
5115 3D6D 85 46 STA MONTIMEL ;SAVE LO
5116 3D6F C8 INY
5117 3D70 B1 3C LDA (DEVCTBL),Y ;GET MOT ON TIME HI FROM DEVCTBL
5118 3D72 85 47 STA MONTIMEH ;SAVE HI
5119 3D74 C8 INY ;Y=4, SET TO IOB TRK
5120 3D75 B1 48 LDA (IOBPL),Y ;GET DESIRED TRACK
5121 3D77 20 3B 3E JSR MYSEEK ;GO SEEK
5122 3D7A 28 PLP ;WAS MOTOR ON?
5123 3D7B D0 0D BNE L3D8A ;SKIP DELAY AND TRY TRACK IF SO
5124 3D7D L3D7D
5125 3D7D A0 12 LDY #$12 ;DELAY 100 USEC PER COUNT
5126 3D7F L3D7F
5127 3D7F 88 DEY
5128 3D80 D0 FD BNE L3D7F
5129 3D82 E6 46 INC MONTIMEL
5130 3D84 D0 F7 BNE L3D7D
5131 3D86 E6 47 INC MONTIMEH
5132 3D88 D0 F3 BNE L3D7D ;COUNT UP TO $0000
5133 3D8A *
5134 3D8A * DISK IS UP TO SPEED
5135 3D8A * IF NOT FORMAT, LOCATE CORRECT SECTOR
5136 3D8A *
5137 3D8A L3D8A
5138 3D8A A0 0C LDY #$C
5139 3D8C B1 48 LDA (IOBPL),Y ;GET COMMAND CODE #
5140 3D8E F0 55 BEQ L3DE5 ;BR IF NULL COMMAND
5141 3D90 C9 04 CMP #$4 ;FORMAT?
5142 3D92 F0 53 BEQ L3DE7 ;BR IF SO
5143 3D94 6A RORA ;SET CARRY=1 FOR READ, 0 FOR WRITE
5144 3D95 08 PHP ;AND SAVE THAT
5145 3D96 B0 03 BCS L3D9B ;BR IF READ
5146 3D98 20 00 38 JSR PRENIBL ;MUST PRENIBBLIZE FOR WRITE
5147 3D9B L3D9B
5148 3D9B A0 30 LDY #$30 ;48 RETRIES
5149 3D9D 8C 78 05 STY RETRYCNT ;SAVE RETRY COUNT
5150 3DA0 L3DA0
5151 3DA0 AE F8 05 LDX SLOT ;GET SLOT # INTO X
5152 3DA3 20 65 39 JSR RDADR ;READ NEXT ADDRESS FIELD
5153 3DA6 90 1F BCC L3DC7 ;BR IF GOOD READ
5154 3DA8 L3DA8
5155 3DA8 CE 78 05 DEC RETRYCNT ;DEC RETRY COUNT
5156 3DAB 10 F3 BPL L3DA0 ;IF HAVEN'T TRIED ENOUGH, TRY AGAIN
5157 3DAD AD 78 04 LDA $478 ;GET TRACK WE WANT
5158 3DB0 48 PHA ;SAVE IT
5159 3DB1 A9 60 LDA #$60 ;RECALIBRATE TO TRK 96
5160 3DB3 20 82 3E JSR L3E82
5161 3DB6 CE F8 04 DEC $4F8 ;ONCE TOO MANY?
5162 3DB9 D0 23 BNE L3DDE ;TRIED TO RECAL TOO MANY
5163 3DBB A9 00 LDA #$0 ;MOVE TO TRK 0
5164 3DBD 20 3B 3E JSR MYSEEK
5165 3DC0 68 PLA
5166 3DC1 L3DC1
5167 3DC1 20 3B 3E JSR MYSEEK ;GO TO CORRECT TRACK
5168 3DC4 4C 9B 3D JMP L3D9B ;LOOP BACK, TRY AGAIN ON THIS TRK
5169 3DC7 L3DC7
5170 3DC7 A4 2E LDY TRKFND ;ON THE RIGHT TRACK?
5171 3DC9 CC 78 04 CPY $478
5172 3DCC F0 22 BEQ L3DF0 ;BR IF SO
5173 3DCE AD 78 04 LDA $478 ;SAVE DESTINATION TRK
5174 3DD1 48 PHA
5175 3DD2 98 TYA
5176 3DD3 20 82 3E JSR L3E82
5177 3DD6 68 PLA
5178 3DD7 CE 78 05 DEC RETRYCNT ;SHOULD WE RESEEK?
5179 3DDA 10 E5 BPL L3DC1 ;YES - RESEEK
5180 3DDC 30 CA BMI L3DA8 ;NO - RECALIBRATE
5181 3DDE L3DDE
5182 3DDE 68 PLA ;REMOVE CURTRK
5183 3DDF A9 40 LDA #$40 ;BAD DRIVE ERROR
5184 3DE1 L3DE1
5185 3DE1 28 PLP
5186 3DE2 4C 29 3E JMP L3E29 ;GO HANDLE ERROR
5187 3DE5 L3DE5
5188 3DE5 F0 40 BEQ L3E27 ;ALL DONE
5189 3DE7 L3DE7
5190 3DE7 A0 03 LDY #$3 ;GET VOLUME #
5191 3DE9 B1 48 LDA (IOBPL),Y
5192 3DEB 85 2F STA VOLFND ;SAVE TO PG 0
5193 3DED 4C 9C 3E JMP DSKFORM ;GO FORMAT
5194 3DF0 L3DF0
5195 3DF0 A0 03 LDY #$3 ;IS THE RIGHT DISK IN?
5196 3DF2 B1 48 LDA (IOBPL),Y ;GET DESIRED VOLUME
5197 3DF4 48 PHA ;SAVE VOLUME #
5198 3DF5 A5 2F LDA VOLFND ;GET ACTUAL VOLUME
5199 3DF7 A0 0E LDY #$E ;INDICATE VOLUME FOUND
5200 3DF9 91 48 STA (IOBPL),Y
5201 3DFB 68 PLA ;GET DESIRED VOLUME BACK
5202 3DFC F0 08 BEQ L3E06 ;DESIRED VOLUME MATCHES ALL
5203 3DFE C5 2F CMP VOLFND
5204 3E00 F0 04 BEQ L3E06 ;YES...IT WAS CORRECT
5205 3E02 A9 20 LDA #$20 ;SOMEONE SWITCHED DISKS!
5206 3E04 D0 DB BNE L3DE1 ;ALWAYS
5207 3E06 L3E06
5208 3E06 A0 05 LDY #$5 ;TO ALLOW FOR INTERLEAVE
5209 3E08 A5 2D LDA SECFND ;GET REQUESTED LOGICAL SECTOR
5210 3E0A L3E0A
5211 3E0A D1 48 CMP (IOBPL),Y
5212 3E0C F0 09 BEQ L3E17 ;FOUND OUR DESIRED SECTOR
5213 3E0E CE 78 05 DEC RETRYCNT ;ADJUST RETRY COUNT
5214 3E11 10 8D BPL L3DA0
5215 3E13 A9 80 LDA #$80
5216 3E15 D0 CA BNE L3DE1 ;NO, KEEP TRYING
5217 3E17 *
5218 3E17 * SECTOR FOUND
5219 3E17 *
5220 3E17 L3E17
5221 3E17 28 PLP ;GOT OUR SECTOR
5222 3E18 90 18 BCC L3E32 ;CARRY WAS SET FOR WRITE OPERATION
5223 3E1A 20 FD 38 JSR READ ;GO READ
5224 3E1D 08 PHP ;SAVE STATUS OF READ OPERATION
5225 3E1E B0 88 BCS L3DA8 ;CARRY SET IF BAD READ
5226 3E20 28 PLP ;ADJUST STACK
5227 3E21 20 C1 39 JSR POSTNIB ;DECODE INTO REAL DATA
5228 3E24 AE F8 05 LDX SLOT ;GET SLOT # INTO X
5229 3E27 L3E27
5230 3E27 18 CLC ;INDICATE NO ERROR
5231 3E28 24 DB $24 ;SKIP NEXT SEC TO MAINTAIN NO ERROR
5232 3E29 L3E29 ; DO USELESS BIT INSTR INSTEAD
5233 3E29 38 SEC ;INDICATE AN ERROR
5234 3E2A A0 0D LDY #$D ;SET ERROR #
5235 3E2C 91 48 STA (IOBPL),Y
5236 3E2E BD 88 C0 LDA DRVOFF,X ;TURN DRV MOTOR OFF
5237 3E31 60 RTS
5238 3E32 L3E32
5239 3E32 20 6A 38 JSR WRITE ;WRITE NIBBLES NOW
5240 3E35 90 F0 BCC L3E27 ;BR IF NO ERRORS
5241 3E37 A9 10 LDA #$10 ;DISK IS WRITE PROTECTED
5242 3E39 B0 EE BCS L3E29 ;ALWAYS!
5243 3E3B **************************
5244 3E3B * *
5245 3E3B * SEEK ROUTINE *
5246 3E3B * *
5247 3E3B * SEEKS TRACK 'N' IN *
5248 3E3B * SLOT #X/16 *
5249 3E3B * IF DRIVNO IS NEGATIVE, *
5250 3E3B * ON DRIVE 1 *
5251 3E3B * IF DRIVNO IS POSITIVE, *
5252 3E3B * ON DRIVE 2 *
5253 3E3B * *
5254 3E3B **************************
5255 3E3B MYSEEK
5256 3E3B 48 PHA ;PRESERVE ACC
5257 3E3C A0 01 LDY #$1 ;TWO PHASE DISK?
5258 3E3E B1 3C LDA (DEVCTBL),Y
5259 3E40 6A RORA ;GET # OF PHASES INTO CARRY
5260 3E41 68 PLA
5261 3E42 90 08 BCC L3E4C ;BR IF 1 PHASE PER TRK
5262 3E44 0A ASLA
5263 3E45 20 4C 3E JSR L3E4C
5264 3E48 4E 78 04 LSR $478 ;DIVIDE BACK DOWN
5265 3E4B 60 RTS
5266 3E4C *
5267 3E4C L3E4C
5268 3E4C 85 2E STA TRKFND ;SAVE DEST TRACK (*2)
5269 3E4E BD 80 C0 LDA PHASEOFF,X
5270 3E51 BD 82 C0 LDA PHASE1OFF,X
5271 3E54 BD 84 C0 LDA PHASE2OFF,X
5272 3E57 BD 86 C0 LDA PHASE3OFF,X
5273 3E5A 20 7B 3E JSR L3E7B
5274 3E5D B9 78 04 LDA $478,Y
5275 3E60 24 35 BIT DRIVNO ;IF MINUS, ON DRV 0
5276 3E62 30 03 BMI L3E67
5277 3E64 B9 F8 04 LDA $4F8,Y ;ELSE GET DRV 1 TRACK
5278 3E67 L3E67
5279 3E67 8D 78 04 STA $478 ;CURRENT TRACK
5280 3E6A A5 2E LDA TRKFND ;DESTINATION TRACK
5281 3E6C 24 35 BIT DRIVNO ;UPDATE SLOT DEPENDENT
5282 3E6E 30 05 BMI L3E75 ; LOCATIONS WITH TRACK
5283 3E70 99 F8 04 STA $4F8,Y ; INFORMATION
5284 3E73 10 03 BPL L3E78 ;ALWAYS!
5285 3E75 99 78 04 L3E75 STA $478,Y
5286 3E78 4C 1E 3A L3E78 JMP SEEK ;GO SEEK
5287 3E7B L3E7B
5288 3E7B 8A TXA ;SET Y=SLOT #
5289 3E7C 4A LSRA
5290 3E7D 4A LSRA
5291 3E7E 4A LSRA
5292 3E7F 4A LSRA
5293 3E80 A8 TAY
5294 3E81 60 RTS
5295 3E82 *
5296 3E82 * SET SLOT DEPENDENT TRACK LOCATION
5297 3E82 *
5298 3E82 L3E82
5299 3E82 48 PHA ;SAVE DEST TRACK
5300 3E83 A0 02 LDY #$2
5301 3E85 B1 48 LDA (IOBPL),Y
5302 3E87 6A RORA ;GET DRIVE # INTO CARRY
5303 3E88 66 35 ROR DRIVNO ;INTO (DRIVENO)
5304 3E8A 20 7B 3E JSR L3E7B ;SETUP Y REG
5305 3E8D 68 PLA
5306 3E8E 0A ASLA ;ASSUME TRACK IS HELD *2
5307 3E8F 24 35 BIT DRIVNO
5308 3E91 30 05 BMI L3E98 ;IF ON DRIVE 1(1), DRIVNO MINUS
5309 3E93 99 F8 04 STA $4F8,Y ;SAVE DRV 2 TRACK
5310 3E96 10 03 BPL L3E9B ;ALWAYS
5311 3E98 L3E98
5312 3E98 99 78 04 STA $478,Y ;ELSE SAVE DRV 1 TRACK
5313 3E9B L3E9B
5314 3E9B 60 RTS
5315 3E9C **************************
5316 3E9C * *
5317 3E9C * FORMAT ROUTINE *
5318 3E9C * *
5319 3E9C **************************
5320 3E9C DSKFORM
5321 3E9C A9 80 LDA #$80 ;FAKE DRV 0 TRACK
5322 3E9E 8D 78 04 STA $478
5323 3EA1 A9 00 LDA #$0 ;SET TRACK TO 0
5324 3EA3 85 41 STA FMTTRKC ;SAVE FORMAT TRACK COUNTER
5325 3EA5 20 1E 3A JSR SEEK ;GO THERE
5326 3EA8 A9 AA LDA #$AA ;MASK FOR ODD-EVEN ENCODING
5327 3EAA 85 4A STA FMTMASK ;SAVE TO PG 0
5328 3EAC A0 50 LDY #$50 ;ATTEMPTS COUNT
5329 3EAE L3EAE
5330 3EAE 84 47 STY MONTIMEH ;SAVE # OF ATTEMPTS
5331 3EB0 A9 27 LDA #$27 ;39 SELF-SYNC NIBBLES
5332 3EB2 85 4B STA FMTSEC ;SAVE COUNT
5333 3EB4 BD 8D C0 LDA WRTDAT,X ;TURN OFF WRITE
5334 3EB7 BD 8E C0 LDA SETRD,X
5335 3EBA *
5336 3EBA * WRITE GAP
5337 3EBA *
5338 3EBA A9 FF LDA #$FF ;GET SYNC BYTE
5339 3EBC 9D 8F C0 STA SETWRT,X ;WRITE IT
5340 3EBF DD 8C C0 CMP RDDATA,X ;READ IT BACK
5341 3EC2 24 00 BIT $0000
5342 3EC4 L3EC4
5343 3EC4 88 DEY ;ADJUST WRITE ATTEMPTS
5344 3EC5 F0 0F BEQ L3ED6 ;BR IF GOOD WRITE
5345 3EC7 48 PHA ;ELSE DELAY
5346 3EC8 68 PLA
5347 3EC9 EA NOP
5348 3ECA L3ECA
5349 3ECA 48 PHA ;DELAY SOME MORE
5350 3ECB 68 PLA
5351 3ECC EA NOP
5352 3ECD EA NOP
5353 3ECE 9D 8D C0 STA WRTDAT,X ;WRITE AGAIN
5354 3ED1 DD 8C C0 CMP RDDATA,X ;READ IT BACK
5355 3ED4 B0 EE BCS L3EC4 ;BR IF STILL NOT GOOD
5356 3ED6 L3ED6
5357 3ED6 C6 4B DEC FMTSEC ;GOOD WRITE, SO DEC SYNC COUNT
5358 3ED8 D0 F0 BNE L3ECA ;WRITE NEXT
5359 3EDA A4 47 LDY MONTIMEH
5360 3EDC EA NOP
5361 3EDD EA NOP
5362 3EDE D0 06 BNE L3EE6 ;BR IF MOTOR TIME GOOD
5363 3EE0 L3EE0
5364 3EE0 48 PHA ;DELAYS
5365 3EE1 68 PLA
5366 3EE2 48 PHA
5367 3EE3 68 PLA
5368 3EE4 C1 00 CMP ($0000,X)
5369 3EE6 L3EE6
5370 3EE6 EA NOP ;DELAY
5371 3EE7 *
5372 3EE7 * WRITE SECTOR ROUTINE
5373 3EE7 *
5374 3EE7 L3EE7
5375 3EE7 9D 8D C0 STA WRTDAT,X
5376 3EEA DD 8C C0 CMP RDDATA,X
5377 3EED 88 DEY
5378 3EEE D0 F0 BNE L3EE0
5379 3EF0 *
5380 3EF0 * WRITE ADDR FIELD PROLOGUE
5381 3EF0 *
5382 3EF0 A9 D5 LDA #$D5 ;ADDR MARK 1
5383 3EF2 20 CA 3F JSR WBYTE1
5384 3EF5 A9 AA LDA #$AA ;ADDR MARK 2
5385 3EF7 20 CB 3F JSR WBYTE
5386 3EFA A9 B5 LDA #$B5 ;ADDR MARK 3
5387 3EFC 20 CB 3F JSR WBYTE
5388 3EFF A5 2F LDA VOLFND ;WRITE ODD-EVEN ENCODED VOLUME
5389 3F01 20 BB 3F JSR EOWBYTE
5390 3F04 A5 41 LDA FMTTRKC ;WRITE ODD-EVEN ENCODED TRACK
5391 3F06 20 BB 3F JSR EOWBYTE
5392 3F09 A5 4B LDA FMTSEC ;WRITE ODD-EVEN ENCODED SECTOR
5393 3F0B 20 BB 3F JSR EOWBYTE
5394 3F0E A5 2F LDA VOLFND ;CALC CHECKSUM BY EOR'ING VOLUME,
5395 3F10 45 41 EOR FMTTRKC ; TRACK, AND SECTOR
5396 3F12 45 4B EOR FMTSEC
5397 3F14 48 PHA
5398 3F15 4A LSRA
5399 3F16 05 4A ORA FMTMASK ;WITH $AA
5400 3F18 9D 8D C0 STA WRTDAT,X ;WRITE CHECKSUM ODD BITS
5401 3F1B DD 8C C0 CMP RDDATA,X
5402 3F1E 68 PLA
5403 3F1F 09 AA ORA #$AA
5404 3F21 20 CA 3F JSR WBYTE1 ;WRITE CHECKSUM EVEN BITS
5405 3F24 *
5406 3F24 * WRITE ADDR FIELD EPILOGUE
5407 3F24 *
5408 3F24 A9 DE LDA #$DE ;BIT-SLIP 1
5409 3F26 20 CB 3F JSR WBYTE
5410 3F29 A9 AA LDA #$AA ;BIT-SLIP 2
5411 3F2B 20 CB 3F JSR WBYTE
5412 3F2E A9 EB LDA #$EB ;BIT-SLIP 3
5413 3F30 20 CB 3F JSR WBYTE
5414 3F33 A9 FF LDA #$FF ;WRITE SYNC BYTE
5415 3F35 20 CB 3F JSR WBYTE
5416 3F38 *
5417 3F38 * WRITE DATA FIELD
5418 3F38 *
5419 3F38 A0 02 LDY #$2 ;WRITE IN TWO PASSES....
5420 3F3A 84 46 STY MONTIMEL
5421 3F3C A0 AD LDY #$AD ;...OF 173 BYTES EACH PASS (346 BYTES)
5422 3F3E D0 06 BNE L3F46
5423 3F40 L3F40
5424 3F40 88 DEY ;ADJUST # BYTES WRITTEN
5425 3F41 F0 0D BEQ L3F50
5426 3F43 48 PHA ;GET $FF DATA FIELD BYTE BACK
5427 3F44 68 PLA ;RE-SAVE IT
5428 3F45 EA NOP ;DELAY SOME
5429 3F46 L3F46
5430 3F46 48 PHA ;GET DATA BYE BACK
5431 3F47 68 PLA ;RESAVE
5432 3F48 9D 8D C0 STA WRTDAT,X ;WRITE IT
5433 3F4B DD 8C C0 CMP RDDATA,X
5434 3F4E B0 F0 BCS L3F40 ;WRITE SOME MORE
5435 3F50 L3F50
5436 3F50 C6 46 DEC MONTIMEL ;TWO PASSES COMPLETE?
5437 3F52 D0 F2 BNE L3F46 ;DO ANOTHER PASS IF NOT
5438 3F54 A4 47 LDY MONTIMEH
5439 3F56 18 CLC ;FOR ADC WITHOUT CARRY
5440 3F57 24 00 BIT $0000
5441 3F59 9D 8D C0 STA WRTDAT,X
5442 3F5C BD 8C C0 LDA RDDATA,X
5443 3F5F A5 4B LDA FMTSEC ;GET SECTOR
5444 3F61 69 0A ADC #$A ;3 SECTOR INTERLEAVE
5445 3F63 85 4B STA FMTSEC ;RESAVE SECTOR
5446 3F65 E9 0C SBC #$C ;13 SECTORS DONE?
5447 3F67 F0 0A BEQ L3F73 ;BR IF SO
5448 3F69 B0 01 BCS L3F6C ;MORE SECTORS TO WRITE
5449 3F6B 2C DB $2C ;SKIP NEXT STA OF SECTOR, DO USELESS BIT INSTEAD
5450 3F6C L3F6C
5451 3F6C 85 4B STA FMTSEC
5452 3F6E A9 FF LDA #$FF ;SYNC BYTE
5453 3F70 4C E7 3E JMP L3EE7 ;GO WRITE ANOTHER SECTOR
5454 3F73 L3F73
5455 3F73 48 PHA ;GET DATA BYTE BACK
5456 3F74 68 PLA ;AND RESAVE
5457 3F75 A4 47 LDY MONTIMEH
5458 3F77 BD 8D C0 LDA WRTDAT,X
5459 3F7A BD 8E C0 LDA SETRD,X ;TURN OFF WRITE MODE
5460 3F7D 30 34 BMI L3FB3
5461 3F7F 88 DEY
5462 3F80 L3F80
5463 3F80 48 PHA ;DELAYS
5464 3F81 68 PLA
5465 3F82 EA NOP
5466 3F83 EA NOP
5467 3F84 24 00 BIT $0000
5468 3F86 48 PHA
5469 3F87 68 PLA
5470 3F88 88 DEY
5471 3F89 D0 F5 BNE L3F80
5472 3F8B 20 65 39 JSR RDADR ;VERIFY SECTOR ADDRESS
5473 3F8E B0 04 BCS L3F94 ;BR IF READ ADDRESS ERROR
5474 3F90 A5 2D LDA SECFND
5475 3F92 F0 0A BEQ L3F9E
5476 3F94 L3F94
5477 3F94 A4 47 LDY MONTIMEH ;GET TRACK FMT ATTEMPTS
5478 3F96 88 DEY ;DEC ATTEMPTS MADE
5479 3F97 C0 10 CPY #$10 ;DID WE TRY ENOUGH?
5480 3F99 90 18 BCC L3FB3 ;BR IF ERROR ... WE TRIED ENOUGH
5481 3F9B 4C AE 3E JMP L3EAE ;ELSE TRY AGAIN
5482 3F9E L3F9E
5483 3F9E E6 41 INC FMTTRKC ;INC TRACK PTR
5484 3FA0 A5 41 LDA FMTTRKC ;GET NEXT TRACK
5485 3FA2 C9 23 CMP #$23 ;DID WE DO ALL 35 TRACKS?
5486 3FA4 B0 12 BCS L3FB8 ;BR IS SO
5487 3FA6 0A ASLA ;ELSE GO TO NEXT TRACK
5488 3FA7 20 1E 3A JSR SEEK
5489 3FAA A4 47 LDY MONTIMEH ;ADJUST # OF ATTEMPTS
5490 3FAC C8 INY
5491 3FAD C8 INY
5492 3FAE 84 47 STY MONTIMEH
5493 3FB0 4C AE 3E JMP L3EAE ;GO FORMAT NEXT TRACK
5494 3FB3 L3FB3
5495 3FB3 A9 40 LDA #$40 ;ERROR
5496 3FB5 4C 29 3E JMP L3E29
5497 3FB8 L3FB8
5498 3FB8 4C 27 3E JMP L3E27 ;ALL WENT WELL
5499 3FBB *
5500 3FBB * WRITE ODD BITS, THEN EVEN BITS OF A BYTE
5501 3FBB *
5502 3FBB EOWBYTE
5503 3FBB 48 PHA ;SAVE IT
5504 3FBC 4A LSRA ;ODD BITS FIRST
5505 3FBD 05 4A ORA FMTMASK ;WITH $AA
5506 3FBF 9D 8D C0 STA WRTDAT,X ;WRITE IT
5507 3FC2 DD 8C C0 CMP RDDATA,X
5508 3FC5 68 PLA ;RESTORE BYTE
5509 3FC6 C1 00 CMP ($0000,X)
5510 3FC8 09 AA ORA #$AA ;GET EVEN BITS
5511 3FCA **************************
5512 3FCA * *
5513 3FCA * WRITE A BYTE TO DISK *
5514 3FCA * *
5515 3FCA **************************
5516 3FCA WBYTE1
5517 3FCA EA NOP
5518 3FCB WBYTE
5519 3FCB 48 PHA ;SAVE BYTE TO STACK
5520 3FCC 68 PLA ;GET IT BACK
5521 3FCD EA NOP ;DELAY
5522 3FCE 9D 8D C0 STA WRTDAT,X ;WRITE IT
5523 3FD1 DD 8C C0 CMP RDDATA,X
5524 3FD4 60 RTS
5525 3FD5 **************************
5526 3FD5 * *
5527 3FD5 * FIX FOR A BUG WITH *
5528 3FD5 * APPLESOFT II *
5529 3FD5 * READ/WRITE STATEMENTS *
5530 3FD5 * (LINES GT 255 ARE *
5531 3FD5 * IGNORED!) *
5532 3FD5 * *
5533 3FD5 **************************
5534 3FD5 ASRWPAT
5535 3FD5 E8 INX ;BUMP HIGH BYTE OF LINE #
5536 3FD6 F0 01 BEQ ASRWP1 ;BR IF HIGH AS WE CAN GO
5537 3FD8 60 RTS ;ELSE LINE # GT 255, SO RETURN
5538 3FD9 4C DD 25 ASRWP1 JMP ICFDB ;NOT RUN MODE - CLOSE FILE
5539 3FDC *
5540 3FFF ORG AEC2
5541 3FFF 00 DB 0
5542 4000 END
Number of errors = 0