hexed: support PicoDrive savestate loading (only VDP+VRAM for now)
[megadrive.git] / hexed / hexed.s
index b999de1..418ca5c 100644 (file)
@@ -1,6 +1,6 @@
 ###############################################################################
 #
-# Copyright (c) 2009, Gražvydas Ignotas
+# Copyright (c) 2009,2011 Gražvydas Ignotas
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 #       names of its contributors may be used to endorse or promote products
 #       derived from this software without specific prior written permission.
 #
-# THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
+# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ANY
 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
+# DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
@@ -215,6 +215,9 @@ safe_addrs:
        dc.l 0xa13000, 0xa130ff
 safe_addrs_end:
 
+sizeof_bin:
+       dc.l _edata
+
 txt_edit:
        .ascii  "- edit -\0"
 txt_a_confirm:
@@ -259,8 +262,18 @@ txt_exc:
 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:
 
 .if COPY_TO_EXP
        /* copy to expansion device if magic number is set */
@@ -269,7 +282,8 @@ main:
        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)+
@@ -286,7 +300,8 @@ main:
 
        /* 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)+
@@ -443,6 +458,7 @@ no_auto_transfer:
        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 */