ds_name        db    'MOJ\BOAD',0

db ' BOADK1.HD6 / 漢字を使わない ',0
db ' BOAD25_3.HD6 / キーボードの挿入削除  94 1 23 ',0
db ' BOAD25_2.HD6 / キーボードの挿入削除  12 24 ',0
db ' BOAD25.HD6 / 16からの改良 KEY BOAD 12 20 ',0
db ' BOAD24.HD6 / 16からの改良 KEY BOAD 12 12 ',0
db ' BOAD16.HD6 周倉 type1 からの改良 1993 12 12 ',0

;**************************************************************
;-----------ウインドウサイズ and  ( on off )  情報

look_me:	    call sub_esi
        	dd    0,0
        	dw    1,0,640,260,0,0,9,1,0,0
        
;**************************************************************
moj_ura:
	call	sub_edi
	dw	0
	db 'URA',0

moj_col:
	call	sub_edi
	dw	0
	db 'C2B',0

;***************************************************************
p_call:		M_P_CALL
p_set:		M_P_SET
ck_mouse:	M_KENMS
kesu_ms:	M_KESUMS
;**************************************************************
;---------文字のデータ

hairetu:
    call    sub_edi
           dw    1        ;screen_no
           dw    15      ; mozi_color
           dw    16      ; 書き出し位置  x
           dw    9      ;          y
           dw    0      ; next offset x
           dw    30      ; next offset y
               dw    6      ; gyo suu
    db '０　１　２　３　４　５　６　７　８　９',0

    db 'ａ　ｂ　ｃ　ｄ　ｅ　ｆ　ｇ　ｈ　ｉ　ｊ',0

    db 'ｋ　ｌ　ｍ　ｎ　ｏ　ｐ　ｑ　ｒ　ｓ　ｔ',0

    db 'ｕ　ｖ　ｗ　ｘ　ｙ　ｚ　　　’　，　？',0

    db '＿　− 　"　．　！  　　　　　　　　←',0

    db '[ 降参 ]    [  取消  ]  [ 出来た ]  [ PASS   ]',0


;------------------------------------------------答えの文字列が入る
kotae_zi:
    call    sub_edi
           dw    1              ;screen_no
           dw    15             ; mozi_color
           dw    5              ; 書き出し位置  x
           dw    5+30*6+20      ;          y
           dw    0              ; next offset x
           dw    30             ; next offset y
           dw    1              ; gyo suu
	   db '_'
	   db 90 dup(0)

;-----------------------------カーソル表示用
kotae_zi1:
    call    sub_edi
           dw    1           ;screen_no
           dw    15          ; mozi_color
           dw    5           ; 書き出し位置  x
           dw    5+30*6+40   ;          y
           dw    0           ; next offset x
           dw    30          ; next offset y
           dw    1           ; gyo suu
	   db '^'
	   db 90 dup(0)

;----------------------------------箱のデータ
icon_box:	call sub_edi
		dw	1,33,33,640-34,0,0,20,13,15,1

r_con_dt:	call	sub_edi
		dw	1,640-33,1,2,32,0,222,0

r_con_dt1:	call	sub_edi
		dw	1,640-33,1,5,32,0,221,0

key_box:
    call sub_edi
        dw    10,32,29,6,5,32,0,13,2,1
        dw    10,32,29,6,5+30,32,0,8,5,1
        dw    10,32,29,6,5+30*2,32,0,8,5,1
        dw    10,32,29,6,5+30*3,32,0,8,5,1
        dw    10,32,29,6,5+30*4,32,0,8,5,1
        dw    4,32*3,29,6,5+30*5,32*3,0,10,3,1


;------------------------------------------- 答えの箱を書く
kotae_box:
    call    sub_edi
    dw    1,635,29,0,5+30*6+17,0,0,9,11,1

;--------------------------ワーク

;----------------------------文字 変換用のデータテーブル
henkan:
    call    sub_edx
    db '0123456789'
    db 'abcdefghij'
    db 'klmnopqrst'
    db 'uvwxyz `,?'
    db '_-".!     '

;-------------------カーソル位置の保存場所
now_ksl:     call sub_esi
		dd     0
		dd     0    ;キーボード用のカーソル

;----------------------マウスボタン信号の保存場所

m_bot_dt:
	    call    sub_edi
	    dw    0    ;cx
	    dw    0    ;bx


