+/* PicoDrive savestate load */
+pcc_loadstate:
+ /* write VRAM */
+ move.l #0xc00000,a0
+ move.w #0x8f02,4(a0) /* auto increment 2 */
+
+ move.l #0x40000000,4(a0)
+ move.l #0x10000/2-1,d3
+tr_do_vram_loop:
+ bsr recv_word
+ move.w d0,(a0)
+ dbra d3, tr_do_vram_loop
+
+ /* write cram */
+ move.l #0xc0000000,4(a0)
+ move.l #0x80/2-1,d3
+tr_do_cram_loop:
+ bsr recv_word
+ move.w d0,(a0)
+ dbra d3, tr_do_cram_loop
+
+ /* write vsram */
+ move.l #0x40000010,4(a0)
+ move.l #0x80/2-1,d3
+tr_do_vsram_loop:
+ bsr recv_word
+ move.w d0,(a0)
+ dbra d3, tr_do_vsram_loop
+
+ /* recv and write regs */
+ lea 0xffe000,a3
+ move.l a3,a2
+ moveq.l #0x20-1,d3
+tr_do_vdpreg_recv_loop:
+ bsr recv_byte
+ move.b d0,(a2)+
+ dbra d3, tr_do_vdpreg_recv_loop
+
+ move.l a3,a2
+ moveq.l #0,d3
+tr_do_vdpreg_loop:
+ move.b d3,d1
+ or.b #0x80,d1
+ lsl.w #8,d1
+ move.b (d3,a2),d1
+ move.w d1,4(a0)
+ addq.l #1,d3
+ cmp.b #0x17,d3 /* FIXME: r23 might cause DMA or.. */
+ bne 0f /* ..something and hang VDP.. */
+ add.b #1,d3 /* ..so we skip it */
+0:
+ cmp.b #0x20,d3
+ blt tr_do_vdpreg_loop
+
+ moveq.l #0,d0
+ move.b 5(a3),d0
+ bsr invalidate_sprite_cache
+
+
+0: bra 0b
+
+ bra return
+
+
+pcc_vram_send:
+ /* write VRAM */
+ move.l #0xc00000,a0
+ move.w #0x8f02,4(a0) /* auto increment 2 */
+ move.l #0,4(a0) /* VRAM read, addr 0 */
+ move.l #0x10000/2-1,d4
+
+ switch_to_output
+
+tr_vram_send_loop:
+ move.w (a0),d3
+ move.w d3,d0
+ lsr.w #8,d0
+ bsr send_byte
+ move.b d3,d0
+ bsr send_byte
+ dbra d4,tr_vram_send_loop
+
+ bra return
+
+
+