#uselib "msvcrt"
#cfunc strtol "strtol" str, nullptr, int

#include "enum_NM.hsp"
#include "enum_type.hsp"

#module mnemonic id,string,p_num,p_type,comment
#modfunc local registration int i,str s,int n,int m,str c
	sdim string,256
	sdim comment,256
	id=i
	string=s
	p_num=n
	p_type=m
	comment=c
	return
#modcfunc local get_id
	return id
#modcfunc local get_string
	return string
#modcfunc local get_p_num
	return p_num
#modcfunc local get_p_type
	return p_type
#modcfunc local get_comment
	return comment
#modcfunc local dump
	s="id:"+id+" name:"+string+" p_num:"+p_num+" comment:"+comment
	return s
#global

//	ꂪ1NMsDISP
#define DISP_ON 1


	repeat DISP+1
		newmod nm,mnemonic
		loop
	registration@mnemonic nm(ASTOP),ASTOP,"&+ASTOP",0,0,"stop"
	registration@mnemonic nm(NOP),NOP,"&+NOP",0,0,"Ȃ"
	registration@mnemonic nm(LD), LD, "&+LD", 1,type_int_address,"[h"
	registration@mnemonic nm(ST), ST, "&+ST", 1,type_int_address,"XgA"
	registration@mnemonic nm(LDI),LDI,"&+LDI",1,type_int,"l[h"
	registration@mnemonic nm(LDX),LDX,"&+LDX",1,0,"[hiԐځj"
	registration@mnemonic nm(STX),STX,"&+STX",1,0,"XgAiԐځj"
	registration@mnemonic nm(ADD),ADD,"&+ADD",1,type_int_address,"Z"
	registration@mnemonic nm(SUB),SUB,"&+SUB",1,type_int_address,"Z"
	registration@mnemonic nm(ADD_I),ADD_I,"&+ADD_I",1,type_int,"lZ"
	registration@mnemonic nm(SUB_I),SUB_I,"&+SUB_I",1,type_int,"lZ"
	registration@mnemonic nm(MUL),MUL,"&+MUL",1,type_int_address,"Z"
	registration@mnemonic nm(DIV),DIV,"&+DIV",1,type_int_address,"Z"
	registration@mnemonic nm(MOD),MOD,"&+MOD",1,type_int_address,"]"
	registration@mnemonic nm(MUL_I),MUL_I,"&+MUL_I",1,type_int,"lZ"
	registration@mnemonic nm(DIV_I),DIV_I,"&+DIV_I",1,type_int,"lZ"
	registration@mnemonic nm(MOD_I),MOD_I,"&+MOD_I",1,type_int,"l]"
	registration@mnemonic nm(ADDX),ADDX,"&+ADDX",1,0,"ZiԐځj"
	registration@mnemonic nm(SUBX),SUBX,"&+SUBX",1,0,"ZiԐځj"
	registration@mnemonic nm(JUMP),JUMP,"&+JUMP",1,type_label_address,"goto"
	registration@mnemonic nm(BZ),BZ,"&+BZ",1,0,"[̂Ƃ"
	registration@mnemonic nm(BNZ),BNZ,"&+BNZ",1,0,"[̂Ƃ"
	registration@mnemonic nm(AWAIT1),AWAIT1,"&+AWAIT1",0,0,"await 1"
	registration@mnemonic nm(AWAIT_X),AWAIT_X,"&+AWAIT_X",1,type_int,"await"
	registration@mnemonic nm(WAIT_X),WAIT_X,"&+WAIT_X",1,type_int,"wait"
	registration@mnemonic nm(DISP),DISP,"&+DISP",0,0,"WX^̓e\"

////////////////////////////////////////////////////////////////////////////////
//	R[h
////////////////////////////////////////////////////////////////////////////////
	
