ds_name                db        'MOJ\WORD_O',0

;*********************************
;テストのプログラム部分です｡
;成績データの形式が確定していないのでとてもいいかげんです｡
;*********************************

;********************************************
;後々の為にモジュールに履歴を書き込んで置きます｡

db 'WORD_O20.HD6 / 少しでも見やすく ',0
db 'WORD_O18.HD6 / ローマ字にした ',0
db 'WORD_O16.HD6 / 1993 12 12 / KEY BOAD ',0
db 'WORD_O15.HD6 / 1993 11 16 / WORD_O よりの改良 BY YOZO',0
db '1993 10 19 WORD_O.HD6 / WORD_T4 を 表示と実行部分に分割',0


;***********************************************
; システムに渡すウインドウ情報です｡
; このモジュールの場合､ダミイです｡

look_me:
         call sub_esi         ; esi 固定です｡
         dd 2 dup (0)
         dw 1
         dw 0
         dd 5        dup(0)

;********************************************************************
;------このモジュールが使用する他のモジュールのデータ

moj1:        call sub_edi
             dw 0
             db 'BOAD',0

moj2:        call sub_edi
             dw 0
             db 'MOZIRETU',0

moj3:        call        sub_edi
             dw 0
             db'WORD_T',0

;**********************----使用するマクロ

load:           M_LOAD
f_siz:          M_BYTESU
kesu_ms:        M_KESUMS
matu:           M_MATUMS
p_call:         M_P_CALL
p_set:          M_P_SET
ck_mouse:	M_KENMS


;****************************************
;プログラムで使うデータの部分です｡

;--------------EQU------------------------
        
;		        	 0 今の問題の番地
W_KAZ  equ 4 			;問題の数
W_NOW  equ 8 			;今の問題番号
w_from EQU 12 			;指定された問題をしているその番号
w_to   EQU 16 			;指定された問題の最後
attayo equ 20 			;正解だった。
;-----------------------------------------------------

p_dt:	call	sub_edx
	db 'パスしたもんね｡',0

;-----------------------仕事のひかえ----ワーク
kiroku:        call sub_ecx
       		 dd 10 dup (0)

;***************************************************
;プログラム部分
;**************************************************
;システムとのやり取り↓

;-------------------------------------------------------ウインドウ初期化

paint_wd:
        SET_P moj1            ;コールするモジュールを宣言
        SET_P moj2
        SET_P moj3
        WD_LEFT			;ウインドウは出さない
re_paint:
mouse_in:         ret

;---------------------------------------------------------------
;他のモジュールから呼ばれるとシステムを介してここに来ます｡

be_called:

        YOMU	ax,300
        cmp	ax,2
        je      siraberu
        cmp     ax,1
        je      begin
        ret
;----------------------------システム関連部分↑

;**************************************************************
;--------------このモジュールの個別の部分です｡↓

;*****************************
;独立しているサブルーチン↓

;---マウスかキーボードが押されるまで待つ
matu_k:
        call kesu_ms		;マウスの信号を消す｡

	mov	ax,0600h	; キーボードバッファークリア
	int	90h

matu_k0:
	mov	ah,3
	call	MOUSE1
	call	ck_mouse
	cmp	ch,0
	jne	matu_k1			;マウスが押されている｡

	mov	ax,0901h		; キーボード読み取り
	int	90h
	test	ah,ah		; 成功？
	jnz	matu_k0		; 読み取りエラー
	cmp	dh,0FFh
	je	matu_k0		; 入力文字なしの場合は

matu_k1:	ret

;--------------------------------------------------------------------------
;文字バッファより文字を表示部分のバッフアに写す↓
; in     edi 表示用バッフアの番地   / ecx  ワーク先頭番地
; use    edx /  ax

utusu:
        mov edx,[ecx]                ;次の文字列の番地を貰う
        mov ah,0dh                   ;文字列の終わりは 0dh
        call utusu1                  ;転送してくれ
        inc edx                      ; LF を飛ばして､次の文字列の頭を出す
        call kiroku
        mov [ecx],edx                ;次の文字列の頭を保存
        ret
utusu1:                           ;一字ずつ保存バッファから表示バッファに転送
        mov al,[edx]
        mov [edi],al
        inc edi
        inc edx
        cmp al,ah                ;文字列の終わりのチエック
        jne utusu1
        mov byte ptr -1[edi],0   ;CRの代わりに0を書き込んだ｡
        ret

;--------------------------------------------------------------------------
; 次の問題の頭を出す
;use      eax,ebx,ecx,edx,edi
;結果     ワークの先頭に問題の先頭番地が書き込まれる｡

mawasu:

      call      kiroku		;ワークの先頭番地 → ecx
      mov      edx,ecx
      mov      edi,[edx]

        mov	al,0ah 		  ;探す物は 0ah
        mov	ebx,2 		  ;答えと問題で 改行コード二つ
        cld     	          ; + 方向を指定 番地を増やして行く
        mov     ecx,1024*256	  ;途中で止まらない様に
