.macro do_dpad bit op val
btst.l #\bit,d0
beq 0f
- \op.l \val,a6
+ \op \val,a6
bra dpad_end
0:
.endm
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:
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
txt_edit:
.ascii "- edit -\0"
main:
/* make sure io port 2 is doing inputs */
move.b #0,(0xa1000b).l
- /* mask irqs during init */
+ /* make sure irqs are masked */
move.w #0x2700,sr
+ /* take care of TMSS */
+ move.b (0xa10000).l,d0
+ andi.b #0x0f,d0
+ beq no_tmss
+ move.l #0x53454741,(0xa14000).l
+ /* want cart, not OS rom if cart pops in */
+ move.w #1,(0xa14100).l
+ /* touch VDP after TMSS setup? */
+ 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 */
bne 0f
move.l #0,a0
- move.w #0x2000/8-1,d0
+ move.l (sizeof_bin,pc),d0
+ lsr.l #3,d0
1:
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
/* copy, assume 8K size */
move.l #0xFF0100,a1
- move.w #0x2000/8-1,d0
+ move.l (sizeof_bin,pc),d0
+ lsr.l #3,d0
1:
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
lea (jumptab,pc,d0),a0
jmp (a0)
jumptab:
+ /* branch insns here because we want to be position independent */
bra mode_main
bra mode_val_input
bra mode_edit_val /* edit val in editor */
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 */
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:
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