(***Assembler fuer 8080,8085,Z80***) PROC regh: IF pos(in,"A",4) = (pos(in,",")+1) THEN out(printer,"F"); ELIF pos(in,"B",4) = (pos(in,",")+1) THEN out(printer,"8"); ELIF pos(in,"C",4) = (pos(in,",")+1) THEN out(printer,"9"); ELIF pos(in,"D",4) = (pos(in,",")+1) THEN out(printer,"A"); ELIF pos(in,"E",4) = (pos(in,",")+1) THEN out(printer,"B"); ELIF pos(in,"H",4) = (pos(in,",")+1) THEN out(printer,"C"); ELIF pos(in,"L",4) = (pos(in,",")+1) THEN out(printer,"D"); ELIF pos(in,"M",4) = (pos(in,",")+1) OR pos(in,"m") = (pos(in,",")+1) THEN out(printer,"E") FI ENDPROC regh. PROC regl: IF pos(in,"A",4) > (pos(in,",")+0) THEN out(printer,"7"); ELIF pos(in,"B",4) > (pos(in,",")+0) THEN out(printer,"0"); ELIF pos(in,"C",4) > (pos(in,",")+0) THEN out(printer,"1"); ELIF pos(in,"D",4) > (pos(in,",")+0) THEN out(printer,"2"); ELIF pos(in,"E",4) > (pos(in,",")+0) THEN out(printer,"3"); ELIF pos(in,"H",4) > (pos(in,",")+0) THEN out(printer,"4"); ELIF pos(in,"L",4) > (pos(in,",")+0) THEN out(printer,"5"); ELIF pos(in,"M",4) > (pos(in,",")+0) OR pos(in,"m") > (pos(in,",")+0) THEN out(printer,"6") FI ENDPROC regl. (*************************) (*Autor:M.Staubermann *) BOOL VAR ad,number,falsch; (*Version:1.2.2 *) ad:=FALSE; (*Datum:7.12.82 *) number:=FALSE; (*************************) falsch:=FALSE; INT VAR count,fehler; TEXT VAR hilf,in,startaddresse::"0000"; hilf:=" "; count:=0; fehler:=0; hilf:=" "; commanddialogue(FALSE); forget("maschinencode"); FILE VAR printer:=sequentialfile(output,"maschinencode"); forget("assemb"); FILE VAR ass:=sequentialfile(modify,"assemb"); forget("errors"); FILE VAR fehlerliste:=sequentialfile(output,"errors"); commanddialogue(TRUE); line; putline(" gib assembler kommando :"); putline(" edit"); pause(10); edit("assemb"); tofirstrecord(ass); putline(" gib assembler kommando :"); putline(" debug"); pause(10); line; put (" "); put(printer,"Line: Add: Code:"); line(printer); hexbeginn; REPEAT fehler:=fehler+1; out(printer,text(fehler,4)); cout(fehler); out(printer," "); hex; readrecord(ass,in); forward(ass); out(printer," "); IF pos(in,"NOP") > 0 THEN out(printer,"00"); ELIF pos(in,"HLT") > 0 THEN out(printer,"76"); ELIF compress(in)="DI" THEN out(printer,"F3"); ELIF pos(in,"EI") > 0 THEN out(printer,"FB"); ELIF pos(in,"CMC") > 0 THEN out(printer,"3F"); ELIF pos(in,"CMA") > 0 THEN out(printer,"2F"); ELIF pos(in,"STC") > 0 THEN out(printer,"37"); ELIF pos(in,"DAA") > 0 THEN out(printer,"27"); ELIF pos(in,"RRC") > 0 THEN out(printer,"0F"); ELIF pos(in,"RLC") > 0 THEN out(printer,"07"); ELIF pos(in,"RAL") > 0 THEN out(printer,"17"); ELIF pos(in,"RAR") > 0 THEN out(printer,"1F"); ELIF pos(in,"XCHG")> 0 THEN out(printer,"EB"); ELIF pos(in,"XTHL")> 0 THEN out(printer,"E3"); ELIF pos(in,"SPHL")> 0 THEN out(printer,"F9"); ELIF pos(in,"ADI") > 0 THEN out(printer,"C6");number:=TRUE; ELIF pos(in,"ACI") > 0 THEN out(printer,"CE");number:=TRUE; ELIF pos(in,"SUI") > 0 THEN out(printer,"D6");number:=TRUE; ELIF pos(in,"SBI") > 0 THEN out(printer,"DE");number:=TRUE; ELIF pos(in,"ANI") > 0 THEN out(printer,"E6");number:=TRUE; ELIF pos(in,"XRI") > 0 THEN out(printer,"EE");number:=TRUE; ELIF pos(in,"ORI") > 0 THEN out(printer,"F6");number:=TRUE; ELIF pos(in,"CPI") > 0 THEN out(printer,"FE");number:=TRUE; ELIF compress(in)="STA"THEN out(printer,"32");ad:=TRUE; ELIF compress(in)="LDA"THEN out(printer,"3A");ad:=TRUE; ELIF pos(in,"SHLD")> 0 THEN out(printer,"22");ad:=TRUE; ELIF pos(in,"LHLD")> 0 THEN out(printer,"2A");ad:=TRUE; ELIF pos(in,"PCHL")> 0 THEN out(printer,"E9"); ELIF pos(in,"JMP") > 0 THEN out(printer,"C3");ad:=TRUE; ELIF pos(in,"JC") > 0 THEN out(printer,"DA");ad:=TRUE; ELIF pos(in,"JNC") > 0 THEN out(printer,"D2");ad:=TRUE; ELIF pos(in,"JZ") > 0 THEN out(printer,"CA");ad:=TRUE; ELIF pos(in,"JNZ") > 0 THEN out(printer,"C2");ad:=TRUE; ELIF compress(in)="JM" THEN out(printer,"FA");ad:=TRUE; ELIF compress(in)="JP" THEN out(printer,"F2");ad:=TRUE; ELIF pos(in,"JPE") > 0 THEN out(printer,"EA");ad:=TRUE; ELIF pos(in,"JPO") > 0 THEN out(printer,"E2");ad:=TRUE; ELIF pos(in,"CALL")> 0 THEN out(printer,"CD");ad:=TRUE; ELIF pos(in,"OUT") > 0 THEN out(printer,"D3");number:=TRUE; ELIF pos(in,"CC") > 0 THEN out(printer,"DC");ad:=TRUE; ELIF pos(in,"CNC") > 0 THEN out(printer,"D4");ad:=TRUE; ELIF pos(in,"CZ") > 0 THEN out(printer,"CC");ad:=TRUE; ELIF pos(in,"CNZ") > 0 THEN out(printer,"C4");ad:=TRUE; ELIF pos(in,"CM") > 0 THEN out(printer,"FC");ad:=TRUE; ELIF compress(in)="CP" THEN out(printer,"F4");ad:=TRUE; ELIF pos(in,"CPE") > 0 THEN out(printer,"EC");ad:=TRUE; ELIF pos(in,"CPO") > 0 THEN out(printer,"E4");ad:=TRUE; ELIF pos(in,"RET") > 0 THEN out(printer,"C9"); ELIF pos(in,"RC") > 0 THEN out(printer,"D8"); ELIF pos(in,"RNC") > 0 THEN out(printer,"D0"); ELIF pos(in,"RZ") > 0 THEN out(printer,"C8"); ELIF pos(in,"RNZ") > 0 THEN out(printer,"C0"); ELIF pos(in,"RM") > 0 THEN out(printer,"F8"); ELIF compress(in)="RP" THEN out(printer,"F0"); ELIF pos(in,"RPE") > 0 THEN out(printer,"E8"); ELIF pos(in,"RPO") > 0 THEN out(printer,"E0"); ELIF pos(in,"RST") > 0 AND pos(in,"0") > 3 THEN out(printer,"C7"); ELIF pos(in,"RST") > 0 AND pos(in,"1") > 3 THEN out(printer,"CF"); ELIF pos(in,"RST") > 0 AND pos(in,"2") > 3 THEN out(printer,"D7"); ELIF pos(in,"RST") > 0 AND pos(in,"3") > 3 THEN out(printer,"DF"); ELIF pos(in,"RST") > 0 AND pos(in,"4") > 3 THEN out(printer,"E7"); ELIF pos(in,"RST") > 0 AND pos(in,"5") > 3 THEN out(printer,"EF"); ELIF pos(in,"RST") > 0 AND pos(in,"6") > 3 THEN out(printer,"F7"); ELIF pos(in,"RST") > 0 AND pos(in,"7") > 3 THEN out(printer,"FF"); ELIF pos(in,"MOV") > 0 THEN IF pos(in,"A") = (pos(in,",")-1) THEN out(printer,"7");regh; ELIF pos(in,"B") = (pos(in,",")-1) THEN out(printer,"4");regl; ELIF pos(in,"C") = (pos(in,",")-1) THEN out(printer,"4");regh; ELIF pos(in,"D") = (pos(in,",")-1) THEN out(printer,"5");regl; ELIF pos(in,"E") = (pos(in,",")-1) THEN out(printer,"5");regh; ELIF pos(in,"H") = (pos(in,",")-1) THEN out(printer,"6");regl; ELIF pos(in,"L") = (pos(in,",")-1) THEN out(printer,"6");regh; ELIF pos(in,"M",4) = (pos(in,",")-1) OR pos(in,"m") = (pos(in,",")-1) THEN out(printer,"4");regl FI; ELIF pos(in,"MVI") > 0 THEN IF pos(in,"A") = (pos(in,",")-1) THEN out(printer,"3E"); ELIF pos(in,"B") = (pos(in,",")-1) THEN out(printer,"06"); ELIF pos(in,"C") = (pos(in,",")-1) THEN out(printer,"0E"); ELIF pos(in,"D") = (pos(in,",")-1) THEN out(printer,"16"); ELIF pos(in,"E") = (pos(in,",")-1) THEN out(printer,"1E"); ELIF pos(in,"H") = (pos(in,",")-1) THEN out(printer,"26"); ELIF pos(in,"L") = (pos(in,",")-1) THEN out(printer,"2E"); ELIF pos(in,"M",4) = (pos(in,",")-1) OR pos(in,"m") = (pos(in,",")-1) THEN out(printer,"36") FI; ELIF pos(in,"LXI") > 0 THEN ad:=TRUE; IF pos(in,"B") > 4 THEN out(printer,"01");ad:=TRUE; ELIF pos(in,"D") > 4 THEN out(printer,"11");ad:=TRUE; ELIF pos(in,"H") > 4 THEN out(printer,"21");ad:=TRUE; ELIF pos(in,"SP")> 4 THEN out(printer,"31");ad:=TRUE FI; ELIF pos(in,"PUSH") > 0 THEN IF pos(in,"B") > 4 THEN out(printer,"C5"); ELIF pos(in,"D") > 4 THEN out(printer,"D5"); ELIF pos(in,"H",5) > 4 THEN out(printer,"E5"); ELIF pos(in,"A") > 4 OR pos(in,"PSW")> 4 THEN out(printer,"F5") FI; ELIF pos(in,"POP") > 0 THEN IF pos(in,"B") > 4 THEN out(printer,"C1"); ELIF pos(in,"D") > 4 THEN out(printer,"D1"); ELIF pos(in,"H") > 4 THEN out(printer,"E1"); ELIF pos(in,"A") > 4 OR pos(in,"PSW")> 4 THEN out(printer,"F1") FI; ELIF pos(in,"LDAX") > 0 THEN IF pos(in,"B") > 4 THEN out(printer,"0A"); ELIF pos(in,"D",5) > 4 THEN out(printer,"1A") FI; ELIF pos(in,"STAX") > 0 THEN IF pos(in,"B") > 4 THEN out(printer,"02"); ELIF pos(in,"D") > 4 THEN out(printer,"12") FI; ELIF pos(in,"INX") > 0 THEN IF pos(in,"B") > 4 THEN out(printer,"03"); ELIF pos(in,"D") > 4 THEN out(printer,"13"); ELIF pos(in,"H") > 4 THEN out(printer,"2A"); ELIF pos(in,"SP")> 4 THEN out(printer,"3A") FI; ELIF pos(in,"DCX") > 0 THEN IF pos(in,"B") > 4 THEN out(printer,"0B"); ELIF pos(in,"D",4)>4 THEN out(printer,"1B"); ELIF pos(in,"H") > 4 THEN out(printer,"2B"); ELIF pos(in,"SP")> 4 THEN out(printer,"3B") FI; ELIF pos(in,"DAD") > 0 THEN IF pos(in,"B") > 4 THEN out(printer,"09"); ELIF pos(in,"D",4)>4 THEN out(printer,"19"); ELIF pos(in,"H") > 4 THEN out(printer,"29"); ELIF pos(in,"SP")> 4 THEN out(printer,"39") FI; ELIF pos(in,"ADD") > 0 THEN out(printer,"8");regl; ELIF pos(in,"ADC") > 0 THEN out(printer,"8");regl; ELIF pos(in,"SUB") > 0 THEN out(printer,"9");regl; ELIF pos(in,"SBB") > 0 THEN out(printer,"9");regl; ELIF pos(in,"ANA") > 0 THEN out(printer,"A");regl; ELIF pos(in,"XRA") > 0 THEN out(printer,"A");regl; ELIF pos(in,"ORA") > 0 THEN out(printer,"B");regl; ELIF pos(in,"CMP") > 0 THEN out(printer,"B");regl; ELIF pos(in,"INR") > 0 THEN IFpos(in,"A") > 4 THEN out(printer,"3C") FI; ELIF pos(in,"INR") > 0 THEN IFpos(in,"B") > 4 THEN out(printer,"04") FI; ELIF pos(in,"INR") > 0 THEN IFpos(in,"C") > 4 THEN out(printer,"0C") FI; ELIF pos(in,"INR") > 0 THEN IFpos(in,"D") > 4 THEN out(printer,"14") FI; ELIF pos(in,"INR") > 0 THEN IFpos(in,"E") > 4 THEN out(printer,"1C") FI; ELIF pos(in,"INR") > 0 THEN IFpos(in,"H") > 4 THEN out(printer,"24") FI; ELIF pos(in,"INR") > 0 THEN IFpos(in,"L") > 4 THEN out(printer,"2C") FI; ELIF pos(in,"INR") > 0 THEN IFpos(in,"M") > 4 OR pos(in,"m") > 4 THEN out(printer,"34") FI; ELIF pos(in, "IN") > 0 THEN out(printer,"DB"); number:=TRUE; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"A") > 4 THEN out(printer,"3D") FI; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"B") > 4 THEN out(printer,"05") FI; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"C",4) > 4 THEN out(printer,"0D") FI; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"D",4) > 4 THEN out(printer,"15") FI; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"E") > 4 THEN out(printer,"1D") FI; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"H") > 4 THEN out(printer,"25") FI; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"L") > 4 THEN out(printer,"2D") FI; ELIF pos(in,"DCR") > 0 THEN IFpos(in,"M") > 4 OR pos(in,"m") > 4 THEN out(printer,"35") FI; ELIF pos(in,"ORG") > 0 THEN hilf:=compress(subtext(in,4,7)); putline(printer,hilf); startaddresse:=hilf; hexbeginn; ELIF pos(in,"TITL") > 0 THEN putline(printer,subtext(in,6)); ELIF pos(in,"#") > 0 THEN hilf:=subtext(in,pos(in,"#")+1); out(printer,hilf) ; ELSE putline("Fehler erkannt in Zeile "+text(fehler)+" bei '"+in+"' !"); out(printer,in); putline(fehlerliste,"Fehler in Zeile "+text(fehler)+" bei: "+in); count:=count+1; falsch:=TRUE FI; line(printer); IF ad THEN ad:=FALSE; fehler:=fehler+1; out(printer,text(fehler,4)); cout(fehler); out(printer," "); hex; out(printer," "); IF pos(in,",") > 3 THEN hilf:=subtext(in,(pos(in,",")+1),(pos(in,",")+4)); fehler:=fehler+1; out(printer,text(fehler,4)); cout(fehler); out(printer," "); hex; out(printer," "); line(printer) ELSE hilf:=compress(subtext(in,10,15)) FI; fehler:=fehler+1; out(printer,text(fehler,4)); cout(fehler); out(printer," "); hex; out(printer," "); out(printer,subtext(hilf,3,4)); fehler:=fehler+1; out(printer,text(fehler,4)); cout(fehler); out(printer," "); hex; out(printer," "); out(printer,subtext(hilf,1,2)); line(printer); ELIF number THEN number:=FALSE; fehler:=fehler+1; out(printer,text(fehler,4)); cout(fehler); out(printer," "); hex; out(printer," "); IF pos(in,",") > 2 THEN hilf:= subtext(in, (pos(in,",") +1),(pos(in,",")+2)); out(printer,hilf); line(printer) ELSE out(printer,compress(subtext(in,14,21))); line(printer) FI FI ; UNTIL compress(in) = "END" OR compress(in) = "end" OR eof(ass) ENDREPEAT; IF count<> 0 THEN putline(text(count)+" Fehler erkannt."); falsch:=TRUE ELSE putline(" Keine Fehler, "+text(fehler)+" Zeilen.") ; falsch:=FALSE FI; putline(8*" "+7*"*"+" ENDE DER UEBERSETZUNG "+7*"*"+8*" "); pause(20); IF falsch THEN edit("errors","assemb") ELSE edit("maschinencode") FI; IF yes("Maschinencodelisting") THEN print("maschinencode") FI; IF yes("runagain") THEN runagain FI. hexbeginn: (*Hexadezimalzaehler*) INT VAR a1,a2,a3,a4,subi; TEXT VAR a1t,a2t,a3t,a4t,subt,counter; a1t:=subtext(startaddresse,1,1); a2t:=subtext(startaddresse,2,2); a3t:=subtext(startaddresse,3,3); a4t:=subtext(startaddresse,4,4). hex: subt:=a1t; decoder; a1:=subi; subt:=a2t; decoder; a2:=subi; subt:=a3t; decoder; a3:=subi; decoder; a4:=subi; zaehl; IF a4 = 16 THEN a4:=0; a3:=a3+1 FI; IF a3 = 16 THEN a3:=0; a2:=a2+1 FI; IF a2 = 16 THEN a2:=0; a1:=a1+1 FI; IF a1 = 16 THEN a1:=0; put(printer,"Storageoverflow !") FI; subi:=a1; encode; a1t:=subt; subi:=a2; encode; a2t:=subt; subi:=a3; encode; a3t:=subt; subi:=a4; encode; a4t:=subt; counter:=a1t; counter CAT a2t; counter CAT a3t; counter CAT a4t; put(printer,counter). zaehl: a4:=a4+1. decoder: IF subt ="A" THEN subi:=10; ELIF subt ="B" THEN subi:=11; ELIF subt ="C" THEN subi:=12; ELIF subt ="D" THEN subi:=13; ELIF subt ="E" THEN subi:=14; ELIF subt ="F" THEN subi:=15 ELSE subi:=int(subt) FI. encode: IF subi = 10 THEN subt:="A"; ELIF subi = 11 THEN subt:="B"; ELIF subi = 12 THEN subt:="C"; ELIF subi = 13 THEN subt:="D"; ELIF subi = 14 THEN subt:="E"; ELIF subi = 15 THEN subt:="F" ELSE subt:=text(subi) FI.