+mode_edit_val:
+ btst.l #7,d6
+ bne mode_hedit_finish
+
+ /* read val to edit */
+ mk_a6_addr d1
+ move.l d1,a0
+ moveq.l #0,d0
+ btst.l #15,d7
+ bne 0f
+ move.b (a0),d0
+ bra 1f
+0:
+ move.w (a0),d0
+1:
+ lsl.l #8,d0
+ and.l #0xff,d6
+ or.l d0,d6
+
+ and.b #0x0f,d6 /* not done, reset pos */
+ change_mode MMODE_VAL_INPUT, MMODE_EDIT_VAL
+ jmp vbl_end
+
+mode_hedit_finish:
+ /* write the val */
+ mk_a6_addr d1
+ move.l d1,a0
+ move.l d6,d0
+ lsr.l #8,d0
+
+ btst.l #15,d7
+ bne 0f
+ move.b d0,(a0)
+ bra 1f
+0:
+ move.w d0,(a0)
+1:
+
+ and.l #0xf,d6 /* forget val and pos */
+ bra return_to_main
+
+##################### goto #######################
+
+mode_goto:
+ btst.l #7,d6
+ bne mode_goto_finish
+
+ or.w #0xc000,d7 /* 3 bytes */
+ bclr.l #7,d6
+ change_mode MMODE_VAL_INPUT, MMODE_GOTO
+ jmp vbl_end
+
+mode_goto_finish:
+ move.l d6,d0
+ lsr.l #8,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
+
+ and.w #0x3fff,d7
+ or.w #0x8000,d7 /* back to 2 bytes */
+ bra return_to_main
+
+################### val edit #####################
+
+mode_val_input:
+ /* frame */
+ movea.l #0xe000+14*2+11*64*2,a1
+ moveq.l #6-1,d1
+0:
+ move.w a1,a0
+ jsr load_prepare
+ moveq.l #11-1,d0
+1:
+ move.w #0,(a0)
+ dbra d0,1b
+
+ add.w #64*2,a1
+ dbra d1,0b
+
+ /* text */
+ lea txt_edit,a0
+ move.l #15,d0
+ move.l #11,d1
+ move.l #0xc000,d2
+ jsr print
+
+ lea txt_a_confirm,a0
+ move.l #15,d0
+ move.l #15,d1
+ move.l #0xc000,d2
+ jsr print
+
+ /* edit field */
+ moveq.l #0,d0
+ moveq.l #0,d1
+ moveq.l #0,d3
+ move.w d7,d3
+ lsr.w #7,d3
+ lsr.w #7,d3
+
+ move.b #19,d0
+ sub.b d3,d0
+ move.b #13,d1
+ move.l d6,d2
+ lsr.l #8,d2
+ add.b d3,d3
+ or.w #0x8000,d3
+ jsr print_hex
+
+ /* current char */
+ moveq.l #0,d0
+ moveq.l #0,d1
+
+ and.w #6,d3
+ move.b #19,d0
+ move.b d3,d1
+ lsr.b #1,d1 /* length in bytes */
+ sub.b d1,d0
+ move.b d6,d1
+ lsr.b #4,d1
+ and.b #7,d1 /* nibble to edit */
+ add.b d1,d0
+
+ sub.b d1,d3
+ sub.b #1,d3 /* chars to shift out */
+ lsl.b #2,d3
+ add.b #8,d3
+ move.l d6,d2
+ lsr.l d3,d2
+
+ move.b #13,d1
+ move.w #0xa001,d3
+ jsr print_hex
+
+ /* handle input */
+ jsr get_input /* x0cbrldu x1sa00du */
+
+ move.w d0,d1
+ and.w #0x0f00,d1
+ beq ai_no_dpad
+ move.w d7,d1
+ lsr.w #7,d1
+ lsr.w #7,d1
+ add.b d1,d1 /* nibble count */
+ sub.b #1,d1 /* max n.t.e. val */
+ move.b d6,d2
+ lsr.b #4,d2
+ and.b #7,d2 /* nibble to edit */
+
+ move.b d0,d3
+ and.b #3,d3
+ beq ai_no_ud
+ moveq.l #0,d3
+ moveq.l #0,d4
+ move.b #0xf,d3
+ move.b #0x1,d4
+ sub.b d2,d1
+ lsl.b #2,d1
+ add.b #8,d1
+ lsl.l d1,d3 /* mask */
+ lsl.l d1,d4 /* what to add/sub */
+ move.l d6,d1
+ and.l d3,d1
+ btst.l #8,d0
+ beq 0f
+ add.l d4,d1
+ bra 1f
+0:
+ sub.l d4,d1
+1:
+ and.l d3,d1
+ eor.l #0xffffffff,d3
+ and.l d3,d6
+ or.l d1,d6
+ jmp vbl_end
+
+ai_no_ud:
+ btst.l #10,d0
+ bne 0f
+ add.b #1,d2
+ bra 1f
+0:
+ sub.b #1,d2
+1:
+ cmp.b #0,d2
+ bge 0f
+ move.b d1,d2
+0:
+ cmp.b d1,d2
+ ble 0f
+ move.b #0,d2
+0:
+ and.b #0x8f,d6
+ lsl.b #4,d2
+ or.b d2,d6
+ jmp vbl_end
+
+ai_no_dpad:
+ move.w d0,d1
+ and.w #0x1020,d1
+ beq ai_no_sb
+
+ and.l #0xf,d6 /* forget val and pos */
+ bra return_to_main
+
+ai_no_sb:
+ btst.l #4,d0
+ beq ai_no_input
+ bset.l #7,d6
+ move.w d7,d1
+ and.w #0x3800,d1
+ lsr.w #3,d1
+ and.w #0xc0ff,d7
+ or.w d1,d7
+
+ai_no_input:
+ jmp vbl_end
+
+
+# go back to main mode
+return_to_main:
+ bclr.l #7,d6
+ change_mode MMODE_MAIN, MMODE_MAIN
+ write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320)