;*****************************************************************
paint_wd:            ;ウインドウの初期化
	SET_P moj_ura
	SET_P moj_col
	WD_LEFT
	ret

re_paint:
	     WD_CLS 1

	     BOX key_box,54
	     MOZI  hairetu
	     BOX kotae_box,1
	     MOZI kotae_zi
	     MOZI kotae_zi1
	     BOX icon_box,1

		call	r_con
		ret

mouse_in:     ret

be_called:
	    YOMU ax,300
	      cmp ax,1
	      je torikesi
	         cmp ax,2
	         je waiting_0
		   cmp	ax,3
		   je	get_up
	     cmp	ax,4
	     je		go_bed
	mov edx,0		              ;間違えて呼ばれたと解釈
      ret

;****************************************************************

get_up:
	mov	ax,0600h	; キーボードバッファークリア
	int	90h
	WD_WANT
	call	re_paint
	ret

;----------------------------------------------
go_bed:
	WD_ERZ 1
	WD_LEFT
	ret

;---------------------------------------------
col_chg:
	KAKU	word ptr 300,1
	KAKU	word ptr 302,11   ;パレット11ページ 
	CALL_P moj_col
	call	kesu_ms
	jmp	waiting

;-------------------------------------------
r_con:
	call r_con_dt
	call r_con_put
	call r_con_dt1
	call r_con_put
	ret
;-------------------------------------------------------
r_con_put:
	mov	ax,0200h	;マウスの表示を消す｡
	call	MOUSE
	mov	ah,100          ;rom icon の表示
	mov	al,29
	call	komei1
	mov	ax,0201h	; マウスを表示する
	call	MOUSE
	ret
	
;**************************************************************
;------------------入力待ち準備
waiting_0:

	call	now_ksl
	mov	ebx,[esi]
	mov	[esi+4],ebx
	call	kotae_zi1
	add	edi,14
	mov	esi,edi
	mov	eax,20202020h
	mov	ecx,20
	cld
	rep	stosd
	mov	eax,'^'
	mov	[esi+ebx],eax

      BOX kotae_box,1           ;答えの箱
      MOZI kotae_zi             ;答えの文字列
      MOZI kotae_zi1            ;答えの文字列

;-----------------------------------------------------------入力待ち
waiting:
	mov	ax,0600h	; キーボードバッファークリア
	int	90h

waiting0:
	     call    ck_mouse
	     cmp ch,0
	     jne waiting1

	mov	ax,0901h		; キーボード読み取り
	int	90h
	test	ah,ah			; 成功？
	jnz	waiting0		; 読み取りエラー
	cmp	dh,0FFh
	je	wait3			; 入力文字なし
	cmp	dl,0dh
	je	dekita
	cmp	dl,8
	je	k_back
        cmp	dl,1dh
        je	ks_back
        cmp	dl,1ch
        je	ks_front
        cmp	dl,07fh
        je	del_zi

	cmp	dl,1bh
	jbe	waiting
	cmp	dl,080h
	jae	waiting
	mov	al,dl

	call	now_ksl              ;-----------------
	mov	ebx,[esi]
	cmp	ebx,[esi+4]
	je	key_in
	cmp	ebx,[esi+4]
	jb	waiting              ;保険

     cmp ebx,78		        ;カーソル位置が78字を越えて
     jl short key_sou1  	;いなかったら
     jmp waiting        	;いたら

;----------------------------------------------------------
wait3:
	KAKU	word ptr 312,1
	CALL_P	moj_ura
	jmp	waiting0

;-------------------------------------------------------------
waiting1:	call    m_bot_dt
	 	mov	[edi],cx        ;ボタン情報の保存
	   	mov	[edi+2],dx      ;横の情報
	    	MOU	kotae_box,1
	    	cmp  	bx,1
	    	je   	kuwaeru
	    	MOU	key_box,54        ;box check
	        cmp	bx,1
	     	je 	key_da
	     	MOU	icon_box,1        ;box check
	     	cmp	bx,1
	     	je	col_chg
	     	jmp     waiting

;-----------------------------------------------------
key_sou1:

     call kotae_zi
     mov	ah,'_'
     movzx	eax,ax
     mov [edi+ebx+14],al     		;そこに入力文字を書く

     inc ebx      		    	; カーソル位置を +1 する
     mov [esi],ebx    			;それを保存
     mov eax,[esi+4]		        ;ebx=カーソル位置
     mov	ecx,'^ '
     call	kotae_zi1
     mov	[edi+eax+14],ecx

	inc	dword ptr [esi+4]
	mov	dh,1
	jmp	jo_here