ma_1:

        repne scasb     ; ecx > 0 の間 [edi] から 0dh = alの値を探せ
                        ; 同時に edi=edi+1
        jne ma_2        ; ecxは 0 になった
        dec ebx         ; 見つけたから 回数-1
        jne ma_1        ; 0で無いなら さらに探せ

ma_2:
      mov      [edx],edi
      ret

;-----------------------------------------------------------
;テストの終わりです｡

owara:
        KAKU        word ptr 300,4
        CALL_P moj1    		            ;get boad to sleep

        KAKU        word ptr 300,6
        CALL_P moj3      		    ;画面を消せ

        ret

;***********************************************
;その他の部分
;***********************************************

;-----------------------------------------------
;不正解の場合の処理

chigau:
        KAKU        word ptr 300,5
        CALL_P moj3 		               ;間違えたを表示

        call matu_k                ;マウスかキーが押されるまで待って

        cmp        ch,0
	je	chigau1		   ;キーなら続ける
	mov	ax,9
	KAKU	300,ax
	CALL_P  moj3		;終わりが押されたか調べる

	cmp	bx,1		;終わりの箱が押された｡
	je	owara
 
chigau1:
	 call      kiroku
	 YOMU	ebx,848        ;成績先頭番地
 
;成績先頭番地に今の番号を足す = 今の成績結果保存番地

	add	ebx,[ecx+w_from]
	mov	word ptr [ebx],1		;只今不正解中
	mov	dword ptr [ecx+attayo],2        ;キーボードに文字を残せと言う

       jmp re_try                ; もう一度行う


;*************************************************************

;問題数を調べ今回の成績表を初期化します｡↓

siraberu:

        RAM0 edi
        call kiroku          ;  ecx
        mov [ecx],edi        ; 読み込むファイルの番地のひかえ

        YOMU        ecx,820                ;file size buf
        mov         ecx,[ecx+4]		   ;file size → buf
 
       RAM2        ebx  		   ;成績管理の番地を決める
       KAKU        848,ebx
;-------------------------------------------------------問題数を調べる

        RAM0 edi
        mov al,0dh        ;探す物は 0dh
        mov ebx,0	  ;問題数=0
        cld               ; + 方向を指定 番地を増やして行く

pnt_1:

        repne scasb     ; ecx > 0 の間 [edi] から 0dh = alの値を探せ
                        ; 同時に edi=edi+1
        jne pnt_2       ; ecxは 0 になった
        inc ebx         ; 見つけたから 問題+1
        jmp pnt_1       ; さらに探せ


pnt_2:
        call kiroku
        mov       [ecx+W_KAZ],ebx         ;[ecx+4]に問題数*2
        KAKU      836,ebx		  ;共通データ領域の836に問題数を記録

;--------------------------------------
	YOMU	edi,800+(4*15)
	add	edi,ebx
	add	edi,4
	KAKU	800+(4*17),edi      ;問題の最後
	mov	ax,0a0dh
	mov	-2[edi],ax

	shr	ebx,1   ;ebx/2

	YOMU	edi,800+(4*15)
	mov	[edi],bx
	add	edi,2
	KAKU	800+(4*16),edi      ;一問目の成績

;--------------------------------------------------------
	YOMU	edi,848 	;成績表を1で埋める
	mov	ax,1		;1の物はやる必要のある物です
	cld
	mov	ecx,ebx
	rep	stosw
        ret

;********************************************************************
;  テストの開始です｡

begin:
	KAKU	word ptr 300,3   ;get up key boad
	CALL_P moj1

        YOMU      edx,840       ;最初の問題
        YOMU      ebx,844       ;最後の問題

      call      kiroku
      mov      [ecx+w_from],edx
      mov      [ecx+w_to],ebx

        KAKU        word ptr 300,1          ;試験画面を表示させる
        CALL_P        moj3

      call   kiroku
      mov    esi,[ecx+w_from]               ;問題開始番号
      shr    esi,1

      RAM0      edi
      mov       [ecx],edi       ;問題の先頭  二回目以降
      cmp       esi,0		;問題開始が最初からなら
      je        dasu

atamadasi:			;指定された番号まで問題を先送りしています｡

		    call    mawasu
		    dec    esi
		    jne    atamadasi

;-------------------------------------------------------出題します｡
dasu:
        call kiroku
        mov eax,[ecx+w_from]             ;[ecx+8]からeaxに
        cmp eax,[ecx+w_to]               ;[ecx+4]  最後の問題番号
        jae owara                        ;問題数を越えてしまったら終える

	YOMU	ebx,848
	add	ebx,[ecx+w_from]
	cmp	word ptr [ebx],1           ;やる必要は有るのか
	je	dasu1
	add	dword ptr [ecx+w_from],2   ;次の問題
	mov	eax,[ecx+w_from]
	cmp	eax,[ecx+w_to]
	jae	owara			;問題数を越えていたら終わり

	mov	esi,1
	jmp	atamadasi

