Find kernel in second stage bootloader

This commit is contained in:
Byron Lathi
2023-08-21 19:33:52 -07:00
parent 906516c4b5
commit de9353a009
3 changed files with 99 additions and 12 deletions

View File

@@ -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 \

View File

@@ -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"

View File

@@ -1,4 +1,5 @@
.importzp sp, ptr1, ptr2, ptr3, ptr4, tmp1, tmp2, tmp3, sreg
.exportzp data_start
.autoimport on