diff --git a/sw/bios/Makefile b/sw/bios/Makefile index 8ada355..3a9399a 100644 --- a/sw/bios/Makefile +++ b/sw/bios/Makefile @@ -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 \ diff --git a/sw/bios/boot2.s b/sw/bios/boot2.s index 5f6acf5..501a1ac 100644 --- a/sw/bios/boot2.s +++ b/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 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 \ No newline at end of file + ; Read root directory entry into fatbuf + lda data_start + ldx data_start + 1 + jsr pushax + stz sreg + stz sreg+1 + jsr pusheax + lda #fatbuf + jsr pushax + lda #ptr1 + jsr _SD_readSingleBlock + + lda #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 + 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 + 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" \ No newline at end of file diff --git a/sw/bios/bootloader.s b/sw/bios/bootloader.s index 5b3d500..d928332 100644 --- a/sw/bios/bootloader.s +++ b/sw/bios/bootloader.s @@ -1,4 +1,5 @@ .importzp sp, ptr1, ptr2, ptr3, ptr4, tmp1, tmp2, tmp3, sreg +.exportzp data_start .autoimport on