;--------------------------------------------------------
; 挿入と削除

kuwaeru:
    call    now_ksl
    mov     ebx,[esi]
    cmp     ebx,0
    je      waiting           	;入力文字数0なら意味が無い｡

    call   m_bot_dt
    mov    dx,[edi]	    	;dx=ボタン情報
    mov    ax,[edi+2]   	;ax=横の位置
    dec    ax                   ;window offset を引く
    shr    ax,3                 ;ax/8  文字位置

jo_here:
    call    kotae_zi
    movzx    eax,ax
    add    edi,14
    mov    ecx,ebx
    sub    ecx,eax
    cmp    ecx,0
    jle    waiting       	   ;同じ位置なら意味がない
    cmp    dh,1
    je    in_zi        		   ;マウスの左ボタンなら挿入
    add    edi,eax    		   ;マウスの有る文字の位置
    mov    esi,edi
    inc    esi        		     ;マウスの指している次の文字位置
    cld
    rep    movsb      		     ;ecx分だけ前に詰める
    dec    ebx
    call    now_ksl
    mov    [esi],ebx  			;新しいカーソルの位置を保存
    call    kotae_zi
    mov    byte ptr [edi+ebx+15],0      ;カーソル位置の次に0を書く
    jmp    ans_put

;------------------------------------------------------------
; 一文字の挿入
in_zi:
    cmp    ebx,78
    jae    waiting       ;文字の数が78以上なら何もしない
    mov    esi,edi
    add    esi,ebx       ;カーソルの有る場所
    mov    dh,-1[esi]    ;カーソル直前の一文字記憶
    add    eax,edi       ;押された文字の位置を記憶
    inc    esi           ;念のためにカーソル後ろの0に合わせる
    mov    edi,esi
    inc    edi           ;転送先
    add    ecx,2         ;転送バイト数は2個増える
    std
    rep    movsb         ;[edi]=[esi] for ecx>0 step -1
    cld                  ;怖いから 戻しておく
    mov    [eax],dh      ;マウスの場所に文字を書く
    inc    ebx
    call    now_ksl
    mov    [esi],ebx
    jmp    k_back        ;挿入の為に入力した一文字を消す

;-------------------------------------------------------------------
del_zi:
     call now_ksl           ;esi=カーソル保存番地
     mov eax,[esi+4]        ;ebx=カーソル位置
     cmp eax,[esi]          ;カーソル位置が文章の終わりなら
     jae waiting            ;何もしない

	mov	dh,2
	mov	ebx,[esi]
	jmp	jo_here

;------------------------------------------------------------
ks_front:
     call now_ksl            ;esi=カーソル保存番地
     mov ebx,[esi+4]         ;ebx=カーソル位置
     cmp ebx,[esi]           ;カーソル位置が文章の終わりなら
     jae waiting             ;何もしない

     inc ebx                     ;カーソル位置を一つずらす
     mov [esi+4],ebx             ;それを保存
     call    kotae_zi1           ;答え文字列の番地 表示用兼

     mov eax,'^ '                 ;そこから四バイト0にする 
     mov   [edi+ebx+13],eax       ;'_'  ;カーソル位置に _ を書く
     jmp ans_put                  ; 新しい 文字列の表示

;------------------------------------------------------------
ks_back:
     call now_ksl           ;esi=カーソル保存番地
     mov ebx,[esi+4]        ;ebx=カーソル位置
     cmp ebx,0              ;カーソル位置が0なら
     je waiting             ;何もしない

     dec ebx                     ;カーソル位置を一つずらす
     mov [esi+4],ebx             ;それを保存
     call    kotae_zi1           ;答え文字列の番地 表示用兼

     mov eax,'^'                 ;そこから四バイト0にする 
     mov   [edi+ebx+14],eax      ;'_'  ;カーソル位置に _ を書く

     jmp ans_put                 ; 新しい 文字列の表示

