From cbcb7010c6409104e59d52162eb8ad5779bbac9f Mon Sep 17 00:00:00 2001 From: pjht Date: Mon, 21 Nov 2022 10:39:29 -0600 Subject: [PATCH] Switch to use DMA and clean up boot code --- boot/boot.68k | 32 ++++++++++---------------------- rom.bin | Bin 188 -> 180 bytes 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/boot/boot.68k b/boot/boot.68k index 6f70b58..0c257b2 100644 --- a/boot/boot.68k +++ b/boot/boot.68k @@ -22,21 +22,20 @@ phead_loop: move.l (a0), d1 | If the type of the program header isn't 1 (LOAD), skip the header cmpi.l #0x1, d1 bne.b next_seg -| Zero the destination memory of the program header -move.l (20, a0), d1 | Put the memory size of the program header - 1 in d1 +| Zero the destination memory +move.l (20, a0), d1 | Put the memory size - 1 in d1 subq.l #0x1, d1 -move.l (8, a0), a1 | Put the starting memory address of the program header in a1 +move.l (8, a0), a1 | Put the starting memory address in a1 zero_loop: move.b #0, (a1)+ | Zero a byte of the destination memory dbra d1, zero_loop | Loop back if there is more to zero -| Copy the data of the program header from the loaded file into position -move.l (16, a0), d1 | Put the file size of the program header - 1 in d1 +| Copy the data from the loaded file into position +move.l (16, a0), d1 | Put the file size - 1 in d1 +beq.b next_seg | If the file size is 0, skip the copy (ex, .bss section) subq.l #0x1, d1 -cmpi.l #0xFFFFFFFF, d1 | If the file size is 0, skip the copy (ex, .bss section) -beq.b next_seg -move.l (4, a0), a1 | Put the address of the start of the loaded program header's data in a1 +move.l (4, a0), a1 | Put the address of the loaded data in a1 adda.l #0xA000, a1 -move.l (8, a0), a2 | Put the starting memory address of the program header in a2 +move.l (8, a0), a2 | Put the starting memory address in a2 load_loop: move.b (a1)+, (a2)+ | Copy a byte of data into position dbra d1, load_loop | Loop back if there is more to copy @@ -68,22 +67,11 @@ ffc_done: | Destination in a1 | Start sector in d0.l | Sector count in d1.l -| Clobbers a1, d1 read_sectors: move.l d0, (a0) | Set the sector number move.l d1, (4, a0) | Set the sector count -move.w #0x0, (8, a0) | Issue a read command -| Transfer 0x200 (512) * sector_count bytes from the storage card's data register to (a1) -lsl.l #8, d1 | d0 = d0 * 256 to compute the number of words to transfer -subq.l #0x1, d1 | Subtract 1 from the word count to account for the extra loop done by dbra -bra.b rs_loop -rs_loop_swap: -swap.w d1 -rs_loop: -move.w (0xA, a0), (a1)+ | Transfer a word of sector data to the destination -dbra.w d1, rs_loop -swap.w d1 -dbra.w d1, rs_loop_swap +move.l a1, (0xC, a0) | Set the destination address +move.w #0x1, (8, a0) | Issue a DMA read command rts .if . != 512 diff --git a/rom.bin b/rom.bin index f8b80044bec89b43a99d58d34672fc4755a7990b..3fdcdec42158ae4b58c3e143dbfdeecf36b664e4 100644 GIT binary patch delta 64 zcmdnPxP?)Tfq`KI5OWCFFfb;>>3I0RWB8Dmr{$r?02E3I0RWB8C*rsbi>02E