dasu1:
        call        kiroku
        YOMU        edi,824               ;問題表示用
        call utusu                        ;文字列の転送

        call        kiroku
        YOMU        edi,832            ;答え表示用
        call        utusu              ;文字列の転送

	YOMU	ebx,800+(4*16)        ;成績表問題 先頭番地
	add	ebx,[ecx+w_from]
	YOMU	edi,800+(4*18)        ;成績表示文字列 三行
	movzx	ax,byte ptr [ebx]
	movzx	cx,byte ptr [ebx+1]
	add	ax,cx
	movzx	eax,ax
	KAKU	word ptr 300,3
	mov	ebx,3             ;桁数
	push	edi               ;      文字列に渡すデータ
	push	ebx
	push	eax
	CALL_P moj2

        call        kiroku
	YOMU	ebx,800+(4*16)        ;成績表問題 先頭番地
	add	ebx,[ecx+w_from]
	YOMU	edi,800+(4*18)        ;成績表示文字列 三行
	add	edi,4

	movzx	eax,byte ptr [ebx]
	KAKU	word ptr 300,3
	mov	ebx,3             ;桁数
	push	edi               ;      文字列に渡すデータ
	push	ebx
	push	eax
	CALL_P moj2

        call        kiroku
	YOMU	ebx,800+(4*16)        ;成績表問題 先頭番地
	add	ebx,[ecx+w_from]
	YOMU	edi,800+(4*18)        ;成績表示文字列 三行
	add	edi,8
	movzx	eax,byte ptr [ebx+1]
	KAKU	word ptr 300,3
	mov	ebx,3                   ;桁数
	push	edi                     ;     文字列に渡すデータ
	push	ebx
	push	eax
	CALL_P  moj2


	call       kiroku
	mov	eax,1
      	mov     [ecx+attayo],eax

;-----------------------------------------間違えた時はここから繰り返す
re_try:

        KAKU        word ptr 300,2        ;問題を表示させる
        CALL_P moj3

        call kesu_ms

        call      kiroku
        mov       eax,[ecx+attayo]
        KAKU      300,ax               ;前回の文字を消すかどうかの指示

        CALL_P moj1                    ;キーボードを呼ぶ
        cmp edx,0                      ;キャンセルが押されているか
        je chigau
	cmp	edx,1
	je	hyoka3

        YOMU        edi,828
        mov ah,0                   ; キーボードからの文字列は最後が0
        call utusu1                ;ここで転送

        KAKU        word ptr 300,3        ;答え表示させる
        CALL_P moj3

hyoka:			                  ;答えと正解とを比べる

        YOMU        edi,828
        KAKU        302,edi

        YOMU        edi,832
        KAKU        306,edi

        KAKU          word ptr 300,1 ;文字列の比較
        CALL_P        moj2           ;この部分独立しているのは後で細かな
        			     ;評価をするときの為です｡

        cmp       ax,1               ;ax=0 same
        je        chigau

        KAKU        word ptr 300,4
        CALL_P moj3                ;全て同じだから褒める

        call        matu_k  ;何時でも終わりに出来る様に
        cmp     ch,0
	je	hyoka_01

	mov	ax,9
	KAKU	300,ax
	CALL_P	moj3		;終わりが押されたか調べる

	cmp	bx,1
	je	owara

hyoka_01:

      call      kiroku
      cmp	dword ptr [ecx+attayo],1
      jne	hyoka1                         ;間違えた後の正解

	YOMU	ebx,848                        ;成績先頭番地
	add	ebx,[ecx+w_from]
	mov	word ptr [ebx],0               ;正解の印を付ける

	YOMU	ebx,800+(4*16)                 ;成績表問題 先頭番地
	add	ebx,[ecx+w_from]
	inc	byte ptr [ebx]                 ;正解+1 の印を付ける
	jmp	hyoka2

hyoka1:
	YOMU	ebx,800+(4*16)       ;成績表問題 先頭番地
	add	ebx,[ecx+w_from]
	inc	byte ptr [ebx+1]     ;間違い +1 の印を付ける

hyoka2:
        mov dword ptr [ecx+attayo],1
        add dword ptr [ecx+w_from],2   ; 今の問題数を+2する 二行と言うこと
        jmp dasu


hyoka3:
        YOMU    edi,828
        call	p_dt
        mov 	ah,0                	; キーボードからの文字列は最後が0
        call	 utusu1                	;ここで転送
        KAKU     word ptr 300,3        	;答え表示させる
        CALL_P	 moj3

        call        matu_k		;何時でも終わりに出来る様に
        cmp     ch,0
	je	hyoka3_0

	mov	ax,9
	KAKU	300,ax
	CALL_P	moj3		;終わりが押されたか調べる

	cmp	bx,1
	je	owara

hyoka3_0:
        
	call	kiroku
	jmp	hyoka2

