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

Subversion Repositories eco32

[/] [eco32/] [tags/] [eco32-0.22/] [monitor/] [monitor-digilent/] [sctio-ctl.s] - Diff between revs 16 and 21

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 16 Rev 21
;
;
; sctio-ctl.s -- disk sector I/O for disk made available by disk controller
; sctio-ctl.s -- disk sector I/O for disk made available by disk controller
;
;
 
 
;***************************************************************
;***************************************************************
 
 
        .set    dskbase,0xF0400000      ; disk base address
        .set    dskbase,0xF0400000      ; disk base address
        .set    dskctrl,0                ; control register
        .set    dskctrl,0                ; control register
        .set    dskcnt,4                ; count register
        .set    dskcnt,4                ; count register
        .set    dsksct,8                ; sector register
        .set    dsksct,8                ; sector register
        .set    dskcap,12               ; capacity register
        .set    dskcap,12               ; capacity register
        .set    dskbuf,0x00080000       ; disk buffer
        .set    dskbuf,0x00080000       ; disk buffer
 
 
        .set    ctrlstrt,0x01           ; start bit
        .set    ctrlstrt,0x01           ; start bit
        .set    ctrlien,0x02            ; interrupt enable bit
        .set    ctrlien,0x02            ; interrupt enable bit
        .set    ctrlwrt,0x04            ; write bit
        .set    ctrlwrt,0x04            ; write bit
        .set    ctrlerr,0x08            ; error bit
        .set    ctrlerr,0x08            ; error bit
        .set    ctrldone,0x10           ; done bit
        .set    ctrldone,0x10           ; done bit
        .set    ctrlrdy,0x20            ; ready bit
        .set    ctrlrdy,0x20            ; ready bit
 
 
        .set    sctsize,512             ; sector size in bytes
        .set    sctsize,512             ; sector size in bytes
 
 
        .set    retries,1000000         ; retries to get disk ready
        .set    retries,1000000         ; retries to get disk ready
 
 
        .export sctcapctl               ; determine disk capacity
        .export sctcapctl               ; determine disk capacity
        .export sctioctl                ; do disk I/O
        .export sctioctl                ; do disk I/O
 
 
;***************************************************************
;***************************************************************
 
 
        .code
        .code
        .align  4
        .align  4
 
 
sctcapctl:
sctcapctl:
        add     $8,$0,retries            ; set retry count
        add     $8,$0,retries            ; set retry count
        add     $9,$0,dskbase
        add     $9,$0,dskbase
sctcap1:
sctcap1:
        ldw     $10,$9,dskctrl
        ldw     $10,$9,dskctrl
        and     $10,$10,ctrlrdy         ; ready?
        and     $10,$10,ctrlrdy         ; ready?
        bne     $10,$0,sctcapok          ; yes - jump
        bne     $10,$0,sctcapok          ; yes - jump
        sub     $8,$8,1
        sub     $8,$8,1
        bne     $8,$0,sctcap1            ; try again
        bne     $8,$0,sctcap1            ; try again
        add     $2,$0,0                   ; no disk found
        add     $2,$0,0                   ; no disk found
        j       sctcapx
        j       sctcapx
sctcapok:
sctcapok:
        ldw     $2,$9,dskcap            ; get disk capacity
        ldw     $2,$9,dskcap            ; get disk capacity
sctcapx:
sctcapx:
        jr      $31
        jr      $31
 
 
sctioctl:
sctioctl:
        sub     $29,$29,24
        sub     $29,$29,24
        stw     $31,$29,20
        stw     $31,$29,20
        stw     $16,$29,16
        stw     $16,$29,16
        stw     $17,$29,12
        stw     $17,$29,12
        stw     $18,$29,8
        stw     $18,$29,8
        stw     $19,$29,4
        stw     $19,$29,4
        stw     $20,$29,0
        stw     $20,$29,0
        add     $16,$4,$0                ; command
        add     $16,$4,$0                ; command
        add     $17,$5,$0                ; sector number
        add     $17,$5,$0                ; sector number
        add     $18,$6,0xC0000000       ; memory address, virtualized
        add     $18,$6,0xC0000000       ; memory address, virtualized
        add     $19,$7,$0                ; number of sectors
        add     $19,$7,$0                ; number of sectors
 
 
        add     $8,$0,'r'
        add     $8,$0,'r'
        beq     $16,$8,sctrd
        beq     $16,$8,sctrd
        add     $8,$0,'w'
        add     $8,$0,'w'
        beq     $16,$8,sctwr
        beq     $16,$8,sctwr
        add     $2,$0,0xFF               ; illegal command
        add     $2,$0,0xFF               ; illegal command
        j       sctx
        j       sctx
 
 