;------------------------------------------------------------
key_da:
    cmp    ax,50
    jae    tokushu             ;特殊な命令は飛ばす
    call    henkan             ;文字への変換
    dec    ax                  ;ax=ax-1
    movzx    eax,ax            ;axをeaxに拡大
    mov    bl,[edx+eax]        ;henkan の eax番目から blに
    mov    al,bl
    cmp    al,'a'            ;a=61h A=41h '=60h
    jb    chon_ck            ;アルファベット以外は飛ばす
    call    m_bot_dt         ;edi=ボタン情報保存番地
    mov    cx,[edi]          ;cx=ボタン情報
    cmp    ch,2
    jne    key_in            ;右ボタンでなければそのまま
    sub    al,'a'-'A'        ;大文字小文字の変換
    jmp    key_in

;-------------------------------------------------------
chon_ck:	             ; ` を ' に 直します｡
    cmp    al,60h            ;60h=`
    jne    key_in
    mov    al,27h            ;27h='
    jmp    key_in

;-------------------------------------------------------------
tokushu:
         cmp ax,50
    je    k_back	        ;後退が押された
    cmp    ax,51
    je    good_by	        ;降参が押された
    cmp    ax,52
    je    torikesi		;取消が押された
    cmp		ax,54
    je		musi
    cmp    ax,53
    je     dekita        ;出来たが押された

    jmp    waiting        ;保険の為

;-----------------------------------------------------------------
k_back:
     call now_ksl        ;esi=カーソル保存番地
     mov ebx,[esi]        ;ebx=カーソル位置
     cmp ebx,0        ;カーソル位置が0なら
     je waiting        ;何もしない

	dec ebx        ;カーソル位置を一つずらす
	mov [esi],ebx        ;それを保存
	call    kotae_zi    ;答え文字列の番地 表示用兼


	mov eax,'_'        ;そこから四バイト0にする 

	mov   [edi+ebx+14],eax     ;'_'  ;カーソル位置に _ を書く
	mov	ecx,[esi+4]
	cmp	ecx,ebx
	jbe	k_back1
	mov	[esi+4],ebx
	mov	eax,'^'
	call	kotae_zi1
	mov	[edi+ebx+14],eax
k_back1:
     jmp ans_put            ; 新しい 文字列の表示

;-------------------------------------------------------------
key_in:     call kotae_zi
     add edi,14
     call now_ksl
     mov ebx,[esi]
     cmp ebx,78  	      	 ;カーソル位置が78字を越えて
     jl short key_in1   	 ;いなかったら
     jmp waiting       		 ;いたら

key_in1:     add edi,ebx            ;答え文字列頭にカーソル位置を加える
     mov [edi],al     		    ;そこに入力文字を書く
     mov    byte ptr [edi+1],'_'    ; 次の文字入力位置
     mov    byte ptr [edi+2],0      ; 文字の終わりの印
     inc ebx      		    ; カーソル位置を +1 する
     mov [esi],ebx    		     ;それを保存
	dec	ebx
	cmp	ebx,[esi+4]
	jne	ans_put
	mov	eax,'^ '
	call	kotae_zi1
	mov	[edi+ebx+14],eax
	inc	dword ptr [esi+4]

ans_put:

      BOX kotae_box,1          ;答えの箱
      MOZI kotae_zi            ;答えの文字列
      MOZI kotae_zi1           ;答えの文字列
      call kesu_ms             ;マウスの信号を消す
     jmp waiting

;--------------------------------------------------------------
dekita:                ;出来たが押された
     call kotae_zi
     add edi,14
     mov edx,edi        ;edxに文字列の頭を持たせる
     call now_ksl
     mov ebx,[esi]
     cmp ebx,0
     je short good_by1
     mov    byte ptr [edi+ebx],0   ;カーソル位置に 0 を書く 
     ret
;--------------------------------------------
good_by:
good_by1:     mov edx,0
     ret

;-------------------------------------------------------------------
musi:	mov	edx,1
	ret
;-------------------------------------------------------------------
torikesi:
    mov    ebx,0     	   ;カーソル位置は 0
    call    now_ksl
    mov    [esi],ebx 	   ;カーソル位置の保存
    mov    [esi+4],ebx     ;カーソル位置の保存

    call    kotae_zi
    mov    [edi+14],ebx  	        ;文字列を消す｡
    mov    byte ptr [edi+14],'_'	;入力文字位置を知らせる
    call    kotae_zi1
    mov    [edi+14],ebx     			 ;文字列を消す｡
    mov    byte ptr [edi+14],'^'  		 ;入力文字位置を知らせる

    jmp    ans_put


