BEGIN { err="/dev/stderr" printf("\nZ80デバッグファイル作成ツール") >err printf(" DBGZ80\t\tBy Jouji\n\n") >err if(tmp=="") tmp="dbgz80.tmp" if(dbg=="") dbg="dbgz80.dbg" dat="dbgz80.dat" em[1]="不正なオペレーションコードが使われている" em[2]="文法違反" em[3]="未定義シンボルが使われている" em[4]="相対ジャンプ先が範囲を越えている" em[5]="変位の値が範囲を越えている" em[6]="不正なアドレスが指定されている" em[7]="シンボルが二重に定義されている" print "ニーモニックテーブルにデータをセットしています‥‥" >err oc="^(LD|PUSH|POP|EX|EXX|LDI|LDIR|LDD|LDDR|CPI|CPIR|CPD|CPDR|DAA|CPL|NEG|CCF|SCF|NOP|HALT|DI|EI|ADD|ADC|SUB|SBC|AND|OR|XOR|CP|INC|DEC|RLCA|RLA|RRCA|RRA|RLD|RRD|JP|JR|DJNZ|CALL|RET|RETI|RETN|IN|INI|INIR|IND|INDR|OUT|OUTI|OUTIR|OUTD|OUTDR)$" r1="^([ABCDEHLIRFZPM]|\\((C|BC|DE|HL|IX|IY|SP)\\)|AF'?|BC|DE|HL|IX|IY|SP|NZ|NC|PO|PE)$" r2="^([ABCDEHLIR]|\\((C|BC|DE|HL|IX|IY)\\)|AF'|BC|DE|HL|IX|IY|SP)$" r="^([ABCDEHL]|\\(HL\\))$" while(getline0) ob[$1]=$2 FS=",|[ \t]+" h["0"]=0; h["1"]=1; h["2"]=2; h["3"]=3; h["4"]=4; h["5"]=5; h["6"]=6 h["7"]=7; h["8"]=8; h["9"]=9; h["A"]=10;h["B"]=11;h["C"]=12;h["D"]=13 h["E"]=14;h["F"]=15 for(i=32;i<256;i++) asc[sprintf("%c",i)]=i print "パス1の処理中‥‥" >err } { ol[NR]=$0 sub(/;.*$/,"") if($0=="") next while($0~/'.+'/) { a=index($0,"'") s=substr($0,1,a-1) t=substr($0,a+1) a=index(t,"'") u=substr(t,1,a-1) t=substr(t,a+1) l=length(u) v="" for(i=1;i<=l;i++) { c=substr(u,i,1) v=v sprintf("%d,",asc[c]) } sub(/.$/,"",v) $0=s v t } $0=toupper($0) } $1!="" { sub(/:+$/,"",$1) if($1 in st) error(7,NR) st[$1]=addr } $2=="EQU" {st[$1]=tonum($3);next} $2=="ORG" { a=tonum($3) if(atmp else printf("%04d D%04X @1%s\n",NR,addr,$i) >tmp addr++ } next } $2=="DW" { for(i=3;i<=NF && $i!="";i++) { if($i~/^[0-9]/) { n=tonum($i) printf("%04d D%04X %02X\n%04d D%04X %02X\n", NR,addr++,n%256,NR,addr++,int(n/256)) >tmp } else { printf("%04d D%04X @2%s\n",NR,addr,$i) >tmp addr+=2 } } next } $2=="DS" { n=tonum($3) for(i=1;i<=n;i++) printf("%04d D%04X 00\n",NR,addr++) >tmp next } $2=="END" {exit} $2=="" {next} {fl=0;op=$2} op=="IM" { printf("%04d I%04X IM %s\n",NR,addr,$3) >tmp addr+=2 next } op=="RST" { n=tonum($3) if(n<8) n=8*n if(n>56 || n%8!=0) error(2,NR) printf("%04d I%04X RST %02X\n",NR,addr,n) >tmp addr++ next } op=="LD" { if($3~r && $4~r) { printf("%04d I%04X LD %s,%s\n",NR,addr,$3,$4) >tmp addr++ next } if($3~r && $4~/^\(I[XY].*\)$/) { s=ixiy($4) printf("%04d I%04X LD %s,%s%s)\n",NR,addr,$3,substr($4,1,3),s) >tmp addr+=3 next } if($3~/^\(I[XY].*\)$/) { if($4~r) { t=$4 a=addr+3 } else { if($4~/^[0-9]/) { n=tonum($4) t=sprintf("%04X",n%256) } else t="@l" $4 a=addr+4 } s=ixiy($3) printf("%04d I%04X LD %s%s),%s\n",NR,addr,substr($3,1,3),s,t) >tmp addr=a next } } op~/^(ADD|ADC|SBC)$/ && $3=="A" { if($4~r) { printf("%04d I%04X %-5sA,%s\n",NR,addr,op,$4) >tmp addr++ next } if($4~/^\(I[XY].*\)$/) { s=ixiy($4) printf("%04d I%04X %-5sA,%s%s)\n",NR,addr,op,substr($4,1,3),s) >tmp addr+=3 next } } op~/^(SUB|AND|XOR|OR|CP)$/ { if($3~r) { printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp addr++ next } if($3~/^\(I[XY].*\)$/) { s=ixiy($3) printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp addr+=3 next } } op~/^(INC|DEC)$/ { if($3~r) { printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp addr++ next } else if($3~/^\(I[XY].*\)$/) { s=ixiy($3) printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp addr+=3 next } } op~/^(RLC|RRC|RL|RR|SLA|SRA|SRL)$/ { if($3~r) { printf("%04d I%04X %-5s%s\n",NR,addr,op,$3) >tmp addr+=2 } else if($3~/^\(I[XY].*\)$/) { s=ixiy($3) printf("%04d I%04X %-5s%s%s)\n",NR,addr,op,substr($3,1,3),s) >tmp addr+=4 } else error(2,NR) next } op~/^(BIT|RES|SET)$/ && $3~/^[0-7]$/ { if($4~r) { printf("%04d I%04X %-5s%s,%s\n",NR,addr,op,$3,$4) >tmp addr+=2 } else if($4~/^\(I[XY].*\)$/) { s=ixiy($4) printf("%04d I%04X %-5s%s,%s%s)\n",NR,addr,op,$3,substr($4,1,3),s) >tmp addr+=4 } else error(2,NR) next } op!~oc {error(1,NR)} $3!="" { if($3~r1) { op=op $3 opr1=$3 } else if($3~/^\(.+\)$/) { fl=1 l=$3 gsub(/^\(|\)$/,"",l) op=op"(?)" opr1="(?)" } else { fl=1 l=$3 op=op"?" opr1="?" } } $4!="" { if($4~r2) { op=op $4 opr2=$4 } else if($4~/^\(.+\)$/) { fl=1 l=$4 gsub(/^\(|\)$/,"",l) op=op"(?)" opr2="(?)" } else { fl=1 l=$4 op=op"?" opr2="?" } } { if(!(op in ob)) error(2,NR) a=addr+ob[op] if($3=="") { printf("%04d I%04X %s\n",NR,addr,$2)>tmp addr=a next } else if($4=="") opr=sprintf("%s",opr1) else opr=sprintf("%s,%s",opr1,opr2) if(l~/^[0-9]/) l=sprintf("%04X",tonum(l)) else l=sprintf("@l%s",l) sub(/\?/,l,opr) printf("%04d I%04X %-5s%s\n",NR,addr,$2,opr) >tmp addr=a } END { print"" >tmp for(s in st) printf("%04X %s\n",st[s],s) >tmp close(tmp) if(errf==1) exit printf("パス2の処理中‥‥\n\n") >err while(getline0 && $0!="") { for(i=3;i<=NF;i++) { if(!(j=index($i,"@"))) continue nr=substr($i,j+1,1) l=substr($i,j+2) sub(/\)$/,"",l) if(!(l in st)) error(3,$1) n=st[l] addr=tonum("0"substr($2,2)"H") if(nr=="l") if($3~/^(JR|DJNZ)$/) { e=n-(addr+2) if(e>127||e<-128) error(4,$1) $i=sprintf("@%04X",n) } else { sub(/@.+$/,sprintf("%04X",n),$i) if(j>1) $i=$i ")" } else if(nr~/^[+-]$/) { if(nr=="-") n=-n if(n<-128||n>255) error(5,$1) if(n<0) n+=256 d=sprintf("%02X",n) sub(/@.+$/,d")",$i) } else { $i=sprintf("%02X",n%256) if(nr=="2") { printf("%s %s %s\n",$1,$2,$3) $2=sprintf("D%04X",++addr) $i=sprintf("%02X",int(n/256)) } } } n=$1+0 if(n==qn) { printf("%s %s %s\n",$1,$2,$3) continue } if($4=="") s=sprintf("%s %s %-s",$1,$2,$3) else if($5=="") s=sprintf("%s %s %-5s%s",$1,$2,$3,$4) else s=sprintf("%s %s %-5s%s,%s",$1,$2,$3,$4,$5) i=length(s) print s rep(" ",31-i) ";" ol[n] qn=n } } function tonum(s, i,m,n,c) { if(s!~/^[0-9]/) return 0 if(s!~/H$/) return s+0 m=length(s) for(i=1;i255) error(5,NR) if(n<0) n+=256 return sprintf("%02X",n) } else return ("@" pm l) } function rep(c,n, s) { while(n-->0) s=s c return s } function error(i,s) { print em[i] ": " s " 行" >err errf=1 exit }