LOAD_ADDR=0x800
END_ADDR=0xa000
-LZSS_LOADER=0x800
-RECRACK_LOADER=0x9ded
.PHONY: all
all: \
lzss_unpack_fwd.bin \
lzss_unpack_fwd_aux_mem.bin \
star_blazer.ihx \
-star_blazer.a2bin \
-star_blazer_dejunked0.a2bin \
-star_blazer_dejunked1.a2bin \
-star_blazer_recrack_lzss.a2bin
+star_blazer.a2bin
star_blazer_pack_rev.a2bin: lzss_unpack_rev.bin star_blazer.ihx
../utils/a2_pack.py --rev ${LOAD_ADDR} $^ $@
star_blazer.a2bin: ../orig/Star_Blazer_1981_Star_Craft.do
${DOS33} $^ LOAD "STAR BLAZER" $@
-star_blazer_dejunked0.a2bin: star_blazer.a2bin
- ./dejunk.py $< $@ 0
-
-star_blazer_dejunked1.a2bin: star_blazer.a2bin
- ./dejunk.py $< $@ 0xff
-
-star_blazer_recrack_lzss.a2bin: lzss_loader.bin star_blazer_recrack.a2bin
- ./lzss_encode.py ${LZSS_LOADER} $^ $@
-
-lzss_loader.bin: lzss_loader.ihx
- ${HEX2BIN} $< $@
-
-lzss_loader.ihx: lzss_loader.rel
- ${ASLINK} -n -m -u -il -b text=${LZSS_LOADER} $@ $^
-
-lzss_loader.rel: lzss_loader.asm
- ${AS6500} -l -o $<
-
-star_blazer_recrack.a2bin: recrack_loader.bin star_blazer_dejunked0.a2bin
- ./recrack.py $^ $@
-
-recrack_loader.bin: recrack_loader.ihx
- ${HEX2BIN} $< $@
-
-recrack_loader.ihx: recrack_loader.rel
- ${ASLINK} -n -m -u -il -b text=${RECRACK_LOADER} $@ $^
-
-recrack_loader.rel: recrack_loader.asm
- ${AS6500} -l -o $<
-
clean:
rm -f \
*.a2bin \
+++ /dev/null
-#!/usr/bin/env python3
-
-import sys
-
-EXIT_SUCCESS = 0
-EXIT_FAILURE = 1
-
-if len(sys.argv) < 4:
- print(f'usage: {sys.argv[0]:s} in.a2bin out.a2bin fill_value')
- sys.exit(EXIT_FAILURE)
-in_a2bin = sys.argv[1]
-out_a2bin = sys.argv[2]
-fill_value = int(sys.argv[3], 0)
-
-with open(in_a2bin, 'rb') as fin:
- a2bin = list(fin.read())
- hdr = a2bin[:4]
- bin = a2bin[4:]
-assert len(bin) == 0x9300
-
-# file was constructed from a memory dump after copy protected loader ran
-# after loading at 0x0300:
-# [0x0300, 0x0a00) is not used except for a jump to crack loader at 0x3f00
-# [0x0a00, 0x2000) is program
-# [0x2000, 0x4000) is hi-res screen 0 which is reused by the crack loader:
-# [0x2000, 0x27ed) is end of program which is copied to 0x9600
-# [0x27ed, 0x3200) is junk copied after end of program at 0x9ded
-# [0x3200, 0x3c00) is junk copied to end of memory at 0xb600
-# [0x3c00, 0x3f00) is junk copied to start of memory at 0x0000, except:
-# [0x3c20, 0x3c22) is vec_start (duplicated in crack loader, kept anyway)
-# [0x3c22, 0x3c24) is vec_init_game
-# [0x3c24, 0x3c26) is vec_start_game
-# [0x3c28, 0x3c2a) is vec_calculate_object_shape
-# [0x3c4e, 0x3c50) is vec_draw_miscellaneous_from_table
-# [0x3e00, 0x3e02) is unknown vector, maybe collide with a certain object
-# [0x3f00, 0x4000) is junk except the crack loader at [0x3f00, 0x3f79)
-# [0x4000, 0x8c08) is program
-# [0x8c08, 0x8e00) is junk which I think is from the shape editor he used
-# [0x8e00, 0x9600) is program
-
-vec_start = bin[0x3920:0x3922] # [0x3c20, 0x3c22)
-vec_init_game = bin[0x3922:0x3924] # [0x3c22, 0x3c24)
-vec_start_game = bin[0x3924:0x3926] # [0x3c24, 0x3c26)
-vec_calculate_objct_shape = bin[0x3928:0x392a] # [0x3c28, 0x3c2a)
-vec_draw_miscellaneous_from_table = bin[0x394e:0x3950] # [0x3c4e, 0x3c50)
-vec_unknown = bin[0x3b00:0x3b02] # [0x3e00, 0x3e02)
-
-bin[0x0003:0x0700] = [fill_value] * 0x06fd # [0x0300, 0x0a00)
-bin[0x24ed:0x3c00] = [fill_value] * 0x1713 # [0x27ed, 0x3f00)
-bin[0x3c79:0x3d00] = [fill_value] * 0x0087 # [0x3f79, 0x4000)
-bin[0x8908:0x8b00] = [fill_value] * 0x01f8 # [0x8c08, 0x8e00)
-
-bin[0x3920:0x3922] = vec_start # [0x3c20, 0x3c22)
-bin[0x3922:0x3924] = vec_init_game # [0x3c22, 0x3c24)
-bin[0x3924:0x3926] = vec_start_game # [0x3c24, 0x3c26)
-bin[0x3928:0x392a] = vec_calculate_objct_shape # [0x3c28, 0x3c2a)
-bin[0x394e:0x3950] = vec_draw_miscellaneous_from_table # [0x3c4e, 0x3c50)
-bin[0x3b00:0x3b02] = vec_unknown # [0x3e00, 0x3e00)
-
-with open(out_a2bin, 'wb') as fout:
- fout.write(bytes(hdr + bin))
+++ /dev/null
- .r65c02
-
- .area zpage
- .setdp
-
- .ds 80
-src: .ds 2 ; address of last byte read
-dest: .ds 2 ; address of next byte to write
-count: .ds 2 ; count of bit buffer refills to do
-bits: .ds 1 ; bit buffer (highest 1 = sentinel)
-len: .ds 1 ; length
-dist: .ds 2 ; distance, or address of repeated data
-
- .area text
-
- cld
-
- lda #0
- sta src
- lda #0
- sta src + 1
-
- lda #0
- sta dest
- lda #0
- sta dest + 1
-
- lda #0
- sta count
- lda #0
- sta count + 1
-
- lda #0
- sta bits
- clc
-
- ldy #0
- ; optimization: the first byte has to be literal
- ;beq loop
-
-literal:
- lda src
- bne 0$
- dec src + 1
-0$: dec src
-
- lda [src],y
- sta [dest],y
-
- lda dest
- bne 1$
- dec dest + 1
-1$: dec dest
-
-loop: ;clc
- ror bits
- bne literal_or_pointer
-
- inc count
- bne 0$
- inc count + 1
- bne 0$
- jmp 0
-
-0$: lda src
- bne 1$
- dec src + 1
-1$: dec src
-
- lda [src],y
- ;sec
- ror a
- sta bits
-
-literal_or_pointer:
- ; cf=0 literal, cf=1 pointer
- bcc literal
-
- ; pointer
- clc
- ror bits
- bne short_or_long_pointer
-
- lda src
- bne 0$
- dec src + 1
-0$: dec src
-
- lda [src],y
- ;sec
- ror a
- sta bits
-
-short_or_long_pointer:
- ; cf=0 short pointer, cf=1 long pointer
- ; take source byte (short pointer or high of long pointer)
- lda src
- bne 0$
- dec src + 1
-0$: dec src
-
- lda [src],y
- bcs long_pointer
-
- ; short pointer, lddddddd
- sty dist + 1 ; 0
- bpl 1$
- and #0x7f
- iny
-1$: sta dist
-
- bcc pointer
-
-long_pointer:
- ; high of long pointer, lllllldd
- tax
- and #3
- sta dist + 1
-
- lda src
- bne 0$
- dec src + 1
-0$: dec src
-
- lda [src],y
- sta dist
-
- txa
- lsr a
- lsr a
- tay
-
-pointer: ; dist set up, y = len - 2
- iny
- iny
- sty len
-
- ; dest -= len
- sec
- lda dest
- sbc len
- sta dest
- bcs 0$
- dec dest + 1
-
- ; dist += dest + 1
- sec
-0$: ;lda dest
- adc dist
- sta dist
- lda dest + 1
- adc dist + 1
- sta dist + 1
-
-1$: lda [dist],y
- sta [dest],y
- dey
- bne 1$
- beq loop ; rely on cf = 0 here
+++ /dev/null
-#!/usr/bin/env python3
-
-import sys
-
-EXIT_SUCCESS = 0
-EXIT_FAILURE = 1
-
-if len(sys.argv) < 4:
- print(f'usage: {sys.argv[0]:s} recrack_loader.a2bin in.a2bin out.a2bin')
- sys.exit(EXIT_FAILURE)
-recrack_loader_bin = sys.argv[1]
-in_a2bin = sys.argv[2]
-out_a2bin = sys.argv[3]
-
-with open(recrack_loader_bin, 'rb') as fin:
- recrack_loader = list(fin.read())
-
-with open(in_a2bin, 'rb') as fin:
- a2bin = list(fin.read())
- hdr = a2bin[:4]
- bin = a2bin[4:]
-load_addr = hdr[0] | (hdr[1] << 8)
-load_size = hdr[2] | (hdr[3] << 8)
-assert load_size == len(bin)
-
-assert load_size == 0x9300
-entry_point = 0x9ded
-
-bin = (
- [0x4c, 0xed, 0x9d] + # jmp 0x9ded, end of image
- bin[0x0a00 - load_addr:0x2000 - load_addr] + # [0x0a00, 0x2000)
- [0] * 0x2000 + # [0x2000, 0x4000)
- bin[0x4000 - load_addr:0x9600 - load_addr] + # [0x4000, 0x9600)
- bin[0x2000 - load_addr:0x27ed - load_addr] + # [0x9600, 0x9ded)
- recrack_loader
-)
-load_addr = 0x09fd
-load_size = len(bin)
-
-hdr = [load_addr & 0xff, load_addr >> 8, load_size & 0xff, load_size >> 8]
-
-with open(out_a2bin, 'wb') as fout:
- fout.write(bytes(hdr + bin))
+++ /dev/null
-vec_start = 0x20
-start = 0x17d1
-
-vec_init_game = 0x22
-init_game = 0x1708
-
-vec_start_game = 0x24
-start_game = 0x171b
-
-vec_calculate_object_shape = 0x28
-calculate_object_shape = 0x0d6c
-
-vec_draw_misc_from_table = 0x4e
-draw_misc_from_table = 0x1d1c
-
-vec_restart = 0x0200
-restart = 0x1999
-
- .r65c02
-
- .area text
-
- cld
- ldx #0xff
- txs
-
- ; this doesn't seem to be referenced after start
- ;lda #<start
- ;sta vec_start
- ;lda #>start
- ;sta vec_start + 1
-
- lda #<init_game
- sta vec_init_game
- lda #>init_game
- sta vec_init_game + 1
-
- lda #<start_game
- sta vec_start_game
- lda #>start_game
- sta vec_start_game + 1
-
- lda #<calculate_object_shape
- sta vec_calculate_object_shape
- lda #>calculate_object_shape
- sta vec_calculate_object_shape + 1
-
- lda #<draw_misc_from_table
- sta vec_draw_misc_from_table
- lda #>draw_misc_from_table
- sta vec_draw_misc_from_table + 1
-
- lda #<restart
- sta vec_restart
- lda #>restart
- sta vec_restart + 1
-
- jmp start