+ lea hexchars, a1
+ move.l #(0x40000003 | ((31 + 64*2) << 17)), (a3)
+ moveq.l #8-1, d5
+0:
+ rol.l #4, d3
+ move.b d3, d4
+ and.l #0x0f, d4
+ move.b (d4,a1), d4
+ add.w #0x4e0, d4
+ move.w d4, (a5)
+ dbra d5, 0b
+
+ movea.l #0xc00008, a0
+ movea.l #0x3ff000, a1
+ movea.l #0xffffe0, a2
+
+ /* wait for active display */
+ moveq.l #3, d2
+0:
+ btst d2, (a4) /* 8 */
+ beq.s 0b /* 10 */
+0:
+ btst d2, (a4)
+ bne.s 0b
+
+ /* flood the VDP FIFO */
+.rept 5
+ move.w d0, (a5)
+.endr
+
+ /* 60Hz 50Hz */
+ move.l (a0), (a1)+ /* #0xff06ff08* #0xff07ff09- */
+ move.l (a0), (a1)+ /* #0xff00ff11* #0xff00ff11 */
+ move.l (a0), (a1)+ /* #0xff18ff1a #0xff18ff1a */
+ move.l (a0), (a1)+ /* #0xff21ff23 #0xff21ff23 */
+ move.l (a0), (a1)+ /* #0xff2aff28 #0xff2aff28 */
+ move.l (a0), (a1)+ /* #0xff33ff34 #0xff33ff34 */
+ move.l (a0), (a1)+ /* #0xff3bff3d #0xff3cff3e- */
+ move.l (a0), (a1)+ /* #0xff45ff47* #0xff45ff47 */
+
+ /* as long as exactly 8 or more RAM writes are performed here, */
+ /* after multiple tries RAM refresh somehow eventually syncs */
+ move.l (a0), (a2)+ /* #0xff4eff4f #0xff4eff4f */
+ move.l (a0), (a2)+ /* #0xff56ff58 #0xff58ff59- */
+ move.l (a0), (a2)+ /* #0xff60ff62 #0xff60ff62 */
+ move.l (a0), (a2)+ /* #0xff69ff6b #0xff69ff6b */
+ move.l (a0), (a2)+ /* #0xff72ff74 #0xff72ff74 */
+ move.l (a0), (a2)+ /* #0xff7bff7c #0xff7bff7c */
+ move.l (a0), (a2)+ /* #0xff83ff85 #0xff83ff85 */
+ move.l (a0), (a2)+ /* #0xff8cff8e #0xff8eff8f- */
+
+ moveq.l #1, d5
+ sub.l #4*8, a1
+ btst.b #6, (0xa10001)
+ bne.s sync_hvc_50hz
+
+ move.l (0x00,a1), d3
+ cmp.l #0xff06ff08, d3
+ bne.w sync_hvc
+
+ moveq.l #2, d5
+ move.l (0x04,a1), d3
+ cmp.l #0xff00ff11, d3 /* mystery value */
+ bne.w sync_hvc
+
+ moveq.l #3, d5
+ move.l (0x1c,a1), d3
+ cmp.l #0xff45ff47, d3
+ bne.w sync_hvc
+
+ moveq.l #4, d5
+ move.l (-4,a2), d3
+ cmp.l #0xff8cff8e, d3 /* RAM */
+ bne.w sync_hvc
+
+ bra.s 0f
+
+sync_hvc_50hz:
+ move.l (0x00,a1), d3
+ cmp.l #0xff07ff09, d3
+ bne.w sync_hvc
+
+ moveq.l #2, d5
+ move.l (0x04,a1), d3
+ cmp.l #0xff00ff11, d3 /* mystery value */
+ bne.w sync_hvc
+
+ moveq.l #3, d5
+ move.l (0x1c,a1), d3
+ cmp.l #0xff45ff47, d3
+ bne.w sync_hvc
+
+ moveq.l #4, d5
+ move.l (-4,a2), d3
+ cmp.l #0xff8eff8f, d3 /* RAM */
+ bne.w sync_hvc
+
+0:
+ movea.l d0, a0
+ movea.l #0xA13000, a1
+
+ move.b d0, (0x09,a6) /* CtrlA */
+ move.b d1, (0x03,a6)
+
+ jmp 0xffff80
+
+run_game_r:
+ move.w #0x3210, (0x06,a1) /* 0xA13006 */
+ move.w d7, (0x10,a1) /* 0xA13010 */
+ move.w d0, (a1) /* 0xA13000 */