Find kernel in second stage bootloader
This commit is contained in:
@@ -8,6 +8,8 @@ BIN=$(NAME).bin
|
||||
HEX=$(NAME).hex
|
||||
|
||||
FPGA_IMG=../../hw/efinix_fpga/init_hex.mem
|
||||
EFX_RUN=/home/byron/Software/efinity/2023.1/scripts/efx_run.py
|
||||
EFX_PRJ=/home/byron/Projects/super6502/hw/efinix_fpga/super6502.xml
|
||||
|
||||
LISTS=lists
|
||||
TESTS=tests
|
||||
@@ -21,6 +23,7 @@ all: $(HEX)
|
||||
|
||||
$(HEX): $(BIN)
|
||||
objcopy --input-target=binary --output-target=verilog $(BIN) $(HEX)
|
||||
cp boot2.bin ../fsdir
|
||||
cmp $(HEX) $(FPGA_IMG); \
|
||||
RETVAL=$$?; \
|
||||
if [ $$RETVAL -eq 0 ]; then \
|
||||
|
||||
107
sw/bios/boot2.s
107
sw/bios/boot2.s
@@ -1,26 +1,109 @@
|
||||
.importzp sp, ptr1, ptr2, ptr3, ptr4, tmp1, tmp2, tmp3, sreg
|
||||
.importzp sp, ptr1, ptr2, ptr3, ptr4, tmp1, tmp2, tmp3, sreg, data_start
|
||||
|
||||
.autoimport on
|
||||
|
||||
.export fatbuf
|
||||
|
||||
.feature string_escapes
|
||||
|
||||
.MACPACK generic
|
||||
|
||||
fatbuf = $A000
|
||||
|
||||
.segment "BOOTLOADER"
|
||||
|
||||
sectors_per_cluster = $800D
|
||||
reserved_sectors = $800E
|
||||
fat_count = $8010
|
||||
sectors_per_fat = $8024
|
||||
|
||||
_start:
|
||||
lda #<str
|
||||
ldx #>str
|
||||
jsr _cputs
|
||||
|
||||
str: .byte "This is a very long message which would otherwise "
|
||||
.byte "take up a lot of space in the bootsector, where space "
|
||||
.byte "is at quite a premium. In fact, this string is as "
|
||||
.byte "long as all the rest of the bootloader code, presuming "
|
||||
.byte "I stretch it out long enough. It is quite remarkable "
|
||||
.byte "Just how much you can do with so few bytes. Only a couple "
|
||||
.byte "hundred are required to start up a modern computer. "
|
||||
.byte "This is, of course, not a modern computer, but I want it "
|
||||
.byte "to act like it in a way. This means using a modern "
|
||||
.byte "(well, in the sense that its from 1996 and not 1983)"
|
||||
.byte "anyway, I've exceeded 512 bytes now so good luck.", $00
|
||||
; Read root directory entry into fatbuf
|
||||
lda data_start
|
||||
ldx data_start + 1
|
||||
jsr pushax
|
||||
stz sreg
|
||||
stz sreg+1
|
||||
jsr pusheax
|
||||
lda #<fatbuf
|
||||
ldx #>fatbuf
|
||||
jsr pushax
|
||||
lda #<ptr1
|
||||
ldx #>ptr1
|
||||
jsr _SD_readSingleBlock
|
||||
|
||||
lda #<fatbuf
|
||||
ldx #>fatbuf
|
||||
jsr _SD_printBuf
|
||||
|
||||
lda #$20 ; Start at first directory entry (first is a disk label)
|
||||
sta ptr3
|
||||
lda #>fatbuf
|
||||
sta ptr3 + 1
|
||||
ldy #$0b ; look for attributes
|
||||
@1: lda (ptr3),y
|
||||
|
||||
cmp #$0f ; if attribute is 0xf, this is a lfn
|
||||
bne @2 ; if not an lfn, then try to read filename
|
||||
@next: clc ; otherwise, go to the next entry (+0x20)
|
||||
lda ptr3
|
||||
adc #$20
|
||||
sta ptr3
|
||||
lda #<word_str
|
||||
ldx #>word_str
|
||||
jsr pushax
|
||||
lda ptr3
|
||||
ldx ptr3 + 1
|
||||
pha
|
||||
phx
|
||||
jsr pushax
|
||||
phy
|
||||
ldy #$4
|
||||
jsr _cprintf
|
||||
ply
|
||||
plx
|
||||
stx ptr3 + 1
|
||||
pla
|
||||
sta ptr3
|
||||
bra @1
|
||||
|
||||
@2: ldy #11 ; ignore the attributes. Write null to make a string
|
||||
lda #$00
|
||||
sta (ptr3),y
|
||||
lda ptr3 ; store address of the filename string on the stack
|
||||
pha
|
||||
ldx ptr3 + 1
|
||||
phx
|
||||
; jsr _cputs ; print out short filenames as we read them
|
||||
lda #<kernel_str ; load the string "KERNEL O65"
|
||||
ldx #>kernel_str
|
||||
jsr pushax
|
||||
plx ; then push the string we read earlier
|
||||
pla
|
||||
jsr _strcmp
|
||||
bne @next ; if they are not equal then try next entry
|
||||
lda #<_good ; print match if we found it
|
||||
ldx #>_good
|
||||
jsr _cputs ; otherwise continue on
|
||||
|
||||
@3: jmp @3
|
||||
|
||||
; parse root directory for kernel.o65
|
||||
; load first data cluster (we know this is root.)
|
||||
; If kernel is not in this then we can go read the FAT
|
||||
; later. Saves time if kernel is near beginning
|
||||
|
||||
; bootsector should still be loaded at $8000
|
||||
; data start should still be valid
|
||||
|
||||
|
||||
|
||||
|
||||
str: .asciiz "boot2\r\n"
|
||||
kernel_str: .asciiz "KERNEL O65"
|
||||
_good: .asciiz "Found KERNEL"
|
||||
word_str: .asciiz "Word Value: %x\r\n"
|
||||
@@ -1,4 +1,5 @@
|
||||
.importzp sp, ptr1, ptr2, ptr3, ptr4, tmp1, tmp2, tmp3, sreg
|
||||
.exportzp data_start
|
||||
|
||||
.autoimport on
|
||||
|
||||
|
||||
Reference in New Issue
Block a user