;
|
;
|
; pbr.s -- the partition boot record
|
; pbr.s -- the partition boot record
|
;
|
;
|
|
|
; Runtime environment:
|
; Runtime environment:
|
;
|
;
|
; This code must be loaded and started at 0xC0010000.
|
; This code must be loaded and started at 0xC0010000.
|
; It allocates a stack from 0xC0011000 downwards. So
|
; It allocates a stack from 0xC0011000 downwards. So
|
; it must run within 4K (code + data + stack).
|
; it must run within 4K (code + data + stack).
|
;
|
;
|
; This code expects the disk number of the boot disk
|
; This code expects the disk number of the boot disk
|
; in $16, the start sector of the disk or partition
|
; in $16, the start sector of the disk or partition
|
; to be booted in $17 and its size in $18.
|
; to be booted in $17 and its size in $18.
|
;
|
;
|
; NOTE: THIS IS A FAKE PARTITION BOOT RECORD!
|
; NOTE: THIS IS A FAKE PARTITION BOOT RECORD!
|
; It doesn't load anything, but displays a message
|
; It doesn't load anything, but displays a message
|
; where the real thing can be downloaded from.
|
; where the real thing can be downloaded from.
|
|
|
.set stacktop,0xC0011000 ; top of stack
|
.set stacktop,0xC0011000 ; top of stack
|
|
|
.set cout,0xC0000020 ; the monitor's console output
|
.set cout,0xC0000020 ; the monitor's console output
|
|
|
; display a message and halt
|
; display a message and halt
|
start:
|
start:
|
add $29,$0,stacktop ; setup stack
|
add $29,$0,stacktop ; setup stack
|
add $4,$0,strtmsg ; say what is going on
|
add $4,$0,strtmsg ; say what is going on
|
jal msgout
|
jal msgout
|
j halt
|
j halt
|
|
|
; output message
|
; output message
|
; $4 pointer to string
|
; $4 pointer to string
|
msgout:
|
msgout:
|
sub $29,$29,8
|
sub $29,$29,8
|
stw $31,$29,4
|
stw $31,$29,4
|
stw $16,$29,0
|
stw $16,$29,0
|
add $16,$4,0 ; $16: pointer to string
|
add $16,$4,0 ; $16: pointer to string
|
msgout1:
|
msgout1:
|
ldbu $4,$16,0 ; get character
|
ldbu $4,$16,0 ; get character
|
beq $4,$0,msgout2 ; done?
|
beq $4,$0,msgout2 ; done?
|
jal chrout ; output character
|
jal chrout ; output character
|
add $16,$16,1 ; bump pointer
|
add $16,$16,1 ; bump pointer
|
j msgout1 ; continue
|
j msgout1 ; continue
|
msgout2:
|
msgout2:
|
ldw $16,$29,0
|
ldw $16,$29,0
|
ldw $31,$29,4
|
ldw $31,$29,4
|
add $29,$29,8
|
add $29,$29,8
|
jr $31
|
jr $31
|
|
|
; output character
|
; output character
|
; $4 character
|
; $4 character
|
chrout:
|
chrout:
|
sub $29,$29,4
|
sub $29,$29,4
|
stw $31,$29,0
|
stw $31,$29,0
|
add $8,$0,cout
|
add $8,$0,cout
|
jalr $8
|
jalr $8
|
ldw $31,$29,0
|
ldw $31,$29,0
|
add $29,$29,4
|
add $29,$29,4
|
jr $31
|
jr $31
|
|
|
; halt execution by looping
|
; halt execution by looping
|
halt:
|
halt:
|
add $4,$0,hltmsg
|
add $4,$0,hltmsg
|
jal msgout
|
jal msgout
|
halt1:
|
halt1:
|
j halt1
|
j halt1
|
|
|
; messages
|
; messages
|
strtmsg:
|
strtmsg:
|
|
.byte 0x0D, 0x0A
|
.byte "You didn't expect this tiny program to be "
|
.byte "You didn't expect this tiny program to be "
|
.byte "a full-fledged operating system, did you? ;-) "
|
.byte 0x0D, 0x0A
|
.byte "The real NetBSD for ECO32 is a project all by "
|
.byte "a full-fledged operating system, did you?"
|
.byte "itself. You can find it on GitHub, under the "
|
.byte 0x0D, 0x0A
|
.byte "name 'netbsd-on-eco32'.", 0x0D, 0x0A, 0
|
.byte "You can find the real NetBSD for ECO32 on"
|
|
.byte 0x0D, 0x0A
|
|
.byte "GitHub, under the name 'netbsd-on-eco32'."
|
|
.byte 0x0D, 0x0A, 0x0D, 0x0A, 0
|
hltmsg:
|
hltmsg:
|
.byte "bootstrap halted", 0x0D, 0x0A, 0
|
.byte "bootstrap halted", 0x0D, 0x0A, 0
|
|
|
; boot record signature
|
; boot record signature
|
.locate 512-2
|
.locate 512-2
|
.byte 0x55, 0xAA
|
.byte 0x55, 0xAA
|
|
|