URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [Flex9/] [f9-dkram.asm] - Rev 99
Go to most recent revision | Compare with Previous | Blame | View Log
*** FLEX 9 DISK DRIVERS** FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM* THE FIRST 64K IS USED BY FLEX,* THE SECOND 192K IS USED AS A ROM DISK* THE REMAINING RAM IS USED FOR A RAM DISK** These drivers should also work on the B5-X300 board* although there is only enough room for the ROM Disk.*IMASK EQU $10 IRQ MASK CCFMASK EQU $40 FIRQ MASK CCTRPAGE EQU $0E PAGE $E000 DAT ADDRESSDATREG EQU $FFF0 DAT REGISTERSORG $DE00** DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006* Disk driver for RAM Disk.** 14 SECTORS PER TRACK* 16 * N TRACKS PER DISK** ROM DISK OCCUPIES $10000 - $1E000, $20000 - $2E000, $30000 - $3E000* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000* Track Buffer page mapped at $E000 - $EFFF* TRPAGE = $0E = 14 x $1000 (4 K pages)* LEAST SIGNIFICANT NYBBLE OF THE DAT IS INVERTED* ON SWTPC ROM AT $XF000 AND IO AT $XE000* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER* WHEN USING RAM AS A RAMDISK.* THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT* THE LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED**READ JMP READSCWRITE JMP WRITSCVERIFY JMP BUSYRESTOR JMP RESTR1DRIVE JMP DRVSELDRVRDY JMP CHKDRVQUICK JMP CHKDRVCOLDDR JMP INITDRWARMDR JMP WARMD1SEEK JMP SEEKTS** RAM SPACE*WRKDR FDB 0WRKTR FDB 0,0,0,0SECPTR FDB 0TRKCNT FCB 0SECCNT FCB 0VERERR FCB 0CCSAVE FCB 0*DRVBAS FCB $10 DRIVE 0FCB $40 DRIVE 1FCB $40 DRIVE 2FCB $40 DRIVE 3*INITDR RTSWARMD1 RTS** Seek track and sector* A holds track number (0-32)* B holds sector number (1-14)*SEEKTS STA TRKCNTSTB SECCNTANDCC #$FE ; CLEAR CARRYORCC #$40 ; SET ZRTS** MAP RAM DISK INTO I/O SPACE*MAPIN TFR CC,A ; Save state of interrupt masksSTA CCSAVEORCC #FMASK+IMASK ; Mask interrupts while IO mapped outLDA TRKCNTLDU #DRVBAS ; Point to Drive base offsetLDB WRKDR ; Get working drive numberADDA B,U ; Add Base offset into RAMANDA #$F0 ; Mask MSNSTA ,-S ; Save A on stack*LDA SECCNTSUBA #1 ; Sectors 1 to 14 => 0 to 13EORA #$0F ; Complement LSNybbleANDA #$0F*ADDA ,S+ ; Add sector to LSN of Track and popSTA DATREG+TRPAGE*LDA TRKCNT ; LSN of Track indexes into 4K pageANDA #$0FADDA #TRPAGE*16STA SECPTRCLR SECPTR+1LDU SECPTRRTS** MAP RAM DISK OUT OF MEMORY*MAPOUT LDA #TRPAGE ; Point to the I/O pageEORA #$0F ; Complement LSNybbleSTA DATREG+TRPAGE ; map in I/O pageLDA CCSAVE ; restore interrupt masksTFR A,CCRTS** READ DISK DRIVER*READSC LBSR SEEKTS ; SEEK TRACK & SECTORPSHS U,XBSR MAPIN ; MAP RAM DISK INTO I/O SPACE*CLRBREAD3 LDA ,U+STA ,X+ ; Move Sector to FCBINCBBNE READ3*BSR MAPOUT ; MAP RAM DISK OUT OF I/O SPACECLRB ; Z SET C CLEARPULS U,X,PC ; Restore registers and return** WRITE DISK DRIVER*WRITSC BSR SEEKTS ; SEEK TRACK & SECTORPSHS U,XBSR MAPIN ; MAP RAM DISK INTO I/O SPACE*CLRBWRIT3 LDA ,X+ ; COPY FCB BLOCK TO RAM DISKSTA ,U+INCBBNE WRIT3*BSR MAPOUT ; MAP OUT RAM DISKCLRB ; SET Z, CLEAR CPULS U,X,PC ; Restore registers and return** RESTORE DISK DRIVER (SEEK TRACK 00)*RESTR1 PSHS ACLRA ; Track 0LDAB #$01 ; Sector 1LBSR SEEKTSPULS A,PC** CHECK FOR BUSY* Doubles as VERIFY*BUSY CLRB Never busyRTS** DRIVE SELECT DISK DRIVER*DRVSEL PSHS XLDA 3,X GET DRIVE # FROM FCBCMPA #3BLS DRVS2 IF > 3, SET IT TO 0CLRADRVS2 BSR MXWT MOVE X TO WORKING TRKLDB TRKCNTSTB 0,X SAVE TRACKSTA WRKDR SAVE DESIRED DRV AS WORKING DRVBSR MXWT MOVE X TO WORKING TRKLDA 0,X GET WORKING TRK ON DESIRED DRVSTA TRKCNT UPDATE 1771 TRACK REGCLRB ; SET Z, CLEAR CPULS X,PC** MOVE INDEX REG TO POINT TO* WORKING TRACK STORAGE*MXWT LDX #WRKTR POINT TO START OF STGLDB WRKDR GET WORKING DRIVEABXMXWT2 RTS** CHECK DRIVE READY DISK DRIVER*CHKDRV LDA 3,XCLRB ; CLEAR C, SET ZRTSEND
Go to most recent revision | Compare with Previous | Blame | View Log
