Shrinkler refactor

This commit is contained in:
alpine9000
2016-03-16 10:17:22 +11:00
parent 6d729d8f3b
commit ee5964848f
14 changed files with 145 additions and 53 deletions
+31 -9
View File
@@ -4,25 +4,40 @@ HOST_WARNINGS=-pedantic-errors -Wfatal-errors -Wall -Werror -Wextra -Wno-unused-
HOST_CFLAGS=$(HOST_WARNINGS)
IMAGECONDIR=../tools/imagecon
IMAGECON=$(IMAGECONDIR)/out/imagecon
SHRINKLERDIR=../tools/external/shrinkler
SHRINKLEREXE=$(SHRINKLERDIR)/build/native/Shrinkler
RESIZEDIR=../tools/resize
RESIZE=$(RESIZEDIR)/out/resize
A500_RUN_SCRIPT=~/Google\ Drive/Amiga/amiga500.sh
A600_RUN_SCRIPT=~/Google\ Drive/Amiga/amiga600.sh
ifndef SHRINKLER
SHRINKLER=0
endif
ifndef BASE_ADDRESS
BASE_ADDRESS=70000
endif
ifndef DECOMPRESS_ADDRESS
DECOMPRESS_ADDRESS=10000
endif
ifndef RUN_SCRIPT
RUN_SCRIPT=$(A500_RUN_SCRIPT)
endif
ifndef BOOTBLOCK_ASM
ifeq ($(SHRINKLER),1)
BOOTBLOCK_ASM=../shared/shrinkler_bootblock.s
PROGRAM_BIN=out/shrunk.bin
VASM_EXTRA_BOOTBLOCK_ARGS=-DDECOMPRESS_ADDRESS="\$$$(DECOMPRESS_ADDRESS)" -DSHRINKLER=$(SHRINKLER)
else
BOOTBLOCK_ASM=../shared/bootblock.s
PROGRAM_BIN=out/main.bin
VASM_EXTRA_BOOTBLOCK_ARGS=
endif
ifndef PROGRAM_BIN
PROGRAM_BIN=out/main.bin
endif
all: bin out $(MAKEADF) $(FLOPPY)
@@ -50,6 +65,9 @@ ic:
$(IMAGECON):
make -C $(IMAGECONDIR)
$(SHRINKLEREXE):
make -C $(SHRINKLERDIR)
$(RESIZE):
make -C $(RESIZEDIR)
@@ -68,14 +86,18 @@ out/bootblock.o: $(BOOTBLOCK_ASM) $(PROGRAM_BIN)
vasmm68k_mot $(VASM_EXTRA_BOOTBLOCK_ARGS) -DBASE_ADDRESS="\$$$(BASE_ADDRESS)" -Fhunk -phxass -opt-fconst -nowarn=62 -quiet $< -o $@ -I/usr/local/amiga/os-include
out/main.o: $(MODULE) $(EXTRA)
@# -v
@#vc -c $< -o $@
@#-showopt -no-opt
vasmm68k_mot $(VASM_EXTRA_ARGS) -Fhunk -phxass -opt-fconst -nowarn=62 -quiet $< -o $@ -I/usr/local/amiga/os-include
out/main.bin: out/main.o $(EXTRAOBJS)
out/%.o: %.s
vasmm68k_mot $(VASM_EXTRA_ARGS) -Fhunk -phxass -opt-fconst -nowarn=62 -quiet $< -o $@ -I/usr/local/amiga/os-include
out/main.bin: out/main.o $(OBJS)
@#-T ../link.script
vlink -Ttext 0x$(BASE_ADDRESS) -brawbin1 $< $(EXTRAOBJS) -o $@
vlink -Ttext 0x$(BASE_ADDRESS) -brawbin1 $< $(OBJS) -o $@
out/shrunk.bin: $(SHRINKLER_EXE) out/main.bin
$(SHRINKLEREXE) -d out/main.bin out/shrunk.bin
clean:
rm -rf out bin *~
+79
View File
@@ -0,0 +1,79 @@
include "../include/registers.i"
include "exec/io.i"
include "lvo/exec_lib.i"
include "devices/trackdisk.i"
bootblock:
dc.b "DOS",0
dc.l 0
dc.l 880
BootEntry:
;; a6 = exec base
;; a1 = trackdisk.device I/O request pointer
if SHRINKLER == 1
lea DECOMPRESS_ADDRESS,a5 ; load shrinkler compressed data here
else
lea BASE_ADDRESS,a5 ; main.s entry point
endif
;; Load the progam from the floppy using trackdisk.device
move.l #mainEnd-mainStart,IO_LENGTH(a1)
move.l a5,IO_DATA(a1)
move.l #mainStart-bootblock,IO_OFFSET(a1)
jsr _LVODoIO(a6)
;; Turn off drive motor
move.l #0,IO_LENGTH(a1)
move.w #TD_MOTOR,IO_COMMAND(a1)
jsr _LVODoIO(a6)
if SHRINKLER == 0
jmp (a5) ; -> main.s entry point
else ; SHRINKER == 1
; a0 = compressed data
lea DECOMPRESS_ADDRESS,a0
; a1 = decompressed data destination
lea BASE_ADDRESS,a1
; a2 = progress callback, can be zero if no callback is desired.
lea Callback(pc),a2
bsr ShrinklerDecompress ; -> decompress!
lea BASE_ADDRESS,a5
jmp (a5) ; -> main.s entry point
include "../tools/external/shrinkler/ShrinklerDecompress.S"
Callback:
;; d0 = Number of bytes decompressed so far
;; a0 = Callback argument
move.l a6,-(sp)
lea CUSTOM,a6
move.w d0,COLOR00(a6) ; Set wild background colors as we decompress
move.l (sp)+,a6
rts
endif ; SHRINKLER == 1
;; Pad the remainder of the bootblock
cnop 0,1024
mainStart:
if SHRINKLER == 1
incbin "out/shrunk.bin"
else ; SHRINKLER == 0
incbin "out/main.bin"
endif ; SHRINKLER == 0
cnop 0,512
mainEnd:
end