Hamazing/source/framework/bootblock.asm

84 lines
2.2 KiB
NASM
Raw Normal View History

2023-05-22 16:17:35 +02:00
; Bootblock by Chris 'platon42' Hodges.
opt p+,o+
DEBUG_DETAIL set 0
FW_DIRECTORY_ENTRIES_OFFSET = 512
include "exec/execbase.i"
include "exec/io.i"
include "exec/memory.i"
include "exec/macros.i"
include "hardware/adkbits.i"
include "hardware/cia.i"
include "hardware/custom.i"
include "hardware/dmabits.i"
include "hardware/intbits.i"
include "lvo/lvo.i"
_start:
dc.b 'D','O','S',0 ; disk type
dc.l 0 ; checksum 'PLAT'
dc.b 'ON42' ; root block 'ON42'
_entrypoint:
; Because this is a bootblock, we will have ExecBase in a6 here
; a1 is IO-Request
PUSHM d2/a2-a3 ; keep registers safe, otherwise bootstrap will crash
move.l a1,a3
lea _start+FW_DIRECTORY_ENTRIES_OFFSET+20(pc),a2 ; de_MemorySize
move.l (a2)+,d0
PUTMSG 10,<"Alloc %ld bytes">,d0
moveq.l #MEMF_ANY,d1
CALL AllocMem
move.l d0,-(sp)
beq.s .error
move.l (a2)+,IO_OFFSET(a3) ; de_DiskOffset
move.l (a2)+,d0 ; de_DiskLength
add.w #511,d0
and.w #-512,d0 ; round to 512 block size
move.l d0,IO_LENGTH(a3)
moveq.l #MEMF_CHIP,d1
CALL AllocMem
move.l d0,-(sp)
bne.s .good
.error move.w #$f00,$dff180
bra.s .error
.good
PUTMSG 10,<"Loading %ld from offset %ld to %p">,IO_LENGTH(a3),IO_OFFSET(a3),d0
move.l d0,IO_DATA(a3)
move.l a3,a1
CALL DoIO
tst.l d0
bne.s .error
move.l (sp)+,a0
move.l (sp),a1
PUTMSG 10,<"Decrunching %p to %p">,a0,a1
bsr.s zx0_decompress ; a3 not trashed
PUTMSG 10,<"FreeMem %p">,a1
move.l IO_DATA(a3),a1
move.l IO_LENGTH(a3),d0
CALL FreeMem
cmp.w #37,LIB_VERSION(a6)
blo.s .lameos
CALL CacheClearU
.lameos
.execute
move.l (sp)+,a0 ; execute this!
PUTMSG 10,<"Returning %p for execution">,a0
POPM
moveq.l #0,d0 ; no error
rts
include "unpackers/zx0.asm"