sctrd:
sctrd:
        add     $2,$0,$0          ; return ok
        add     $2,$0,$0          ; return ok
        beq     $19,$0,sctx              ; if no (more) sectors
        beq     $19,$0,sctx              ; if no (more) sectors
        add     $8,$0,dskbase
        add     $8,$0,dskbase
        add     $9,$0,1
        add     $9,$0,1
        stw     $9,$8,dskcnt            ; number of sectors
        stw     $9,$8,dskcnt            ; number of sectors
        stw     $17,$8,dsksct           ; sector number on disk
        stw     $17,$8,dsksct           ; sector number on disk
        add     $9,$0,ctrlstrt
        add     $9,$0,ctrlstrt
        stw     $9,$8,dskctrl           ; start command
        stw     $9,$8,dskctrl           ; start command
sctrd1:
sctrd1:
        ldw     $2,$8,dskctrl
        ldw     $2,$8,dskctrl
        and     $9,$2,ctrldone          ; done?
        and     $9,$2,ctrldone          ; done?
        beq     $9,$0,sctrd1             ; no - wait
        beq     $9,$0,sctrd1             ; no - wait
        and     $9,$2,ctrlerr           ; error?
        and     $9,$2,ctrlerr           ; error?
        bne     $9,$0,sctx               ; yes - leave
        bne     $9,$0,sctx               ; yes - leave
        add     $8,$0,dskbase + dskbuf   ; transfer data
        add     $8,$0,dskbase + dskbuf   ; transfer data
        add     $9,$0,sctsize
        add     $9,$0,sctsize
sctrd2:
sctrd2:
        ldw     $10,$8,0         ; from disk buffer
        ldw     $10,$8,0         ; from disk buffer
        stw     $10,$18,0                ; to memory
        stw     $10,$18,0                ; to memory
        add     $8,$8,4
        add     $8,$8,4
        add     $18,$18,4
        add     $18,$18,4
        sub     $9,$9,4
        sub     $9,$9,4
        bne     $9,$0,sctrd2
        bne     $9,$0,sctrd2
        add     $17,$17,1               ; increment sector number
        add     $17,$17,1               ; increment sector number
        sub     $19,$19,1               ; decrement number of sectors
        sub     $19,$19,1               ; decrement number of sectors
        j       sctrd                   ; next sector
        j       sctrd                   ; next sector
 
 
sctwr:
sctwr:
        add     $2,$0,$0          ; return ok
        add     $2,$0,$0          ; return ok
        beq     $19,$0,sctx              ; if no (more) sectors
        beq     $19,$0,sctx              ; if no (more) sectors
        add     $8,$0,dskbase + dskbuf   ; transfer data
        add     $8,$0,dskbase + dskbuf   ; transfer data
        add     $9,$0,sctsize
        add     $9,$0,sctsize
sctwr1:
sctwr1:
        ldw     $10,$18,0                ; from memory
        ldw     $10,$18,0                ; from memory
        stw     $10,$8,0         ; to disk buffer
        stw     $10,$8,0         ; to disk buffer
        add     $18,$18,4
        add     $18,$18,4
        add     $8,$8,4
        add     $8,$8,4
        sub     $9,$9,4
        sub     $9,$9,4
        bne     $9,$0,sctwr1
        bne     $9,$0,sctwr1
        add     $8,$0,dskbase
        add     $8,$0,dskbase
        add     $9,$0,1
        add     $9,$0,1
        stw     $9,$8,dskcnt            ; number of sectors
        stw     $9,$8,dskcnt            ; number of sectors
        stw     $17,$8,dsksct           ; sector number on disk
        stw     $17,$8,dsksct           ; sector number on disk
        add     $9,$0,ctrlwrt | ctrlstrt
        add     $9,$0,ctrlwrt | ctrlstrt
        stw     $9,$8,dskctrl           ; start command
        stw     $9,$8,dskctrl           ; start command
sctwr2:
sctwr2:
        ldw     $2,$8,dskctrl
        ldw     $2,$8,dskctrl
        and     $9,$2,ctrldone          ; done?
        and     $9,$2,ctrldone          ; done?
        beq     $9,$0,sctwr2             ; no - wait
        beq     $9,$0,sctwr2             ; no - wait
        and     $9,$2,ctrlerr           ; error?
        and     $9,$2,ctrlerr           ; error?
        bne     $9,$0,sctx               ; yes - leave
        bne     $9,$0,sctx               ; yes - leave
        add     $17,$17,1               ; increment sector number
        add     $17,$17,1               ; increment sector number
        sub     $19,$19,1               ; decrement number of sectors
        sub     $19,$19,1               ; decrement number of sectors
        j       sctwr                   ; next sector
        j       sctwr                   ; next sector
 
 
sctx:
sctx:
        ldw     $20,$29,0
        ldw     $20,$29,0
        ldw     $19,$29,4
        ldw     $19,$29,4
        ldw     $18,$29,8
        ldw     $18,$29,8
        ldw     $17,$29,12
        ldw     $17,$29,12
        ldw     $16,$29,16
        ldw     $16,$29,16
        ldw     $31,$29,20
        ldw     $31,$29,20
        add     $29,$29,24
        add     $29,$29,24
        jr      $31
        jr      $31
 
 

powered by: WebSVN 2.1.0

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