	.TITLE MULDIV
				; MUL/DIVマイクロサブルーチンテスト
*START: 100
	R1:=D"16
*
	R2:=D"5
*
	CALL MULT		; R1*R2
*
	R3:=R1			; 乗算結果(下位16ビット)
*
	R1:=D"16
*
	R2:=D"5
*
	CALL DIV		; R1/R2
*
	R4:=R1			; 除算結果(商)
*
	R5:=R0			; 除算結果(余り)
*
	SET HLT
				; 乗算を行なうマイクロサブルーチン
*MULT:				; r1に被乗数 r2に乗数をセットして呼び出す
				; 上位16ビットをr0、下位16ビットをr1に返す
	R0:=ZERO AND 10		; r0への0のセットと
	C:=RBUS			; カウンタCへの0x10のセットを同時に行なう
*
	R1:=SRL R1
*MULT2:                         ; 乗算ループ
	IF CRY=0 THEN MULT3
        C-1
*
	R0:=R0+R2
*MULT3:
	R0:=SRL R0
	WITH CRY
*
	IF CZ=0 THEN MULT2
	R1:=SRL R1
	WITH CRY
*
	RETURN
				; 除算を行なうマイクロサブルーチン
*DIV:				; r1に被除数 r2に除数をセットして呼び出す
				; 余りをr0、商をr1に返す
	SET BY R2		; 除数が0であるかをチェック
*
	IF ZER=0 THEN DIV1
*
	SET OV			; 除数が0の場合はエラーで終了
*DIV1:
	R0:=0
*
	C:=10                   ; カウンタCに0x10をセット
*
	R1:=SLL R1
*DIV2:				; 除算ループ
	R0:=SLL R0
	WITH CRY
*
	R0:=R0-R2
	C-1
*
	IF NEG=0 THEN DIV3
*
	R0:=R0+R2
*
	IF CZ=0 THEN DIV2
	R1:=SLL R1
*
	RETURN
*DIV3:
	IF CZ=0 THEN DIV2
	R1:=SLL R1
	WITH ONE
*
	RETURN
	.END
