First cut at making a2_pack.py support language card
authorNick Downing <nick@ndcode.org>
Wed, 22 Jun 2022 01:05:08 +0000 (11:05 +1000)
committerNick Downing <nick@ndcode.org>
Wed, 22 Jun 2022 01:16:46 +0000 (11:16 +1000)
disasm/Makefile
disasm/star_blazer.asm.patch
loader/a2_pack.py
loader/star_blazer_segments.txt

index 9564fba..5623b4b 100644 (file)
@@ -3,7 +3,7 @@ DOS33=../dos33fsprogs/utils/dos33fs-utils/dos33
 AS6500=../asxv5pxx/asxmak/linux/exe/as6500
 ASLINK=../asxv5pxx/asxmak/linux/exe/aslink
 
-LZSS_LOADER=0x800
+LOAD_ADDR=0x800
 
 .PHONY: all
 all: \
@@ -19,22 +19,16 @@ shape4.png \
 shape5.png \
 shape6.png
 
-star_blazer.dsk: ../util/bootable.dsk star_blazer_lzss.a2bin
+star_blazer.dsk: ../util/bootable.dsk star_blazer_pack_rev.a2bin
        cp ../util/bootable.dsk $@
-       ${DOS33} $@ SAVE B star_blazer_lzss.a2bin "STAR BLAZER LZSS"
+       ${DOS33} $@ SAVE B star_blazer_pack_rev.a2bin "STAR BLAZER PACK REV"
 
-star_blazer_lzss.a2bin: \
-star_blazer.a2bin \
-../loader/lzss_loader.bin \
-../loader/star_blazer_recrack_lzss.a2bin
-       ../loader/lzss_encode.py ${LZSS_LOADER} ../loader/lzss_loader.bin $< $@
-       -diff -q ../loader/star_blazer_recrack_lzss.a2bin $@
-
-star_blazer.a2bin: \
+star_blazer_pack_rev.a2bin: \
 star_blazer.ihx \
-../loader/star_blazer_recrack.a2bin
-       ./a2_hex2bin.py $< $@
-       -diff -q ../loader/star_blazer_recrack.a2bin $@
+../loader/lzss_unpack_rev.bin \
+../loader/star_blazer_pack_rev.a2bin
+       ../loader/a2_pack.py ${LOAD_ADDR} ../loader/lzss_unpack_rev.bin $< $@
+       -diff -q ../loader/star_blazer_pack_rev.a2bin $@
 
 star_blazer.ihx: star_blazer.rel
        # add for DHGR: -b data1=0xd000
@@ -42,9 +36,12 @@ star_blazer.ihx: star_blazer.rel
 -b zpage=0 \
 -b udata0=0x200 \
 -b udata1=0x400 \
--b text=0x9fd \
+-b text=0xa00 \
 -b data0=0x4000 \
+-b data1=0xd000 \
 $@ $<
+       # hack for now: insert start linear address record
+       sed -e 's/^:00000001FF/:04000005000017D10F\n&/' -i star_blazer.ihx
 
 star_blazer.rel: \
 star_blazer.asm \
index e514d05..cbb5d54 100644 (file)
@@ -1,15 +1,15 @@
---- star_blazer.asm0   2022-06-20 17:46:09.264188937 +1000
-+++ star_blazer.asm    2022-06-20 17:49:28.980190983 +1000
+--- star_blazer.asm0   2022-06-22 10:57:12.584038329 +1000
++++ star_blazer.asm    2022-06-22 11:03:50.524042406 +1000
 @@ -1,3 +1,8 @@
-+ALIGN = 1
-+DHGR = 0
++ALIGN = 0
++DHGR = 1
 +PIXEL_SHAPE = 0
 +SHAPE = 1
 +
  hires_screen = 0x2000                 ; 2000
  hw_kbd = 0xc000                               ; c000
  hw_kbdstrb = 0xc010                   ; c010
-@@ -12,6 +17,34 @@
+@@ -12,19 +17,47 @@
  hw_ptrig = 0xc070                     ; c070
  rom_pread = 0xfb1e                    ; fb1e
  
        .area   zpage
  
        .ds     0x22                    ; 0000
+ vec_init_game:
+-      .ds     2                       ; 0022 rw
++      .dw     init_game               ; 0022 rw
+ vec_start_game:
+-      .ds     2                       ; 0024 rw
++      .dw     start_game              ; 0024 r
+       .ds     2                       ; 0026
+ vec_calculate_object_shape:
+-      .ds     2                       ; 0028 rw
++      .dw     calculate_object_shape  ; 0028 r
+       .ds     0x24                    ; 002a
+ vec_draw_misc_from_table:
+-      .ds     2                       ; 004e rw
++      .dw     draw_misc_from_table    ; 004e r
+       .ds     0x30                    ; 0050
+ half_dimension:
+       .ds     1                       ; 0080 rw
 @@ -48,6 +81,14 @@
  draw_y:       .ds     1                       ; 008a rw
  video_line_ptr:
  draw_misc_mask:
        .ds     1                       ; 008d rw
  draw_misc_mask_temp:
-@@ -188,6 +229,7 @@
+@@ -159,7 +200,7 @@
+       .area   udata0
+ vec_restart:
+-      .ds     2                       ; 0200 rw
++      .dw     restart                 ; 0200 r
+       .area   udata1
+@@ -188,8 +229,8 @@
        .ds     0x70                    ; 0780 rw
  
        .area   text
 +text_start:
  
-       jmp     recrack_loader          ; -> 09fd -> 9ded r
+-      jmp     recrack_loader          ; -> 09fd -> 9ded r
  sign_extend_a_to_ya:
-@@ -1072,7 +1114,7 @@
+       cmp     #0x80                   ; 0abc,0adc,133f,1366,1382,145b,1485 -> 0a00 -> 0a02 r a=00..ff
+       ldy     #0x00                   ; 0a00 -> 0a02 -> 0a04 r
+@@ -1072,7 +1113,7 @@
        tsx                             ; 1095 -> 1097 -> 1098 r
        stx     *microcode_sp           ; 1097 -> 1098 -> 109a r
        ldx     *microcode_object_c9    ; 1098 -> 109a -> 109c r
        sta     *microcode_object_cc    ; 109c -> 109f -> 10a1 r
  loc_10a1:
        ldy     #0x00                   ; 1090,109f -> 10a1 -> 10a3 r
-@@ -1099,7 +1141,7 @@
+@@ -1099,7 +1140,7 @@
        jsr     do_microcode_test1      ; 10c6 -> 10c8 -> 106a r s=f7..f9,02
        bne     3$                      ; 107b -> 10cb -> 10c0 r z=0
  loc_10cd:
        rts                             ; 10cd -> 10d0 -> 123e,143a,1615,1629,1633,1649,165b,1759 r s=f7..fd,02
  sub_10d1:
        beq     rts_10ec                ; 1216,123b,1260,1285 -> 10d1 -> 10d3,10ec r z=0..1
-@@ -1985,6 +2027,9 @@
+@@ -1985,6 +2026,9 @@
        bit     *vec_draw_misc_from_table ; 17d1 -> 17d4 -> 17d6 r
        ora     hw_pb1                  ; 17d4 -> 17d6 -> 17d9 r
        bpl     1$                      ; 17d6 -> 17d9 -> 17f2 r n=0
        ldx     #0x01                   ; 17db r
  0$:   jsr     rom_pread               ; 17dd r
        cpy     #0xff                   ; 17e0 r
-@@ -1995,18 +2040,14 @@
+@@ -1995,18 +2039,14 @@
        sta     bvar_179e               ; 17e9 r
        sta     bvar_17a3               ; 17ec r
        sta     bvar_1e0e               ; 17ef r
 +.endif
 +      jmp     [vec_init_game]         ; 17d9 -> 17f2 -> 1708 r
 +.if ALIGN
-+      .ds     0x1800 - 0x9fd - (. - text_start)
++      .ds     0x1800 - 0xa00 - (. - text_start)
 +.endif
  divide_a_by_y:
        sta     *accumulator + 1        ; 0a90,0aa0,0ab5,0ad5 -> 1800 -> 1802 r
        lda     #0x00                   ; 1800 -> 1802 -> 1804 r
-@@ -2071,10 +2112,12 @@
+@@ -2071,10 +2111,12 @@
        lda     *result + 1             ; 186e r
        ldy     *result + 2             ; 1870 r
        rts                             ; 1872 r
  random_init:
        lda     *random_seed            ; 16ae -> 187a -> 187c r
        ora     #0x01                   ; 187a -> 187c -> 187e r
-@@ -2233,16 +2276,31 @@
+@@ -2233,16 +2275,31 @@
        ldx     #>hires_screen          ; 199b -> 199d -> 199f r
        stx     *video_line_ptr + 1     ; 199d -> 199f -> 19a1 r
        tay                             ; 199f -> 19a1 -> 19a2 r
        rts                             ; 19b5 -> 19b8 -> 1713 r s=fd
  video_clear_rectangle:
        ldx     *clip_y0                ; 1064 -> 19b9 -> 19bb r
-@@ -2252,7 +2310,13 @@
+@@ -2252,7 +2309,13 @@
        sta     *video_line_ptr + 1     ; 19c0 -> 19c3 -> 19c5 r
        ldy     *clip_x0                ; 19c3 -> 19c5 -> 19c7 r
        lda     #0x00                   ; 19c5 -> 19c7 -> 19c9 r
        iny                             ; 19c9 -> 19cb -> 19cc r
        cpy     *clip_x1                ; 19cb -> 19cc -> 19ce r y=6d..94
        bcc     1$                      ; 19cc -> 19ce -> 19c9,19d0 r c=0..1
-@@ -2300,6 +2364,7 @@
+@@ -2300,6 +2363,7 @@
        sta     object1080_y0 - 0x10,x  ; 1a1b -> 1a1e -> 1a21 r x=10..7f
        adc     #0x01                   ; 1a1e -> 1a21 -> 1a23 r c=0..1 d=0
        sta     object1080_y1 - 0x10,x  ; 1a21 -> 1a23 -> 1a26 r x=10..7f
        rts                             ; 1a23 -> 1a26 -> 1076,1179,1602 r s=f1..f9,02
  pixel_data_table_left:
        .db     0x83                    ; 1a27 r
-@@ -2382,14 +2447,17 @@
+@@ -2382,14 +2446,17 @@
        lda     object1080_onscreen_shape_ptr_hi - 0x10,x ; 1aa5 -> 1aa7 -> 1aaa r x=20..4f
        ora     [*video_line_ptr],y     ; 1aa7 -> 1aaa -> 1aac r y=6d..93,02
        sta     [*video_line_ptr],y     ; 1aaa -> 1aac -> 1aae r y=6d..93,02
        lda     object1080_y0 - 0x10,x  ; 1ab9 -> 1abb -> 1abe r x=14..77
        cmp     object1080_y1 - 0x10,x  ; 1abb -> 1abe -> 1ac1 r a=11..d4 x=14..77
        bcs     rts_1aae                ; 1abe -> 1ac1 -> 1ac3 r c=0
-@@ -2453,8 +2521,14 @@
+@@ -2453,8 +2520,14 @@
        cmp     *draw_x1                ; 1b49 -> 1b4b -> 1b4d r a=94
        bcc     8$                      ; 1b4b -> 1b4d -> 1b4f,1b83 r c=0..1
        lda     object1080_onscreen_shape_ptr_lo - 0x10,x ; 1b4d -> 1b4f -> 1b52 r x=14..77
        sta     7$ + 1                  ; 1b55 -> 1b58 -> 1b5b r
        ldx     #0x00                   ; 1b58 -> 1b5b -> 1b5d r
        ldy     *draw_y                 ; 1b5b -> 1b5d -> 1b5f r
-@@ -2463,7 +2537,17 @@
+@@ -2463,7 +2536,17 @@
        lda     video_line_table_hi - 0x20,y ; 1b62 -> 1b64 -> 1b67 r y=28..cf
        sta     *video_line_ptr + 1     ; 1b64 -> 1b67 -> 1b69 r
        ldy     *draw_x0                ; 1b67 -> 1b69 -> 1b6b r
  7$:   .dw     shape_12_exhaust0 + 0x12 ; 1b6c rw
        ora     [*video_line_ptr],y     ; 1b6b -> 1b6e -> 1b70 r y=6c..93
        sta     [*video_line_ptr],y     ; 1b6e -> 1b70 -> 1b72 r y=6c..93
-@@ -2479,14 +2563,23 @@
+@@ -2479,14 +2562,23 @@
        rts                             ; 1b80 -> 1b82 -> 15cd r s=fb
  8$:   inc     object1080_onscreen_clipped - 0x10,x ; 1b3b,1b41,1b47,1b4d -> 1b83 -> 1b86 r x=14..77
        lda     object1080_onscreen_shape_ptr_lo - 0x10,x ; 1b83 -> 1b86 -> 1b89 r x=14..77
        sta     *video_line_ptr + 1     ; 1b9b -> 1b9e -> 1ba0 r
        ldy     *draw_x0                ; 1b9e -> 1ba0 -> 1ba2 r
  10$:  lda     *draw_y                 ; 1ba0,1bbf -> 1ba2 -> 1ba4 r
-@@ -2498,11 +2591,23 @@
+@@ -2498,11 +2590,23 @@
        bcc     12$                     ; 1bac -> 1bae -> 1bb0,1bbb r c=0..1
        cpy     *clip_x1                ; 1bae -> 1bb0 -> 1bb2 r y=6c..a4
        bcs     12$                     ; 1bb0 -> 1bb2 -> 1bb4,1bbb r c=0..1
        iny                             ; 1bbb -> 1bbc -> 1bbd r
        cpy     *draw_x1                ; 1bbc -> 1bbd -> 1bbf r y=5c..a5
        bcc     10$                     ; 1bbd -> 1bbf -> 1ba2,1bc1 r c=0..1
-@@ -2511,6 +2616,7 @@
+@@ -2511,6 +2615,7 @@
        cpy     *draw_y1                ; 1bc3 -> 1bc5 -> 1bc7 r y=12..d9
        bcc     9$                      ; 1bc5 -> 1bc7 -> 1b96,1bc9 r c=0..1
        ldx     *x_save                 ; 1bc7 -> 1bc9 -> 1bcb r
        rts                             ; 1bc9 -> 1bcb -> 15cd r s=fb
  erase_pixel_object:
        lda     #0x00                   ; 1c12 -> 1bcc -> 1bce r
-@@ -2542,12 +2648,15 @@
+@@ -2542,12 +2647,15 @@
        eor     #0xff                   ; 1c03 -> 1c06 -> 1c08 r
        and     [*video_line_ptr],y     ; 1c06 -> 1c08 -> 1c0a r y=6d..93,02
        sta     [*video_line_ptr],y     ; 1c08 -> 1c0a -> 1c0c r y=6d..93,02
        lda     #0x00                   ; 1c12 -> 1c14 -> 1c16 r
        sta     object1080_onscreen - 0x10,x ; 1c14 -> 1c16 -> 1c19 r x=14..77
        lda     object1080_onscreen_x0 - 0x10,x ; 1c16 -> 1c19 -> 1c1c r x=14..77
-@@ -2562,8 +2671,14 @@
+@@ -2562,8 +2670,14 @@
        stx     *x_save                 ; 1c2d -> 1c30 -> 1c32 r
        bne     3$                      ; 1c30 -> 1c32 -> 1c34,1c6a r z=0..1
        lda     object1080_onscreen_shape_ptr_lo - 0x10,x ; 1c32 -> 1c34 -> 1c37 r x=14..77
        sta     2$ + 1                  ; 1c3a -> 1c3d -> 1c40 r
        ldx     #0x00                   ; 1c3d -> 1c40 -> 1c42 r
        ldy     *draw_y                 ; 1c40 -> 1c42 -> 1c44 r
-@@ -2572,7 +2687,18 @@
+@@ -2572,7 +2686,18 @@
        lda     video_line_table_hi - 0x20,y ; 1c47 -> 1c49 -> 1c4c r y=28..cf
        sta     *video_line_ptr + 1     ; 1c49 -> 1c4c -> 1c4e r
        ldy     *draw_x0                ; 1c4c -> 1c4e -> 1c50 r
  2$:   .dw     shape_12_exhaust0 + 6   ; 1c51 rw
        eor     #0xff                   ; 1c50 -> 1c53 -> 1c55 r
        and     [*video_line_ptr],y     ; 1c53 -> 1c55 -> 1c57 r y=6c..93
-@@ -2588,14 +2714,23 @@
+@@ -2588,14 +2713,23 @@
        ldx     *x_save                 ; 1c65 -> 1c67 -> 1c69 r
        rts                             ; 1c67 -> 1c69 -> 1076,16a8 r s=f3..f9,02
  3$:   lda     object1080_onscreen_shape_ptr_lo - 0x10,x ; 1c32 -> 1c6a -> 1c6d r x=14..77
        sta     *video_line_ptr + 1     ; 1c7f -> 1c82 -> 1c84 r
        ldy     *draw_x0                ; 1c82 -> 1c84 -> 1c86 r
  5$:   lda     *draw_y                 ; 1c84,1ca5 -> 1c86 -> 1c88 r
-@@ -2607,12 +2742,25 @@
+@@ -2607,12 +2741,25 @@
        bcc     7$                      ; 1c90 -> 1c92 -> 1c94,1ca1 r c=0..1
        cpy     *clip_x1                ; 1c92 -> 1c94 -> 1c96 r y=6c..a4
        bcs     7$                      ; 1c94 -> 1c96 -> 1c98,1ca1 r c=0..1
        iny                             ; 1ca1 -> 1ca2 -> 1ca3 r
        cpy     *draw_x1                ; 1ca2 -> 1ca3 -> 1ca5 r y=5c..a5
        bcc     5$                      ; 1ca3 -> 1ca5 -> 1c86,1ca7 r c=0..1
-@@ -2626,8 +2774,17 @@
+@@ -2626,8 +2773,17 @@
        stx     *x_save                 ; 1db0 -> 1cb2 -> 1cb4 r
        tay                             ; 1cb2 -> 1cb4 -> 1cb5 r
        lda     shape_data_ptr_lo,y     ; 1cb4 -> 1cb5 -> 1cb8 r y=16..ff
        sta     3$ + 1                  ; 1cbb -> 1cbe -> 1cc1 r
        lda     shape_width_bytes,y     ; 1cbe -> 1cc1 -> 1cc4 r y=16..ff
        clc                             ; 1cc1 -> 1cc4 -> 1cc5 r
-@@ -2636,6 +2793,11 @@
+@@ -2636,6 +2792,11 @@
        lda     *draw_x0                ; 1cc7 -> 1cc9 -> 1ccb r
        lsr     a                       ; 1cc9 -> 1ccb -> 1ccc r
        bcc     0$                      ; 1ccb -> 1ccc -> 1cce,1cd4 r c=0..1
        lda     *draw_misc_mask         ; 1ccc -> 1cce -> 1cd0 r
        eor     *draw_misc_mask_xor     ; 1cce -> 1cd0 -> 1cd2 r
        sta     *draw_misc_mask         ; 1cd0 -> 1cd2 -> 1cd4 r
-@@ -2651,6 +2813,10 @@
+@@ -2651,6 +2812,10 @@
        lda     video_line_table_hi,y   ; 1ce5 -> 1ce7 -> 1cea r y=00..bc
        adc     #0x00                   ; 1ce7 -> 1cea -> 1cec r c=0..1 d=0
        sta     *video_line_ptr + 1     ; 1cea -> 1cec -> 1cee r
        lda     *draw_misc_mask         ; 1cec -> 1cee -> 1cf0 r
        sta     *draw_misc_mask_temp    ; 1cee -> 1cf0 -> 1cf2 r
        ldy     *draw_x0                ; 1cf0 -> 1cf2 -> 1cf4 r
-@@ -2659,13 +2825,30 @@
+@@ -2659,13 +2824,30 @@
        bcs     4$                      ; 1cf6 -> 1cf8 -> 1cfa r c=0
        cpy     #0x28                   ; 1cf8 -> 1cfa -> 1cfc r y=00..2d
        bcs     4$                      ; 1cfa -> 1cfc -> 1cfe,1d05 r c=0..1
        inx                             ; 1d09 -> 1d0b -> 1d0c r
        iny                             ; 1d0b -> 1d0c -> 1d0d r
        cpy     *draw_x1                ; 1d0c -> 1d0d -> 1d0f r y=01..2e
-@@ -2686,7 +2869,7 @@
+@@ -2686,7 +2868,7 @@
        asl     a                       ; 1d23 -> 1d24 -> 1d25 r
        sta     *draw_misc_ptr          ; 1d24 -> 1d25 -> 1d27 r
        lda     #0x00                   ; 1d25 -> 1d27 -> 1d29 r
        sta     *draw_misc_ptr + 1      ; 1d29 -> 1d2b -> 1d2d r
        lda     *half_dimension         ; 1d2b -> 1d2d -> 1d2f r
        lsr     a                       ; 1d2d -> 1d2f -> 1d30 r
-@@ -2695,6 +2878,12 @@
+@@ -2695,6 +2877,12 @@
        lsr     a                       ; 1d31 -> 1d32 -> 1d33 r
        lsr     a                       ; 1d32 -> 1d33 -> 1d34 r
        tay                             ; 1d33 -> 1d34 -> 1d35 r
        lda     draw_misc_mask_table,y  ; 1d34 -> 1d35 -> 1d38 r y=00..06
        sta     *draw_misc_mask         ; 1d35 -> 1d38 -> 1d3a r
        lda     draw_misc_mask_xor_table,y ; 1d38 -> 1d3a -> 1d3d r y=00..06
-@@ -2771,6 +2960,62 @@
+@@ -2771,6 +2959,62 @@
        ldy     *draw_misc_y_save       ; 1d1b -> 1db3 -> 1db5 r
  rts_1db5:
        rts                             ; 1da1,1db3 -> 1db5 -> 1076,1d61,1d7d,1d82,1d87 r s=ee..f7
  draw_misc_mask_table:
        .db     0xff                    ; 1db6 r
        .db     0x00                    ; 1db7 r
-@@ -2781,72 +3026,18 @@
+@@ -2781,72 +3025,18 @@
        .db     0xd5                    ; 1dbc r
        .db     0xff                    ; 1dbd r
  draw_misc_mask_xor_table:
 +      .db     0xff ^ 0xff ;0x00                       ; 1dc5 r
 +.endif
 +.if ALIGN
-+      .ds     0x1e00 - 0x9fd - (. - text_start)
++      .ds     0x1e00 - 0xa00 - (. - text_start)
 +.endif
  sub_1e00:
        jmp     loc_1e2a                ; 15dc -> 1e00 -> 1e2a r
  test_player_fire:
-@@ -3005,77 +3196,7 @@
+@@ -3005,77 +3195,8 @@
        adc     #0x01                   ; 1f32 -> 1f33 -> 1f35 r c=0 d=0
        sta     object1080_velocity_x_hi + 0x50 ; 1f33 -> 1f35 -> 1f38 r
        rts                             ; 1f35 -> 1f38 -> 15df r s=f9
 -      .db     0x00                    ; 1f7d
 -      .db     0x00                    ; 1f7e
 -      .db     0x00                    ; 1f7f
-+      .ds     0x1f80 - 0x9fd - (. - text_start)
++.ifeq DHGR
++      .ds     0x1f80 - 0xa00 - (. - text_start)
  barr_1f80:
        .db     0x43                    ; 1f80 r
        .db     0x02                    ; 1f81 r
-@@ -3214,7 +3335,17 @@
+@@ -3212,9 +3333,20 @@
+       .db     0x00                    ; 1ffd r
+       .db     0x00                    ; 1ffe r
        .db     0x00                    ; 1fff r
++.endif
  
        .area   data0
 -
  shape_data_ptr_lo:
        .db     <shape_23_bomb3 + 0x28  ; 4000 r
        .db     <shape_23_bomb3 + 0x28  ; 4001 r
-@@ -4757,6 +4888,9 @@
+@@ -4757,6 +4889,9 @@
        .db     0x01                    ; 45fd r
        .db     0x01                    ; 45fe r
        .db     0x04                    ; 45ff r
  draw_misc_table:
        .db     0x01                    ; 4600 r
        .db     0x07                    ; 4601 r
-@@ -9432,6 +9566,15 @@
+@@ -9432,6 +9567,15 @@
        .dw     0x0000                  ; 5bfa r
        .dw     0x0000                  ; 5bfc r
        .dw     0x0000                  ; 5bfe r
  shape_20_bomb0:
        .db     0x5c                    ; 5c00 r
        .db     0x02                    ; 5c01 r
-@@ -21852,510 +21995,12 @@
+@@ -21852,510 +21996,12 @@
        .db     0xe0                    ; 8c05 r
        .db     0x83                    ; 8c06 r
        .db     0x9e                    ; 8c07 r
  microcode_table_5560_data_8e00:
        .db     0x30                    ; 8e00 r
        .db     0x0f                    ; 8e01
-@@ -26951,8 +26596,16 @@
-       lda     #>restart               ; 9e16 r
-       sta     vec_restart + 1         ; 9e18 r
-       jmp     start                   ; 9e1b r
-+data_end:
+@@ -26926,33 +26572,156 @@
+       .db     0x7c                    ; 9dea
+       .db     0x98                    ; 9deb
+       .db     0x00                    ; 9dec
+-recrack_loader:
+-      cld                             ; 09fd -> 9ded -> r
+-      ldx     #0xff                   ; 9dee r
+-      txs                             ; 9df0 r
+-      lda     #<init_game             ; 9df1 r
+-      sta     *vec_init_game          ; 9df3 r
+-      lda     #>init_game             ; 9df5 r
+-      sta     *vec_init_game + 1      ; 9df7 r
+-      lda     #<start_game            ; 9df9 r
+-      sta     *vec_start_game         ; 9dfb r
+-      lda     #>start_game            ; 9dfd r
+-      sta     *vec_start_game + 1     ; 9dff r
+-      lda     #<calculate_object_shape ; 9e01 r
+-      sta     *vec_calculate_object_shape ; 9e03 r
+-      lda     #>calculate_object_shape ; 9e05 r
+-      sta     *vec_calculate_object_shape + 1 ; 9e07 r
+-      lda     #<draw_misc_from_table  ; 9e09 r
+-      sta     *vec_draw_misc_from_table ; 9e0b r
+-      lda     #>draw_misc_from_table  ; 9e0d r
+-      sta     *vec_draw_misc_from_table + 1 ; 9e0f r
+-      lda     #<restart               ; 9e11 r
+-      sta     vec_restart             ; 9e13 r
+-      lda     #>restart               ; 9e16 r
+-      sta     vec_restart + 1         ; 9e18 r
+-      jmp     start                   ; 9e1b r
  
 -      .area   udata2
++.if DHGR
++      .ds     0xf100 - 0xd000 - (. - data1_start)
++barr_1f80:
++      .db     0x43                    ; 1f80 r
++      .db     0x02                    ; 1f81 r
++      .db     0x0a                    ; 1f82 r
++      .db     0x10                    ; 1f83 r
++      .db     0x06                    ; 1f84 r
++      .db     0xa0                    ; 1f85 r
++      .db     0x01                    ; 1f86 r
++      .db     0x04                    ; 1f87 r
++      .db     0x03                    ; 1f88 r
++      .db     0x08                    ; 1f89 r
++      .db     0x08                    ; 1f8a r
++      .db     0x18                    ; 1f8b r
++      .db     0x08                    ; 1f8c r
++      .db     0x18                    ; 1f8d r
++      .db     0x18                    ; 1f8e r
++      .db     0x18                    ; 1f8f r
++barr_1f90:
++      .db     0x00                    ; 1f90 r
++      .db     0xff                    ; 1f91 r
++      .db     0x11                    ; 1f92 r
++      .db     0x60                    ; 1f93 r
++      .db     0x08                    ; 1f94 r
++      .db     0x01                    ; 1f95 r
++      .db     0x30                    ; 1f96 r
++      .db     0xa1                    ; 1f97 r
++      .db     0x40                    ; 1f98 r
++      .db     0x10                    ; 1f99 r
++      .db     0x10                    ; 1f9a r
++      .db     0x21                    ; 1f9b r
++      .db     0x30                    ; 1f9c r
++      .db     0x31                    ; 1f9d r
++      .db     0x49                    ; 1f9e r
++      .db     0x61                    ; 1f9f r
++barr_1fa0:
++      .db     0xab                    ; 1fa0 r
++      .db     0x80                    ; 1fa1 r
++      .db     0xff                    ; 1fa2 r
++      .db     0x00                    ; 1fa3 r
++      .db     0x08                    ; 1fa4 r
++      .db     0x01                    ; 1fa5 r
++      .db     0x00                    ; 1fa6 r
++      .db     0x00                    ; 1fa7 r
++      .db     0xf8                    ; 1fa8 r
++      .db     0xb0                    ; 1fa9 r
++      .db     0xa9                    ; 1faa r
++      .db     0xff                    ; 1fab r
++      .db     0xfc                    ; 1fac r
++      .db     0xfe                    ; 1fad r
++      .db     0xfd                    ; 1fae r
++      .db     0xfc                    ; 1faf r
++barr_1fb0:
++      .db     0xff                    ; 1fb0 r
++      .db     0xff                    ; 1fb1 r
++      .db     0xff                    ; 1fb2 r
++      .db     0xff                    ; 1fb3 r
++      .db     0x18                    ; 1fb4 r
++      .db     0xff                    ; 1fb5 r
++      .db     0xff                    ; 1fb6 r
++      .db     0xff                    ; 1fb7 r
++      .db     0x10                    ; 1fb8 r
++      .db     0xff                    ; 1fb9 r
++      .db     0xff                    ; 1fba r
++      .db     0xff                    ; 1fbb r
++      .db     0xff                    ; 1fbc r
++      .db     0xff                    ; 1fbd r
++      .db     0xff                    ; 1fbe r
++      .db     0xff                    ; 1fbf r
++barr_1fc0:
++      .db     0x04                    ; 1fc0 r
++      .db     0x04                    ; 1fc1 r
++      .db     0x06                    ; 1fc2 r
++      .db     0x02                    ; 1fc3 r
++      .db     0x08                    ; 1fc4 r
++      .db     0x02                    ; 1fc5 r
++      .db     0x10                    ; 1fc6 r
++      .db     0x02                    ; 1fc7 r
++      .db     0x08                    ; 1fc8 r
++      .db     0x04                    ; 1fc9 r
++      .db     0x04                    ; 1fca r
++      .db     0x02                    ; 1fcb r
++      .db     0x06                    ; 1fcc r
++      .db     0x02                    ; 1fcd r
++      .db     0x02                    ; 1fce r
++      .db     0x02                    ; 1fcf r
++barr_1fd0:
++      .db     0x00                    ; 1fd0 r
++      .db     0x00                    ; 1fd1 r
++      .db     0x00                    ; 1fd2 r
++      .db     0x00                    ; 1fd3 r
++      .db     0xfe                    ; 1fd4 r
++      .db     0x00                    ; 1fd5 r
++      .db     0x00                    ; 1fd6 r
++      .db     0x00                    ; 1fd7 r
++      .db     0x02                    ; 1fd8 r
++      .db     0x00                    ; 1fd9 r
++      .db     0x00                    ; 1fda r
++      .db     0x00                    ; 1fdb r
++      .db     0x00                    ; 1fdc r
++      .db     0x00                    ; 1fdd r
++      .db     0x00                    ; 1fde r
++      .db     0x00                    ; 1fdf r
++barr_1fe0:
++      .db     0x01                    ; 1fe0 r
++      .db     0x02                    ; 1fe1 r
++      .db     0x01                    ; 1fe2 r
++      .db     0x01                    ; 1fe3 r
++      .db     0x01                    ; 1fe4 r
++      .db     0x01                    ; 1fe5 r
++      .db     0x01                    ; 1fe6 r
++      .db     0x01                    ; 1fe7 r
++      .db     0x03                    ; 1fe8 r
++      .db     0x01                    ; 1fe9 r
++      .db     0x01                    ; 1fea r
++      .db     0x01                    ; 1feb r
++      .db     0x04                    ; 1fec r
++      .db     0x01                    ; 1fed r
++      .db     0x01                    ; 1fee r
++      .db     0x01                    ; 1fef r
++barr_1ff0:
++      .db     0x00                    ; 1ff0 r
++      .db     0x00                    ; 1ff1 r
++      .db     0x00                    ; 1ff2 r
++      .db     0x00                    ; 1ff3 r
++      .db     0x00                    ; 1ff4 r
++      .db     0x00                    ; 1ff5 r
++      .db     0x00                    ; 1ff6 r
++      .db     0x00                    ; 1ff7 r
++      .db     0x00                    ; 1ff8 r
++      .db     0x00                    ; 1ff9 r
++      .db     0x00                    ; 1ffa r
++      .db     0x00                    ; 1ffb r
++      .db     0x00                    ; 1ffc r
++      .db     0x00                    ; 1ffd r
++      .db     0x00                    ; 1ffe r
++      .db     0x00                    ; 1fff r
++.endif
++
++;     .area   udata2
 +; normally this is .area udata2, but don't bother with a separate area,
 +; put the address here so the DHGR build can use the ordinary Makefile
 +;     .area   udata2
 +.if DHGR
-+      .ds     0xf100 - 0xd000 - (. - data1_start)
++      .ds     0xf200 - 0xd000 - (. - data1_start)
 +.else
 +      .ds     0xa800 - 0x4000 - (. - data0_start)
 +.endif
index ddeb6d2..925fa1a 100755 (executable)
@@ -243,8 +243,11 @@ intelhex = IntelHex(in_ihx)
 entry_point = intelhex.start_addr['EIP']
 segments = [j for i in intelhex.segments() for j in i]
 
-# zero page and stack are done last, after we finish with them,
-# and in 0x100-byte pieces so we can do them without zero page
+# create separate segments for the separate memory areas:
+#   stack, zero page, main memory, LC bank 1, LC bank 2 + LC main memory
+# since we use the stack and zero page for decompression, we rely on
+# them being separate (in 0x100-byte pieces) to avoid themselves being
+# compressed, and we put them last so they'll overwrite our own usage
 def intersect(segments, segment):
   [addr0, addr1] = segment
   segments1 = []
@@ -260,9 +263,13 @@ def intersect(segments, segment):
 segments = (
   intersect(segments, [0, 0x100]) +
   intersect(segments, [0x100, 0x200]) +
-  intersect(segments, [0x200, 0x10000])
+  intersect(segments, [0x200, 0xc000]) +
+  intersect(segments, [0xc000, 0xd000]) +
+  intersect(segments, [0xd000, 0x10000])
 if rev else
-  intersect(segments, [0x200, 0x10000]) +
+  intersect(segments, [0x200, 0xc000]) +
+  intersect(segments, [0xc000, 0xd000]) +
+  intersect(segments, [0xd000, 0x10000]) +
   intersect(segments, [0, 0x100]) +
   intersect(segments, [0x100, 0x200])
 )
@@ -309,6 +316,18 @@ REPORT_TYPE_UNCOMPRESSED = 1
 REPORT_TYPE_COMPRESSED = 2
 report = []
 
+# language card can be in unknown state or known state 0xc080 + n
+LC_STATE_UNKNOWN = -1
+LC_STATE_BANK2_RAM_WP = 0
+LC_STATE_BANK2_ROM_WE = 1
+LC_STATE_BANK2_ROM_WP = 2
+LC_STATE_BANK2_RAM_WE = 3
+LC_STATE_BANK1_RAM_WP = 4
+LC_STATE_BANK1_ROM_WE = 5
+LC_STATE_BANK1_ROM_WP = 6
+LC_STATE_BANK1_RAM_WE = 7
+lc_state = LC_STATE_UNKNOWN
+
 # prologue
 if not rev:
   section_payload.fixups.extend(
@@ -340,6 +359,30 @@ for i in range(0, len(segments), 2):
   addr1 = segments[i + 1]
   data = list(intelhex.tobinstr(addr0, addr1 - 1))
 
+  if addr0 < 0xc000:
+    pass
+  elif addr0 < 0xc000:
+    assert addr1 <= 0xd000
+    if lc_state != LC_STATE_BANK1_RAM_WE:
+      lc_state = LC_STATE_BANK1_RAM_WE
+      section_loader.data.extend(
+        [
+          0x8d, 0x80 | lc_state, 0xc0  # sta hw_lc_bank1_ram_we *2
+        ] * 2
+      )
+    addr0 += 0x1000
+    addr1 += 0x1000
+  elif addr0 < 0x10000:
+    if lc_state != LC_STATE_BANK2_RAM_WE:
+      lc_state = LC_STATE_BANK2_RAM_WE
+      section_loader.data.extend(
+        [
+          0x8d, 0x80 | lc_state, 0xc0  # sta hw_lc_bank2_ram_we *2
+        ] * 2
+      )
+  else:
+    assert False
+
   if len(data) <= 4:
     report.append(
       (REPORT_TYPE_DIRECT_POKE, addr0, addr1, 0, 0)
@@ -365,7 +408,7 @@ for i in range(0, len(segments), 2):
         section_loader.data.extend(
           [
             0xa9, i,                           # lda #data
-            0x85, addr0,                               # sta *addr0
+            0x85, addr0,                       # sta *addr0
           ]
         if addr0 < 0x100 else
           [
index fa49f75..bc1389c 100644 (file)
@@ -23,6 +23,9 @@
 [0x0028, 0x002a) # vec_calculate_object_shape
 [0x004e, 0x0050) # vec_draw_misc_from_table
 [0x0200, 0x0202) # vec_restart
-[0x0a00, 0x2000)
+[0x0a00, 0x17f5)
+[0x1803, 0x1dc9)
+[0x1e03, 0x1f3c)
+[0x1f83, 0x2003)
 [0x4000, 0x8c08)
 [0x8e00, 0x9ded)