OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

[/] [System09/] [branches/] [before_delte/] [src/] [flex9/] [f9-dkram.txt] - Diff between revs 24 and 66

Only display areas with differences | Details | Blame | View Log

Rev 24 Rev 66
*
*
** FLEX 9 DISK DRIVERS
** FLEX 9 DISK DRIVERS
*
*
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD
* WITH I/O MAPPED AT $XE000
* WITH I/O MAPPED AT $XE000
* AND ROM MAPPED AT $XF000
* AND ROM MAPPED AT $XF000
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
* THE FIRST 64K IS USED BY FLEX,
* THE FIRST 64K IS USED BY FLEX,
* THE SECOND 192K IS USED AS A ROM DISK
* THE SECOND 192K IS USED AS A ROM DISK
* THE REMAINING RAM IS USED FOR A RAM DISK
* THE REMAINING RAM IS USED FOR A RAM DISK
*
*
* These drivers should also work on the B5-X300 board
* These drivers should also work on the B5-X300 board
* although there is only enough room for the ROM Disk.
* although there is only enough room for the ROM Disk.
*
*
IMASK  EQU $10     IRQ MASK CC
IMASK  EQU $10     IRQ MASK CC
FMASK  EQU $40     FIRQ MASK CC
FMASK  EQU $40     FIRQ MASK CC
TRPAGE EQU $0E     PAGE $E000 DAT ADDRESS
TRPAGE EQU $0E     PAGE $E000 DAT ADDRESS
DATREG EQU $FFF0   DAT REGISTERS
DATREG EQU $FFF0   DAT REGISTERS
       ORG   $DE00
       ORG   $DE00
*
*
* DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
* DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
* Disk driver for RAM Disk.
* Disk driver for RAM Disk.
*
*
* 14 SECTORS PER TRACK
* 14 SECTORS PER TRACK
* 16 * N TRACKS PER DISK
* 16 * N TRACKS PER DISK
*
*
* ROM DISK OCCUPIES $10000 - $1E000, $20000 - $2E000, $30000 - $3E000
* ROM DISK OCCUPIES $10000 - $1E000, $20000 - $2E000, $30000 - $3E000
* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
* Track Buffer page mapped at $E000 - $EFFF
* Track Buffer page mapped at $E000 - $EFFF
* TRPAGE = $0E = 14 x $1000 (4 K pages)
* TRPAGE = $0E = 14 x $1000 (4 K pages)
* LEAST SIGNIFICANT NYBBLE OF THE DAT IS INVERTED
* LEAST SIGNIFICANT NYBBLE OF THE DAT IS INVERTED
* ON SWTPC ROM AT $XF000 AND IO AT $XE000
* ON SWTPC ROM AT $XF000 AND IO AT $XE000
* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
* WHEN USING RAM AS A RAMDISK.
* WHEN USING RAM AS A RAMDISK.
* THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT
* 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 LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE
* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
*
*
*
*
READ   JMP   READSC
READ   JMP   READSC
WRITE  JMP   WRITSC
WRITE  JMP   WRITSC
VERIFY JMP   BUSY
VERIFY JMP   BUSY
RESTOR JMP   RESTR1
RESTOR JMP   RESTR1
DRIVE  JMP   DRVSEL
DRIVE  JMP   DRVSEL
DRVRDY JMP   CHKDRV
DRVRDY JMP   CHKDRV
QUICK  JMP   CHKDRV
QUICK  JMP   CHKDRV
COLDDR JMP   INITDR
COLDDR JMP   INITDR
WARMDR JMP   WARMD1
WARMDR JMP   WARMD1
SEEK   JMP   SEEKTS
SEEK   JMP   SEEKTS
*
*
* RAM SPACE
* RAM SPACE
*
*
WRKDR  FDB   0
WRKDR  FDB   0
WRKTR  FDB   0,0,0,0
WRKTR  FDB   0,0,0,0
SECPTR FDB   0
SECPTR FDB   0
TRKCNT FCB   0
TRKCNT FCB   0
SECCNT FCB   0
SECCNT FCB   0
VERERR FCB   0
VERERR FCB   0
CCSAVE FCB   0
CCSAVE FCB   0
*
*
DRVBAS FCB   $10  DRIVE 0
DRVBAS FCB   $10  DRIVE 0
       FCB   $40  DRIVE 1
       FCB   $40  DRIVE 1
       FCB   $40  DRIVE 2
       FCB   $40  DRIVE 2
       FCB   $40  DRIVE 3
       FCB   $40  DRIVE 3