sdim sc,2000
// addsubTEST
sdim sc_C,2000
sc_C={"MN,&+LDI
	int,10
MN,&+DISP
MN,&+ST
	int,0x2000
MN,&+LDI
	int,20
MN,&+DISP
MN,&+ADD
	int,0x2000
MN,&+DISP
MN,&+LDI
	int,30
MN,&+DISP
MN,&+ST
	int,0x3000
MN,&+LDI
	int,50
MN,&+DISP
MN,&+SUB
	int,0x3000
MN,&+DISP"}

sc={"type_label,0
MN,&+LDI
	int_I,10
MN,&+ST
	int_adr,0x2000
LB,1
MN,&+LDI
	int_I,20
MN,&+ADD
	int_adr,0x2000
type_def_var_int,0
MN,&+LDI
	int_I,30
MN,&+ST
	int_v,0
MN,&+LDI
	int_I,50
MN,&+SUB
	int_v,1
LB,2
MN,&+DISP
MN,&+AWAIT1
MN,&+JUMP
LB_adr,2"}
////////////////////////////////////////////////////////////////////////////////
//	R[h
////////////////////////////////////////////////////////////////////////////////
*analyze
;	sc=sel_code
dim  type    ,$10000
;sdim type_b  ,256,$10000
sdim contents,256,$10000
dim int_contents,$10000
dim  p_number,$10000
dim lines,$10000

read_line=0
this_line=0
sdim s,256
sdim t_1st,256
sdim t_2nd,256

#define youso_begin 0
#define youso_comtents 1

notesel sc
repeat notemax
	noteget s,read_line
	t_1st=strtrim(s,3,' ')
	t_2nd=strtrim(t_1st,3,'\t')
//	v
	sdim u,256,16
	split t_2nd,",",u
	l_u=stat
	
	tmp_type=""
	tmp_contents=""
	
	tmp_type=u.youso_begin
	switch tmp_type
	case "type_mnemonic"
	case "MN"
		type(this_line)=type_mnemonic
		int_contents(this_line)=write_NM_ID(u.youso_comtents)
		lines(this_line)=read_line+1
		swbreak
	case "type_label"
	case "LB"
		type(this_line)=type_label
		int_contents(this_line)=strtol(u.youso_comtents)
		lines(this_line)=read_line+1
		swbreak
	case "type_label_address"
	case "LB_adr"
		type(this_line)=type_label_address
		int_contents(this_line)=strtol(u.youso_comtents)
		lines(this_line)=read_line+1
		swbreak
	case "type_int"
	case "int_I"
		type(this_line)=type_int
		int_contents(this_line)=strtol(u.youso_comtents)
		lines(this_line)=read_line+1
		swbreak
	case "type_int_address"
	case "int_adr"
		type(this_line)=type_int_address
		int_contents(this_line)=strtol(u.youso_comtents)
		lines(this_line)=read_line+1
		swbreak
	case "type_def_var_int"
	case "d_int"
		type(this_line)=type_def_var_int
		int_contents(this_line)=strtol(u.youso_comtents)
		lines(this_line)=read_line+1
		swbreak
	case "type_var_int"
	case "int_v"
		type(this_line)=type_var_int
		int_contents(this_line)=strtol(u.youso_comtents)
		lines(this_line)=read_line+1
		swbreak
	default
		dialog "\error\ns̐擪̗vftype_mnemonicMNtype_labelLBintint_adr0ɂĉB\nline:"+(read_line+1),1
	swend
/*	if tmp_type=="type_mnemonic"||tmp_type=="MN"{
		tmp_type=type_mnemonic
;		tmp_type_b=""+type_mnemonic+":type_mnemonic"
	}else{
		if tmp_type=="type_label"||tmp_type=="LB"{
			tmp_type=type_label

		}else{
			if tmp_type!=0{
				dialog "\error\ns̐擪̗vftype_mnemonicMNtype_labelLB0ɂĉB\nline:"+(read_line+1),1
			}
		}
	}*/	
	read_line++
	this_line++
loop
gosub *collect_label
gosub *collect_def_var_int
goto *show_of_scanner
stop
///////////////////////////////////////////////////////////////////////
//	XLI
///////////////////////////////////////////////////////////////////////
#defcfunc write_NM_ID str p1
	v4p1=p1
	tmp_int_contents=0
	switch v4p1
	case get_string@mnemonic(nm(NOP))
		tmp_int_contents=NOP
		swbreak
	case get_string@mnemonic(nm(LD))
		tmp_int_contents=LD
		swbreak
	case get_string@mnemonic(nm(ST))
		tmp_int_contents=ST
		swbreak
	case get_string@mnemonic(nm(LDI))
		tmp_int_contents=LDI
		swbreak
	case get_string@mnemonic(nm(ADD))
		tmp_int_contents=ADD
		swbreak
	case get_string@mnemonic(nm(SUB))
		tmp_int_contents=SUB
		swbreak
	case get_string@mnemonic(nm(ADD_I))
		tmp_int_contents=ADD_I
		swbreak
	case get_string@mnemonic(nm(SUB_I))
		tmp_int_contents=SUB_I
		swbreak
	case get_string@mnemonic(nm(MUL))
		tmp_int_contents=MUL
		swbreak
	case get_string@mnemonic(nm(DIV))
		tmp_int_contents=DIV
		swbreak
	case get_string@mnemonic(nm(MOD))
		tmp_int_contents=MOD
		swbreak
	case get_string@mnemonic(nm(MUL_I))
		tmp_int_contents=MUL_I
		swbreak
	case get_string@mnemonic(nm(DIV_I))
		tmp_int_contents=DIV_I
		swbreak
	case get_string@mnemonic(nm(MOD_I))
		tmp_int_contents=MOD_I
		swbreak
	case get_string@mnemonic(nm(JUMP))
		tmp_int_contents=JUMP
		swbreak
	case get_string@mnemonic(nm(AWAIT1))
		tmp_int_contents=AWAIT1
		swbreak
	case get_string@mnemonic(nm(AWAIT_X))
		tmp_int_contents=AWAIT_X
		swbreak
	case get_string@mnemonic(nm(WAIT_X))
		tmp_int_contents=WAIT_X
		swbreak
	case get_string@mnemonic(nm(DISP))
		tmp_int_contents=DISP
		swbreak
	swend
	return tmp_int_contents
	
/////////////////////////////////////////////////////////////////////////////////
//	xW
/////////////////////////////////////////////////////////////////////////////////
*collect_label
	dim labels,256
	repeat this_line
		if type.cnt==type_label{
			hoge=int_contents.cnt
			labels.hoge=cnt+1
		}
	loop
	return
	
/////////////////////////////////////////////////////////////////////////////////
//	intϐW
/////////////////////////////////////////////////////////////////////////////////
*collect_def_var_int
	dim int_vars,256
	repeat this_line
		if type.cnt==type_def_var_int{
			hoge=int_contents.cnt
			int_vars.hoge=2
		}
	loop
	return
	
/////////////////////////////////////////////////////////////////////////////////
//	͂R[h\
/////////////////////////////////////////////////////////////////////////////////
*show_of_scanner
screen 2
sdim _4analyzeMB,128*256
_4analyzeMB="code begin\n\n"
mesbox _4analyzeMB,640,480,1
ID4analyzeMB=stat
goto *@f
#deffunc add_analyze_MB str p_add
	_4analyzeMB+=p_add
	return
*@
	tmp_show_line=0
	str_line=""
	repeat 256
		if labels.cnt!=0{
			add_analyze_MB "NO."+(cnt+1)+" "+labels.cnt+"\n"	
		}	
	loop
	add_analyze_MB "\n"
	repeat 256
		if int_vars.cnt!=0{
			add_analyze_MB "NO."+(cnt+1)+" "+(int_vars.cnt-1)+"\n"	
		}	
	loop
	add_analyze_MB "\nline:"+notemax+"\n"
	repeat this_line
		if tmp_show_line!=lines(cnt){
			noteget str_line,lines(cnt)-1
			add_analyze_MB "\n"+strf("%4.4d:",lines(cnt))+str_line+"\n"
			tmp_show_line++
		}
//		logmes ""+type.cnt
		if type.cnt==type_mnemonic{
			add_analyze_MB ""+type_mnemonic+":type_mnemonic "+"\n"
			add_analyze_MB ""+int_contents.cnt+":"+get_string@mnemonic(nm(int_contents.cnt))+"\n"
		}
		if type.cnt==type_label{
			add_analyze_MB ""+type_label+":type_label "+"\n"
			add_analyze_MB ""+int_contents.cnt+strf(" : %x",int_contents.cnt)+"\n"
		}
		if type.cnt==type_label_address{
			add_analyze_MB ""+type_label_address+":type_label_address "+"\n"
			add_analyze_MB ""+int_contents.cnt+strf(" : %x",int_contents.cnt)+"\n"
		}
		if type.cnt==type_int{
			add_analyze_MB ""+type_int+":type_int \n"
			add_analyze_MB ""+int_contents.cnt+strf(" : %x",int_contents.cnt)+"\n"
		}
		if type.cnt==type_int_address{
			add_analyze_MB ""+type_int_address+":type_int_address \n"
			add_analyze_MB ""+int_contents.cnt+strf(" : %x",int_contents.cnt)+"\n"
		}
		add_analyze_MB "line:"+lines(cnt)+"\n"
	loop
	repeat 256
	add_analyze_MB "type:"+type.cnt+"\n"
	loop
	add_analyze_MB "\ncode end\n"
	objprm ID4analyzeMB,_4analyzeMB