*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* * * * INIT function handler * * * *----------------------------------------------------------------* * * * The INIT function handler (FNINIT, $AEBE) is only called * * by the INIT command handler (CMDINIT, $A54F). The execution * * pattern of FNINIT is described in the preamble accompanying * * the formatted disassembly of the INIT command handler. * * * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* (AE8E) FNINIT JSR ZWRKAREA ;Initialize the work area. * Zero out the FM work area so it can be customized * in accordance with the calling function. * (Although some work bytes may not be subsequently * altered, don't be lulled into thinking that they * are not important. Zero values are just as relevant * as non-zero values.) * (P.S. Don't confuse the FM work area with its * image (FM work buffer) that is housed in the * chain of DOS buffers.) (ABDC) ZWRKAREA LDA #0 TAX ;Initialize the x-index. ZEROWRKA STA FMWKAREA,X ;Put a $00 byte in work area. INX CPX #45 ;Work area is 45 bytes long. (ABE5) BNE ZEROWRKA * Begin customizing the work area. * Get volume, drive, slot & catalog track * values from the FM parameter list. Put * drive, slot*16, catalog track and * complemented volume number in the work area. (ABE7) LDA VOLFM ;Volume number. EOR #$FF ;Calculate 1's complement of volume #. STA VOLWA LDA DRVFM ;Drive #. STA DRVWA LDA SLOTFM ;Get slot #. ASL ;Calculate slot * 16. ASL ASL ASL TAX ;Set (x) = slot * 16. STX SLOT16WA LDA #$11 ;Normal catalog trk = #17. STA TRKWA (AC05) RTS (AE91) LDA #4 ;Opcode for format. * Go format the disk. (AE93) JSR RWTSDRV1 ;Call RWTS driver to FORMAT the disk. (B058) RWTSDRV1 . . (See dis'mbly of RWTSDRV1 using FORMAT.) . . (RTS) * Put volume, number of next track to be * assigned and assignment direction in the * VTOC sector buffer. (AE96) LDA VOLWA ;Complemented volume number (from work area). EOR #$FF ;Uncomplement it & put volume # in VTOC. STA VOLUSED LDA #$11 ;Use trk # 17 for catalog track. (AEA0) STA NXTRKUSE ;Set the catalog trk as the next track to ;assign. (NXTRKUSE is located in the VTOC.) (AEA3) LDA #1 ;Assignment direction is forward. (AEA5) STA DRECTION * Zero out the VTOC buffer from TRKMAP0 to * the end of the VTOC sector. (Note: This * allocates all tracks.) (AEA8) LDX #56 ;Offset to TRKMAP0 in the VTOC. LDA #0 ZVTOC STA VTOCBUFF,X ;Zero out a TRKMAP byte. INX (AEB0) BNE ZVTOC * Free up all tracks except tracks * 0, 1, 2 & catalog track (#17). * * NOTE: DOS only occupies sectors * 0 to 4 on track 2, but this routine * takes the rest of the sectors on * track 2 out of circulation. (AEB2) LDX #$0C ;Offset to start of trkmap3. FREETRK CPX #$8C ;Offset 1 past the end of TRKMAP34. BEQ FREEDTKS ;Done up to end of TRKMAP#$34? LDY #3 ;Initialize the index to the end of FRETKMSK. FREEIT LDA FRETKMSK,Y ;Free most TRKMAPs. (Starting with (AEBA) ;TRKMAP3.) NOTE: Not freeing up VTOC ;sector or tracks used by DOS. (AEBD) STA TRKMAP0,X ;Free tracks by placing the following bytes ;in each TRKMAP: "FF FF 00 00". (AEC0) INX ;Kick up index to byte in TRKMAP. (AEC1) DEY ;Reduce index to FRETKMSK cause loading from ;the end of FRETKMSK: "00 00 FF FF". (AEC2) BPL FREEIT ;(4 bytes/TRKMAP & 4 bytes/FRETKMSK) CPX #$44 ;Offset to start of TRKMAP17 (ie. cat trk). (AEC6) BNE FREETRK ;Have we freed trks 3 to 16 yet? ;If not, take branch. (AEC8) LDX #$48 ;Offset to trk 18 (ie. skip the cat trk). BNE FREETRK ;ALWAYS - go free trks 18 to 34. FREEDTKS JSR WRITVTOC ;Write freed up VTOC to disk. (AECC) * Write the Volume Table of Contents (VTOC). (AFFB) WRITVTOC LDA #2 ;Write opcode for RWTS. * Common to read/write the VTOC. (AFFD) RDWRVTOC LDY ADRVTOC ;Get the address of the VTOC from the FM STY IBBUFP ;constants table & designate it as the LDY ADRVTOC+1 ;I/O buffer in RWTS's IOB. STY IBBUFP+1 LDX TRKWA ;Enter RWTS driver with (x)/(x) = trk/sec values of LDY #0 ;the VTOC. (B00E) JMP RWTSDRVR ;Call RWTS driver to read/write the VTOC. ------------ * Read/Write Track/Sector driver. RWTSDRVR . . (See dis'mbly of RWTS driver using WRITE.) . . (RTS) * Clear out the directory sector buffer. (AECF) LDX #0 TXA CLRDIREC STA DIRECBUF,X INX BNE CLRDIREC (AED8) JSR PT2DIRBF * Designate the directory sector buffer * as the I/O buffer in RWTS's IOB. (B045) PT2DIRBF LDA ADRDIRBF ;Get the addr of the directory sec buf STA IBBUFP ;in the FM constants table. LDA ADRDIRBF+1 ;Store it in RWTS's IOB. STA IBBUFP+1 (B051) RTS (AEDB) LDA #$11 ;(a) = number of catalog track. LDY SECPERTK ;Number of sectors/track = 16. DEY DEY (AEE2) STA IBTRK ;Put catalog track in IOB. * Write the directory sectors * (trk17, secs 15 to 1). (AEE5) SETLNKTK STA DIRLNKTK ;Set the trk/sec values for the link to the SETLNKSC STY DIRLNKSC ;next directory sector. INY ;Get the number of the sector to be written STY IBSECT ;and put it in RWTS's IOB. LDA #2 ;Write opcode for RWTS. (AEF1) JSR RWTSDRV1 ;Write the directory sector to the disk. (B058) RWTSDRV1 . . (See dis'mbly of RWTS driver using WRITE. . . (RTS) (AEF4) LDY DIRLNKSC ;Sector value of the next directory sec to write. DEY ;Kick it down (will increment it later). BMI DOIMAGE ;Don't do sector 0 cause that is the VTOC. BNE SETLNKSC ;Go write sectors 2 to 15. TYA (AEFD) BEQ SETLNKTK ;Go back to write sector 1 and zero out ;the directory sector links. * Routine to write the DOS image * on tracks 0 to 2. (AEFF) DOIMAGE JSR PRPWRDOS ;Get ready to write the DOS image. * Set up RWTS's IOB to write DOS. (B7C2) PRPWRDOS LDA FIRDOSPG ;Designate the start of DOS as the address STA IBBUFP+1 ;of the I/O buffer in RWTS's IOB. LDA #0 STA IBBUFP LDA VOLWA ;Complement the volume number. EOR #$FF STA IBVOL (B7D5) RTS (AF02) JSR WRDOSIMG ;Write the DOS image * Write the DOS image in trks 0 to 2. * That is, write trk02/sec04 ($B5FF) down * to trk00/sec0C ($9D00). (B74A) WRDOSIMG LDA BTSTAGE+1 ;Calculate the number of pages to write: SEC ; (#$B6 - #$9D = #$19 or #25). SBC IBBUFP+1 STA BT2PGCTR ;Set counter for 25 pages. LDA BTSTAGE+1 STA IBBUFP+1 DEC IBBUFP+1 ;Start with page #$B5. LDA #2 ;Start with trk02/sec04. STA IBTRK LDA #4 STA IBSECT LDA #2 ;Write opcode for RWTS. STA IBCMD (B76C) JSR RWPAGES ;Write trk2/sec4 to trk0/sec0. * Read/write a group of pages. (B793) RWPAGES LDA ADROFIOB+1 ;Initialize (a)/(y) with hi/low bytes (B796) LDY ADROFIOB ;of the addr of RWTS's IOB for entry ;into RWTS. (B799) JSR ENTERWTS ;Enter into RWTS to read/write a sector. * Entry to RWTS. (B7B5) PHP ;Save status on stk. ;(c) = 0 if seek or read. ;(c) = 1 if write or format. (B7B6) SEI ;Set the interrupt disable flag to prevent ;any further interrupts from occurring when ;doing real-time programming. (B7B7) JSR RWTS ;Enter RWTS proper to do operation: ; $00=seek, $01=read, ; $02=write & $03=format. * RWTS proper. (BD00) RWTS . . (See dis'mbly of RWTS in formatted dis'mbly of RWTS driver using WRITE.) . . (RTS) (B7BA) BCS ERRENTER ;Operation was not successful. PLP ;Throw status off the stack. CLC ;Signal operation was successful. (B7BE) RTS ============ (B7BF) ERRENTER PLP ;Throw status off the stack. SEC ;Signal operation was unsuccessful. (B7C1) RTS ============ (B79C) LDY IBSECT ;Get # of sector just read or written. (B79F) DEY ;Value for next sector to read/write ;(when executing BOOT1, #$09 --> #$FF). (B7A0) BPL SAMETRK ;Branch to use the same track. * Start a new track. (B7A2) LDY #$0F ;Start with sector 15. NOP NOP (B7A6) DEC IBTRK ;Reduce # of trk wanted. * Adjust pointer to IOB and test if there * are any more sectors to read/write. (B7A9) SAMETRK STY IBSECT ;Store number of sector wanted. DEC IBBUFP+1 ;Reduce buffer's page address. (B7AF) DEC BT2PGCTR ;Reduce counter for # of pages ;(ie. sectors) to read or write. (B7B2) BNE RWPAGES ;More sectors to read or write. (B7B4) RTS * Write trk00/sec09 ($BFFF) down * to trk00/sec00 ($B600). (B76F) LDA BTSTAGE+1 ;Store hi byte of address of the STA IMG8D+1 ;start of Boot1 (#$B6). CLC ;Calulate the hi byte of the address of ADC #9 ;trk00/sec09 (#$B6 + #$09 = #$BF). STA IBBUFP+1 ;Set buffer to send info to page #$BF. LDA #10 ;Designate that there are 10 pages to STA BT2PGCTR ;write (#$BFFF - #$B600). SEC SBC #1 (B783) STA IMG8FF ;Designate that 9 pages are to be read ;when BOOT1 is executed. (B786) STA IBSECT ;Start writing with trk0/sec9. (B789) JSR RWPAGES ;Go write trk0/sec9 to trk0/sec0. * Read/write a group of pages. (B793) RWPAGES LDA ADROFIOB+1 ;Initialize (a)/(y) with hi/low bytes (B796) LDY ADROFIOB ;of the addr of RWTS's IOB for entry ;into RWTS. (B799) JSR ENTERWTS ;Enter into RWTS to read/write a sector. * Entry to RWTS. (B7B5) PHP ;Save status on stk. ;(c) = 0 if seek or read. ;(c) = 1 if write or format. (B7B6) SEI ;Set the interrupt disable flag to prevent ;any further interrupts from occurring when ;doing real-time programming. (B7B7) JSR RWTS ;Enter RWTS proper to do operation: ; $00=seek, $01=read, ; $02=write & $03=format. * RWTS proper. (BD00) RWTS . . (See dis'mbly of RWTS in formatted dis'mbly of RWTS driver using WRITE.) . . (RTS) (B7BA) BCS ERRENTER ;Operation was not successful. PLP ;Throw status off the stack. CLC ;Signal operation was successful. (B7BE) RTS ============= (B7BF) ERRENTER PLP ;Throw status off the stack. SEC ;Signal operation was unsuccessful. (B7C1) RTS ============ (B79C) LDY IBSECT ;Get # of sector just read or written. (B79F) DEY ;Value for next sector to read/write ;(when executing BOOT1, #$09 --> #$FF). (B7A0) BPL SAMETRK ;Branch to use the same track. * Start a new track. (B7A2) LDY #$0F ;Start with sector 15. NOP NOP (B7A6) DEC IBTRK ;Reduce # of trk wanted. * Adjust pointer to IOB and test if there * are any more sectors to read/write. (B7A9) SAMETRK STY IBSECT ;Store number of sector wanted. DEC IBBUFP+1 ;Reduce buffer's page address. (B7AF) DEC BT2PGCTR ;Reduce counter for # of pages to ;read or write. (B7B2) BNE RWPAGES ;More sectors to read or write. (B7B4) RTS ============ (B78C) RTS ============ (AF05) JMP GOODFMXT ;Exit cleanly. ------------ * Exit the file manager. (B37F) GOODFMXT LDA RTNCODFM CLC ;(c) = 0 to signal good operation. BCC FMEXIT BADFMXIT SEC ;(c) = 1 to signal unsuccessful. FMEXIT PHP ;Save status on stack. STA RTNCODFM ;Store return code in FM parameter list. LDA #0 STA STATUS (B38E) JSR CPYFMWA ;Copy the work area to the work buffer. * Copy the FM work area (non-chain) to * the FM work buffer (in DOS chain). (AE7E) CPYFMWA JSR SELWKBUF ;Select the FM work buffer (in DOS chain). * Point the A4L/H pointer at the FM work buffer. (AF08) SELWKBUF LDX #0 ;Set index to select work buffer. (AF0A) BEQ PT2FMBUF ;ALWAYS. (AF12) PT2FMBUF LDA WRKBUFFM,X ;Get address of selected buffer from the STA A4L ;FM parameter list & put it in the pointer. LDA WRKBUFFM+1,X STA A4L+1 (AF1C) RTS (AE81) LDY #0 ;Initialize index. STORWRK LDA FMWKAREA,Y ;Get byte from the FM work area. STA (A4L),Y ;Put it in the work buffer. INY CPY #45 ;45 bytes to copy (0 to 44). BNE STORWRK (AE81) RTS (B391) PLP ;Retrieve status of success of operation ;from the stack. (B392) LDX STKSAV ;Adjust stack pointer to force exit to the TXS ;caller even if we are several subroutines (B396) RTS ;deeper than the original entry point. ============ ;(Returns to AFTRFUNC ($A6AB) in the ;FMDRIVER routine ($A6A8).