*
*
INITDR RTS
INITDR RTS
WARMD1 RTS
WARMD1 RTS
*
*
* Seek track and sector
* Seek track and sector
* A holds track number (0-32)
* A holds track number (0-32)
* B holds sector number (1-14)
* B holds sector number (1-14)
*
*
SEEKTS STA  TRKCNT
SEEKTS STA  TRKCNT
       STB  SECCNT
       STB  SECCNT
       ANDCC  #$FE   ; CLEAR CARRY
       ANDCC  #$FE   ; CLEAR CARRY
       ORCC   #$40   ; SET Z
       ORCC   #$40   ; SET Z
       RTS
       RTS
*
*
* MAP RAM DISK INTO I/O SPACE
* MAP RAM DISK INTO I/O SPACE
*
*
MAPIN  TFR   CC,A     ; Save state of interrupt masks
MAPIN  TFR   CC,A     ; Save state of interrupt masks
       STA   CCSAVE
       STA   CCSAVE
       ORCC  #FMASK+IMASK ; Mask interrupts while IO mapped out
       ORCC  #FMASK+IMASK ; Mask interrupts while IO mapped out
       LDA   TRKCNT
       LDA   TRKCNT
       LDU   #DRVBAS  ; Point to Drive base offset
       LDU   #DRVBAS  ; Point to Drive base offset
       LDB   WRKDR    ; Get working drive number
       LDB   WRKDR    ; Get working drive number
       ADDA  B,U      ; Add Base offset into RAM
       ADDA  B,U      ; Add Base offset into RAM
       ANDA  #$F0     ; Mask MSN
       ANDA  #$F0     ; Mask MSN
       STA   ,-S      ; Save A on stack
       STA   ,-S      ; Save A on stack
*
*
       LDA   SECCNT
       LDA   SECCNT
       SUBA  #1       ; Sectors 1 to 14 => 0 to 13
       SUBA  #1       ; Sectors 1 to 14 => 0 to 13
       EORA  #$0F     ; Complement LSNybble
       EORA  #$0F     ; Complement LSNybble
       ANDA  #$0F
       ANDA  #$0F
*
*
       ADDA  ,S+       ; Add sector to LSN of Track and pop
       ADDA  ,S+       ; Add sector to LSN of Track and pop
       STA   DATREG+TRPAGE
       STA   DATREG+TRPAGE
*
*
       LDA   TRKCNT   ; LSN of Track indexes into 4K page
       LDA   TRKCNT   ; LSN of Track indexes into 4K page
       ANDA  #$0F
       ANDA  #$0F
       ADDA  #TRPAGE*16
       ADDA  #TRPAGE*16
       STA   SECPTR
       STA   SECPTR
       CLR   SECPTR+1
       CLR   SECPTR+1
       LDU   SECPTR
       LDU   SECPTR
       RTS
       RTS
*
*
* MAP RAM DISK OUT OF MEMORY
* MAP RAM DISK OUT OF MEMORY
*
*
MAPOUT LDA   #TRPAGE  ; Point to the I/O page
MAPOUT LDA   #TRPAGE  ; Point to the I/O page
       EORA  #$0F     ; Complement LSNybble
       EORA  #$0F     ; Complement LSNybble
       STA   DATREG+TRPAGE ; map in I/O page
       STA   DATREG+TRPAGE ; map in I/O page
       LDA   CCSAVE   ; restore interrupt masks
       LDA   CCSAVE   ; restore interrupt masks
       TFR   A,CC
       TFR   A,CC
       RTS
       RTS
*
*
* READ DISK DRIVER
* READ DISK DRIVER
*
*
READSC LBSR  SEEKTS   ; SEEK TRACK & SECTOR
READSC LBSR  SEEKTS   ; SEEK TRACK & SECTOR
       PSHS  U,X
       PSHS  U,X
       BSR   MAPIN    ; MAP RAM DISK INTO I/O SPACE
       BSR   MAPIN    ; MAP RAM DISK INTO I/O SPACE
*
*
       CLRB
       CLRB
READ3  LDA  ,U+
READ3  LDA  ,U+
       STA  ,X+       ; Move Sector to FCB
       STA  ,X+       ; Move Sector to FCB
       INCB
       INCB
       BNE   READ3
       BNE   READ3
*
*
       BSR  MAPOUT    ; MAP RAM DISK OUT OF I/O SPACE
       BSR  MAPOUT    ; MAP RAM DISK OUT OF I/O SPACE
       CLRB           ; Z SET C CLEAR
       CLRB           ; Z SET C CLEAR
       PULS U,X,PC    ; Restore registers and return
       PULS U,X,PC    ; Restore registers and return
