+ 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
+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
+
+dpad_end:
+ /* update addr */
+ move.l a6,d1
+ cmp.b #0xf0,d1
+ blo 0f
+ sub.l #0xd800,a6
+ add.w #0x00d8,a6
+ bra 1f
+0:
+ cmp.b #0xd8,d1
+ blo 1f
+ add.l #0xd800,a6
+ sub.w #0x00d8,a6
+1:
+
+ /* other btns */
+ moveq.l #0,d1
+ btst.l #12,d0 /* B - switch byte/word mode */
+ beq input_nob
+ bclr.l #15,d7
+ add.w #0x4000,d7 /* changes between 01 10 */
+ move.l a6,d1
+ and.l #1,d1
+ sub.l d1,a6 /* make even, just in case */
+
+input_nob:
+ btst.l #13,d0 /* C - edit selected byte */
+ beq input_noc
+
+ change_mode MMODE_EDIT_VAL, MMODE_MAIN
+ write_vdp_r_dst 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320 | VDP12_STE),(GFXCNTL)
+
+input_noc:
+ btst.l #5,d0 /* Start - menu */
+ beq input_nos
+
+ moveq.l #0,d5
+ change_mode MMODE_START_MENU, MMODE_MAIN
+ write_vdp_r_dst 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320 | VDP12_STE),(GFXCNTL)
+
+input_nos:
+vbl_end:
+# movem.l (a7)+,d0-d4/a0-a5
+.if USE_VINT
+ rte
+.else
+ rts
+.endif
+
+
+draw_cursor_unsafe_byte:
+ move.l a6,d0
+ and.l #7,d0 /* byte offs */
+ move.b d0,d1
+ add.b d0,d0
+ add.b d1,d0 /* d0 *= 3 (chars) */
+ add.b d0,d0
+ lea (7*2,a2,d0),a0
+ jsr load_prepare
+ move.l #(0x2000|'?'|((0x2000|'?')<<16)),(a0)
+
+ move.l a2,a0
+ add.w #31*2,a0
+ jsr load_prepare /* restore a0 */
+ bra draw_chars_hsafe_pre
+
+draw_cursor_unsafe_word:
+ move.l a6,d0
+ and.l #7,d0 /* byte offs */
+ move.l d0,d1
+ lsr.b #1,d1 /* which word */
+ move.b d1,d2
+ lsl.b #2,d2
+ add.b d2,d1 /* num of chars to skip */
+ add.b d1,d1
+
+ lea (8*2,a2,d1),a0
+ jsr load_prepare
+ move.l #(0x2000|'?'|((0x2000|'?')<<16)),d0
+ move.l d0,(a0)
+ move.l d0,(a0)
+
+ move.l a2,a0
+ add.w #29*2,a0
+ jsr load_prepare /* restore a0 */
+ bra draw_chars_hsafe_pre
+
+
+draw_cursor_byte:
+ move.l a6,d0
+ and.l #7,d0 /* byte offs */
+ move.w #0x2002,d3
+
+ move.b (-8,a1,d0),d2
+ move.b d0,d1
+ add.b d0,d0
+ add.b d1,d0 /* d0 *= 3 (chars) */
+ add.b d0,d0
+ lea (7*2,a2,d0),a0
+ jsr load_prepare
+ jsr print_hex_preped
+
+ move.l a2,a0
+ add.w #31*2,a0
+ jsr load_prepare /* restore a0 */
+
+ bra draw_chars_pre
+
+draw_cursor_word:
+ move.l a6,d0
+ and.l #7,d0 /* byte offs */
+ move.l d0,d1
+ lsr.b #1,d1 /* which word */
+ move.b d1,d2
+ lsl.b #2,d2
+ add.b d2,d1 /* num of chars to skip */
+ add.b d1,d1
+ move.w #0x2004,d3
+
+ move.w (-8,a1,d0),d2
+ lea (8*2,a2,d1),a0
+ jsr load_prepare
+ jsr print_hex_preped
+
+ move.l a2,a0
+ add.w #29*2,a0
+ jsr load_prepare /* restore a0 */
+
+ bra draw_chars_pre
+
+
+#################### hedit #######################
+
+mode_edit_val:
+ btst.l #7,d6
+ bne mode_hedit_finish
+
+ /* read val to edit */
+ moveq.l #0,d5
+ mk_a6_addr d1
+ move.l d1,a0
+ btst.l #15,d7
+ bne 0f
+ move.b (a0),d5
+ lsl.l #8,d5
+ or.b #1,d5
+ bra 1f
+0:
+ move.w (a0),d5
+ lsl.l #8,d5
+ or.b #2,d5
+1:
+
+ change_mode MMODE_VAL_INPUT, MMODE_EDIT_VAL
+ bra vbl_end
+
+mode_hedit_finish:
+ /* write the val */
+ mk_a6_addr d1
+ move.l d1,a0
+ lsr.l #8,d5
+
+ btst.l #15,d7
+ bne 0f
+ move.b d5,(a0)
+ bra 1f
+0:
+ move.w d5,(a0)
+1:
+
+ bra return_to_main
+
+##################### goto #######################
+
+mode_goto:
+ btst.l #7,d6
+ bne mode_goto_finish
+
+ moveq.l #0,d5
+ swap d6
+ move.w d6,d5
+ swap d6
+ swap d5
+ or.b #3,d5 /* 3 bytes */
+ bclr.l #7,d6
+ change_mode MMODE_VAL_INPUT, MMODE_GOTO
+ bra vbl_end
+
+mode_goto_finish:
+ lsr.l #8,d5
+ move.l d5,d0
+ move.l d0,d1
+ and.l #7,d1
+ and.b #0xf8,d0
+ lsl.l #8,d0
+ or.l d1,d0
+ move.l d0,a6
+
+ lsr.l #8,d5
+ swap d6
+ move.w d5,d6
+ swap d6
+
+ bra return_to_main