84 lines
2.2 KiB
NASM
84 lines
2.2 KiB
NASM
|
; 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"
|