(* INCLUDE-FILE FUER ASSEMBLER *) (* FLORIAN MATTHES 1.6.1986 *) PROCEDURE ASSEMBLE(OPC: LSTRING; AM : TMODE); (* ASSEMBLIERE KOMPLETTEN BEFEHL UND *) (* ERZEUGE OPCODE UND OPERAND. AM ENTHAELT *) (* BEIM AUFRUF DIE ERSTE GEFUNDENE ADRES- *) (* SIERUNGSART DES OPCODES. *) VAR OP : INTEGER; (* OPCODE *) VAL: INTEGER; (* OPERAND *) PROCEDURE GETOPERAND(VAR AM : TMODE; VAR WERT: INTEGER); (* LESEN UND ANALYSIEREN OPERAND UND *) (* ADRESSIERUNGSART. AM ENTHAELT BEIM AUF-*) (* RUF DIE MIT ANYMODE GEFUNDENE *) (* ADRESSIERUNGSART! *) VAR OFFSET: INTEGER; ART : TART; PROCEDURE GETINDIRECT; (* VERARBEITE INDIREKTE ADRESSIERUNG *) BEGIN GETTOKEN; FORMULA(WERT,ART,TRUE); CASE TOKEN OF RBRACK:BEGIN GETTOKEN; IF TOKEN=LINEEND THEN AM:=IND ELSE BEGIN IF TOKEN<>KOMMA THEN ERROR(1); GETTOKEN; IF (TOKEN<>LBL) OR (GLOBALLBL<>YREGISTER) THEN ERROR(1); GETTOKEN; AM:= INDY; END; END; KOMMA :BEGIN AM:= INDX; GETTOKEN; IF (TOKEN<>LBL) OR (GLOBALLBL<>XREGISTER) THEN ERROR(1); GETTOKEN; IF TOKEN<>RBRACK THEN ERROR(1); GETTOKEN; END ELSE ERROR(1) END; (* CASE *) END; (* GETINDIRECT *) BEGIN (* GETOPERAND *) IF AM=RELATIVE THEN (* BRANCH BEFEHL *) BEGIN FORMULA(WERT,ART,TRUE); OFFSET:=ADDU(WERT,-ADDU(AD,2)); IF (OFFSET>127) OR (OFFSET<-128) THEN BEGIN ERROR(7); OFFSET:=0 END; WERT:=OFFSET AND 255; END ELSE CASE TOKEN OF DBLCROSS: BEGIN GETTOKEN; FORMULA(WERT,ART,TRUE); IF LENGTH(WERT)<>1 THEN ERROR(7); AM:=IMMEDIATE; END; LBRACK : GETINDIRECT; LINEEND: AM:=IMPLIED; ELSE BEGIN FORMULA(WERT,ART,TRUE); AM:=LENGTH(WERT)+1; IF TOKEN=KOMMA THEN BEGIN GETTOKEN; IF TOKEN<>LBL THEN ERROR(1); IF GLOBALLBL=XREGISTER THEN AM:=AM+4 ELSE IF GLOBALLBL=YREGISTER THEN AM:=AM+8 ELSE ERROR(1); GETTOKEN; END; END (* ELSE *) END; (* CASE *) IF TOKEN<>LINEEND THEN ERROR(1); END;(* GETOPERAND *) BEGIN (* ASSEMBLE *) GETTOKEN; GETOPERAND(AM,VAL); OP:=CODE(OPC,AM); (* SUCHE OPCODE *) IF OP=UNKNOWN THEN BEGIN (* EVTL. ZERO-PAGE EXPANDIEREN! *) AM:= AM OR 1; OP:= CODE(OPC,AM); END; IF OP=UNKNOWN THEN ERROR(7); OUT(OP); CASE AM AND 3 OF 3: BEGIN OUT(VAL);OUT(HBYTE(VAL)) END; 2: OUT(VAL); 1: (* KEIN OPERAND *) END; (* CASE *) END;(* ASSEMBLE *)