URL
https://opencores.org/ocsvn/plasma/plasma/trunk
Subversion Repositories plasma
[/] [plasma/] [trunk/] [tools/] [boot.asm] - Rev 352
Compare with Previous | Blame | View Log
################################################################### TITLE: Boot Up Code# AUTHOR: Steve Rhoads (rhoadss@yahoo.com)# DATE CREATED: 1/12/02# FILENAME: boot.asm# PROJECT: Plasma CPU core# COPYRIGHT: Software placed into the public domain by the author.# Software 'as is' without warranty. Author liable for nothing.# DESCRIPTION:# Initializes the stack pointer and jumps to main().###################################################################Reserve 512 bytes for stack.comm InitStack, 512.text.align 2.global entry.ent entryentry:.set noreorder#These four instructions should be the first instructions.#convert.exe previously initialized $gp, .sbss_start, .bss_end, $spla $gp, _gp #initialize global pointerla $5, __bss_start #$5 = .sbss_startla $4, _end #$2 = .bss_endla $sp, InitStack+488 #initialize stack pointer$BSS_CLEAR:sw $0, 0($5)slt $3, $5, $4bnez $3, $BSS_CLEARaddiu $5, $5, 4jal mainnop$L1:j $L1.end entry####################################################address 0x3c.global interrupt_service_routine.ent interrupt_service_routineinterrupt_service_routine:.set noreorder.set noat#Registers $26 and $27 are reserved for the OS#Save all temporary registers#Slots 0($29) through 12($29) reserved for saving a0-a3addi $29, $29, -104 #adjust spsw $1, 16($29) #atsw $2, 20($29) #v0sw $3, 24($29) #v1sw $4, 28($29) #a0sw $5, 32($29) #a1sw $6, 36($29) #a2sw $7, 40($29) #a3sw $8, 44($29) #t0sw $9, 48($29) #t1sw $10, 52($29) #t2sw $11, 56($29) #t3sw $12, 60($29) #t4sw $13, 64($29) #t5sw $14, 68($29) #t6sw $15, 72($29) #t7sw $24, 76($29) #t8sw $25, 80($29) #t9sw $31, 84($29) #lrmfc0 $26, $14 #C0_EPC=14 (Exception PC)addi $26, $26, -4 #Backup one opcodesw $26, 88($29) #pcmfhi $27sw $27, 92($29) #himflo $27sw $27, 96($29) #lolui $6, 0x2000lw $4, 0x20($6) #IRQ_STATUSlw $6, 0x10($6) #IRQ_MASKand $4, $4, $6jal OS_InterruptServiceRoutineaddi $5, $29, 0#Restore all temporary registerslw $1, 16($29) #atlw $2, 20($29) #v0lw $3, 24($29) #v1lw $4, 28($29) #a0lw $5, 32($29) #a1lw $6, 36($29) #a2lw $7, 40($29) #a3lw $8, 44($29) #t0lw $9, 48($29) #t1lw $10, 52($29) #t2lw $11, 56($29) #t3lw $12, 60($29) #t4lw $13, 64($29) #t5lw $14, 68($29) #t6lw $15, 72($29) #t7lw $24, 76($29) #t8lw $25, 80($29) #t9lw $31, 84($29) #lrlw $26, 88($29) #pclw $27, 92($29) #himthi $27lw $27, 96($29) #lomtlo $27addi $29, $29, 104 #adjust spisr_return:ori $27, $0, 0x1 #re-enable interruptsjr $26mtc0 $27, $12 #STATUS=1; enable interrupts.end interrupt_service_routine.set at###################################################.global OS_AsmInterruptEnable.ent OS_AsmInterruptEnableOS_AsmInterruptEnable:.set noreordermfc0 $2, $12jr $31mtc0 $4, $12 #STATUS=1; enable interrupts#nop.set reorder.end OS_AsmInterruptEnable###################################################.global OS_AsmInterruptInit.ent OS_AsmInterruptInitOS_AsmInterruptInit:.set noreorder#Patch interrupt vector to 0x1000003cla $5, OS_AsmPatchValuelw $6, 0($5)sw $6, 0x3c($0)lw $6, 4($5)sw $6, 0x40($0)lw $6, 8($5)sw $6, 0x44($0)lw $6, 12($5)jr $31sw $6, 0x48($0)OS_AsmPatchValue:#Registers $26 and $27 are reserved for the OS#Code to place at address 0x3clui $26, 0x1000ori $26, $26, 0x3cjr $26nop.set reorder.end OS_AsmInterruptInit###################################################.global setjmp.ent setjmpsetjmp:.set noreordersw $16, 0($4) #s0sw $17, 4($4) #s1sw $18, 8($4) #s2sw $19, 12($4) #s3sw $20, 16($4) #s4sw $21, 20($4) #s5sw $22, 24($4) #s6sw $23, 28($4) #s7sw $30, 32($4) #s8sw $28, 36($4) #gpsw $29, 40($4) #spsw $31, 44($4) #lrjr $31ori $2, $0, 0.set reorder.end setjmp###################################################.global longjmp.ent longjmplongjmp:.set noreorderlw $16, 0($4) #s0lw $17, 4($4) #s1lw $18, 8($4) #s2lw $19, 12($4) #s3lw $20, 16($4) #s4lw $21, 20($4) #s5lw $22, 24($4) #s6lw $23, 28($4) #s7lw $30, 32($4) #s8lw $28, 36($4) #gplw $29, 40($4) #splw $31, 44($4) #lrjr $31ori $2, $5, 0.set reorder.end longjmp###################################################.global OS_AsmMult.ent OS_AsmMultOS_AsmMult:.set noreordermultu $4, $5mflo $2mfhi $4jr $31sw $4, 0($6).set reorder.end OS_AsmMult###################################################.global OS_Syscall.ent OS_SyscallOS_Syscall:.set noreordersyscall 0jr $31nop.set reorder.end OS_Syscall
