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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [monitor/] [monitor/] [common/] [dskser.s] - Diff between revs 182 and 183

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 182 Rev 183
Line 1... Line 1...
 
;
 
; dskser.s -- disk made available by serial interface
 
;
 
 
 
;***************************************************************
 
 
 
        .export dskcapser               ; determine disk capacity
 
        .export dskioser                ; do disk I/O
 
 
 
        .import ser1in
 
        .import ser1out
 
        .import ser1inchk
 
        .import puts
 
 
 
        ; constants for communication with disk server
 
        .set    SYN,0x16                ; to initiate the three-way handshake
 
        .set    ACK,0x06                ; acknowledgement for handshake
 
        .set    RESULT_OK,0x00          ; server successfully executed cmd
 
                                        ; everything else means error
 
 
 
        .set    WAIT_DELAY,800000       ; count for delay loop
 
 
 
;***************************************************************
 
 
 
        .code
 
        .align  4
 
 
 
dskcapser:
 
        sub     $29,$29,16
 
        stw     $16,$29,0
 
        stw     $17,$29,4
 
        stw     $18,$29,8
 
        stw     $31,$29,12
 
        add     $4,$0,trymsg             ; say what we are doing
 
        jal     puts
 
        add     $18,$0,$0         ; capacity == 0 if disk not present
 
        add     $16,$0,10                ; 10 tries to get a connection
 
handshake1:
 
        sub     $16,$16,1
 
        add     $4,$0,SYN
 
        jal     ser1out                 ; send SYN
 
        add     $17,$0,WAIT_DELAY        ; wait for ACK
 
handshake2:
 
        sub     $17,$17,1
 
        jal     ser1inchk
 
        bne     $2,$0,handshake3
 
        bne     $17,$0,handshake2
 
        add     $4,$0,timeoutmsg
 
        jal     puts
 
        bne     $16,$0,handshake1
 
        add     $4,$0,frustratedmsg
 
        jal     puts
 
        j       dskcapx
 
handshake3:
 
        jal     ser1in
 
        add     $8,$0,ACK
 
        bne     $2,$8,dskcapx
 
        ; we got an ACK so we return it
 
        add     $4,$0,ACK
 
        jal     ser1out
 
 
 
        ; ask it for its capacity
 
        add     $4,$0,'c'
 
        jal     ser1out                 ; request
 
        jal     ser1in                  ; first byte of response
 
        bne     $2,$0,dskcapx            ; exit if error
 
 
 
        ; all is well and the server will give us the capacity
 
        add     $16,$0,4         ; 4 bytes to read
 
dskcap1:
 
        sll     $18,$18,8
 
        jal     ser1in
 
        or      $18,$18,$2              ; most significant byte first
 
        sub     $16,$16,1
 
        bne     $16,$0,dskcap1
 
 
 
        ; return value is in $18
 
dskcapx:
 
        add     $2,$0,$18
 
        ldw     $16,$29,0
 
        ldw     $17,$29,4
 
        ldw     $18,$29,8
 
        ldw     $31,$29,12
 
        add     $29,$29,16
 
        jr      $31
 
 
 
        .data
 
        .align  4
 
 
 
trymsg:
 
        .byte   "Trying to connect to disk server..."
 
        .byte   0x0A, 0
 
 
 
timeoutmsg:
 
        .byte   "Request timed out..."
 
        .byte   0x0A, 0
 
 
 
frustratedmsg:
 
        .byte   "Unable to establish connection to disk server."
 
        .byte   0x0A, 0
 
 
 
        .code
 
        .align  4
 
 
 
dskioser:
 
        sub     $29,$29,24
 
        stw     $16,$29,0
 
        stw     $17,$29,4
 
        stw     $18,$29,8
 
        stw     $19,$29,12
 
        stw     $20,$29,16
 
        stw     $31,$29,20
 
        add     $16,$0,$4                ; command
 
        add     $17,$0,$5                ; start at sector
 
        add     $8,$0,0xc0000000
 
        or      $18,$8,$6               ; memory address (logicalized)
 
        add     $19,$0,$7                ; number of sectors
 
 
 
        ; switch over command
 
        add     $8,$0,'r'
 
        beq     $8,$16,dskior           ; read
 
        add     $8,$0,'w'
 
        beq     $8,$16,dskiow           ; write
 
        ; unknown command
 
        add     $2,$0,1                  ; value != 0 signifies error
 
        j       dskiox
 
 
 
        ; read from disk
 
dskior:
 
dskior1:                                ; loop over number of sectors
 
        beq     $19,$0,dskiorsuc ; successful return
 
        sub     $19,$19,1
 
        ; read a sector
 
        add     $4,$0,'r'
 
        jal     ser1out
 
        ; send sector number
 
        add     $20,$0,32                ; 4 bytes
 
dskior2:
 
        sub     $20,$20,8
 
        slr     $4,$17,$20
 
        and     $4,$4,0xff
 
        jal     ser1out
 
        bne     $20,$0,dskior2
 
        add     $17,$17,1
 
        ; get answer
 
        jal     ser1in
 
        bne     $2,$0,dskiox             ; $2 != 0 so we use it as return code
 
        ; read data
 
        add     $20,$0,512
 
dskior3:
 
        sub     $20,$20,1
 
        jal     ser1in
 
        stb     $2,$18,0
 
        add     $18,$18,1
 
        bne     $20,$0,dskior3
 
        j       dskior1
 
dskiorsuc:
 
        add     $2,$0,$0
 
        j       dskiox
 
 
 
        ; write to disk
 
dskiow:
 
dskiow1:                                ; loop over number of sectors
 
        beq     $19,$0,dskiowsuc ; successful return
 
        sub     $19,$19,1
 
        ; write a sector
 
        add     $4,$0,'w'
 
        jal     ser1out
 
        ; send sector number
 
        add     $20,$0,32                ; 4 bytes
 
dskiow2:
 
        sub     $20,$20,8
 
        slr     $4,$17,$20
 
        and     $4,$4,0xff
 
        jal     ser1out
 
        bne     $20,$0,dskiow2
 
        add     $17,$17,1
 
        ; write data
 
        add     $20,$0,512
 
dskiow3:
 
        sub     $20,$20,1
 
        ldbu    $4,$18,0
 
        jal     ser1out
 
        add     $18,$18,1
 
        bne     $20,$0,dskiow3
 
        ; get answer
 
        jal     ser1in
 
        bne     $2,$0,dskiox
 
        j       dskiow1
 
dskiowsuc:
 
        add     $2,$0,$0
 
dskiox:
 
        ldw     $16,$29,0
 
        ldw     $17,$29,4
 
        ldw     $18,$29,8
 
        ldw     $19,$29,12
 
        ldw     $20,$29,16
 
        ldw     $31,$29,20
 
        add     $29,$29,24
 
        jr      $31
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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