Advertisement
developer

Apple II DOS version 3.1

Nov 15th, 2013
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Basic4GL 71.37 KB | None | 0 0
  1.     .TITLE  SHEP,’APPLE DOS’
  2. *   6.3 10-6-78
  3. *   8 BIT ASSEMBLER
  4.     .M6502
  5. *
  6. **************************************************************************************
  7. *   (C)  COPYRIGHT 1978  APPLE COMPUTER, INC
  8. **************************************************************************************
  9. ORG1    EQU $1B00
  10. ORG2    EQU $3600
  11. DISKIO  EQU $3D00
  12. ASC1    EQU $3800
  13. AEC1    EQU $3ABF
  14. ASC2    EQU $3D00
  15. AEC2    EQU $3FFF
  16. EDOS    EQU $4000
  17.     PAGE
  18.     ORG ORG1
  19. BEQIN   JMP DBINIT
  20. ;
  21. DOSREL
  22. ;
  23. ;   GET RELOCATION PARMS
  24. ;
  25. DR0
  26. LOC1    EQU $26
  27.     LDA #$BF        ; START AT BF00
  28.     STA ZPGWRK+1        ; TO LOOK FOR
  29.     LDX #0      ; HIGH RAM
  30.     STX ZPGWRK
  31.     LDY #0      ;APPLE TEST
  32. DR1B
  33.     LDA (ZPGWRK,X)
  34.     STA LOC1
  35. DR1 TYA
  36.     EOR LOC1
  37.     STA LOC1
  38.     TYA
  39.     EOR (ZPGWRK,X)
  40.     STA (ZPGWRK,X)
  41.     CMP LOC1
  42.     BNE DR1A
  43.     INY
  44.     BNE DR1B
  45.     BEQ DR2     ; BR IF TOOK
  46. DR1A
  47.     DEC ZPGWRK+1        ; NOT RAM
  48.     BNE DR1     ; TRY NEXT PAGE
  49. ;
  50. DR2
  51. ;   LDY ZPGWRK+1
  52.     INY         ; NEW END OF DOS
  53.     STY NEPAGE
  54.     SEC
  55.     TYA
  56.     SBC DOSLNG      ; MINUS DOS LENGTH
  57.     STA NSPAGE      ; IS NEW START OF DOS
  58.     SEC
  59.     SBC RSPAGE      ; MINUS OLD DOS START
  60.     BEQ BEQIN       ; (BREIF NO DELTA)
  61.     STA DELTA       ; IS DELTA
  62.     PAGE
  63.     LDA RSPAGE      ; RESET START PAGE TO NORMAL
  64.     STA ASTART+1
  65. ;
  66.     LDA #DBINIT/256 ;RESET PI RTN TO NORMAL
  67.     STA DI3+2
  68.     LDA #DBINIT&255
  69.     STA DI3+1
  70. ;
  71. ;
  72.     PAGE
  73. ;
  74. ;
  75. ;   RELOCATE ADR TABLES
  76. ;
  77.     LDX #0
  78.     STX ZPGWRK
  79. DR3
  80.     LDA ADRTAB+1,X
  81.     TAY
  82.     LDA ADRTAB+2,X
  83.     STA ZPGWRK+1
  84.     JMP DR5
  85. ;
  86. DR4
  87.     CLC
  88.     LDA (ZPGWRK),Y
  89.     ADC DELTA
  90.     STA (ZPGWRK),Y
  91.     INY
  92.     BNE DR5
  93.     INC ZPGWRK+1
  94. DR5 INY
  95.     BNE DR6
  96.     INC ZPGWRK+1
  97. ;
  98. DR6
  99.     LDA ZPGWRK+1
  100.     CMP ADRTAB+4,X
  101.     BCC DR4
  102.     TYA
  103.     CMP ADRTAB+3,X
  104.     BCC DR4
  105. ;
  106.     TXA
  107.     CLC
  108.     ADC #4
  109.     TAX
  110.     CPX ADRTAB
  111.     BCC DR3
  112.     PAGE
  113. ;
  114. ;   RELOCATE CODE
  115. ;
  116.     LDX #0
  117. DR7 STX TEMP1
  118. ;
  119.     LDA CDETAB+1,X  ; GET A START OF CODE ADR
  120.     STA ZPGWRK      ; PUT IN ZPG
  121.     LDA CDETAB+2,X
  122.     STA ZPGWRK+1
  123. ;
  124. DR8 LDX #0
  125.     LDA (ZPGWRK,X)  ; GET OP CODE
  126.     JSR INSDS2      ; GO FIND OUT HOW LONG
  127. ;
  128.     LDY LENGTH      ; GET HOW LONG
  129.     CPY #2      ; IF IT AIN’T
  130.     BNE DR9     ; 3 THEN DON’T RELOC
  131.     LDA (ZPGWRK),Y  ; GET PAGE FROM INST
  132.     CMP RSPAGE      ; IF PAGE < REL START
  133.     BCC DR9     ; THE IGNOR
  134.     CMP REPAGE      ; IF PAGE >= REL END
  135.     BCS DR9     ; THEN IGNORE
  136.     ADC DELTA       ; ELSE ADD DELTA
  137.     STA (ZPGWRK),Y  ; TO RELOCATE
  138. ;
  139. DR9 SEC
  140.     LDA LENGTH      ; ADD LENGTH
  141.     ADC ZPGWRK      ; TO PC
  142.     STA ZPGWRK
  143.     LDA #0
  144.     ADC ZPGWRK+1
  145.     STA ZPGWRK+1
  146. ;
  147.     LDX TEMP1       ; CHECK FOR END
  148.     CMP CDETAB+4,X  ; OF CODE SEGMENT
  149.     BCC DR8     ; BR NOT END
  150.     LDA ZPGWRK
  151.     CMP CDETAB+3,X
  152.     BCC DR8     ; BR NOT END
  153. ;
  154.     TXA
  155.     CLC
  156.     ADC #4      ; INCREMENT TABLE INDEX
  157.     TAX
  158.     CPX CDETAB      ; DONE
  159.     BCC DR7     ; BR IF NOT
  160. ;
  161.     PAGE
  162. ;
  163. ;   MOVE TO RELOCATED CODE
  164. ;
  165.     LDA #DEPAGE-1
  166.     STA ZPGWRK+1        ; ZPGWRK=FROM
  167.     LDY NEPAGE
  168.     DEY
  169.     STY ZPGFCB+1        ; ZPGFCB = TOO
  170.     LDA #0
  171.     STA ZPGWRK
  172.     STA ZPGFCB
  173.     TAY
  174. ;
  175. DR10    LDA (ZPGWRK),Y  ; BYTE FROM
  176.     STA (ZPGFCB),Y  ; BYTE TO
  177.     INY         ; INCREMENT
  178.     BNE DR10        ; BR NOT FULL PAGE
  179.     DEC DPGCNT      ; DECREMENT PAGE CNT
  180.     BEQ DR11        ; BR IF DONE
  181.     DEC ZPGWRK+1        ; INC FROM PAGE
  182.     DEC ZPGFCB+1        ; INC TOO PAGE
  183.     BNE DR10        ; MOVE PAGE
  184. ;
  185. DR11    JMP DBVECT+3        ; DONE
  186.     PAGE
  187. DEPAGE  EQU EDOS/256
  188. DSPAGE  EQU START/256
  189. INSDS2  EQU $F88E
  190. LENGTH  EQU $2F
  191. ADRTAB  DB  9*4
  192.     DB  @@SAT1,@@EAT1
  193.     DB  @@RUN,@@RUN+2
  194.     DB  @@IBVT+2,@@IBVT+4
  195.     DB  @@AS1VT,@@AS1VT+4
  196.     DB  @@AS2VT,@@AS2VT+4
  197.     DB  @@AS2VT+6,@@AS2VT+8
  198.     DB  @@SAT2,@@EAT2
  199.     DB  @@BAIOB,@@ADOSLD+2
  200.     DB  @@IBDCTP,@@IBDCTP+2
  201.     DB  @0,@0
  202.     DB  @0,@0
  203.     DB  @0,@0
  204. CDETAB
  205.     DB  6*4
  206.     DB  @@SC1,@@EC1
  207.     DB  @@SC2,@@EC2
  208.     DB  @@SC3,@@EC3
  209.     DB  SDP1,@@EDP1
  210.     DB  ASC1,@@AEC1
  211.     DB  @@ASC2,@@AEC2
  212.     DB  @0,@0
  213. ;
  214. RSPAGE  DB  DSPAGE
  215. REPAGE  DB  DEPAGE
  216. ;
  217. NSPAGE  DB  0
  218. NEPAGE  DB  0
  219. ;
  220. DOSLING DB  DEPAGE-DSPAGE
  221. ;
  222. DELTA   DB  0
  223. DPGCNT  DB  DEPAGE-DSPAGE
  224.     PAGE
  225.     BOUND   256
  226. ;
  227. ;   RELOCATION  TABLES
  228. ;
  229. START
  230. SAT1
  231. FTAB    DB  @@*-45      ;START OF FTABS
  232. CINA    DB  @@CHRIN     ;CHAR IN ADR
  233. COUTA   DB  @@CHROUT        ;CHAR OUT ADR
  234. FN1ADR  DB  @@FNAME1
  235. FN2ADR  DB  @@FNAME2
  236. SVBLA   DB  @@SVBL
  237. ASTART  DB  @@BEQIN     ;CHANGED TO START BY RELOCATE
  238. CCBADR  DB  @@CCB
  239. ;
  240. OUTSVT              ;CHAR OUTPUT STATE VECTOR TABLE
  241.     DB  @@COS0-1
  242.     DB  @@COS1-1
  243.     DB  @@COS2-1
  244.     DB  @@COS3-1
  245.     DB  @@COS4-1
  246.     DB  @@COS5-1
  247.     DB  @@COS6-1
  248. ;               COMMAND EXECUTION TABLE
  249. CMDETB
  250.     DB  @@EINIT-1
  251.     DB  @@ELOAD-1
  252.     DB  @@ESAVE-1
  253.     DB  @@ERUN-1
  254.     DB  @@ECHAIN-1
  255.     DB  @@EDEL-1
  256.     DB  @@ELOCK-1
  257.     DB  @@EUNLK-1
  258.     DB  @@ECLOSE-1
  259.     DB  @@EREAD-1
  260.     DB  @@EEXEC-1
  261.     DB  @@EWRITE-1
  262.     DB  @@EPOS-1
  263.     DB  @@EOPEN-1
  264.     DB  @@EAPND-1
  265.     DB  @@EREN-1
  266.     DB  @@ECAT-1
  267.     DB  @@EMON-1
  268.     DB  @@ENOMON-1
  269.     DB  @@EPR-1
  270.     DB  @@EIN-1
  271.     DB  @@EMAXF-1
  272.     DB  @@EAS-1
  273.     DB  @@EINT-1
  274.     DB  @@EBSV-1
  275.     DB  @@EBLD-1
  276.     DB  @@EBRUN-1
  277.     DB  @@EVAR-1
  278. EAT1
  279.  
  280.         PAGE
  281. ;
  282. ;       NON-RELOCATING ADRS
  283. ;
  284. IBASVT
  285. CHAIN   DB  @@IBCHN
  286. RUN DB  @@IBRUN
  287. BREAK   DB  @@IBBRK
  288. GO  DB  @@IBGO
  289. CONT    DB  @@IBCONT        ;BASIC CONT ENTRY POINT
  290. IBVT    DB  @@IBCHN,@@IBRUN,@@IBRK
  291.  
  292.     DB  @@IBGO,@@0
  293.  
  294. IBVTL   EQU *-IBVT
  295. ;
  296. AS1VTL  DB  @@ASRUN1,@@ASRUN1,@@ASBRK1
  297.  
  298.     DB  @@IBGO,@@0
  299.  
  300. AS1VTL  EQU *-AS1VT
  301. ;
  302. AS2VT   DB  @@ASRUN2,@@ASRUN2,@@ASBRK2
  303.  
  304.  
  305.     DB  @@DBINIT,@@0
  306.  
  307. AS2VTL  EQU *-AS2VT
  308.     PAGE
  309. ;
  310. ;   EQUATES REQD TO FIND THINGS IN APPLE II
  311. ;
  312. SETVID  EQU $FE93
  313. SETKBD  EQU $FE89
  314. PROMPT  EQU $33     ;PROMPT CHAR
  315. OUTSW   EQU $36     ;OUTPUT VECTOR SWITCH
  316. INSW    EQU $38     ;INPUT VECTOR SWITCH
  317. ZPGWRK  EQU $40     ;ZERO PAGE WORK CELL
  318. CNUM    EQU $44     ;CONVERTED NUMERIC
  319. LBUFF   EQU $200        ;LINE BUFFER
  320. MULT    EQU $FB63       ;MULT ROUTINE
  321. INPRT   EQU $FE8B       ;SET OUT PORT
  322. OUTPRT  EQU $FE95       ;SET OUT PORT
  323. IBCHN   EQU $E836       ;BASIC RUN
  324. IBLMEM  EQU $4A     ;BASIC LOW MEMORY
  325. IBHMEM  EQU $4C     ;INTEGER BASIC HIMEM
  326. IBSOP   EQU $CA     ;INTEGER BASIC START OF CGM
  327. IBBRK   EQU $3E3        ;BASIC BREAK
  328. IBGO    EQU $E000       ;BASIC ENTRY POINT
  329. IBCONT  EQU $E003       ;BASIC CONTINUE ENTRY POINT
  330. IBSOV   EQU $CC     ;BASIC START OF VARIABLES
  331. ASSOP   EQU $67     ;AS START OF PROGRAM
  332. ASEOP   EQU $AF     ;AS END OF PROGRAM
  333. ASEOP2  EQU $69     ;AS END-OF PGM 2
  334. ASHM1   EQU $73     ;AS HIGH MEM 1
  335. ASHM2   EQU $6F     ;AS HIGH MEM 2
  336. ASLMEM  EQU $ASSOP      ;AS LOW MEM
  337. ASBRK1  EQU $D865       ;AS ROM BREAK
  338. ASBRK2  EQU $1067       ;AS RAM BREAK
  339. AITSTL  EQU $E000       ;AS 1 IB TEST LOC
  340. ATSTV   EQU $4C     ;AS TEST VALUE
  341. ITSTV   EQU $20     ;IB TEST VALUE
  342. BOOTSL  EQU $2E     ;BOOT FROM SLOT
  343. ZPQFCB  EQU $42     ;ZERO PAGE WORK CELL
  344. HOME    EQU $FC58
  345. PRINT   EQU $FDED
  346. GETKEY  EQU $FD0C
  347.  
  348.     PAGE
  349. ;
  350. ;   DOS BASIC INTERPRETER – INITIAL ENTRY
  351. ;
  352. SC1
  353. DBINIT
  354.     LDA IBSLOT      ;GET BOOT SLOT
  355.     LSRA
  356.     LSRA
  357.     LSRA
  358.     LSRA
  359.     STA CS      ;SET AS CURRENT SLOT
  360.     LDA IBDRVN      ;GET BOOT DRIVE NUMBER
  361.     STA CD      ;SET AS CURRENT DRIVE
  362.     LDA AITSTL      ;GET APPLESOFT/IB TEST
  363.     EOR #ITSTV      ;IF AS THEN
  364.     BNE IAS1        ;GO TO AS INIT
  365. ;               ;ELSE INIT FOR IB
  366.     STA ASIBSW      ;SET SW FOR IB
  367.     LDX #IBVTL      ;GET IB VT LENGTH
  368. IIB1    LDA IBVT-1,X        ;MOVE IB ADDR
  369.     STA IBASVT-1,X
  370.     DEX
  371.     BNE
  372.     JMP INITAA
  373. ;
  374. IAS1
  375.     LDA #$40        ;INDICATE ROM APPLESOFT
  376.     STA ASIBSW
  377.     LDX #AS1VTL
  378. IAS1A   LDA AS1VT-1,X   ;MOVE ROM AS ADRS
  379.     STA IBASVT-1,X
  380.     DEX
  381.     BNE IAS1A
  382. ;
  383. INITAA
  384.     SEC         ;INDICATE INIT
  385.     BCS INITA
  386. DBRST
  387.     LDA ASIBSW      ;GET AS/IB FLAG
  388.     BNE INITA1      ;BR IF NOT IB
  389.     LDA #ITSTV      ;GET IB TEST VALUE
  390.     BNE INITA2      ;GO SET IB
  391. INITA1  ASLA            ;TST ROM AS
  392.     BPL INITA3      ;BR IF NOT ROM TEST VALUE
  393.     LDA #ATSTV      ;GET AS ROM TEST VALUE
  394. INITA2  JSR SWTST       ;GO SET
  395. INITA3
  396.     CLC         ;INDICATE RESET
  397. ;
  398. INITA
  399.     PHP         ;SAVE INIT/RESET
  400.     JSR MVCSW       ;GO MOVE CHAR SWITCH
  401.     LDA #MC+MI+MO   ;SET MONITOR MODES
  402.     STA MONMOD
  403. ;
  404.     LDA #0
  405.     STA OSTATE      ;CLEAR OUTSTATE AND EXECUTE STATE
  406.     PLP         ;GET INSTATE
  407.     RORA            ;SHIFT CARRY TO MSB
  408.     STA ISTATE      ;SAVE INSTATE
  409.     BMI INITB       ;BR IF INIT
  410.     JMP (CONT)      ;GO TO CONTINUE ENTRY
  411. INITB   JMP (GO)        ;GO TO GO ENTRY
  412.  
  413.     PAGE
  414. INITC
  415.     ASLA            ;OF ISTATE NOT ON
  416.     BPL INITD       ;THEN NOT RAM AS
  417.     STA ASIBSW      ;SET RAM AS
  418.     LDX #AS2VTL
  419. IAS2A   LDA AS2VT-1,X   ;MOVE RAM AS ADRS
  420.     STA IBASVT-1.X
  421.     DEX
  422.     BNE IAS2A
  423.     LDX #29
  424. IAS2B   LDA FNAME2,X
  425.     STA FNAME1,X
  426.     DEX
  427.     BPL IAS2B
  428. ;
  429. INITD
  430.     LDA DFNFTS      ;GO BUILD FILE TABS
  431.     STA CNFTBS      ;AND SET MEM BOUNDS
  432.     JSR BLDFTB
  433.     LDA ESTATE      ;GET EXEC STATE
  434.     BEQ INITZ       ;BR IF NOT EXECTUTE
  435.     PHA         ;SVE CHAR
  436.     JSR MVEFTA      ;GO MOVE EX FILE TAB ADR TO ZP
  437.     PLA         ;GET SAVED CHAR
  438.     LDY #0
  439.     STA (ZPGWRK),Y  ;
  440. INITZ
  441.     JSR CLRSTS      ;SET IN AND OUT STATES TO ZERO
  442.     LDX #IFBL
  443. INITE   LDA DBVECT,X        ;MOVE RESTART VECTORS  
  444.     STA $3D0,X
  445.     DEX
  446.     BPL INITE
  447.     LDA CMDNO       ;IF NOT BOOT
  448.     BNE INITF       ;THEN DONE
  449.     LDA FNAME1      ;IF FN1
  450.     EOR #$A0        ;NOT DONE
  451.     BEQ INITF       ;THEN DONE
  452.     JMP ERUN        ;ELSE
  453. ;
  454. IFB
  455. INITF
  456.     LDA SVCMD
  457.     BEQ INITG
  458.     STA CMDNO
  459.     JMP CMDGO
  460. INITG
  461.     JMP ORTN
  462. ;
  463. DBVECT  JMP DBRST
  464.     JMP DBINIT
  465.     JMP DOSENT
  466.     JMP DISKIO
  467. CCBLDR
  468.     LDA CCBADR+1
  469.     LDY CCBADR
  470.     RTS
  471.  
  472. IOBLDR
  473.     LDA AIOB+1
  474.     LDY AIOB
  475.     RTS
  476. IFBL    EQU *-IFB-1
  477.  
  478.     PAGE
  479. ;
  480. ;   CHRIN – CHAR RCVD VIA IN SWITCH
  481. ;
  482. CHRIN
  483.     JSR SVREGS
  484.     LDA ISTATE      ;IF NOT DISKIN
  485.     BEQ CHIN1       ;THEN BRANCH, ELSE
  486.     BPL CHINO
  487.     JMP INITC
  488. CHINO
  489.     LDA SVA
  490.     STA ($28),Y
  491.     JMP ICFD        ;AND GET CHAR FROM DISK
  492. CHIN1
  493.     LDA ESTATE
  494.     BEQ CHIN2
  495.     JMP NXTEXC
  496. CHIN2
  497.     LDA #3      ;SET OUT CHAR
  498.     STA OSTATE      ;STATE TO INPUT ECHO
  499.     JSR LDREGS
  500.     JSR GETIN
  501.     STA SVA
  502.     JMP ORTN
  503. ;
  504. GETIN   JMP (INSW)
  505. ;
  506. ;   CHROUT – CHAR RCVD VIA OUTPUT SWITCH
  507. ;
  508. CHROUT
  509.     JSR SVREGS      ;SAVE REGS
  510.  
  511.     LDA OSTATE      ;GET OUT SPARE
  512.     ASLA
  513. TAX
  514. LDA OUTSVT+1,X  ;GET ROUTINE ADR
  515. PHA
  516. LDA OUTSVT,X
  517. PHA
  518. LDA SVA
  519. RTS         ;GO TO ROUTINE
  520. ;
  521. ;   SVREGS – SAVE REGS WHILE PROCESSING CHARS
  522. ;
  523. SVREGS
  524.     STA SVA     ;SAVE ACU
  525. SVRGSA
  526.     STX SVX     ;SAVE X
  527.     STY SVY     ;SAVE Y
  528.     LDX #3      ;SET FOR FOUR BYTE MOVE
  529. SVRB    LDA SVOUTS,X        ;MOVE SAVED OUT AND IN SW
  530.     STA OUTSW,X     ;TO APPLE OUT/IN SW
  531.     DEX
  532.     BPL SVRB
  533.     RTS         ;DONE
  534.     PAGE
  535. ;
  536. ;   COS0 – 1ST CHAR OF PRINTED OUTPUT LINE
  537. ;       CHECK FOR CNTL-D
  538. ;
  539. COS0
  540.     LDX ISTATE      ;IS IN STATE NOT ZERO
  541.     BEQ COS01
  542.     CMP #’?+$80       ;THEN IS THIS?
  543.     BEQ COS6        ;THEN PRINT ONLY IF MONITOR
  544.     CMP PROMPT
  545.     BEQ COS6
  546. COS01
  547.     LDX #2
  548.     STX OSTATE
  549.     CMP CCHAR       ;IF NOT CNTL-D
  550.     BNE COS2        ;THEN GO TO STATE 2
  551.     DEX
  552.     STX OSTATE      ;ELSE STATE = 1
  553.     DEX
  554.     STX LBUFD       ;AND LBUFD=0
  555. ;
  556. ;   COS1 – ACCUMULATE CMD FROM PRINTED OUTPUT
  557. ;
  558. COS1
  559.     LDX LBUFD       ;GET LINE BUFF DISPL
  560. COS1A   STA LBUFF,X     ;PUT CHAR IN BUFF
  561.     INX         ;INCR PTR
  562.     STX LBUFD       ;SAVE PTR
  563.     CMP #$8D        ;WAS THIS A CR
  564.     BNE CMDRTN      ;IF NOT THEN PR CHAR
  565. ;
  566.     JMP SCNCMD      ;GO SCAN COMMAND
  567. ;
  568. ;   COS2 – PRINTED OUTPUT, NOT FIRST CHAR
  569. ;
  570. COS2
  571.     CMP #$8D        ;IS IT A CR
  572.     BNE PRRTN       ;BR IF NOT
  573.     LDX #0      ;SET FOR POSSIBLE C-D NEXT
  574.     STX OSTATE      ;NEXT STATE
  575.     JMP PRRTN       ;GO PRINT CHAR
  576.     PAGE
  577. ;
  578. ;   COS3 – KEY IN ECHO PRINT
  579. ;
  580. COS3
  581.     LDX #0
  582.     STX OSTATE      ;RESET OUT STATE
  583.     CMP #$8D        ;IS IT CR
  584.     BEQ COS3A       ;IS CR THEN CMD CHECK
  585. COS3B
  586.     LDA ESTATE      ;ELSE IF NOT EXECUTE
  587.     BEQ PRRTN       ;THEN PRINT CHAR
  588.     BNE DRTNI       ;ELSE PRINT IF MON INPUT
  589. COS3A
  590. ;
  591.     JSR TSTRUN
  592.     BCS COS3B
  593.     LDX SVX     ;GET LINE INDEX
  594.     JMP COS1A
  595. ;
  596. ;   COS4 – DISK OUTPUT MODE
  597. ;
  598. COS4
  599.     CMP #$8D        ;IS IT CR
  600.     BNE COS4A       ;BR IF NOT CR
  601.     LDA #5      ;SET STATE FOR CNTL-D
  602.     STA OSTATE      ;EXAMINE
  603. COS4A   JSR OCTD        ;GO OUTPUT CHAR TO DISK
  604.     JMP DRTNO       ;GO TO DATA RETURN (OUT)
  605. ;
  606. ;   COS5 – DISK OUTPUT MODE – 1ST CHAR OF A LINE
  607. ;
  608. COS5
  609.     CMP CCHAR       ;IS IT CNTL D
  610.     BEQ COS0        ;BR IF CNTL– D
  611.     CMP #$8A        ;LINE FEED?
  612.     BEQ COS4A
  613.     LDX #4
  614.     STX OSTATE      ;SET NEW OUT STATE
  615.     BNE COS4        ;BR IF NOT CNTL D
  616. ;
  617. ;   COS6 – DISK INPUT ECHO
  618. ;
  619. COS6    LDA #0
  620.     STA OSTATE      ;RESET OUT STATE = 0
  621.     BEQ DRTNI       ;GO TO DATA IN RETURN
  622.  
  623.     PAGE
  624. ;
  625. ;   PRRTN – PRINT CHAR RETURN
  626. ;
  627. ;
  628. ;   CMDRTN – PRINT CHAR IF MONITOR CMBS MODE
  629. ;   DRTNO – PRINT CHAR IF MONITOR DATA OUT
  630. ;   DRTNI – PRINT CHAR IF MONITOR DATA IN
  631. ;
  632. CERTN
  633.     LDA LBUFF       ;CHECK FOR PRINTED COMMAND
  634.     CMP CCHAR  
  635.     BEQ CMDRTN      ;IF PC THEN NO RESET X REG
  636.     LDA #$A0        ;BLANK
  637.     STA LBUFF
  638.     LDA #$8D        ;PLUS CR
  639.     STA LBUFF+1     ;TO OUT BUFFER
  640.     LDX #0      ;RESET TO SOL
  641.     STX SVX
  642. CMDRTN  LDA #MC
  643.     BNE MODECK
  644. DRTNO   LDA #MO
  645.     BNE MODECK
  646. DRTNI   LDA #MI
  647. ;
  648. MODECK
  649.     AND MONMOD      ;AND WITH MODE
  650.     BEQ ORTN        ;BR IF NOT PRINT
  651. PRRTN   JSR LDREGS
  652.     JSR ORTN1
  653.     STA SVA
  654.     STY SVY
  655.     STX SVX
  656. ;
  657. ORTN
  658.     JSR MVCSW       ;GO MOVE CHAR I/O SWITCH
  659. LDREGS
  660.     LDA SVA     ;ACU
  661.     LDY SVY     ;Y
  662.     LDX SVX     ;X
  663.     SEC
  664.     RTS         ;BY PASS PRINT
  665. ;
  666. ORTN1   JMP (OUTSW)
  667. ;
  668. ;   PRCRIF – PRINT CR IF MON CMDS
  669. ;
  670. PRCRIF
  671.     BIT MONMOD      ;IF NOT MON CMDS
  672.     BVC PRCIFR      ;THEN RETURN
  673.     LDA #$8D        ;ELSE PRINT CR
  674.     JSR ORTN1
  675. PRCIFR  RTS
  676.  
  677.     PAGE
  678. ;
  679. ;   SCNCMD – SCAN COMMAND
  680. ;
  681. SCNCMD
  682.     LDY #$FF
  683.     STY CMDNO       ;RESET COMMAND NUMBER
  684.     INY
  685.     STY SVCMD
  686. SC0
  687.     INC CMDNO       ;INCR CMD NO
  688.     LDX #0      ;RESET LINE INDEX TO 0
  689.     PHP         ;SAVE EQ STATUS
  690.     LDA LBUFF,X     ;GET 1ST  LINE CHAR
  691.     CMP CCHAR       ;IS IT CONTROL D
  692.     BNE SC0A        ;BR /IF NOT
  693.     INX         ;INCR OVER CNTLD
  694. SC0A    STX LBUFD
  695. ;
  696. SC1X
  697.     JSR GNBC        ;GET NON BLANK INPUT CHAR
  698.     AND #$7F        ;MSB OF CHAR OFF
  699.     EOR CMDNTB.Y        ;EOR WITH INPUT
  700.     INY         ;INCREMENT TABLE INDEX
  701.     ASLA            ;IF MSB OF EOR RESULT ON
  702.     BEQ SC1A        ;IF RESULT NOT NOW ZERO
  703.     PLA         ;THEN INPUT DOES NOT
  704.     PHP         ;EQUAL ENTRY
  705. SC1A    BCC SC1X        ;LOOP FOR END ENTRY
  706. ;
  707.     PLP         ;IF INPUT EQUALS END
  708.     BEQ SYNTAX      ;THEN GO SYNTAX
  709. ;
  710.     LDA CMDNTB,Y        ;IF NEXT TABLE CHAR NOT ZERO
  711.     BNE SC0     ;THEN SCAN THE NEXT TABLE ENTRY
  712. CNF             ;COMMAND NOT FOUND
  713.     LDA LBUFF       ;LINE IS A CONTROL-D
  714.     CMP CCHAR       ;THEN THIS IS A
  715.     BEQ CNF1        ;POSSIBLE SYNTAX ERROR, ELSE
  716.     JMP PRRTN       ;IT’S A BASIC INPUT LINE
  717. CNF1
  718.     LDA LBUFF+1     ;GET  NEXT CHAR
  719.     CMP #$8D        ;IS IT A CR
  720.     BNE CSERR       ;BR IF CR
  721.     JSR CLRSTS      ;CLEAR THE STATES
  722.     JMP CMDTRN      ;CNTL-D ONLY
  723. ;
  724. CSERR   JMP ESYNTX
  725.  
  726.     PAGE
  727. ;
  728. ;   SYNTAX – FIGURE OUT WHAT WE GOT HERE
  729. ;
  730. SYNTAX
  731.     LDA CMDNO       ;CMDNO=CMDNO*2
  732.     ASLA
  733.     STA CMDNO
  734. ;
  735.     TAY
  736.     LDA #FN1
  737.     AND CMDSTB,Y        ;IS FN1 REGD
  738.     BEQ SN10        ;BR IF NOT
  739.     JSR CLRFNS
  740.     PHP         ;SAVE EG STATUS
  741. ;
  742. SN2
  743.     JSR GNBC        ;GET NON BLANK CHAR
  744.     BEQ SN6     ;BR IF CR OR COMMA
  745.     ASLA            ;TEST FOR ALPHA
  746.     BCC SN2A        ;BR IF ALPHA
  747.     BMI SN2A        ;BR IS ALPHA
  748.     JMP CNF     ;LURCH IF NOT ALPHA
  749. SN2A    RORA            ;RESTORE BITS
  750.     JMP SN4     ;AWAY WE GO
  751. SN3 JSB GNXTC       ;GO GET NEXT CHAR
  752.     BEQ SN6     ;BR IF COMMA OR CHAR
  753. SN4 STA FNAME1,Y        ;PUT INTO ILENAME
  754.     INY         ;INC FN INDEX
  755.     CPY #60     ;ATFN FN INDEX
  756.     BCC SN3     ;BR IF NOT
  757. SN5 JSR GNXTC       ;LOOP UNTIL CR OR COMMA
  758.     BEQ SN5
  759. ;
  760. SN6 PLP         ;WAS THIS FN2 L OO
  761.     BNE SN7     ;BR IF IT WAS
  762. ;
  763.     LDY CMDNO
  764.     LDA #FN2
  765.     AND CMDSTB,Y        ;IF FN2 NOT REGD THEN
  766.     BEQ SN8     ;BRANCH
  767. ;
  768.     LDY #30     ;SET FN2 INDEX
  769.     PHP         ;INDICATE FN2 SEEK
  770.     BNE SN2     ;GO LOOK FOR FN2
  771. ;
  772. SN7 LDA FNAME2      ;IF 1ST CHAR OF
  773.     CMP #$A0        ;FN2 IS BLANK THEN
  774.     BEQ SERR1       ;SYNTAX ERROR
  775. ;
  776. SN8 LDA FNAME1      ;IF 1ST CHAR OF
  777.     CMP #$A0        ;FN1 IS NOT BLANK
  778.     BNE SOPTS       ;THEN GO LOOK FOR OPTIONS
  779. ;
  780.     LDY CMDNO
  781.     LDA #NPB+NPE        ;IF CMD MUST HAVE FILENAME
  782.     AND CMDSTB,Y        ;THEN
  783.     BEQ SERR1       ;THIS IS ERROR ELSE
  784. ;
  785.     BPL SOPTS       ;ITS EXECUTABLE WITHOUT
  786. ;
  787. SERR1   JMP CNF
  788. ;
  789. CLRFNS
  790.     LDA #0
  791.     LDY #60
  792. CLRFNA
  793.     LDA #$A0
  794. SN1 STA FNAME1-1,Y  ;CLEAR FN1, FN2
  795.     DEY
  796.     BNE SN1
  797.     RTS
  798.  
  799.     PAGE
  800. SN10                ;FILE NAMES NOT REGD
  801.     STA FNAME1
  802.     LDA #NUM1+NUM2  ;IF NEITHER NUM1
  803.     AND CMDSTB,Y        ;OR NUM2 IS REGD
  804.     BEQ SOPTS       ;THEN GO LOOK AT OPTIONS
  805. ;
  806.     JSR GETNUM      ;GO GET NUMERICS
  807.     BCS SERR1
  808. ;
  809.     TAY         ;IF HIGH DIGIT NOT
  810.     BNE SERR1       ;ZERO THEN BAD
  811. ;
  812.     CPX #17     ;IF LOW DIGIT GT 16
  813.     BCS SERR1       ;THEN BAD
  814. ;
  815.     LDY CMDNO
  816.     LDA #NUM1
  817.     AND CMDSTB,Y        ;IF WE WANT NUM2
  818.     BEQ SN11
  819. ;
  820.     CPX #8      ;IF NUM2>1
  821.     BCS SERR1       ;THEN ERROR, ELSE
  822.     BCC SOPTS       ;GO SCAN OPTIONS
  823. ;
  824. SN11
  825.     TXA         ;IF NUM1=0
  826.     BEQ SERR1       ;THEN ERROR, ELSE
  827. ;
  828.     PAGE
  829. ;
  830. ;   SOPTS – LOOK FOR SYNTAX OPTIONS
  831. ;
  832. SOPTS
  833.     LDA #0
  834.     STA INOPTS      ;CLEAR INPUT OPTIONS
  835.     STA IMBITS
  836.     STA CL
  837.     STA CL+1
  838.     LDA LBUFD       ;SET PASS 1
  839.     STA TEMP1A
  840. ;
  841. SP1 JSR GNBC        ;GO GET NON-BLANK CHAR
  842.     BNE SP2     ;BR IF NOT COMMA OR CR
  843.     CMP #$8D        ;IF CHAR IS COMMA
  844.     BNE SP1     ;THEN GO GET CHAR
  845. ;
  846.     LDX CMDNO       ;OPTIONS INPUT = I
  847.     LDA INOPTS      ;ALLOW OPTS = A
  848.     ORA CMDSTB+1,X  ;IF (A OR I)
  849.     EOR CMDSTB+1,X  ;XOR A NOT = 0 THEN
  850.     BNE SERR1       ;WE HAVE UNALLOWED OPTIONS
  851. ;
  852.     LDX TEMP1A      ;IF THIS IS PASS 2
  853.     BEQ CMDGO       ;THEN DONE,
  854.     STA TEMP1A      ;ELSE SET PASS
  855.     STX LBUFD       ;RESTORE LBUFD AND
  856.     BNE SP1     ;GO DO PASS 2
  857. ;
  858. SP2 LDX #OPT1L      ;COMPARE CHAR HAVE WITH
  859. SP3 CMP OPTAB1-1,X  ;CHARS IN OPT TABLE
  860.     BEQ SP4     ;IF NOT FOUND CONTINUE
  861.     DEX
  862.     BNE SP3     ;IF NOT FOUND
  863.     BEQ SERR2       ;THEN SYNTAX ERROR
  864. ;
  865. SP4 LDA OPTAB2-1,X  ;IF CORRESPONDING OP TAB 2 IS
  866.     BMI SP8     ;MINUS THEN IT MONITOR BITS
  867.     ORA INOPTS
  868.     STA INOPTS
  869.     DEX
  870. ;
  871.     STX TEMP2A      ;ELSE A NUMERIC MUST FOLLOW
  872.     JSR GETNUM      ;FOLLOW
  873.     BCS SERR2
  874. ;
  875.     LDA TEMP2A      ;GET IOTION NUMBER
  876.     ASLA            ;MULT BY 4
  877.     ASLA
  878.     TAY
  879. ;
  880.     LDA CNUM+1      ;IF RESULT NUM HI IS
  881.     BNE SP5     ;GT 0, THEN GT LOW RANGE
  882.     LDA CNUM        ;TEST RESULT LOW
  883.     CMP OPTAB3,Y        ;WITH LOW RANGE (LOW)
  884.     BCC SERR2       ;BR IF RESULT < LR
  885.     LDA CNUM+1
  886. SP5 CMP OPTAB3+3,Y 
  887.     BCC SP6     ;BR IF LESS
  888.     BNE SERR2       ;BR IF GRREATER
  889.     LDA CNUM
  890.     CMP OPTAB3+2,Y
  891.     BCC SP6     ;BR IF LESS
  892.     BNE SERR2       ;BR IF GREATER
  893. ;
  894. SP6 LDA TEMP1A      ;IF PASS 1,THEN
  895.     BNE SP1     ;DON’T STORE RESULT
  896.     TYA
  897.     LSRA
  898.     TAY
  899. ;
  900.     LDA CNUM+1      ;STORE THE RESULT
  901.     STA CUROPT+1,Y
  902.     LDA CNUM
  903.     STA CUROPT,Y
  904. SP7 JMP SP1     ;GO FOR NEXT OPT
  905. ;
  906. SP8             ;MONITOR REG
  907.     PHA         ;SAVE TYPE REG
  908.     LDA #CIO        ;SET OPTION OF CIO
  909.     ORA INOPTS
  910.     STA INOPTS
  911.     PLA         ;RESTORE REG
  912.     AND #$7F        ;CLEAR CIO
  913.     ORA IMBITS      ;OR WITH PREV IMBITS
  914.     STA IMBITS
  915.     BNE SP7     ;GO FOR NEXT
  916. ;
  917. SERR2   JMP CNF
  918.  
  919.     PAGE
  920. ;
  921. ;   CMDGO – EXECUTE COMMAND
  922. ;
  923. CMDGO
  924.     JSR CLRSTS
  925.     JSR CLRCCB      ;GO CLEAR CCB
  926.     JSR ECMD        ;GO EXECUTE
  927.     JMP CERTN
  928. ECMD
  929.     LDA CMDNO       ;COMMAND NO
  930.     TAX         ;IS CMD EXEC TAB INDEX
  931.     LDA CMDETB+1,X  ;GET CMD ADR
  932.     PHA         ;ONTO STACK
  933.     LDA CMDETB,X
  934.     PHA
  935.     RTS         ;AND GOTO COMMAND
  936. ;
  937. ;   GNXTC – GET NEXT CHAR
  938. ;
  939. GNXTC
  940.     LDX LBUFD
  941.     LDA LBUFF,X     ;GET NEXT CHAR AND IF
  942.     CMP #$8D        ;IT IS A CR
  943.     BEQ GNXTCR      ;THEN RETURN WITHOUT
  944.     INX         ;INCR TO NEXT CHAR
  945.     STX LBUFD
  946.     CMP #’,+$80       ;TEST FOR COMMA
  947. GNTXR   RTS
  948. ;
  949. ;   GNBC – GET NON BLANK CHAR
  950. ;
  951. GNBC
  952.     JSR GNXTC       ;GO GET NEXT CHAR
  953.     BEQ GNXTCR      ;BR IF COMMA OR CR
  954.     CMP #$A0        ;IS IT BLANK
  955.     BEQ GNBC        ;BR IF BLANK
  956.     RTS         ;DONE
  957. ;
  958. ;   CLRCCB – CLEAR CCB
  959. ;
  960. CLRCCB
  961.     LDA #0
  962.     LDY #CCBLEN     ;CCBLENGTH
  963. CLC1    STA CCB-1,Y     ;CLEAR BYTE
  964.     DEY
  965.     BNE CLC1
  966.     RTS
  967.  
  968.     PAGE
  969. ;
  970. ;   GETNUM – COVERT ASCII INPUT TO NUMERIC
  971. ;
  972. GETNUM
  973.     LDA #0      ;CLEAR WORK AREA
  974.     STA CNUM
  975.     STA CNUM+1
  976.     JSR GNBC
  977.     PHP
  978.     CMP #$A4
  979.     BEQ HEXNUM
  980.     PLP
  981.     JMP GN2A
  982. ;
  983. GN2 JSR GNBC        ;GET NEXT NON BLANK
  984. GN2A
  985.     BNE GN3     ;BR NOT COMMA OR CR
  986.     LDX CNUM        ;X=RESULT LOW
  987.     LDA CNUM+1      ;Y=RESULT HI
  988.     CLC
  989.     RTS         ;DONE
  990. ;
  991. GN3 SEC
  992.     SBC #$B0        ;SUBTRACT ASCII 0
  993.     BMI GN4     ;BR IF NOT NUM
  994.     CMP #10
  995.     BCS GN4     ;BR IF NOT NUM
  996.     JSR GN5     ;OLD*2
  997.     ADC CNUM        ;PLUS NEW
  998.     TAX
  999.     LDA #0
  1000.     ADC CNUM+1
  1001.     TAY
  1002.     JSR GN5     ;OLD*4
  1003.     JSR GN5     ;OLD*8
  1004.     TXA         ;OLD*8 + OLD*2 + NEW
  1005.     ADC CNUM
  1006.     STA CNUM        ;=OLD*10 + NEW
  1007.     TYA
  1008.     ADC CNUM+1
  1009.     STA CNUM+1
  1010.     BCC GN2
  1011. ;
  1012. GN4
  1013.     SEC
  1014.     RTS         ;DONE
  1015. GN5
  1016.     ASL CNUM        ;CNUM * 2
  1017.     ROL CNUM+1
  1018.     BCS GN4
  1019.     RTS
  1020.  
  1021.     PAGE
  1022. ;
  1023. HEXNUM
  1024.     PLP
  1025. HNO
  1026.     JSR GNBC        ;GO GET CHAR
  1027.     BEQ GN2A        ;BR IF CR OR COMMA
  1028. ;
  1029.     SEC
  1030.     SBC #$B0        ;CHAR – ASCII0
  1031.     BMI GN4     ;BR IF LTO
  1032.     CMP #10     ;IS IT LT10
  1033.     BCC HN1     ;BR IF LT
  1034.     SBC #$7     ;SUB 7 FOR ASCII A
  1035.     BMI GN4     ;BR IF LT A
  1036.     CMP #16     ;TEST GT 15
  1037.     BCS GN4     ;BR GT 15
  1038. HN1 JSR GN5     ;OLD*2
  1039.     JSR GN5     ;OLD*4
  1040.     JSR GN5     ;OLD*8
  1041.     JSR GN5     ;OLD*16
  1042.     ORA CNUM        ;OR IN NEW
  1043.     STA CNUM        ;SAVE NEW
  1044.     JMP HN0     ;GO FOR NEXT CHAR
  1045.  
  1046.     PAGE
  1047. ;
  1048. ;   EPR – EXECUTE PR#
  1049. ;
  1050. EPR
  1051.     LDA CNUM        ;GET PORT
  1052.     JMP OUTPRT      ;GO DO IT
  1053. ;
  1054. ;   EIN – EXECUTE IN#
  1055. ;
  1056. EIN
  1057.     LDA CNUM        ;GET PORT
  1058.     JMP INPRT       ;GO DO IT
  1059. ;
  1060. ;   EMON – EXECUTE MONITOR CMD
  1061. ;
  1062. EMON
  1063.     LDA MONMOD      ;GET CURRETN BITS
  1064.     ORA IMBITS      ;OR IN NEW BITS
  1065.     STA MONMOD      ;SET NEW MODE
  1066.     RTS
  1067. ;
  1068. ;   ENOMON – EXECUTE NO MONITOR CMD
  1069. ;
  1070. ENOMON
  1071.     BIT IMBITS
  1072.     BVC ENM1
  1073.     JSR PRCRIF
  1074. ENM1
  1075.     LDA #$70
  1076.     EOR IMBITS      ;INVERT INPUT BITS
  1077.     AND MONMOD      ;AND WITH CURRENT
  1078.     STA MONMOD      ;SET NEW MODE
  1079.     RTS
  1080.  
  1081.     PAGE
  1082. ;
  1083. ;   EMAXF – EXECUTE MAX FILES
  1084. ;
  1085. EMAXF
  1086.     LDA #0      ;RESET EXECUTE
  1087.     STA ESTATE
  1088.     LDA CNUM        ;SAVE NEW NO FILES
  1089.     PHA
  1090.     JSR CLALL       ;GO CLOSE ALL TBLS
  1091.     PLA
  1092.     STA CNFTBS      ;SET NEW NO FILE TBLS
  1093.     JMP BLDFTB      ;GO BUILD NEW ONES
  1094. ;
  1095. ;   EDEL – DELETE A FILE
  1096. ;
  1097. EDEL
  1098.     LDA #CRGDEL     ;DELETE REQUEST
  1099.     JSR OPEN        ;GO OPEN
  1100.     JSR FILSRC      ;FIND FILE
  1101.     LDY #0
  1102.     TYA
  1103.     STA (ZPGWRK),Y  ;RESET FN
  1104.     RTS
  1105. ;
  1106. ;   ELOCK – LOCK A FILE
  1107. ;
  1108. ELOCK
  1109.     LDA #CRGLCK     ;SET LOCK
  1110.     BNE ELGO
  1111. ;
  1112. ;   EUNLK – UNLOCK A FILE
  1113. ;
  1114. EUNLK
  1115.     LDA #CRGUNL     ;SET UNLOCK
  1116. ELGO
  1117.     JSR OPEN        ;OPEN FILE & UNLOCK
  1118.     JSR TSTFNF
  1119.     JMP ECLOSE
  1120. ;
  1121. ;   EVAR – VERIFY A FILE
  1122. ;
  1123. EVAR
  1124.     LDA #CRGVAR     ;SET VARIFY
  1125.     BNE ELGO
  1126.  
  1127.     PAGE
  1128. ;
  1129. ;   EREN – RENAME A FILE
  1130. ;
  1131. EREN
  1132.     LDA FN2ADR      ;MOVE FILE NAME2
  1133.     STA CCBFN2
  1134.     LDA FN2ADR+1
  1135.     STA CCBFN2+1
  1136.     LDA #CRGRNM
  1137.     STA TEMP1A      ;SET RENAME
  1138.     JSR EO3     ;GO OPEN AND RENAME
  1139.     JMP ECLOSE      ;GO CLOSE
  1140. ;
  1141. ;   EAPND – OPEN FILE FOR APPEND
  1142. ;
  1143. EAPND
  1144.     JSR EOPEN       ;GO OPEN
  1145.     LDA #CREFNF
  1146.     CMP CCBSTA      ;IF FILE CREATED
  1147.     BNE AP1
  1148.     RTS
  1149. AP1
  1150.     JSR RBYTE       ;READ A BYTE
  1151.     BNE AP1     ;BR IF NOT ZERO
  1152. ;
  1153.     JMP RWP3        ;GO RE-POSITION
  1154.  
  1155.     PAGE
  1156. ;
  1157. ;   EOPEN – OPEN A FILE
  1158. ;
  1159. EOPEN
  1160.     LDA #CRGOPN
  1161. OPEN
  1162.     STA TEMP1A
  1163.     LDA CL      ;IF NO LENGTH ENTERED
  1164.     BNE EO1     ;THEN SET DEFAULT OF 1
  1165.     LDA CL+1
  1166.     BNE EO1
  1167.     LDA #1
  1168.     STA CL
  1169. EO1
  1170.     LDA CL      ;MOVE REC LENGTH
  1171.     STA CCBRLN
  1172.     LDA CL+1
  1173.     STA CCBRLN+1
  1174. EO3
  1175.     JSR ECLOSE      ;GO CLOSE IF OPEN
  1176. EO4
  1177.     LDA CNUM+1      ;GET AVALL ENTRY
  1178.     BNE EO5     ;BR IF ONE AVAIL
  1179.     JMP ENFA        ;DONE – NO FILES AVAIL
  1180. EO5
  1181.     STA ZPGWRK+1        ;MOVE AVAIL SLOT TO ZPG
  1182.     LDA CNUM
  1183.     STA ZPGWRK
  1184. EO6
  1185.     JSR MVFN1       ;GO MOVE FILE NAME
  1186.     JSR MVBUFP      ;GO MOVE BUF PTRS
  1187.     JSR OPNSUP      ;GO SET UP OPEN
  1188.     LDA TEMP1A      ;SET OPEN REG
  1189.     STA CCBREG
  1190.     JMP DOSGO       ;GO OPEN
  1191.  
  1192.     PAGE
  1193.  
  1194. ;
  1195. ;   ECLOSE – EXECUTE CLOSE FILE COMMAND
  1196. ;
  1197. ECLOSE
  1198.     LDA FNAME1
  1199.     CMP #$A0
  1200.     BEQ CLALL
  1201.     JSR FILSRC      ;GO FIND FILE
  1202.     BCS ECL1        ;BR IF NOT FOUND
  1203.     JSR CLOSE       ;GO CLOSE
  1204.     JMP ECLOSE      ;GO SEE IF ANY MORE OPEN
  1205. ECL1    RTS
  1206. ;
  1207. ;   CLOSE – CLOSE A FILE
  1208. ;
  1209. CLOSE
  1210.     JSR TSTEXC
  1211.     BNE CLX
  1212.     LDA #0
  1213.     STA ESTATE
  1214. CLX
  1215.     LDY #0      ;CLEAR 1ST FN
  1216.     TYA         ;CHAR TO ZERO
  1217.     STA (ZPGWRK),Y
  1218.     JSR MVBUFP      ;MOVE BUFFER PTRS
  1219.     LDA #CRGCLS     ;SET CLOSE
  1220.     STA CCBREG
  1221.     JMP DOSGO       ;GO CLOSE
  1222. ;
  1223. ;   CLALL – CLOSE ALL FILES
  1224. ;
  1225. CLALL
  1226.     JSR TSINIT      ;GO INIT FILE SEARCH
  1227.     BNE CL1
  1228. CL0
  1229.     JSR TSNXT       ;NEXT ENTRY
  1230.     BEQ CL2     ;BR IF NO MORE
  1231. CL1
  1232.     JSR TSTEXC
  1233.     BEQ CL0
  1234.     JSR TSTOPN      ;GOL TEST OPEN
  1235.     BEQ CL0     ;BR NOT OPEN
  1236.     JSR CLOSE       ;GO CLOSE
  1237.     JMP CLALL       ;START OVER
  1238. CL2 RTS         ;DONE
  1239.  
  1240.     PAGE
  1241. ;
  1242. ;   EBSV – EXECUTE BINARY SAVE
  1243. ;
  1244. EBSV
  1245.     LDA #A+L        ;IF ALL
  1246.     AND INOPTS
  1247.     CMP #A+L   
  1248.     BEQ EBSV1
  1249.     JMP CNF     ;THEN ERROR
  1250. EBSV1
  1251.     LDA #4      ;SET BINARY FILE
  1252.     JSR SV1     ;GO OPEN & TEST
  1253.     LDA CA+1        ;OUTPUTADR OF BLOCK
  1254.     LDY CA
  1255.     JSR SV2
  1256.     LDA CL+1        ;GO OPEN AND TEST
  1257.     LDY CL
  1258.     JSR SV2     ;OUTPUT LENGTH
  1259.     LDA CA+1        ;GET ADR GIVEN
  1260.     LDY CA
  1261.     JMP SV3     ;OUTPUT BLOCK
  1262. ;
  1263. ;   EBLD – EXECUTE BINARY LOAD
  1264. ;
  1265. EBLD
  1266.     JSR EOPEN
  1267.     JSR TSTFNF
  1268. EBLD2
  1269.     LDA #$7F
  1270.     AND CCBFUC
  1271.     CMP #4
  1272.     BEQ EBLD3
  1273.     JMP ENBF
  1274. EBLD3
  1275.     LDA #4      ;SET BINARY FILE
  1276.     JSR SV1     ;GO OPEN $ TEST
  1277.     JSR LD2     ;GO GET ADR
  1278.     TAX
  1279.     LDA INOPTS
  1280.     AND #A      ;IF ADR NOT GIVEN
  1281.     BNE EBLD1
  1282.     STX CA      ;THEN USE ADR FROM FILE
  1283.     STY CA+1
  1284. EBLD1
  1285.     JSR LD2     ;GET LENGTH
  1286.     LDX CA      ;GET GIVEN ADR
  1287.     LDY CA+1
  1288.     JMP LD3     ;GO GET BLOCK
  1289. ;
  1290. ;   EBRUN – EXECUTE BINARY RUN
  1291. ;
  1292. EBRUN
  1293.     JSR EBLD        ;GO LOAD FILE
  1294.     JSR MVCSW       ;GO RESTORE CHAR I/O SW
  1295.     JMP (CA)        ;GO EXEC THE STUFF
  1296. TSTFNF  LDA #CREFNF     ;FILE NOT FOUND ERROR CODE
  1297.     CMP CCBSTA      ;TEST FILE NOT FOUND
  1298.     BEQ FNF     ;BR IF FILE NOT FOUND
  1299.     RTS         ;FILE FOUND, RETURN
  1300. FNF JMP KLUTZ       ;GO FIX THINGS
  1301.  
  1302.     PAGE
  1303. ;
  1304. ;   ESAVE – EXECUTE SAVE REQUEST
  1305. ;
  1306. ESAVE
  1307.     LDA ASIBSW      ;IF IB THEN
  1308.     BEQ EIBSV       ;GO TO IB SAVE
  1309.     LDA #2      ;GET APPLESOFT PGM
  1310.     JSR SV1     ;GO OPEN AND TEST
  1311. ;
  1312.     SEC         ;BLOCK LENGTH
  1313.     LDA ASEOP       ;=EOP-SOP
  1314.     SBC ASSOP
  1315.     TAY
  1316.     LDA ASEOP+1
  1317.     SBC ASSOP+1
  1318.     JSR SV2     ;GO OUTPUT BLOCK
  1319. ;
  1320.     LDA ASSOP+1     ;BLOCK ADR
  1321.     LDY ASSOP       ;=SOP
  1322.     JMP SV3     ;GO OUTPUT BLOCK
  1323. ;
  1324. EIBSV
  1325.     LDA #1      ;SET IB PGM
  1326.     JSR SV1     ;GO OPEN AND TEST
  1327. ;
  1328.     SEC         ;BLOCK LENGTH
  1329.     LDA IBHMEM      ;=HIMEM-SOP
  1330.     SBC IBSOP
  1331.     TAY
  1332.     LDA IBHMEM+1
  1333.     SBC IBSOP+1
  1334.     JSR SV2     ;GO OUTPUT LENGTH
  1335. ;
  1336.     LDA IBSOP+1     ;BLOCK ADR
  1337.     LDY IBSOP       ;=SOP
  1338.     JMP SV3     ;GO OUTPUT
  1339. ;
  1340. SV1
  1341. SV1A
  1342.     STA CCBFUC      ;SET BLOCK  PGM TYPE
  1343.     PHA         ;SAVE PGM TYPE
  1344.     JSR EOPEN       ;GO OPEN FILE
  1345.     PLA         ;GET SAVE TYPE
  1346.     JMP TSTFUC      ;GO CHECK
  1347. ;
  1348. SV2
  1349.     STY CCBBLN      ;SET BLOCK LENGTH
  1350.     STY CCBDAT      ;AND DATA BYTE
  1351.     STA CCBBLN+1
  1352.     LDA #CRGWR      ;INDICATE WRITE
  1353.     STA CCBREG
  1354.     LDA #CRMNBT     ;NEXT BYTE
  1355.     STA CCBRQM
  1356.     JSR DOSGO       ;GO WRITE
  1357.     LDA CCBBLN+1        ;OTHER BYTE TOO
  1358.     STA CCBDAT
  1359.     JMP DOSGO
  1360. ;
  1361. SV3 STY CCBBBA      ;SET BLOCK ADR
  1362.     STA CCBBBA+1
  1363.     LDA #CRMNBL     ;INDICATE BLOCK I/L
  1364.     STA CCBRQM
  1365.     JSR DOSGO       ;GO DO IT
  1366.     JMP ECLOSE      ;CLOSE FILE
  1367.  
  1368.     PAGE
  1369. NBPER   JMP ERNU1
  1370. ;
  1371. ;   ELOAD – EXECUTE LOAD REQUEST
  1372. ;
  1373. ELOAD
  1374.     JSR CLALL       ;GO CLOSE ALL
  1375.     JSR EOPEN       ;OPEN FILE
  1376.     LDA #CREFNF
  1377.     CMP CCBSTA      ;WAS FILE FOUND
  1378.     BNE ELD1        ;BR IF FOUND
  1379. ;
  1380. KLUTZ   JSR EDEL        ;DELETE NEW FILE
  1381.     LDA #CREFNF     ;FILE NOT FOUND MSG
  1382.     JMP ERROR       ;GO
  1383. ;
  1384. ELD1
  1385.     LDA #$7F        ;MASK PROTECT BIT
  1386.     AND CCBFUC      ;OUT OF FUC
  1387.     BEQ NBPER       ;BR IF ERROR
  1388.     AND #$03        ;ISOLOLATE IB & AS
  1389.     BEQ NBPER       ;BR IF ERROR
  1390.     STA CCBFUC      ;SAVE IB/AS ONLY
  1391.     LDA ASIBSW      ;IF IB THEN
  1392.     BEQ EIBL        ;GO TO IB LOAD
  1393.     LDA #2
  1394.     JSR LD1     ;GO OPEN AND TEST
  1395. ;
  1396.     JSR LD2     ;GO GET BLOCK LENGTH
  1397. ;
  1398.     CLC
  1399.     ADC ASSOP       ;ADD BLOCK LENGTH TO SOP
  1400.     TAX
  1401.     TYA
  1402.     ADC ASSOP+1
  1403. ;
  1404.     CMP ASHM1+1     ;IF BL+SOP >=HMEM
  1405.     BCS MFULL       ;THEN WON’T FIT
  1406. ;
  1407. EASL1
  1408.     STA ASEOP+1     ;SET NEW EOP ADR
  1409.     STA ASEOP2+1
  1410.     STX ASEOP
  1411.     STX ASEOP2
  1412.     LDX ASSOP       ;GET ADR WHERE TO LOAD
  1413.     LDY ASSOP+1
  1414.     JMP LD3     ;GO LOAD
  1415. ;
  1416. EIBL
  1417.     LDA #1      ;SET IB PGM
  1418.     JSR LD1     ;GO OPEN AND TEST
  1419. ;
  1420.     JSR LD2     ;GO GET BLOCK LENGTH
  1421. ;
  1422.     SEC         ;HMEM – BLOCK LENGTH
  1423.     LDA IBHMEM      ;IS NEW SOP
  1424.     SBC SVBL
  1425.     TAX
  1426.     LDA IBHMEM+1
  1427.     SBC SVBL+1
  1428.     BCC MFULL
  1429.     TAY
  1430. ;
  1431.     CPY IBLMEM+1        ;IF NEW SOP <= LMEM
  1432.     BCC MFULL
  1433.     BEQ MFULL
  1434.     STY IBSOP+1     ;SET NEW SOP
  1435.     STX IBSOP
  1436.     JMP LD3
  1437. ;
  1438. LD2
  1439.     LDA SVBLA       ;MOVE ADR OF WHERE
  1440.     STA CCBBBA      ;TO PUT DATA TO
  1441.     LDA SVBLA+1     ;CCBN
  1442.     STA CCBBBA+1
  1443.     LDA #0
  1444.     STA CCBBLN+1        ;READ INTO
  1445.     LDA #2
  1446.     STA CCBBLN
  1447.     LDA #CRGRD      ;READ
  1448.     STA CCBREG
  1449.     LDA #CRMNBL     ;BLOCK
  1450.     STA CCBRQM
  1451.     JSR DOSGO
  1452.     LDA SVBL+1
  1453.     STA CCBBLN+1
  1454.     TAY
  1455.     LDA SVBL
  1456.     STA CCBBLN
  1457.     RTS
  1458. ;
  1459. LD3
  1460.     STX CCBBBA      ;SET BLOCK ADR
  1461.     STY CCBBBA+1
  1462.     JSR DOSGO       ;GEET BLOCK
  1463.     JMP ECLOSE      ;GO CLOSE FILE
  1464. ;
  1465. MFULL
  1466.     JSR ECLOSE      ;GO CLOSE FILE
  1467.     JMP MFERR       ;AND GIVE ERR MSG
  1468. LD1
  1469.     CMP CCBFUC      ;TEST TYPE
  1470.     BEQ LD1C        ;BR IF MATCH
  1471.     LDX CMDNO
  1472.     STX SVCMD
  1473.     LSRA
  1474.     BEQ LD1A        ;BR IF PGM IS AS
  1475.     JMP EINT        ;GO FOR INTO BASIC
  1476. ;
  1477. LD1A
  1478.     LDX #29     ;SAVE FILE NAME
  1479. LD1B    LDA FNAME1,X        ;INCASE IS RAM APPLESOFT
  1480.     STA FNAME2,X   
  1481.     DEX
  1482.     BPL LD1B
  1483.     JMP EAS     ;GO FOR AS
  1484. ;
  1485. LD1C    RTS
  1486.  
  1487.     PAGE
  1488. ;
  1489. ;   ERUN – EXECUTE RUN REQUEST
  1490. ;
  1491. ERUN
  1492.     JSR ELOAD       ;LOAD PGM
  1493.     JSR PRCRIF
  1494.     JSR MVCSW       ;GO RESTORE CHAR I/O SW
  1495.     JMP (RUN)
  1496. ;
  1497. ;   IBRUN – INT BASIC RUN
  1498. ;
  1499. IBRUN
  1500.     LDA IBLMEM      ;RESET START OF VARS
  1501.     STA IBSOV
  1502.     LDA IBLMEM+1
  1503.     STA IBSOV+1
  1504.     JMP (CHAIN)
  1505. ;
  1506. ;   EHCAIN – EXECUTE CHAIN REQUEST
  1507. ;
  1508. ECHAIN
  1509.     JSR ELOAD       ;LOAD PGM
  1510.     JSR PRCRIF
  1511.     JSR MVCSW       ;GO RESTORE CHAR I/O SW
  1512.     JMP (CHAIN)
  1513. ASRUN1  JSR $D665       ;ROM
  1514.     JMP $D7D2
  1515. ASRUN2  JSR $E65        ;RAM
  1516.     JMP $FD4
  1517.  
  1518.     PAGE
  1519. ;
  1520. ;   EWRITE – WRITE CMD EXECUTE
  1521. ;
  1522. EWRITE
  1523.     JSR RWPOSN      ;GO POSITION FILE IF REGD
  1524.     JSR TSTFNF
  1525.     LDA #5
  1526.     STA OSTATE      ;SET OSTATE=5
  1527.     JMP CERTN       ;DONE
  1528. ;
  1529. ;   EREAD – READ COMD EXECUTE
  1530. ;
  1531. EREAD
  1532.     JSR RWPOSN      ;GO POSITION FILE IF REGD
  1533.     LDA #1
  1534.     STA ISTATE      ;SET ISTATE = DISK INPUT
  1535.     JMP CERTN       ;DONE
  1536. ;
  1537. ;   RWPOSN – POSITION FOR READ/WRITE
  1538. ;
  1539. RWPOSN
  1540.     JSR FILSRC      ;FIND THE FILE
  1541.     BCC RWP1        ;BR IF FILE FOUND
  1542.     JSR EOPEN       ;GO OPEN FOR KLUTZ
  1543.     JMP RWP2        ;THEN SKIP NEXT LINE
  1544. RWP1
  1545.     JSR MVBUFP      ;MOVE BUFF POINTERS
  1546. RWP2
  1547.     LDA INOPTS      ;GET IN OPTIONS
  1548.     AND #R+B        ;WAS IT B OR R
  1549.     BEQ RWPR        ;BR IF NOT
  1550.     LDX #3
  1551. RWP2A   LDA CR,X        ;MOVE REL REC
  1552.     STA CCBRRN,X        ;AND REL BYTE
  1553.     DEX
  1554.     BPL RWP2A
  1555. RWP3
  1556.     LDA #CRGPOS     ;INDICATE POSITION REQUIRED
  1557.     STA CCBREG
  1558.     JSR DOSGO
  1559. RWPR    RTS         ;DONE
  1560.     PAGE
  1561. ;
  1562. ;
  1563. ;   EINIT – EXECUTE INIT COMMAND
  1564. ;
  1565. EINIT
  1566.     LDA #V      ;MUST HAVE
  1567.     AND INOPTS      ;VOL OPTION
  1568.     BEQ INER
  1569.     LDA CV
  1570.     BEQ INER        ;BE GT 0
  1571.     LDA ASTART+1
  1572.     STA CCBBSA
  1573.     LDA #CRQFMT
  1574.     JSR OPEN
  1575.     JMP ESAVE
  1576. ;
  1577. INER    JMP CNF
  1578. ;
  1579. ;   ECAT – PRINT CATALOG
  1580. ;
  1581. ECAT
  1582.     LDA #CRGDIR
  1583.     JSR OPEN        ;GO PRETEND OPEN
  1584.     LDA CCBVOL
  1585.     STA CV
  1586.     RTS
  1587.     PAGE
  1588. ;
  1589. ;   EAS – EXECUTE APPLESOFT REQUEST
  1590. ;
  1591. EAS
  1592.     LDA #ATSTV      ;GET APPLESOFT TEST VALUE
  1593.     JSR SWTST       ;GO SWITCH AND TEST
  1594.     BEQ GOINIT      ;GO SWITCH AND TEST
  1595.     LDA #0
  1596.     STA ASIBSW
  1597. ;
  1598. EAS0
  1599.     LDY #30
  1600.     JSR CLRFNA
  1601.     LDX #FASBL
  1602. EAS1    LDA FASB-1,X        ;MOVE SYSTEM FILE NAME
  1603.     STA FNAME1-1,X
  1604.     DEX
  1605.     BNE EAS1
  1606. ;
  1607. EAS2
  1608.     LDA #$C0
  1609.     STA ISTATE      ;FOR RAM APPLESOFT
  1610.     JMP ERUN        ;GO LOAD AND RUN
  1611. ;
  1612. ;   EINT – EXECUTE INTEGER REQUEST
  1613. ;
  1614. EINT
  1615.     LDA #ITSTV      ;GET IB TEST VALUE
  1616.     JSR SWTST       ;GO SWITCH AND RUN
  1617.     BNE EAS     ;BR IF NOT IB
  1618. GOINIT
  1619.     JMP DBINIT      ;GO INIT DOS
  1620. SWTST
  1621.     CMP AITSTL      ;TEST CURRENT VALUE
  1622.     BEQ SWTR
  1623.     STA $C080       ;TRY SWITCH 1
  1624.     CMP AITSTL      ;TEST AGAIN
  1625.     BEQ SWTR        ;BR IF NOW SAME
  1626.     STA $C081       ;TRY SWITCH 2
  1627.     CMP AITSTL      ;TEST AND
  1628. SWTR    RTS
  1629. ;
  1630.     PAGE
  1631. ;
  1632. ;   EEXEC – EXEC CMD
  1633. ;
  1634. EEXEC
  1635.     JSR EOPEN       ;OPEN FILE
  1636.     JSR TSTFNF
  1637.     LDA CFTABA      ;MOVE TABLE POINTERS
  1638.     STA EFTABA
  1639.     LDA CFTABA+1
  1640.     STA EFTABA+1
  1641.     LDA FNAME1      ;USE FILENAME
  1642.     STA ESTATE      ;SET EX STATE NON ZERO
  1643.     BNE EXP2
  1644. ;
  1645. ;
  1646. ;   EPOS – EXECUTE POSITION
  1647. ;
  1648. EPOS
  1649.     JSR FILSRC
  1650.     BCC EXP1
  1651.     JSR EOPEN
  1652.     JSR TSTFNF
  1653.     JMP EXP2
  1654. EXP1    JSR MVBUFP
  1655. EXP2
  1656.     LDA INOPTS      ;GET OPTIONS
  1657.     AND #R      ;TEST R
  1658.     BEQ EX2     ;BR NOT R
  1659. ;
  1660. EXO LDA CR      ;IF CR NOT ZERO
  1661.     BNE EX1A        ;THEN DECREMENT
  1662.     LDX CR+1
  1663.     BEQ EX2
  1664.     DEC CR+1
  1665. EX1A    DEC CR
  1666. EX1 JSR RBYTE       ;AND READ A RCORD
  1667.     BEQ ICFD4
  1668.     CMP #$8D        ;UNTIL CR
  1669.     BNE EX1
  1670.     BEQ EX0     ;THEN TEST CR AGAIN
  1671. ;
  1672. EX2 RTS         ;DONE
  1673.     PAGE
  1674. ;
  1675. ;   OCTD – OUTPUT A CHAR TO DISK
  1676. ;
  1677. OCTD
  1678.     JSR TSTRUN      ;GO TEST RUN
  1679.     BCS ICFDB
  1680.     LDA SVA     ;CHAR IN SAVED ACU
  1681.     STA CCBDAT      ;PUT INTO CCBDATA AREA
  1682.     LDA #CRQWR      ;SET WRITE
  1683.     STA CCBREQ
  1684.     LDA #CRMNBT     ;SET NEXT BYTE
  1685.     STA CCBRQM
  1686.     JMP DOSGO       ;GO WRITE BYTE
  1687. ;
  1688. ;   INCFD – INPUT A CHAR FROM DISK
  1689. ;
  1690. ICFD
  1691.     JSR TSTRUN      ;GO TEST RUN
  1692.     BCS ICFDB
  1693.     LDA #6      ;SET OUT STE = 6
  1694. ICFD3
  1695.     STA OSTATE      ;TO CATCH ECHO
  1696.     JSR RBYTE
  1697.     BNE ICFD1       ;BR IF NOT ZERO CHAR
  1698. ICCFD2
  1699.     JSR CLOSE
  1700.     LDA #3
  1701.     CMP OSTATE
  1702.     BEQ ICFD0
  1703. ICFD4
  1704.     LDA #CREEOF
  1705.     JMP ERROR       ;GO TO ERROR
  1706. ICFD1
  1707.     STA SVA     ;PUT INTO SAVED ACU
  1708. ICFD0
  1709.     JMP ORTN        ;GO RESTORE REGS AND RTS
  1710. ;
  1711. TSTRUN
  1712.     LDA ASIBSW      ;GET AS/INT BASIC SWITCH
  1713.     BEQ TR1     ;BR IF INT
  1714.     LDX $76     ;TEST AS RUN
  1715.     BNE NOTRUN      ;BR IF NOT RUN
  1716. TR0 CLC
  1717.     RTS
  1718. TR1
  1719.     LDA $D9     ;GET INT RUN FLAG
  1720.     BMI TR0     ;BR IF RUN
  1721. NOTRUN  SEC
  1722.     RTS
  1723. ICFDB               ;NOT RUN MODE
  1724.     JSR CLOSE       ;GO CLOSE FILE
  1725.     JSR CLRSTS      ;GO CLEAR STATES
  1726.     JMP ORTN
  1727.     PAGE
  1728. ;
  1729. ;   NXTEXC – NEXT EXECUTE CHAR
  1730. ;
  1731. NXTEXC
  1732.     JSR MVEFTA
  1733.     JSR MVBUFP      ;GO MOVE PTRS
  1734.     LDA #3
  1735.     BNE ICFD3
  1736. ;
  1737. ;   RBYTE – READ NEXT BYTE
  1738. ;
  1739. RBYTE
  1740.     LDA #CRQRD      ;SET READ
  1741.     STA CCBREQ
  1742.     LDA #CRMNBT     ;SET NEXT BYTE
  1743.     STA CCBRQM
  1744.     JSR DOSGO       ;GO TO DOS
  1745.     LDA CCBDAT      ;GET THE DATA BYTE
  1746.     RTS
  1747. MVEFTA
  1748.     LDA EFTABA+1        ;MOVE TABLE ADR
  1749.     STA ZPGWRK+1        ;NO ZPG
  1750.     LDA EFTABA
  1751.     STA ZPGWRK
  1752.     RTS
  1753.     PAGE
  1754. ;
  1755. ;   DOSGO – GOTO DOS
  1756. ;
  1757. DOSGO
  1758.     JSR DOSENT      ;GO TO DOS
  1759.     BCS DG1     ;BR IF ERROR
  1760.     RTS         ;DONE
  1761. ;
  1762. DG1             ;*** ERROR ***
  1763.     JSR FILSRC      ;GET FILE TABLE
  1764.     BCS DG2     ;BR IF NOT FOUND
  1765.     LDA #0
  1766.     TAY
  1767.     STA (ZPGWRK), Y ;CLOSE FILE HERE
  1768. DG2
  1769.     LDA CCBSTA      ;GET STATUS OF I/O
  1770.     CMP #CREEOF     ;EOF ?
  1771.     BNE DG3     ;BR IF NOT
  1772.     LDX #0      ;SET OTHER EIF
  1773.     STX CCBDAT      ;DONE
  1774.     RTS
  1775. DG3
  1776.     JMP ERROR       ;GO DO ERROR
  1777. ;
  1778.     PAGE
  1779. ;
  1780. ;   ERROR ROUTINE
  1781. ;
  1782. ESYNTX  LDA #CREFLK+1
  1783.     BNE ERROR
  1784. ENFA    LDA #CREFLK+2
  1785.     BNE ERROR
  1786. MFERR   LDA #CREFLK+4
  1787.     BNE ERROR
  1788. ERNU1   LDA #CREFLK+3
  1789.     BNE ERROR
  1790. ENBF    LDA #CREFLK+5
  1791. ;
  1792. ERROR
  1793.     STA SVA     ;SAVE MSG NUMBER
  1794.     JSR CLRSTS
  1795.     LDA ASIBSW      ;GET AS/IN BASIC SWITCH
  1796.     BEQ ERNAS       ;BR IF NOT APPLESOFT
  1797.     LDA $D8     ;GET ON ERR FLAG
  1798.     BMI ERRTN       ;BRT IF ON ERR IS GO
  1799. ERNAS
  1800.     LDX #0
  1801.     JSR EMPR        ;GO OUTPUT
  1802.     LDX SVA     ;GET SAVE MSG
  1803.     JSR EMPR        ;GO OUTPUT MSG
  1804.     LDX #CREFLK+6
  1805.     JSR EMPR
  1806. ERRTN   JSR MVCSW       ;GO MOVE CHAR I/ SW
  1807.     LDX SVA
  1808.     LDA #03
  1809.     JMP (BREAK)
  1810. ;
  1811. EMPR
  1812.     LDA EMDTB,X     ;GET ITS DISPL
  1813.     TAX         ;INTO X
  1814. EMPR1
  1815.     STX TEMP1A      ;SAVE DISPL
  1816.     LDA EMSG,X      ;GET MSG CHAR
  1817.     PHA         ;SAVE CHAR
  1818.     ORA #$80        ;SET MSB ON
  1819.     LDX TEMP1A      ;GET INDEX
  1820.     INX         ;INCREMENT IT
  1821.     PLA         ;RE-LOAD CHAR
  1822.     BPL EMPR1       ;BR IF MORE CHARS
  1823.     RTS         ;DONE
  1824.     PAGE
  1825. ;
  1826. ;   OPNSUP – OPEN SET UP
  1827. ;
  1828. OPNSUP 
  1829.     LDA CV      ;VOLUME
  1830.     STA CCBVOL
  1831.     LDA CD      ;DRIVE
  1832.     STA CCBDRV
  1833.     LDA CS      ;SLOT
  1834.     STA CCBSLT
  1835.     LDA FN1ADR      ;FILENAME 1 ADR
  1836.     STA CCBFN1
  1837.     LDA FN1ADR+1
  1838.     STA CCBFN1+1
  1839.     LDA ZPGWRK
  1840.     STA CFTABA
  1841.     LDA ZPGWRK+1
  1842.     STA CFTABA+1
  1843.     RTS
  1844. ;
  1845. ;   MVFN1 – MOVE FILE NAME 1 TO FILE PTR
  1846. ;
  1847. MVFN1
  1848.     LDY #29
  1849. MVFN1A  LDA FNAME1,Y
  1850.     STA (ZPGWRK),Y
  1851.     DEY
  1852.     BPL MVFN1A
  1853.     RTS
  1854. ;
  1855. ;   MVBUFP – MOVE BUFFER PTRS TO CCB
  1856. ;
  1857. MVBUFP
  1858.     LDY #30
  1859. MVBP1   LDA (ZPGWRK),Y
  1860.     STA CCBFCB-30,Y
  1861.     INY
  1862.     CPY #38
  1863.     BNE MVBP1
  1864.     RTS
  1865. ;
  1866. ;   CLRSTS – CLEAR STATES
  1867. ;
  1868. CLRSTS
  1869.     LDY #0
  1870.     STY ISTATE
  1871.     STY OSTATE
  1872.     RTS
  1873.     PAGE
  1874. ;
  1875. ;   FILSRC – SEARCH FOR FILE NAME1
  1876. ;
  1877. FILSRC
  1878.     LDA #0      ;CLEAR SV AVAIL
  1879.     STA CNUM+1
  1880. ;
  1881.     JSR TSINIT      ;GO INIT SEARCH
  1882.     JMP FLS1A
  1883. FLS1    JSR TSNXT       ;LOOK AT NEXT
  1884.     BEQ FLS4        ;BR IF NO NEXT
  1885. ;
  1886. FLS1A   JSR TSTOPN      ;GO TEST OPEN
  1887.     BNE FLS2        ;BR IF OPEN
  1888. ;
  1889.     LDA ZPGWRK      ;SAVE AVAIL ENTRY ADR
  1890.     STA CNUM
  1891.     LDA ZPGWRK+1
  1892.     STA CNUM+1
  1893.     BNE FLS1        ;GO LOOK SOME MORE
  1894. ;
  1895. FLS2    LDY #29     ;FILE HAD 30 CHARS
  1896. FLS3    LDA (ZPGWRK),Y  ;GET CHAR
  1897.     CMP FNAME1,Y        ;TEST CHAR
  1898.     BNE FLS1        ;BR NOT
  1899.     DEY
  1900.     BPL FLS3        ;LOOK AT 30 CHARS
  1901.     CLC         ;FOUND
  1902.     RTS         ;DONE
  1903. ;
  1904. FLS4    SEC         ;NOT FOUND
  1905.     RTS         ;DONE
  1906.     PAGE
  1907. ;
  1908. ;   TSINIT – INITIALIZE FOR FTAB SEARCH
  1909. ;   TSNXT – GET NEXT FTAB ENTRY
  1910. ;
  1911. TSINIT
  1912.     LDA FTAB        ;GET 1ST PTR ADR
  1913.     LDX FTAB+1
  1914.     BNE TSST
  1915. TSNXT
  1916.     LDY #37     ;GET LINK
  1917.     LDA (ZPGWRK),Y
  1918.     BEQ TSR     ;BR IF NO LINK
  1919. ;
  1920.     TAX
  1921.     DEY
  1922.     LDA (ZPGWRK),Y
  1923. TSST
  1924.     STX ZPGWRK+1
  1925.     STA ZPGWRK
  1926.     TXA         ;SET NE CC
  1927. TSR RTS         ;RTN
  1928. ;
  1929. ;   TSTOPN – TST FOR OPEN FILE
  1930. ;
  1931. TSTOPN
  1932.     LDY #0      ;GET 1ST CHAR OF FN
  1933.     LDA (ZPGWRK),Y
  1934.     RTS
  1935. ;
  1936. ;   TSTEXC – TEST CURRENT FILE FOR EXECUTE
  1937. ;
  1938. TSTEXC
  1939.     LDA ESTATE      ;IF ESTATE = 0
  1940.     BEQ TXTC1       ;THEN NO EXECUTE FILE
  1941.     LDA EFTABA      ;TEST CURRENT
  1942.     CMP ZPGWRK
  1943.     BNE TXC2        ;IS NOT
  1944.     LDA EFTABA+1
  1945.     CMP ZPGWRK+1
  1946.     BEQ TXC2        ;IS
  1947. TXC1    DEX         ;IS NOT
  1948. TXC2    RTS         ;DONE
  1949.     PAGE
  1950. ;
  1951. ;   TSTFUC – TEST FILE USE CODE FOR PGM
  1952. ;
  1953. TSTFUC
  1954.     EOR CCBFUC
  1955.     BEQ TFUCR
  1956.     AND #$7F
  1957.     BEQ TFUCR
  1958.     JSR ECLOSE      ;GO CLOSE THE SOB
  1959.     JMP ERNU1
  1960. TFUCR   RTS
  1961.     PAGE
  1962. ;
  1963. ;   BLDFTB – BUILD FILE TABLES
  1964. ;   TABLE MAP:
  1965. ;       HIMEM,SOP
  1966. ;       SBUFF N     (256)
  1967. ;       DBUFF N     (256)
  1968. ;       FTB   N     (FCBLEN)
  1969. ;       HEADER N        (38)
  1970. ;
  1971. ;
  1972. ;       SBUFF   1
  1973. ;       DBUFF   1
  1974. ;       FTB 1
  1975. ;       HEADER  1
  1976. ;       THIS PROGRAM
  1977. ;
  1978. ;   HEADER MAP:
  1979. ;       FILENAME (30)
  1980. ;       FTB PTR  (2)
  1981. ;       DBUF PTR (2)
  1982. ;       SBUF PTR (2)
  1983. ;       LINK     (2)
  1984. ;
  1985. BLDFTB
  1986.     SEC
  1987.     LDA FTAB        ;START OF FTAB AREA
  1988.     STA ZPGWRK      ;IS 1ST FTB PTR
  1989.     LDA FTAB+1      ;HEADER
  1990.     STA ZPGWRK+1
  1991.     LDA CNFTBS      ;MOVE NO FTABS
  1992.     STA TEMP1A      ;TO TEMP
  1993. ;
  1994. BFT1    LDY #0
  1995.     TYA
  1996.     STA (ZPGWRK),Y  ;1ST CHAR FN=0
  1997.     LDY #30     ;INC Y TO FCB PTR
  1998.     SEC
  1999.     LDA ZPGWRK      ;END OF PTR HEADER
  2000.     SBC #FCBLEN     ;MINUS FTAB LENGTH
  2001.     STA (ZPGWRK),Y  ;IS START OF FTB
  2002.     PHA         ;SAVE LOW ADR BYTE
  2003.     LDA ZPGWRK+1
  2004.     SBC #0
  2005.     INY
  2006.     STA (ZPGWRK),Y
  2007.     TAX
  2008.     DEX         ;FTB ADR – 256
  2009.     PLA         ;IS ADR DIR BUFF
  2010.     PHA
  2011.     INY
  2012.     STA (ZPGWRK),Y  ;SET DIR BUF PTR
  2013.     TXA
  2014.     INY
  2015.     STA (ZPGWRK),Y
  2016.     TAX
  2017.     DEX         ;DIR BUFF – 256
  2018.     PLA         ;IS SBUFF ADR
  2019.     PHA
  2020.     INY
  2021.     STA (ZPGWRK),Y
  2022.     INY
  2023.     TXA
  2024.     STA (ZPGWRK),Y
  2025. ;
  2026.     DEC TEMP1A      ;DECREMENT TABLE INDEX
  2027.     BEQ BFT2        ;COUNT AND BR IF DONE
  2028.     TAX
  2029.     PLA
  2030.     SEC
  2031.     SBC #38     ;SBUFF ADR – 38
  2032.     INY
  2033.     STA (ZPGWRK),Y  ;IF ADR OF NEXT TAB
  2034.     PHA         ;WHICH GOES INTO
  2035.     TXA         ;LINK
  2036.     SBC #0
  2037.     INY
  2038.     STA (ZPGWRK),Y
  2039.     STA ZPGWRK+1        ;AND INTO ZPGWRK
  2040.     PLA         ;FOR NEXT ENTRY
  2041.     STA ZPGWRK      ;BUILD
  2042.     JMP BFT1        ;GO BUILD NEXT
  2043. ;
  2044. BFT2
  2045.     PHA
  2046.     LDA #0      ;SET LAST LINK
  2047.     INY         ;TO ZERO
  2048.     STA (ZPGWRK),Y
  2049.     INY
  2050.     STA (ZPGWRK),Y
  2051. ;
  2052.     LDA ASIBSW      ;IF IB THEN GO
  2053.     BEQ BFTIB
  2054. ;
  2055.     PLA         ;SET APPLESOFT
  2056.     STA ASHM1+1     ;UPPER MEM LIMITS
  2057.     STA ASHM2+1
  2058.     PLA
  2059.     STA ASHM1
  2060.     STA ASHM2
  2061.     RTS
  2062. ;
  2063. BFTIB
  2064.     PLA         ;SET IB
  2065.     STA IBHMEM+1        ;UPPER MEM LIMITS
  2066.     STA IBSOP+1
  2067.     PLA
  2068.     STA IBHMEM
  2069.     STA IBSOP
  2070.     RTS
  2071.     PAGE
  2072. ;
  2073. ;   MVISW – MOVE INPUT SWITCH
  2074. ;
  2075. MVCSW
  2076.     LDA INSW+1
  2077.     CMP CINA+1
  2078.     BEQ MVOSW
  2079.     STA SVINS+1
  2080.     LDA INSW        ;SAVE CHAR INSWITCH
  2081.     STA SVINS
  2082. ;
  2083.     LDA CINA        ;SET DB CHAR IN ADR
  2084.     STA INSW
  2085.     LDA CINA+1
  2086.     STA INSW+1
  2087. ;
  2088. ;
  2089. ;   MVOSW – MOVE OUTPUT SWITCH
  2090. ;
  2091. MVOSW
  2092.     LDA OUTSW+1
  2093.     CMP COUTA+1
  2094.     BEQ MVSRTN
  2095.     STA SVOUTS+1
  2096.     LDA OUTSW       ;SAVE CHAR OUT SWITCH
  2097.     STA SVOUTS
  2098. ;
  2099.     LDA COUTA       ;SET DB CHAR OUT ADR
  2100.     STA OUTSW
  2101.     LDA COUTA+1
  2102.     STA OUTSW+1
  2103. MVSRTN
  2104.     RTS
  2105.     PAGE
  2106. ;
  2107. ;   COMMAND NAME TABLE
  2108. ;
  2109. EC1
  2110. CMDNTB
  2111.     DB01    "INIT"
  2112.     DB01    "LOAD"
  2113.     DB01    "SAVE"
  2114.     DB01    "RUN"
  2115.     DB01    "CHAIN"
  2116.     DB01    "DELETE"
  2117.     DB01    "LOCK"
  2118.     DB01    "UNLOCK"
  2119.     DB01    "CLOSE"
  2120.     DB01    "READ"
  2121.     DB01    "EXEC"
  2122.     DB01    "WRITE"
  2123.     DB01    "POSITION"
  2124.     DB01    "OPEN"
  2125.     DB01    "APPEND"
  2126.     DB01    "RENAME"
  2127.     DB01    "CATALOG"
  2128.     DB01    "MON"
  2129.     DB01    "NOMON"
  2130.     DB01    "PR#"
  2131.     DB01    "IN#"
  2132.     DB01    "MAXFILES"
  2133.     DB01    "FP"
  2134.     DB01    "INT"
  2135.     DB01    "BSAVE"
  2136.     DB01    "BLOAD"
  2137.     DB01    "BRUN"
  2138.     DB01    "VERIFY"
  2139.     DB  0
  2140.     PAGE
  2141. ;
  2142. ;   COMMAND SYNTAX OP EQUATES FOR SYNTAX BYTE ONE
  2143. ;
  2144. NPB EQU $80     ;NO PARMS OK, COMMAND GOES TO BASIC
  2145. NPE EQU $40     ;NO PARMS OK, COMMAND TO EXECUTION RTN
  2146. FN1 EQU $20     ;FILE NAME1 REGD
  2147. FN2 EQU $10     ;FILE NAME2 REGD
  2148. NUM1    EQU $08     ;NUMERIC 0-7 REGD
  2149. NUM2    EQU $04     ;NUMERIC 1-10 REGD
  2150. ;
  2151. ;   COMMAND SYNTAX OP EQUATES FOR SYNTAX BYTE TWO
  2152. ;
  2153. V   EQU $40     ;VOLUME ALLOWED
  2154. D   EQU $20     ;DRIVE ALLOWED
  2155. S   EQU $10     ;SLOT ALLOWED
  2156. L   EQU $08     ;LENGTH ALLOWED
  2157. R   EQU $04     ;RECORD NUMBER ALLOWED
  2158. B   EQU $02     ;BYTE NUMBER ALLOWED
  2159. A   EQU $01     ;ADDRESS
  2160. CIO EQU $80     ;C,I, OR O ALLOWED
  2161. ;
  2162. ;   COMMAND SYNTAX TABLE
  2163. ;   EACH COMMAND HAS TWO BYTE ENTRY
  2164. ;
  2165. ;
  2166. CMDSTB
  2167.     DB  FN1,V+D+S   ;INIT
  2168.     DB  NPB+FN1,V+D+S   ;LOAD
  2169.     DB  NPB+FN1,V+D+S   ;SAVE
  2170.     DB  NPB+FN1,V+D+S   ;RUN
  2171.     DB  FN1,V+D+S   ;CHAIN
  2172.     DB  FN1,V+D+S   ;DELETE
  2173.     DB  FN1,V+D+S   ;LOCK
  2174.     DB  FN1,V+D+S   ;UNLOCK
  2175.     DB  NPE+FN1,0   ;CLOSE
  2176.     DB  FN1,B+R     ;READ
  2177.     DB  FN1,R+V+D+S ;EXEC
  2178.     DB  FN1,B+R     ;WRITE
  2179.     DB  FN1,R       ;POSITION
  2180.     DB  FN1,L+V+D+S ;OPEN
  2181.     DB  FN1,L+V+D+S ;APPEND
  2182.     DB  FN1+FN2,V+D+S   ;RENAME
  2183.     DB  NPE,V+D+S   ;CATALOG
  2184.     DB  NPE,CIO     ;MONITOR
  2185.     DB  NPE,CIO     ;NO MONITOR
  2186.     DB  NUM1,0      ;PR#
  2187.     DB  NUM1,0      ;IN#
  2188.     DB  NUM2,0      ;MAXFILES
  2189.     DB  NPE,V+D+S   ;APPLESOFT
  2190.     DB  NPE,0       ;INT
  2191.     DB  FN1,V+D+S+A+L   ;BSAVE
  2192.     DB  FN1,V+D+S+A ;BLOAD
  2193.     DB  FN1,V+D+S+A ;BRUN
  2194.     DB  FN1,V+D+S   ;VERIFY
  2195.     PAGE
  2196. ;
  2197. ;   OPTAB – OPTIONAL PARMS SYNTAX TABLES
  2198. ;
  2199. OPTAB1
  2200.     DB11    "VDSLRBACIO"
  2201. OPT1L   EQU *-OPTAB1
  2202. OPTAB2
  2203.     DB  V,D,S,L,R,B,A,CIO+MC,CIO+MI,CIO+MO
  2204. OPTAB3
  2205.     DB  @@0,@@254   ;VOL RANGE
  2206.     DB  @@1,@@2     ;DRIVE RANGE
  2207.     DB  @@1,@@7     ;SLOT RANGE
  2208.     DB  @@1,@@32767 ;LENGTH RANGE
  2209.     DB  @@0,@@32767 ;REC NO RANGE
  2210.     DB  @@0,@@32767 ;REC BYTE NO RANGE
  2211.     DB  @@0,@@$C000 ;ADDRESS RANGE
  2212.     PAGE
  2213. ;
  2214. ;   ERROR MESSAGE TABLES
  2215. ;
  2216. EMSG
  2217.     DB  $0D,$07
  2218.     DB01    "***DISK: "
  2219. EM1 EQU *-EMSG
  2220. EM2 EQU *-EMSG
  2221. EM3 EQU *-EMSG
  2222.     DB01    "SYS"
  2223. EM4 EQU *-EMSG
  2224.     DB01    "WRITE PROTECT"
  2225. EM5 EQU *-EMSG
  2226.     DB01    "END OF DATA"
  2227. EM6 EQU *-EMSG
  2228.     DB01    "FILE NOT FOUND"
  2229. EM7 EQU *-EMSG
  2230.     DB01    "VOLUME MISMATCH"
  2231. EM8 EQU *-EMSG
  2232.     DB01    "DISK I/O"
  2233. EM9 EQU *-EMSG
  2234.     DB01    "DISK FULL"
  2235. EM10    EQU *EMSG
  2236.     DB01    "FILE LOCKED"
  2237. EM11    EQU *EMSG
  2238.     DB01    "CMD SYNTAX"
  2239. EM12    EQU *-EMSG
  2240.     DB01    "NO FILE BUFFS AVAIL"
  2241. EM13    EQU *-EMSG
  2242.     DB01    "NOT BASIC PROGRAM"
  2243. EM14    EQU *-EMSG
  2244.     DB01    "PROGRAM TOO LARGE"
  2245. EM15    EQU *-EMSG
  2246.     DB01    "NOT BINARY FILE"
  2247. ;
  2248. EML EQU *-EMSG
  2249.     DB  " ERROR"
  2250.     DB  $8D
  2251. EMDTB
  2252.     DB  0,EM1,EM2,EM3,EM4
  2253.     DB  EM5,EM6,EM7,EM8,EM9
  2254.     DB  EM10,EM11,EM12,EM13,EM14
  2255.     DB  EM15
  2256.     PAGE
  2257. ;
  2258. ;   MISC BUT REQD CELLS
  2259. ;
  2260. CFTABA  DB  @0      ;CURRENT FILE TABLE POINTER
  2261. ISTATE  DB  0       ;INPUT STATE
  2262. OSTATE  DB  0       ;OUTPUT STATE
  2263. SVOUTS  DB  @0      ;SAVED OUT SWITCH
  2264. SVINS   DB  @0      ;SAVED IN SWITCH
  2265. CNFTBS  DB  0       ;CURRENT NO FILE TABLES
  2266. DFNFTB  DB  3       ;DEFAULT NO FILE TABLES
  2267. SVSTK   DB  0       ;SAVED STACK PTR
  2268. SVX DB  0       ;DSAVED X REG
  2269. SVY DB  0       ;SAVED XREG
  2270. LBUFD   DB  0       ;SAVED ACU
  2271. MONMOD  DB  0       ;LINE BUFF DISPL
  2272. MC  EQU $40     ;MONITOR MODE BITS
  2273. MI  EQU $20     ;MONITOR CMDS
  2274. MO  EQU $10     ;MONITOR OUTPUT
  2275. CMDNO   DB  $FF     ;COMMAND NO
  2276. SVBL    DB  0,0
  2277.  
  2278. SVCMD   DB  0
  2279. TEMP1A  DB  0
  2280. TEMP2A  DB  0
  2281. INOPTS  DB  0       ;INPUT OPTIONS
  2282. CUROPT              ;CURRENT OPTIONS
  2283. CV  DB  @@0     ;VOLUME
  2284. CD  DB  @@0     ;DRIVE
  2285. CS  DB  @@0     ;SLOT
  2286. CL  DB  @@1     ;RECORD LENGTH
  2287. CR  DB  @@0     ;RECORD NUMBER
  2288. CB  DB  @@0     ;RECORD BYTE
  2289. CA  DB  @@0     ;ADDRESS
  2290. IMBITS  DB  0
  2291. FNAME1  RMB 30      ;FILENAME 1
  2292. FNAME2  RMB 30      ;FILENAME 2
  2293. DFNFTS  DB  3       ;DEFAULT FILE TABLES = 3
  2294. CCHAR   DB  $84     ;CONTROL CHAR
  2295. ESTATE  DB  0       ;EXECUTE STATE
  2296. EFTABA  DB  0,0     ;EXECUTE FILE TABLE POINTER
  2297. ASIBSW  DB  0       ;APPLESOFT, IB SWITCH
  2298. FASB    DB11    "APPLESOFT"
  2299. FASBL   EQU *-FASB
  2300.     PAGE
  2301. ;
  2302. ;   DOS ADR TABLES (RELOCATED)
  2303. ;
  2304. SAT2
  2305. AIOB    DB  @@IOB       ;5-ADR IOB
  2306. AVTOC   DB  @@VTOC      ;6-ADR VTOC
  2307. AVOLDR  DB  @@VOLDIR        ;7-ADR VOLDIR
  2308. AEND    DB  @@EDOS      ;FEND OF DOS
  2309. ;
  2310. CMDVT   DB  @@GOODIO-1  ;0-NULL
  2311.     DB  @@FOPEN-1   ;1-OPEN FILE
  2312.     DB  @@FCLOSE-1  ;2-CLOSE FILE
  2313.     DB  @@FREAD-1   ;3-READ FILE
  2314.     DB  @@FWRITE-1  ;4-WRITE DATA
  2315.     DB  @@FDEL-1        ;5-DELETE FILE
  2316.     DB  @@FDIR-1        ;6-READ DIRECTORY
  2317.     DB  @@FLOCK-1   ;7-LOCK A FILE
  2318.     DB  @@FUNLCK-1  ;8-UNLOCK A FILE
  2319.     DB  @@FRNME-1   ;9-RENAME
  2320.     DB  @@FPOSTN-1  ;10-POSITION A FILE
  2321.     DB  @@FFMT-1        ;FORMAT
  2322.     DB  @@FVAR-1        ;VARIFY
  2323.     DB  @@GOODIO-1  ;11-SPARE
  2324. ;
  2325. RVT
  2326.     DB  @@GOODIO-1
  2327.     DB  @@RNXBYT-1  ;1-RD NEXT BYTE
  2328.     DB  @@RNXBLK-1  ;1-RD NEXT BLOCK
  2329.     DB  @@RSPBYT-1  ;2-RD SPECIFIC BYTE
  2330.     DB  @@RSPBLK-1  ;3-RD SPECIFIC BLOCK
  2331.     DB  @@GOODIO-1  ;4-SPARE
  2332. ;
  2333. WVT
  2334.     DB  @@GOODIO-1
  2335.     DB  @@WNXBYT-1  ;1-WR NEXT BYTE
  2336.     DB  @@WNXBLK-1  ;WR NEXT BLOCK
  2337.     DB  @@WSPBYT-1  ;2-WR SPECIFIC BYTE
  2338.     DB  @@WSPBLK-1  ;3-WR SPECIFIC BLOCK
  2339.     DB  @@GOODIO-1  ;4- SPARE
  2340. EAT2
  2341.     PAGE
  2342. ;
  2343. ;   DOSENT – DOS EXTERNAL ENTRY POINT
  2344. ;       EXIT PARM
  2345. ;               CARRY CLEAR = OPERATION
  2346. ;               CARRY SET = ERROR
  2347. ;
  2348. SC2
  2349. DOSENT
  2350.     TSX
  2351.     STX ENTSTK
  2352.     JSR CLCFCB      ;GO CALCULATE FCB
  2353.     LDA CCBREG      ;GET REQUEST
  2354.     CMP #CRGMAX     ;TTEST REQ RANGE
  2355.     BCS ERR2        ;BR OUT OF RANGE
  2356.     ASLA            ;REQ CODE *2
  2357.     TAX
  2358.     LDA CMDVT+1,X   ;PUSH ADR ONTO STACK
  2359.     PHA
  2360.     LDA CMDVT,X
  2361.     PHA
  2362. DENRTS  RTS
  2363. ERR2    JMP ERROR2
  2364.     PAGE
  2365. ;
  2366. ;   FOPEN – OPEN A FILE
  2367. ;
  2368. FOPEN
  2369.     JSR DOPEN
  2370.     JMP GOODIO
  2371. ;
  2372. DOPEN
  2373. ;
  2374.     JSR DCBSUP
  2375. ;
  2376. ;
  2377.     LDA #1
  2378.     STA DCBSDL+1
  2379.     LDX CCBRLN+1        ;MOVE RECORD LENGTH
  2380.     LDA CCBRLN
  2381.     BNE F02
  2382.     CPX #0
  2383.     BNE F02
  2384.     INX         ;SET RL=256
  2385. F02 STA DCBRCL
  2386.     STX DCBRCL+1
  2387. ;
  2388.     JSR FNDFIL      ;GO FIND FILE
  2389.     BCC F03     ;BR IF FOUND
  2390. ;               ;CREATE FILE
  2391.     LDA #0
  2392.     STA VDFILE+34,X
  2393.     LDA #1
  2394.     STA VDFILE+33,X
  2395.     STX TEMP1       ;SAVE VDIR INDEX
  2396.     JSR GETSEC      ;GO ALLOCATE SECTOR
  2397.     LDX TEMP1
  2398.     STA VDFILE+1,X  ;PUT SECTOR INTO VDIR
  2399.     STA DCBFDS      ;PUT SECTOR AS 1ST FILE DIR
  2400.     STA DCBCDS      ;PUT SECTOR AS CURRENT FILE DIR
  2401. ;  
  2402.     LDA DCBATK      ;GET ALLOCATED TRACK
  2403.     STA VDFILE,X        ;PUT INTO VDIR
  2404.     STA DCBFDT      ;AND AS 1ST FILE DIR
  2405.     STA DCBCDT      ;AND AS CURRENT FILE DIR
  2406. ;
  2407.     LDA CCBFUC      ;SET USE CODE
  2408.     STA VDFILE+2,X  ;INTO DIRECTORY
  2409. ;
  2410.     JSR WRVDIR      ;GO WRITE VOL DIRECTORY
  2411. ;
  2412.     JSR MVFCBD      ;MOVE FILE DIR ADR TO ZP
  2413.     JSR CLRSEC      ;GO CLEAR IT
  2414.     JSR WRFGO       ;GO WRITE FILE DIRECTORY DONE CREATION
  2415. ;
  2416.     LDX TEMP1       ;RE-GET INDEX
  2417.     LDA #CREFNF
  2418.     STA CCBSTA
  2419. ;
  2420. F03
  2421.     LDA VDFILE,X        ;MOVE FILE DIR TRACK
  2422.     STA DCBFDT
  2423.     LDA VDFILE+1,X  ;MOVE FILE DIR SECTOR
  2424.     STA DCBFDS
  2425.     LDA VDFILE+2,X  ;70VE FILE USE CODE
  2426.     STA CCBFUC
  2427.     STA DCBFUC
  2428.     LDA VDFILE+33,X
  2429.     STA DCBNSA
  2430.     LDA VDFILE+34,X
  2431.     STA DCBNSA+1
  2432.     STX DCBVDI      ;SAVE DIR INDEX
  2433. ;
  2434.     LDA #255        ;INDICATE NO SECTOR
  2435.     STA DCBCMS      ;IN MEMORY
  2436.     STA DCBCMS+1
  2437.     LDA VTDMS       ;MOVE MAX FD SECTS
  2438.     STA DCBDMS      ;TO DCB
  2439.     CLC
  2440.     JMP RDFDIR      ;READ 1ST DIRECTORY RECORD
  2441. ;
  2442. ;
  2443. ;
  2444. ;
  2445. DCBSUP
  2446.     LDA #0
  2447.     TAX
  2448. F01 STA FCBDCB,X        ;CLEAR DCB
  2449.     INX
  2450.     CPX #DCBLEN
  2451.     BNE F01
  2452. ;
  2453.     LDA CCBVOL      ;MOVE VOL
  2454.     EOR #$FF        ;INVERT VOL BITS
  2455.     STA DCBVOL
  2456.     LDA CCBDRV      ;MOVE DRIVE
  2457.     STA DCBDRV
  2458.     LDA CCBSLT      ;GET USER SPEC SLOT
  2459.     ASLA            ;SLOT*16
  2460.     ASLA
  2461.     ASLA
  2462.     ASLA
  2463.     TAX
  2464. F01A   
  2465.     STX DCBSLT
  2466.     LDA #17
  2467.     STA DCBVTN
  2468.     RTS
  2469.  
  2470.     PAGE
  2471. ;
  2472. ;   FCLOSE – CLOSE A FILE
  2473. ;
  2474. FCLOSE
  2475.     JSR WRSECT      ;WRITE OPEN SECTOR
  2476.     JSR WRFDIR      ;GO WRITE FILE DIRECTORY
  2477.     JSR FRETRK      ;FREE UNUSED SECTORS
  2478.     LDA #IBCWTS
  2479.     AND DCBWRF
  2480.     BEQ FC2
  2481. ;
  2482.     JSR RDVTOC      ;READ VTOC
  2483.     LDA #0
  2484.     CLC
  2485. FC1
  2486.     JSR RDVDIR      ;READ VDIR
  2487.     SEC
  2488.     DEC DCBVDR
  2489.     BNE FC1     ;BR IF NOT
  2490.     LDX DCBVDI      ;GET FILES INDEX
  2491.     LDA DCBNSA      ;MOVE NO SECTIONS ALLOCATED
  2492.     STA VDFILE+33,X
  2493.     LDA DCBNSA+1
  2494.     STA VDFILE+34,X
  2495.     JSR WRVDIR      ;WRITE VOL DIR REC
  2496. ;
  2497. ;
  2498. FC2
  2499.     JMP GOODIO      ;DONE
  2500.     PAGE
  2501. ;
  2502. ;   FRNME – RENAME A FILE
  2503. ;
  2504. FRNME
  2505.     JSR DOPEN       ;GO OPEN FILE
  2506.     LDA DCBFUC      ;GET USE CODE
  2507.     BMI ER10        ;BR IF LOCKED
  2508.     LDA CCBFN2      ;MOVE NEW FN
  2509.     STA ZPGFCB      ;PTR TO ZPG
  2510.     LDA CCBFN2+1
  2511.     STA ZPGFCB+1
  2512.     LDX TEMP1       ;GET VDIR INDEX
  2513.     JSR MVFN        ;GO MOVE FILE NAME
  2514.     JSR WRVDIR      ;GO WRITE FILE VDIR
  2515.     JMP GOODIO      ;DONE RENAME
  2516.     PAGE
  2517. ;
  2518. ;   FREAD – READ A FILE
  2519. ;
  2520. FREAD
  2521. ;
  2522.     LDA CCBRQM      ;GET REQ MOD
  2523.     CMP #CRMMAX     ;TEST LIMIT
  2524.     BCS ERR3A
  2525. ;
  2526.     ASLA            ;CODE*2
  2527.     TAX
  2528.     LDA RVT+1,X     ;GET READ ROUTINE
  2529.     PHA         ;VECTOR ADR
  2530.     LDA RVT,X
  2531.     PHA         ;AND
  2532.     RTS         ;GO TO IT
  2533. ;
  2534. ERR3A   JMP ERROR3
  2535. ER10    JMP ERRR10
  2536. ;
  2537. ;   FWRITE – WRITE A FILE
  2538. ;
  2539. FWRITE
  2540.     LDA DCBFUC      ;IS FILE LOCKED
  2541.     BMI ER10        ;BR IF LOCKED
  2542.     LDA CCBRQM      ;GET REQ MOD
  2543.     CMP #CRMMAX     ;IN RANGE
  2544.     BCS ERR3A       ;BR IF NOT IN RANGE
  2545. ;
  2546.     ASLA
  2547.     TAX
  2548.     LDA WVT+1,X     ;GET ROUTINE ADR
  2549.     PHA
  2550.     LDA WVT,X
  2551.     PHA
  2552.     RTS         ;AND GO TO IT
  2553.     PAGE
  2554. ;
  2555. ;   RSPBYT – READ A SPECIFIC BYTE
  2556. ;
  2557. RSPBYT
  2558.     JSR LOCSEC      ;GO GET REQD REL SECTOR
  2559. ;
  2560. ;   RNXBYT – READ NEXT BYTE
  2561. ;
  2562. RNXBYT  JSR GETBYT      ;GO GET BYTE
  2563.     STA CCBDAT      ;PUT IN CCB
  2564.     JMP GOODIO      ;DONE
  2565. ;
  2566. ;   RSPBLK – READ SPECIFIC BLOCK
  2567. ;
  2568. RSPBLK  JSR LOCSEC      ;GO LOCATE REL SECTOR
  2569. ;
  2570. ;   RNXBLK – READ NEXT BLOCK
  2571. ;
  2572. RNXBLK
  2573.     JSR DTBLN       ;GO DECR LEN (NOT RTN IF=0)
  2574.     JSR GETBYT      ;GO GET BYTE
  2575.     PHA
  2576.     JSR MIBDA       ;GO MOVE BLOCK ADR AND INCR
  2577.     LDY #0
  2578.     PLA
  2579.     STA (ZPGFCB),Y  ;SET DATA BYTE
  2580.     JMP RNXBLK      ;GO FOR NEXT BYTE
  2581. ;
  2582. ;   GETBYT – GET A DATA BYTE
  2583. ;
  2584. GETBYT
  2585.     JSR LOCNXB      ;LOCATE NEXT BYTE
  2586.     BCS EOFIN       ;BR IF EOF
  2587.     LDA (ZPGFCB),Y  ;BR IF EOF
  2588.     PHA         ;SAVE IT
  2589.     JSR INCRRB      ;INCR REC BYTE
  2590.     JSR INCSCB      ;INCR SAVED BYTE
  2591.     PLA         ;GET SAVED BYTE
  2592.     RTS         ;RETURN
  2593. ;
  2594. EOFIN   JMP ERROR5      ;GO TO EOF RTN
  2595.     PAGE
  2596. ;
  2597. ;   WSPBYT – WRITE SPECIFIC BYTE
  2598. ;
  2599. WSPBYT
  2600.     JSR LOCSEC      ;GO LOCATE SECTOR
  2601. ;
  2602. ;   WNXBYT – WRITE NEXT BYTE
  2603. ;
  2604. WNXBYT
  2605.     LDA CCBDAT      ;GET THE BYTE
  2606.     JSR PUTBYT      ;GO WRITE BYTE
  2607.     JMP GOODIO      ;DONE
  2608. ;
  2609. ;   WSPBLK – WRITE NEXT BLOCK
  2610. ;
  2611. WSPBLK
  2612.  
  2613.     JSR LOCSEC      ;GO LOCATE SECTOR
  2614. ;
  2615. ;   WNXBLK – WRITE BLOCK
  2616. ;
  2617. WNXBLK
  2618.     JSR MIBDA       ;GO MOVE ADR TO ZPG AND DEC
  2619.     LDY #0
  2620.     LDA (ZPGFCB),Y  ;GET DATA BYTE
  2621.     JSR PUTBYT      ;GO PUT IT
  2622.     JSR DTBLN       ;GO DEC BLK LEN (NOT RTN IF = 0)
  2623.     JMP WNXBLK
  2624. ;
  2625. ;   PUTBYT – PUT OUT ONE BYTE
  2626. ;
  2627. PUTBYT
  2628.     PHA         ;SAVE DATA BYTE
  2629.     JSR LOCNXB      ;GO LOCATE NEXT BYTE
  2630. ;
  2631. PB0 PLA         ;GO SAVED BYTE
  2632.     STA (ZPGFCB),Y  ;PUT THE BYTE
  2633.     LDA #$40        ;SET WRITE SECTOR REQD
  2634.     ORA DCBWRF
  2635.     STA     DCBWRF
  2636. ;
  2637.     JSR INCRRB      ;INCR REL REC BYTE
  2638.     JMP INCSCB      ;INCR SECTOR BYTE
  2639.     PAGE
  2640. ;
  2641. ;   FLOCK – LOCK A FILE
  2642. ;
  2643. FUNLOCK LDA #$80        ;REMEMBER LOCK
  2644.     STA TEMP3
  2645.     BNE LCKGO
  2646. ;
  2647. ;   FUNLCK – UNLOCK A FILE
  2648. ;
  2649. FUNLCK  LDA #00     ;REMEMBER UNLOCK
  2650.     STA TEMP3
  2651. ;
  2652. LCKGO
  2653. ;
  2654.     JSR DOPEN       ;GO OPEN FILE
  2655.     LDX TEMP1
  2656.     LDA VDFILE+2,X  ;GET FILE USE CODE
  2657.     AND #$7F        ;TURN OFF LOCK
  2658.     ORA TEMP3
  2659.     STA VDFILE+2,X
  2660.     JSR WRVDIR
  2661.     JMP GOODIO
  2662. ;
  2663. ;   FPOSTN – POSITION A FILE
  2664. FPOSTN  JSR LOCSEC      ;GO POSITION
  2665.     JMP GOODIO      ;DONE
  2666. ;
  2667. ;
  2668. ;   FVAR – VARIFY A FILE
  2669. ;
  2670. FVAR
  2671.     JSR DOPEN       ;OPEN FILE
  2672. VAR1    JSR LOCNXB      ;READ A SECTOR
  2673.     BCS VAR2        ;BR IF EOF
  2674.     INC DCBCRS      ;INCREMENT SECTOR
  2675.     BNE VAR1
  2676.     INC DCBCRS+1
  2677.     JMP VAR1        ;READ THIS ONE
  2678. VAR2    JMP GOODIO      ;DONE  
  2679.     PAGE
  2680. ;
  2681. ;   FDEL – DELETE A FILE
  2682. ;
  2683. FDEL
  2684.     JSR DOPEN       ;GO OPEN FILE
  2685. ;
  2686. FD2 LDX TEMP1       ;SAVED INDEX
  2687.     LDA VDFILE+2,X  ;IS FILE LOCKED
  2688.     BPL FD3     ;BR NOT LOCKED
  2689.     JMP ERRR10
  2690. ;
  2691. FD3
  2692.     LDX TEMP1       ;GET SAVED INDEX
  2693.     LDA VDFILE,X        ;GET DIR TRACK
  2694.     STA DCBFDT      ;SET AS 1ST FD TRACK
  2695.     STA VDFILE+32,X ;SAVE IN LC OF FN
  2696.     LDA #$FF        ;DELETED FILE MARKER
  2697.     STA VDFILE,X        ;CLEAR ENTRY
  2698.     LDY VDFILE+1,X  ;GET DIR SECTOR
  2699.     STY DCBFDS      ;SET AS 1ST FD SEC
  2700.     JSR WRVDIR      ;GO WRITE VOLUME DIR
  2701.     CLC
  2702. FD4 JSR RDFDIR      ;GET 1ST FILE DIR SECTOR
  2703.     BCS FD7     ;BR IF NO MORE
  2704.     JSR MVFCBD      ;MOVE DIR TO ZPG
  2705.     LDY #FDENT      ;POINT Y TO 1ST SEC ENT
  2706. FD5 STY TEMP1       ;SAVE Y
  2707.     LDA (ZPGFCB),Y  ;GET REACK
  2708.     BMI FD6     ;BR IF DONE
  2709.     BEQ FD6     ;BR IF END OF FILE
  2710.     PHA         ;SAVE TRK
  2711.     INY
  2712.     LDA (ZPGFCB),Y  ;GET SECTOR
  2713.     TAY         ;TO Y
  2714.     PLA         ;GET TRK
  2715.     JSR FDSUB       ;GO FREE SECTOR
  2716. FD6 LDY TEMP1       ;GET DIR INDEX
  2717.     INY         ;INCR TO NEXT ENTRY
  2718.     INY
  2719.     BNE FD5     ;BR NOT DONE THIS DIR
  2720.     LDA DCBCDT      ;GET THIS DIR TRK
  2721.     LDY DCBCDS      ;AND SECTOR
  2722.     JSR FDSUB       ;AND GO FREE IT
  2723.     SEC         ;GO
  2724.     BCS FD4     ;READ NEXT DIR
  2725. FD7
  2726.     JSR WRVTOC
  2727.     JMP GOODIO
  2728. ;
  2729. FDSUB
  2730.     SEC         ;SET FOR RE USE OF SEC
  2731.     JSR FRESEC      ;GO FREE SECTOR
  2732.     LDA #0      ;CLEAR DCB BIT MAP
  2733.     LDX #3
  2734. FDS1    STA DCBALS,X
  2735.     DEX
  2736.     BPL FDS1
  2737.     RTS
  2738.     PAGE
  2739. ;
  2740. ;   RDIR – PRINT DIRECTORY
  2741. ;
  2742. RDIR
  2743.     JSR DCBSUP
  2744.     LDA #$FF
  2745.     STA DCBVOL
  2746.     JSR RDVTOC
  2747.     LDA #22     ;SET 21 LINES
  2748.     STA TEMP2
  2749.     JSR PRCR        ;GO PRINT
  2750.     JSR PRCR        ;PRINT ANOTHER CHAR
  2751.     LDX #VML        ;VOLUME MSG LENGTH
  2752. RDO LDA VOLMES,X        ;GET MSG CHAR
  2753.     JSR PRINT       ;PRINT IT
  2754.     DEX         ;DECREMENT COUNT
  2755.     BPL RDO     ;BR IF MORE
  2756. ;
  2757.     STX CNUM+1 
  2758.     LDA IBSMOD      ;MOVE VOL NO FOR
  2759.     STA CNUM        ;CONVERSION
  2760.     JSR PRNUM       ;GO PRINT VOL NO
  2761. ;
  2762.     JSR PRCR        ;PRINT CR
  2763.     JSR PRCR        ;AND AGAIN
  2764. ;
  2765.     CLC         ;FIRST RECORD
  2766. ;
  2767. RD1 JSR RDVDIR      ;GO READ REC
  2768.     BCS RD5
  2769.     LDX #0      ;SET INDEX=0
  2770. RD2 STX TEMP1       ;SAVE INDEX
  2771.     LDA VDFILE,X        ;GET TRACK
  2772.     BEQ RD5     ;BR IF END OF DIR
  2773.     BMI RD4     ;BR IF DELETED
  2774. ;
  2775.     LDY #$A0        ;BLANK
  2776.     LDA VDFILE+2,X  ;GET TYPE
  2777.     BPL RD2A        ;BR IF NOT LOCKED
  2778.     LDY #’*+$80       ;AST
  2779. RD2A    TYA         ;ACU = AST OR BLANK
  2780.     JSR PRINT       ;PRINT ACU
  2781. ;
  2782.     LDA VDFILE+2,X  ;GET TYPE
  2783.     AND #$07        ;MASK OUT MISC
  2784.     LDY #3      ;SET INDEX = 3
  2785. RD2B    LSRA            ;SHIFT OUT LSB
  2786.     BCS RD2C        ;BR IF TYPE BIT OUT
  2787.     DEY         ;DEC INDEX
  2788.     BNE RD2B        ;BR IF NOT ACC BITS
  2789. RD2C
  2790.     LDA FTTAB,Y     ;GET TYPE CODE
  2791.     JSR PRINT       ;PRINT IT
  2792.     LDA #$A0        ;BLANK
  2793.     JSR PRINT       ;PRINT
  2794. ;
  2795.     LDA VDFILE+33,X ;MOVE FILE LENGTH
  2796.     STA CNUM        ;TO CNUM
  2797.     LDA VDFILE+34,X
  2798.     STA CNUM+1
  2799.     JSR PRNUM       ;GO PRINT NUMBER
  2800.     LDA #$A0        ;BLANK
  2801.     JSR PRINT       ;PRINT
  2802. ;
  2803.     INX
  2804.     INX
  2805.     INX
  2806.     LDY #29
  2807. RD3 LDA VDFILE,X        ;GET CHAR
  2808.     JSR PRINT       ;PRINT CHAR
  2809.     INX
  2810.     DEY
  2811.     BPL RD3
  2812. RD3A
  2813.     JSR PRCR        ;GO PRINT CR
  2814. RD4 JSR VDINC       ;INCR INDEX
  2815.     BCC RD2     ;BR IF MORE IN DIR
  2816.     BCS RD1     ;GO READ NEXT DIR SECT
  2817. ;
  2818. RD5 JMP GOODIO      ;DONE
  2819. ;
  2820. PRCR
  2821.     LDA #$8D        ;CR
  2822.     JSR PRINT       ;PRINTED
  2823.     DEC TEMP2       ;DEC LINE COUNTER
  2824.     BNE PRCR1       ;BR IF NOT ZERO
  2825.     JSR GETKEY      ;WAIT FOR INPUT
  2826.     LDA #21     ;RESET LINE COUNTER
  2827.     STA TEMP2
  2828. PRCR1   RTS         ;DONE
  2829.     PAGE
  2830. PRNUM
  2831.     LDY #2      ;3 DIGITS
  2832. PRN1    LDA #0      ;INIT DIGIT TO ZERO
  2833.     PHA         ;SAVE IT
  2834. ;
  2835. PRN2    LDA CNUM        ;GET NUMBER
  2836.     CMP CVTAB,Y     ;IF NUM < CVTAB ENTRY
  2837.     BCC PRN3        ;THEN DONE THIS DIGIT
  2838. ;
  2839.     SBC CVTAB,Y     ;SUBTRACT TABLE ENTRY
  2840.     STA CNUM        ;FROM NUM
  2841.     LDA CNUM+1
  2842.     SBC #0
  2843.     STA CNUM+1
  2844.     PLA         ;INCREMENT DIGIT
  2845.     ADC #0
  2846.     PHA
  2847.     JMP PRN2        ;TRY AGAIN
  2848. ;
  2849. PRN3
  2850.     PLA         ;GET DIGIT
  2851.     ORA #$B0        ;ADD ASCII
  2852.     JSR PRINT       ;PRINT IT
  2853.     DEY         ;DECREMENT DIGIT COUNT
  2854.     BPL PRN1        ;BR IF MORE DIGIT
  2855. ;
  2856.     RTS         ;DONE
  2857.     PAGE
  2858. ;
  2859. ;   CLCFCB – GET FCB VIA INDEX AND MOVE IT
  2860. ;
  2861. CLCFCB
  2862. ;
  2863.     JSR MVFCBP      ;MOVE FCB PTR TO ZPG
  2864.     LDY #0
  2865.     STY CCBSTA
  2866. CF3 LDA (ZPGFCB),Y  ;MOVE FCB TO
  2867.     STA FCB,Y       ;FCB WORK AREA
  2868.     INY
  2869.     CPY #FCBLEN
  2870.     BNE CF3
  2871. ;
  2872.     CLC         ;DONE
  2873.     RTS
  2874. ;
  2875. ;   RTNFCB – MOVE FCB FROM WORK AREA TO FCB
  2876. ;
  2877. RTNFCB
  2878.     JSR MVFCBP      ;MOVE FCB ADR TO ZPG
  2879. ;
  2880.     LDY #0
  2881. RF1 LDA FCB,Y
  2882.     STA (ZPGFCB),Y
  2883.     INY
  2884.     CPY #FCBLEN
  2885.     BNE RF1
  2886.     RTS
  2887.     PAGE
  2888. ;
  2889. ;   FFMT – EXECUTE FORMAT REQUEST
  2890. ;
  2891. FFMT
  2892.     JSR DCBSUP      ;SET UP DCB
  2893.     LDA #IBFMT
  2894.     JSR DCBIO2
  2895.     LDA DCBVOL      ;SET VOL NO
  2896.     EOR #$FF
  2897.     STA VVOLNO
  2898.     LDA #17
  2899.     STA VALCA1      ;ALOCATE BYTE 1
  2900.     LDA #1
  2901.     STA VALCA2      ;ADD BYTE 2
  2902. ;
  2903.     LDX #VSECAL-VTOC
  2904.     LDA #0
  2905. NT1 STA VTOC,X      ;CLEAR SECTOR AREA
  2906.     INX
  2907.     BNE NT1
  2908. ;
  2909.     LDX #3*4        ;START AT TRACK 3
  2910. NT2 CPX #35*4       ;END AT TRACK 35
  2911.     BEQ NT4
  2912.     LDY #3      ;4 BYTES OF INFO
  2913. NT3 LDA ALC10S,Y        ;10 SECTORS ALLOCATE
  2914.     STA VSECAL,X
  2915.     INX
  2916.     DEY
  2917.     BPL NT3
  2918.     CPX #17*4       ;AT TRACK 17
  2919.     BNE NT2     ;BR IF NOT
  2920.     LDX #18*4       ;SKIP TO 18
  2921.     BNE NT2
  2922. ;
  2923. NT4 JSR WRVTOC      ;WRITE NEW VTOC
  2924. ;
  2925.     LDX #0
  2926.     TXA
  2927. NT5 STA VOLDIR,X        ;CLEAR VOLDIR
  2928.     INX
  2929.     BNE NT5
  2930. ;
  2931.     JSR MVVDBA      ;MOVE BUF PTRS
  2932. ;
  2933.     LDA #17     ;TRACK 17
  2934.     LDY VNOSEC
  2935.     DEY
  2936.     DEY
  2937.     STA IBTRK       ;INTO IOB
  2938. NT6 STA VDLTRK      ;INTO LINK
  2939. NT7 STY VDLSEC
  2940.     INY
  2941.     STY IBSECT
  2942.     LDA #IBCWTS
  2943.     JSR DCBIO2
  2944.     LDY VDLSEC
  2945.     DEY         ;DECREMENT SECTOR
  2946.     BMI NT8     ;BR LAST WRITTEN
  2947.     BNE NT7     ;BR NOT LAST
  2948.     TYA         ;LAST, SET LINK TRK=0
  2949.     BEQ NT6
  2950. ;
  2951. NT8
  2952.     JSR DLDSUP      ;GO SET UP FOR DOSLDR
  2953.     JSR WBOOT       ;GO WRITE THE BOOT
  2954.     JMP GOODIO      ;DONE
  2955.     PAGE
  2956. ;
  2957. ;   DLDSUP – SET UP FOR DOSLDR
  2958. ;
  2959. DLDSUP
  2960.     LDA CCBBSA
  2961.     STA IBBUFP+1        ;START ADR
  2962.     LDA #0
  2963.     STA IBBUFP
  2964.     LDA DCBVOL      ;VOL
  2965.     EOR #$FF
  2966.     STA IBVOL
  2967.     RTS
  2968.     PAGE
  2969. ;
  2970. ;   MVFCBX – MOVE FCB ADRS TO ZPGFCB
  2971. ;
  2972. MVFCBP  LDX #0      ;MOVE FCB ADR
  2973.     BEQ MVF1
  2974. MVFCBD  LDX #2      ;MOVE FCB DIR BUFF
  2975.     BNE MVF1       
  2976. MVFCBS  LDX #4      ;MOVE FCB SECTOR BUFF
  2977. ;
  2978. MVF1
  2979.     LDA CFCBAD,X        ;DO THE MOVE
  2980.     STA ZPGFCB
  2981.     LDA CFCBAD+1,X
  2982.     STA ZPGFCB+1
  2983.     RTS
  2984. ;
  2985. ;   CLRSEC – CLEAR SECTOR
  2986. ;
  2987. CLSEC
  2988.     LDA #0
  2989.     TAY
  2990. CS1 STA (ZPGFCB),Y
  2991.     INY
  2992.     BNE CS1
  2993.     RTS
  2994.     PAGE
  2995. ;
  2996. ;   WRSECT – WRITE CURRENT SECTOR IF REQD
  2997. ;
  2998. WRSECT
  2999.     BIT DCBWRF      ;GET WRITE REQD FLAG
  3000.     BVS WRSGO       ;BR IF WRITE SECTOR REQD
  3001.     RTS         ;RTS
  3002. ;
  3003. WRSGO
  3004.     JSR MVSBA       ;GO MOVE SECT BUFF ADR
  3005. ;
  3006.     LDA #IBCWTS     ;GET COMMAND
  3007.     JSR DCBIO       ;GO FILL IN IOB AND DO IO
  3008. ;
  3009.     LDA #$BF        ;SET WRITE SECTOR REQD BIT OFF
  3010.     AND DCBWRF
  3011.     STA DCBWRF
  3012.     RTS         ;DONE
  3013.     PAGE
  3014. ;
  3015. ;   WRFDIR – WRITE FILE DIRECTORY IF REQD
  3016. ;
  3017. WRFDIR
  3018.     LDA DCBWRF      ;GET WRITE REQD FLAG
  3019.     BMI WRFDGO      ;BR IF WRITE DIR REQD
  3020.     RTS         ;DONE IF NOT
  3021. ;
  3022. WRFDGO
  3023.     JSR MVFDBA
  3024. ;
  3025.     LDA #IBCWTS     ;GET WRITE CMD
  3026.     JSR DCBIO       ;GO FILL IN IOB AND DO I/O
  3027. ;
  3028.     LDA #$7F        ;TURN WRITE DIR REQD BIT OFF
  3029.     AND DCBWRF
  3030.     STA DCBWRF
  3031.     RTS         ;DONE
  3032. ;
  3033. ;   MVFDBA – MOVE FILE DIRECTORY BUFF ASDR TO IOD
  3034. ;
  3035. MVFDBA
  3036.     LDA CFCBDR      ;MOVE ADR
  3037.     STA IBBUFP
  3038.     LDA CFCBDR+1
  3039.     STA IBBUFP+1
  3040.     LDX DCBCDT      ;GET TRACK
  3041.     LDY DCBCDS      ;GET SECTOR
  3042.     RTS
  3043.     PAGE
  3044. ;
  3045. ;   RDFDIR – READ FILE DIRECTORY
  3046. ;
  3047. RDFDIR
  3048.     PHP         ;SAVE STATUS
  3049.     JSR WRFDIR      ;GO WRITE CURRENT DIR IF REQD
  3050.     JSR MVFDBA      ;GO MOVE DBUFF ADR TO ZPG
  3051.     JSR MVFCBD      ;MOVE DBUFF ADR TO ZPG
  3052.     PLP         ;GET SAVED STATUS
  3053.     BCS RFDNXT      ;BR IF RD NEXT
  3054. ;
  3055.     LDX DCBFDT      ;TRACK
  3056.     LDY DCBFDS      ;SECTOR
  3057.     JMP RFDIO1      ;GO READ
  3058. ;
  3059. RFDNXT
  3060.     LDY #FDLTRK     ;GET LINK TRACK
  3061.     LDA (ZPGFCB),Y
  3062.     BEQ RFDNL       ;NR NO LINK
  3063.     TAX         ;PUT TRACK INTO X
  3064.     INY
  3065.     LDA (ZPGFCB),Y  ;SET LINK SECTOR
  3066.     TAY         ;PUT SECTOR INTO Y
  3067.     JMP RFDIO1      ;GO DO I/O
  3068. ;
  3069. RFDNL
  3070.     LDA CCBREG      ;THIS A WRITE
  3071.     CMP #CRQWR
  3072.     BEQ RFDNL1      ;BR IF WRITE
  3073.     SEC         ;SET EOF
  3074.     RTS         ;RETURN
  3075. ;
  3076. RFDNL1
  3077.     JSR GETSEC      ;GET A SECTOR
  3078.     LDY #FDLSEC
  3079.     STA (ZPGFCB),Y  ;PUT IN LINK
  3080.     PHA         ;SAVE SECTOR
  3081.     DEY
  3082.     LDA DCBATK      ;GET TRACK
  3083.     STA (ZPGFCB),Y  ;PUT IN LINK
  3084.     PHA         ;SAVE TRACK
  3085.     JSR WRFDGO      ;GO WRITE OLD DIR DEC
  3086. ;
  3087.     JSR CLRSEC      ;CLEAN OUT DIR
  3088.     LDY #FDFRS      ;SET NEW DIR SEC 1ST REL
  3089.     LDA DCBDNF      ;FILE SECTOR
  3090.     STA (ZPGFCB),Y
  3091.     INY
  3092.     LDA DCBDNF+1
  3093.     STA (ZPGFCB),Y
  3094. ;
  3095.     PLA         ;GET SAVED TRACK
  3096.     TAX         ;INTO X
  3097.     PLA         ;GET SAVED SECTOR
  3098.     TAY         ;INTO Y
  3099.     LDA #IBCWTS     ;SET WRITE CMD
  3100.     BNE RFDIO2      ;GO DO I/O
  3101. ;
  3102. RFDIO1  LDA #IBCRTS     ;SET READ CMD
  3103. RFDIO2  STX DCBCDT      ;SET CURR TRACK
  3104.     STY DCBCDS      ;SET CURR SECTOR
  3105.     JSR DCBIO       ;GO I/O
  3106. ;
  3107. RDFDC   LDY #FDFRS      ;GET POINTER TO FIRST RE SECTOR
  3108.     LDA (ZPGFCB),Y  ;GET FRS
  3109.     STA DCBDFS      ;SET INTO DCB
  3110.     CLC
  3111.     ADC DCBDMS      ;ADD MAX SECTORS
  3112.     STA     DCBDNF      ;PUT INTO DCB
  3113. ;
  3114.     INY         ;DO SAME FOR HI BYTE
  3115.     LDA (ZPGFCB),Y
  3116.     STA DCBDFS+1
  3117.     ADC DCBDMS+1
  3118.     STA DCBDNF+1
  3119. ;
  3120.     CLC
  3121.     RTS         ;DONE
  3122.     PAGE
  3123. ;
  3124. ;   RDSECT – READ A SECTOR
  3125. ;
  3126. RDSECT
  3127.     JSR MVSBA       ;GO MOVE SECTOR BUFFER ADR
  3128. ;
  3129.     LDA #IBCRTS
  3130.     JMP DCBIO       ;GO DO I/O
  3131. ;
  3132. ;   MVSBA – MOVE SECTOR BUFFER ADR FOR I/O
  3133. ;
  3134. MVSBA
  3135.     LDY CFCBSB      ;GET SECTOR BUFF ADR
  3136.     LDA CFCBSB+1   
  3137. MSB1    STY IBBUFP      ;SET IOB SECTOR
  3138.     STA IBBUFP+1        ;BUFF PTR
  3139.     LDX DCBTRK      ;GET TRACK
  3140.     LDY DCBSEC      ;GET SECTOR
  3141.     RTS         ;RTN
  3142.     PAGE
  3143. ;
  3144. ;   RDVTOC – READ VTOC
  3145. ;   WRVTOC – WRITE VTOC
  3146. ;
  3147. RDVTOC
  3148.     LDA #IBCRTS     ;READ
  3149.     BNE VTIO
  3150. WRVTOC
  3151.     LDA #IBCWTS     ;WRITE
  3152. ;
  3153. VTIO    LDY AVTOC       ;MOVE BUFF ADR
  3154.     STY IBBUFP
  3155.     LDY AVTOC+1
  3156.     STY IBBUFP+1
  3157. ;
  3158.     LDX DCBVTN      ;GET TRACK
  3159.     LDY #0
  3160.     JMP DCBIO       ;GO DO I/O
  3161.     PAGE
  3162. ;
  3163. ;   RDVIR – READ VOLUME DIRECTOR
  3164. ;
  3165. RCVIR
  3166.     PHP         ;SAVES STATUS
  3167.     JSR MVVDBA
  3168. ;
  3169.     PLP         ;GET STATUS
  3170.     BCS RVDA        ;BR IF R0 NEXT
  3171. ;
  3172. RVDC    LDY VDIRSC      ;GET LINK SECTOR
  3173.     LDX VDIRTK      ;GET FIRST TRK
  3174.     BNE RVDGO       ;GO READ
  3175. ;
  3176. RVDA
  3177.     LDX VDLTRK      ;GET SECTOR
  3178.     BNE RDVC        ;BR IF A LINK
  3179.     SEC         ;SET END OF DIR
  3180.     RTS
  3181. ;
  3182. RDVC    LDY VDLSEC      ;GET SECTOR
  3183. RVDGO
  3184.     STX CVDTRK      ;SET CUR TRACK
  3185.     STY CVDSEC      ;SET CUR SECTOR
  3186.     LDA #IBCRTS     ;GET CMD
  3187.     JSR DCBIO       ;GO DO I/O
  3188.     CLC
  3189.     RTS
  3190.     PAGE
  3191. ;
  3192. ;   WRVDIR – WRITE VOLUME DIRECTORY SECTOR
  3193. ;
  3194. WRVDIR
  3195.     JSR MVVDBA
  3196. ;
  3197.     LDX CVDTRK      ;CURRENT TRACK
  3198.     LDY CVDSEC      ;CURRENT SECTOR
  3199.     LDA #IBCWTS     ;WRITE COMMAND
  3200.     JMP DCBIO       ;GO DO I/O
  3201. ;
  3202. ;   MVVDBA – MOVE VOL DIR BUF ADR TO IOB
  3203. ;
  3204. MVVDBA
  3205.     LDA AVOLDR      ;MOVE ADR
  3206.     STA IBBUFP
  3207.     LDA AVOLDR+1
  3208.     STA IBBUFP+1
  3209.     RTS
  3210.     PAGE
  3211. ;
  3212. ;   DCBIO – DO I/O FOR A DCB
  3213. ;
  3214. DCBIO
  3215.     STX IBTRK       ;TRACK
  3216.     STY IBSECT      ;SECTOR
  3217. DCBIO2
  3218.     STA IBCMD       ;COMMAND
  3219.     CMP #IBCWTS
  3220.     BNE DCBIO1
  3221.     ORA DCBWRF
  3222.     STA DCBWRF
  3223. DCBIO1
  3224.     LDA DCBVOL      ;VOL
  3225.     EOR #$FF        ;UNINVERT VOL BITS
  3226.     STA IBVOL
  3227.     LDA DCBSLT      ;SLOT
  3228.     STA IBSLOT
  3229.     LDA DCBDRV      ;DRIVE
  3230.     STA IBDRVN
  3231.     LDA DCBSDL      ;LENGTH
  3232.     STA IBDLEN
  3233.     LDA DCBSDL+1
  3234.     STA IBDLEN+1
  3235.     LDA #1      ;IOB TYPE
  3236.     STA IBTYPE
  3237. ;
  3238.     LDY AIOB        ;IOB ADR
  3239.     LDA AIOB+1
  3240.     JSR DISKIO      ;GO DO I/O
  3241. ;
  3242.     LDA IBSMOD
  3243.     STA CCBVOL
  3244.     LDA #$FF        ;RESET VOL
  3245.     STA IBVOL
  3246.     BCS BADIO       ;BR IF BAD
  3247.     RTS         ;RTN IF GOOD
  3248. ;
  3249. BADIO   LDA IBSTAT      ;GET STATUS
  3250.     LDY #CREVMM
  3251.     CMP #IBVMME     ;WAS IT VOLUME MISMATCH
  3252.     BEQ BD2     ;BR IF YES
  3253.     LDY #CREPRO
  3254.     CMP #IBWPER
  3255.     BEQ BD2
  3256.     LDY #CREIOE
  3257. BD2 TYA
  3258.     JMP ERRORB      ;GO RTN
  3259.     PAGE
  3260. ;
  3261. ;   LOCNXB – LOCATE NEXT BYTE
  3262. ;
  3263. LOCNXB
  3264.     LDA DCBCRS      ;IS THE CURRENT RELATIVE SECTOR
  3265.     CMP DCBCMS      ;EQUAL TO THE CURRENT MEM SECTOR
  3266.     BNE LNB1        ;BR IF NOT EQ
  3267.     LDA DCBCRS+1
  3268.     CMP DCBCMS+1
  3269.     BEQ LNB8        ;BR IF REQD SECTOR IN MEM
  3270. ;
  3271. LNB1                ;NEED A DIFFERENT SECTOR IN MEM
  3272.     JSR WRSECT      ;GO WRITE SECTOR(IF REQD)
  3273. ;
  3274. LNB2    LDA DCBCRS+1        ;IS CURRENT REL SECTORY
  3275.     CMP DCBDFS+1        ;IS CURRENT DIRECTORY (LOW LIMIT)
  3276.     BCC LNB4        ;BR IF IN A PREVIOUS DIR
  3277.     BNE LNB3        ;BR IF MAYBE IN THIS ONE
  3278.     LDA DCBCRS      ;TEST LOW BYTES
  3279.     CMP DCBDFS
  3280.     BCC LNB4        ;BR IF IN PREVIOUS DIR
  3281. ;
  3282. LNB3    LDA DCBCRS+1        ;IS CURRENT REL SECTOR
  3283.     CMP DCBDNF+1        ;IN CURRENT DIRECTOR (HI LIMIT)
  3284.     BCC LNB6        ;BR IF IN THIS ONE
  3285.     BNE LNB4        ;BR IF IN A NEXT DIR
  3286.     LDA DCBCRS
  3287.     CMP DCBDNF
  3288.     BCC LNB6        ;BR IF IN THIS ONE
  3289. ;               ;REQD SECTOR IN A NEXT DIRECTORY
  3290. LNB4    JSR RDFDIR      ;GO READ NEXT FILE DIR
  3291.     BCC LNB2        ;BR NXT AVAIL
  3292.     RTS         ;RETURN IF EOF DIR
  3293. ;
  3294. ;
  3295. LNB6
  3296.     SEC         ;CALCULATE DISPL INTO DIR
  3297.     LDA DCBCRS      ;REQD REL SECTOR MINUS
  3298.     SBC DCBDFS
  3299.     ASLA            ;TIMES 2
  3300.     ADC #FDENT      ;PLUS DISPL TO 1ST
  3301.     TAY
  3302.     JSR MVFCBD      ;MOVE ADR TO ZPG
  3303.     LDA (ZPGFCB),Y  ;GET TRACK
  3304.     BNE LNB7        ;BR IF NOT ZERO
  3305.     LDA CCBREQ
  3306.     CMP #CRQWR      ;WRITE
  3307.     BEQ LNB7A
  3308.     SEC
  3309.     RTS
  3310. LNB7A   JSR GNWSEC      ;GO GET A NEW SECTOR
  3311.     JMP LNBCON
  3312. LNB7    STA DCBTRK      ;SET TRK INTO DCB
  3313.     INY
  3314.     LDA (ZPGFCB),Y  ;GET SECTOR
  3315.     STA DCBSEC      ;PUT INTO DCB
  3316.     JSR RDSECT      ;GO READ SECTOR
  3317. LNBCON  LDA DCBCRS      ;MOVE CUR REL SECTOR
  3318.     STA DCBCMS
  3319.     LDA DCBCRS+1        ;TO CUR MEM SECTOR
  3320.     STA DCBCMS+1
  3321. ;
  3322. LNB8
  3323.     JSR MVFCBS      ;MOVE SECTOR BUFF ADR TO ZP
  3324.     LDY DCBCSB      ;GET SECT BYTE
  3325.     CLC         ;CARRY CLEAR = ALL OK
  3326.     RTS         ;DONE
  3327.     PAGE
  3328. ;
  3329. ;
  3330. GNWSEC              ;NEED NEW SECTOR
  3331.     STY TEMP2       ;SAVE DIR INDEX
  3332.     JSR GETSEC      ;GET A SECTOR
  3333.     LDY TEMP2
  3334.     INY
  3335.     STA (ZPGFCB),Y  ;SET NEW TRACK
  3336.     STA DCBSEC
  3337.     DEY
  3338.     LDA DCBATK
  3339.     STA (ZPGFCB),Y  ;SET NEW TRACK
  3340.     STA DCBTRK
  3341. ;
  3342.     JSR MVFCBS
  3343.     JSR CLRSEC      ;GO CLEAR SECTOR
  3344. ;
  3345. ;
  3346.     LDA #$C0        ;INDICATE BOTH
  3347.     ORA DCBWRF      ;DIR AND SECTOR
  3348.     STA DCBWRF      ;MUST BE WRITTEN
  3349.     RTS         ;DONE
  3350.     PAGE
  3351. ;
  3352. ;   INCRRB – INCREMENT RELATIVE RECORD BYTE
  3353. ;
  3354. INCRRB
  3355.     LDX DCBCRR      ;MOVE BYTE JUST READ OR WRITTEN
  3356.     STX CCBRRN
  3357.     LDX DCBCRR+1
  3358.     STX CCBRRN+1
  3359.     LDX DCBCRB      ;X=REL BYTE (LOW)
  3360.     LDY DCBCRB+1        ;Y=REL BYTE HI
  3361.     STX CCBBYT
  3362.     STY CCBBYT+1
  3363.     INX         ;INC REL BYTE (LOW)
  3364.     BNE INCR1       ;BR IF NO CARRY
  3365.     INY         ;INC REL BYTE (HI)
  3366. ;
  3367. INCR1   CPY DCBRCL+1        ;REL BYTE=REC LENGTH
  3368.     BNE INCR2       ;BR IF NOT
  3369.     CPX DCBRCL      ;TEST LOW BYTES
  3370.     BNE INCR2
  3371.     LDX #0
  3372.     LDY #0      ;RESET REL BYTE TO ZERO
  3373.     INC DCBCRR      ;AND INCR
  3374.     BNE INCR2       ;RELATIVE RECORD
  3375.     INC DCBCRR+1
  3376. ;
  3377. INCR2   STX DCBCRB      ;SAVE NEW RELATIVE BYTE
  3378.     STY DCBCRB+1   
  3379. ;
  3380.     RTS
  3381.     PAGE
  3382. ;
  3383. ;   INCSCB – INCREMENT SECTOR BYTE
  3384. ;
  3385. INCSCB
  3386.     INC DCBCSB      ;INC SECTOR BYTE
  3387.     BNE INCS2       ;BR IF NOT FULL
  3388.     INC DCBCRS      ;AND INCR
  3389.     BNE INCS2       ;RELATIVE SECTOR
  3390.     INC DCBCRS+1   
  3391. ;
  3392. ;
  3393. INCS2
  3394.     RTS         ;DONE
  3395.     PAGE
  3396. ;
  3397. ;   MIBDA – MOVE AND INCREMENT CCBDAT
  3398. ;
  3399. MIBDA
  3400.     LDY CCBBBA      ;Y=ADR LOW
  3401.     LDX CCBBBA+1        ;X=ADR HI
  3402.     STY ZPGFCB      ;PUT ADR INTO ZPG
  3403.     STX ZPGFCB+1
  3404. ;
  3405.     INC CCBBBA      ;INC ADR LOW
  3406.     BNE MIB1        ;BR IF NOT ZERO
  3407.     INC CCBBBA+1        ;INC ADR HI
  3408. MIB1    RTS         ;DONE
  3409. ;
  3410. ;   DTBLN – DCREMENT BLOCK LENGTH AND TEST ZERO
  3411. ;
  3412. DTBLN
  3413.     LDY CCBBLN      ;GET LEN LOW
  3414.     BNE DTB1        ;BR IF NOT ZERO
  3415.     LDX CCBBLN+1        ;GET LEN HI
  3416.     BEQ DTB2        ;BR IF LEN=0
  3417.     DEC CCBBLN+1        ;DEC LEN (HIGH)
  3418. DTB1    DEC CCBBLN      ;DEC LEN (LOW)
  3419.     RTS         ;DONE
  3420. ;
  3421. DTB2    JMP GOODIO      ;FINISHED BLOCK
  3422.     PAGE
  3423. ;
  3424. ;   FNDFIL – FIND FILE NAME IN VOLUME DIR
  3425. ;
  3426. FNDFIL
  3427.     JSR RDVTOC      ;GO GET VTOC
  3428.     LDA CCBFN1      ;MOVE FN PTR
  3429.     STA ZPGFCB      ;TO ZERO PAGE
  3430.     LDA CCBFN1+1
  3431.     STA ZPGFCB+1
  3432.     LDA #1
  3433. FF1 STA TEMP2
  3434.     LDA #0
  3435.     STA DCBVDR
  3436.     CLC
  3437. FF2
  3438.     INC DCBVDR
  3439.     JSR RDVDIR      ;GO GET VDIR SECTOR
  3440.     BCS FF4A
  3441.     LDX #0      ;SET FOR 1ST FILE
  3442. ;
  3443. FF3 STX TEMP1       ;SAVE INDEX
  3444.     LDA VDFILE,X        ;GET FILE TRK
  3445.     BEQ FF6     ;BR IF LAST ENTRY
  3446.     BMI FF7     ;BR DELETED ENTRY
  3447.     LDY #0      ;X=X+3
  3448.     INX
  3449.     INX
  3450. FF4 INX
  3451.     LDA (ZPGFCB),Y  ;GET FN CHAR
  3452.     CMP VDFILE,X        ;COMPARE TO ENTRY CHAR
  3453.     BNE FF5     ;BR IF NOT SAME
  3454.     INY
  3455.     CPY #30     ;ALL 30 CHARS
  3456.     BNE FF4     ;BR IF NOT
  3457.     LDX TEMP1       ;GET INDEX
  3458.     CLC         ;FILE FOUND
  3459.     RTS         ;RETURN
  3460. ;
  3461. FF5
  3462.     JSR VDINC
  3463.     BCC FF3
  3464.     BCS FF2
  3465. ;
  3466. FF6 LDY TEMP2       ;LOOKING FOR DELETED
  3467.     BNE FF1     ;BR IF NOT (DO)
  3468. ;
  3469. FF7 LDT TEMP2       ;LOOKING FOR EMPTY
  3470.     BNE FF5     ;BR IF NOT
  3471. ;
  3472. MVFN
  3473.     LDY #0      ;HAVE NEW ENTRY
  3474.     INX
  3475.     INX
  3476. FF8 INX
  3477.     LDA (ZPGFCB),Y  ;MOVE FILE NAME
  3478.     STA VDFILE,X
  3479.     INY
  3480.     CPY #30
  3481.     BNE FF8
  3482. ;
  3483.     LDX TEMP1       ;GET INDEX
  3484.     SEC         ;SET NOT OLD
  3485.     RTS         ;DONE
  3486. VDINC
  3487.     CLC
  3488.     LDA TEMP1
  3489.     ADC #35
  3490.     TAX
  3491.     CPX #VDFLEN
  3492.     RTS
  3493. FF4A
  3494.     LDA #0
  3495.     LDY TEMP2
  3496.     BNE FF1
  3497.     JMP ERROR9
  3498.     PAGE
  3499. ;
  3500. ;   GETSEC – GET A SECTOR
  3501. ;
  3502. GETSEC
  3503.     LDA DCBATK      ;GET ALLOCATED TRK
  3504.     BEQ GSS1        ;BR IF NONE
  3505. ;
  3506. GSO
  3507.     DEC DCBALS      ;DECREMENT SECTOR NO
  3508.     BMI CS2     ;BR IF NO SECTORS REM
  3509. ;
  3510.     CLC
  3511.     LDX #4      ;4 BYTE SHIFT
  3512. GS1 ROL DCBABM-1,X  ;SHIFT BYTE LEFT
  3513.     DEX
  3514.     BNE GS1
  3515.     BCC GS0     ;BR IF NO SECTOR
  3516. ;
  3517.     INC DCBNSA
  3518.     BNE GS1A
  3519.     INC DCBNSA+1
  3520. GS1A
  3521.     LDA DCBALS      ;GET ALLOCATED SECTOR
  3522.     RTS         ;RETURN
  3523. ;
  3524. CS2 LDA #0      ;CLEAR ALLOCATED
  3525.     STA DCBATK      ;TRK
  3526. ;
  3527. GSS1    LDA #0      ;SET SEARCH STATE=0
  3528.     STA TEMP3
  3529.     JSR RDVTOC      ;GET VTOC
  3530. ;
  3531. GS2
  3532.     CLC
  3533.     LDA VALCA1      ;GET LAST ALLOCATED TRK
  3534.     ADC VALCA2      ;AD (+1) OR (-1)
  3535.     BEQ GS3     ;BR IF DECK TO ZERO
  3536.     CMP VNOTRK
  3537.     BCC GS5     ;BR IF NOT AT OUTER LIMIT
  3538.     LDA #$FF        ;SET (-1)
  3539.     BNE GS4
  3540. GS3 LDA TEMP3       ;GET SEARCH STATE
  3541.     BNE ERR9        ;BR IF NOT ZERO
  3542.     LDA #1      ;SET (+1)
  3543.     STA TEMP3       ;SET SEARCH STATE = 1
  3544. GS4 STA VALCA2      ;SET NEW (+1) OR (-1)
  3545.     CLC
  3546.     ADC #17     ;ADD VTOC TRK NO
  3547. GS5 STA VALCA1      ;SET NEW LAST ALLOCATED
  3548.     STA DCBATK      ;PUT IN DCB
  3549. ;
  3550.     TAY         ;ALLOCATED TRACK
  3551.     ASLA            ;TIME 4
  3552.     ASLA
  3553.     TAY
  3554.     LDX #4
  3555.     CLC
  3556. GS6 LDA VSECAL+3,Y  ;MOVE BIT MAP BYTE
  3557.     STA DCBABM-1,X
  3558.     BEQ GS7     ;BR IF NO BITS ON
  3559.     SEC         ;SET HAVE A SECTOR
  3560.     LDA #0      ;CLEAR VTOC BYTE
  3561.     STA VSECAL+3,Y
  3562. GS7 DEY
  3563.     DEX
  3564.     BNE GS6     ;BR IF MORE TO MOVE
  3565.     BCC GS2
  3566.     LSR WRVTOC      ;GO WRITE VTOC
  3567.     LDA VNOSEC      ;GET NO SECTORS
  3568.     STA DCBALS      ;SET IN DCB SECTOR BYTE
  3569.     BNE GS0     ;GO ALLOCATED SECTOR
  3570. ERR9    JMP ERROR9
  3571.     PAGE
  3572. ;
  3573. ;   FRETRK – FREE TRACK OF SECTORS
  3574. ;
  3575. FRETRK
  3576.     LDA DCBATK      ;GET ALLOCATED TRACK
  3577.     BNE FT1     ;BR IF NONE
  3578.     RTS         ;DONE
  3579. FT1 PHA
  3580.     JSR RDVTOC      ;GET VTOC
  3581.     LDY DCBALS      ;GET SECTORS
  3582.     PLA         ;GET TRACK
  3583.     CLC         ;SET FREE
  3584.     JSR FRESEC      ;GO FREE
  3585.     LDA #0      ;CLEAR ALLOCATED TRK
  3586.     STA DCBATK
  3587.     JMP WRVTOC      ;WRITE VTOC
  3588. ;
  3589. ;   FRESEC – FREE A SECTOR
  3590. ;       A=TRK, Y=SECTOR, C=ON/OFF
  3591. ;
  3592. FRESEC
  3593. FS1 LDX #252        ;4 BYTE SHIFT
  3594. FS2 ROR DCBABM-252,X    ;SHIFT IN CARRY
  3595.     INX         ;NEXT BYTE
  3596.     BNE FS2     ;BR IF NOT DONE
  3597.     INY         ;INC SECTOR NO
  3598.     CPY VNOSEC      ;NORMAL
  3599.     BNE FS1     ;BR IF NOT
  3600. ;
  3601.     ASLA            ;TRACK*4
  3602.     ASLA
  3603.     TAY
  3604.     BEQ FS4
  3605.     LDX #4
  3606. FS3 LDA DCBABM-1,X  ;GET BIT MAP BYTE
  3607.     ORA VSECAL+3,Y  ;GET BIT MAP BYTE
  3608.     STA VSECAL+3,Y  ;OR WITH VTOC BM
  3609.     DEY
  3610.     DEX
  3611.     BNE FS3
  3612. FS4 RTS         ;DONE
  3613.     PAGE
  3614. ;
  3615. ;   LOCSEC – LOCATE SECTOR FOR RECORD I/O
  3616. ;
  3617. ;   RELSEC = (REL REC * RECLEN + RELBYTE)/256
  3618. ;   SECBYT = REMAINDER
  3619. ;
  3620. LOCSEC
  3621.     LDA CCBRRN      ;RELATIVE RECORD NUMBER
  3622.     STA DCBCSB      ;TO CSB FOR MULT
  3623.     STA DCBCRR      ;AND CRR FOR SAVE
  3624.     LDA CCBRRN+1
  3625.     STA DCBCRS
  3626.     STA DCBCRR+1
  3627.     LDA #0
  3628.     STA DCBCRS+1        ;HIGH CRS=0
  3629.     LDY #16     ;16 BIT MULT
  3630. ;
  3631. LS1 TAX         ;SAVE MS BYTE
  3632.     LDA DCBCSB
  3633.     LSRA            ;IF NO CARRY THEN NO PART PROD
  3634.     BCS LS1A
  3635.     TXA
  3636.     BCC LS2
  3637. LS1A    CLC
  3638.     LDA DCBCRS+1        ;FPORM PARTIAL PROD
  3639.     ADC DCBRCL
  3640.     STA DCBCRS+1
  3641.     TXA
  3642.     ADC DCBCRL+1
  3643. ;
  3644. LS2 RORA            ;MULT BY 2
  3645.     ROR DCBCRS+1
  3646.     ROR DCBCRS
  3647.     ROR DCBCSB
  3648.     DEY         ;DEC BIT COUNT
  3649.     BNE LS1     ;BR IF MORE BITS
  3650. ;
  3651.     LDA CCBBYT      ;LADD REL BYTE RESULT
  3652.     STA DCBCRB      ;(SAVE REL BYTE)
  3653.     ADC DCBCSB
  3654.     STA DCBCSB
  3655.     LDA CCBBYT+1
  3656.     STA DCBCRB+1        ;(SAVE REL BYTE)
  3657.     ADC DCBCRS
  3658.     STA DCBCRS
  3659.     LDA #0
  3660.     ADC DCBCRS+1
  3661.     STA DCBCRS+1
  3662.     RTS
  3663.     PAGE
  3664. ERROR1  LDA #CREFUN
  3665.     BNE ERRORA
  3666. ERROR2  LDA #CRERR
  3667.     BNE ERRORA
  3668. ERROR3  LDA #CREMRE
  3669.     BNE ERRORA
  3670. ERROR4  LDA #CREPRO
  3671.     BNE ERRORA
  3672. ERROR5  LDA #CREEOF
  3673.     BNE ERRORA
  3674. ERROR6  LDA #CREFNF
  3675.     BNE ERRORA
  3676. ERROR9  LDA #CRENSA
  3677.     BNE ERRORA
  3678. ERROR10 LDA #CREFLK
  3679.     BNE ERRORA
  3680. GOODIO  LDA CCBSTA
  3681.     CLC         ;CARRY=CLR
  3682.     BCC RETURN      ;GO RETURN
  3683. ERRORA
  3684. ERRORB  SEC         ;CARRY=SET
  3685. RETURN
  3686.     PHP
  3687.     STA CCBSTA      ;SET STA
  3688.     JSR RTNFCB      ;GO RTN FCB
  3689.     PLP         ;GET STATUS
  3690.     LDX ENTSTK      ;GET ENT STACK
  3691.     TXS         ;RESTORE STACK
  3692.     RTS         ;DONE
  3693. EC2
  3694.     PAGE
  3695. ;
  3696. ;   MISC DOS WORK CELLS
  3697. ;
  3698. CVDTRK  DB  0       ;CUR VOL DIR TRK
  3699. CVDSEC  DB  0       ;CUR VOL DIR SECTOR
  3700. CURCCB  DB  0,0     ;CURRENT CCB ADR
  3701.  
  3702. ENTSTK  DB  0       ;ENTRY STACK POINTER
  3703. TEMP1   DB  0       ;TEMP BYTE 1
  3704. TEMP2   DB  0       ;TEMP BYTE 2
  3705. TEMP3   DB  0       ;TEMP BYTE 3
  3706. ENTSLT  DB  0       ;BOOT SLOT SAVED
  3707. ALC10S  DB  0,0,$F8,$FF ;ALLOCATATION TRACK BIT MAP
  3708. CVTAB   DB  1,10,100        ;CONVERSION TABLE
  3709. FTTAB   DB11    "TBAI"      ;FILE TYPE CONVERSION TABLE
  3710. VOLUMES DB11    " EMULOV KSID"
  3711. VML EQU *-VOLMES-1
  3712.     PAGE
  3713. ;
  3714. ;   VTOC RECORD AREA
  3715. ;
  3716. VTOC
  3717. VDOST   DB  2       ;DOS TYPE
  3718. VDIRTK  DB  17      ;COLUME DIRECTORY SECTOR
  3719. VDIRSC  DB  12      ;VOLUME DIRECTORY SECTOR
  3720. VDOSRN  DB  2       ;DOS RELEASE NUMBER
  3721.     DB  0       ;SPARE
  3722.     DB  0       ;SPARE
  3723. VVOLNO  DB  0       ;VOLUME NUMBER
  3724.     RMB 32      ;SPARE
  3725. VTDMS   DB  122     ;MAX SECTORS IN A FILE DIR
  3726. VSPARE  RMB 8       ;SPARES
  3727. ;
  3728. VALCA1  DB  17      ;ALOCATION ALGORITHM BYTE 1
  3729. VALCA2  DB  1       ;AA BYTE 2
  3730. VALCA3  DB  0       ;AA BYTE 3
  3731. VALCA4  DB  0       ;AA BYTE 4
  3732. VNOTRK  DB  35      ;NO TRACKS ON VOL
  3733. VNOSEC  DB  13      ;NO SECTORS PER TRACK
  3734. VSECLN  DB  @@256       ;NO BYTES PER SECTOR
  3735. ;
  3736. VSECAL  EQU *       ;SECTOR ALLOCATION AREA
  3737. ;               SECTORS ALLOCATED BY BIT MAP
  3738. ;               4 BYTES OF BITS PER TRACK
  3739. ;               LEFT MOST BIT REPRESENTS SECTOR N
  3740. ;               WHERE N=NO SECTORS PER TRACK
  3741. ;
  3742. ;
  3743.     PAGE
  3744.     ORG VTOC+256
  3745. ;
  3746. ;   VOLUME DIRECTORY AREA
  3747. ;
  3748. VOLDIR
  3749. VDTCDE  DB  2       ;VOLUME DIRECTORY TYPECODE
  3750. VDLTRK  RMB 1       ;VD LINK TRACK
  3751. VDLSEC  RMB 1       ;VD LINK SECTOR
  3752. VDNF    RMB 1       ;VD NUMBER FILES THIS SECTOR
  3753. VDSPAR  RMB 7       ;SPARES
  3754. ;
  3755. VDFILE  EQU *       ;FILE ALLOCATION AREA (7 FILES)
  3756. ;               EACH FILE
  3757. ;                   FILE DIR TRK
  3758. ;                   FILE DIR SECTOR
  3759. ;                   FILE USE CODE
  3760. ;                FILE NAME (30)
  3761. ;               FILE SECTOR COUNT (2)
  3762. ;
  3763.     ORG VOLDIR+256
  3764. VDEND   EQU *
  3765. VDLEN   EQU *-VOLDIR
  3766. VDFLEN  EQU *-VDFILE
  3767.     PAGE
  3768. ;
  3769. ;   COMMAND CONTROL BLOCK (CCB)
  3770. ;
  3771. CCB
  3772. CCBREQ  RMB 1       ;USER REQUEST BYTE
  3773. CRQNUL  EQU 0       ;0-NO REQUEST
  3774. CRQOPN  EQU 1       ;1-OPEN FILE
  3775. CRQCLS  EQU 2       ;2-CLOSE FILE
  3776. CRQRD   EQU 3       ;3-READ DATA
  3777. CRQWR   EQU 4       ;WRITE DATA
  3778. CRQDEL  EQU 5       ;5-DELETE FILE
  3779. CRQDIR  EQU 6       ;6-READ DIRECTORY
  3780. CRQLCK  EQU 7       ;7-LOCK FILE
  3781. CRQUNL  EQU 8       ;8-UNLOCK FILE
  3782. CRQRNM  EQU 9       ;9-RENAME
  3783. CRQPOS  EQU 10      ;10-POSITION FILE
  3784. CRQFMT  EQU 11      ;11-FORMAT
  3785. CRQVAR  EQU 12      ;12-VERIFY
  3786. CRQMAX  EQU 13
  3787. ;
  3788. CCBBSA              ;FORMAT – BOOT START ADR PAGE
  3789. CCBRQM  RMB 1       ;REQUEST MODIFIER BYTE
  3790. CRMNUL  EQU 0       ;NO MODIFIER
  3791. CRMNBT  EQU 1       ;R/W – 1NEXT BYTE
  3792. CRMNBL  EQU 2       ;R/W – 2NEXT BLOCK
  3793. CRMSBT  EQU 3       ;R/W – 3 – SPECIFC BYTE
  3794. CRMSBL  EQU 4       ;R/W – 4 – SPECIFIC BLOCK
  3795. CRMMAX  EQU 5
  3796. ;
  3797. CCBRRN              ;I/O – RELATIVE RECORD NUMBER
  3798. CCBFN2              ;RENAME – FILE NAME 2 PTR
  3799. CCBRLN  RMB 2       ;OPEN – RECORD LENGTH
  3800. ;
  3801. CCBBYT              ;I/O – RELATIVE RECORD NO(2 BYTES)
  3802. CCBVOL  RMB 1       ;OPEN – VOL NO.
  3803. CCBDRV  RMB 1       ;OPEN – DRIVE
  3804. ;
  3805. CCBBLN              ;I/O – BLOCK LENGTH (2 BYTES)
  3806. CCBSLT  RMB 1       ;OPEN – SLOT NO.
  3807. CCBFUC  RMB 1       ;OPEN - FILE USE CODE
  3808. ;
  3809. CCBFN1              ;OPEN, DELETE, LOCK, UNLOCK, RENAME – FILENAME P
  3810. CCBBBA              ;BLCOKK I/O – BLOCK BUFFER PTR
  3811. CCBDAT  RMB 2       ;BYTE I/O – DTA BYTE
  3812. ;
  3813. CCBSTA  RMB 1       ;RESULT STATUS
  3814. CREFUN  EQU 1       ;FCB UNALLOCATED
  3815. CRERR   EQU 2       ;CCB REQ RANGE ERR
  3816. CREMRE  EQU 3       ;REQ MOD RANGE ERR
  3817. CREPRO  EQU 4       ;WRITE PROTECT
  3818. CREEOF  EQU 5       ;END OF FILE ON READ
  3819. CREFNF  EQU 6       ;FILE NOT FOUND
  3820. CREVMM  EQU 7       ;VOL MIS MATCH
  3821. CREIOE  EQU 8       ;I/O ERR
  3822. CRENSA  EQU 9       ;NO SECTORS AVAILABLE
  3823. CREFLK  EQU 10      ;FILE LOCKED
  3824. ;
  3825. CCBSM   RMB 1       ;STATUS MODIFIER
  3826. CCBFCB  RMB 2       ;FCB PTR
  3827. CCBDBP  RMB 2       ;DIR BUF PTR
  3828. CCBSBP  RMB 2       ;SECTOR BUF PTR
  3829. CCBSPR  RMB 4       ;SPARE
  3830. CCBLEN  EQU *-CCB       ;CCB LENGTH
  3831. CFCBAD  EQU CCBFCB
  3832. CFCBDR  EQU CCBDBP
  3833. CFCBSB  EQU CCBSBP
  3834.     PAGE
  3835. ;
  3836. ;   FILE CONTROL BLOCK (FCB) DEFINITION
  3837. ;       DCB – FILE DATA CONTROL BLOCK
  3838. ;
  3839. FCB
  3840. ;
  3841. ;   DATA CONTROL BLOCK
  3842. ;
  3843. FCBDCB
  3844. DCBFDT  RMB 1       ;1ST FILE DIRECTORY TRACK
  3845. DCBFDS  RMB 1       ;1ST FILE DIRECTORY SECTOR
  3846. DCBCDT  RMB 1       ;CURRENT FILE DIRECTORY
  3847. DCBCDS  RMB 1       ;CURRENT FILE DIRECTORY
  3848. DCBWRF  RMB 1       ;WRITE REQD FLAG
  3849. ;               ;$80=WRITE FILE DIR
  3850. ;               ;$40=WRITE SECTOR DIR
  3851. DCBTRK  RMB 1       ;SECTOR TRACK ADR
  3852. DCBSEC  RMB 1       ;SECTOR ADR
  3853. DCBVDR  RMB 1       ;VOL DIR REC
  3854. DCBVDI  RMB 1       ;VOL DIR INDEX
  3855. DCBDMS  RMB 2       ;MAX NO DIRECTORY SECTORS
  3856. DCBDFS  RMB 2       ;CURRENT DIR 1ST REL SECTRO
  3857. DCBDNF  RMB 2       ;REL SECTOR OF NXT DIR
  3858. DCBCMS  RMB 2       ;SECTOR CURRENTLY IN MEMORY
  3859. DCBSDL  RMB 2       ;SECTOR DATA LENGTH
  3860. DCBCRS  RMB 2       ;CURRENT RELATIVE SECTOR
  3861. DCBCSB  RMB 2       ;REL SECTOR OF NXT DIR
  3862. DCBRCL  RMB 2       ;SECTOR CURRENTLY IN MEMORY
  3863. DCBCRR  RMB 2       ;SECTOR DATA LENGTH
  3864. DCBCRB  RMB 2       ;CURRENT RELATIVE SECTOR
  3865. DCBNSA  RMB 2       ;NO SECTORS ALLOCATED
  3866. ;
  3867. DCBALS  RMB 1       ;ALLOCATION SECTOR BYTE
  3868. DCBATK  RMB 1       ;ALLOCATION TRACK
  3869. DCBABM  RMB 4       ;ALLOCATION TRACK SECTOR BIT MAP
  3870. ;
  3871. DCBFUC  RMB 1       ;FILE USE CODE
  3872. DCBSLT  RMB 1       ;SLOT NUMBER
  3873. DCBDRV  RMB 1       ;DRIVE NUMBER
  3874. DCBVOL  RMB 1       ;VOLUME DRIVER
  3875. DCBVTN  RMB 1       ;VTOC TRACK NUMBER
  3876. ;
  3877. DCBSPR  RMB 3       ;SPARES
  3878. ;
  3879. DCBLEN  EQU *-FCBDCB        ;DCB LENGTH
  3880. FCBLEN  EQU *-FCB       ;FCB LENGTH
  3881.     PAGE
  3882. ;
  3883. ;   DOS PATCH AREA 1
  3884. SDP1
  3885. EDP1    EQU ORG2-2
  3886. ;
  3887. ;   DOSLDR – DOS LOADER AND WRITTER
  3888. ;
  3889.     ORG ORG2
  3890. DOSLDR
  3891. ;   GARBAGED BOOT REC 0 HERE
  3892.     RMB 254
  3893. GRSPG   DB  0
  3894. GRPGC   DB  0
  3895.     PAGE
  3896. SC3
  3897. ;
  3898. ;   READ DOS AFTER BOOT
  3899. ;;
  3900.     STX IBSLOT      ;SET BOOT SLOT
  3901.     STX IBPSLT      ;SET PREVIOUS SLOT
  3902.     LDA #1      ;SET PREV DRIVE
  3903.     STA IBPDRV
  3904.     STA IBDRVN
  3905. ;
  3906.     LDA NDPGS       ;COPY NO PAGES TO GET
  3907.     STA BRWCNT
  3908.     LDA #0
  3909.     STA IBTRK       ;SET TRACK 0
  3910. ;
  3911.     LDA BSDSEC      ;COPY START DOS SECTOR
  3912.     STA IBSECT
  3913. ;
  3914.     LDA BGNDOS      ;COPY STARTR DOS ADR
  3915.     STA IBBUFP+1
  3916. ;
  3917.     LDA #IBCRTS     ;SET READ
  3918.     STA IBCMD
  3919. ;
  3920.     TXA         ;SET PREV TRACK = 0
  3921.     LSRA
  3922.     LSRA
  3923.     LSRA
  3924.     LSRA
  3925.     TAX
  3926.     LDA #0
  3927.     STA $4F8,X
  3928.     STA $478,X
  3929.     JSR BOOTIO      ;GO READ DOS
  3930. ;
  3931. ;   DOSINT – INITIALIZE DOS
  3932. ;
  3933. DOSINT
  3934.     LDX #$FF
  3935.     TXS
  3936.     STX IBVOL
  3937.     JSR SETVID
  3938.     JSR SETKBD
  3939. ;
  3940. DI3 JMP DOSREL      ;GO TO POST INIT ROUTINE
  3941.     PAGE
  3942. WBOOT
  3943.     LDA IBBUFP+1        ;GET START OF DOS
  3944.     STA BGNDOS      ;SAVE IR
  3945.     SEC
  3946.     LDA ADOSLD+1        ;CALCULATE
  3947.     SBC BGNDOS
  3948.     STA NDPGS       ;NO DOS PAGES
  3949. ;
  3950.     LDA #0
  3951.     STA IBTRK       ;TRACK=0
  3952.     STA IBSECT      ;SECTOR=0
  3953.     STA IBBUFP
  3954. ;
  3955.     LDA ADOSLD+1        ;GET BOOT START ADR
  3956.     STA IBBUFP+1        ;TO BUFP
  3957.     STA GRSPG       ;TO GARBAGE RECORD
  3958. ;
  3959.     LDA #10     ;NO OF BOOT PAGES
  3960.     STA BRWCNT      ;TO BOOT I/O COUNTER
  3961.     STA BSDSEC
  3962.     LDA #$48
  3963.     STA GRPGC
  3964. ;
  3965.     LDA #IBCWTS     ;SET WRITE
  3966.     STA IBCMD
  3967. ;
  3968.     JSR BOOTIO      ;GO WRITE BOOT SECTORS
  3969. ;
  3970.     LDA BGNDOS      ;SET START OF DOS
  3971.     STA IBBUFP+1
  3972. ;
  3973.     LDA NDPGS
  3974.     STA BRWCNT
  3975.     JSR BOOTIO      ;GO WRITE DOS
  3976. ;
  3977.     RTS         ;DONE
  3978.     PAGE
  3979. BOOTIO
  3980.     LDA BAIOB+1
  3981.     LDY BAIOB
  3982.     JSR DISKIO
  3983.  
  3984.     LDY IBSECT      ;GET SECTOR
  3985.     INY         ;INCREMENT TO NEXT
  3986.     CPY #13     ;AT END OF TRACK
  3987.     BNE BI01        ;BR IF NOT SECTOR ZERO
  3988.     LDY #0      ;SET TO SECTOR ZERO
  3989.     INC IBTRK
  3990. BI01    STY IBSECT      ;SET NEXT SECTOR
  3991. ;
  3992.     INC IBBUFP+1        ;INCREMENT BUFFER POINTER
  3993.     DEC BRWCNT      ;DECREMENT PAGE COUNTER
  3994.     BNE BOOTIO      ;BR IF NOT DONE
  3995.     RTS
  3996. ;
  3997.     PAGE
  3998. ;
  3999. ;   DOS PATCH AREA 1
  4000. ;
  4001. DP1 EQU *
  4002.     BOUND 256
  4003.     ORG *-$20
  4004. EC3
  4005. NDPGS   DB  0
  4006. BRWCNT  DB  0
  4007. BSDSEC  DB  0
  4008. BGNDOS  DB  0
  4009. BAIOB   DB  @@IOB
  4010. ADOSLD  DB  @@DOSLDR
  4011.     PAGE
  4012. ;
  4013. ;   IOB – INPUT / OUTPUT CONTROL BLOCK
  4014. ;         THE IOB IS USED FOR THE INTERFACE
  4015. ;         BETWEEN DOS AND THE DISK I/O ROUTINES
  4016. ;
  4017. IOB
  4018. IBTYPE  DB  1       ;IOB TYPE CODE
  4019. IBSLOT  DB  7       ;CONTROLLER SLOT NO.
  4020. IBDRVN  DB  0       ;DRIVE NUMBER
  4021. IBVOL   DB  $FF     ;VOLUME NUMBER
  4022. IBTRK   DB  0       ;TRACK NUMBER
  4023. IBSECT  DB  0       ;SECTOR NUMBER
  4024. IBDCTP  DB  @@DCT
  4025. IBBUFP  DB  @@0     ;POINTER TO BUFFER
  4026. IBDLEN  DB  @@256       ;DATA LENGTH
  4027. IBCMD   DB  0       ;COMMAND
  4028. IBCNUL  EQU 0       ;0-NULL COMMAND
  4029. IBCRTS  EQU 1       ;1-READ TRACK, SECTOR
  4030. IBCWTS  EQU 2       ;2-WRITE TRACK, SECTOR
  4031. IBFMT   EQU 4       ;4-FORMAT DISK
  4032. IBBOOT  EQU 8       ;8-WRITE BOOT
  4033. IBSTAT  DB  0       ;STATUS
  4034. IBRERR  EQU $80     ;READ ERR
  4035. IBDERR  EQU $40     ;DRIVE ERR
  4036. IBVMME  EQU $20     ;VOLUME MISMATCH
  4037. IBWPER  EQU $10     ;WRITE PROTECT ERROR
  4038. IBSMOD  DB  0       ;STATUS MODIFIER BYTE
  4039. IBPSLT  DB  0       ;PREVIOUS SLOT
  4040. IBPDRV  DB  0       ;PREVIOUS SLOT
  4041. IBSPAR  RMB 2       ;IOB SPARES
  4042. DCT DB  0,1,$EF,$D8
  4043.     PAGE
  4044. ;
  4045. ;   FILE DIRECTORY DEFINITION
  4046. ;
  4047.     ORG 0
  4048. FILDIR
  4049. FDUCDE  RMB 1       ;FILE USE CODE
  4050. FDLTRK  RMB 1       ;LINK TO NXT DIR TRACK
  4051. FDLSEC  RMB 1       ;LINK TO NEXT DIR SECTOR
  4052. FDNSA   RMB 1       ;NO SECTOR ALLOCATED
  4053. FDLSDL  RMB 1       ;LAST SECTOR DATA LENGTH
  4054. FDFRS   RMB 2       ;1ST RELATIVE SECTOR IN THIS DIR
  4055. FDSPAR  RMB 5       ;SPARES
  4056. ;
  4057. FDENT   RMB 1       ;START OF FILE ENTRIES (122)
  4058. FDTRK   EQU 0       ;TRACK
  4059. FDSEC   EQU 1       ;SECTOR
  4060. ;
  4061. FDLAST  EQU FILDIR+256
  4062.     PAGE
  4063.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement