hexed: fixup for newer binutils
[megadrive.git] / hexed / hexed.s
index 418ca5c..ae77a3e 100644 (file)
 .macro do_dpad bit op val
        btst.l          #\bit,d0
        beq             0f
-       \op.l           \val,a6
+       \op             \val,a6
        bra             dpad_end
 0:
 .endm
@@ -203,7 +203,8 @@ sprite_data_end:
 
 predef_addrs:
        dc.l 0x000000, 0x200000, 0x400000, 0xa00000, 0xa10000
-       dc.l 0xa11100, 0xa12000, 0xa13000, 0xa14000, 0xc00000
+       dc.l 0xa11100, 0xa12000, 0xa13000, 0xa14000, 0xa15100
+       dc.l 0xc00000
 predef_addrs_end:
 
 safe_addrs:
@@ -214,6 +215,10 @@ safe_addrs:
        dc.l 0xa12000, 0xa120ff
        dc.l 0xa13000, 0xa130ff
 safe_addrs_end:
+       dc.l 0xa15100, 0xa1513f
+safe_addrs_end_32x:
+       dc.l 0xa15180, 0xa153ff
+safe_addrs_end_32x_vdp:
 
 sizeof_bin:
        dc.l _edata
@@ -275,6 +280,33 @@ main:
        tst.w           (0xc00004).l
 no_tmss:
 
+       /* want to do early PC transfer (with RAM/VRAM intact and such)?
+        * also give time PC to see start condition */
+       move.l          #0x2000,d0
+0:     dbra            d0,0b
+
+       move.l          #0xa10005,a0
+       btst.b          #5,(a0)
+       bne             no_early_transfer
+move.b #1,(0)
+       move.b          #0x40,(0xa1000b).l      /* port 2 ctrl */
+       move.b          #0x00,(a0)              /* port 2 data - start with TH low */
+       move.l          #0x2000,d0
+0:
+       btst.b          #4,(a0)
+       beq             do_early_transfer
+       dbra            d0,0b
+
+move.b #2,(0)
+       move.b          #0,(0xa1000b).l
+       bra             no_early_transfer       /* timeout */
+
+do_early_transfer:
+move.b #9,(0)
+       bsr             do_transfer
+
+no_early_transfer:
+
 .if COPY_TO_EXP
        /* copy to expansion device if magic number is set */
        move.l          #0x400000,a1
@@ -719,20 +751,20 @@ draw_status_bar:
        btst.l          #16+4,d0                /* A - scroll modifier */
        beq             input_noa
 
-       do_dpad         16+0,  sub, #0x0800
-       do_dpad         16+1,  add, #0x0800
-       do_dpad         16+10, sub, #0xd800
-       do_dpad         16+11, add, #0xd800
+       do_dpad         16+0,  sub.l, #0x0800
+       do_dpad         16+1,  add.l, #0x0800
+       do_dpad         16+10, sub.l, #0xd800
+       do_dpad         16+11, add.l, #0xd800
 input_noa:
        moveq.l         #0,d1
        move.w          d7,d1
        lsr.w           #7,d1
        lsr.w           #7,d1
 
-       do_dpad         0,  subq, #0x0008
-       do_dpad         1,  addq, #0x0008
-       do_dpad         10, sub, d1
-       do_dpad         11, add, d1
+       do_dpad         0,  subq.l, #0x0008
+       do_dpad         1,  addq.l, #0x0008
+       do_dpad         10, sub.l, d1
+       do_dpad         11, add.l, d1
 
 dpad_end:
        /* update addr */
@@ -1327,7 +1359,8 @@ wait_tl_low0:
        bne             wait_tl_low0
 
        menu_text       txt_working, 13, 13, 0
-       bra             do_transfer
+       bsr             do_transfer
+       bra             return_to_main
 
 # go back to main mode
 return_to_main:
@@ -1374,6 +1407,19 @@ get_safety_mask:
        lsr.l           #8,d1
        lea             (safe_addrs,pc),a1
        move.w          #(safe_addrs_end - safe_addrs)/8-1,d2
+       cmp.l           #0x4D415253,(0xa130ec)  /* 'MARS' */
+       bne             no_32x
+       move.w          #(safe_addrs_end_32x - safe_addrs)/8-1,d2
+       move.w          (0xa15100),d0
+       and.w           #3,d0
+       cmp.w           #3,d0                   /* ADEN and nRES */
+       bne             no_32x_vdp
+       btst.b          #7,d0                   /* FM */
+       bne             no_32x_vdp
+       move.w          #(safe_addrs_end_32x_vdp - safe_addrs)/8-1,d2
+no_32x_vdp:
+no_32x:
+
 0:
        move.l          (a1)+,d0
        cmp.l           d0,d1