*
*
* WRITE DISK DRIVER
* WRITE DISK DRIVER
*
*
WRITSC BSR   SEEKTS   ; SEEK TRACK & SECTOR
WRITSC BSR   SEEKTS   ; SEEK TRACK & SECTOR
       PSHS  U,X
       PSHS  U,X
       BSR   MAPIN    ; MAP RAM DISK INTO I/O SPACE
       BSR   MAPIN    ; MAP RAM DISK INTO I/O SPACE
*
*
       CLRB
       CLRB
WRIT3  LDA   ,X+      ; COPY FCB BLOCK TO RAM DISK
WRIT3  LDA   ,X+      ; COPY FCB BLOCK TO RAM DISK
       STA   ,U+
       STA   ,U+
       INCB
       INCB
       BNE    WRIT3
       BNE    WRIT3
*
*
       BSR    MAPOUT  ; MAP OUT RAM DISK
       BSR    MAPOUT  ; MAP OUT RAM DISK
       CLRB           ; SET Z, CLEAR C
       CLRB           ; SET Z, CLEAR C
       PULS   U,X,PC  ; Restore registers and return
       PULS   U,X,PC  ; Restore registers and return
*
*
* RESTORE DISK DRIVER (SEEK TRACK 00)
* RESTORE DISK DRIVER (SEEK TRACK 00)
*
*
RESTR1 PSHS A
RESTR1 PSHS A
       CLRA           ; Track 0
       CLRA           ; Track 0
       LDAB  #$01     ; Sector 1
       LDAB  #$01     ; Sector 1
       LBSR  SEEKTS
       LBSR  SEEKTS
       PULS  A,PC
       PULS  A,PC
*
*
* CHECK FOR BUSY
* CHECK FOR BUSY
* Doubles as VERIFY
* Doubles as VERIFY
*
*
BUSY   CLRB            Never busy
BUSY   CLRB            Never busy
       RTS
       RTS
*
*
* DRIVE SELECT DISK DRIVER
* DRIVE SELECT DISK DRIVER
*
*
DRVSEL PSHS  X
DRVSEL PSHS  X
       LDA   3,X       GET DRIVE # FROM FCB
       LDA   3,X       GET DRIVE # FROM FCB
       CMPA  #3
       CMPA  #3
       BLS   DRVS2     IF > 3, SET IT TO 0
       BLS   DRVS2     IF > 3, SET IT TO 0
       CLRA
       CLRA
DRVS2  BSR   MXWT      MOVE X TO WORKING TRK
DRVS2  BSR   MXWT      MOVE X TO WORKING TRK
       LDB   TRKCNT
       LDB   TRKCNT
       STB   0,X       SAVE TRACK
       STB   0,X       SAVE TRACK
       STA   WRKDR     SAVE DESIRED DRV AS WORKING DRV
       STA   WRKDR     SAVE DESIRED DRV AS WORKING DRV
       BSR   MXWT      MOVE X TO WORKING TRK
       BSR   MXWT      MOVE X TO WORKING TRK
       LDA   0,X       GET WORKING TRK ON DESIRED DRV
       LDA   0,X       GET WORKING TRK ON DESIRED DRV
       STA   TRKCNT    UPDATE 1771 TRACK REG
       STA   TRKCNT    UPDATE 1771 TRACK REG
       CLRB            ; SET Z, CLEAR C
       CLRB            ; SET Z, CLEAR C
       PULS   X,PC
       PULS   X,PC
*
*
* MOVE INDEX REG TO POINT TO
* MOVE INDEX REG TO POINT TO
* WORKING TRACK STORAGE
* WORKING TRACK STORAGE
*
*
MXWT   LDX   #WRKTR    POINT TO START OF STG
MXWT   LDX   #WRKTR    POINT TO START OF STG
       LDB   WRKDR     GET WORKING DRIVE
       LDB   WRKDR     GET WORKING DRIVE
       ABX
       ABX
MXWT2  RTS
MXWT2  RTS
*
*
* CHECK DRIVE READY DISK DRIVER
* CHECK DRIVE READY DISK DRIVER
*
*
CHKDRV LDA   3,X
CHKDRV LDA   3,X
       CLRB             ; CLEAR C, SET Z
       CLRB             ; CLEAR C, SET Z
       RTS
       RTS
 END
 END
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.