Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #mecall test script
- .text
- .globl main
- #You will update the relevant CSR registers to use your mecall subroutines when ecall is executed
- #Program will try to (transfer control to a7? )unless ustatus ready bit is set to 1 (csrrsi zero, 0, 1)
- #set vec table, enable interrupts to execute
- main:
- li tp, 1 #set tp
- li t0, 0xfffffffc
- csrw t0, 64
- li t0, 0
- la t0, handler
- csrrw zero, 5, t0 # set utvec (5) to the handlers address #@ destination is 0, only changes source (t0) to csr# (5)
- csrrsi zero, 0, 1 # set interrupt enable bit in ustatus (0) #@ global interrupt enable, step 5?
- #set bit 0 to 1, of register 0
- #INSTRUCTION_ADDR_MISALIGNED #0
- #jump to an invalid address (like zero)
- #try to load instruction at PC=0
- li t1, 3
- jalr t1
- #INSTRUCTION_ACCESS_FAULT #1
- jalr zero
- #LOAD_ADDRESS_MISALIGNED #4
- #ebreak
- li t1, 3
- lw t0, (t1)
- #INSTR is stored in EPC but i lose it when printstr branches to teardown and overwrites it
- #LOAD_ACCESS_FAULT #5
- ebreak
- csrrsi zero, 0, 1 #WHY DO I NEED TO RESET USTATUS? what causes ustatus to be reset?
- la t1, main
- lw t0, 0(t1)
- #STORE_ADDRESS_MISALIGNED #6
- csrrsi zero, 0, 1
- li t1, 3
- sw t0, 2(t1)
- #STORE_ACCESS_FAULT #7
- csrrsi zero, 0, 1
- la t1, main
- sw t0, 0(t1)
- #PART 1
- #get printstring working first to help with other routines
- #PrintString, #4
- la t0, mecall
- csrrw zero, 5, t0 # set utvec (5) to the handlers address
- csrrsi zero, 0, 1 # set interrupt enable bit in ustatus (0)
- li a6, 4
- la a0, startmsg
- ecall
- ebreak
- jal PrintChar
- jal ReadChar
- jal ReadString
- #b done # once printstring works, move this line down by one.
- done:
- #Exit, #10
- li a6, 10
- #ecall # remove this line to test mecall
- ecall
- li a7, 10
- ecall #Use normal ecall to exit
- .data
- startmsg: .string "\nstarting mecall test"
- promptstr: .string "\nType a string and press enter: "
- promptint1: .string "\nType a single digit number and press enter: "
- promptint2: .string "\nType '49' and press enter: "
- promptchar: .string "\nenter a char: "
- response: .string "\nYou entered: "
- printcharmsg: .string "\nLets print the letter 'a' : "
- respint: .word 0
- respchar: .byte '\0'
- respstr: .space 20
- .text
- ReadString: #8
- #I CHANGED ALL USES OF A7 TO A6
- addi sp, sp, -16
- sw ra, 12(sp)
- li a6, 4
- la a0, promptstr #This gets printed before we type a string. Need to loop until we reach enter key before doing this
- ecall
- li a6, 8
- la a0, respstr #Load a0 with 20 byte buffer (max len of str). This is where we store string
- ecall
- li a6, 4
- la a0, response
- ecall
- li a6, 4 #Call printstr
- la a0, respstr #Print respstr
- ecall
- lw ra, 12(sp)
- addi sp, sp, 16
- ret
- PrintChar: #11
- addi sp, sp -16
- sw ra, 12(sp)
- li a6, 4
- la a0, printcharmsg
- ebreak
- ecall
- li a6, 11
- andi t0, t0, 0
- addi a0, t0, 0x61 #hex 61 is letter a.
- ecall
- lw ra, 12(sp)
- addi sp, sp, 16
- ret
- ReadChar: #12
- addi sp, sp, -16
- sw ra, 12(sp)
- li a6, 4
- la a0, promptchar
- ecall
- li a6, 12
- ecall
- addi t0, a0, 0
- li a6, 4
- la a0, response
- ecall
- li a6, 11
- addi a0, t0, 0
- ebreak
- ecall
- lw ra, 12(sp)
- addi sp, sp, 16
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement