4IBM >;p >> FastCopy PRO << by Martin Backschat, Bergstr.16, D-8071 Hepberg // (c) 1991 ICP Verlag/TOS Magazin, Wendelsteinstr. 3, D-8011 Vaterstetten, Tel. 0810633954}'  @`! #@%`')+-/13o9=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} o @ ` @ ` @ ` @ ` ǀ ɠ O ` ׀ ٠ @` @`Ao  !Ao!!#A%a')+-/1!3A5a79;=?/CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuwy{A  @`! #@%`')+-/13o9=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} o @ ` @ ` @ ` @ ` ǀ ɠ O ` ׀ ٠ @` @`Ao  !Ao!!#A%a')+-/1!3A5a79;=?/CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuwy{AAS8051 !ZOO TTP APOMPEY PRG vPOMPEY RSC <@ TPACKER PRG i6}A. !.. !DOC !SRC !TEST !AS8051 TTP  DEVNOTE ^README 1ST . !.. !AS8051 DOC ^AS8051 MAN l$ _BASE DOC l$. !.. !AS8051 C d>AS8051 PRJ YAS8051 Y mDASCII CHD ^FRAEBIN H ^2FRAEUNI H ^4\FRAGCON H ^5FRAOSUB C ^;FRAPSUB C ^oVFRASMAINC ^0FRASMDATH ^7 FRAYTOK H wFRYYLEX C ^sGETOPT H ^;Z MAKEFILE ^M MAKEFILEDOS ^. !.. !AS8051 TST mfAS8051 TUT m i A. Appendix for as8051 Frankenstein Assembler A.1 Pseudo Operations A.1.1 Standard Pseudo Operation Mnemonics End END File Inclusion INCL INCLUDE If IF Else ELSE End If ENDI Equate EQU Set SET Org ORG Reserve Memory RESERVE RMB Define Byte Data BYTE DB FCB Define Word Data DW FDB WORD Define String Data FCC STRING Define Character Set Translation CHARSET Define Character Value CHARDEF CHD Use Character Translation CHARUSE A.1.2 Machine Dependent Pseudo Operations A.1.2.1 Define Word Data The Define Word Data pseudo-operations generate the byte reversed form for 16 bit constants. The first byte is the low order half, followed by the high order byte. A.2 Instructions A.2.1 Instruction List Opcode Syntax Selection Criteria ACALL expr ADD A ',' '#' expr ADD A ',' '@' REG R01 ADD A ',' REG R07 ADD A ',' expr ADDC A ',' '#' expr ADDC A ',' '@' REG R01 ADDC A ',' REG R07 ADDC A ',' expr AJMP expr ANL A ',' '#' expr ANL A ',' '@' REG R01 ANL A ',' REG R07 ANL A ',' expr ANL C ',' '/' bit ANL C ',' '/' expr ANL C ',' bit ANL C ',' expr ANL expr ',' '#' expr ANL expr ','A CJNE A ',' '#' expr ',' expr CJNE A ',' expr ',' expr CJNE '@' REG ',' '#' expr ',' expr R01 CJNE REG ',' '#' expr ',' expr R07 CLR A CLR C CLR bit CLR expr CPL A CPL C CPL bit CPL expr DA A DEC '@' REG R01 DEC A DEC REG R07 DEC expr DIV AB DJNZ REG ',' expr R07 DJNZ expr ',' expr INC '@' REG R01 INC A INC DPTR INC REG R07 INC expr JB bit ',' expr JB expr ',' expr JBC bit ',' expr JBC expr ',' expr JC expr JMP '@' A '+' DPTR JNB bit ',' expr JNB expr ',' expr JNC expr JNZ expr JZ expr LCALL expr LJMP expr MOV '@' REG ',' '#' expr R01 MOV '@' REG ',' A R01 MOV '@' REG ',' expr R01 MOV A ',' '#' expr MOV A ',' '@' REG R01 MOV A ',' REG R07 MOV A ',' expr MOV C ',' bit MOV C ',' expr MOV DPTR ',' '#' expr MOV REG ',' A R07 MOV REG ',' '#' expr R07 MOV REG ',' expr R07 MOV bit ',' C MOV expr ',' '#' expr MOV expr ',' '@' REG R01 MOV expr ',' A MOV expr ',' C MOV expr ',' REG R07 MOV expr ',' expr MOVC A ',' '@' A '+' DPTR MOVC A ',' '@' A '+' PC MOVX '@' DPTR ',' A MOVX '@' REG ',' A R01 MOVX A ',' '@' DPTR MOVX A ',' '@' REG R01 MUL AB NOP ORL A ',' '#' expr ORL A ',' '@' REG R01 ORL A ',' REG R07 ORL A ',' expr ORL C ',' '/' bit ORL C ',' '/' expr ORL C ',' bit ORL C ',' expr ORL expr ',' '#' expr ORL expr ',' A POP expr PUSH expr RET RETI RL A RLC A RR A RRC A SETB C SETB bit SETB expr SJMP expr SUBB A ',' '#' expr SUBB A ',' '@' REG R01 SUBB A ',' REG R07 SUBB A ',' expr SWAP A XCH A ',' '@' REG R01 XCH A ',' REG R07 XCH A ',' expr XCHD A ',' '@' REG R01 XRL A ',' '#' expr XRL A ',' '@' REG R01 XRL A ',' REG R07 XRL A ',' expr XRL expr ',' '#' expr XRL expr ',' A A.2.2 Selection Criteria Keywords R01 Only the reserved symbols R0 and R1 (or r0, r1) are acceptable as the REG operand. R07 All the reserved symbols R0 thru R7 are acceptable as the REG operand. A.2.3 Bit Operands Bit Addresses can be in two forms. One form is "expression.constant" where expression gives an address for a bit addressable register and constant (in the range of 0 to 7) gives the bit number in the byte. Expression values must be either in the range of 20h to 2fh, or the multiples of 8 between 80h and f8h, and defined in the first pass. The second form is an symbolic expression with value between 0 and 255. The value of the expression is placed in the operand field of the instruction without modification. A.2.4 Apostrophes The apostrophes in the syntax field are a notation used for the parser generator and are not put in the assembler source statement. A.3 Notes A.3.1 Address Spaces The Four address spaces, Program Memory, Internal Data Memory, Bit Numbers, and External Data Memory are not differentiated in the symbol table. Which address space a symbol refers to is determined by the context of the instruction operands it appears in. A.3.2 Reserved Symbols A.3.2.1 Machine Dependent Reserved Symbols A AB C DPTR PC R0 R1 R2 R3 R4 R5 R6 R7 a ab c dptr pc r0 r1 r2 r3 r4 r5 r6 r7 A.3.2.2 Standard Reserved Symbols AND DEFINED EQ GE GT HIGH LE LOW LT MOD NE NOT OR SHL SHR XOR and defined eq ge gt high le low lt mod ne not or shl shr xor  }21}"<4pTOJBfR` b0`0pBk00J"=kHB^3/x(x*x0x,3t0 82BB23 C3|2Pp B o3TqErrreading inpuile durpression. >6x,<1$y}2Hx*{vfw1{v46SC C&xX`0Y4]1fBQJEf@(3Ťtx&01&@#0@L|l`VC0v)` nf,C"Ҁ yTc0<`61`*//2#6 @ ?b,r2 S4/ "o2PU740AHCԆ !'2 ?2pLOw NAME as8051 cross assembler for microcomputers SYNOPSIS as8051 [-p cpu] [-l listfile] [-o hexfile] [-d] [-s symbolfile] input DESCRIPTION The as8051 command assembles the input file into a text output file representing the program memory for a microcomputer. Options -p cpu Ignored by this program. -l listfile Output a file formated with the memory address, data, and source input lines. -o hexfile Output the memory data image in a form accepted by most prom programmers. -o hexfile Same as -o. -d Save the intermediate data file (see FILE) and abort the execution at the end of processing. -s symbolfile Print the symbol table values and names, one per line in the specified file. FILES frtXXXXXX SEE ALSO Frankenstein Cross Assemblers Users Manual (file base.doc) Appendix for as8051 Frankenstein Assembler (file as8051.doc) NOTES There is only one input file. #v9T#Ȍ>f00A/BFp`2?<@3N?< Ԛ?<T9 \OR BF<8f3fT۲ yдAP`/gdzS A[*R/__G_oo~.o`Zд[Qa8fzbchf0 f:4R@@d(0HFh @bچ`4Xz`Ha8b̲t @ {`,Q8f|6 •PO`CzFglRcӱd YZcv@?Bҭ~r.Zغfxߊߜ߮or- 3ӱ"@:AUb*P fuS[aRbr4RbbO`L $<?PÇ3P"4 >DVhz hh>,*4FL^(p`F / /2(. q.T/f/x/ y!1cbt '_(p [a Q79cB4RI3 /b!A V<9dK !9-ZbH?ez=e`Rc29??OO&O8OJO\O9$-šc2Qb~!1QR:4RJb mwnBH`VL ' expression expression '>=' expression expression '<' expression expression '<=' expression expression '=' expression expression '<>' expression Relational expressions. If the relation is true, the value is 1. If false, the value is 0. The operators are nonassociative, the expression " 1 < 3 < 5 " is not legal. expression AND expression expression OR expression expression XOR expression Bitwise logical operations. DEFINED symbol If the symbol (not an expression) is defined, i.e. used as a label, before this point in the input the value is 1. If not, the value is 0. '(' expression ')' Parenthesis are available to override the operator precedence. 4.3.5.2 Precedence The precedence of the operators from lowest to highest. 1. HIGH LOW 2. OR XOR 3. AND 4. NOT 5. GT GE LE LT NE EQ '>' '>=' '<' '<=' '=' '<>' 6. '+' '-' 7. '*' '/' MOD SHL SHR 8. unary '+' '-' 9. ( expression ) 5. Statements The names for the operations and pseudo-operations for each assembler are specified in the adaptation files, and can be different from the examples given here. 5.1 Label Only Line A line with only a label starting in column 1 will define that symbol with the current value of the location counter. 5.2 End [Label] END The End statement terminates the processing of the current file. For an include file, the file is closed and input resumes in the file that contained the include statement. For the main file, processing shifts to the following passes of the assembly. The end statement is optional, as the end of file condition is treated in the same fashion. If the optional label is present, The symbol specified is used as the execution start address that is output in the binary file. The symbol must be used as a label somewhere else in the file. When more than one start address is specified, the last one in the file is used. 5.3 File Inclusion INCLUDE "filename" INCL "filename" The include statement shifts input from the current file to the file specified. Input resumes from the file containing the include statement when the end of file or the End statement is reached in the included file. Includes can be nested up to the limits of the include file stack, currently a limit of 20 deep, or the limits of the operating system, whichever comes first. Includes can be recursive, i.e., a file can include itself. If a file cannot be opened, either do to an bad filename or a lack of system resources, an error is issued. 5.4 Conditional Assembly 5.4.1 If IF expression The IF statement allows selective assembly. If the expression evaluates to a nonzero value, all statements between the IF and the matching ELSE or ENDI are assembled. If the expression evaluates to zero, or the expression in noncomputable due to a forward reference, all statements between the IF and the matching ELSE or ENDI are ignored. Note: it is safer to use the DEFINED operator when testing for the existence of a symbol than to rely on the noncomputability of an expression. IF statements can be nested to a depth determined by a configuration constant, currently 32. No label is allowed on an IF statement. 5.4.2 Else ELSE The ELSE statement causes all statements between it and its corresponding ENDI statement to be treated the opposite of the statements between the matching IF and this statement. When the expression on the matching IF is nonzero, the statements between the ELSE and ENDI are ignored. If the IF expression failed, the statements between the ELSE and the ENDI are assembled. Labels are not allowed on ELSE statements. 5.4.3 End If ENDI The ENDI statement terminates processing of its matching IF statement. Labels are not allowed on ENDI statements. 5.5 Symbolic Constants Symbols can be assigned numeric values with the SET and EQU statements. The expressions cannot have forward references to as yet undefined symbols. 5.5.1 Equate Label EQU expression The EQU statement takes the value of the expression and creates a symbol with that value. Symbols defined in EQU statements cannot already exist, or be redefined. 5.5.2 Set Label SET expr The SET statement sets the symbol specified in the label field with the numeric value of the expression. The SET statement can change the value of a symbol, but only if the symbol is originally defined in a previous SET statement. Example counter set 1 counter set counter+1 counter set counter+1 5.6 Location Counter Value Setting The address of the generated binary data can be changed with the ORG and reserve statements. 5.6.1 Org [Label] ORG expression The location counter is set to the numeric value of expression. It is an error if the expression contains references to symbols not yet defined. The optional label is set to the new value of the location counter. 5.6.2 Reserve Memory [Label] RMB expression [Label] RESERVE expression The reserve memory statement moves the location counter forward by the number of bytes specified in the expression. The label is set to the first location of this area. 5.7 Data Definitions 5.7.1 Define Byte Data [Label] BYTE expression [, expression] ... [Label] FCB expression [, expression] ... [Label] DB expression [, expression] ... The define byte statement generates one character of data for each expression in the expression list. There can be up to 128 expressions on a line, more than the line length will allow. The optional label is set to the first location of this area. 5.7.2 Define Word Data [Label] WORD expression [, expression] ... [Label] FDB expression [, expression] ... [Label] DW expression [, expression] ... The define word statement generates a two byte integer for each expression in the expression list. There can be up to 128 expressions on a line, more than the line length will allow. The byte order of the data is determined by the adaptation files for the target processor. The optional label is set to the first location of this area. 5.7.3 Define String Data [Label] STRING string [, string] ... [Label] FCC string [, string] ... The define string statement generates data encoded in the current character set translation, one byte per character, excluding the delimiter characters. The optional label is set to the first location of this area. 5.8 Defining Target Character Sets The values generated for String Constants in both the Define String Data and in expressions can be specified on a character by character basis. This is to support cross assembly where the target system has a different character set from the host computer. 5.8.1 Define Character Set Translation Label CHARSET The define character set translation statement defines a name and creates an internal table for a character set. The label symbol is treated like the label on an EQU statement. The value is from an internal counter and has little or no meaning outside of using it on a CHARUSE statement to specify which translation to use. There can be up to 5 [configurable] character translation sets. A CHARSET statement must precede any CHARDEF statements. 5.8.2 Define Character Value CHARDEF string, expression [, expression ] ... CHD string, expression [, expression ] ... The define character value statement set the translation for one or more characters in the table defined by the preceding CHARSET statement. There can be more than one character in the string, but the number of expression in the value list must match the number of characters. Octal and Hexadecimal escape sequences cannot occur in the string. There are two sets in each translation table. The first is for the characters, the second for characters escaped with the backslash. Note: the characters '"' and ' "' (and "'" and " '") each have an entry in different halves of the translation tables. 5.8.3 Use Character Translation CHARUSE CHARUSE expression The use character translation statement changes the translation for the following statements. The statement without an expression turns off the translation, so the host character set is used. The statement with an expression (the name given on the CHARSET statement) sets the translation to the set defined in the respective CHARSET. Example ascii charset chardef " !\"#$%& '",$20,$21,$22,$23,$24,$25,$26,$27 chardef "()*+,-./",$28,$29,$2a,$2b,$2c,$2d,$2e,$2f chardef "01234567",$30,$31,$32,$33,$34,$35,$36,$37 chardef "89:;<=>?",$38,$39,$3a,$3b,$3c,$3d,$3e,$3f chardef "@ABCDEFG",$40,$41,$42,$43,$44,$45,$46,$47 chardef "HIJKLMNO",$48,$49,$4a,$4b,$4c,$4d,$4e,$4f chardef "PQRSTUVW",$50,$51,$52,$53,$54,$55,$56,$57 chardef "XYZ[\\]^_",$58,$59,$5a,$5b,$5c,$5d,$5e,$5f chardef "`abcdefg",$60,$61,$62,$63,$64,$65,$66,$67 chardef "hijklmno",$68,$69,$6a,$6b,$6c,$6d,$6e,$6f chardef "pqrstuvw",$70,$71,$72,$73,$74,$75,$76,$77 chardef "xyz{|}~",$78,$79,$7a,$7b,$7c,$7d,$7e chardef '"', $22 ; not the same table entry as ' "' chardef "'", $27 ; chardef "\n\t\v\b\r\f\a", $0a,$09,$0b,$08,$0d,$0c,$07 charuse ascii 5.9 Machine Instructions [Label] opcode operands? Machine instructions generate the binary output by evaluating the expressions for the operands, and matching the opcode with the entry in the instruction generation tables. If the instruction has more than one format which is selected by the value of the operands, the selection criteria must able to be determined at the input phase of processing. For example, in the mc6800 architecture direct address mode, any memory variables that are have an address between 0 and 255 must be defined before any reference to these symbols. The optional label is set to the first location of the generated instruction. 6. Output 6.1 Program Generated Messages and Errors 6.1.1 Messages `` ERROR SUMMARY - ERRORS DETECTED {count} '' `` - WARNINGS {count} '' output at the end of the listing and on the console. 6.1.2 System Errors ``cannot open hex output {filename} '' file cannot be opened for output. The assembly continues as if the -[oh] option was not specified. ``cannot open input file {filename} '' file cannot be opened for reading. Fatal error. ``cannot open list file {filename} '' file cannot be opened for output. The assembly continues as if the -l option was not specified. ``cannot open symbol file {filename} '' file cannot be opened for output. The assembly continues as if the -s option was not specified. ``cannot open temp file {filename} '' file cannot be opened for input or output. Fatal error. ``no input file'' no input operand specified. Fatal error. `` no match on CPU type {string}, default used'' operand for a -p option can't be matched. ``cannot allocate string storage'' Request to operating system for more memory failed. Fatal error. The string storage pool is where the character representation of symbols and names for include files are stored. ``cannot allocate symbol space'' Request to operating system for more memory failed. Fatal error. The symbol table is full. The symbol space is the set of arrays where the symbol values and other numeric information is stored. ``cannot redefine reserved symbol'' Error in defining reserved symbols. Two calls to "reservedsym()" with the same character string value exist in the setup. Fatal error. Should not occur in a production executable. ``excessive number of subexpressions'' The first pass ran out of element storage for the expression parse tree. The expression is too complex. Internal error which should never occur. Fatal error. ``unable to allocate symbol index'' Request to operating system for more memory failed. Fatal error. The symbol table is full. The symbol index is used in the output pass to direct symbol references to the symbol table entry. 6.1.3 Error ``ELSE with no matching if'' ``ENDI with no matching if'' mismatched if/else/endi results in an else/endi left over ``IF stack overflow'' more than IFSTKDEPTH (32) nested if statements ``Overlength/Unterminate Line'' line longer than input buffer, or not terminated with newline character. ``active IF at end of file'' mismatched if/else/endi results in an unclosed if ``cannot change symbol value with EQU'' symbol is already defined. ``cannot change symbol value with SET'' symbol is already defined, but not with a Set statement. ``cannot create character translation table'' the internal table for a character translation set cannot be allocated due to lack of space, or more translation sets than the assembler is configured for. ``cannot open include file'' The include file cannot be opened for reading, or not enough system resources are available to open the file. ``character already defined 'char' '' the character is already present in a previous CHARDEF statement for this translation set. ``expression exceeds available field width'' The value of an expression is too large to fit into the field of the instruction. Relative branch target is too far away. ``expression fails validity test'' An explicit test programmed in the generation string for the instruction failed. These conditions are documented in the appendix for the specific instruction set. ``expression stack overflow'' Too many level of parenthesis or complex expression with operator precedence that results in the expression evaluation stack overflowing. ``include file nesting limit exceeded'' include files are nested to more than FILESTKDPTH (20) levels deep. "cannot open include file" usually occurs first. ``invalid char in instruction generation'' Internal error, instruction generation string is not defined properly. Should not occur in a production executable. ``invalid character constant 'char' '' A character specification in a string constant isn't properly formed. ``invalid character to define 'char' '' a constant in the string in a CHARDEF statement is of a form (octal, hex, or improperly formed) that does not have a translation table entry. ``invalid opcode'' No such string occurs in the opcode symbol table. Opcode strings are converted to uppercase before comparison, and therefore are case insensitive. ``invalid operands'' ``invalid operands/illegal instruction for cpu'' statement has a valid opcode, with the correct syntax, but no code generation can be found in the table for these operands ``invalid syntax for instruction'' opcode is valid, but not for this syntax form ``more characters than expressions'' ``more expressions than characters'' A mismatch between the string constant and the number of expressions in a CHARDEF statement. ``multiple definition of label'' label symbol is already defined. ``no CHARSET statement active'' a CHARDEF statement occurs before any CHARSET statement. ``noncomputable expression for EQU'' ``noncomputable expression for ORG'' ``noncomputable expression for SET'' ``noncomputable result for RMB expression'' expression contains reference to symbols that have not yet been defined, and thus has no numeric value. ``nonexistent character translation table'' expression in a CHARUSE statement does not correspond to any CHARSET statements label. ``overflow in instruction generation'' ``overflow in polish expression conversion'' The intermediate file line being built exceeds the length of the buffer. The expression is too complex. ``syntax error at/before character ^{character}'' ``syntax error at/before character {character}'' ``syntax error at/before token {symbol/constant}'' ``syntax error at invalid token {constant/string}'' ``syntax error at/before string {string}'' ``syntax error at/before End of Line'' ``syntax error at/before {relational op}'' ``syntax error at/before Undeterminable Symbol'' ``syntax error - undetermined yyerror type'' statement is in a form that the first pass parser cannot recognize. The next syntactic element is inappropriate for whatever language element the parser is working on. ``error or premature end of intermediate file'' ``syntax error - cannot backup'' ``unimplemented width'' ``unknown intermediate file command'' ``yacc stack overflow'' Internal errors, should not occur. ``undefined character value 'char' '' A string constant contains a character not defined in a CHARDEF statement for the current character translation. ``undefined symbol {symbolname}'' symbol has no definition anywhere in file. 6.1.4 Warnings ``character translation value truncated'' An expression in a CHARDEF statment has a value less than zero or greater then 255. ``forward reference to SET/EQU symbol'' A symbol in an expression is defined in a set/equ statement that occurs after the line. For set statements, the value of the symbol is that defined in the set statement closest to the end of the file. ``string constant in expression more than 2 characters long'' The first two characters are used as the numeric value of the subexpression. 6.2 Listing When the -l option is used, the detailed listing is output to the given file. This consists of the symbol listing followed by the annotated listing. 6.2.1 Symbol Table The symbol listing is printed three symbols across, with the value then name of the symbol. Undefined symbols will have "????????" in their value field. The symbols are listed in order of first occurrence in the input. Only the first fifteen characters of a symbol are printed. 6.2.2 Instruction Lines The source statements are printed in the same form as they were input with no reformatting. Following the source line, will be any error or warning messages associated with the line. Statements which generate data will be preceded with the address and data for them in hexadecimal format. If more than six bytes of data are generated, the remainder will be printed on the following lines, with up to sixteen bytes per line. All data generated is printed in the file. Statements that don't generate data but have some value oriented operation, like EQU, SET, ORG, or RESERVE, will print that value in the first 24 columns of the source line. 6.3 Symbol File When the -s option is used, the symbol table is printed to the given file. The format is one symbol per line, address then symbol name. If the symbol is undefined, "????????" is printed for the address. The symbols are printed in the order of first occurrence, either definition or reference, in the source file. This feature is provided so the system sort utility can be used to produce symbol tables sorted by either address or name. The entire symbol name is printed. 6.4 Binary Output 6.4.1 Intel Hex Record Format The Intel hex record is a printable text string with an ASCII character representing 4 bits of a byte. The characters used are "0" through "9" and "a" through "f", representing binary data 0000 to 01001, and 1010 through 1111. There are always two ASCII characters used to represent 1 byte, the high half, then the low half. There is one record per line in a text file. This format is accepted by most of prom programmers. Record Layout :ccaaaattddddddddddddddddddddkk ':' indicator character cc ascii-hex representation of an 8 bit count of data characters aaaa ascii-hex representation of 16 bit address tt ascii-hex representation of an 8 bit typer 00 is a data record the address is the first location to store the data 01 is an end of file record the address is the location to start execution, the count is 00, no data is present. dd... ascii-hex representation of the data, two characters per byte. The number of 8 bit bytes is given by the count field. kk ascii-hex representation of an 8 bit checksum. The sum of the binary representation, modulo 256, of the count, the high half of the address, the low half of the address, the type, all the data bytes, and the checksum must be zero. 7. Program Limits Line Length 256 characters including end of line control characters Number of Symbols - The maximum allocatable block size divided by the size of a pointer. For a iAPX286, about 16000 entries. - The amount of allocatable memory divided by the amount of space per symbol. For an iAPX286, 22 + 1 + the length of the string bytes. Symbol Length See line length Output A 16 bit address in the output record format limits output to 65536 binary bytes. Expressions per Line 128 (in BYTE and WORD statements) Strings per Line 128 (in STRING statements) Nested IF Statements 32 levels Nested Include Files 20 or whatever the operating system allows Subexpressions per Line 258 symbols, constants, operators (total) Character Translation Sets 5 sets, plus the default (host) character set cfz0ò\BB3p`1fj $! `n0HJ߰g#RB!#f0T@,!в$*49$m$\'#!2Pbt#*#%Bp28(c lE`P0,HA߰6(00S@2l 4lV@@@0f} ^ؐ@4T < GWp{/ /* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; FILENAME: fraebin.h; SEE-ALSO: frapsub.c, fraosub.c; AUTHORS: Mark Zenier; */ /* description switch case actions for binary operators for both the parse and output phase expression evaluators */ case IFC_MUL: etop *= (estkm1p--)->v; break; case IFC_DIV: etop = (estkm1p--)->v/etop; break; case IFC_ADD: etop += (estkm1p--)->v; break; case IFC_SUB: etop = (estkm1p--)->v - etop; break; case IFC_MOD: etop = (estkm1p--)->v % etop; break; case IFC_SHL: etop = (estkm1p--)->v << etop; break; case IFC_SHR: etop = (estkm1p--)->v >> etop; break; case IFC_AND: etop &= (estkm1p--)->v; break; case IFC_OR: etop |= (estkm1p--)->v; break; case IFC_XOR: etop ^= (estkm1p--)->v; break; case IFC_GT: etop = (estkm1p--)->v > etop ? 1 : 0; break; case IFC_GE: etop = (estkm1p--)->v >= etop ? 1 : 0; break; case IFC_LT: etop = (estkm1p--)->v < etop ? 1 : 0; break; case IFC_LE: etop = (estkm1p--)->v <= etop ? 1 : 0; break; case IFC_NE: etop = (estkm1p--)->v != etop ? 1 : 0; break; case IFC_EQ: etop = (estkm1p--)->v == etop ? 1 : 0; break; *POȁ*E&m׀A &0@+fP^/ HNMxg n0 ~-J0/Ϊ/Q`CAf<kD0PRy04$_:D%MRD Bjj|*n,*~ ,&Sފf,Q ANpRH@G~?w/ :NNADgJJ.gA  g?|DB3.G v`dpnRx] {g,!gg] 4},"g>/HW$.0T/Hj  `<^ PO`nC <^RDFZrފ5nJ>0L|nI%nN:OpJgq(X .0()`4 #̀1 @<'āX G# g vsg0@3 QZ4yg D(vs!P1AP ^JCޠqXO$SR !ؕQ4`f "Y@` C3f0BS /* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; FILENAME: fraeuni.h; SEE-ALSO: frapsub.c, fraosub.c; AUTHORS: Mark Zenier; */ /* description switch case actions for unary operators for both the parse and output phase expression evaluators */ case IFC_NEG: etop = -etop; break; case IFC_NOT: etop = ~ etop; break; case IFC_HIGH: etop = (etop >> 8) & 0xff; break; case IFC_LOW: etop = etop & 0xff; break; ~BF}^0n~g%QBC`vBG?ptrBJCg c0Β`@R k0< 8zp??~l 6DC3òQ$<>6|KfM,C|j4r?.~x /1N`Y0QgQn~PPl vS֎q~=8gBDC@\>G. gJ. l/* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. constants used in intermediate file code generation as the expression node operation value and the polish expression operation "; FILENAME: fragcon.h; SEE-ALSO: frapsub.c, fraosub.c, as*.y; AUTHORS: Mark Zenier; */ #define IG_START '[' #define IG_END ']' #define IG_CPCON '#' #define IG_CPEXPR '=' #define IG_ERROR 'X' #define IGP_DEFINED 'U' #define IGP_CONSTANT 'V' #define IFC_NEG '_' #define IFC_NOT 'N' #define IFC_HIGH 'H' #define IFC_LOW 'Z' #define IFC_MUL '*' #define IFC_DIV '/' #define IFC_ADD '+' #define IFC_SUB '-' #define IFC_MOD '%' #define IFC_SHL '{' #define IFC_SHR '}' #define IFC_AND '&' #define IFC_OR '|' #define IFC_XOR '^' #define IFC_GT '>' #define IFC_GE 'G' #define IFC_LT '<' #define IFC_LE 'L' #define IFC_NE '?' #define IFC_EQ '=' #define IFC_SYMB 'S' #define IFC_PROGCTR 'P' #define IFC_CURRLOC 'Q' #define IFC_LOAD '.' #define IFC_CLR '$' #define IFC_CLRALL 'X' #define IFC_POP '!' #define IFC_DUP '~' #define IFC_EMU8 ';' #define IFC_EMS7 'r' #define IFC_EM16 'x' #define IFC_EMBR16 'y' #define IFC_WIDTH 'W' #define IFC_SWIDTH 'R' #define IFC_IWIDTH 'I' #define IFC_TESTERR 'T' #define PCCASE_BIN 1 #define PCCASE_UN 2 #define PCCASE_DEF 3 #define PCCASE_SYMB 4 #define PCCASE_CONS 5 #define PCCASE_PROGC 6 xcep2Ki0dBus ErrorSegmentB FaultBad Argu8A to System CallBroken PipeAlar]@lockTerminat(@UrgQACondi=B?@I/O ChannelStopped ($å)E@@uAhild Proces-@xiAF;`? inputFCoutBAPossibJ`CPU oLimiCed(@}F0 Size]Virtu0Timer pB0ofilAS%WindowWE_TUser-defin@_S 1z_02ON_EXITSIGHUPQINvRQUSILLQwTRARABRRPRIVQFPEQKTBUSQSEGRSYRPI^SALRMREcURGRTORTSTRCOSCHLDRTINGcOUROQXP]bFSZQVTePROFQWINCH. bSR1d2b>0^ (/"&48* Ob/k?jnc~Z?@ /* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; FILENAME: frasmdat.h; SEE-ALSO: ; AUTHORS: Mark Zenier; */ /* description structures and data used in parser and output phases history September 15, 1987 August 3, 1988 Global September 14, 1990 6 char portable var */ #include #define PRINTCTRL(char) ((char)+'@') #ifndef Global #define Global extern #endif #ifdef USEINDEX #define strchr index #endif #ifdef NOSTRING extern char * strncpy(); extern char * strchr(); extern int strcmp(); extern int strlen(); #else #include #endif #define local #define TRUE 1 #define FALSE 0 #define hexch(cv) (hexcva[(cv)&0xf]) extern char hexcva[]; /* symbol table element */ struct symel { char *symstr; int tok; int seg; long value; struct symel *nextsym; int symnum; }; #define SSG_UNUSED 0 #define SSG_UNDEF -1 #define SSG_ABS 8 #define SSG_RESV -2 #define SSG_EQU 2 #define SSG_SET 3 #define SYMNULL (struct symel *) NULL struct symel * symbentry(); /* opcode symbol table element */ struct opsym { char *opstr; int token; int numsyn; int subsyn; }; struct opsynt { int syntaxgrp; int elcnt; int gentabsub; }; struct igel { int selmask; int criteria; char * genstr; }; #define PPEXPRLEN 256 struct evalrel { int seg; long value; char exprstr[PPEXPRLEN]; }; #define INBUFFSZ 258 extern char finbuff[INBUFFSZ]; extern int nextsymnum; Global struct symel **symbindex; #define EXPRLSIZE (INBUFFSZ/2) extern int nextexprs; Global int exprlist[EXPRLSIZE]; #define STRLSIZE (INBUFFSZ/2) extern int nextstrs; Global char * stringlist[STRLSIZE]; extern struct opsym optab[]; extern int gnumopcode; extern struct opsynt ostab[]; extern struct igel igtab[]; extern int ophashlnk[]; #define NUMPEXP 6 Global struct evalrel evalr[NUMPEXP]; #define PESTKDEPTH 32 struct evstkel { long v; int s; }; Global struct evstkel estk[PESTKDEPTH], *estkm1p; Global int currseg; Global long locctr; extern FILE *yyin; extern FILE *intermedf; extern int listflag; extern int hexvalid, hexflag; Global FILE *hexoutf, *loutf; extern int errorcnt, warncnt; extern int linenumber; #define IFSTKDEPTH 32 extern int ifstkpt; Global enum { If_Active, If_Skip, If_Err } elseifstk[IFSTKDEPTH], endifstk[IFSTKDEPTH]; #define FILESTKDPTH 20 Global int currfstk; #define nextfstk (currfstk+1) Global struct fstkel { char *fnm; FILE *fpt; } infilestk[FILESTKDPTH]; Global int lnumstk[FILESTKDPTH]; Global char currentfnm[100]; extern struct symel * endsymbol; enum readacts { Nra_normal, Nra_new, Nra_end } ; extern enum readacts nextreadact; char * savestring(), *findgen(); long strtol(); void reservedsym(); char *calloc(), *malloc(); extern struct symel * endsymbol; extern char ignosyn[] ; extern char ignosel[] ; #define NUM_CHTA 6 extern int chtnxalph, *chtcpoint, *chtnpoint ; Global int *(chtatab[NUM_CHTA]); int chtcreate(), chtcfind(), chtran(); #define CF_END -2 #define CF_INVALID -1 #define CF_UNDEF 0 #define CF_CHAR 1 #define CF_NUMBER 2  $ *r``TtQ q \ YY*` ' v 'vp$ v*ȓ [ [ `?ZU K$`_*'Y *L"z   4( _* > 7\XB6PH:4J  ,R 4PN 6. `d'>   & "J"  _ 0nHF "< $FF , 0r. R0. ^1 ((  ^F "t@* 0 P6F .:0 : <\BF*0@ $ $.ﺲj$P   & T"6*w> 򀋀 :KtQIt  Y*> ^  ȱְ(<.0HV o4 (Z m@ 0X" * >*X&& &&T* II=$ 4L&l  ~ D,p ('N$2HHo . 6 I <   /* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; SYSTEM: UNIX, MS-Dos ; FILENAME: getopt.h; WARNINGS: "This is some ancient code I found on a version 7 system when I was running the original port. Asking for help from the original authors is not advised. (Especially after the hack job I did on it. Mark Zenier.) " ; SEE-ALSO: frasmain.c; AUTHORS: Keith Bostic, Rich $alz; */ /* ** This is a public domain version of getopt(3). ** Bugs, fixes to: ** Keith Bostic ** ARPA: keith@seismo ** UUCP: seismo!keith ** Added NO_STDIO, opterr handling, Rich $alz (mirror!rs). Framework Cross Assembler use strchr remove NO_STDIO code Mark Zenier Specialized Systems Consultants, Inc. */ /* ** Error macro. Maybe we want stdio, maybe we don't. ** The (undocumented?) variable opterr tells us whether or not ** to print errors. */ #define tell(s) \ if (opterr) \ (void)fputs(*nargv, stderr), \ (void)fputs(s,stderr), \ (void)fputc(optopt, stderr), \ (void)fputc('\n', stderr) /* Global variables. */ static char EMSG[] = ""; int opterr = 1; /* undocumented error-suppressor*/ int optind = 1; /* index into argv vector */ int optopt; /* char checked for validity */ char *optarg; /* arg associated with option */ getopt(nargc, nargv, ostr) int nargc; char **nargv; char *ostr; { static char *place = EMSG; /* option letter processing */ register char *oli; /* option letter list index */ if (!*place) /* update scanning pointer */ { if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) return(EOF); if (*place == '-') /* found "--" */ { optind++; return(EOF); } } /* option letter okay? */ if ((optopt = *place++) == ':' || (oli = strchr(ostr, optopt)) == NULL) { if (!*place) optind++; tell(": illegal option -- "); goto Bad; } if (*++oli != ':') /* don't need argument */ { optarg = NULL; if (!*place) optind++; } else /* need an argument */ { if (*place) optarg = place; /* no white space */ else if (nargc <= ++optind) { place = EMSG; tell(": option requires an argument -- "); goto Bad; } else optarg = nargv[optind]; /* white space */ place = EMSG; optind++; } return(optopt); /* dump back option letter */ Bad: return('?'); } [wW".! -bBnNaAmM͒2>1=rR~^qQ}] *& )%jJfFiIeEŚ:695zZvVyYuUPK li"  GEMVIEW/DITHER/DITHER_4.DITB&W256P8`xS;c{ã h#k(p+ s@0HȰC3K˳ĤT<\tǧW?_w$d'g, l/o̴D4L|ϷG7OR:bz¢Q9ay"j!i* r) qB2JʲA1IɱƦV>^vťU=]u&f% # line 2 "as8051.y" /* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; KEYWORDS: cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 6811, tms7000, 8048, 8051, 8096, z8, z80; SYSTEM: UNIX, MS-Dos ; FILENAME: as8051.y; WARNINGS: "This software is in the public domain. Any prior copyright claims are relinquished. This software is distributed with no warranty whatever. The author takes no responsibility for the consequences of its use. Yacc (or Bison) required to compile." ; SEE-ALSO: as8051.doc,frasmain.c; AUTHORS: Mark Zenier; COMPILERS: Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285) (previous versions Xenix, Unisoft 68000 Version 7, Sun 3); */ /* 8051 structured generation file */ /* November 17, 1990 */ /* description frame work parser description for framework cross assemblers history February 2, 1988 September 11, 1990 - merge table definition September 12, 1990 - short file names September 14, 1990 - short variable names September 17, 1990 - use yylex as external */ #include #include "frasmdat.h" #include "fragcon.h" #define yylex lexintercept /* 0000.0000.0000.0xxx register value */ #define REGVALMASK 0x7 /* 0xxx.xxxx.0000.0000 register and special select bits */ #define REGSEL_ALL 0x7f00 #define REG2NDSHFT 8 #define REGSEL_ACC 0x100 #define REGSEL_AB 0x200 #define REGSEL_C 0x400 #define REGSEL_DPTR 0x800 #define REGSEL_PC 0x1000 #define REGSEL_R01 0x2000 #define REGSEL_R07 0x4000 #define REG2SEL_ACC 0x1 #define REG2SEL_AB 0x2 #define REG2SEL_C 0x4 #define REG2SEL_DPTR 0x8 #define REG2SEL_PC 0x10 #define REG2SEL_R01 0x20 #define REG2SEL_R07 0x40 #define ST_INH 0x1 #define ST_UOP01 0x2 #define ST_UOP02 0x4 #define ST_UOP03 0x8 #define ST_UOP04 0x10 #define ST_UOP05 0x20 #define ST_ALU01 0x1 #define ST_ALU02 0x2 #define ST_ALU02E 0x4 #define ST_ALU03 0x8 #define ST_ALU04 0x10 #define ST_ALU05 0x20 #define ST_ALU06 0x40 #define ST_ALU07 0x80 #define ST_ALU08 0x100 #define ST_ALU09 0x200 #define ST_ALU10 0x400 #define ST_MOV01 0x1 #define ST_MOV02 0x2 #define ST_MOV03 0x4 #define ST_MOV04 0x8 #define ST_MOV05 0x10 #define ST_MOV06 0x20 #define ST_MOV07 0x40 #define ST_MOV08 0x80 #define ST_MOV09 0x100 #define ST_MOV10 0x200 #define ST_MOV11 0x400 #define ST_MOV12 0x800 #define ST_MOV13 0x1000 #define ST_MOV14 0x2000 #define ST_CJNE1 0x1 #define ST_CJNE2 0x2 #define ST_CJNE3 0x4 static char genbdef[] = "[1=];"; static char genwdef[] = "[1=]y"; /* x for normal, y for byte rev */ char ignosyn[] = "[Xinvalid syntax for instruction"; char ignosel[] = "[Xinvalid operands"; long labelloc; static int satsub; int ifstkpt = 0; int fraifskip = FALSE; struct symel * endsymbol = SYMNULL; # line 111 "as8051.y" typedef union { int intv; long longv; char *strng; struct symel *symb; } YYSTYPE; # define REG 257 # define KOC_BDEF 258 # define KOC_ELSE 259 # define KOC_END 260 # define KOC_ENDI 261 # define KOC_EQU 262 # define KOC_IF 263 # define KOC_INCLUDE 264 # define KOC_ORG 265 # define KOC_RESM 266 # define KOC_SDEF 267 # define KOC_SET 268 # define KOC_WDEF 269 # define KOC_CHSET 270 # define KOC_CHDEF 271 # define KOC_CHUSE 272 # define KOC_opcode 273 # define KOC_aluop 274 # define KOC_mov 275 # define KOC_cjne 276 # define CONSTANT 277 # define EOL 278 # define KEOP_AND 279 # define KEOP_DEFINED 280 # define KEOP_EQ 281 # define KEOP_GE 282 # define KEOP_GT 283 # define KEOP_HIGH 284 # define KEOP_LE 285 # define KEOP_LOW 286 # define KEOP_LT 287 # define KEOP_MOD 288 # define KEOP_MUN 289 # define KEOP_NE 290 # define KEOP_NOT 291 # define KEOP_OR 292 # define KEOP_SHL 293 # define KEOP_SHR 294 # define KEOP_XOR 295 # define KEOP_locctr 296 # define LABEL 297 # define STRING 298 # define SYMBOL 299 # define KTK_invalid 300 #define yyclearin yychar = -1 #define yyerrok yyerrflag = 0 extern int yychar; extern int yyerrflag; #ifndef YYMAXDEPTH #define YYMAXDEPTH 150 #endif YYSTYPE yylval, yyval; typedef int yytabelem; # define YYERRCODE 256 # line 1114 "as8051.y" lexintercept() /* description intercept the call to yylex (the lexical analyzer) and filter out all unnecessary tokens when skipping the input between a failed IF and its matching ENDI or ELSE globals fraifskip the enable flag */ { #undef yylex int rv; if(fraifskip) { for(;;) { switch(rv = yylex()) { case 0: case KOC_END: case KOC_IF: case KOC_ELSE: case KOC_ENDI: case EOL: return rv; default: break; } } } else return yylex(); #define yylex lexintercept } setreserved() { reservedsym("and", KEOP_AND, 0); reservedsym("defined", KEOP_DEFINED,0); reservedsym("eq", KEOP_EQ, 0); reservedsym("ge", KEOP_GE, 0); reservedsym("gt", KEOP_GT, 0); reservedsym("high", KEOP_HIGH, 0); reservedsym("le", KEOP_LE, 0); reservedsym("low", KEOP_LOW, 0); reservedsym("lt", KEOP_LT, 0); reservedsym("mod", KEOP_MOD, 0); reservedsym("ne", KEOP_NE, 0); reservedsym("not", KEOP_NOT, 0); reservedsym("or", KEOP_OR, 0); reservedsym("shl", KEOP_SHL, 0); reservedsym("shr", KEOP_SHR, 0); reservedsym("xor", KEOP_XOR, 0); reservedsym("AND", KEOP_AND, 0); reservedsym("DEFINED", KEOP_DEFINED,0); reservedsym("EQ", KEOP_EQ, 0); reservedsym("GE", KEOP_GE, 0); reservedsym("GT", KEOP_GT, 0); reservedsym("HIGH", KEOP_HIGH, 0); reservedsym("LE", KEOP_LE, 0); reservedsym("LOW", KEOP_LOW, 0); reservedsym("LT", KEOP_LT, 0); reservedsym("MOD", KEOP_MOD, 0); reservedsym("NE", KEOP_NE, 0); reservedsym("NOT", KEOP_NOT, 0); reservedsym("OR", KEOP_OR, 0); reservedsym("SHL", KEOP_SHL, 0); reservedsym("SHR", KEOP_SHR, 0); reservedsym("XOR", KEOP_XOR, 0); /* machine specific token definitions */ reservedsym("a", REG, REGSEL_ACC); reservedsym("ab", REG, REGSEL_AB); reservedsym("c", REG, REGSEL_C); reservedsym("dptr", REG, REGSEL_DPTR); reservedsym("pc", REG, REGSEL_PC); reservedsym("r0", REG, REGSEL_R01|REGSEL_R07|0); reservedsym("r1", REG, REGSEL_R01|REGSEL_R07|1); reservedsym("r2", REG, REGSEL_R07|2); reservedsym("r3", REG, REGSEL_R07|3); reservedsym("r4", REG, REGSEL_R07|4); reservedsym("r5", REG, REGSEL_R07|5); reservedsym("r6", REG, REGSEL_R07|6); reservedsym("r7", REG, REGSEL_R07|7); reservedsym("A", REG, REGSEL_ACC); reservedsym("AB", REG, REGSEL_AB); reservedsym("C", REG, REGSEL_C); reservedsym("DPTR", REG, REGSEL_DPTR); reservedsym("PC", REG, REGSEL_PC); reservedsym("R0", REG, REGSEL_R01|REGSEL_R07|0); reservedsym("R1", REG, REGSEL_R01|REGSEL_R07|1); reservedsym("R2", REG, REGSEL_R07|2); reservedsym("R3", REG, REGSEL_R07|3); reservedsym("R4", REG, REGSEL_R07|4); reservedsym("R5", REG, REGSEL_R07|5); reservedsym("R6", REG, REGSEL_R07|6); reservedsym("R7", REG, REGSEL_R07|7); } cpumatch(str) char * str; { return TRUE; } /* description Opcode and Instruction generation tables usage Unix, framework crossassembler history September 25, 1987 */ #define NUMOPCODE 68 #define NUMSYNBLK 107 #define NUMDIFFOP 125 int gnumopcode = NUMOPCODE; int ophashlnk[NUMOPCODE]; struct opsym optab[NUMOPCODE+1] = { {"invalid", KOC_opcode, 2, 0 }, {"ACALL", KOC_opcode, 1, 2 }, {"ADD", KOC_aluop, 4, 3 }, {"ADDC", KOC_aluop, 4, 7 }, {"AJMP", KOC_opcode, 1, 11 }, {"ANL", KOC_aluop, 9, 12 }, {"BYTE", KOC_BDEF, 0, 0 }, {"CHARDEF", KOC_CHDEF, 0, 0 }, {"CHARSET", KOC_CHSET, 0, 0 }, {"CHARUSE", KOC_CHUSE, 0, 0 }, {"CHD", KOC_CHDEF, 0, 0 }, {"CJNE", KOC_cjne, 3, 21 }, {"CLR", KOC_opcode, 3, 24 }, {"CPL", KOC_opcode, 3, 27 }, {"DA", KOC_opcode, 1, 30 }, {"DB", KOC_BDEF, 0, 0 }, {"DEC", KOC_opcode, 3, 31 }, {"DIV", KOC_opcode, 1, 34 }, {"DJNZ", KOC_aluop, 2, 35 }, {"DW", KOC_WDEF, 0, 0 }, {"ELSE", KOC_ELSE, 0, 0 }, {"END", KOC_END, 0, 0 }, {"ENDI", KOC_ENDI, 0, 0 }, {"EQU", KOC_EQU, 0, 0 }, {"FCB", KOC_BDEF, 0, 0 }, {"FCC", KOC_SDEF, 0, 0 }, {"FDB", KOC_WDEF, 0, 0 }, {"IF", KOC_IF, 0, 0 }, {"INC", KOC_opcode, 3, 37 }, {"INCL", KOC_INCLUDE, 0, 0 }, {"INCLUDE", KOC_INCLUDE, 0, 0 }, {"JB", KOC_aluop, 2, 40 }, {"JBC", KOC_aluop, 2, 42 }, {"JC", KOC_opcode, 1, 44 }, {"JMP", KOC_opcode, 1, 45 }, {"JNB", KOC_aluop, 2, 46 }, {"JNC", KOC_opcode, 1, 48 }, {"JNZ", KOC_opcode, 1, 49 }, {"JZ", KOC_opcode, 1, 50 }, {"LCALL", KOC_opcode, 1, 51 }, {"LJMP", KOC_opcode, 1, 52 }, {"MOV", KOC_mov, 13, 53 }, {"MOVC", KOC_mov, 1, 66 }, {"MOVX", KOC_mov, 2, 67 }, {"MUL", KOC_opcode, 1, 69 }, {"NOP", KOC_opcode, 1, 70 }, {"ORG", KOC_ORG, 0, 0 }, {"ORL", KOC_aluop, 9, 71 }, {"POP", KOC_opcode, 1, 80 }, {"PUSH", KOC_opcode, 1, 81 }, {"RESERVE", KOC_RESM, 0, 0 }, {"RET", KOC_opcode, 1, 82 }, {"RETI", KOC_opcode, 1, 83 }, {"RL", KOC_opcode, 1, 84 }, {"RLC", KOC_opcode, 1, 85 }, {"RMB", KOC_RESM, 0, 0 }, {"RR", KOC_opcode, 1, 86 }, {"RRC", KOC_opcode, 1, 87 }, {"SET", KOC_SET, 0, 0 }, {"SETB", KOC_opcode, 3, 88 }, {"SJMP", KOC_opcode, 1, 91 }, {"STRING", KOC_SDEF, 0, 0 }, {"SUBB", KOC_aluop, 4, 92 }, {"SWAP", KOC_opcode, 1, 96 }, {"WORD", KOC_WDEF, 0, 0 }, {"XCH", KOC_aluop, 3, 97 }, {"XCHD", KOC_aluop, 1, 100 }, {"XRL", KOC_aluop, 6, 101 }, { "", 0, 0, 0 }}; struct opsynt ostab[NUMSYNBLK+1] = { /* invalid 0 */ { 0, 1, 0 }, /* invalid 1 */ { 0xffff, 1, 1 }, /* ACALL 2 */ { ST_UOP04, 1, 2 }, /* ADD 3 */ { ST_ALU01, 1, 3 }, /* ADD 4 */ { ST_ALU03, 1, 4 }, /* ADD 5 */ { ST_ALU04, 1, 5 }, /* ADD 6 */ { ST_ALU06, 1, 6 }, /* ADDC 7 */ { ST_ALU01, 1, 7 }, /* ADDC 8 */ { ST_ALU03, 1, 8 }, /* ADDC 9 */ { ST_ALU04, 1, 9 }, /* ADDC 10 */ { ST_ALU06, 1, 10 }, /* AJMP 11 */ { ST_UOP04, 1, 11 }, /* ANL 12 */ { ST_ALU01, 1, 12 }, /* ANL 13 */ { ST_ALU02, 1, 13 }, /* ANL 14 */ { ST_ALU02E, 1, 14 }, /* ANL 15 */ { ST_ALU03, 1, 15 }, /* ANL 16 */ { ST_ALU04, 1, 16 }, /* ANL 17 */ { ST_ALU05, 1, 17 }, /* ANL 18 */ { ST_ALU06, 2, 18 }, /* ANL 19 */ { ST_ALU08, 1, 20 }, /* ANL 20 */ { ST_ALU09, 1, 21 }, /* CJNE 21 */ { ST_CJNE1, 1, 22 }, /* CJNE 22 */ { ST_CJNE2, 2, 23 }, /* CJNE 23 */ { ST_CJNE3, 1, 25 }, /* CLR 24 */ { ST_UOP02, 2, 26 }, /* CLR 25 */ { ST_UOP03, 1, 28 }, /* CLR 26 */ { ST_UOP04, 1, 29 }, /* CPL 27 */ { ST_UOP02, 2, 30 }, /* CPL 28 */ { ST_UOP03, 1, 32 }, /* CPL 29 */ { ST_UOP04, 1, 33 }, /* DA 30 */ { ST_UOP02, 1, 34 }, /* DEC 31 */ { ST_UOP01, 1, 35 }, /* DEC 32 */ { ST_UOP02, 2, 36 }, /* DEC 33 */ { ST_UOP04, 1, 38 }, /* DIV 34 */ { ST_UOP02, 1, 39 }, /* DJNZ 35 */ { ST_ALU06, 1, 40 }, /* DJNZ 36 */ { ST_ALU10, 1, 41 }, /* INC 37 */ { ST_UOP01, 1, 42 }, /* INC 38 */ { ST_UOP02, 3, 43 }, /* INC 39 */ { ST_UOP04, 1, 46 }, /* JB 40 */ { ST_ALU07, 1, 47 }, /* JB 41 */ { ST_ALU10, 1, 48 }, /* JBC 42 */ { ST_ALU07, 1, 49 }, /* JBC 43 */ { ST_ALU10, 1, 50 }, /* JC 44 */ { ST_UOP04, 1, 51 }, /* JMP 45 */ { ST_UOP05, 1, 52 }, /* JNB 46 */ { ST_ALU07, 1, 53 }, /* JNB 47 */ { ST_ALU10, 1, 54 }, /* JNC 48 */ { ST_UOP04, 1, 55 }, /* JNZ 49 */ { ST_UOP04, 1, 56 }, /* JZ 50 */ { ST_UOP04, 1, 57 }, /* LCALL 51 */ { ST_UOP04, 1, 58 }, /* LJMP 52 */ { ST_UOP04, 1, 59 }, /* MOV 53 */ { ST_MOV01, 1, 60 }, /* MOV 54 */ { ST_MOV02, 1, 61 }, /* MOV 55 */ { ST_MOV03, 1, 62 }, /* MOV 56 */ { ST_MOV04, 3, 63 }, /* MOV 57 */ { ST_MOV05, 1, 66 }, /* MOV 58 */ { ST_MOV07, 2, 67 }, /* MOV 59 */ { ST_MOV08, 1, 69 }, /* MOV 60 */ { ST_MOV09, 3, 70 }, /* MOV 61 */ { ST_MOV10, 1, 73 }, /* MOV 62 */ { ST_MOV11, 1, 74 }, /* MOV 63 */ { ST_MOV12, 1, 75 }, /* MOV 64 */ { ST_MOV13, 3, 76 }, /* MOV 65 */ { ST_MOV14, 1, 79 }, /* MOVC 66 */ { ST_MOV06, 2, 80 }, /* MOVX 67 */ { ST_MOV02, 2, 82 }, /* MOVX 68 */ { ST_MOV05, 2, 84 }, /* MUL 69 */ { ST_UOP02, 1, 86 }, /* NOP 70 */ { ST_INH, 1, 87 }, /* ORL 71 */ { ST_ALU01, 1, 88 }, /* ORL 72 */ { ST_ALU02, 1, 89 }, /* ORL 73 */ { ST_ALU02E, 1, 90 }, /* ORL 74 */ { ST_ALU03, 1, 91 }, /* ORL 75 */ { ST_ALU04, 1, 92 }, /* ORL 76 */ { ST_ALU05, 1, 93 }, /* ORL 77 */ { ST_ALU06, 2, 94 }, /* ORL 78 */ { ST_ALU08, 1, 96 }, /* ORL 79 */ { ST_ALU09, 1, 97 }, /* POP 80 */ { ST_UOP04, 1, 98 }, /* PUSH 81 */ { ST_UOP04, 1, 99 }, /* RET 82 */ { ST_INH, 1, 100 }, /* RETI 83 */ { ST_INH, 1, 101 }, /* RL 84 */ { ST_UOP02, 1, 102 }, /* RLC 85 */ { ST_UOP02, 1, 103 }, /* RR 86 */ { ST_UOP02, 1, 104 }, /* RRC 87 */ { ST_UOP02, 1, 105 }, /* SETB 88 */ { ST_UOP02, 1, 106 }, /* SETB 89 */ { ST_UOP03, 1, 107 }, /* SETB 90 */ { ST_UOP04, 1, 108 }, /* SJMP 91 */ { ST_UOP04, 1, 109 }, /* SUBB 92 */ { ST_ALU01, 1, 110 }, /* SUBB 93 */ { ST_ALU03, 1, 111 }, /* SUBB 94 */ { ST_ALU04, 1, 112 }, /* SUBB 95 */ { ST_ALU06, 1, 113 }, /* SWAP 96 */ { ST_UOP02, 1, 114 }, /* XCH 97 */ { ST_ALU03, 1, 115 }, /* XCH 98 */ { ST_ALU04, 1, 116 }, /* XCH 99 */ { ST_ALU06, 1, 117 }, /* XCHD 100 */ { ST_ALU03, 1, 118 }, /* XRL 101 */ { ST_ALU01, 1, 119 }, /* XRL 102 */ { ST_ALU03, 1, 120 }, /* XRL 103 */ { ST_ALU04, 1, 121 }, /* XRL 104 */ { ST_ALU06, 1, 122 }, /* XRL 105 */ { ST_ALU08, 1, 123 }, /* XRL 106 */ { ST_ALU09, 1, 124 }, { 0, 0, 0 } }; struct igel igtab[NUMDIFFOP+1] = { /* invalid 0 */ { 0 , 0, "[Xnullentry" }, /* invalid 1 */ { 0 , 0, "[Xinvalid opcode" }, /* ACALL 2 */ { 0 , 0, "[1=].Q.2+.f800&-.bI~.3}.e0&.11|;!.ff&;" }, /* ADD 3 */ { REGSEL_ACC , REGSEL_ACC, "24;[2=];" }, /* ADD 4 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "26.[2#]|;" }, /* ADD 5 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "28.[2#]|;" }, /* ADD 6 */ { REGSEL_ACC , REGSEL_ACC, "25;[2=].8I;" }, /* ADDC 7 */ { REGSEL_ACC , REGSEL_ACC, "34;[2=];" }, /* ADDC 8 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "36.[2#]|;" }, /* ADDC 9 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "38.[2#]|;" }, /* ADDC 10 */ { REGSEL_ACC , REGSEL_ACC, "35;[2=].8I;" }, /* AJMP 11 */ { 0 , 0, "[1=].Q.2+.f800&-.bI~.3}.e0&.01|;!.ff&;" }, /* ANL 12 */ { REGSEL_ACC , REGSEL_ACC, "54;[2=];" }, /* ANL 13 */ { REGSEL_C , REGSEL_C, "b0;[2#];" }, /* ANL 14 */ { REGSEL_C , REGSEL_C, "b0;[2=].8I;" }, /* ANL 15 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "56.[2#]|;" }, /* ANL 16 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "58.[2#]|;" }, /* ANL 17 */ { REGSEL_C , REGSEL_C, "82;[2#];" }, /* ANL 18 */ { REGSEL_ACC , REGSEL_ACC, "55;[2=].8I;" }, /* ANL 19 */ { REGSEL_C , REGSEL_C, "82;[2=].8I;" }, /* ANL 20 */ { 0 , 0, "53;[1=].8I;[2=];" }, /* ANL 21 */ { REGSEL_ACC , REGSEL_ACC, "52;[1=].8I;" }, /* CJNE 22 */ { REGSEL_ACC , REGSEL_ACC, "b5;[2=].8I;[3=].Q.1+-r" }, /* CJNE 23 */ { REGSEL_ACC , REGSEL_ACC, "b4;[2=];[3=].Q.1+-r" }, /* CJNE 24 */ { REGSEL_R07 , REGSEL_R07, "b8.[1#]|;[2=];[3=].Q.1+-r" }, /* CJNE 25 */ { REGSEL_R01 , REGSEL_R01, "b6.[1#]|;[2=];[3=].Q.1+-r" }, /* CLR 26 */ { REGSEL_ACC , REGSEL_ACC, "e4;" }, /* CLR 27 */ { REGSEL_C , REGSEL_C, "c3;" }, /* CLR 28 */ { 0 , 0, "c2;[1#];" }, /* CLR 29 */ { 0 , 0, "c2;[1=].8I;" }, /* CPL 30 */ { REGSEL_ACC , REGSEL_ACC, "f4;" }, /* CPL 31 */ { REGSEL_C , REGSEL_C, "b3;" }, /* CPL 32 */ { 0 , 0, "b2;[1#];" }, /* CPL 33 */ { 0 , 0, "b2;[1=].8I;" }, /* DA 34 */ { REGSEL_ACC , REGSEL_ACC, "d4;" }, /* DEC 35 */ { REGSEL_R01 , REGSEL_R01, "16.[1#]|;" }, /* DEC 36 */ { REGSEL_ACC , REGSEL_ACC, "14;" }, /* DEC 37 */ { REGSEL_R07 , REGSEL_R07, "18.[1#]|;" }, /* DEC 38 */ { 0 , 0, "15;[1=].8I;" }, /* DIV 39 */ { REGSEL_AB , REGSEL_AB, "84;" }, /* DJNZ 40 */ { REGSEL_R07 , REGSEL_R07, "d8.[1#]|;[2=].Q.1+-r" }, /* DJNZ 41 */ { 0 , 0, "d5;[1=].8I;[2=].Q.1+-r" }, /* INC 42 */ { REGSEL_R01 , REGSEL_R01, "06.[1#]|;" }, /* INC 43 */ { REGSEL_ACC , REGSEL_ACC, "04;" }, /* INC 44 */ { REGSEL_R07 , REGSEL_R07, "08.[1#]|;" }, /* INC 45 */ { REGSEL_DPTR , REGSEL_DPTR, "a3;" }, /* INC 46 */ { 0 , 0, "05;[1=].8I;" }, /* JB 47 */ { 0 , 0, "20;[1#];[2=].Q.1+-r" }, /* JB 48 */ { 0 , 0, "20;[1=].8I;[2=].Q.1+-r" }, /* JBC 49 */ { 0 , 0, "10;[1#];[2=].Q.1+-r" }, /* JBC 50 */ { 0 , 0, "10;[1=].8I;[2=].Q.1+-r" }, /* JC 51 */ { 0 , 0, "40;[1=].Q.1+-r" }, /* JMP 52 */ { REGSEL_ACC|REG2SEL_DPTR , REGSEL_ACC|REG2SEL_DPTR, "73;" }, /* JNB 53 */ { 0 , 0, "30;[1#];[2=].Q.1+-r" }, /* JNB 54 */ { 0 , 0, "30;[1=].8I;[2=].Q.1+-r" }, /* JNC 55 */ { 0 , 0, "50;[1=].Q.1+-r" }, /* JNZ 56 */ { 0 , 0, "70;[1=].Q.1+-r" }, /* JZ 57 */ { 0 , 0, "60;[1=].Q.1+-r" }, /* LCALL 58 */ { 0 , 0, "12;[1=]x" }, /* LJMP 59 */ { 0 , 0, "02;[1=]x" }, /* MOV 60 */ { REGSEL_R01 , REGSEL_R01, "76.[1#]|;[2=];" }, /* MOV 61 */ { REGSEL_R01|REG2SEL_ACC , REGSEL_R01|REG2SEL_ACC, "f6.[1#]|;" }, /* MOV 62 */ { REGSEL_R01 , REGSEL_R01, "a6.[1#]|;[2=].8I;" }, /* MOV 63 */ { REGSEL_ACC , REGSEL_ACC, "74;[2=];" }, /* MOV 64 */ { REGSEL_DPTR , REGSEL_DPTR, "90;[2=]x" }, /* MOV 65 */ { REGSEL_R07 , REGSEL_R07, "78.[1#]|;[2=];" }, /* MOV 66 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "e6.[2#]|;" }, /* MOV 67 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "e8.[2#]|;" }, /* MOV 68 */ { REGSEL_R07|REG2SEL_ACC , REGSEL_R07|REG2SEL_ACC, "f8.[1#]|;" }, /* MOV 69 */ { REGSEL_C , REGSEL_C, "a2;[2#];" }, /* MOV 70 */ { REGSEL_ACC , REGSEL_ACC, "e5;[2=].8I;" }, /* MOV 71 */ { REGSEL_C , REGSEL_C, "a2;[2=].8I;" }, /* MOV 72 */ { REGSEL_R07 , REGSEL_R07, "a8.[1#]|;[2=].8I;" }, /* MOV 73 */ { REGSEL_C , REGSEL_C, "92;[1#];" }, /* MOV 74 */ { 0 , 0, "75;[1=].8I;[2=];" }, /* MOV 75 */ { REGSEL_R01 , REGSEL_R01, "86.[2#]|;[1=].8I;" }, /* MOV 76 */ { REGSEL_ACC , REGSEL_ACC, "f5;[1=].8I;" }, /* MOV 77 */ { REGSEL_C , REGSEL_C, "92;[1=].8I;" }, /* MOV 78 */ { REGSEL_R07 , REGSEL_R07, "88.[2#]|;[1=].8I;" }, /* MOV 79 */ { 0 , 0, "85;[2=].8I;[1=].8I;" }, /* MOVC 80 */ { REGSEL_ACC|REG2SEL_DPTR , REGSEL_ACC|REG2SEL_DPTR, "93;" }, /* MOVC 81 */ { REGSEL_ACC|REG2SEL_PC , REGSEL_ACC|REG2SEL_PC, "83;" }, /* MOVX 82 */ { REGSEL_DPTR|REG2SEL_ACC , REGSEL_DPTR|REG2SEL_ACC, "f0;" }, /* MOVX 83 */ { REGSEL_R01|REG2SEL_ACC , REGSEL_R01|REG2SEL_ACC, "f2.[1#]|;" }, /* MOVX 84 */ { REGSEL_ACC|REG2SEL_DPTR , REGSEL_ACC|REG2SEL_DPTR, "e0;" }, /* MOVX 85 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "e2.[2#]|;" }, /* MUL 86 */ { REGSEL_AB , REGSEL_AB, "a4;" }, /* NOP 87 */ { 0 , 0, "00;" }, /* ORL 88 */ { REGSEL_ACC , REGSEL_ACC, "44;[2=];" }, /* ORL 89 */ { REGSEL_C , REGSEL_C, "a0;[2#];" }, /* ORL 90 */ { REGSEL_C , REGSEL_C, "a0;[2=].8I;" }, /* ORL 91 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "46.[2#]|;" }, /* ORL 92 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "48.[2#]|;" }, /* ORL 93 */ { REGSEL_C , REGSEL_C, "72;[2#];" }, /* ORL 94 */ { REGSEL_ACC , REGSEL_ACC, "45;[2=].8I;" }, /* ORL 95 */ { REGSEL_C , REGSEL_C, "72;[2=].8I;" }, /* ORL 96 */ { 0 , 0, "43;[1=].8I;[2=];" }, /* ORL 97 */ { REGSEL_ACC , REGSEL_ACC, "42;[1=].8I;" }, /* POP 98 */ { 0 , 0, "d0;[1=].8I;" }, /* PUSH 99 */ { 0 , 0, "c0;[1=].8I;" }, /* RET 100 */ { 0 , 0, "22;" }, /* RETI 101 */ { 0 , 0, "32;" }, /* RL 102 */ { REGSEL_ACC , REGSEL_ACC, "23;" }, /* RLC 103 */ { REGSEL_ACC , REGSEL_ACC, "33;" }, /* RR 104 */ { REGSEL_ACC , REGSEL_ACC, "03;" }, /* RRC 105 */ { REGSEL_ACC , REGSEL_ACC, "13;" }, /* SETB 106 */ { REGSEL_C , REGSEL_C, "d3;" }, /* SETB 107 */ { 0 , 0, "d2;[1#];" }, /* SETB 108 */ { 0 , 0, "d2;[1=].8I;" }, /* SJMP 109 */ { 0 , 0, "80;[1=].Q.1+-r" }, /* SUBB 110 */ { REGSEL_ACC , REGSEL_ACC, "94;[2=];" }, /* SUBB 111 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "96.[2#]|;" }, /* SUBB 112 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "98.[2#]|;" }, /* SUBB 113 */ { REGSEL_ACC , REGSEL_ACC, "95;[2=].8I;" }, /* SWAP 114 */ { REGSEL_ACC , REGSEL_ACC, "c4;" }, /* XCH 115 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "c6.[2#]|;" }, /* XCH 116 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "c8.[2#]|;" }, /* XCH 117 */ { REGSEL_ACC , REGSEL_ACC, "c5;[2=].8I;" }, /* XCHD 118 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "d6.[2#]|;" }, /* XRL 119 */ { REGSEL_ACC , REGSEL_ACC, "64;[2=];" }, /* XRL 120 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "66.[2#]|;" }, /* XRL 121 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "68.[2#]|;" }, /* XRL 122 */ { REGSEL_ACC , REGSEL_ACC, "65;[2=].8I;" }, /* XRL 123 */ { 0 , 0, "63;[1=].8I;[2=];" }, /* XRL 124 */ { REGSEL_ACC , REGSEL_ACC, "62;[1=].8I;" }, { 0,0,""} }; /* end fraptabdef.c */ yytabelem yyexca[] ={ -1, 1, 0, -1, -2, 0, -1, 116, 281, 0, 282, 0, 283, 0, 285, 0, 287, 0, 290, 0, -2, 80, -1, 117, 281, 0, 282, 0, 283, 0, 285, 0, 287, 0, 290, 0, -2, 81, -1, 118, 281, 0, 282, 0, 283, 0, 285, 0, 287, 0, 290, 0, -2, 82, -1, 119, 281, 0, 282, 0, 283, 0, 285, 0, 287, 0, 290, 0, -2, 83, -1, 120, 281, 0, 282, 0, 283, 0, 285, 0, 287, 0, 290, 0, -2, 84, -1, 121, 281, 0, 282, 0, 283, 0, 285, 0, 287, 0, 290, 0, -2, 85, }; # define YYNPROD 95 # define YYLAST 951 yytabelem yyact[]={ 5, 93, 17, 10, 7, 11, 128, 9, 8, 12, 20, 18, 53, 19, 49, 14, 13, 21, 22, 23, 24, 131, 4, 34, 27, 26, 46, 130, 43, 36, 68, 37, 176, 132, 167, 165, 159, 148, 155, 147, 108, 6, 46, 103, 43, 36, 98, 37, 58, 50, 133, 96, 154, 142, 141, 107, 105, 104, 46, 101, 43, 36, 172, 37, 100, 97, 149, 95, 129, 54, 170, 61, 65, 16, 2, 15, 25, 3, 1, 52, 33, 0, 143, 72, 74, 106, 75, 99, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 74, 102, 75, 99, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 74, 178, 75, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 74, 174, 75, 0, 73, 0, 0, 0, 0, 0, 126, 0, 0, 0, 135, 0, 72, 74, 145, 75, 99, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 74, 168, 75, 0, 73, 0, 0, 0, 0, 0, 0, 0, 157, 0, 0, 161, 72, 74, 0, 75, 46, 73, 43, 36, 0, 37, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 46, 0, 43, 36, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 125, 72, 74, 0, 75, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, 46, 0, 43, 36, 0, 37, 0, 0, 0, 0, 0, 72, 0, 0, 150, 0, 73, 0, 44, 0, 0, 41, 0, 0, 63, 39, 0, 40, 72, 74, 144, 75, 38, 73, 44, 0, 0, 41, 0, 45, 42, 39, 0, 40, 46, 0, 43, 36, 38, 37, 44, 0, 0, 41, 0, 45, 42, 39, 0, 40, 46, 0, 43, 36, 38, 37, 0, 0, 56, 0, 0, 45, 42, 0, 0, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 85, 162, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 139, 0, 0, 0, 44, 72, 74, 41, 75, 76, 73, 39, 0, 40, 77, 78, 0, 0, 38, 0, 44, 0, 0, 41, 0, 45, 42, 39, 153, 40, 0, 0, 0, 46, 38, 43, 36, 0, 37, 0, 64, 45, 42, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 44, 0, 0, 41, 0, 0, 0, 39, 46, 40, 43, 36, 0, 37, 38, 0, 0, 0, 0, 0, 76, 45, 42, 0, 57, 77, 78, 0, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 60, 0, 77, 78, 44, 72, 74, 41, 75, 0, 73, 39, 0, 40, 0, 0, 0, 0, 38, 0, 44, 0, 0, 41, 0, 45, 42, 39, 17, 40, 28, 0, 29, 0, 38, 31, 20, 18, 30, 19, 32, 45, 42, 21, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 84, 80, 79, 0, 82, 0, 81, 76, 0, 83, 0, 86, 77, 78, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 41, 0, 0, 0, 39, 0, 40, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 45, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 41, 0, 0, 0, 39, 0, 40, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 45, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 79, 0, 82, 51, 81, 76, 0, 83, 0, 0, 77, 78, 0, 35, 0, 0, 47, 48, 0, 0, 0, 0, 0, 0, 55, 59, 62, 66, 0, 0, 0, 0, 0, 69, 70, 71, 0, 0, 0, 0, 88, 89, 90, 91, 92, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 136, 137, 140, 0, 146, 0, 151, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 158, 0, 0, 0, 0, 0, 160, 0, 0, 163, 164, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 173, 0, 175, 0, 0, 0, 177, 0, 0, 0, 179 }; yytabelem yypact[]={ -256, -256, -3000, -253, -3000, -254, 292, -3000, -275, 450, -3000, -3000, 450, 450, -284, -3000, -3000, 450, -286, 450, 450, 249, 265, 205, -34, -3000, -3000, -3000, -3000, 450, 450, 450, -3000, -3000, -3000, 385, 450, 450, 450, 450, 450, -298, -3000, -3000, -3000, -3000, 450, 385, 385, 23, 7, 385, 21, -3000, 7, 385, -211, -3000, -3000, 109, 20, 15, 58, -214, 13, 12, 41, 11, -217, 385, 385, 385, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, -3000, -3000, 485, 385, 385, -3000, 186, 450, 450, -292, 25, -250, -14, 450, 165, 10, 18, -218, 2, 415, 8, -3000, -3000, 214, 214, -3000, -3000, -3000, 143, 143, 143, 143, 143, 143, 485, 231, 231, -3000, 7, 385, -3000, -219, -3000, 450, 450, -221, -3000, -3000, 109, 385, 450, -3000, 385, 149, 450, -222, -3000, -3000, 109, -3000, 450, -223, -3000, 385, 126, 450, 35, -3000, 385, -3000, 109, -3000, 385, 450, -3000, 385, 385, 19, 385, -3000, 450, 92, 450, 385, -225, 385, 450, 75, -3000, 385, 450, 385 }; yytabelem yypgo[]={ 0, 48, 771, 49, 79, 78, 74, 77, 75, 73 }; yytabelem yyr1[]={ 0, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 3, 3, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; yytabelem yyr2[]={ 0, 4, 2, 5, 2, 5, 5, 3, 5, 7, 7, 5, 3, 3, 3, 7, 5, 5, 3, 5, 9, 3, 2, 5, 3, 5, 5, 5, 5, 7, 3, 7, 3, 3, 7, 5, 5, 5, 11, 11, 11, 11, 11, 9, 9, 9, 9, 11, 9, 9, 13, 11, 11, 11, 11, 15, 9, 9, 9, 9, 11, 11, 9, 9, 13, 15, 17, 7, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 3, 3, 3, 3, 7 }; yytabelem yychk[]={ -3000, -5, -6, -7, 278, 256, 297, 260, 264, 263, 259, 261, 265, 272, 271, -8, -9, 258, 267, 269, 266, 273, 274, 275, 276, -6, 278, 278, 260, 262, 268, 265, 270, -9, 298, -2, 43, 45, 291, 284, 286, 280, 299, 42, 277, 298, 40, -2, -2, 298, -3, -2, -4, 298, -3, -2, 64, 257, -1, -2, 257, -1, -2, 64, 257, -1, -2, 257, 64, -2, -2, -2, 42, 47, 43, 45, 288, 293, 294, 283, 282, 287, 285, 290, 281, 279, 292, 295, -2, -2, -2, -2, -2, 299, -2, 44, 44, 44, 257, 46, 44, 44, 44, 257, 44, 44, 44, 44, 257, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 41, -3, -2, 298, 43, 277, 35, 47, 64, 257, -1, -2, -2, 35, 257, -2, 44, 35, 64, 257, -1, -2, 257, 35, 64, 257, -2, -2, 35, 44, 257, -2, -1, -2, 257, -2, 35, 257, -2, -2, 257, -2, 257, 44, -2, 35, -2, 43, -2, 44, -2, 257, -2, 44, -2 }; yytabelem yydef[]={ 0, -2, 2, 0, 4, 0, 21, 7, 0, 12, 13, 14, 0, 18, 0, 22, 24, 0, 0, 0, 0, 33, 0, 0, 0, 1, 3, 5, 6, 0, 0, 0, 17, 23, 8, 11, 0, 0, 0, 0, 0, 0, 90, 91, 92, 93, 0, 16, 19, 0, 25, 30, 26, 32, 27, 28, 0, 35, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, 89, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 75, 76, 77, 78, 79, -2, -2, -2, -2, -2, -2, 86, 87, 88, 94, 20, 29, 31, 0, 67, 0, 0, 0, 43, 44, 45, 46, 0, 48, 49, 0, 0, 0, 56, 57, 58, 59, 0, 0, 62, 63, 0, 0, 0, 38, 39, 40, 41, 42, 47, 0, 51, 52, 53, 54, 60, 61, 0, 0, 0, 50, 0, 64, 0, 0, 55, 65, 0, 66 }; typedef struct { char *t_name; int t_val; } yytoktype; #ifndef YYDEBUG # define YYDEBUG 0 /* don't allow debugging */ #endif #if YYDEBUG yytoktype yytoks[] = { "REG", 257, "KOC_BDEF", 258, "KOC_ELSE", 259, "KOC_END", 260, "KOC_ENDI", 261, "KOC_EQU", 262, "KOC_IF", 263, "KOC_INCLUDE", 264, "KOC_ORG", 265, "KOC_RESM", 266, "KOC_SDEF", 267, "KOC_SET", 268, "KOC_WDEF", 269, "KOC_CHSET", 270, "KOC_CHDEF", 271, "KOC_CHUSE", 272, "KOC_opcode", 273, "KOC_aluop", 274, "KOC_mov", 275, "KOC_cjne", 276, "CONSTANT", 277, "EOL", 278, "KEOP_AND", 279, "KEOP_DEFINED", 280, "KEOP_EQ", 281, "KEOP_GE", 282, "KEOP_GT", 283, "KEOP_HIGH", 284, "KEOP_LE", 285, "KEOP_LOW", 286, "KEOP_LT", 287, "KEOP_MOD", 288, "KEOP_MUN", 289, "KEOP_NE", 290, "KEOP_NOT", 291, "KEOP_OR", 292, "KEOP_SHL", 293, "KEOP_SHR", 294, "KEOP_XOR", 295, "KEOP_locctr", 296, "LABEL", 297, "STRING", 298, "SYMBOL", 299, "KTK_invalid", 300, "+", 43, "-", 45, "*", 42, "/", 47, "-unknown-", -1 /* ends search */ }; char * yyreds[] = { "-no such reduction-", "file : file allline", "file : allline", "allline : line EOL", "allline : EOL", "allline : error EOL", "line : LABEL KOC_END", "line : KOC_END", "line : KOC_INCLUDE STRING", "line : LABEL KOC_EQU expr", "line : LABEL KOC_SET expr", "line : KOC_IF expr", "line : KOC_IF", "line : KOC_ELSE", "line : KOC_ENDI", "line : LABEL KOC_ORG expr", "line : KOC_ORG expr", "line : LABEL KOC_CHSET", "line : KOC_CHUSE", "line : KOC_CHUSE expr", "line : KOC_CHDEF STRING ',' exprlist", "line : LABEL", "line : labeledline", "labeledline : LABEL genline", "labeledline : genline", "genline : KOC_BDEF exprlist", "genline : KOC_SDEF stringlist", "genline : KOC_WDEF exprlist", "genline : KOC_RESM expr", "exprlist : exprlist ',' expr", "exprlist : expr", "stringlist : stringlist ',' STRING", "stringlist : STRING", "genline : KOC_opcode", "genline : KOC_opcode '@' REG", "genline : KOC_opcode REG", "genline : KOC_opcode bit", "genline : KOC_opcode expr", "genline : KOC_opcode '@' REG '+' REG", "genline : KOC_aluop REG ',' '#' expr", "genline : KOC_aluop REG ',' '/' bit", "genline : KOC_aluop REG ',' '/' expr", "genline : KOC_aluop REG ',' '@' REG", "genline : KOC_aluop REG ',' REG", "genline : KOC_aluop REG ',' bit", "genline : KOC_aluop REG ',' expr", "genline : KOC_aluop bit ',' expr", "genline : KOC_aluop expr ',' '#' expr", "genline : KOC_aluop expr ',' REG", "genline : KOC_aluop expr ',' expr", "genline : KOC_mov '@' REG ',' '#' expr", "genline : KOC_mov '@' REG ',' REG", "genline : KOC_mov '@' REG ',' expr", "genline : KOC_mov REG ',' '#' expr", "genline : KOC_mov REG ',' '@' REG", "genline : KOC_mov REG ',' '@' REG '+' REG", "genline : KOC_mov REG ',' REG", "genline : KOC_mov REG ',' bit", "genline : KOC_mov REG ',' expr", "genline : KOC_mov bit ',' REG", "genline : KOC_mov expr ',' '#' expr", "genline : KOC_mov expr ',' '@' REG", "genline : KOC_mov expr ',' REG", "genline : KOC_mov expr ',' expr", "genline : KOC_cjne REG ',' expr ',' expr", "genline : KOC_cjne REG ',' '#' expr ',' expr", "genline : KOC_cjne '@' REG ',' '#' expr ',' expr", "bit : expr '.' CONSTANT", "expr : '+' expr", "expr : '-' expr", "expr : KEOP_NOT expr", "expr : KEOP_HIGH expr", "expr : KEOP_LOW expr", "expr : expr '*' expr", "expr : expr '/' expr", "expr : expr '+' expr", "expr : expr '-' expr", "expr : expr KEOP_MOD expr", "expr : expr KEOP_SHL expr", "expr : expr KEOP_SHR expr", "expr : expr KEOP_GT expr", "expr : expr KEOP_GE expr", "expr : expr KEOP_LT expr", "expr : expr KEOP_LE expr", "expr : expr KEOP_NE expr", "expr : expr KEOP_EQ expr", "expr : expr KEOP_AND expr", "expr : expr KEOP_OR expr", "expr : expr KEOP_XOR expr", "expr : KEOP_DEFINED SYMBOL", "expr : SYMBOL", "expr : '*'", "expr : CONSTANT", "expr : STRING", "expr : '(' expr ')'", }; #endif /* YYDEBUG */ #define YYFLAG (-3000) /* @(#) $Revision: 64.2 $ */ /* ** Skeleton parser driver for yacc output */ #if defined(NLS) && !defined(NL_SETN) #include #endif #ifndef nl_msg #define nl_msg(i,s) (s) #endif /* ** yacc user known macros and defines */ #define YYERROR goto yyerrlab #ifndef __RUNTIME_YYMAXDEPTH #define YYACCEPT return(0) #define YYABORT return(1) #else #define YYACCEPT {free_stacks(); return(0);} #define YYABORT {free_stacks(); return(1);} #endif #define YYBACKUP( newtoken, newvalue )\ {\ if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\ {\ yyerror( (nl_msg(30001,"syntax error - cannot backup")) );\ goto yyerrlab;\ }\ yychar = newtoken;\ yystate = *yyps;\ yylval = newvalue;\ goto yynewstate;\ } #define YYRECOVERING() (!!yyerrflag) #ifndef YYDEBUG # define YYDEBUG 1 /* make debugging available */ #endif /* ** user known globals */ int yydebug; /* set to 1 to get debugging */ /* ** driver internal defines */ /* define for YYFLAG now generated by yacc program. */ /*#define YYFLAG (FLAGVAL)*/ /* ** global variables used by the parser */ # ifndef __RUNTIME_YYMAXDEPTH YYSTYPE yyv[ YYMAXDEPTH ]; /* value stack */ int yys[ YYMAXDEPTH ]; /* state stack */ # else YYSTYPE *yyv; /* pointer to malloc'ed value stack */ int *yys; /* pointer to malloc'ed stack stack */ extern char *malloc(), *realloc(); extern void free(); int allocate_stacks(); void free_stacks(); # ifndef YYINCREMENT # define YYINCREMENT (YYMAXDEPTH/2) + 10 # endif # endif long yymaxdepth = YYMAXDEPTH; YYSTYPE *yypv; /* top of value stack */ int *yyps; /* top of state stack */ int yystate; /* current state */ int yytmp; /* extra var (lasts between blocks) */ int yynerrs; /* number of errors */ int yyerrflag; /* error recovery flag */ int yychar; /* current input token number */ /* ** yyparse - return 0 if worked, 1 if syntax error not recovered from */ int yyparse() { register YYSTYPE *yypvt; /* top of value stack for $vars */ /* ** Initialize externals - yyparse may be called more than once */ # ifdef __RUNTIME_YYMAXDEPTH if (allocate_stacks()) YYABORT; # endif yypv = &yyv[-1]; yyps = &yys[-1]; yystate = 0; yytmp = 0; yynerrs = 0; yyerrflag = 0; yychar = -1; goto yystack; { register YYSTYPE *yy_pv; /* top of value stack */ register int *yy_ps; /* top of state stack */ register int yy_state; /* current state */ register int yy_n; /* internal state number info */ /* ** get globals into registers. ** branch to here only if YYBACKUP was called. */ yynewstate: yy_pv = yypv; yy_ps = yyps; yy_state = yystate; goto yy_newstate; /* ** get globals into registers. ** either we just started, or we just finished a reduction */ yystack: yy_pv = yypv; yy_ps = yyps; yy_state = yystate; /* ** top of for (;;) loop while no reductions done */ yy_stack: /* ** put a state and value onto the stacks */ #if YYDEBUG /* ** if debugging, look up token value in list of value vs. ** name pairs. 0 and negative (-1) are special values. ** Note: linear search is used since time is not a real ** consideration while debugging. */ if ( yydebug ) { register int yy_i; printf( "State %d, token ", yy_state ); if ( yychar == 0 ) printf( "end-of-file\n" ); else if ( yychar < 0 ) printf( "-none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) break; } printf( "%s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */ { # ifndef __RUNTIME_YYMAXDEPTH yyerror( (nl_msg(30002,"yacc stack overflow")) ); YYABORT; # else /* save old stack bases to recalculate pointers */ YYSTYPE * yyv_old = yyv; int * yys_old = yys; yymaxdepth += YYINCREMENT; yys = (int *) realloc(yys, yymaxdepth * sizeof(int)); yyv = (YYSTYPE *) realloc(yyv, yymaxdepth * sizeof(YYSTYPE)); if (yys==0 || yyv==0) { yyerror( (nl_msg(30002,"yacc stack overflow")) ); YYABORT; } /* Reset pointers into stack */ yy_ps = (yy_ps - yys_old) + yys; yyps = (yyps - yys_old) + yys; yy_pv = (yy_pv - yyv_old) + yyv; yypv = (yypv - yyv_old) + yyv; # endif } *yy_ps = yy_state; *++yy_pv = yyval; /* ** we have a new state - find out what to do */ yy_newstate: if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG ) goto yydefault; /* simple state */ #if YYDEBUG /* ** if debugging, need to mark whether new token grabbed */ yytmp = yychar < 0; #endif if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) yychar = 0; /* reached EOF */ #if YYDEBUG if ( yydebug && yytmp ) { register int yy_i; printf( "Received token " ); if ( yychar == 0 ) printf( "end-of-file\n" ); else if ( yychar < 0 ) printf( "-none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) break; } printf( "%s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) ) goto yydefault; if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/ { yychar = -1; yyval = yylval; yy_state = yy_n; if ( yyerrflag > 0 ) yyerrflag--; goto yy_stack; } yydefault: if ( ( yy_n = yydef[ yy_state ] ) == -2 ) { #if YYDEBUG yytmp = yychar < 0; #endif if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) yychar = 0; /* reached EOF */ #if YYDEBUG if ( yydebug && yytmp ) { register int yy_i; printf( "Received token " ); if ( yychar == 0 ) printf( "end-of-file\n" ); else if ( yychar < 0 ) printf( "-none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) { break; } } printf( "%s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ /* ** look through exception table */ { register int *yyxi = yyexca; while ( ( *yyxi != -1 ) || ( yyxi[1] != yy_state ) ) { yyxi += 2; } while ( ( *(yyxi += 2) >= 0 ) && ( *yyxi != yychar ) ) ; if ( ( yy_n = yyxi[1] ) < 0 ) YYACCEPT; } } /* ** check for syntax error */ if ( yy_n == 0 ) /* have an error */ { /* no worry about speed here! */ switch ( yyerrflag ) { case 0: /* new error */ yyerror( (nl_msg(30003,"syntax error")) ); yynerrs++; goto skip_init; yyerrlab: /* ** get globals into registers. ** we have a user generated syntax type error */ yy_pv = yypv; yy_ps = yyps; yy_state = yystate; yynerrs++; skip_init: case 1: case 2: /* incompletely recovered error */ /* try again... */ yyerrflag = 3; /* ** find state where "error" is a legal ** shift action */ while ( yy_ps >= yys ) { yy_n = yypact[ *yy_ps ] + YYERRCODE; if ( yy_n >= 0 && yy_n < YYLAST && yychk[yyact[yy_n]] == YYERRCODE) { /* ** simulate shift of "error" */ yy_state = yyact[ yy_n ]; goto yy_stack; } /* ** current state has no shift on ** "error", pop stack */ #if YYDEBUG # define _POP_ "Error recovery pops state %d, uncovers state %d\n" if ( yydebug ) printf( _POP_, *yy_ps, yy_ps[-1] ); # undef _POP_ #endif yy_ps--; yy_pv--; } /* ** there is no state on stack with "error" as ** a valid shift. give up. */ YYABORT; case 3: /* no shift yet; eat a token */ #if YYDEBUG /* ** if debugging, look up token in list of ** pairs. 0 and negative shouldn't occur, ** but since timing doesn't matter when ** debugging, it doesn't hurt to leave the ** tests here. */ if ( yydebug ) { register int yy_i; printf( "Error recovery discards " ); if ( yychar == 0 ) printf( "token end-of-file\n" ); else if ( yychar < 0 ) printf( "token -none-\n" ); else { for ( yy_i = 0; yytoks[yy_i].t_val >= 0; yy_i++ ) { if ( yytoks[yy_i].t_val == yychar ) { break; } } printf( "token %s\n", yytoks[yy_i].t_name ); } } #endif /* YYDEBUG */ if ( yychar == 0 ) /* reached EOF. quit */ YYABORT; yychar = -1; goto yy_newstate; } }/* end if ( yy_n == 0 ) */ /* ** reduction by production yy_n ** put stack tops, etc. so things right after switch */ #if YYDEBUG /* ** if debugging, print the string that is the user's ** specification of the reduction which is just about ** to be done. */ if ( yydebug ) printf( "Reduce by (%d) \"%s\"\n", yy_n, yyreds[ yy_n ] ); #endif yytmp = yy_n; /* value to switch over */ yypvt = yy_pv; /* $vars top of value stack */ /* ** Look in goto table for next state ** Sorry about using yy_state here as temporary ** register variable, but why not, if it works... ** If yyr2[ yy_n ] doesn't have the low order bit ** set, then there is no action to be done for ** this reduction. So, no saving & unsaving of ** registers done. The only difference between the ** code just after the if and the body of the if is ** the goto yy_stack in the body. This way the test ** can be made before the choice of what to do is needed. */ { /* length of production doubled with extra bit */ register int yy_len = yyr2[ yy_n ]; if ( !( yy_len & 01 ) ) { yy_len >>= 1; yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + *( yy_ps -= yy_len ) + 1; if ( yy_state >= YYLAST || yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) { yy_state = yyact[ yypgo[ yy_n ] ]; } goto yy_stack; } yy_len >>= 1; yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + *( yy_ps -= yy_len ) + 1; if ( yy_state >= YYLAST || yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) { yy_state = yyact[ yypgo[ yy_n ] ]; } } /* save until reenter driver code */ yystate = yy_state; yyps = yy_ps; yypv = yy_pv; } /* ** code supplied by user is placed in this switch */ switch( yytmp ) { case 3: # line 187 "as8051.y" { clrexpr(); } break; case 5: # line 192 "as8051.y" { clrexpr(); yyerrok; } break; case 6: # line 199 "as8051.y" { endsymbol = yypvt[-1].symb; nextreadact = Nra_end; } break; case 7: # line 204 "as8051.y" { nextreadact = Nra_end; } break; case 8: # line 208 "as8051.y" { if(nextfstk >= FILESTKDPTH) { fraerror("include file nesting limit exceeded"); } else { infilestk[nextfstk].fnm = savestring(yypvt[-0].strng,strlen(yypvt[-0].strng)); if( (infilestk[nextfstk].fpt = fopen(yypvt[-0].strng,"r")) ==(FILE *)NULL ) { fraerror("cannot open include file"); } else { nextreadact = Nra_new; } } } break; case 9: # line 228 "as8051.y" { if(yypvt[-2].symb -> seg == SSG_UNDEF) { pevalexpr(0, yypvt[-0].intv); if(evalr[0].seg == SSG_ABS) { yypvt[-2].symb -> seg = SSG_EQU; yypvt[-2].symb -> value = evalr[0].value; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for EQU"); } } else { fraerror( "cannot change symbol value with EQU"); } } break; case 10: # line 252 "as8051.y" { if(yypvt[-2].symb -> seg == SSG_UNDEF || yypvt[-2].symb -> seg == SSG_SET) { pevalexpr(0, yypvt[-0].intv); if(evalr[0].seg == SSG_ABS) { yypvt[-2].symb -> seg = SSG_SET; yypvt[-2].symb -> value = evalr[0].value; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for SET"); } } else { fraerror( "cannot change symbol value with SET"); } } break; case 11: # line 277 "as8051.y" { if((++ifstkpt) < IFSTKDEPTH) { pevalexpr(0, yypvt[-0].intv); if(evalr[0].seg == SSG_ABS) { if(evalr[0].value != 0) { elseifstk[ifstkpt] = If_Skip; endifstk[ifstkpt] = If_Active; } else { fraifskip = TRUE; elseifstk[ifstkpt] = If_Active; endifstk[ifstkpt] = If_Active; } } else { fraifskip = TRUE; elseifstk[ifstkpt] = If_Active; endifstk[ifstkpt] = If_Active; } } else { fraerror("IF stack overflow"); } } break; case 12: # line 309 "as8051.y" { if(fraifskip) { if((++ifstkpt) < IFSTKDEPTH) { elseifstk[ifstkpt] = If_Skip; endifstk[ifstkpt] = If_Skip; } else { fraerror("IF stack overflow"); } } else { yyerror("syntax error"); YYERROR; } } break; case 13: # line 330 "as8051.y" { switch(elseifstk[ifstkpt]) { case If_Active: fraifskip = FALSE; break; case If_Skip: fraifskip = TRUE; break; case If_Err: fraerror("ELSE with no matching if"); break; } } break; case 14: # line 348 "as8051.y" { switch(endifstk[ifstkpt]) { case If_Active: fraifskip = FALSE; ifstkpt--; break; case If_Skip: fraifskip = TRUE; ifstkpt--; break; case If_Err: fraerror("ENDI with no matching if"); break; } } break; case 15: # line 367 "as8051.y" { pevalexpr(0, yypvt[-0].intv); if(evalr[0].seg == SSG_ABS) { locctr = labelloc = evalr[0].value; if(yypvt[-2].symb -> seg == SSG_UNDEF) { yypvt[-2].symb -> seg = SSG_ABS; yypvt[-2].symb -> value = labelloc; } else fraerror( "multiple definition of label"); prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for ORG"); } } break; case 16: # line 390 "as8051.y" { pevalexpr(0, yypvt[-0].intv); if(evalr[0].seg == SSG_ABS) { locctr = labelloc = evalr[0].value; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for ORG"); } } break; case 17: # line 405 "as8051.y" { if(yypvt[-1].symb -> seg == SSG_UNDEF) { yypvt[-1].symb -> seg = SSG_EQU; if( (yypvt[-1].symb->value = chtcreate()) <= 0) { fraerror( "cannot create character translation table"); } prtequvalue("C: 0x%lx\n", yypvt[-1].symb -> value); } else { fraerror( "multiple definition of label"); } } break; case 18: # line 421 "as8051.y" { chtcpoint = (int *) NULL; prtequvalue("C: 0x%lx\n", 0L); } break; case 19: # line 426 "as8051.y" { pevalexpr(0, yypvt[-0].intv); if( evalr[0].seg == SSG_ABS) { if( evalr[0].value == 0) { chtcpoint = (int *)NULL; prtequvalue("C: 0x%lx\n", 0L); } else if(evalr[0].value < chtnxalph) { chtcpoint = chtatab[evalr[0].value]; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror("nonexistent character translation table"); } } else { fraerror("noncomputable expression"); } } break; case 20: # line 451 "as8051.y" { int findrv, numret, *charaddr; char *sourcestr = yypvt[-2].strng, *before; if(chtnpoint != (int *)NULL) { for(satsub = 0; satsub < yypvt[-0].intv; satsub++) { before = sourcestr; pevalexpr(0, exprlist[satsub]); findrv = chtcfind(chtnpoint, &sourcestr, &charaddr, &numret); if(findrv == CF_END) { fraerror("more expressions than characters"); break; } if(evalr[0].seg == SSG_ABS) { switch(findrv) { case CF_UNDEF: { if(evalr[0].value < 0 || evalr[0].value > 255) { frawarn("character translation value truncated"); } *charaddr = evalr[0].value & 0xff; prtequvalue("C: 0x%lx\n", evalr[0].value); } break; case CF_INVALID: case CF_NUMBER: fracherror("invalid character to define", before, sourcestr); break; case CF_CHAR: fracherror("character already defined", before, sourcestr); break; } } else { fraerror("noncomputable expression"); } } if( *sourcestr != '\0') { fraerror("more characters than expressions"); } } else { fraerror("no CHARSET statement active"); } } break; case 21: # line 516 "as8051.y" { if(yypvt[-0].symb -> seg == SSG_UNDEF) { yypvt[-0].symb -> seg = SSG_ABS; yypvt[-0].symb -> value = labelloc; prtequvalue("C: 0x%lx\n", labelloc); } else fraerror( "multiple definition of label"); } break; case 23: # line 532 "as8051.y" { if(yypvt[-1].symb -> seg == SSG_UNDEF) { yypvt[-1].symb -> seg = SSG_ABS; yypvt[-1].symb -> value = labelloc; } else fraerror( "multiple definition of label"); labelloc = locctr; } break; case 24: # line 545 "as8051.y" { labelloc = locctr; } break; case 25: # line 551 "as8051.y" { genlocrec(currseg, labelloc); for( satsub = 0; satsub < yypvt[-0].intv; satsub++) { pevalexpr(1, exprlist[satsub]); locctr += geninstr(genbdef); } } break; case 26: # line 560 "as8051.y" { genlocrec(currseg, labelloc); for(satsub = 0; satsub < yypvt[-0].intv; satsub++) { locctr += genstring(stringlist[satsub]); } } break; case 27: # line 568 "as8051.y" { genlocrec(currseg, labelloc); for( satsub = 0; satsub < yypvt[-0].intv; satsub++) { pevalexpr(1, exprlist[satsub]); locctr += geninstr(genwdef); } } break; case 28: # line 577 "as8051.y" { pevalexpr(0, yypvt[-0].intv); if(evalr[0].seg == SSG_ABS) { locctr = labelloc + evalr[0].value; prtequvalue("C: 0x%lx\n", labelloc); } else { fraerror( "noncomputable result for RMB expression"); } } break; case 29: # line 593 "as8051.y" { exprlist[nextexprs ++ ] = yypvt[-0].intv; yyval.intv = nextexprs; } break; case 30: # line 598 "as8051.y" { nextexprs = 0; exprlist[nextexprs ++ ] = yypvt[-0].intv; yyval.intv = nextexprs; } break; case 31: # line 606 "as8051.y" { stringlist[nextstrs ++ ] = yypvt[-0].strng; yyval.intv = nextstrs; } break; case 32: # line 611 "as8051.y" { nextstrs = 0; stringlist[nextstrs ++ ] = yypvt[-0].strng; yyval.intv = nextstrs; } break; case 33: # line 620 "as8051.y" { genlocrec(currseg, labelloc); locctr += geninstr(findgen(yypvt[-0].intv, ST_INH, 0)); } break; case 34: # line 626 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-2].intv, ST_UOP01, (yypvt[-0].intv & REGSEL_ALL))); } break; case 35: # line 633 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-1].intv, ST_UOP02, (yypvt[-0].intv & REGSEL_ALL))); } break; case 36: # line 640 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = yypvt[-0].intv; locctr += geninstr(findgen(yypvt[-1].intv, ST_UOP03, 0)); } break; case 37: # line 647 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-1].intv, ST_UOP04, 0)); } break; case 38: # line 654 "as8051.y" { genlocrec(currseg, labelloc); locctr += geninstr(findgen(yypvt[-4].intv, ST_UOP05, (yypvt[-2].intv & REGSEL_ALL) | ((yypvt[-0].intv & REGSEL_ALL) >> REG2NDSHFT) )); } break; case 39: # line 661 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-3].intv & REGVALMASK); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-4].intv, ST_ALU01, (yypvt[-3].intv & REGSEL_ALL))); } break; case 40: # line 669 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-3].intv & REGVALMASK); evalr[2].value = yypvt[-0].intv; locctr += geninstr(findgen(yypvt[-4].intv, ST_ALU02, (yypvt[-3].intv & REGSEL_ALL))); } break; case 41: # line 677 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-3].intv & REGVALMASK); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-4].intv, ST_ALU02E, (yypvt[-3].intv & REGSEL_ALL))); } break; case 42: # line 685 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-3].intv & REGVALMASK); evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-4].intv, ST_ALU03, (yypvt[-3].intv & REGSEL_ALL) | ((yypvt[-0].intv & REGSEL_ALL) >> REG2NDSHFT))); } break; case 43: # line 694 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-3].intv, ST_ALU04, (yypvt[-2].intv & REGSEL_ALL) | ((yypvt[-0].intv & REGSEL_ALL) >> REG2NDSHFT))); } break; case 44: # line 703 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); evalr[2].value = yypvt[-0].intv; locctr += geninstr(findgen(yypvt[-3].intv, ST_ALU05, (yypvt[-2].intv & REGSEL_ALL))); } break; case 45: # line 711 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-3].intv, ST_ALU06, (yypvt[-2].intv & REGSEL_ALL))); } break; case 46: # line 719 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = yypvt[-2].intv; pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-3].intv, ST_ALU07, 0)); } break; case 47: # line 727 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-3].intv); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-4].intv, ST_ALU08, 0)); } break; case 48: # line 735 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-2].intv); evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-3].intv, ST_ALU09, (yypvt[-0].intv & REGSEL_ALL))); } break; case 49: # line 743 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-2].intv); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-3].intv, ST_ALU10, 0)); } break; case 50: # line 751 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-3].intv & REGVALMASK); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-5].intv, ST_MOV01, (yypvt[-3].intv & REGSEL_ALL))); } break; case 51: # line 759 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-4].intv, ST_MOV02, (yypvt[-2].intv & REGSEL_ALL) | ((yypvt[-0].intv & REGSEL_ALL) >> REG2NDSHFT))); } break; case 52: # line 768 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-4].intv, ST_MOV03, (yypvt[-2].intv & REGSEL_ALL))); } break; case 53: # line 776 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-3].intv & REGVALMASK); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-4].intv, ST_MOV04, (yypvt[-3].intv & REGSEL_ALL))); } break; case 54: # line 784 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-3].intv & REGVALMASK); evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-4].intv, ST_MOV05, (yypvt[-3].intv & REGSEL_ALL) | ((yypvt[-0].intv & REGSEL_ALL) >> REG2NDSHFT))); } break; case 55: # line 793 "as8051.y" { genlocrec(currseg, labelloc); locctr += geninstr(findgen(yypvt[-6].intv, ST_MOV06, ((yypvt[-5].intv&yypvt[-2].intv) & REGSEL_ALL) | ((yypvt[-0].intv & REGSEL_ALL) >> REG2NDSHFT))); } break; case 56: # line 800 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-3].intv, ST_MOV07, (yypvt[-2].intv & REGSEL_ALL) | ((yypvt[-0].intv & REGSEL_ALL) >> REG2NDSHFT))); } break; case 57: # line 809 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); evalr[2].value = yypvt[-0].intv; locctr += geninstr(findgen(yypvt[-3].intv, ST_MOV08, (yypvt[-2].intv & REGSEL_ALL))); } break; case 58: # line 817 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-2].intv & REGVALMASK); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-3].intv, ST_MOV09, (yypvt[-2].intv & REGSEL_ALL))); } break; case 59: # line 825 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = yypvt[-2].intv; evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-3].intv, ST_MOV10, (yypvt[-0].intv & REGSEL_ALL))); } break; case 60: # line 833 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-3].intv); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-4].intv, ST_MOV11, 0)); } break; case 61: # line 841 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-3].intv); evalr[2].value = ( yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-4].intv, ST_MOV12, (yypvt[-0].intv & REGSEL_ALL))); } break; case 62: # line 849 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-2].intv); evalr[2].value = (yypvt[-0].intv & REGVALMASK); locctr += geninstr(findgen(yypvt[-3].intv, ST_MOV13, (yypvt[-0].intv & REGSEL_ALL))); } break; case 63: # line 857 "as8051.y" { genlocrec(currseg, labelloc); pevalexpr(1,yypvt[-2].intv); pevalexpr(2,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-3].intv, ST_MOV14, 0)); } break; case 64: # line 865 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-4].intv & REGVALMASK); pevalexpr(2,yypvt[-2].intv); pevalexpr(3,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-5].intv, ST_CJNE1, (yypvt[-4].intv & REGSEL_ALL))); } break; case 65: # line 874 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-5].intv & REGVALMASK); pevalexpr(2,yypvt[-2].intv); pevalexpr(3,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-6].intv, ST_CJNE2, (yypvt[-5].intv & REGSEL_ALL))); } break; case 66: # line 883 "as8051.y" { genlocrec(currseg, labelloc); evalr[1].value = ( yypvt[-5].intv & REGVALMASK); pevalexpr(2,yypvt[-2].intv); pevalexpr(3,yypvt[-0].intv); locctr += geninstr(findgen(yypvt[-7].intv, ST_CJNE3, (yypvt[-5].intv & REGSEL_ALL))); } break; case 67: # line 892 "as8051.y" { int bitaddr; pevalexpr(0, yypvt[-2].intv); if(evalr[0].seg == SSG_ABS) { switch((int)(evalr[0].value)) { case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: bitaddr = (evalr[0].value - 0x20) << 3; break; case 0x80: case 0x88: case 0x90: case 0x98: case 0xa0: case 0xa8: case 0xb0: case 0xb8: case 0xc0: case 0xc8: case 0xd0: case 0xd8: case 0xe0: case 0xe8: case 0xf0: case 0xf8: bitaddr = evalr[0].value; break; default: fraerror( "location is not bit addressable"); evalr[0].value = 0; break; } } else { fraerror( "noncomputable expression in bit address"); evalr[0].value = 0; } if(yypvt[-0].longv < 0 || yypvt[-0].longv > 7) { fraerror("bit number invalid"); } yyval.intv = bitaddr + yypvt[-0].longv; } break; case 68: # line 963 "as8051.y" { yyval.intv = yypvt[-0].intv; } break; case 69: # line 967 "as8051.y" { yyval.intv = exprnode(PCCASE_UN,yypvt[-0].intv,IFC_NEG,0,0L, SYMNULL); } break; case 70: # line 972 "as8051.y" { yyval.intv = exprnode(PCCASE_UN,yypvt[-0].intv,IFC_NOT,0,0L, SYMNULL); } break; case 71: # line 977 "as8051.y" { yyval.intv = exprnode(PCCASE_UN,yypvt[-0].intv,IFC_HIGH,0,0L, SYMNULL); } break; case 72: # line 982 "as8051.y" { yyval.intv = exprnode(PCCASE_UN,yypvt[-0].intv,IFC_LOW,0,0L, SYMNULL); } break; case 73: # line 987 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_MUL,yypvt[-0].intv,0L, SYMNULL); } break; case 74: # line 992 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_DIV,yypvt[-0].intv,0L, SYMNULL); } break; case 75: # line 997 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_ADD,yypvt[-0].intv,0L, SYMNULL); } break; case 76: # line 1002 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_SUB,yypvt[-0].intv,0L, SYMNULL); } break; case 77: # line 1007 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_MOD,yypvt[-0].intv,0L, SYMNULL); } break; case 78: # line 1012 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_SHL,yypvt[-0].intv,0L, SYMNULL); } break; case 79: # line 1017 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_SHR,yypvt[-0].intv,0L, SYMNULL); } break; case 80: # line 1022 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_GT,yypvt[-0].intv,0L, SYMNULL); } break; case 81: # line 1027 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_GE,yypvt[-0].intv,0L, SYMNULL); } break; case 82: # line 1032 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_LT,yypvt[-0].intv,0L, SYMNULL); } break; case 83: # line 1037 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_LE,yypvt[-0].intv,0L, SYMNULL); } break; case 84: # line 1042 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_NE,yypvt[-0].intv,0L, SYMNULL); } break; case 85: # line 1047 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_EQ,yypvt[-0].intv,0L, SYMNULL); } break; case 86: # line 1052 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_AND,yypvt[-0].intv,0L, SYMNULL); } break; case 87: # line 1057 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_OR,yypvt[-0].intv,0L, SYMNULL); } break; case 88: # line 1062 "as8051.y" { yyval.intv = exprnode(PCCASE_BIN,yypvt[-2].intv,IFC_XOR,yypvt[-0].intv,0L, SYMNULL); } break; case 89: # line 1067 "as8051.y" { yyval.intv = exprnode(PCCASE_DEF,0,IGP_DEFINED,0,0L,yypvt[-0].symb); } break; case 90: # line 1071 "as8051.y" { yyval.intv = exprnode(PCCASE_SYMB,0,IFC_SYMB,0,0L,yypvt[-0].symb); } break; case 91: # line 1075 "as8051.y" { yyval.intv = exprnode(PCCASE_PROGC,0,IFC_PROGCTR,0, labelloc, SYMNULL); } break; case 92: # line 1080 "as8051.y" { yyval.intv = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,yypvt[-0].longv, SYMNULL); } break; case 93: # line 1085 "as8051.y" { char *sourcestr = yypvt[-0].strng; long accval = 0; if(strlen(yypvt[-0].strng) > 0) { accval = chtran(&sourcestr); if(*sourcestr != '\0') { accval = (accval << 8) + chtran(&sourcestr); } if( *sourcestr != '\0') { frawarn("string constant in expression more than 2 characters long"); } } yyval.intv = exprnode(PCCASE_CONS, 0, IGP_CONSTANT, 0, accval, SYMNULL); } break; case 94: # line 1107 "as8051.y" { yyval.intv = yypvt[-1].intv; } break; } goto yystack; /* reset registers in driver code */ } # ifdef __RUNTIME_YYMAXDEPTH int allocate_stacks() { /* allocate the yys and yyv stacks */ yys = (int *) malloc(yymaxdepth * sizeof(int)); yyv = (YYSTYPE *) malloc(yymaxdepth * sizeof(YYSTYPE)); if (yys==0 || yyv==0) { yyerror( (nl_msg(30004,"unable to allocate space for yacc stacks")) ); return(1); } else return(0); } void free_stacks() { if (yys!=0) free(yys); if (yyv!=0) free(yyv); } # endif /* defined(__RUNTIME_YYMAXDEPTH) */ u獓% m$bM Gm82G'JggT:ΠOn ϯL-XJ0x<0yNZC;wA Ӗ˳IjPQ|6$eiPϹxҟyAO$UN6N*.ʨ,5kRE(d?rR/~jC*{}ZCIR\!ni Y *dVJ W +=9bz8k|Aū6ܤ";h9M*: ,Z3͗6~S@RNXT:޷0deu0֐$6R"|CgK,:P1.=RֹwPB# 8(m (&x`ńZ9tY 1n&ѥ8&=* BuModehOm|rhIfDutqzAaI~ą%c1~ zcGԮD=jԠ3ww6B`k ,$r͟ 4nJkt,Q[ p$6|i4_xG6IYTT&P#'ؔ*n5CRߦoL C ǽӇ~>P4Td̓i8o" FʹO!R<@N #include "frasmdat.h" #include "fragcon.h" #define yylex lexintercept /* 0000.0000.0000.0xxx register value */ #define REGVALMASK 0x7 /* 0xxx.xxxx.0000.0000 register and special select bits */ #define REGSEL_ALL 0x7f00 #define REG2NDSHFT 8 #define REGSEL_ACC 0x100 #define REGSEL_AB 0x200 #define REGSEL_C 0x400 #define REGSEL_DPTR 0x800 #define REGSEL_PC 0x1000 #define REGSEL_R01 0x2000 #define REGSEL_R07 0x4000 #define REG2SEL_ACC 0x1 #define REG2SEL_AB 0x2 #define REG2SEL_C 0x4 #define REG2SEL_DPTR 0x8 #define REG2SEL_PC 0x10 #define REG2SEL_R01 0x20 #define REG2SEL_R07 0x40 #define ST_INH 0x1 #define ST_UOP01 0x2 #define ST_UOP02 0x4 #define ST_UOP03 0x8 #define ST_UOP04 0x10 #define ST_UOP05 0x20 #define ST_ALU01 0x1 #define ST_ALU02 0x2 #define ST_ALU02E 0x4 #define ST_ALU03 0x8 #define ST_ALU04 0x10 #define ST_ALU05 0x20 #define ST_ALU06 0x40 #define ST_ALU07 0x80 #define ST_ALU08 0x100 #define ST_ALU09 0x200 #define ST_ALU10 0x400 #define ST_MOV01 0x1 #define ST_MOV02 0x2 #define ST_MOV03 0x4 #define ST_MOV04 0x8 #define ST_MOV05 0x10 #define ST_MOV06 0x20 #define ST_MOV07 0x40 #define ST_MOV08 0x80 #define ST_MOV09 0x100 #define ST_MOV10 0x200 #define ST_MOV11 0x400 #define ST_MOV12 0x800 #define ST_MOV13 0x1000 #define ST_MOV14 0x2000 #define ST_CJNE1 0x1 #define ST_CJNE2 0x2 #define ST_CJNE3 0x4 static char genbdef[] = "[1=];"; static char genwdef[] = "[1=]y"; /* x for normal, y for byte rev */ char ignosyn[] = "[Xinvalid syntax for instruction"; char ignosel[] = "[Xinvalid operands"; long labelloc; static int satsub; int ifstkpt = 0; int fraifskip = FALSE; struct symel * endsymbol = SYMNULL; %} %union { int intv; long longv; char *strng; struct symel *symb; } %token REG %type bit %token KOC_BDEF %token KOC_ELSE %token KOC_END %token KOC_ENDI %token KOC_EQU %token KOC_IF %token KOC_INCLUDE %token KOC_ORG %token KOC_RESM %token KOC_SDEF %token KOC_SET %token KOC_WDEF %token KOC_CHSET %token KOC_CHDEF %token KOC_CHUSE %token KOC_opcode %token KOC_aluop %token KOC_mov %token KOC_cjne %token CONSTANT %token EOL %token KEOP_AND %token KEOP_DEFINED %token KEOP_EQ %token KEOP_GE %token KEOP_GT %token KEOP_HIGH %token KEOP_LE %token KEOP_LOW %token KEOP_LT %token KEOP_MOD %token KEOP_MUN %token KEOP_NE %token KEOP_NOT %token KEOP_OR %token KEOP_SHL %token KEOP_SHR %token KEOP_XOR %token KEOP_locctr %token LABEL %token STRING %token SYMBOL %token KTK_invalid %right KEOP_HIGH KEOP_LOW %left KEOP_OR KEOP_XOR %left KEOP_AND %right KEOP_NOT %nonassoc KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ %left '+' '-' %left '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR %right KEOP_MUN %type expr exprlist stringlist %start file %% file : file allline | allline ; allline : line EOL { clrexpr(); } | EOL | error EOL { clrexpr(); yyerrok; } ; line : LABEL KOC_END { endsymbol = $1; nextreadact = Nra_end; } | KOC_END { nextreadact = Nra_end; } | KOC_INCLUDE STRING { if(nextfstk >= FILESTKDPTH) { fraerror("include file nesting limit exceeded"); } else { infilestk[nextfstk].fnm = savestring($2,strlen($2)); if( (infilestk[nextfstk].fpt = fopen($2,"r")) ==(FILE *)NULL ) { fraerror("cannot open include file"); } else { nextreadact = Nra_new; } } } | LABEL KOC_EQU expr { if($1 -> seg == SSG_UNDEF) { pevalexpr(0, $3); if(evalr[0].seg == SSG_ABS) { $1 -> seg = SSG_EQU; $1 -> value = evalr[0].value; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for EQU"); } } else { fraerror( "cannot change symbol value with EQU"); } } | LABEL KOC_SET expr { if($1 -> seg == SSG_UNDEF || $1 -> seg == SSG_SET) { pevalexpr(0, $3); if(evalr[0].seg == SSG_ABS) { $1 -> seg = SSG_SET; $1 -> value = evalr[0].value; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for SET"); } } else { fraerror( "cannot change symbol value with SET"); } } | KOC_IF expr { if((++ifstkpt) < IFSTKDEPTH) { pevalexpr(0, $2); if(evalr[0].seg == SSG_ABS) { if(evalr[0].value != 0) { elseifstk[ifstkpt] = If_Skip; endifstk[ifstkpt] = If_Active; } else { fraifskip = TRUE; elseifstk[ifstkpt] = If_Active; endifstk[ifstkpt] = If_Active; } } else { fraifskip = TRUE; elseifstk[ifstkpt] = If_Active; endifstk[ifstkpt] = If_Active; } } else { fraerror("IF stack overflow"); } } | KOC_IF { if(fraifskip) { if((++ifstkpt) < IFSTKDEPTH) { elseifstk[ifstkpt] = If_Skip; endifstk[ifstkpt] = If_Skip; } else { fraerror("IF stack overflow"); } } else { yyerror("syntax error"); YYERROR; } } | KOC_ELSE { switch(elseifstk[ifstkpt]) { case If_Active: fraifskip = FALSE; break; case If_Skip: fraifskip = TRUE; break; case If_Err: fraerror("ELSE with no matching if"); break; } } | KOC_ENDI { switch(endifstk[ifstkpt]) { case If_Active: fraifskip = FALSE; ifstkpt--; break; case If_Skip: fraifskip = TRUE; ifstkpt--; break; case If_Err: fraerror("ENDI with no matching if"); break; } } | LABEL KOC_ORG expr { pevalexpr(0, $3); if(evalr[0].seg == SSG_ABS) { locctr = labelloc = evalr[0].value; if($1 -> seg == SSG_UNDEF) { $1 -> seg = SSG_ABS; $1 -> value = labelloc; } else fraerror( "multiple definition of label"); prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for ORG"); } } | KOC_ORG expr { pevalexpr(0, $2); if(evalr[0].seg == SSG_ABS) { locctr = labelloc = evalr[0].value; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror( "noncomputable expression for ORG"); } } | LABEL KOC_CHSET { if($1 -> seg == SSG_UNDEF) { $1 -> seg = SSG_EQU; if( ($1->value = chtcreate()) <= 0) { fraerror( "cannot create character translation table"); } prtequvalue("C: 0x%lx\n", $1 -> value); } else { fraerror( "multiple definition of label"); } } | KOC_CHUSE { chtcpoint = (int *) NULL; prtequvalue("C: 0x%lx\n", 0L); } | KOC_CHUSE expr { pevalexpr(0, $2); if( evalr[0].seg == SSG_ABS) { if( evalr[0].value == 0) { chtcpoint = (int *)NULL; prtequvalue("C: 0x%lx\n", 0L); } else if(evalr[0].value < chtnxalph) { chtcpoint = chtatab[evalr[0].value]; prtequvalue("C: 0x%lx\n", evalr[0].value); } else { fraerror("nonexistent character translation table"); } } else { fraerror("noncomputable expression"); } } | KOC_CHDEF STRING ',' exprlist { int findrv, numret, *charaddr; char *sourcestr = $2, *before; if(chtnpoint != (int *)NULL) { for(satsub = 0; satsub < $4; satsub++) { before = sourcestr; pevalexpr(0, exprlist[satsub]); findrv = chtcfind(chtnpoint, &sourcestr, &charaddr, &numret); if(findrv == CF_END) { fraerror("more expressions than characters"); break; } if(evalr[0].seg == SSG_ABS) { switch(findrv) { case CF_UNDEF: { if(evalr[0].value < 0 || evalr[0].value > 255) { frawarn("character translation value truncated"); } *charaddr = evalr[0].value & 0xff; prtequvalue("C: 0x%lx\n", evalr[0].value); } break; case CF_INVALID: case CF_NUMBER: fracherror("invalid character to define", before, sourcestr); break; case CF_CHAR: fracherror("character already defined", before, sourcestr); break; } } else { fraerror("noncomputable expression"); } } if( *sourcestr != '\0') { fraerror("more characters than expressions"); } } else { fraerror("no CHARSET statement active"); } } | LABEL { if($1 -> seg == SSG_UNDEF) { $1 -> seg = SSG_ABS; $1 -> value = labelloc; prtequvalue("C: 0x%lx\n", labelloc); } else fraerror( "multiple definition of label"); } | labeledline ; labeledline : LABEL genline { if($1 -> seg == SSG_UNDEF) { $1 -> seg = SSG_ABS; $1 -> value = labelloc; } else fraerror( "multiple definition of label"); labelloc = locctr; } | genline { labelloc = locctr; } ; genline : KOC_BDEF exprlist { genlocrec(currseg, labelloc); for( satsub = 0; satsub < $2; satsub++) { pevalexpr(1, exprlist[satsub]); locctr += geninstr(genbdef); } } | KOC_SDEF stringlist { genlocrec(currseg, labelloc); for(satsub = 0; satsub < $2; satsub++) { locctr += genstring(stringlist[satsub]); } } | KOC_WDEF exprlist { genlocrec(currseg, labelloc); for( satsub = 0; satsub < $2; satsub++) { pevalexpr(1, exprlist[satsub]); locctr += geninstr(genwdef); } } | KOC_RESM expr { pevalexpr(0, $2); if(evalr[0].seg == SSG_ABS) { locctr = labelloc + evalr[0].value; prtequvalue("C: 0x%lx\n", labelloc); } else { fraerror( "noncomputable result for RMB expression"); } } ; exprlist : exprlist ',' expr { exprlist[nextexprs ++ ] = $3; $$ = nextexprs; } | expr { nextexprs = 0; exprlist[nextexprs ++ ] = $1; $$ = nextexprs; } ; stringlist : stringlist ',' STRING { stringlist[nextstrs ++ ] = $3; $$ = nextstrs; } | STRING { nextstrs = 0; stringlist[nextstrs ++ ] = $1; $$ = nextstrs; } ; genline : KOC_opcode { genlocrec(currseg, labelloc); locctr += geninstr(findgen($1, ST_INH, 0)); } ; genline : KOC_opcode '@' REG { genlocrec(currseg, labelloc); evalr[1].value = ( $3 & REGVALMASK); locctr += geninstr(findgen($1, ST_UOP01, ($3 & REGSEL_ALL))); } ; genline : KOC_opcode REG { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); locctr += geninstr(findgen($1, ST_UOP02, ($2 & REGSEL_ALL))); } ; genline : KOC_opcode bit { genlocrec(currseg, labelloc); evalr[1].value = $2; locctr += geninstr(findgen($1, ST_UOP03, 0)); } ; genline : KOC_opcode expr { genlocrec(currseg, labelloc); pevalexpr(1,$2); locctr += geninstr(findgen($1, ST_UOP04, 0)); } ; genline : KOC_opcode '@' REG '+' REG { genlocrec(currseg, labelloc); locctr += geninstr(findgen($1, ST_UOP05, ($3 & REGSEL_ALL) | (($5 & REGSEL_ALL) >> REG2NDSHFT) )); } ; genline : KOC_aluop REG ',' '#' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); pevalexpr(2,$5); locctr += geninstr(findgen($1, ST_ALU01, ($2 & REGSEL_ALL))); } ; genline : KOC_aluop REG ',' '/' bit { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); evalr[2].value = $5; locctr += geninstr(findgen($1, ST_ALU02, ($2 & REGSEL_ALL))); } ; genline : KOC_aluop REG ',' '/' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); pevalexpr(2,$5); locctr += geninstr(findgen($1, ST_ALU02E, ($2 & REGSEL_ALL))); } ; genline : KOC_aluop REG ',' '@' REG { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); evalr[2].value = ( $5 & REGVALMASK); locctr += geninstr(findgen($1, ST_ALU03, ($2 & REGSEL_ALL) | (($5 & REGSEL_ALL) >> REG2NDSHFT))); } ; genline : KOC_aluop REG ',' REG { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); evalr[2].value = ( $4 & REGVALMASK); locctr += geninstr(findgen($1, ST_ALU04, ($2 & REGSEL_ALL) | (($4 & REGSEL_ALL) >> REG2NDSHFT))); } ; genline : KOC_aluop REG ',' bit { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); evalr[2].value = $4; locctr += geninstr(findgen($1, ST_ALU05, ($2 & REGSEL_ALL))); } ; genline : KOC_aluop REG ',' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); pevalexpr(2,$4); locctr += geninstr(findgen($1, ST_ALU06, ($2 & REGSEL_ALL))); } ; genline : KOC_aluop bit ',' expr { genlocrec(currseg, labelloc); evalr[1].value = $2; pevalexpr(2,$4); locctr += geninstr(findgen($1, ST_ALU07, 0)); } ; genline : KOC_aluop expr ',' '#' expr { genlocrec(currseg, labelloc); pevalexpr(1,$2); pevalexpr(2,$5); locctr += geninstr(findgen($1, ST_ALU08, 0)); } ; genline : KOC_aluop expr ',' REG { genlocrec(currseg, labelloc); pevalexpr(1,$2); evalr[2].value = ( $4 & REGVALMASK); locctr += geninstr(findgen($1, ST_ALU09, ($4 & REGSEL_ALL))); } ; genline : KOC_aluop expr ',' expr { genlocrec(currseg, labelloc); pevalexpr(1,$2); pevalexpr(2,$4); locctr += geninstr(findgen($1, ST_ALU10, 0)); } ; genline : KOC_mov '@' REG ',' '#' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $3 & REGVALMASK); pevalexpr(2,$6); locctr += geninstr(findgen($1, ST_MOV01, ($3 & REGSEL_ALL))); } ; genline : KOC_mov '@' REG ',' REG { genlocrec(currseg, labelloc); evalr[1].value = ( $3 & REGVALMASK); evalr[2].value = ( $5 & REGVALMASK); locctr += geninstr(findgen($1, ST_MOV02, ($3 & REGSEL_ALL) | (($5 & REGSEL_ALL) >> REG2NDSHFT))); } ; genline : KOC_mov '@' REG ',' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $3 & REGVALMASK); pevalexpr(2,$5); locctr += geninstr(findgen($1, ST_MOV03, ($3 & REGSEL_ALL))); } ; genline : KOC_mov REG ',' '#' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); pevalexpr(2,$5); locctr += geninstr(findgen($1, ST_MOV04, ($2 & REGSEL_ALL))); } ; genline : KOC_mov REG ',' '@' REG { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); evalr[2].value = ( $5 & REGVALMASK); locctr += geninstr(findgen($1, ST_MOV05, ($2 & REGSEL_ALL) | (($5 & REGSEL_ALL) >> REG2NDSHFT))); } ; genline : KOC_mov REG ',' '@' REG '+' REG { genlocrec(currseg, labelloc); locctr += geninstr(findgen($1, ST_MOV06, (($2&$5) & REGSEL_ALL) | (($7 & REGSEL_ALL) >> REG2NDSHFT))); } ; genline : KOC_mov REG ',' REG { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); evalr[2].value = ( $4 & REGVALMASK); locctr += geninstr(findgen($1, ST_MOV07, ($2 & REGSEL_ALL) | (($4 & REGSEL_ALL) >> REG2NDSHFT))); } ; genline : KOC_mov REG ',' bit { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); evalr[2].value = $4; locctr += geninstr(findgen($1, ST_MOV08, ($2 & REGSEL_ALL))); } ; genline : KOC_mov REG ',' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); pevalexpr(2,$4); locctr += geninstr(findgen($1, ST_MOV09, ($2 & REGSEL_ALL))); } ; genline : KOC_mov bit ',' REG { genlocrec(currseg, labelloc); evalr[1].value = $2; evalr[2].value = ( $4 & REGVALMASK); locctr += geninstr(findgen($1, ST_MOV10, ($4 & REGSEL_ALL))); } ; genline : KOC_mov expr ',' '#' expr { genlocrec(currseg, labelloc); pevalexpr(1,$2); pevalexpr(2,$5); locctr += geninstr(findgen($1, ST_MOV11, 0)); } ; genline : KOC_mov expr ',' '@' REG { genlocrec(currseg, labelloc); pevalexpr(1,$2); evalr[2].value = ( $5 & REGVALMASK); locctr += geninstr(findgen($1, ST_MOV12, ($5 & REGSEL_ALL))); } ; genline : KOC_mov expr ',' REG { genlocrec(currseg, labelloc); pevalexpr(1,$2); evalr[2].value = ($4 & REGVALMASK); locctr += geninstr(findgen($1, ST_MOV13, ($4 & REGSEL_ALL))); } ; genline : KOC_mov expr ',' expr { genlocrec(currseg, labelloc); pevalexpr(1,$2); pevalexpr(2,$4); locctr += geninstr(findgen($1, ST_MOV14, 0)); } ; genline : KOC_cjne REG ',' expr ',' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); pevalexpr(2,$4); pevalexpr(3,$6); locctr += geninstr(findgen($1, ST_CJNE1, ($2 & REGSEL_ALL))); } ; genline : KOC_cjne REG ',' '#' expr ',' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $2 & REGVALMASK); pevalexpr(2,$5); pevalexpr(3,$7); locctr += geninstr(findgen($1, ST_CJNE2, ($2 & REGSEL_ALL))); } ; genline : KOC_cjne '@' REG ',' '#' expr ',' expr { genlocrec(currseg, labelloc); evalr[1].value = ( $3 & REGVALMASK); pevalexpr(2,$6); pevalexpr(3,$8); locctr += geninstr(findgen($1, ST_CJNE3, ($3 & REGSEL_ALL))); } ; bit : expr '.' CONSTANT { int bitaddr; pevalexpr(0, $1); if(evalr[0].seg == SSG_ABS) { switch((int)(evalr[0].value)) { case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: bitaddr = (evalr[0].value - 0x20) << 3; break; case 0x80: case 0x88: case 0x90: case 0x98: case 0xa0: case 0xa8: case 0xb0: case 0xb8: case 0xc0: case 0xc8: case 0xd0: case 0xd8: case 0xe0: case 0xe8: case 0xf0: case 0xf8: bitaddr = evalr[0].value; break; default: fraerror( "location is not bit addressable"); evalr[0].value = 0; break; } } else { fraerror( "noncomputable expression in bit address"); evalr[0].value = 0; } if($3 < 0 || $3 > 7) { fraerror("bit number invalid"); } $$ = bitaddr + $3; } ; expr : '+' expr %prec KEOP_MUN { $$ = $2; } | '-' expr %prec KEOP_MUN { $$ = exprnode(PCCASE_UN,$2,IFC_NEG,0,0L, SYMNULL); } | KEOP_NOT expr { $$ = exprnode(PCCASE_UN,$2,IFC_NOT,0,0L, SYMNULL); } | KEOP_HIGH expr { $$ = exprnode(PCCASE_UN,$2,IFC_HIGH,0,0L, SYMNULL); } | KEOP_LOW expr { $$ = exprnode(PCCASE_UN,$2,IFC_LOW,0,0L, SYMNULL); } | expr '*' expr { $$ = exprnode(PCCASE_BIN,$1,IFC_MUL,$3,0L, SYMNULL); } | expr '/' expr { $$ = exprnode(PCCASE_BIN,$1,IFC_DIV,$3,0L, SYMNULL); } | expr '+' expr { $$ = exprnode(PCCASE_BIN,$1,IFC_ADD,$3,0L, SYMNULL); } | expr '-' expr { $$ = exprnode(PCCASE_BIN,$1,IFC_SUB,$3,0L, SYMNULL); } | expr KEOP_MOD expr { $$ = exprnode(PCCASE_BIN,$1,IFC_MOD,$3,0L, SYMNULL); } | expr KEOP_SHL expr { $$ = exprnode(PCCASE_BIN,$1,IFC_SHL,$3,0L, SYMNULL); } | expr KEOP_SHR expr { $$ = exprnode(PCCASE_BIN,$1,IFC_SHR,$3,0L, SYMNULL); } | expr KEOP_GT expr { $$ = exprnode(PCCASE_BIN,$1,IFC_GT,$3,0L, SYMNULL); } | expr KEOP_GE expr { $$ = exprnode(PCCASE_BIN,$1,IFC_GE,$3,0L, SYMNULL); } | expr KEOP_LT expr { $$ = exprnode(PCCASE_BIN,$1,IFC_LT,$3,0L, SYMNULL); } | expr KEOP_LE expr { $$ = exprnode(PCCASE_BIN,$1,IFC_LE,$3,0L, SYMNULL); } | expr KEOP_NE expr { $$ = exprnode(PCCASE_BIN,$1,IFC_NE,$3,0L, SYMNULL); } | expr KEOP_EQ expr { $$ = exprnode(PCCASE_BIN,$1,IFC_EQ,$3,0L, SYMNULL); } | expr KEOP_AND expr { $$ = exprnode(PCCASE_BIN,$1,IFC_AND,$3,0L, SYMNULL); } | expr KEOP_OR expr { $$ = exprnode(PCCASE_BIN,$1,IFC_OR,$3,0L, SYMNULL); } | expr KEOP_XOR expr { $$ = exprnode(PCCASE_BIN,$1,IFC_XOR,$3,0L, SYMNULL); } | KEOP_DEFINED SYMBOL { $$ = exprnode(PCCASE_DEF,0,IGP_DEFINED,0,0L,$2); } | SYMBOL { $$ = exprnode(PCCASE_SYMB,0,IFC_SYMB,0,0L,$1); } | '*' { $$ = exprnode(PCCASE_PROGC,0,IFC_PROGCTR,0, labelloc, SYMNULL); } | CONSTANT { $$ = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,$1, SYMNULL); } | STRING { char *sourcestr = $1; long accval = 0; if(strlen($1) > 0) { accval = chtran(&sourcestr); if(*sourcestr != '\0') { accval = (accval << 8) + chtran(&sourcestr); } if( *sourcestr != '\0') { frawarn("string constant in expression more than 2 characters long"); } } $$ = exprnode(PCCASE_CONS, 0, IGP_CONSTANT, 0, accval, SYMNULL); } | '(' expr ')' { $$ = $2; } ; %% lexintercept() /* description intercept the call to yylex (the lexical analyzer) and filter out all unnecessary tokens when skipping the input between a failed IF and its matching ENDI or ELSE globals fraifskip the enable flag */ { #undef yylex int rv; if(fraifskip) { for(;;) { switch(rv = yylex()) { case 0: case KOC_END: case KOC_IF: case KOC_ELSE: case KOC_ENDI: case EOL: return rv; default: break; } } } else return yylex(); #define yylex lexintercept } setreserved() { reservedsym("and", KEOP_AND, 0); reservedsym("defined", KEOP_DEFINED,0); reservedsym("eq", KEOP_EQ, 0); reservedsym("ge", KEOP_GE, 0); reservedsym("gt", KEOP_GT, 0); reservedsym("high", KEOP_HIGH, 0); reservedsym("le", KEOP_LE, 0); reservedsym("low", KEOP_LOW, 0); reservedsym("lt", KEOP_LT, 0); reservedsym("mod", KEOP_MOD, 0); reservedsym("ne", KEOP_NE, 0); reservedsym("not", KEOP_NOT, 0); reservedsym("or", KEOP_OR, 0); reservedsym("shl", KEOP_SHL, 0); reservedsym("shr", KEOP_SHR, 0); reservedsym("xor", KEOP_XOR, 0); reservedsym("AND", KEOP_AND, 0); reservedsym("DEFINED", KEOP_DEFINED,0); reservedsym("EQ", KEOP_EQ, 0); reservedsym("GE", KEOP_GE, 0); reservedsym("GT", KEOP_GT, 0); reservedsym("HIGH", KEOP_HIGH, 0); reservedsym("LE", KEOP_LE, 0); reservedsym("LOW", KEOP_LOW, 0); reservedsym("LT", KEOP_LT, 0); reservedsym("MOD", KEOP_MOD, 0); reservedsym("NE", KEOP_NE, 0); reservedsym("NOT", KEOP_NOT, 0); reservedsym("OR", KEOP_OR, 0); reservedsym("SHL", KEOP_SHL, 0); reservedsym("SHR", KEOP_SHR, 0); reservedsym("XOR", KEOP_XOR, 0); /* machine specific token definitions */ reservedsym("a", REG, REGSEL_ACC); reservedsym("ab", REG, REGSEL_AB); reservedsym("c", REG, REGSEL_C); reservedsym("dptr", REG, REGSEL_DPTR); reservedsym("pc", REG, REGSEL_PC); reservedsym("r0", REG, REGSEL_R01|REGSEL_R07|0); reservedsym("r1", REG, REGSEL_R01|REGSEL_R07|1); reservedsym("r2", REG, REGSEL_R07|2); reservedsym("r3", REG, REGSEL_R07|3); reservedsym("r4", REG, REGSEL_R07|4); reservedsym("r5", REG, REGSEL_R07|5); reservedsym("r6", REG, REGSEL_R07|6); reservedsym("r7", REG, REGSEL_R07|7); reservedsym("A", REG, REGSEL_ACC); reservedsym("AB", REG, REGSEL_AB); reservedsym("C", REG, REGSEL_C); reservedsym("DPTR", REG, REGSEL_DPTR); reservedsym("PC", REG, REGSEL_PC); reservedsym("R0", REG, REGSEL_R01|REGSEL_R07|0); reservedsym("R1", REG, REGSEL_R01|REGSEL_R07|1); reservedsym("R2", REG, REGSEL_R07|2); reservedsym("R3", REG, REGSEL_R07|3); reservedsym("R4", REG, REGSEL_R07|4); reservedsym("R5", REG, REGSEL_R07|5); reservedsym("R6", REG, REGSEL_R07|6); reservedsym("R7", REG, REGSEL_R07|7); } cpumatch(str) char * str; { return TRUE; } /* description Opcode and Instruction generation tables usage Unix, framework crossassembler history September 25, 1987 */ #define NUMOPCODE 68 #define NUMSYNBLK 107 #define NUMDIFFOP 125 int gnumopcode = NUMOPCODE; int ophashlnk[NUMOPCODE]; struct opsym optab[NUMOPCODE+1] = { {"invalid", KOC_opcode, 2, 0 }, {"ACALL", KOC_opcode, 1, 2 }, {"ADD", KOC_aluop, 4, 3 }, {"ADDC", KOC_aluop, 4, 7 }, {"AJMP", KOC_opcode, 1, 11 }, {"ANL", KOC_aluop, 9, 12 }, {"BYTE", KOC_BDEF, 0, 0 }, {"CHARDEF", KOC_CHDEF, 0, 0 }, {"CHARSET", KOC_CHSET, 0, 0 }, {"CHARUSE", KOC_CHUSE, 0, 0 }, {"CHD", KOC_CHDEF, 0, 0 }, {"CJNE", KOC_cjne, 3, 21 }, {"CLR", KOC_opcode, 3, 24 }, {"CPL", KOC_opcode, 3, 27 }, {"DA", KOC_opcode, 1, 30 }, {"DB", KOC_BDEF, 0, 0 }, {"DEC", KOC_opcode, 3, 31 }, {"DIV", KOC_opcode, 1, 34 }, {"DJNZ", KOC_aluop, 2, 35 }, {"DW", KOC_WDEF, 0, 0 }, {"ELSE", KOC_ELSE, 0, 0 }, {"END", KOC_END, 0, 0 }, {"ENDI", KOC_ENDI, 0, 0 }, {"EQU", KOC_EQU, 0, 0 }, {"FCB", KOC_BDEF, 0, 0 }, {"FCC", KOC_SDEF, 0, 0 }, {"FDB", KOC_WDEF, 0, 0 }, {"IF", KOC_IF, 0, 0 }, {"INC", KOC_opcode, 3, 37 }, {"INCL", KOC_INCLUDE, 0, 0 }, {"INCLUDE", KOC_INCLUDE, 0, 0 }, {"JB", KOC_aluop, 2, 40 }, {"JBC", KOC_aluop, 2, 42 }, {"JC", KOC_opcode, 1, 44 }, {"JMP", KOC_opcode, 1, 45 }, {"JNB", KOC_aluop, 2, 46 }, {"JNC", KOC_opcode, 1, 48 }, {"JNZ", KOC_opcode, 1, 49 }, {"JZ", KOC_opcode, 1, 50 }, {"LCALL", KOC_opcode, 1, 51 }, {"LJMP", KOC_opcode, 1, 52 }, {"MOV", KOC_mov, 13, 53 }, {"MOVC", KOC_mov, 1, 66 }, {"MOVX", KOC_mov, 2, 67 }, {"MUL", KOC_opcode, 1, 69 }, {"NOP", KOC_opcode, 1, 70 }, {"ORG", KOC_ORG, 0, 0 }, {"ORL", KOC_aluop, 9, 71 }, {"POP", KOC_opcode, 1, 80 }, {"PUSH", KOC_opcode, 1, 81 }, {"RESERVE", KOC_RESM, 0, 0 }, {"RET", KOC_opcode, 1, 82 }, {"RETI", KOC_opcode, 1, 83 }, {"RL", KOC_opcode, 1, 84 }, {"RLC", KOC_opcode, 1, 85 }, {"RMB", KOC_RESM, 0, 0 }, {"RR", KOC_opcode, 1, 86 }, {"RRC", KOC_opcode, 1, 87 }, {"SET", KOC_SET, 0, 0 }, {"SETB", KOC_opcode, 3, 88 }, {"SJMP", KOC_opcode, 1, 91 }, {"STRING", KOC_SDEF, 0, 0 }, {"SUBB", KOC_aluop, 4, 92 }, {"SWAP", KOC_opcode, 1, 96 }, {"WORD", KOC_WDEF, 0, 0 }, {"XCH", KOC_aluop, 3, 97 }, {"XCHD", KOC_aluop, 1, 100 }, {"XRL", KOC_aluop, 6, 101 }, { "", 0, 0, 0 }}; struct opsynt ostab[NUMSYNBLK+1] = { /* invalid 0 */ { 0, 1, 0 }, /* invalid 1 */ { 0xffff, 1, 1 }, /* ACALL 2 */ { ST_UOP04, 1, 2 }, /* ADD 3 */ { ST_ALU01, 1, 3 }, /* ADD 4 */ { ST_ALU03, 1, 4 }, /* ADD 5 */ { ST_ALU04, 1, 5 }, /* ADD 6 */ { ST_ALU06, 1, 6 }, /* ADDC 7 */ { ST_ALU01, 1, 7 }, /* ADDC 8 */ { ST_ALU03, 1, 8 }, /* ADDC 9 */ { ST_ALU04, 1, 9 }, /* ADDC 10 */ { ST_ALU06, 1, 10 }, /* AJMP 11 */ { ST_UOP04, 1, 11 }, /* ANL 12 */ { ST_ALU01, 1, 12 }, /* ANL 13 */ { ST_ALU02, 1, 13 }, /* ANL 14 */ { ST_ALU02E, 1, 14 }, /* ANL 15 */ { ST_ALU03, 1, 15 }, /* ANL 16 */ { ST_ALU04, 1, 16 }, /* ANL 17 */ { ST_ALU05, 1, 17 }, /* ANL 18 */ { ST_ALU06, 2, 18 }, /* ANL 19 */ { ST_ALU08, 1, 20 }, /* ANL 20 */ { ST_ALU09, 1, 21 }, /* CJNE 21 */ { ST_CJNE1, 1, 22 }, /* CJNE 22 */ { ST_CJNE2, 2, 23 }, /* CJNE 23 */ { ST_CJNE3, 1, 25 }, /* CLR 24 */ { ST_UOP02, 2, 26 }, /* CLR 25 */ { ST_UOP03, 1, 28 }, /* CLR 26 */ { ST_UOP04, 1, 29 }, /* CPL 27 */ { ST_UOP02, 2, 30 }, /* CPL 28 */ { ST_UOP03, 1, 32 }, /* CPL 29 */ { ST_UOP04, 1, 33 }, /* DA 30 */ { ST_UOP02, 1, 34 }, /* DEC 31 */ { ST_UOP01, 1, 35 }, /* DEC 32 */ { ST_UOP02, 2, 36 }, /* DEC 33 */ { ST_UOP04, 1, 38 }, /* DIV 34 */ { ST_UOP02, 1, 39 }, /* DJNZ 35 */ { ST_ALU06, 1, 40 }, /* DJNZ 36 */ { ST_ALU10, 1, 41 }, /* INC 37 */ { ST_UOP01, 1, 42 }, /* INC 38 */ { ST_UOP02, 3, 43 }, /* INC 39 */ { ST_UOP04, 1, 46 }, /* JB 40 */ { ST_ALU07, 1, 47 }, /* JB 41 */ { ST_ALU10, 1, 48 }, /* JBC 42 */ { ST_ALU07, 1, 49 }, /* JBC 43 */ { ST_ALU10, 1, 50 }, /* JC 44 */ { ST_UOP04, 1, 51 }, /* JMP 45 */ { ST_UOP05, 1, 52 }, /* JNB 46 */ { ST_ALU07, 1, 53 }, /* JNB 47 */ { ST_ALU10, 1, 54 }, /* JNC 48 */ { ST_UOP04, 1, 55 }, /* JNZ 49 */ { ST_UOP04, 1, 56 }, /* JZ 50 */ { ST_UOP04, 1, 57 }, /* LCALL 51 */ { ST_UOP04, 1, 58 }, /* LJMP 52 */ { ST_UOP04, 1, 59 }, /* MOV 53 */ { ST_MOV01, 1, 60 }, /* MOV 54 */ { ST_MOV02, 1, 61 }, /* MOV 55 */ { ST_MOV03, 1, 62 }, /* MOV 56 */ { ST_MOV04, 3, 63 }, /* MOV 57 */ { ST_MOV05, 1, 66 }, /* MOV 58 */ { ST_MOV07, 2, 67 }, /* MOV 59 */ { ST_MOV08, 1, 69 }, /* MOV 60 */ { ST_MOV09, 3, 70 }, /* MOV 61 */ { ST_MOV10, 1, 73 }, /* MOV 62 */ { ST_MOV11, 1, 74 }, /* MOV 63 */ { ST_MOV12, 1, 75 }, /* MOV 64 */ { ST_MOV13, 3, 76 }, /* MOV 65 */ { ST_MOV14, 1, 79 }, /* MOVC 66 */ { ST_MOV06, 2, 80 }, /* MOVX 67 */ { ST_MOV02, 2, 82 }, /* MOVX 68 */ { ST_MOV05, 2, 84 }, /* MUL 69 */ { ST_UOP02, 1, 86 }, /* NOP 70 */ { ST_INH, 1, 87 }, /* ORL 71 */ { ST_ALU01, 1, 88 }, /* ORL 72 */ { ST_ALU02, 1, 89 }, /* ORL 73 */ { ST_ALU02E, 1, 90 }, /* ORL 74 */ { ST_ALU03, 1, 91 }, /* ORL 75 */ { ST_ALU04, 1, 92 }, /* ORL 76 */ { ST_ALU05, 1, 93 }, /* ORL 77 */ { ST_ALU06, 2, 94 }, /* ORL 78 */ { ST_ALU08, 1, 96 }, /* ORL 79 */ { ST_ALU09, 1, 97 }, /* POP 80 */ { ST_UOP04, 1, 98 }, /* PUSH 81 */ { ST_UOP04, 1, 99 }, /* RET 82 */ { ST_INH, 1, 100 }, /* RETI 83 */ { ST_INH, 1, 101 }, /* RL 84 */ { ST_UOP02, 1, 102 }, /* RLC 85 */ { ST_UOP02, 1, 103 }, /* RR 86 */ { ST_UOP02, 1, 104 }, /* RRC 87 */ { ST_UOP02, 1, 105 }, /* SETB 88 */ { ST_UOP02, 1, 106 }, /* SETB 89 */ { ST_UOP03, 1, 107 }, /* SETB 90 */ { ST_UOP04, 1, 108 }, /* SJMP 91 */ { ST_UOP04, 1, 109 }, /* SUBB 92 */ { ST_ALU01, 1, 110 }, /* SUBB 93 */ { ST_ALU03, 1, 111 }, /* SUBB 94 */ { ST_ALU04, 1, 112 }, /* SUBB 95 */ { ST_ALU06, 1, 113 }, /* SWAP 96 */ { ST_UOP02, 1, 114 }, /* XCH 97 */ { ST_ALU03, 1, 115 }, /* XCH 98 */ { ST_ALU04, 1, 116 }, /* XCH 99 */ { ST_ALU06, 1, 117 }, /* XCHD 100 */ { ST_ALU03, 1, 118 }, /* XRL 101 */ { ST_ALU01, 1, 119 }, /* XRL 102 */ { ST_ALU03, 1, 120 }, /* XRL 103 */ { ST_ALU04, 1, 121 }, /* XRL 104 */ { ST_ALU06, 1, 122 }, /* XRL 105 */ { ST_ALU08, 1, 123 }, /* XRL 106 */ { ST_ALU09, 1, 124 }, { 0, 0, 0 } }; struct igel igtab[NUMDIFFOP+1] = { /* invalid 0 */ { 0 , 0, "[Xnullentry" }, /* invalid 1 */ { 0 , 0, "[Xinvalid opcode" }, /* ACALL 2 */ { 0 , 0, "[1=].Q.2+.f800&-.bI~.3}.e0&.11|;!.ff&;" }, /* ADD 3 */ { REGSEL_ACC , REGSEL_ACC, "24;[2=];" }, /* ADD 4 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "26.[2#]|;" }, /* ADD 5 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "28.[2#]|;" }, /* ADD 6 */ { REGSEL_ACC , REGSEL_ACC, "25;[2=].8I;" }, /* ADDC 7 */ { REGSEL_ACC , REGSEL_ACC, "34;[2=];" }, /* ADDC 8 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "36.[2#]|;" }, /* ADDC 9 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "38.[2#]|;" }, /* ADDC 10 */ { REGSEL_ACC , REGSEL_ACC, "35;[2=].8I;" }, /* AJMP 11 */ { 0 , 0, "[1=].Q.2+.f800&-.bI~.3}.e0&.01|;!.ff&;" }, /* ANL 12 */ { REGSEL_ACC , REGSEL_ACC, "54;[2=];" }, /* ANL 13 */ { REGSEL_C , REGSEL_C, "b0;[2#];" }, /* ANL 14 */ { REGSEL_C , REGSEL_C, "b0;[2=].8I;" }, /* ANL 15 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "56.[2#]|;" }, /* ANL 16 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "58.[2#]|;" }, /* ANL 17 */ { REGSEL_C , REGSEL_C, "82;[2#];" }, /* ANL 18 */ { REGSEL_ACC , REGSEL_ACC, "55;[2=].8I;" }, /* ANL 19 */ { REGSEL_C , REGSEL_C, "82;[2=].8I;" }, /* ANL 20 */ { 0 , 0, "53;[1=].8I;[2=];" }, /* ANL 21 */ { REGSEL_ACC , REGSEL_ACC, "52;[1=].8I;" }, /* CJNE 22 */ { REGSEL_ACC , REGSEL_ACC, "b5;[2=].8I;[3=].Q.1+-r" }, /* CJNE 23 */ { REGSEL_ACC , REGSEL_ACC, "b4;[2=];[3=].Q.1+-r" }, /* CJNE 24 */ { REGSEL_R07 , REGSEL_R07, "b8.[1#]|;[2=];[3=].Q.1+-r" }, /* CJNE 25 */ { REGSEL_R01 , REGSEL_R01, "b6.[1#]|;[2=];[3=].Q.1+-r" }, /* CLR 26 */ { REGSEL_ACC , REGSEL_ACC, "e4;" }, /* CLR 27 */ { REGSEL_C , REGSEL_C, "c3;" }, /* CLR 28 */ { 0 , 0, "c2;[1#];" }, /* CLR 29 */ { 0 , 0, "c2;[1=].8I;" }, /* CPL 30 */ { REGSEL_ACC , REGSEL_ACC, "f4;" }, /* CPL 31 */ { REGSEL_C , REGSEL_C, "b3;" }, /* CPL 32 */ { 0 , 0, "b2;[1#];" }, /* CPL 33 */ { 0 , 0, "b2;[1=].8I;" }, /* DA 34 */ { REGSEL_ACC , REGSEL_ACC, "d4;" }, /* DEC 35 */ { REGSEL_R01 , REGSEL_R01, "16.[1#]|;" }, /* DEC 36 */ { REGSEL_ACC , REGSEL_ACC, "14;" }, /* DEC 37 */ { REGSEL_R07 , REGSEL_R07, "18.[1#]|;" }, /* DEC 38 */ { 0 , 0, "15;[1=].8I;" }, /* DIV 39 */ { REGSEL_AB , REGSEL_AB, "84;" }, /* DJNZ 40 */ { REGSEL_R07 , REGSEL_R07, "d8.[1#]|;[2=].Q.1+-r" }, /* DJNZ 41 */ { 0 , 0, "d5;[1=].8I;[2=].Q.1+-r" }, /* INC 42 */ { REGSEL_R01 , REGSEL_R01, "06.[1#]|;" }, /* INC 43 */ { REGSEL_ACC , REGSEL_ACC, "04;" }, /* INC 44 */ { REGSEL_R07 , REGSEL_R07, "08.[1#]|;" }, /* INC 45 */ { REGSEL_DPTR , REGSEL_DPTR, "a3;" }, /* INC 46 */ { 0 , 0, "05;[1=].8I;" }, /* JB 47 */ { 0 , 0, "20;[1#];[2=].Q.1+-r" }, /* JB 48 */ { 0 , 0, "20;[1=].8I;[2=].Q.1+-r" }, /* JBC 49 */ { 0 , 0, "10;[1#];[2=].Q.1+-r" }, /* JBC 50 */ { 0 , 0, "10;[1=].8I;[2=].Q.1+-r" }, /* JC 51 */ { 0 , 0, "40;[1=].Q.1+-r" }, /* JMP 52 */ { REGSEL_ACC|REG2SEL_DPTR , REGSEL_ACC|REG2SEL_DPTR, "73;" }, /* JNB 53 */ { 0 , 0, "30;[1#];[2=].Q.1+-r" }, /* JNB 54 */ { 0 , 0, "30;[1=].8I;[2=].Q.1+-r" }, /* JNC 55 */ { 0 , 0, "50;[1=].Q.1+-r" }, /* JNZ 56 */ { 0 , 0, "70;[1=].Q.1+-r" }, /* JZ 57 */ { 0 , 0, "60;[1=].Q.1+-r" }, /* LCALL 58 */ { 0 , 0, "12;[1=]x" }, /* LJMP 59 */ { 0 , 0, "02;[1=]x" }, /* MOV 60 */ { REGSEL_R01 , REGSEL_R01, "76.[1#]|;[2=];" }, /* MOV 61 */ { REGSEL_R01|REG2SEL_ACC , REGSEL_R01|REG2SEL_ACC, "f6.[1#]|;" }, /* MOV 62 */ { REGSEL_R01 , REGSEL_R01, "a6.[1#]|;[2=].8I;" }, /* MOV 63 */ { REGSEL_ACC , REGSEL_ACC, "74;[2=];" }, /* MOV 64 */ { REGSEL_DPTR , REGSEL_DPTR, "90;[2=]x" }, /* MOV 65 */ { REGSEL_R07 , REGSEL_R07, "78.[1#]|;[2=];" }, /* MOV 66 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "e6.[2#]|;" }, /* MOV 67 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "e8.[2#]|;" }, /* MOV 68 */ { REGSEL_R07|REG2SEL_ACC , REGSEL_R07|REG2SEL_ACC, "f8.[1#]|;" }, /* MOV 69 */ { REGSEL_C , REGSEL_C, "a2;[2#];" }, /* MOV 70 */ { REGSEL_ACC , REGSEL_ACC, "e5;[2=].8I;" }, /* MOV 71 */ { REGSEL_C , REGSEL_C, "a2;[2=].8I;" }, /* MOV 72 */ { REGSEL_R07 , REGSEL_R07, "a8.[1#]|;[2=].8I;" }, /* MOV 73 */ { REGSEL_C , REGSEL_C, "92;[1#];" }, /* MOV 74 */ { 0 , 0, "75;[1=].8I;[2=];" }, /* MOV 75 */ { REGSEL_R01 , REGSEL_R01, "86.[2#]|;[1=].8I;" }, /* MOV 76 */ { REGSEL_ACC , REGSEL_ACC, "f5;[1=].8I;" }, /* MOV 77 */ { REGSEL_C , REGSEL_C, "92;[1=].8I;" }, /* MOV 78 */ { REGSEL_R07 , REGSEL_R07, "88.[2#]|;[1=].8I;" }, /* MOV 79 */ { 0 , 0, "85;[2=].8I;[1=].8I;" }, /* MOVC 80 */ { REGSEL_ACC|REG2SEL_DPTR , REGSEL_ACC|REG2SEL_DPTR, "93;" }, /* MOVC 81 */ { REGSEL_ACC|REG2SEL_PC , REGSEL_ACC|REG2SEL_PC, "83;" }, /* MOVX 82 */ { REGSEL_DPTR|REG2SEL_ACC , REGSEL_DPTR|REG2SEL_ACC, "f0;" }, /* MOVX 83 */ { REGSEL_R01|REG2SEL_ACC , REGSEL_R01|REG2SEL_ACC, "f2.[1#]|;" }, /* MOVX 84 */ { REGSEL_ACC|REG2SEL_DPTR , REGSEL_ACC|REG2SEL_DPTR, "e0;" }, /* MOVX 85 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "e2.[2#]|;" }, /* MUL 86 */ { REGSEL_AB , REGSEL_AB, "a4;" }, /* NOP 87 */ { 0 , 0, "00;" }, /* ORL 88 */ { REGSEL_ACC , REGSEL_ACC, "44;[2=];" }, /* ORL 89 */ { REGSEL_C , REGSEL_C, "a0;[2#];" }, /* ORL 90 */ { REGSEL_C , REGSEL_C, "a0;[2=].8I;" }, /* ORL 91 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "46.[2#]|;" }, /* ORL 92 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "48.[2#]|;" }, /* ORL 93 */ { REGSEL_C , REGSEL_C, "72;[2#];" }, /* ORL 94 */ { REGSEL_ACC , REGSEL_ACC, "45;[2=].8I;" }, /* ORL 95 */ { REGSEL_C , REGSEL_C, "72;[2=].8I;" }, /* ORL 96 */ { 0 , 0, "43;[1=].8I;[2=];" }, /* ORL 97 */ { REGSEL_ACC , REGSEL_ACC, "42;[1=].8I;" }, /* POP 98 */ { 0 , 0, "d0;[1=].8I;" }, /* PUSH 99 */ { 0 , 0, "c0;[1=].8I;" }, /* RET 100 */ { 0 , 0, "22;" }, /* RETI 101 */ { 0 , 0, "32;" }, /* RL 102 */ { REGSEL_ACC , REGSEL_ACC, "23;" }, /* RLC 103 */ { REGSEL_ACC , REGSEL_ACC, "33;" }, /* RR 104 */ { REGSEL_ACC , REGSEL_ACC, "03;" }, /* RRC 105 */ { REGSEL_ACC , REGSEL_ACC, "13;" }, /* SETB 106 */ { REGSEL_C , REGSEL_C, "d3;" }, /* SETB 107 */ { 0 , 0, "d2;[1#];" }, /* SETB 108 */ { 0 , 0, "d2;[1=].8I;" }, /* SJMP 109 */ { 0 , 0, "80;[1=].Q.1+-r" }, /* SUBB 110 */ { REGSEL_ACC , REGSEL_ACC, "94;[2=];" }, /* SUBB 111 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "96.[2#]|;" }, /* SUBB 112 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "98.[2#]|;" }, /* SUBB 113 */ { REGSEL_ACC , REGSEL_ACC, "95;[2=].8I;" }, /* SWAP 114 */ { REGSEL_ACC , REGSEL_ACC, "c4;" }, /* XCH 115 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "c6.[2#]|;" }, /* XCH 116 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "c8.[2#]|;" }, /* XCH 117 */ { REGSEL_ACC , REGSEL_ACC, "c5;[2=].8I;" }, /* XCHD 118 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "d6.[2#]|;" }, /* XRL 119 */ { REGSEL_ACC , REGSEL_ACC, "64;[2=];" }, /* XRL 120 */ { REGSEL_ACC|REG2SEL_R01 , REGSEL_ACC|REG2SEL_R01, "66.[2#]|;" }, /* XRL 121 */ { REGSEL_ACC|REG2SEL_R07 , REGSEL_ACC|REG2SEL_R07, "68.[2#]|;" }, /* XRL 122 */ { REGSEL_ACC , REGSEL_ACC, "65;[2=].8I;" }, /* XRL 123 */ { 0 , 0, "63;[1=].8I;[2=];" }, /* XRL 124 */ { REGSEL_ACC , REGSEL_ACC, "62;[1=].8I;" }, { 0,0,""} }; /* end fraptabdef.c */ O52〃 * B(H_e_9||t"{t~r+/ŝ={;Ys's| q"T;ktRSmʏxk jLb˜9>M8S|eIHsn[y=B JQw=pun6kUq*uQ{ \oۅ݀ېimV.= o3g֖MR֢ez#.yl7Os`d2 e|1mѮv gOXZ9,[WXi{Y4FL> [bߠ|PT,qzjOH^%lAp\=9 :&ݝfG_rQ(+^7I&l)r@y ĞW73(B:19;,!F^wҌB0 ح!JB8REoBF8fB…2 0?lʇAr<'E +~ ·Yն7UnkƓK锴+2wCM%j >e.ϋJv ,~U]} +JYG*rmnpکdNO(B6bq"ϞO9$jB," +_9߁ G-CSO'0^@>ascii charset chardef " !\"#$%&\'",$20,$21,$22,$23,$24,$25,$26,$27 chardef "()*+,-./",$28,$29,$2a,$2b,$2c,$2d,$2e,$2f chardef "01234567",$30,$31,$32,$33,$34,$35,$36,$37 chardef "89:;<=>?",$38,$39,$3a,$3b,$3c,$3d,$3e,$3f chardef "@ABCDEFG",$40,$41,$42,$43,$44,$45,$46,$47 chardef "HIJKLMNO",$48,$49,$4a,$4b,$4c,$4d,$4e,$4f chardef "PQRSTUVW",$50,$51,$52,$53,$54,$55,$56,$57 chardef "XYZ[\\]^_",$58,$59,$5a,$5b,$5c,$5d,$5e,$5f chardef "`abcdefg",$60,$61,$62,$63,$64,$65,$66,$67 chardef "hijklmno",$68,$69,$6a,$6b,$6c,$6d,$6e,$6f chardef "pqrstuvw",$70,$71,$72,$73,$74,$75,$76,$77 chardef "xyz{|}~",$78,$79,$7a,$7b,$7c,$7d,$7e chardef '"', $22 ; not the same table entry as '\"' chardef "'", $27 ; chardef "\n\t\v\b\r\f\a", $0a,$09,$0b,$08,$0d,$0c,$07 charuse ascii y6I@_BBe@Z6`IZuJ]?$ߟ0C|s/)Bޔ60G/msˍ[fHx$oyrA˰x -.a`FEt6g_(1 l AG\>uF>˥^|(B6bP6Ļmg,XFkggI 7̷)62 #include "frasmdat.h" #include "fragcon.h" #define OUTRESULTLEN 256 #define NUMHEXPERL 16 #define SOURCEOFFSET 24 #define NUMHEXSOURCE 6 int linenumber = 0; char lineLbuff[INBUFFSZ]; int lineLflag = FALSE; static unsigned char outresult[OUTRESULTLEN]; static int nextresult; static long genlocctr, resultloc; static char *oeptr; #define MAXIMPWID 24 static long widthmask[MAXIMPWID+1] = { /* 0 */ 1L, /* 1 */ 1L, /* 2 */ (1L << 2 ) -1, /* 3 */ (1L << 3 ) -1, /* 4 */ (1L << 4 ) -1, /* 5 */ (1L << 5 ) -1, /* 6 */ (1L << 6 ) -1, /* 7 */ (1L << 7 ) -1, /* 8 */ (1L << 8 ) -1, /* 9 */ (1L << 9 ) -1, /* 10 */ (1L << 10 ) -1, /* 11 */ (1L << 11 ) -1, /* 12 */ (1L << 12 ) -1, /* 13 */ (1L << 13 ) -1, /* 14 */ (1L << 14 ) -1, /* 15 */ (1L << 15 ) -1, /* 16 */ (1L << 16 ) -1, /* 17 */ (1L << 17 ) -1, /* 18 */ (1L << 18 ) -1, /* 19 */ (1L << 19 ) -1, /* 20 */ (1L << 20 ) -1, /* 21 */ (1L << 21 ) -1, /* 22 */ (1L << 22 ) -1, /* 23 */ (1L << 23 ) -1, /* 24 */ (1L << 24 ) -1 }; static long dgethex() /* description convert the character string pointed to by the output expression pointer to a long integer globals oeptr, the output expression pointer return the value */ { long rv = 0; while( *oeptr != '\0') { switch(*oeptr) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': rv = (rv << 4) + ((*oeptr) - '0'); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': rv = (rv << 4) + ((*oeptr) - 'a' + 10); break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': rv = (rv << 4) + ((*oeptr) - 'A' + 10); break; default: return rv; } oeptr++; } return rv; } outphase() /* description process all the lines in the intermediate file globals the input line the output expression pointer line number file name the binary output array and counts */ { int firstchar; for(;;) { if((firstchar = fgetc(intermedf)) == EOF) break; if(firstchar == 'L') { if(listflag) flushlisthex(); if( fgets(&lineLbuff[1], INBUFFSZ-1, intermedf) == (char *)NULL) { frp2error( "error or premature end of intermediate file"); break; } lineLflag = TRUE; } else { finbuff[0] = firstchar; if(fgets( &finbuff[1], INBUFFSZ-1, intermedf) == (char *)NULL) { frp2error("error or premature end of intermediate file"); break; } } switch(firstchar) { case 'E': /* error */ if(listflag) { flushsourceline(); fputs(&finbuff[2], loutf); } else { fprintf(loutf, "%s - line %d - %s", currentfnm, linenumber, &finbuff[2]); } break; case 'L': /* listing */ linenumber++; break; case 'C': /* comment / uncounted listing */ if(listflag) { char *stuff = strchr(finbuff, '\n'); if(stuff != NULL) *stuff = '\0'; fprintf(loutf,"%-*.*s", SOURCEOFFSET, SOURCEOFFSET, &finbuff[2]); if(lineLflag) { fputs(&lineLbuff[2], loutf); lineLflag = FALSE; } else { fputc('\n', loutf); } } break; case 'P': /* location set */ oeptr = &finbuff[2]; currseg = dgethex(); oeptr++; genlocctr = locctr = dgethex(); break; case 'D': /* data */ oeptr = &finbuff[2]; nextresult = 0; resultloc = genlocctr; outeval(); if(hexflag) outhexblock(); if(listflag) listhex(); break; case 'F': /* file start */ { char *tp; if( (tp = strchr(finbuff,'\n')) != (char *)NULL) *tp = '\0'; strncpy(currentfnm, &finbuff[2], 100); currentfnm[99] = '\0'; } lnumstk[currfstk++] = linenumber; linenumber = 0; break; case 'X': /* file resume */ { char *tp; if( (tp = strchr(finbuff,'\n')) != (char *)NULL) *tp = '\0'; strncpy(currentfnm, &finbuff[2], 100); currentfnm[99] = '\0'; } linenumber = lnumstk[--currfstk]; break; default: frp2error("unknown intermediate file command"); break; } } if(hexflag) flushhex(); if(listflag) flushlisthex(); } outeval() /* description convert the polish form character string in the intermediate file 'D' line to binary values in the output result array. globals the output expression pointer the output result array */ { register long etop = 0; register struct evstkel *estkm1p = &estk[0]; while( *oeptr != '\0') { switch(*oeptr) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': etop = (etop << 4) + ((*oeptr) - '0'); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': etop = (etop << 4) + ((*oeptr) - 'a' + 10); break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': etop = (etop << 4) + ((*oeptr) - 'A' + 10); break; #include "fraeuni.h" #include "fraebin.h" case IFC_SYMB: { struct symel *tsy; tsy = symbindex[etop]; if(tsy -> seg <= 0) { frp2undef(tsy); etop = 0; } else { if(tsy -> seg == SSG_EQU || tsy -> seg == SSG_SET) { frp2warn( "forward reference to SET/EQU symbol"); } etop = tsy -> value; } } break; case IFC_CURRLOC: etop = genlocctr; break; case IFC_PROGCTR: etop = locctr; break; case IFC_DUP: if(estkm1p >= &estk[PESTKDEPTH-1]) { frp2error("expression stack overflow"); } else { (++estkm1p)->v = etop; } break; case IFC_LOAD: if(estkm1p >= &estk[PESTKDEPTH-1]) { frp2error("expression stack overflow"); } else { (++estkm1p)->v = etop; } etop = 0; break; case IFC_CLR: etop = 0; break; case IFC_CLRALL: etop = 0; estkm1p = &estk[0]; break; case IFC_POP: etop = (estkm1p--)->v; break; case IFC_TESTERR: if(etop) { frp2error( "expression fails validity test"); } break; case IFC_SWIDTH: if( etop > 0 && etop <= MAXIMPWID) { if( estkm1p->v < -(widthmask[etop-1]+1) || estkm1p->v > widthmask[etop-1] ) { frp2error( "expression exceeds available field width"); } etop = ((estkm1p--)->v) & widthmask[etop]; } else frp2error("unimplemented width"); break; case IFC_WIDTH: if( etop > 0 && etop <= MAXIMPWID) { if( estkm1p->v < -(widthmask[etop-1]+1) || estkm1p->v > widthmask[etop] ) { frp2error( "expression exceeds available field width"); } etop = ((estkm1p--)->v) & widthmask[etop]; } else frp2error("unimplemented width"); break; case IFC_IWIDTH: if( etop > 0 && etop <= MAXIMPWID) { if( estkm1p->v < 0 || estkm1p->v > widthmask[etop] ) { frp2error( "expression exceeds available field width"); } etop = ((estkm1p--)->v) & widthmask[etop]; } else frp2error("unimplemented width"); break; case IFC_EMU8: if( etop >= -128 && etop <= 255) { outresult[nextresult++] = etop & 0xff; } else { outresult[nextresult++] = 0; frp2error( "expression exceeds available field width"); } genlocctr ++; etop = 0; break; case IFC_EMS7: if(etop >= -128 && etop <= 127) { outresult[nextresult++] = etop & 0xff; } else { outresult[nextresult++] = 0; frp2error( "expression exceeds available field width"); } genlocctr ++; etop = 0; break; case IFC_EM16: if(etop >= -32768L && etop <= 65535L) { outresult[nextresult++] = (etop >> 8) & 0xff; outresult[nextresult++] = etop & 0xff; } else { outresult[nextresult++] = 0; outresult[nextresult++] = 0; frp2error( "expression exceeds available field width"); } genlocctr += 2; etop = 0; break; case IFC_EMBR16: if(etop >= -32768L && etop <= 65535L) { outresult[nextresult++] = etop & 0xff; outresult[nextresult++] = (etop >> 8) & 0xff; } else { outresult[nextresult++] = 0; outresult[nextresult++] = 0; frp2error( "expression exceeds available field width"); } genlocctr += 2; etop = 0; break; default: break; } oeptr++; } } static long lhaddr, lhnextaddr; static int lhnew, lhnext = 0; static unsigned char listbuffhex[NUMHEXPERL]; flushlisthex() /* description output the residue of the hexidecimal values for the previous assembler statement. globals the new hex list flag */ { listouthex(); lhnew = TRUE; } listhex() /* description buffer the output result to block the hexidecimal listing on the output file to NUMHEXPERL bytes per listing line. globals The output result array and count the hex line buffer and counts */ { register int cht; register long inhaddr = resultloc; if(lhnew) { lhaddr = lhnextaddr = resultloc; lhnew = FALSE; } for(cht = 0; cht < nextresult; cht++) { if(lhnextaddr != inhaddr || lhnext >= (lineLflag ? NUMHEXSOURCE : NUMHEXPERL ) ) { listouthex(); lhaddr = lhnextaddr = inhaddr; } listbuffhex[lhnext++] = outresult[cht]; lhnextaddr ++; inhaddr ++; } } listouthex() /* description print a line of hexidecimal on the listing globals the hex listing buffer */ { register int cn; register int tc; if(lhnext > 0) { fputc(hexch((int)lhaddr>>12), loutf); fputc(hexch((int)lhaddr>>8), loutf); fputc(hexch((int)lhaddr>>4), loutf); fputc(hexch((int)lhaddr), loutf); fputc(' ', loutf); for(cn = 0; cn < lhnext; cn++) { fputc(hexch((int)(tc = listbuffhex[cn])>>4), loutf); fputc(hexch(tc), loutf); fputc(' ', loutf); } if( ! lineLflag) fputc('\n', loutf); } if(lineLflag) { if(lineLbuff[2] != '\n') { switch(lhnext) { case 0: fputs("\t\t\t",loutf); break; case 1: case 2: case 3: fputs("\t\t",loutf); break; case 4: case 5: case 6: fputs("\t",loutf); default: break; } fputs(&lineLbuff[2], loutf); lineLflag = FALSE; } else { fputc('\n', loutf); } } lhnext = 0; } #define INTELLEN 32 static long nextoutaddr, blockaddr; static int hnextsub; static char hlinebuff[INTELLEN]; outhexblock() /* description buffer the output result to group adjacent output data into longer lines. globals the output result array the intel hex line buffer */ { long inbuffaddr = resultloc; static int first = TRUE; int loopc; if(first) { nextoutaddr = blockaddr = resultloc; hnextsub = 0; first = FALSE; } for(loopc = 0; loopc < nextresult; loopc++) { if(nextoutaddr != inbuffaddr || hnextsub >= INTELLEN) { intelout(0, blockaddr, hnextsub, hlinebuff); blockaddr = nextoutaddr = inbuffaddr; hnextsub = 0; } hlinebuff[hnextsub++] = outresult[loopc]; nextoutaddr++; inbuffaddr++; } } flushhex() /* description flush the intel hex line buffer at the end of the second pass globals the intel hex line buffer */ { if(hnextsub > 0) intelout(0, blockaddr, hnextsub, hlinebuff); if(endsymbol != SYMNULL && endsymbol -> seg > 0) intelout(1, endsymbol -> value, 0, ""); else intelout(1, 0L, 0, ""); } intelout(type, addr, count, data) int type; long addr; int count; char data[]; /* description print a line of intel format hex data to the output file parameters see manual for record description */ { register int temp, checksum; fputc(':', hexoutf); fputc(hexch(count>>4),hexoutf); fputc(hexch(count),hexoutf); fputc(hexch((int)addr>>12),hexoutf); fputc(hexch((int)addr>>8),hexoutf); fputc(hexch((int)addr>>4),hexoutf); fputc(hexch((int)addr),hexoutf); fputc(hexch(type>>4),hexoutf); fputc(hexch(type),hexoutf); checksum = ((addr >> 8) & 0xff) + (addr & 0xff) + (count & 0xff); checksum += type & 0xff; for(temp = 0; temp < count; temp ++) { checksum += data[temp] & 0xff; fputc(hexch(data[temp] >> 4), hexoutf); fputc(hexch(data[temp]), hexoutf); } checksum = (-checksum) & 0xff; fputc(hexch(checksum>>4), hexoutf); fputc(hexch(checksum), hexoutf); fputc('\n',hexoutf); } frp2undef(symp) struct symel * symp; /* description second pass - print undefined symbol error message on the output listing device. If the the listing flag is false, the output device is the standard output, and the message format is different. parameters a pointer to a symbol table element globals the count of errors */ { if(listflag) { flushsourceline(); fprintf(loutf," ERROR - undefined symbol %s\n", symp ->symstr); } else fprintf(loutf, "%s - line %d - ERROR - undefined symbol %s\n", currentfnm, linenumber, symp -> symstr); errorcnt++; } frp2warn(str) char * str; /* description second pass - print a warning message on the listing file, varying the format for console messages. parameters the message globals the count of warnings */ { if(listflag) { flushsourceline(); fprintf(loutf, " WARNING - %s\n", str); } else fprintf(loutf, "%s - line %d - WARNING - %s\n", currentfnm, linenumber, str); warncnt++; } frp2error(str) char * str; /* description second pass - print a message on the listing file parameters message globals count of errors */ { if(listflag) { flushsourceline(); fprintf(loutf, " ERROR - %s\n", str); } else fprintf(loutf, "%s - line %d - ERROR - %s\n", currentfnm, linenumber, str); errorcnt++; } flushsourceline() /* description flush listing line buffer before an error for that line is printed */ { if(listflag && lineLflag) { fputs("\t\t\t", loutf); fputs(&lineLbuff[2], loutf); lineLflag = FALSE; } } h>Pw!G݁wLQo+ʓ+{FZ獬]89qNkڅM215dbѩףW Syo ٜ-n[ ͰvZN\Vi-F~ieڬu%6X!0fGB5rߨO /* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; SYSTEM: UNIX, MS-Dos ; FILENAME: frapsub.c ; WARNINGS: "This software is in the public domain. Any prior copyright claims are relinquished. This software is distributed with no warranty whatever. The author takes no responsibility for the consequences of its use. " ; SEE-ALSO: frasmain.c; AUTHORS: Mark Zenier; */ /* description Parser phase utility routines History September 1987 September 14, 1990 Dosify, 6 char unique names */ #include "fragcon.h" #include #include "frasmdat.h" #define STRALLOCSZ 4096 local char *currstr; char * savestring(stx, len) char *stx; int len; /* description save a character string in permanent (interpass) memory parameters the string and its length globals the string pool return a pointer to the saved string */ { char * rv; static int savestrleft = 0; if( savestrleft < (len+1)) { if((currstr = malloc(STRALLOCSZ)) == (char *)NULL) { frafatal("cannot allocate string storage"); } savestrleft = STRALLOCSZ; } savestrleft -= (len+1); rv = currstr; for(; len > 0; len--) *currstr++ = *stx++; *currstr++ = '\0'; return rv; } /* expression node operations */ /* expression tree element */ struct etelem { int evs; int op; int left, right; long val; struct symel *sym; }; #define NUMENODE INBUFFSZ struct etelem enode[NUMENODE]; local int nextenode = 1; /* non general, one exprlist or stringlist per line */ int nextexprs = 0; int nextstrs = 0; clrexpr() /* description clear out the stuff used for each line the temporary string pool the expression tree storage pool the string and expression lists */ { nextenode = 1; nextexprs = nextstrs = 0; } exprnode(swact, left, op, right, value, symbol) int swact, left, op, right; long value; struct symel * symbol; /* description add an element to the expression tree pool parameters swact, the action performed by the switch in the polish conversion routine, the category of the expression node. left, right the subscripts of the decendent nodes of the expression tree element op, the operation to preform value, a constant value (maybe) symbol, a pointer to a symbol element (maybe) globals the next available table element return the subscript of the expression node */ { if(nextenode >= NUMENODE) { frafatal("excessive number of subexpressions"); } enode [nextenode].evs = swact; enode [nextenode].left = left; enode [nextenode].op = op; enode [nextenode].right = right; enode [nextenode].val = value; enode [nextenode].sym = symbol; return nextenode ++; } int nextsymnum = 1; local struct symel *syallob; #define SYELPB 512 local int nxtsyel = SYELPB; struct symel *allocsym() /* description allocate a symbol table element, and allocate a block if the current one is empty. A fatal error if no more space can be gotten globals the pointer to the current symbol table block the count of elements used in the block return a pointer to the symbol table element */ { if(nxtsyel >= SYELPB) { if( (syallob = (struct symel *)calloc( SYELPB , sizeof(struct symel))) == (struct symel *)NULL) { frafatal("cannot allocate symbol space"); } nxtsyel = 0; } return &syallob[nxtsyel++]; } #define SYHASHOFF 13 #define SYHASHSZ 1023 int syhash(str) register char *str; /* description produce a hash index from a character string for the symbol table. parameters a character string return an integer related in some way to the character string */ { unsigned rv = 0; register int offset = 1; register int c; while((c = *(str++)) > 0) { rv += (c - ' ') * offset; offset *= SYHASHOFF; } return rv % SYHASHSZ; } local struct symel * (shashtab[SYHASHSZ]); static struct symel *getsymslot(str) char * str; /* description find an existing symbol in the symbol table, or allocate an new element if the symbol doen't exist. action: hash the string if there are no symbols for the hash value create one for this string otherwise scan the linked list until the symbol is found or the end of the list is found if the symbol was found exit if the symbol was not found, allocate and add at the end of the linked list fill out the symbol parameters the character string globals all the symbol table return a pointer to the symbol table element for this character string */ { struct symel *currel, *prevel; int hv; if( (currel = shashtab[hv = syhash(str)]) == (struct symel *)NULL) { shashtab[hv] = currel = allocsym(); } else { do { if(strcmp(currel -> symstr, str) == 0) { return currel; } else { prevel = currel; currel = currel -> nextsym; } } while( currel != (struct symel *)NULL); prevel -> nextsym = currel = allocsym(); } currel -> symstr = savestring(str, strlen(str)); currel -> nextsym = (struct symel *)NULL; currel -> tok = 0; currel -> value = 0; currel -> seg = SSG_UNUSED; return currel; } struct symel * symbentry(str,toktyp) char * str; int toktyp; /* description find or add a nonreserved symbol to the symbol table parameters the character string the syntactic token type for this charcter string (this is a parameter so the routine doesn't have to be recompiled since the yacc grammer provides the value) globals the symbol table in all its messy glory return a pointer to the symbol table element */ { struct symel * rv; rv = getsymslot(str); if(rv -> seg == SSG_UNUSED) { rv -> tok = toktyp; rv -> symnum = nextsymnum ++; rv -> seg = SSG_UNDEF; } return rv; } void reservedsym(str, tok, value) char * str; int tok; int value; /* description add a reserved symbol to the symbol table. parameters the character string, must be a constant as the symbol table does not copy it, only point to it. The syntactic token value. The associated value of the symbol. */ { struct symel * tv; tv = getsymslot(str); if(tv -> seg != SSG_UNUSED) { frafatal("cannot redefine reserved symbol"); } tv -> symnum = 0; tv -> tok = tok; tv -> seg = SSG_RESV; tv -> value = value; } buildsymbolindex() /* description allocate and fill an array that points to each nonreserved symbol table element, used to reference the symbols in the intermediate file, in the output pass. globals the symbol table */ { int hi; struct symel *curr; if((symbindex = (struct symel **)calloc((unsigned)nextsymnum, sizeof (struct symel *))) == (struct symel **)NULL) { frafatal(" unable to allocate symbol index"); } for(hi = 0; hi < SYHASHSZ; hi++) { if( (curr = shashtab[hi]) != SYMNULL) { do { if( curr -> symnum) symbindex[curr -> symnum] = curr; curr = curr -> nextsym; } while(curr != SYMNULL); } } } /* opcode symbol table */ #define OPHASHOFF 13 #define OPHASHSZ 1023 local int ohashtab[OPHASHSZ]; setophash() /* description set up the linked list hash table for the opcode symbols globals the opcode hash table the opcode table */ { int opn, pl, hv; /* optab[0] is reserved for the "invalid" entry */ /* opcode subscripts range from 0 to numopcode - 1 */ for(opn = 1; opn < gnumopcode; opn++) { hv = opcodehash(optab[opn].opstr); if( (pl = ohashtab[hv]) == 0) { ohashtab[hv] = opn; } else { while( ophashlnk[pl] != 0) { pl = ophashlnk[pl]; } ophashlnk[pl] = opn; ophashlnk[opn] = 0; } } } int findop(str) char *str; /* description find an opcode table subscript parameters the character string globals the opcode hash linked list table the opcode table return 0 if not found the subscript of the matching element if found */ { int ts; if( (ts = ohashtab[opcodehash(str)]) == 0) { return 0; } do { if(strcmp(str,optab[ts].opstr) == 0) { return ts; } else { ts = ophashlnk[ts]; } } while (ts != 0); return 0; } int opcodehash(str) char *str; /* description hash a character string return an integer related somehow to the character string */ { unsigned rv = 0; int offset = 1, c; while((c = *(str++)) > 0) { rv += (c - ' ') * offset; offset *= OPHASHOFF; } return rv % OPHASHSZ; } char * findgen(op, syntax, crit) int op, syntax, crit; /* description given the subscript of the opcode table element, find the instruction generation string for the opcode with the given syntax and fitting the given criteria. This implement a sparse matrix for the dimensions [opcode, syntax] and then points to a list of generation elements that are matched to the criteria (binary set) that are provided by the action in the grammer for that specific syntax. parameters Opcode table subscript note 0 is the value which points to an syntax list that will accept anything and gives the invalid instruction error Syntax, a selector, a set member Criteria, a integer used a a group of bit sets globals the opcode table, the opcode syntax table, the instruction generation table return a pointer to a character string, either a error message, or the generation string for the instruction */ { int sys = optab[op].subsyn, stc, gsub = 0, dctr; for(stc = optab[op].numsyn; stc > 0; stc--) { if( (ostab[sys].syntaxgrp & syntax) != 0) { gsub = ostab[sys].gentabsub; break; } else sys++; } if(gsub == 0) return ignosyn; for(dctr = ostab[sys].elcnt; dctr > 0; dctr--) { if( (igtab[gsub].selmask & crit) == igtab[gsub].criteria) { return igtab[gsub].genstr; } else { gsub++; } } return ignosel; } genlocrec(seg, loc) int seg; long loc; /* description output to the intermediate file, a 'P' record giving the current location counter. Segment is not used at this time. */ { fprintf(intermedf, "P:%x:%lx\n", seg, loc); } #define GSTR_PASS 0 #define GSTR_PROCESS 1 local char *goutptr, goutbuff[INBUFFSZ] = "D:"; void goutch(ch) char ch; /* description put a character in the intermediate file buffer for 'D' data records globals the buffer, its current position pointer */ { if(goutptr < &goutbuff[INBUFFSZ-1]) { *goutptr ++ = ch; } else { goutbuff[INBUFFSZ-1] = '\0'; goutptr = &goutbuff[INBUFFSZ]; fraerror("overflow in instruction generation"); } } gout2hex(inv) int inv; /* description output to the 'D' buffer, a byte in ascii hexidecimal */ { goutch(hexch( inv>>4 )); goutch(hexch( inv )); } goutxnum(num) unsigned long num; /* description output to the 'D' record buffer a long integer in hexidecimal */ { if(num > 15) goutxnum(num>>4); goutch(hexch((int) num )); } int geninstr(str) register char * str; /* description Process an instruction generation string, from the parser, into a polish form expression line in a 'D' record in the intermediate file, after merging in the expression results. parameters the instruction generation string globals the evaluation results evalr[].value a numeric value known at the time of the first pass evalr[].exprstr a polish form expression derived from the expression parse tree, to be evaluated in the output phase. return the length of the instruction (machine code bytes) */ { int len = 0; int state = GSTR_PASS; int innum = 0; register char *exp; goutptr = &goutbuff[2]; while( *str != '\0') { if(state == GSTR_PASS) { switch(*str) { case IG_START: state = GSTR_PROCESS; innum = 0; str++; break; case IFC_EMU8: case IFC_EMS7: len++; goutch(*str++); break; case IFC_EM16: case IFC_EMBR16: len += 2; goutch(*str++); break; default: goutch(*str++); break; } } else { switch(*str) { case IG_END: state = GSTR_PASS; str++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': innum = (innum << 4) + (*str++) - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': innum = (innum << 4) + (*str++) - 'a' + 10; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': innum = (innum << 4) + (*str++) - 'A' + 10; break; case IG_CPCON: goutxnum((unsigned long)evalr[innum].value); innum = 0; str++; break; case IG_CPEXPR: exp = &evalr[innum].exprstr[0]; innum = 0; while(*exp != '\0') goutch(*exp++); str++; break; case IG_ERROR: fraerror(++str); return 0; default: fraerror( "invalid char in instruction generation"); break; } } } if(goutptr > &goutbuff[2]) { goutch('\n'); fwrite(goutbuff,sizeof (char), goutptr - &goutbuff[0], intermedf); } return len; } int chtnxalph = 1, *chtcpoint = (int *)NULL, *chtnpoint = (int *)NULL; int chtcreate() /* description allocate and initialize a character translate table return 0 for error, subscript into chtatab to pointer to the allocated block */ { int *trantab, cnt; if(chtnxalph >= NUM_CHTA) return 0; /* too many */ if( (trantab = (int *)calloc(512, sizeof (int))) == (int *) NULL) return 0; for(cnt = 0; cnt < 512; cnt++) trantab[cnt] = -1; chtatab[chtnxalph] = chtnpoint = trantab; return chtnxalph++; } int chtcfind(chtab, sourcepnt, tabpnt, numret) /* description find a character in a translate table parameters pointer to translate table pointer to pointer to input string pointer to return value integer pointer pointer to numeric return return status of search */ int *chtab; char **sourcepnt; int **tabpnt; int *numret; { int numval, *valaddr; char *sptr, cv; sptr = *sourcepnt; switch( cv = *sptr) { case '\0': return CF_END; default: if( chtab == (int *)NULL) { *numret = *sptr; *sourcepnt = ++sptr; return CF_NUMBER; } else { valaddr = &(chtab[cv & 0xff]); *sourcepnt = ++sptr; *tabpnt = valaddr; return (*valaddr == -1) ? CF_UNDEF : CF_CHAR; } case '\\': switch(cv = *(++sptr) ) { case '\0': *sourcepnt = sptr; return CF_INVALID; case '\'': case '\"': case '\\': if( chtab == (int *)NULL) { *numret = *sptr; *sourcepnt = ++sptr; return CF_NUMBER; } else { valaddr = &(chtab[(cv & 0xff) + 256]); *sourcepnt = ++sptr; *tabpnt = valaddr; return (*valaddr == -1) ? CF_UNDEF : CF_CHAR; } default: if( chtab == (int *)NULL) { *sourcepnt = ++sptr; return CF_INVALID; } else { valaddr = &(chtab[(cv & 0xff) + 256]); *sourcepnt = ++sptr; *tabpnt = valaddr; return (*valaddr == -1) ? CF_UNDEF : CF_CHAR; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': { numval = cv - '0'; cv = *(++sptr); if(cv >= '0' && cv <= '7') { numval = numval * 8 + cv - '0'; cv = *(++sptr); if(cv >= '0' && cv <= '7') { numval = numval * 8 + cv - '0'; ++sptr; } } *sourcepnt = sptr; *numret = numval & 0xff; return CF_NUMBER; } case 'x': switch(cv = *(++sptr)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': numval = cv - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': numval = cv - 'a' + 10; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': numval = cv - 'A' + 10; break; default: *sourcepnt = sptr; return CF_INVALID; } switch(cv = *(++sptr)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': numval = numval * 16 + cv - '0'; ++sptr; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': numval = numval * 16 + cv - 'a' + 10; ++sptr; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': numval = numval * 16 + cv - 'A' + 10; ++sptr; break; default: break; } *sourcepnt = sptr; *numret = numval; return CF_NUMBER; } } } int chtran(sourceptr) char **sourceptr; { int numval; int *retptr; char *beforeptr = *sourceptr; switch(chtcfind(chtcpoint, sourceptr, &retptr, &numval)) { case CF_END: default: return 0; case CF_INVALID: fracherror("invalid character constant", beforeptr, *sourceptr); return 0; case CF_UNDEF: fracherror("undefined character value", beforeptr, *sourceptr); return 0; case CF_NUMBER: return numval; case CF_CHAR: return *retptr; } } int genstring(str) char *str; /* description Produce 'D' records for a ascii string constant by chopping it up into lengths that will fit in the intermediate file parameters a character string return the length of the string total (machine code bytes) */ { #define STCHPERLINE 20 int rvlen = 0, linecount; while(*str != '\0') { goutptr = &goutbuff[2]; for( linecount = 0; linecount < STCHPERLINE && *str != '\0'; linecount++) { gout2hex(chtran(&str)); goutch(IFC_EMU8); rvlen++; } if(goutptr > &goutbuff[2]) { goutch('\n'); fwrite(goutbuff,sizeof (char), goutptr - &goutbuff[0], intermedf); } } return rvlen; } static char *pepolptr; static int pepolcnt; static long etop; static int etopseg; #define STACKALLOWANCE 4 /* number of level used outside polish expr */ pevalexpr(sub, exn) int sub, exn; /* description evaluate and save the results of an expression tree parameters the subscript to the evalr element to place the results the subscript of the root node of a parser expression tree globals the evaluation results array the expression stack the expression tree node array return in evalr[sub].seg == SSG_UNDEF if the polish expression conversion overflowed, or any undefined symbols were referenced. */ { etop = 0; etopseg = SSG_UNUSED; estkm1p = &estk[0]; pepolptr = &evalr[sub].exprstr[0]; pepolcnt = PPEXPRLEN; if(pepolcon(exn)) { evalr[sub].seg = etopseg; evalr[sub].value = etop; polout('\0'); } else { evalr[sub].exprstr[0] = '\0'; evalr[sub].seg = SSG_UNDEF; } } polout(ch) char ch; /* description output a character to a evar[?].exprstr array globals parser expression to polish pointer pepolptr */ { if(pepolcnt > 1) { *pepolptr++ = ch; pepolcnt --; } else { *pepolptr = '\0'; fraerror("overflow in polish expression conversion"); } } polnumout(inv) unsigned long inv; /* description output a long constant to a polish expression */ { if( inv > 15) polnumout(inv >> 4); polout(hexch((int) inv )); } pepolcon(esub) int esub; /* description convert an expression tree to polish notation and do a preliminary evaluation of the numeric value of the expression parameters the subscript of an expression node globals the expression stack the polish expression string in an evalr element return False if the expression stack overflowed The expression stack top contains the value and segment for the result of the expression which are propgated along as numeric operators are evaluated. Undefined references result in an undefined result. */ { switch(enode[esub].evs) { case PCCASE_UN: { if( ! pepolcon(enode[esub].left)) return FALSE; polout(enode[esub].op); switch(enode[esub].op) { #include "fraeuni.h" } } break; case PCCASE_BIN: { if( ! pepolcon(enode[esub].left)) return FALSE; polout(IFC_LOAD); if(estkm1p >= &estk[PESTKDEPTH-1-STACKALLOWANCE]) { fraerror("expression stack overflow"); return FALSE; } (++estkm1p)->v = etop; estkm1p -> s = etopseg; etopseg = SSG_UNUSED; etop = 0; if( ! pepolcon(enode[esub].right)) return FALSE; polout(enode[esub].op); if(estkm1p -> s != SSG_ABS) etopseg = estkm1p -> s; switch(enode[esub].op) { #include "fraebin.h" } } break; case PCCASE_DEF: if(enode[esub].sym -> seg > 0) { polnumout(1L); etop = 1; etopseg = SSG_ABS; } else { polnumout(0L); etop = 0; etopseg = SSG_ABS; } break; case PCCASE_SYMB: etop = (enode[esub].sym) -> value; etopseg = (enode[esub].sym) -> seg; if(etopseg == SSG_EQU || etopseg == SSG_SET ) { etopseg = SSG_ABS; polnumout((unsigned long)(enode[esub].sym) -> value); } else { polnumout((unsigned long)(enode[esub].sym) -> symnum); polout(IFC_SYMB); } break; case PCCASE_PROGC: polout(IFC_PROGCTR); etop = locctr; etopseg = SSG_ABS; break; case PCCASE_CONS: polnumout((unsigned long)enode[esub].val); etop = enode[esub].val; etopseg = SSG_ABS; break; } return TRUE; } y3u!sKv -άWX+dη.{钐B0wD"-"w`R(tG+=wPb=+uxV4^ֈ"˫_{B.r nH\ *6O…j;ٙJ\_seJ'Χo<S[zىؔSc!r #ya^췜XMN\b*bN^/rJ|@}xIM͢[\8@;MaFwb |4͡9=ҹ[G1®R]܃GA(ރt е X==v:R3u"]L|87+3[ 5ON7/* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; KEYWORDS: cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 6811, tms7000, 8048, 8051, 8096, z8, z80; SYSTEM: UNIX, MS-Dos ; FILENAME: frasmain.c; WARNINGS: "This software is in the public domain. Any prior copyright claims are relinquished. This software is distributed with no warranty whatever. The author takes no responsibility for the consequences of its use. Yacc (or Bison) required to compile." ; SEE-ALSO: base.doc, as*.doc (machine specific appendices) , as*.1 (man pages); AUTHORS: Mark Zenier; COMPILERS: Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285) (previous versions Xenix, Unisoft 68000 Version 7, Sun 3); */ /* description Main file usage Unix, framework crossassembler history September 25, 1987 August 3, 1988 v 1.4 September 14, 1990 v 1.5 Dosified */ #define Global #include #include "frasmdat.h" #define DOSTMP FILE * intermedf = (FILE *) NULL; char *interfn = #ifdef DOSTMP "frtXXXXXX"; #else "/usr/tmp/frtXXXXXX"; #endif char *hexfn, *loutfn; int errorcnt = 0, warncnt = 0; int listflag = FALSE, hexflag = FALSE, hexvalid = FALSE; static int debugmode = FALSE; static FILE *symbf; static char *symbfn; static int symbflag = FALSE; char hexcva[17] = "0123456789abcdef"; #define NOGETOPT #ifdef NOGETOPT #include "getopt.h" #endif main(argc, argv) int argc; char *(argv[]); /* description top driver routine for framework cross assembler set the cpu type if implemented in parser process the command line parameters setup the tables call the first pass parser print the symbol table call the second pass close down and delete the outputs if any errors return exit(2) for error, exit(0) for OK */ { extern char *optarg; extern int optind; int grv; grv = cpumatch(argv[0]); while( (grv = getopt(argc, argv, "dh:o:l:s:p:")) != EOF) { switch(grv) { case 'o': case 'h': hexfn = optarg; hexflag = hexvalid = TRUE; break; case 'l': loutfn = optarg; listflag = TRUE; break; case 'd': debugmode = TRUE; break; case 's': symbflag = TRUE; symbfn = optarg; break; case 'p': if( ! cpumatch(optarg) ) { fprintf(stderr, "%s: no match on CPU type %s, default used\n", argv[0], optarg); } break; case '?': break; } } if(optind < argc) { if(strcmp(argv[optind], "-") == 0) { yyin = stdin; } else { if( (yyin = fopen(argv[optind], "r")) == (FILE *)NULL) { fprintf(stderr, "%s: cannot open input file %s\n", argv[0], argv[optind]); exit(1); } } } else { fprintf(stderr, "%s: no input file\n", argv[0]); exit(1); } if(listflag) { if(strcmp(argv[optind], loutfn) == 0) { fprintf(stderr, "%s: list file overwrites input %s\n", argv[0], loutfn); listflag = FALSE; } else if( (loutf = fopen(loutfn, "w")) == (FILE *) NULL) { fprintf(stderr, "%s: cannot open list file %s\n", argv[0], loutfn); listflag = FALSE; } } if( ! listflag) { loutf = stdout; } /* mktemp(interfn); remove this, no mktemp found... AB */ if( (intermedf = fopen(interfn, "w")) == (FILE *) NULL) { fprintf(stderr, "%s: cannot open temp file %s\n", argv[0], interfn); exit(1); } setophash(); setreserved(); elseifstk[0] = endifstk[0] = If_Err; fprintf(intermedf, "F:%s\n", argv[optind]); infilestk[0].fpt = yyin; infilestk[0].fnm = argv[optind]; currfstk = 0; currseg = 0; yyparse(); if(ifstkpt != 0) fraerror("active IF at end of file"); buildsymbolindex(); if(listflag) printsymbols(); if(symbflag) { if(strcmp(argv[optind], symbfn) == 0) { fprintf(stderr, "%s: symbol file overwrites input %s\n", argv[0], symbfn); } else if( (symbf = fopen(symbfn, "w")) == (FILE *) NULL) { fprintf(stderr, "%s: cannot open symbol file %s\n", argv[0], symbfn); } else { filesymbols(); fclose(symbf); } } fclose(intermedf); if( (intermedf = fopen(interfn, "r")) == (FILE *) NULL) { fprintf(stderr, "%s: cannot open temp file %s\n", argv[0], interfn); exit(1); } if(errorcnt > 0) hexflag = FALSE; if(hexflag) { if(strcmp(argv[optind], hexfn) == 0) { fprintf(stderr, "%s: hex output overwrites input %s\n", argv[0], hexfn); hexflag = FALSE; } else if( (hexoutf = fopen(hexfn, "w")) == (FILE *) NULL) { fprintf(stderr, "%s: cannot open hex output %s\n", argv[0], hexfn); hexflag = FALSE; } } currfstk = 0; outphase(); if(errorcnt > 0) hexvalid = FALSE; fprintf(loutf, " ERROR SUMMARY - ERRORS DETECTED %d\n", errorcnt); fprintf(loutf, " - WARNINGS %d\n", warncnt); if(listflag) { fprintf(stderr, " ERROR SUMMARY - ERRORS DETECTED %d\n", errorcnt); fprintf(stderr, " - WARNINGS %d\n", warncnt); } if(listflag) fclose(loutf); if(hexflag) { fclose(hexoutf); if( ! hexvalid) unlink(hexfn); } fclose(intermedf); if( ! debugmode) unlink(interfn); else abort(); exit(errorcnt > 0 ? 2 : 0); } frafatal(str) char * str; /* description Fatal error subroutine, shutdown and quit right now! parameters message globals if debug mode is true, save intermediate file return exit(2) */ { fprintf(stderr, "Fatal error - %s\n",str); if( intermedf != (FILE *) NULL) { fclose(intermedf); if( ! debugmode) unlink(interfn); } exit(2); } frawarn(str) char * str; /* description first pass - generate warning message by writing line to intermediate file parameters message globals the count of warnings */ { fprintf(intermedf, "E: WARNING - %s\n",str); warncnt++; } fraerror(str) char * str; /* description first pass - generate error message by writing line to intermediate file parameters message globals count of errors */ { fprintf(intermedf, "E: ERROR - %s\n",str); errorcnt++; } fracherror(str, start, beyond) char * str, *start, *beyond; /* description first pass - generate error message by writing line to intermediate file parameters message pointer to bad character definition pointer after bad definition globals count of errors */ { char bcbuff[8]; int cnt; for(cnt=0; start < beyond && *start != '\0' && cnt < 7; cnt++) { bcbuff[cnt] = *start++; } bcbuff[cnt] = '\0'; fprintf(intermedf, "E: ERROR - %s \'%s\'\n",str, bcbuff); errorcnt++; } prtequvalue(fstr, lv) char * fstr; long lv; /* description first pass - generate comment lines in intermediate file for the value in a set, equate, or org statement, etc... parameters format string and a long integer value */ { fprintf(intermedf, fstr, lv); } #define SYMPERLINE 3 printsymbols() /* description print the symbols on the listing file, 3 symbols across. Only the first 15 characters are printed though all are significant. Reserved symbols are not assigned symbol numbers and thus are not printed. globals the symbol index array and the symbol table elements. */ { int syn, npl = 0; struct symel *syp; for(syn = 1; syn = SYMPERLINE) { fputc('\n', loutf); npl = 0; } syp = symbindex[syn]; if(syp -> seg != SSG_UNDEF) fprintf(loutf, "%8.8lx %-15.15s ",syp -> value, syp -> symstr); else fprintf(loutf, "???????? %-15.15s ", syp -> symstr); npl++; } if(npl > 0) fputc('\n', loutf); fputc('\f', loutf); } filesymbols() /* description print the symbols to the symbol table file globals the symbol index array and the symbol table elements. */ { int syn; struct symel *syp; for(syn = 1; syn seg != SSG_UNDEF) fprintf(symbf, "%8.8lx %s\n",syp -> value, syp -> symstr); else fprintf(symbf, "???????? %s\n", syp -> symstr); } } YV lO1R=x`_v٢l ~w>Ry*LDi` Ђ~?r;<$][vm׷Qnyq<mnc -YCէBG;=x8uOv)ݦZI:=Vv݃J.ڈu ddcu &ŬI~Xp<:[zvQ#x$x [^Q@ԗRnA+4 V<:FGX0A"QM9 B(nn)^##F>S3)o T8ySc~\=Zc \G%mڽ⡑FXFZ9pcZx9c oVtU짫#c֘GG J X7 FMFd,i%BsշFoVk,=ם{UEU@@b0t44/m0J+>NJѧtVƚ_5@V8z++B"8VB^ _ݹVys$o^Fc;%m$^@ͅ.RQHC-9z!hJg[n-nCoaq/{g{8[.soIF׆J^ϢXtovBmvE:˚ƦUIQ3N N1Ǒ¹~P =o\,\Ld*s6GGctLqfc) #ݽtG{[|6,ˮC"{p/=!LZm6} YIǡBT)U2ʐuZu_ ٺDF5cz;CTF'iwG?& Ӓӯ diJT#7MR~ϯRH:6:)+~԰4vB䳛YlZw&,ப_M&NϤEgo 3/CyF6)B23/jͼthvcKp [mFK^7B]d&/x3ߤځm^x Da 5jZJ,m{Ғ% O%@uy-MEɌSCz9n?4V 6AYkzQ`IS3,;U-LԐҞӢ4Ekc)Ҩ!GC,NK>'F*'}퉑Eo*q/eoc4ݰUSwtdylP=1:˛%je^бR(|e {6Ǣ'"P:Ciwb'.ɕR Q%f4xRpW^NzrD)[0e ;LŎuL}?w 蜼,< Y%{|+/I<ײQ;S~B-_˖)Adc'")4,Kۇ/* HEADER: ; TITLE: Frankenstein Cross Assemblers; VERSION: 2.0; DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM) Hex format object records. "; KEYWORDS: cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 6811, tms7000, 8048, 8051, 8096, z8, z80; SYSTEM: UNIX, MS-Dos ; FILENAME: fryylex.c; WARNINGS: "This software is in the public domain. Any prior copyright claims are relinquished. This software is distributed with no warranty whatever. The author takes no responsibility for the consequences of its use. Yacc (or Bison) required to compile." ; SEE-ALSO: as*.y (yacc input files); AUTHORS: Mark Zenier; COMPILERS: Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285) (previous versions Xenix, Unisoft 68000 Version 7, Sun 3); */ /* description lexical analyzer for framework cross assembler usage Framework cross assembler, Unix history September 13, 1987 September 14, 1990 Dosify, 6 char unique names October, 1990 hand carved scanner */ #include #include "frasmdat.h" #include "fraytok.h" #ifndef DEBUG #define DEBUG 0 #endif extern YYSTYPE yylval; enum symflag {Symopcode, Symsym} whichsym = Symopcode; FILE *yyin; char finbuff[INBUFFSZ] = "L:"; /* initialization nonreusable, wiped out by pass 2 */ static char *frainptr = &finbuff[2]; /* point to null byte after L: on start up */ enum readacts nextreadact = Nra_normal; frareadrec() /* description read a line, on end of file, pop the include file stack. return FALSE got a line TRUE end of input */ { while( fgets(&finbuff[2], INBUFFSZ -2, yyin) == (char *)NULL) { if(currfstk == 0) { return TRUE; } else { fclose(yyin); yyin = infilestk[--currfstk].fpt; fprintf(intermedf, "X:%s\n",infilestk[currfstk].fnm); } } return FALSE; } static int currtok=0; /* subscript of next token to return */ static int intokcnt=0; /* number of tokens in queue */ static struct { char *textstrt, *textend; YYSTYPE lvalv; int tokv; enum {Yetprint, Yetsymbol, Yetreserved, Yetopcode, Yetconstant, Yetstring, Yetunprint, Yetinvalid } errtype; } scanqueue[INBUFFSZ], *lasttokfetch, *nexttokload; static char tempstrpool[2*INBUFFSZ]; static char *tptrstr; #define CXC00_SKIP 0 #define CXC01_SPACE 1 #define CXC02_NL 2 #define CXC03_LETTER 3 #define CXC04_QUOTE 4 #define CXC05_OTHER 5 #define CXC06_DOLLAR 6 #define CXC07_PERCENT 7 #define CXC08_APP 8 #define CXC09_BIN 9 #define CXC10_OCT 10 #define CXC11_DEC 11 #define CXC12_SEMIC 12 #define CXC13_LT 13 #define CXC14_EQ 14 #define CXC15_GT 15 #define CXC16_AT 16 #define CXC17_HEXU 17 #define CXC18_B 18 #define CXC19_D 19 #define CXC20_H 20 #define CXC21_OQ 21 #define CXC22_HEXL 22 #define CXC23_BL 23 #define CXC24_DL 24 #define CXC25_BSLASH 25 #define NUMCHARSETS 26 static char chartrantab[128] = { /* 00 nul soh stx etx*/ CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, /* 04 eot enq ack bel*/ CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, /* 08 bs ht nl vt */ CXC00_SKIP, CXC01_SPACE, CXC02_NL, CXC00_SKIP, /* 0c np cr so si */ CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, /* 10 dle dc1 dc2 dc3*/ CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, /* 14 dc4 nak syn etb*/ CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, /* 18 can em sub esc*/ CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, /* 1c fs gs rs us */ CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, /* 20 sp ! " # */ CXC01_SPACE, CXC03_LETTER, CXC04_QUOTE, CXC05_OTHER, /* 24 $ % & ' */ CXC06_DOLLAR, CXC07_PERCENT, CXC03_LETTER, CXC08_APP, /* 28 ( ) * + */ CXC05_OTHER, CXC05_OTHER, CXC05_OTHER, CXC05_OTHER, /* 2c , - . / */ CXC05_OTHER, CXC05_OTHER, CXC05_OTHER, CXC05_OTHER, /* 30 0 1 2 3 */ CXC09_BIN, CXC09_BIN, CXC10_OCT, CXC10_OCT, /* 34 4 5 6 7 */ CXC10_OCT, CXC10_OCT, CXC10_OCT, CXC10_OCT, /* 38 8 9 : ; */ CXC11_DEC, CXC11_DEC, CXC05_OTHER, CXC12_SEMIC, /* 3c < = > ? */ CXC13_LT, CXC14_EQ, CXC15_GT, CXC05_OTHER, /* 40 @ A B C */ CXC16_AT, CXC17_HEXU, CXC18_B, CXC17_HEXU, /* 44 D E F G */ CXC19_D, CXC17_HEXU, CXC17_HEXU, CXC03_LETTER, /* 48 H I J K */ CXC20_H, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, /* 4c L M N O */ CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC21_OQ, /* 50 P Q R S */ CXC03_LETTER, CXC21_OQ, CXC03_LETTER, CXC03_LETTER, /* 54 T U V W */ CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, /* 58 X Y Z [ */ CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC05_OTHER, /* 5c \ ] ^ _ */ CXC25_BSLASH, CXC05_OTHER, CXC03_LETTER, CXC03_LETTER, /* 60 ` a b c */ CXC05_OTHER, CXC22_HEXL, CXC23_BL, CXC22_HEXL, /* 64 d e f g */ CXC24_DL, CXC22_HEXL, CXC22_HEXL, CXC03_LETTER, /* 68 h i j k */ CXC20_H, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, /* 6c l m n o */ CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC21_OQ, /* 70 p q r s */ CXC03_LETTER, CXC21_OQ, CXC03_LETTER, CXC03_LETTER, /* 74 t u v w */ CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, /* 78 x y z { */ CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC05_OTHER, /* 7c vb } ~ del*/ CXC05_OTHER, CXC05_OTHER, CXC03_LETTER, CXC00_SKIP } ; #if DEBUG static char * statelab[] = { " 0 start of label", " 1 comment", " 2 label", " 3 rest of line", " 4 symbol", " 5 dollar", " 6 hex dollar", " 7 at sign", " 8 octal at", " 9 percent", "10 bin percent", "11 quote string", "12 appos. string", "13 greater than", "14 less than", "15 base 2 maybe", "16 base 8 maybe", "17 base 10 maybe", "18 hex", "19 found b ", "20 found d", "21 bslash quote", "22 bslash appos", }; static char *actlab[] = { " 0 skip/no op", " 1 load EOL token", " 2 start string", " 3 process label", " 4 save string char", " 5 load single char token", " 6 load EQ token", " 7 process symbol", " 8 load $ token", " 9 setup for $hex", "10 accumulate 0-9 constant", "11 accumulate A-F constant", "12 accumulate a-f constant", "13 load Constant token", "14 load @ token", "15 setup for @octal", "16 setup for %binary", "17 load % token", "18 load String token", "19 load GE token", "20 load GT token", "21 load LE token", "22 load NE token", "23 load LT token", "24 save numeric char 0-9", "25 save numeric char A-F", "26 save numeric char a-f", "27 convert numeric string base 2", "28 convert numeric string base 8", "29 convert numeric string base 10", "30 convert numeric string base 16", "31 save numeric 0xb", "32 save numeric 0xd", "33 set text start", "34 token choke" }; #endif /* DEBUG */ static struct { char action; char nextstate; char contin; } *thisact, characttab [23][NUMCHARSETS] = { /* STATE 0 = {start of label} */ { /* SKIP */ /* SPACE */ /* NL */ /* LETTER */ /* QUOTE */ /* OTHER */ /* DOLLAR */ /* PERCENT */ /* APP */ /* BIN */ /* OCT */ /* DEC */ /* SEMIC */ /* LT */ /* EQ */ /* GT */ /* AT */ /* HEXU */ /* B */ /* D */ /* H */ /* OQ */ /* HEXL */ /* BL */ /* DL */ /* BSLASH */ {0, 0, FALSE}, {0, 3, FALSE}, {1, 0, FALSE}, {2, 2, TRUE}, {2,11, FALSE}, {5, 3, FALSE}, {33, 5, FALSE}, {33, 9, FALSE}, {2,12, FALSE}, {2,15, TRUE}, {2,16, TRUE}, {2,17, TRUE}, {0, 1, FALSE}, {0,14, FALSE}, {6, 3, FALSE}, {0,13, FALSE}, {33, 7, FALSE}, {2, 2, TRUE}, {2, 2, TRUE}, {2, 2, TRUE}, {2, 2, TRUE}, {2, 2, TRUE}, {2, 2, TRUE}, {2, 2, TRUE}, {2, 2, TRUE}, {5, 3, FALSE} }, /* STATE 1 = {comment} */ { {0, 1, FALSE}, {0, 1, FALSE}, {1, 0, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE}, {0, 1, FALSE} }, /* STATE 2 = {label} */ { {0, 2, FALSE}, {3, 3, FALSE}, {3, 3, TRUE}, {4, 2, FALSE}, {3, 3, TRUE}, {3, 3, TRUE}, {3, 3, TRUE}, {3, 3, TRUE}, {3, 3, TRUE}, {4, 2, FALSE}, {4, 2, FALSE}, {4, 2, FALSE}, {3, 1, FALSE}, {3,14, FALSE}, {3, 3, TRUE}, {3,13, FALSE}, {3, 3, TRUE}, {4, 2, FALSE}, {4, 2, FALSE}, {4, 2, FALSE}, {4, 2, FALSE}, {4, 2, FALSE}, {4, 2, FALSE}, {4, 2, FALSE}, {4, 2, FALSE}, {3, 3, TRUE} }, /* STATE 3 = {rest of line} */ { {0, 3, FALSE}, {0, 3, FALSE}, {1, 0, FALSE}, {2, 4, TRUE}, {2,11, FALSE}, {5, 3, FALSE}, {33, 5, FALSE}, {33, 9, FALSE}, {2,12, FALSE}, {2,15, TRUE}, {2,16, TRUE}, {2,17, TRUE}, {0, 1, FALSE}, {0,14, FALSE}, {6, 3, FALSE}, {0,13, FALSE}, {33, 7, FALSE}, {2, 4, TRUE}, {2, 4, TRUE}, {2, 4, TRUE}, {2, 4, TRUE}, {2, 4, TRUE}, {2, 4, TRUE}, {2, 4, TRUE}, {2, 4, TRUE} , {5, 3, FALSE} }, /* STATE 4 = {symbol} */ { {0, 4, FALSE}, {7, 3, FALSE}, {7, 3, TRUE}, {4, 4, FALSE}, {7, 3, TRUE}, {7, 3, TRUE}, {7, 3, TRUE}, {7, 3, TRUE}, {7, 3, TRUE}, {4, 4, FALSE}, {4, 4, FALSE}, {4, 4, FALSE}, {7, 1, FALSE}, {7,14, FALSE}, {7, 3, TRUE}, {7,13, FALSE}, {7, 3, TRUE}, {4, 4, FALSE}, {4, 4, FALSE}, {4, 4, FALSE}, {4, 4, FALSE}, {4, 4, FALSE}, {4, 4, FALSE}, {4, 4, FALSE}, {4, 4, FALSE}, {7, 3, TRUE} }, /* STATE 5 = {dollar} */ { {0, 5, FALSE}, {8, 3, FALSE}, {8, 3, TRUE}, {8, 3, TRUE}, {8, 3, TRUE}, {8, 3, TRUE}, {8, 3, TRUE}, {8, 3, TRUE}, {8, 3, TRUE}, {9, 6, TRUE}, {9, 6, TRUE}, {9, 6, TRUE}, {8, 1, FALSE}, {8,14, FALSE}, {8, 3, TRUE}, {8,13, FALSE}, {8, 3, TRUE}, {9, 6, TRUE}, {9, 6, TRUE}, {9, 6, TRUE}, {8, 3, TRUE}, {8, 3, TRUE}, {9, 6, TRUE}, {9, 6, TRUE}, {9, 6, TRUE} , {8, 3, TRUE} }, /* STATE 6 = {dollar hex} */ { {0, 6, FALSE}, {13, 3, FALSE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {10, 6, FALSE}, {10, 6, FALSE}, {10, 6, FALSE}, {13, 1, FALSE}, {13,14, FALSE}, {13, 3, TRUE}, {13,13, FALSE}, {13, 3, TRUE}, {11, 6, FALSE}, {11, 6, FALSE}, {11, 6, FALSE}, {13, 3, TRUE}, {13, 3, TRUE}, {12, 6, FALSE}, {12, 6, FALSE}, {12, 6, FALSE}, {13, 3, TRUE} }, /* STATE 7 = {at sign} */ { {0, 7, FALSE}, {14, 3, FALSE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {15, 8, TRUE}, {15, 8, TRUE}, {14, 3, TRUE}, {14, 1, FALSE}, {14,14, FALSE}, {14, 3, TRUE}, {14,13, FALSE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE}, {14, 3, TRUE} }, /* STATE 8 = {at octal} */ { {0, 8, FALSE}, {13, 3, FALSE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {10, 8, FALSE}, {10, 8, FALSE}, {13, 3, TRUE}, {13, 1, FALSE}, {13,14, FALSE}, {13, 3, TRUE}, {13,13, FALSE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE} }, /* STATE 9 = {percent} */ { {0, 9, FALSE}, {17, 3, FALSE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {16,10, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 1, FALSE}, {17,14, FALSE}, {17, 3, TRUE}, {17,13, FALSE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE}, {17, 3, TRUE} }, /* STATE 10 = {percent binary} */ { {0,10, FALSE}, {13, 3, FALSE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {10,10, FALSE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 1, FALSE}, {13,14, FALSE}, {13, 3, TRUE}, {13,13, FALSE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE}, {13, 3, TRUE} }, /* STATE 11 = {quote string} */ { {0,11, FALSE}, {4,11, FALSE}, {34, 3, TRUE}, {4,11, FALSE}, {18, 3, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,21, FALSE} }, /* STATE 12 = {app string} */ { {0,12, FALSE}, {4,12, FALSE}, {34, 3, TRUE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {18, 3, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,22, FALSE} }, /* STATE 13 = {greater than} */ { {0,13, FALSE}, {20, 3, FALSE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 1, FALSE}, {20,14, FALSE}, {19, 3, FALSE}, {20,13, FALSE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE}, {20, 3, TRUE} }, /* STATE 14 = {less than} */ { {0,14, FALSE}, {23, 3, FALSE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 1, FALSE}, {23,14, FALSE}, {21, 3, FALSE}, {22,13, FALSE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE}, {23, 3, TRUE} }, /* STATE 15 = {base 2 maybe} */ { {0,15, FALSE}, {29, 3, FALSE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {24,15, FALSE}, {24,16, FALSE}, {24,17, FALSE}, {29, 1, FALSE}, {29,14, FALSE}, {29, 3, TRUE}, {29,13, FALSE}, {29, 3, TRUE}, {25,18, FALSE}, {0,19, FALSE}, {0,20, FALSE}, {30, 3, FALSE}, {28, 3, FALSE}, {26,18, FALSE}, {0,19, FALSE}, {0,20, FALSE}, {29, 3, TRUE} }, /* STATE 16 = {base 8 maybe} */ { {0,16, FALSE}, {29, 3, FALSE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {24,16, FALSE}, {24,16, FALSE}, {24,17, FALSE}, {29, 1, FALSE}, {29,14, FALSE}, {29, 3, TRUE}, {29,13, FALSE}, {29, 3, TRUE}, {25,18, FALSE}, {25,18, FALSE}, {0,20, FALSE}, {30, 3, FALSE}, {28, 3, FALSE}, {26,18, FALSE}, {26,18, FALSE}, {0,20, FALSE}, {29, 3, TRUE} }, /* STATE 17 = {base10 maybe} */ { {0,17, FALSE}, {29, 3, FALSE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {24,17, FALSE}, {24,17, FALSE}, {24,17, FALSE}, {29, 1, FALSE}, {29,14, FALSE}, {29, 3, TRUE}, {29,13, FALSE}, {29, 3, TRUE}, {25,18, FALSE}, {25,18, FALSE}, {0,20, FALSE}, {30, 3, FALSE}, {34, 3, FALSE}, {26,18, FALSE}, {26,18, FALSE}, {0,20, FALSE}, {29, 3, TRUE} }, /* STATE 18 = {hex} */ { {0,18, FALSE}, {34, 3, FALSE}, {34, 3, TRUE}, {34, 3, TRUE}, {34, 3, TRUE}, {34, 3, TRUE}, {34, 3, TRUE}, {34, 3, TRUE}, {34, 3, TRUE}, {24,18, FALSE}, {24,18, FALSE}, {24,18, FALSE}, {34, 1, FALSE}, {34,14, FALSE}, {34, 3, TRUE}, {34,13, FALSE}, {34, 3, TRUE}, {25,18, FALSE}, {25,18, FALSE}, {25,18, FALSE}, {30, 3, FALSE}, {34, 3, TRUE}, {26,18, FALSE}, {26,18, FALSE}, {26,18, FALSE}, {34, 3, TRUE} }, /* STATE 19 = {bin or hex} */ { {0,19, FALSE}, {27, 3, FALSE}, {27, 3, TRUE}, {27, 3, TRUE}, {27, 3, TRUE}, {27, 3, TRUE}, {27, 3, TRUE}, {27, 3, TRUE}, {27, 3, TRUE}, {31,18, TRUE}, {31,18, TRUE}, {31,18, TRUE}, {27, 1, FALSE}, {27,14, FALSE}, {27, 3, TRUE}, {27,13, FALSE}, {27, 3, TRUE}, {31,18, TRUE}, {31,18, TRUE}, {31,18, TRUE}, {31,18, TRUE}, {27, 3, TRUE}, {31,18, TRUE}, {31,18, TRUE}, {31,18, TRUE}, {27, 3, TRUE} }, /* STATE 20 = {dec or hex} */ { {0,20, FALSE}, {29, 3, FALSE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {29, 3, TRUE}, {32,18, TRUE}, {32,18, TRUE}, {32,18, TRUE}, {29, 1, FALSE}, {29,14, FALSE}, {29, 3, TRUE}, {29,13, FALSE}, {29, 3, TRUE}, {32,18, TRUE}, {32,18, TRUE}, {32,18, TRUE}, {32,18, TRUE}, {29, 3, TRUE}, {32,18, TRUE}, {32,18, TRUE}, {32,18, TRUE}, {29, 3, TRUE} }, /* STATE 21 = {bslash quote} */ { {0,21, FALSE}, {4,11, FALSE}, {34, 3, TRUE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE}, {4,11, FALSE} }, /* STATE 22 = {bslash appos} */ { {0,22, FALSE}, {4,12, FALSE}, {34, 3, TRUE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE}, {4,12, FALSE} } }; #define YEXL 32 static char yytext[YEXL]; static char *erryytextex(type) int type; { char * strptr, *endptr; int charcnt; strptr = (lasttokfetch -> textstrt) - 1; if(type == STRING) { endptr = (lasttokfetch -> textend) - 1; if(*endptr == '\n') endptr --; } else { endptr = (lasttokfetch -> textend) - 2; } for(charcnt = 0; (strptr <= endptr) && charcnt < (YEXL - 1); charcnt ++) { yytext[charcnt] = *strptr++; } yytext[charcnt] = '\0'; } int yylex() { int scanstate; char *thistokstart; register char nextchar; int charset; long consaccum, consbase; if(currtok >= intokcnt) { switch(nextreadact) { case Nra_new: /* access next file */ fprintf(intermedf, "F:%s\n", infilestk[++currfstk].fnm); yyin = infilestk[currfstk].fpt; nextreadact = Nra_normal; case Nra_normal: if(frareadrec()) { /* EOF */; return 0; } break; case Nra_end: /* pop file and access previous */ if(currfstk > 0) { fclose(yyin); yyin = infilestk[--currfstk].fpt; fprintf(intermedf, "X:%s\n", infilestk[currfstk].fnm); if(frareadrec()) { /* EOF */; return 0; } else { nextreadact = Nra_normal; } } else { /* EOF */; return 0; } break; } if(listflag) { fputs(finbuff, intermedf); } else { fputs("L:\n", intermedf); } /* Scan a line */ frainptr = &finbuff[2]; currtok = intokcnt = 0; nexttokload = & scanqueue[0]; tptrstr = &tempstrpool[0]; scanstate = 0; whichsym = Symopcode; while( (nextchar = *frainptr++) != '\0' ) { charset = chartrantab[nextchar & 0x7f]; do { thisact = & characttab [scanstate][charset]; #if DEBUG if(isprint(nextchar)) printf("%c ", nextchar); else printf("0x%2.2x ", nextchar); printf("%-18s %-33s %-11s %2.2d\n", statelab[scanstate], actlab[thisact -> action], thisact -> contin ? "Continue" : "Swallow", thisact -> nextstate); #endif switch(thisact -> action) { case 0: /* skip/no op */ break; case 1: /* load EOL token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = EOL; nexttokload -> errtype = Yetunprint; nexttokload++; intokcnt++; break; case 2: /* start string */ thistokstart = tptrstr; nexttokload -> textstrt = frainptr; break; case 3: /* process label */ { struct symel *tempsym; *tptrstr++ = '\0'; tempsym = symbentry(thistokstart, SYMBOL); if((tempsym -> seg) != SSG_RESV) { nexttokload -> tokv = LABEL; nexttokload -> errtype = Yetsymbol; nexttokload -> lvalv.symb = tempsym; } else { nexttokload -> tokv = tempsym -> tok; nexttokload -> errtype = Yetreserved; nexttokload -> lvalv.intv = tempsym -> value; } nexttokload -> textend = frainptr; nexttokload++; intokcnt++; } break; case 4: /* save string char */ *tptrstr++ = nextchar; break; case 5: /* load single char token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = nextchar; nexttokload -> errtype = Yetprint; nexttokload++; intokcnt++; break; case 6: /* load EQ token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = KEOP_EQ; nexttokload -> errtype = Yetunprint; nexttokload++; intokcnt++; break; case 7: /* process symbol */ { register struct symel *symp; register char *ytp; int tempov; *tptrstr++ = '\0'; if(whichsym == Symopcode) { for(ytp = thistokstart; *ytp != '\0'; ytp++) { if(islower(*ytp)) { *ytp = toupper(*ytp); } } nexttokload -> lvalv.intv = tempov = findop(thistokstart); nexttokload -> tokv = optab[tempov].token; nexttokload -> errtype = Yetopcode; whichsym = Symsym; } else { symp = symbentry(thistokstart,SYMBOL); if(symp -> seg != SSG_RESV) { nexttokload -> lvalv.symb = symp; nexttokload -> errtype = Yetsymbol; } else { nexttokload -> lvalv.intv = symp->value; nexttokload -> errtype = Yetreserved; } nexttokload -> tokv = symp -> tok; } nexttokload -> textend = frainptr; nexttokload++; intokcnt++; } break; case 8: /* load $ token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = '$'; nexttokload -> errtype = Yetprint; nexttokload++; intokcnt++; break; case 9: /* setup for $hex */ consbase = 16; consaccum = 0; break; case 10: /* accumulate 0-9 constant */ consaccum = (consaccum * consbase) + (nextchar - '0'); break; case 11: /* accumulate A-F constant */ consaccum = (consaccum * consbase) + (nextchar - 'A' + 10); break; case 12: /* accumulate a-f constant */ consaccum = (consaccum * consbase) + (nextchar - 'a' + 10); break; case 13: /* load Constant token */ nexttokload -> lvalv.longv = consaccum; nexttokload -> tokv = CONSTANT; nexttokload -> errtype = Yetconstant; nexttokload -> textend = frainptr; nexttokload++; intokcnt++; break; case 14: /* load @ token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = '@'; nexttokload -> errtype = Yetprint; nexttokload++; intokcnt++; break; case 15: /* setup for @octal */ consbase = 8; consaccum = 0; break; case 16: /* setup for %binary */ consbase = 2; consaccum = 0; break; case 17: /* load % token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = '%'; nexttokload -> errtype = Yetprint; nexttokload++; intokcnt++; break; case 18: /* load String token */ *tptrstr++ = '\0'; nexttokload -> lvalv.strng = thistokstart; nexttokload -> tokv = STRING; nexttokload -> errtype = Yetstring; nexttokload -> textend = frainptr; nexttokload++; intokcnt++; break; case 19: /* load GE token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = KEOP_GE; nexttokload -> errtype = Yetunprint; nexttokload++; intokcnt++; break; case 20: /* load GT token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = KEOP_GT; nexttokload -> errtype = Yetunprint; nexttokload++; intokcnt++; break; case 21: /* load LE token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = KEOP_LE; nexttokload -> errtype = Yetunprint; nexttokload++; intokcnt++; break; case 22: /* load NE token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = KEOP_NE; nexttokload -> errtype = Yetunprint; nexttokload++; intokcnt++; break; case 23: /* load LT token */ nexttokload -> lvalv.longv = 0; nexttokload -> tokv = KEOP_LT; nexttokload -> errtype = Yetunprint; nexttokload++; intokcnt++; break; case 24: /* save numeric char 0-9 */ *tptrstr++ = nextchar - '0'; break; case 25: /* save numeric char A-F */ *tptrstr++ = nextchar - 'A' + 10; break; case 26: /* save numeric char a-f */ *tptrstr++ = nextchar - 'a' + 10; break; case 27: /* convert numeric string base 2 */ { consaccum = 0; while(thistokstart < tptrstr) { consaccum = (consaccum * 2) + *thistokstart++; } nexttokload -> lvalv.longv = consaccum; nexttokload -> tokv = CONSTANT; nexttokload -> errtype = Yetconstant; nexttokload -> textend = frainptr; nexttokload++; intokcnt++; } break; case 28: /* convert numeric string base 8 */ { consaccum = 0; while(thistokstart < tptrstr) { consaccum = (consaccum * 8) + *thistokstart++; } nexttokload -> lvalv.longv = consaccum; nexttokload -> tokv = CONSTANT; nexttokload -> errtype = Yetconstant; nexttokload -> textend = frainptr; nexttokload++; intokcnt++; } break; case 29: /* convert numeric string base 10 */ { consaccum = 0; while(thistokstart < tptrstr) { consaccum = (consaccum * 10) + *thistokstart++; } nexttokload -> lvalv.longv = consaccum; nexttokload -> tokv = CONSTANT; nexttokload -> errtype = Yetconstant; nexttokload -> textend = frainptr; nexttokload++; intokcnt++; } break; case 30: /* convert numeric string base 16 */ { consaccum = 0; while(thistokstart < tptrstr) { consaccum = (consaccum * 16) + *thistokstart++; } nexttokload -> lvalv.longv = consaccum; nexttokload -> tokv = CONSTANT; nexttokload -> errtype = Yetconstant; nexttokload -> textend = frainptr; nexttokload++; intokcnt++; } break; case 31: /* save numeric 0xb */ *tptrstr++ = 0xb; break; case 32: /* save numeric 0xd */ *tptrstr++ = 0xd; break; case 33: /* set text start */ nexttokload -> textstrt = frainptr; break; case 34: /* token choke */ nexttokload -> lvalv.longv = 0L; nexttokload -> tokv = KTK_invalid; nexttokload -> errtype = Yetinvalid; nexttokload -> textend = frainptr; nexttokload++; intokcnt++; break; } scanstate = thisact -> nextstate; } while( thisact -> contin); } if(intokcnt <= 0) { /* no tokens in line (comment or whitespace overlength) */ scanqueue[0].tokv = EOL; scanqueue[0].errtype = Yetunprint; scanqueue[0].lvalv.longv = 0; intokcnt = 1; } if(scanstate != 0) { /* no EOL */ fraerror("Overlength/Unterminated Line"); } } lasttokfetch = &scanqueue[currtok++]; yylval = lasttokfetch -> lvalv; return lasttokfetch -> tokv; } yyerror(str) char *str; /* description first pass - output a parser error to intermediate file */ { char * taglab; switch(lasttokfetch -> errtype) { case Yetprint: if( ! isprint(lasttokfetch -> tokv)) { fprintf(intermedf, "E: ERROR - %s at/before character \"^%c\"\n", str, PRINTCTRL(lasttokfetch -> tokv)); } else { fprintf(intermedf, "E: ERROR - %s at/before character \"%c\"\n", str, lasttokfetch -> tokv ); } break; case Yetsymbol: case Yetreserved: case Yetopcode: case Yetconstant: erryytextex(SYMBOL); fprintf(intermedf, "E: ERROR - %s at/before token \"%s\" \n", str, yytext); break; case Yetinvalid: erryytextex(SYMBOL); fprintf(intermedf, "E: ERROR - %s at invalid token \"%s\" \n", str, yytext); break; case Yetstring: erryytextex(STRING); fprintf(intermedf, "E: ERROR - %s at/before string %s \n", str, yytext); break; case Yetunprint: switch(lasttokfetch -> tokv) { case EOL: taglab = "End of Line"; break; case KEOP_EQ: taglab = "\"=\""; break; case KEOP_GE: taglab = "\">=\""; break; case KEOP_GT: taglab = "\">\""; break; case KEOP_LE: taglab = "\"<=\""; break; case KEOP_NE: taglab = "\"<>\""; break; case KEOP_LT: taglab = "\"<\""; break; default: taglab = "Undeterminable Symbol"; break; } fprintf(intermedf, "E: ERROR - %s at/before %s\n", str, taglab); break; default: fprintf(intermedf, "E: ERROR - %s - undetermined yyerror type\n", str); break; } errorcnt++; } DW7[n_%E=# HEADER: ; # TITLE: Frankenstein Cross Assemblers; # VERSION: 2.0; # SYSTEM: Unix (microport system V/AT); # FILENAME: Makefile ; # DESCRIPTION: "Reconfigurable Cross-assembler producing Intel (TM) # Hex format object records. "; # KEYWORDS: cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, # 6811, tms7000, 8048, 8051, 8096, z8, z80; # WARNINGS: "This software is in the public domain. # Any prior copyright claims are relinquished. # # This software is distributed with no warranty whatever. # The author takes no responsibility for the consequences # of its use. # # Yacc (or Bison) required to compile." ; # AUTHORS: Mark Zenier; # COMPILERS: Microport System V/AT; # # usage # make somename TARGET=somename # make newmachine clean out machine dependent *.o # make clean clean out for release disk # # Conditional Compilation Flags # # DOSTMP use the current directory for temporary intermediate # file # NOGETOPT use the getopt.h file # USEINDEX redefine the strchr() library function to use # the older equivalent name index() # NOSTRING use internal definitions if the include # file does not exist # TARGET = frasm PRINTSPOOL = lpr # LEXERDEBUG = -DDEBUG=1 LEXERDEBUG = # for microport and xenix CFLAGS = -Ml -g YACCLEXLIB = -ly MAINNEEDS = MAINDEPENDS = # for dos cross compiled on xenix # CFLAGS = -dos -Ml # YACCLEXLIB = # MAINNEEDS = -DNOGETOPT -DDOSTMP # MAINDEPENDS = getopt.h # for v7 # CFLAGS = -DUSEINDEX -DNOSTRING # YACCLEXLIB = -ly # MAINNEEDS = -DNOGETOPT # MAINDEPENDS = getopt.h clean : rm -f *.o fraytok.h rm -f y.tab.[ch] rm -f as*.c as*.h as*.o newmachine : rm -f fraytok.h rm -f fryylex.o rm -f $(TARGET).c $(TARGET).h $(TARGET).o $(TARGET) : frasmain.o frapsub.o fryylex.o $(TARGET).o fraosub.o cc $(CFLAGS) -o $(TARGET) frasmain.o frapsub.o \ fraosub.o fryylex.o $(TARGET).o $(YACCLEXLIB) rm -f fraytok.h frasmain.o : frasmain.c frasmdat.h $(MAINDEPENDS) cc $(CFLAGS) $(MAINNEEDS) -c frasmain.c $(TARGET).c $(TARGET).h : $(TARGET).y yacc -d $(TARGET).y mv y.tab.c $(TARGET).c mv y.tab.h $(TARGET).h rm -f fraytok.h fraytok.h : $(TARGET).h cp $(TARGET).h fraytok.h $(TARGET).o : $(TARGET).c frasmdat.h fragcon.h cc $(CFLAGS) -c $(TARGET).c frapsub.o : frapsub.c fragcon.h frasmdat.h fraeuni.h fraebin.h cc $(CFLAGS) -c frapsub.c fraosub.o : fraosub.c frasmdat.h fragcon.h fraeuni.h fraebin.h cc $(CFLAGS) -c fraosub.c fryylex.o : fryylex.c frasmdat.h fraytok.h cc $(CFLAGS) $(LEXERDEBUG) -c fryylex.c B,L[%B =,NlxM1׿W_4Ac!< ߆hK}uS?5)Քx`H\ S4n&[ӄmg_FD1uM׋>b<|mte qG,9IZ+.L:xi9ΑoHHFF"fv |,Y Y aX15^3&CUWW9*$'|a½ZOρ<)$mEN1 Ze/M5FK#ӺW D;rOo}g0>'w.|qu.[r5+.kdՓ$k?v``dIADNZlju@ʫL޾zG include # file does not exist # CFLAGS = YACCLEXLIB = LEXNEEDS = MAINNEEDS = -DDOSTMP -DNOGETOPT MAINDEPENDS = getopt.h $(TARGET) : frasmain.obj frapsub.obj fryylex.obj $(TARGET).obj fraosub.obj tcc $(CFLAGS) -e$(TARGET) frasmain.obj frapsub.obj\ fraosub.obj fryylex.obj $(TARGET).obj $(YACCLEXLIB) del fraytok.h frasmain.obj : frasmain.c frasmdat.h $(MAINDEPENDS) tcc $(CFLAGS) $(MAINNEEDS) -c frasmain.c fryylex.obj : fryylex.c fraytok.h frasmdat.h tcc $(CFLAGS) $(LEXNEEDS) -c fryylex.c $(TARGET).c $(TARGET).h : $(TARGET).y bison -d $(TARGET).y fraytok.h : $(TARGET).h copy $(TARGET).h fraytok.h $(TARGET).obj : $(TARGET).c frasmdat.h fragcon.h tcc $(CFLAGS) -c $(TARGET).c frapsub.obj : frapsub.c fragcon.h frasmdat.h fraeuni.h fraebin.h tcc $(CFLAGS) -c frapsub.c fraosub.obj : fraosub.c frasmdat.h fragcon.h fraeuni.h fraebin.h tcc $(CFLAGS) -c fraosub.c !mŪ#\nJYIzIV Bu2>,Slgʋ?18d)h,:< 5&-[9eiIV͜oZ> J),Ӱ);Q=#b O;z ]㺓zp6$.п~Iɚ 9>zp"N33cQPQa6 J1lE~qN tv#E-hJz%$dɧ56B?R.O);iQNq E)?oi֯<ҟHL #\Ft[3go,l&6NZZ~Wȴ>b#qzrpfA5䠏F,r4.Q0 /R/vˈ*; djJTMuK \ -uu҉H;A tճB;c-ꭦgJ ly%n:}9F 4Qs\ǬAzvEDoX4|+⬻^='Cx^S˕O%.9SLM%!#uKaٻtx$ ts` 9qvZ.{y}|ʬOa݂30NV74j7|u2bL9+:FSXJfd49 jC YZMy/Crf; t(F F_G~:ĊM$)X؛[e'?O7{+YFz4ډ fpfKI<Ϭ,( ?0u`P&bit equ $88 dirbit equ $8d direct equ $44 immed equ $55 srcdirect equ $33 acall addr add a, #immed add a, @ r0 add a, @ r1 add a, direct add a, r0 add a, r1 add a, r2 add a, r3 add a, r4 add a, r5 add a, r6 add a, r7 addc a, #immed addc a, @ r0 addc a, @ r1 addc a, direct addc a, r0 addc a, r1 addc a, r2 addc a, r3 addc a, r4 addc a, r5 addc a, r6 addc a, r7 ajmp addr anl a, #immed anl a, @ r0 anl a, @ r1 anl a, direct anl a, r0 anl a, r1 anl a, r2 anl a, r3 anl a, r4 anl a, r5 anl a, r6 anl a, r7 anl c, /bit.5 anl c, /dirbit anl c, bit.5 anl c, dirbit anl direct, # immed anl direct, a cjne @ r0, # immed, addr cjne @ r1, # immed, addr cjne a, #immed, addr cjne a, direct, addr cjne r0, # immed, addr cjne r1, # immed, addr cjne r2, # immed, addr cjne r3, # immed, addr cjne r4, # immed, addr cjne r5, # immed, addr cjne r6, # immed, addr cjne r7, # immed, addr clr a clr bit.5 clr c clr dirbit cpl a cpl bit.5 cpl c cpl dirbit da a dec @ r0 dec @ r1 dec a dec direct dec r0 dec r1 dec r2 dec r3 dec r4 dec r5 dec r6 dec r7 div ab djnz direct, addr djnz r0, addr djnz r1, addr djnz r2, addr djnz r3, addr djnz r4, addr djnz r5, addr djnz r6, addr djnz r7, addr inc @ r0 inc @ r1 inc a inc direct inc dptr inc r0 inc r1 inc r2 inc r3 inc r4 addr inc r5 inc r6 inc r7 jb bit.5, addr jb dirbit, addr jbc bit.5, addr jbc dirbit, addr jc addr jmp @a+dptr jnb bit.5, addr jnb dirbit, addr jnc addr jnz addr jz addr lcall addr ljmp addr mov @ r0, # immed mov @ r0, a mov @ r0, direct mov @ r1, # immed mov @ r1, a mov @ r1, direct mov a, #immed mov a, @ r0 mov a, @ r1 mov a, direct mov a, r0 mov a, r1 mov a, r2 mov a, r3 mov a, r4 mov a, r5 mov a, r6 mov a, r7 mov bit.5, c mov c, bit.5 mov c, dirbit mov dirbit, c mov direct, # immed mov direct, @ r0 mov direct, @ r1 mov direct, a mov direct, r0 mov direct, r1 mov direct, r2 mov direct, r3 mov direct, r4 mov direct, r5 mov direct, r6 mov direct, r7 mov direct, srcdirect mov dptr, #immed mov r0, # immed mov r0, a mov r0, direct mov r1, # immed mov r1, a mov r1, direct mov r2, # immed mov r2, a mov r2, direct mov r3, # immed mov r3, a mov r3, direct mov r4, # immed mov r4, a mov r4, direct mov r5, # immed mov r5, a mov r5, direct mov r6, # immed mov r6, a mov r6, direct mov r7, # immed mov r7, a mov r7, direct movc a, @a+dptr saddr movc a, @a+pc movx @dptr, a movx @r0, a movx @r1, a movx a, @ r0 movx a, @ r1 movx a, @dptr mul ab nop orl a, #immed orl a, @ r0 orl a, @ r1 orl a, direct orl a, r0 orl a, r1 orl a, r2 orl a, r3 orl a, r4 orl a, r5 orl a, r6 orl a, r7 orl c, /bit.5 orl c, /dirbit orl c, bit.5 orl c, dirbit orl direct, # immed orl direct, a pop direct push direct ret reti rl a rlc a rr a rrc a setb bit.5 setb c setb dirbit sjmp saddr subb a, #immed subb a, @ r0 subb a, @ r1 subb a, direct subb a, r0 subb a, r1 subb a, r2 subb a, r3 subb a, r4 subb a, r5 subb a, r6 subb a, r7 swap a xch a, @ r0 xch a, @ r1 xch a, direct xch a, r0 xch a, r1 xch a, r2 xch a, r3 xch a, r4 xch a, r5 xch a, r6 xch a, r7 xchd a, @ r0 xchd a, @ r1 xrl a, #immed xrl a, @ r0 xrl a, @ r1 xrl a, direct xrl a, r0 xrl a, r1 xrl a, r2 xrl a, r3 xrl a, r4 xrl a, r5 xrl a, r6 xrl a, r7 xrl direct, # immed xrl direct, a &v:cnee VO=&&DZ!i3AhT!_.m'MI\ǸET:2iOjOwb.(!эܩw'sSR߀8~lP)aj-W-+4d kXnzoNK\Pxn-7:*NBa *nի]UaҪІS'FeޢKlҗz-}!#2N1{E0auz0Xn2|}Ԓ|aLjG,i^ЪPw{";D,'5ިh~&z#?iPFɫ'`x>]&馇`-w`ëWHL8H4zo&.!A`r}% V3uHAHmMɣ?I~7T]Mx WyFg,F$}^Z ĉbީπVT.wϢp% y},^CZn!@ysOs]ۉohQ-q3@sZ)i$@x[|Z%UxQx*Zn29C?KwI6|#AdW$WQhsxM;Ut꜎p>> TURBO-C <<<< for ATARI-ST Release 1 (C) 88 Borland International G#J$VH3 k  Ј<.@// ?<?<JNAO pBAA4|`g |`.gg4TB|"O4SBQBt SAe!dB)SAe !eHiR@`/ R@Hzd"k, ON^? 9jg @N 9jg @NN`?<LNAH>YO6&H.EjJ Rf2jo&4*J"s $ -fR Rg R -f Rjp`IK RRH8|:g0 WN`,H f: RfRj0*g"M SNV"MAjXNV M0NW Mp NW`xRN :g B Rf``Z Rg)H`HRjjn2$jE0*g@"M SNVH"MAjmNV< M0NW^ Mp NWV`0*H)s$jERj0`p?XOL|NuH>8$H PN,6GKj*IjNM`0|d|br@0;N:hhh hhh0hh NhhB'Sp;@;@`8'S:`.;|`&;|'S` SN+J@f//CM NNC POCA J0N6R@fpmoVCx0-H rN_PJ@f #6*`HCz0-H rNV,#*f.0-H/2/C| NNBPO`/C NNBXOpN0gP"k2-I rN^J@f/+/C NNBpPO`$C kNU'H$f/+/C NNBJPOBU0f'|$C mNU+Hf/-/C NNBPOpNNJN'jp7@h7@(2-I/2C mNAXO'y*0-H'rBkBkN*09~gANN0gN|0-g\"k2-I rN]J@f/+/C. NNA~PO`2C kNT'Hf/+/CS NNAXPO` N kNVR mNVJCz mNT+Hf/-/C NNAPOpN0-oBm0-gR"k2-I rN]RJ@f/+/Cs NN@PO`$C kNT,'H f/+/C NN@POBmBkN0-oBm?-C k$N@TO?-C k$N@TO0g ?-C NN@lTO?-C NN@\TO0g k$NUX0-g k NUJ0-f kNWv mNU40-f mNW``NQ09j&op`B@NL|Nu/ClNAN?XO 9jg @NT09j0f yj"NWpNNu/Cl` yjN?XORyj(Nu/Clq yjN?XORyj&Nu/ QO&H oB@`R@c g|mB7HW/ Cl yjN?PPORyj&PO&_Nu/"H yjN?4XONuH8BCxEIjN`J|m Rp NRtBC0H j&p kg//+CF RN>PO`/CX RN>XORCRDylmJCo Rp NR$ Rp NRLNuH8vGjNI`80H l2$p jg//*Cl TN>vPO`/Cw TN>fXORCylmLNuH0&H6Er@49lҴAl0<NW4$f AmN&3lpCyl R`"RRSCJCn"RRBL Nu3lB@3l3lNuH068:&HEl Rm An NA0H10H10H10H10H!0H! 0RRL 8Nu ylm"r0<NVJ#f An,NTByl29lRyl0HA@ yNu/B@r`vBC6CAKA2Hnr2HA0&NuH8$HIN6H&t fNf&H0H)` "J SNY$J@g2(K&k fN@&H)H JNYZ JNP&B BkBBk KLNu?6N0(f1C1ylRyl1|6NuH $H68NX$H0*g AnINBBj5C5|0H%@LNu/ / Er09lNT$f AniNB@A`$2I"p$ g2)gI&R'"i " fR@|m&_$_NuH8vE~ GI`@0HC@ rN4B23 f7 `0@240@44f92ABtRCy~mLNuH8$HNJ@A60g2IG~ 0HC@"s JNWJ@f0`0@64JCfB@LNu/B@r`vBC6CAKA2Hnr2HA0&NuHA~ 6K@C600BD:M@E00PA`":ECE:0PAg:ECE80P`RCS@J@nJDfA}`80@C@20AD`0H60Bpf p`RDSAJAnA}L8Nu/?Cn yjN:(\ONu/ AlC$QmdR`B("mAnNN$_Nu?/ 6Ej4@|2HNrC2HN$_6Nu?6rdNrCAj40HNx6NuH<&HBC8:El#lI`hJDf@H|rg$n|;g| g`|xgS@g`xBE`RC`TCHN`$H|#|Cb @0;NBD`b0HHA|0:`j0HHA|W:`X0HHA|7:`F2 4N`0KBE`HNfRK`RK KNtB@`>AnNff yƱlcp N"yj yƑ"p JNJp0L<8Nu/ ymlr0<NP$H fB@`:B@` 2A5R@|m#m09mHAv!09mRym$_NuH8(o$QHJBg|\g `p`$gH|BG `RJH|3gn,|0gnJBg|"g@[Bg<`L|1g~SBgx`<|7gnn|4gdSBg`SBg\`"|\g |g`$fH8RJ"`$fRJ"`0H|BG GRJ" o SfB@`p`H|0RJ<0m6<7n04JHC|02RJ<0m<7nJHC|02RJ"4|8`zRJH|0|6bB4; N nnnnnnnnnnxxxxxxH|0`H|W`H|7`"p`RJH|0|6bB4; N nnnnnnnnnn4JHC|02`"4JHC|W2`4JHC|72RJ"8pLNu/ / ]O$H&PHoHo"H ymN"POR@gS@gS@g2S@g(`"/"KAnNXO`/"KAnNXOB@` 0/` W0\O&_$_NuH0YO.BCElG`N&lBD`ANpN.p;NRCRD|l Wf Slcp N"yj S"p JNFx Wf0XOL NuH06EBBj#GA%H5|0NJ@g07'B@N`0B37L NuA Po"hRSPNu"hBAoNNu?6rdNrCAj40HN6NuH<6EGIKH22|bDA2;N8z 2I02NJ@g2I02NN0H22|Hg&]Ag| g,[Ag` D&` F&` &``2I02NHJ@ggnH|%|b6A2;N***h**z************0x|^gn|?gQAg[Ag`ؒ|{g^SAgSAgf`  T"NT &]` T "NTX&]` T ѓ]` T &]` T "NT&]`t T +&]`b T +&]`P T ]`D T ]`8 T ]`, T] op`B@H&` T] mp`B@H&` T] lp`B@H&` T] np`B@H&` T] gp`B@H&` T] fp`B@H&`0H r 2(opN&`zpNB`n0H r &: Ug Uf:2I r (N`@2I r 0(HNpSNj`&pPNb&`2I 2Nz0H&:pL<NupA`"PH|0|6bA2;Nnnnnnnnnnn""PH|0H҂ `*""PH|WH҂ `""PH|7H҂ R"Pf.NuH>YOGKoVMqjI yjNA6R@g*|Lf*09j*gN"yj0<AN@$ g ;|`&"yj0<AN@ fAoN `0|C|b@0;Nv,6pr09j*gN "yAN@` Hyql?HyCo yN-O `RU`09j*g Np NI$H gBHyqlp??Cp yN-pPO0-g"yAN?Bm` yp N@`)|ql N3R N#)@`h)|ql Bl)lN09j,gN09j*gvGMoIoZE`P j H|!|]b8@0;N,,Bd,,,0P,X@,V,",,,,ph(,,,&,,, ,,,,,,,,,,,,x,,,,,,tz  j H|0HЁ&`X  j H|WHЁ&`>  j H|7HЁ&`$D`F` &`Ƽ` "NM&]K` "NM&]K`֓]K` &]K` "NN&]K` &]K` &]K`Ɠ]K`]K` ]K` K]Klp`B@H&`t K]Knp`B@H&`^ K]Kop`B@H&`H K]Kmp`B@H&`2 K]Kgp`B@H&` K]Kfp`B@H&`  y*p2-n MNv` mg mfAgN&-`&*`&9`e AN,`\K&`e AN`\K&`vG`t&]K`lJgfAN`ZJo pm"t ԴDmLoN`DAN`*Jopm"t ԴDm`Jopm"m "剰oANr "&]K`pn(n <2ARR` pnrl0AB0RRANR`m`nX <2ARR<4 RR`Pm,n$<2ARR"<4 RR`0AB0RR0B0RRANT`R j fL|NuNt3NuH0E&*0*g $%CBjBDGo`4f0+gr`r0Am N($%CA0@RSRRRDjmL NuHOMR09rryrtmlGj29rpJAgLSAgSAgN`RyH09HHAJ/0C|T SN!XO09HHAJ-pByrpNJ@gT`L09HoD nN6SyH09HHAJ-p/0C|N SN!TXONJ@fByrp`B@`09j*g"SAqjN3f` "SA|ZN3X#qlrlB@3rt3rr,.G&VBC3qh`H|Arv0Hph2IAAr-H H|"bB4; N FX^f .Ffv&J VB V1| `^*S`8 SRB0<+ MN$H jg"V3|) "V3|"V#H`$ V1j V1| V1j ` SR` VBH V1@ `r VB V1| ` SRB09qhf^(M`HN>J@g HN>0RLf MN:?@ V1@4/2IBAA~ "V3p "V3|3qh`l0<+ MN/H hg"V#H"V3|` o "V3h "V3| o "V3h `" VB V1|$ `.`x /"NAH|0HЁ/@` /"NAH|7HЁ/@` /"NAvH|WHЁ/@` VB V1|@ `$.`.B` VB V1|% VBh`z SRB V!M V1|* V1|`P VB V1| `> VB V1| `. VB V1| ` VB V1|" ` VB V1| V1|`p SR`p SR`p SR`B` /ЀHHЁ/@e`^B` /HHЁ/@e`@B`"/ ЁЀHHЂ/@e`B` /HHЁ/@e V!o V1| V1|`4 SR `@ SR `6 V rl`, VB V1|, V1| V!yrlRyrt n (H(f yrlRrlf09rtn=|=|B3rtJCg A|^N09rrHA-HRyrr#0( OL|8NuH>$HG|NIjKb"m0)|b:@0;NXXXXx m0( N:J@fp@ mh ?/ C- TN\O` m?( / CV TN\O`0<+NjHyb/ C~ TNPO`0<+NJHyb/ C TNPO`0<*N*Hyb/ C TNxPO` m0( || bN@0;NDD &,D2D>DD8M`(M`"M`M`M`M ` M`M// C* TNPO`/ CF TNXORyj&L|Nu?09~g0N6|g nJ@g|gS@g`|g|g`0`N6Nu/ E:BA0< JN0BA0<AN"BA0<A NBA0<ANBA0<ANBA0<ANBA0<ANBA0<ANBA0<A!NBA0< A$NݲBA0<"A(NݤBA0<#A+NݖBA0<$A/N݈BA0<%A2NzBA0<&A6NlBA0<'A:N^BA0<A>NPBA0<ABNBBA0<AJN4BA0<AMN&BA0<APNBA0<ASN BA0<AXNBA0<A[NBA0<A_NBA0< AbNBA0<"AfNBA0<#AiNܶBA0<$AmNܨBA0<%ApNܚBA0<&AtN܌BA0<'AxN~2<0<A|Nn2<0<A~N^2<0<ANN2<0<AN>2<0<AN.2<`0<AN2<`0<AN2<@0<AN2<@0<AN2<@0<AN2<@0<AN2<@0<AN۾2<@0<ANۮ2<0<AN۞2<0<ANێ2<0<AN~2<0<ANn2<0<AN^2<`0<ANN2<`0<AN>2<@0<AN.2<@0<AN2<@0<AN2<@0<AN2<@0<AN2<@0<AN$_NupNuH>OM-|-|pBnBnBnBn =|"EK:.(n6. * 6ЀATLe ANr`j8X W 0@An80|HoV2."lN=@"lBn"n"m<|l60@820@A f00n"f=|",60. o|Sn `t0@A 80|fZ2."lN\=@"lBn"/|4`X o PfhfX o0m o0n"f o8(lB@`JDf0. J@gS@g&S@g"S@gl`ANl` .(n6.Rn=| `<0@An80|JDm$|l2A42BC f q f62`ULYrd`0."fp`=|"`=D&W0@A 00r@fl@2IH"W,4BA80 4BC61 4BTRC|l2A622AA f204DBBg2AA40B62 `@2IH W,4BC81 4BA60 4BTRC|l0@620@C f012DAAg0@A20A62=C-L-W0.|^bR@0;NFFFFRR"p\tFX0X2l @ 0 v  N . t  Z 4r<,06Nf~2Lf6NfNՐ`NՈBn `v%k3rp`dpyH|m ANӦ`J SN/ SN09HHCJ#C0 SN&z09HHCJ# f AN^`3rp` k hf*2B@N yf k1|`HA N`A.N` k hg hf82B@N yf k1| k!y``ARN`hAsNҸ`\Rj j l2B@Nt yf 9g2*AA1`5|0*@ABp0*@ABp`0*g@Rj j l(2*AA10*@C3`AN `ANJ`0*@A20JAg SAgSAg`Bj`|5|`rAN`f0*@A20JAg SAgSAg`FBj`5|Sj`2ANт`&2B@NL yfb 9-@# k hf1| k!n`AN4`2B@N yf 9-@#`AN` k hf1|NؼH k!@nA N k (AN&`f2B@N܌ yf\ 9fBmpAN`809mH"9Բl"Av#m 9AN`A CNT`A kNH`/k 9mgBn`.0.@A20B@NHo Ho C ymN0PO?@T@f A N` yfx0/R@gFS@g S@gRS@g:`h 9moA Nϐ09| o0A 9N`0//"oA NϘXO`//"oA NτXO`A kN\Rn0.Sm$ ogA N<`A "N0` S hf1| S!n`6AN` k hf1| k!n`AN-y`z".09N.Bn`*0.@A20pN~AN԰HѹRn0.Sm`0".09NBn` 0.HA pNHѹRn0.Sm`".09NӤBn`*0.@A20pNAN&HѹRn0.Sm`2B@N yf .й# .AN4`tA >N`hByl09l@A1Ryl<l`@Byl09lHA!Ryl<l`".09NBBr0N&NdHѹ`".09NҤpSH#4|r0+NN*Hѹ`".09NjpSH#4|r0+NѲNHѹ`|".09N00H#BBr0+N~NҼHѹ`H".09N2pN`BBr0+NLNҊHѹ`".09N4+|0|@@r 0+NNPHѹ`".09NѐpkH#2pN4+|r0+NN Hѹ`".09NJpkH#2H#4+|0+rNЄNHѹ`N".09NpkH#2pNX4+|r0+N>N|Hѹ`".09NмpkH#rSH#4+|6|CC0+rNN(Hѹ`".09NhpkH#rSH#4+|6|CC0+rNϖNHѹ``".09NpkH#2H#4+|0+r NNNЌHѹ`".09NpkH#2pN"4+|r@0+NNFHѹ`".09Nφ0+H#2pNBB2<0+NNHѹ`".09NF2+pNը2pNՠBB2<0+NΊNHѹ`T".09N2+pNj`".09N2+pNN2pNFBB2<0+N0NnHѹ`".09NήpkH#2pN4+|r0+NN(Hѹ`".09NhpkH#rSH#4+|6|CC0+rN͖NHѹ``".09NpkH#2pNj4+|r0+NPNΎHѹ`".09NpkH#2pN$4+|r0+N NHHѹ`".09N͈pkH#rSH#4+|6|CC0+rN̶NHѹ`".09N44+k|0|@@r 0+NxNͶHѹ`B".09NpkH#rSH#4+|6|CC0+r@N$NbHѹ`".09N̢pkH#2H#4+|0+2<NNHѹ`".09NXpkH#2pNҮ4+|2<0+N˒NHѹ`\".09N0+H#pSH#4|2<0+NJN̈Hѹ`".09N2+pN*2pN"BB2<0+N NJHѹ`".09Nˊ2+pNpSH#4|2<0+NNHѹ`".09ND2+pNѦpSH#4|2<0+NʀN˾Hѹ`J".09N2+pN`2pNXBB2< 0+NBNˀHѹ` ".09NpkH#2+pN2pN 4+|r0+NN0Hѹ`".09NppkH#2+pN2pNм4+|r0+NɢNHѹ`l".09N pkH#2+pNt2pNl4+|r0+NRNʐHѹ`2+B@N@ yf09ְ|gn6| |b@0;N|||||||||||||||||gdn*|gZn|gPQ@gLQ@gH`N|g@Q@g|g0n|g(Q@g$Q@g `&|gQ@gQ@g`pyH>` >`A fNÞ`A NÔB mrlA N|0k<`<`BBgt_2pN$\O<`BBgtN2pN \O<`BBgtH2pN\O<`BBgtZ2pN\O<`B?t*2+pN\O<`B?t/2+pNĨ\O<`~B?t+2+pNĎ\O<`dB?t-2+pNt\O<`JB?t%2+pNZ\O<`0B?t{2+pN@\O<`B?t}2+pN&\O<`B?t>2+pN \O<`B?tG2+pN\O<`B?t<2+pN\O<`B?tL2+pNþ\O<`B?t?2+pNä\O<`zB?t=2+pNÊ\O<``B?t&2+pNp\O<`FB?t|2+pNV\O<`,B?t^2+pN<\O<`BBg StUBApN$\O<`BBg StSBApN \O<`/.BgtPBApN\O<`/BgtVBApN\O<`/SB SNRJc6ANH. ogANH"Ё. ogA N/BgtVBApN|\O<`R<`JOL|Nu/YOM,C Hza>XOXO,_NuH@B@H@CraJ@kNu.Vp`/QOM-O, ICHzaXOPO,_NuH@B@H@"VrajJ@kNu.np`/YOM, IC HzaXO VBXO,_Nu"VS@eQ,Nu/YOM,HzaXOXO,_NuH@B@H@CraJ@kNu.Vp`/QOM-O, I"oHzaXXOPO,_NuH@B@H@"VraJ@kNu.np`/YOM, I"o HzaXO VBXO,_Nu"VS@eQ,NuH8]O$H&I(o&BCx%p JR@g`fJ@g@NBEgZBA< <b;k`|<*f<`&<0< b ACp ab$Wb<gt<.f6<*f4`$<0< b ACp a$$Wb4g<lf ggr@d|?@0;N8d<Ph [0`AB(`0AB(` [2"La,@``JEj `p0?4 LaTO@`@JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`APK2"La@`APK2"La@`APK2"La @`@N0\OLxNup`H Ov Jj|-?|D`g|+?|`g| ?|`~?|`vH Ov ?|`dH Ovf?|`L|0f|x?|`2|X?|`$H Ovf?|` |0?|$H>C8jxA aJA pJWF@?@gA 2SAk ae(Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`XH0$H&IvJWFCJBj4Cb6xJAkCc8Cf K0a0 JN` 0 JN0 Kap0DL Nu6x0/g f@ JaP0/g@AN0/g@ Ja,0/g@A N0/g g@ Ja0OLNuH0E6`H0E4&H6g8Kg SC JpNQ J0|gNL Nu00000000 H0O$H&I?|>68jx`p @c8 J0R@CDHoBaXO0?| JoBg|-?| `&g|+?| `g | ?| ?| ?D62^At0gJf$B RoDJDf f0SA`,C"SDQ`X JDf fSA` C"SDQto An ?B?B`ff ?C?B`?C?BC8?|@gE`e0/DS@jD@-`+/ r AJa"_AFpJWF@rg SAkt0QS@k AFQ`zH0O$H&I?|@>>68jx JpCDHoBazXO?| JoBg|-?| `&g|+?| `g | ?| :/DlDE|0 ?| |JDffSFDged?DD?|6`4JEfp?@?@6`" JpCDHoBaXO 5d?EE?|6`SE?EE|1"p?@6@`E|b J0CDHoBaXO0@E:/DDEE?D6DC"SDQ?EE`?|0D|b JCDHoBaBXO0D0:/D<RFDJDffSF?D6t0JfB ?| RoDC"SDk4Q`,C ?E SEj 0?| `QC"SDkQto Fn ?B?B`ff ?C?B`p?B?C`f|? ?| x?D ?D?D6|`H0O$H&I?|@>>68jx JpCDHoBaJXO0/DS@Dn,|m$`6x0/gf@ Ka0/ g@AN0/g@ Ka0/ g@A NJof Jo6fgp@A .N0/g@ KaX0/6g@A"N0/@g@A8N0/gg@ Ka20ONL NuH68,IQO/(/V@ o00 W?_ C@ov@JfJf`0Q o,BP`Jg0<@W`0@?H@>JgDGJGgAaACJga`a W?mRGJDoGl v C@ov@ o,0(*/$HB|Jȼ|f,.ڇن|c㔴|crp$HBJ<0 9g0ȼ,.ڇنRAAb OcJ@j0pRPR6R@Cg0`OL@Nur`rHQHPCA aPOANur`r//HQCanPOANu@$@Y@@@È@jA.AcAׄCAy7DxCyٝFnH=c)\I1sKP1P=M8O?ZwH02g$uOs<:NMEFGg0H,-uJFg$0H.0/u4JGg ACab`,-oJEg(0H.h/ulJGfJFg ACa6`,-oJg.?BCAab,-oPOL`NumulH$&) "((fJg*fJg H@:HB<MNE1F,<.*FHÁ…HC΃ƅąxHB<:HC>܇ۄHAHB>܇ۄH@HC>܇ۄ>ڇلHDHEHF8:|HB>ڇن>؇HC>ڇنH@HB>ڇن~>(JkڅلSG <"FHD„v 歊ȀۆنGk GcHzazXO(*`xz`SGOHG؇Jj !ELNudivH$&) "(*fJgv(fJgv H@8HB:LME,<.*FHÁ…HC΃ƅąb fbRD1DHBHC.h~>ЇHG~` B@H@:|FH@HAHF<0BAHBHC8:ǒxjSG҃тd6BBHBHC,h ,ІHF|` B@H@:ƒ*HEHE8BEjSF҃BdHG>H@HA0,h ,ІHF|` B@H@6HC:2HAH@xDjSF҃dhrHF<x8(z <"FHG‡v 殌΀݅߅Dk DcHzfaXO.,`~|`SDLHDބJj !FLNuHO>/o*/P/h /Q/i o./P/hANWJ@f(0 @f 3!j`" @g @f3"j` o. !oOLNuprt` <rtJjH//HW//0aXPO "LNupNuACapN Abnormal program executionH8$H&I+g^2ghUAe"S(kt d W`2+gH@ KaLJ@f,H@ KaNLJ@gkg&B JLNu3 j`/ / &Q(i )g6Jg(ge"// Iad"_ _J@f&Q`B@"(_&_Nu3 jp`H:$H&I(Sx&gBJg>+g@,k $ڹd SfRe`&// Ka$"J@f(S`& L\Nu3 jp`"PdB@ Nu(g*gg/a _J@f/a" _J@kf"P`3 jpNup/aJXONu"P H dNu(g?/aF _2J@f 0Nu3 jpNuH&H(ov<rgv<wg v<afg <+fVCg<bg<tg`p\CJfj g La ` aJfZ(H <a)HgL0@0;R KaV|g@9@;0V@ l)H()H Cd#j LLNup`p`p 3j`a)b*a)b* Ap`Ar(WVNu?/ AaJAa@G6<`Gp+g Ka"QA aP&_6Nu_TMP_XXX.XXX/ &H+g+g.aJ@f.0+aJ@k"+g kaB@7@&_Nu3 jp`H&H(k L0+"+ aJkRgF+f* L2SAt Wf"HSIS@SAk öWgJ@g&r2'LB@LNup`p`H&H(k6+"+g0DtaJk+fT"SA"L Ip Wf(| ?/ " 0a"_2JkJAp QH@" 0aLJj`&0" Laְ|g&'LB@LNup`H6&Hp Cgp@CfJpC?/ ?<=NAPOJk*80<Cf^pCgB?<?p/?<BNAO Jj*`0r߲f*r Cg$pCW|?/ ?<NAXO0<`|c??<>NAXOJkpNuav3jpNu/?<ANA\OJkpNuaV3jpNuJ@g//??<?NAO JkNu aNua(3jpNuH&Hx&SkdJ9pkdffar<g< g.<g>< e渃dRaZ`JgSSKpaLp aHpaD`Rp a:pp a.`p LNux`x B9p`?<NATONu??<NAXONu|g$//??<@NAO JkNua\3jpNu// &H&g??<NAXOSb&_&Nu|b$??/?<BNAO JkNua3jpNu0<`D@| |"b;NupNu   a /a" g p/a _Nu// &PR<e&/?<HNA\OJo @!CCr "A`xEv$R f4/< ?<HNA\OJo`$@Ap !| %H$v#vA"P` )d I"Q f`rd ` #@#C"nA$_&Nu`Nu/ g`$HQ e&Ar"P`g I"Q f`: / ?<INA\O`, nf$Av"P` Q c I"Q f"Ja$_NuH8$H&I(R"l f &)K`b& Ыeg `p&)K`h )ѫ&)K`> I"Q gb Шeg `> & K` +Ѩ Шf )Ѩ l f $/ ?<INA\OLNu/ Gr g/ &S?<INA\O`Gv g/ &S?<INA\O`&_Nu/$gSe40HB4 gxH_>"&(*,."B$B&B(B*B,BH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H`SfL||0HgS@!Q|gSAQ _Nu//4UB|"bBJ@j < fD@-CtH@B@H@&HC;0(RBH@B@H@fQB _&Nu3!j`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZgfSHNuJgNugHf8g@f0g8f(g0f g(fg fgfgg!epNupNuJfpNu"HJgJgJgJgJg JgJgJf SNu"SefBJgSf ANuH0$H|g|$brGgJ3kSJtgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.G.3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"jp` 3!jp& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!j`0123456789abcdefghijklmnopqrstuvwxyz|A40|NuJ@k|A0|NuB@Nu|A0Nu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#$HBJBf$HBJBfNuHBЂNuHBЂNu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu"@$jDJjD$HBJBf.$HBJBfB@H@$ jDNuB@H@HB0B@H@$ jDNu A"B@H@HABAtҁрdЈӁрQ$ jDNujN0123456789abcdefjEfrtXXXXXX: illegal option -- : option requires an argument -- dh:o:l:s:p:%s: no match on CPU type %s, default used -r%s: cannot open input file %s %s: no input file %s: list file overwrites input %s w%s: cannot open list file %s %s: cannot open temp file %s F:%s active IF at end of file%s: symbol file overwrites input %s %s: cannot open symbol file %s %s: hex output overwrites input %s %s: cannot open hex output %s ERROR SUMMARY - ERRORS DETECTED %d - WARNINGS %d Fatal error - %s E: WARNING - %s E: ERROR - %s E: ERROR - %s '%s' %8.8lx %-15.15s ???????? %-15.15s %8.8lx %s ???????? %s D:cannot allocate string storageexcessive number of subexpressionscannot allocate symbol spacecannot redefine reserved symbol unable to allocate symbol indexP:%x:%lx overflow in instruction generationinvalid char in instruction generationinvalid character constantundefined character valueoverflow in polish expression conversionexpression stack overflow???error or premature end of intermediate file%s - line %d - %s%-*.*sunknown intermediate file commandforward reference to SET/EQU symbolexpression stack overflowexpression fails validity testexpression exceeds available field widthunimplemented width ERROR - undefined symbol %s %s - line %d - ERROR - undefined symbol %s WARNING - %s %s - line %d - WARNING - %s ERROR - %s %s - line %d - ERROR - %s L:ql   !!   !  !!   !                                                                                        "                       "                           """"""""""""" """             "                        "                       X:%s F:%s L: Overlength/Unterminated LineE: ERROR - %s at/before character "^%c" E: ERROR - %s at/before character "%c" E: ERROR - %s at/before token "%s" E: ERROR - %s at invalid token "%s" E: ERROR - %s at/before string %s End of Line"="">="">""<=""<>""<"Undeterminable SymbolE: ERROR - %s at/before %s E: ERROR - %s - undetermined yyerror type [1=];[1=]y[Xinvalid syntax for instruction[Xinvalid operandsD   $)19AEJNRUX\"`#e hmqvz~  %(*,-.0a1234 5BCEF  GPQ RSTU VW5 X[  \` !a%d*e=@ @     @ !"#$&'@()*+./0123 456789:;<=>?B@CEFIJKL O PRTVWXYZ[\ ]@^`abcdefghijklmnop@qrst@uvwxy@z{|.:Kr  {@@  @@  @@&2>O[r@@  @@@@ 5 LV@@Zdht&5> G  V `r{@@  @@@@@@ @@(:NRV  Zd  hrvz  @@ '3B  K@@U_k  o@@y    @@=t"Pu"Qv"Rw"Sx"Ty"U]   51 ".+$D%l.g+$b%:2`kih.e+$%da_6=A4!HJjKcIHJfKcIHJKIHJKI~HJKcIHJKIHJK.I+$%.+$%C}HJKI.+$%HI,)?'(HJK&I,)-*'(.+$&%,)-*'(.+$&%8-*UTPORQLSVMNWUTPORQLSVMNWUTPORQLSVMNWUTPORQLSVMNWUTPORQLSVMNWUTPORQLSVMNW,HJ)KLI'(MN&,)-*'(.&+$%@-*UTPORQLSVMNW,)'.(+$%&L-*9MNUTPORQLS<MN,HJ)KI'(&,)-*'(& -*UTPORQLSVMNW,)'(&-*,)'(&-*TPOR3QLSMN#/07;>BEFGXYZ[\^mnopqrstuvwxyz{|HH$HHHHH HHHHHHHHHHHH-HHm:* ) 'HHH &HHHHHHH%H#HHmH"HHmH!H~#HHmHHH\KH01ONJMKI     H)      *+-#+**(**@@@*/+- %&"$'+,,,.,,,,,,,)*+#/@#,#@#@#,#,#+,, ! Z[\] #$% DEFGHY"IJKLMNOVWX^C+,-.0189:;>?&'()*/3456<=2@7ABanddefinedeqgegthighlelowltmodnenotorshlshrxorANDDEFINEDEQGEGTHIGHLELOWLTMODNENOTORSHLSHRXORaabcdptrpcr0r1r2r3r4r5r6r7AABCDPTRPCR0R1R2R3R4R5R6R7invalidACALLADDADDCAJMPANLBYTECHARDEFCHARSETCHARUSECHDCJNECLRCPLDADBDECDIVDJNZDWELSEENDENDIEQUFCBFCCFDBIFINCINCLINCLUDEJBJBCJCJNBJNCJZLCALLLJMPMOVMOVCMOVXMULNOPORGORLPOPPUSHRESERVERETRETIRLCRMBRRRRCSETBSJMPSTRINGSUBBSWAPWORDXCHXCHDXRL[Xnullentry[Xinvalid opcode[1=].Q.2+.f800&-.bI~.3}.e0&.11|;!.ff&;24;[2=];26.[2#]|;28.[2#]|;25;[2=].8I;34;[2=];36.[2#]|;38.[2#]|;35;[2=].8I;[1=].Q.2+.f800&-.bI~.3}.e0&.01|;!.ff&;54;[2=];b0;[2#];b0;[2=].8I;56.[2#]|;58.[2#]|;82;[2#];55;[2=].8I;82;[2=].8I;53;[1=].8I;[2=];52;[1=].8I;b5;[2=].8I;[3=].Q.1+-rb4;[2=];[3=].Q.1+-rb8.[1#]|;[2=];[3=].Q.1+-rb6.[1#]|;[2=];[3=].Q.1+-re4;c3;c2;[1#];c2;[1=].8I;f4;b3;b2;[1#];b2;[1=].8I;d4;16.[1#]|;14;18.[1#]|;15;[1=].8I;84;d8.[1#]|;[2=].Q.1+-rd5;[1=].8I;[2=].Q.1+-r06.[1#]|;04;08.[1#]|;a3;05;[1=].8I;20;[1#];[2=].Q.1+-r20;[1=].8I;[2=].Q.1+-r10;[1#];[2=].Q.1+-r10;[1=].8I;[2=].Q.1+-r40;[1=].Q.1+-r73;30;[1#];[2=].Q.1+-r30;[1=].8I;[2=].Q.1+-r50;[1=].Q.1+-r70;[1=].Q.1+-r60;[1=].Q.1+-r12;[1=]x02;[1=]x76.[1#]|;[2=];f6.[1#]|;a6.[1#]|;[2=].8I;74;[2=];90;[2=]x78.[1#]|;[2=];e6.[2#]|;e8.[2#]|;f8.[1#]|;a2;[2#];e5;[2=].8I;a2;[2=].8I;a8.[1#]|;[2=].8I;92;[1#];75;[1=].8I;[2=];86.[2#]|;[1=].8I;f5;[1=].8I;92;[1=].8I;88.[2#]|;[1=].8I;85;[2=].8I;[1=].8I;93;83;f0;f2.[1#]|;e0;e2.[2#]|;a4;00;44;[2=];a0;[2#];a0;[2=].8I;46.[2#]|;48.[2#]|;72;[2#];45;[2=].8I;72;[2=].8I;43;[1=].8I;[2=];42;[1=].8I;d0;[1=].8I;c0;[1=].8I;22;32;23;33;03;13;d3;d2;[1#];d2;[1=].8I;80;[1=].Q.1+-r94;[2=];96.[2#]|;98.[2#]|;95;[2=].8I;c4;c6.[2#]|;c8.[2#]|;c5;[2=].8I;d6.[2#]|;64;[2=];66.[2#]|;68.[2#]|;65;[2=].8I;63;[1=].8I;[2=];62;[1=].8I;yacc stack overflowsyntax errorinclude file nesting limit exceededcannot open include fileC: 0x%lx noncomputable expression for EQUcannot change symbol value with EQUnoncomputable expression for SETcannot change symbol value with SETIF stack overflowELSE with no matching ifENDI with no matching ifmultiple definition of labelnoncomputable expression for ORGcannot create character translation tablenonexistent character translation tablenoncomputable expressionmore expressions than characterscharacter translation value truncatedinvalid character to definecharacter already definedmore characters than expressionsno CHARSET statement activenoncomputable result for RMB expressionlocation is not bit addressablenoncomputable expression in bit addressbit number invalidstring constant in expression more than 2 characters longJJJh >@H((\    2 R(@  $ F B~&* >H j 2&> h2 ",,* P * R    0 * XD  L .N B   $V      DZ    Bz $ J<&.>D < ` 0"  "   $,& & ( ( &"00& (&& (0 ( ( 00000 $v ` ZnVP. 6 .P>J4^.4 ~(2 8X-|s#~ި>RR-DgYCHǧEET*#ESSSMS| |ZCDHoƥw[>8MKgRK䵤j[7M/@"0C:>lE"8=n~&[SF|^>A4_C[3Fn3(T? )J ”pT8&)!O??2T~Z|`RzQR*ǔʴrR9bBxh'Oa,?AUTcj*u4u,u<5::JW UUJUqUjhձUU'NUqa~R_\o?ZxtSF=Si,nL5V5cdhӍ'O5)ex*5U5U?Ոrt驓SGGGSGm<:ucG>z詣c±cʱccU5:vرcǏM;yԱqxqxO?zǧ<~xzZΟVSUӍSGMaՓӧ'''S'N֟l<9uc'>y䩓S©SʩSSUO5:uԱSOM:ypF iTeՑFVIO{ZO(ZGb|O[g鴵:fua3:Må*Fbd'Gb96W!>.m@:;iğq;me ӈb[D4жR~K\\l2m @N[ Q&h*.GZ\ (?W Q~U=\[Ӝc*Mi(*P~BJK[5MLV5ӫ*O-\i&zD-r`ʢ`,B`,LArc's PFX 1.13P 1990 -soft, Markus Fritze g.h` /H*@"m mA$H -(H!!!!!!!!Sj JC pl QN , HD , p,m:<0r Q&N~*6<Q~d So:Q` H"CAD@CD@ArTApAQoQ`&-A& LA(HJkf&CH"grאg<fA``+D +E+F.ޅR؃+D؅+D+VC m Sj mJfA, "gr/r$&(*,."A$A&A(A*A,AH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H`Sf"|`B QL gpNޭ$-lz5-KED:\USR\ZOO.TTP`+@ Yf8#wn.y{.(`BzH+@,xN Nu op.@/<zXONuFatal error: insufficient memory H88&o3)#J=.$f # .$/ V$ k I($ xĄ +" DXOJo{ng(k##{n 9RxbV8;N@ *4>#Y `F (`:(`0I& 䀒J(l k#ofxkk mD.k&BD// ??<JNABV:/8 <(4U;RW.Y0\RRBBSm\OPW (L< J:c .f6_`0H?,LB8\OJfB@HH@A+LRJT`PE.e0dL1&)d$d/V;"BPO C:c/1@N.g4HnNXb CJg0{f:cCo?L Xo0eXO8e,c= @ gB|@e@$/,fVu@f @$Nur+bZoo: %sd1Hw?8h@6|$Bl@ ag$f`AfRB`rg0\fVFPO`xr/ Xr&POf/ rwB Hn݊/V)BJBgBg`/HnV/ "*/ . >?.Xt*b@$(`:*.*C0,.@Bg9}fczB/JDy//V7>@.Xfl0ȅ8V@gVRK{/ / Bg/K8B$81ۑ0$@ /"NB> `$PbjB ,.pxrVrL{dTACurrvcommvforp is: pXC8r(aJl$x,49LJ@g0{ POBCɐdl$BGSk S`R` / ~<XO* f @ gJDgXO,}taV\O fx`BDRe7JDz}غWTA/endNVj\@ Pa*)`BD"Bʂ0xq U,H (Cʃ%@ Bj$F Zb\ C RJfD40<%@d%rf0`/2B/ 8@oP|w\OVF&p>@tp 8/\"Ȑ(vѓ$ؚ7 @BDJ&C6@RvcCRGnCr"XC?}21}"<4pTOJBfR` b0`0pBk00J"=kHB^3/x(x*x0x,3t0 82BB23 C3|2Pp B o3TqErrreading inpuile durpression. >6x,<1$y}2Hx*{vfw1{v46SC C&xX`0Y4]1fBQJEf@(3Ťtx&01&@#0@L|l`VC0v)` nf,C"Ҁ yTc0<`61`*//2#6 @ ?b,r2 S4/ "o2PU740AHCԆ !'2 ?2pLOwrit0/g@^8g "H/d*( @ꊹVI/O ein lzd:rd?_dcode^#^8D6KLA^ Cc`D^4<۔C """A AJBoSBJBn "ZA0D/bFGXBB@#BA`@@60htDi@Ha-/P01t|NuW0eeKwru@har. n9!Ae|!AVf {@`( "VQ,Rc/0@S}g/"`6+9HF#N/`/r-#RQ<9R9޲'H a88a8HZE2PAA0U Z~`ba`1@Uebacebzacebaceb?a^c ebac bP)cLhozjbefcbd`fcrt`*sNr>tZ)vvsf3sy'p"f~Epx >t[v0eebefcrd`x>qfbv aefcbd is9rwHxTqFbv 'pf gdEp sNr t[q0bqZ8TyaExtba2`cP(r3`Z(@tha`q(t p t Ep IdxtbF qtc f9raHvŐ tb̑Bqt!  pd0raxw( gc a0]8L^I &nA"#8jff$f!Abd`I=Q2/ / 8H9P tN2@/!W "fNUtj!Afe4S @^MAto<ሢH00 n?NuOutfI()Stack overflow2<0 .-8ZjVP_bSx^A$#} 8zԅ#v9T#Ȍ>f00A/BFp`2?<@3N?< Ԛ?<T9 \OR BF<8f3fT۲ yдAP`/gdzS A[*R/__G_oo~.o`Zд[Qa8fzbchf0 f:4R@@d(0HFh @bچ`4Xz`Ha8b̲t @ {`,Q8f|6 •PO`CzFglRcӱd YZcv@?Bҭ~r.Zغfxߊߜ߮or- 3ӱ"@:AUb*P fuS[aRbr4RbbO`L $<?PÇ3P"4 >DVhz hh>,*4FL^(p`F / /2(. q.T/f/x/ y!1cbt '_(p [a Q79cB4RI3 /b!A V<9dK !9-ZbH?ez=e`Rc29??OO&O8OJO\O9$-šc2Qb~!1QR:4RJb mwnBH`VL 0bPOR`& kf`&4rT|drjwTq).2aFpJpLTptJpb[N^qg64rTrs$'x2'wfzBB\x_aAfrTu^pgt8vCoJE60H$/3(e 4`S`JDghf&pgX{?^/3c0Pd$@\OG`g$ Jg/>uJfzb`.q.p&0e*5`ArRCCn^r>sSρ0~A.02H!.,B/4O"@|cJρ8fXp@1.4.4r>JG,f dXO`V.4n,*Q EvL,f1/&9H!C.08QCould not get file time a` 0$n (p"WQ)\[\OZ)&0w*3BSBR`D^P*XR@@h2'At aA42lRAA2P0A6t v@6@Ȫdzc$$``Kb*Ԁ-B^PeV$.fH?{0a2. R` JA4~ jBB6KC:=@8~ lD:ME?<FF0@N2mOjV@S:H.:p2n0l@>@0f0HH@N` CpI/g`?QH/0P6Q0< L2T_fW2aA E2/ ?c(\ONue?<:a()p(p,.*n 8.SDBUBGJET T RJfDX@33F$"TTO Bt{b> Bg/Bg*17aGTBgB&0g7&PO6/*1h$h-^pgPO0L߀߰InvaliƐumber %sِ a ot&2:R1(f Ђ〺:$@$ |1lfJg#f.8&7l 9=Z0( bJ@e J(:gpV8o B0@ju@T@:@u`B.t PHn:p 0BUg \f/ޱneeded %u bytes-:PJg%3` 3&a28`"tρTcB4<Bc4Bb.v6.gRΚP0PP4A4@j03`1^4 ?Wr3*KQr2Ҁ#1_2:# @6b$P ?i¶29H!3f}$?u0g~4yraPݰA<\_pW0b0&"NAT/CT;!H0p~q4`/ BFXOgJgDBBD$@Pf/ `"(P `"KAnsBC4ʜ:ֲbxڐ.zch8`@f{b4dPO`yRA`xTSdM?<8|*_xm/h,<Jlt6<BDBA0J8B^dPeNfJAg PnRC`RDv(ap3MXBDp.V`0H0r//bl6`D\olm;RSaTf`W<Ga˜bRF/Qp:@bb N/.Nq8D؂Ozq(9FHҰRd"n8W"G8PtE$~Pg] zXSJ.PVX2 LNulastptr: receiv 0null pointerSp-$R!=xrY15 Sxw+b9BXC.NEWケ8XO@ @$BN,Hj0@gC TPRrԶ=0,p`rRJRK@P4`OH@R @0eq }خC\0@pr(ቀBt;JtT,~0|RHrHl H P!wBADIAQ1 *!v֎Ġ> B! B̈G!Hnzqe2C1zA#A4@rg/0B/!pyBt"J("gwt*Rn>}`Ff0`M2B/ ` &ppez~hpIp?.N%@hphpk !!B*@$Bj(&*fr"g*Thp#$hp'!?5@(@Bp)T*PO&մp/9*^N4jp=J0g"IC?*(Jz[!nC><*(Pleasee theanufplete description ofs.)Ǔrmean|M'9adn/|show`name(s)rlistingcupdaڂnt.| A!ppoly gc }DdesIt"(|f&/\se,xextract)| dͣ(toog!j. gen.[/countonl,L,v,V[lQ.| Erbackup af p`P`3frf%(no/ress)\Tͳix`ostamp;Mm=oQwhen%` (oinal)u!Vne9w*| nAmnoհlreadyrUhns ;N?e夠oaNo r- Oon}'հsk "Owrite?"qbe quiet/ipeصϲarHutpuó dirP./,//㨤ath}.<}currxpI!}yst'C?m CRC valu+/ |ble/dis/ڢSN$΢@4ڢ%@^ rtat p'osimCD&-O*y-h>changbcm>hhhr-߸tho<887 t3{j#&, Dl:_E 1$@ PHf / aXO hg|HHՀd0y08\OJVj- p> /1`64 J1 RJfDrd BX`JBg Bg7g /g!fMogg)g]g@ Nvp`H?A0!8N"&IpI J6D~6G~ o`6O~ fBjffvf6jgfH&qApo gg0 -l,plaYc1Wifiq2PtNd RnPO,%Yt$ǧRfPұ,ߵiRhP^RnPߵosloVdefaultRMP `O(RcP&<}each&+edRCooa/`olc:PstpecM~ [`PyVRqP(qq supⲞpwarn(pq^?{nonflSro-)RPPhQ*t"ԧR(vpa .bakl,PYP*itysIP0zNinXЧR+PRqЙsMXsc uiQ bdx奨t(ign"ys.vaakbsolulQr.srQ /etc/hos&zbetp.ys:subqpcy:anee`Piirseq[ueMa:/yrdbutr€Eys4vR\,R.B*V*tn. U jwith x]NxNqRp^P4IИvooid hzerROP*3Ur*hǧRSBpercY(O)UlF乵info LFQmm`ipacPvFbo0SUQc V+Ped2SvP2(s`QvbUPrd2LWV3aRaUҔBv(жysmvbadp׺ockp4vK)shnІq~SgȨ¯,cʀm21[PT (LRqf vSypcdppQpx(73aQ":gP(яAPQbsetsũp4yWEraq v`p"``Dc:bsztvPex T ti'ptampPjuaƒeDчopy]pZd3[deA]QeUaQeWnXRC souڠ}d `9U"part1/*.c 2<docua~c3h!*. (btջx!gd|: a !s`ȴCX`t^P%{p!rs.l|oAnpDhQvbrbu L /xxx.hQ/(hQ..%d%s QH00 .=|RgHn3"a/1[A nnG3JgT& }pDAr4.$SXOJwg&/1aSBPf`/ 1\OSBfBbhXKJf2 L LQHRETURN (pENTER) key#inue...6@ 02Qb>XO@}GSk SB@R18!XO* f @ g4 Bf ~7 B g  fL NPr+bqATnwed. .rb%L(%[T %-*s -- Rqor (%2d%%) Td+ bH0@5I4 Nhb -u1 Ppܠ`m!PP _A!PPH?Qql<$@>Q4H@g"b2E=(=CjPO`J0fHF(XO`x0jJf2AB:Pf>QFմ 2E$/2E& b BJgRHJffBgDv">Q\AJu@f8\@^g34/mA4l>Q@l\Bg/9@/8!8`D Y/:QE=EP.0PHnLRT0V0XRo-A"\Ag6bS>_?.V|PX2E+*bv" mC%N?<!3-@wrTO\@`f,0Nv"HnMPP/.#Ao?. !+0p*:-EVSzPRQg!sֺPl`PlAhN/~RNXO/5NJ@f$a.c5dBfLb -0g\ npoQA/2 wTlX@8he12.pH"nr#RPn@0a~a-qlaJ`fiB`|Hn@jcv"he=*@Af $aFeC`^ސA`ְ`VHwi>p/ !)Fs+-@C`vR :t&bs|Pb$aPVjb2&u.PvrbbW@?MQ@0D0F0H0J0Lu/YJZb NPb^4Bg0|PJ|PL?[.pHb @^A=AZJ@]0q`B@\@hf \@lgBJB[g>g(@Zf.JBf5Wlf$,,>@(PEvv"g2rEt%;CvEt>n@ut>rb^>jgJQmBn:qB B@bSPfC4jf/u0X@̺$҂R!?.~bp3``@82>n@lrP.P/!q8.` BP;C\O6|`"`3Wʐ@DʐRH 8FpN$QR7nvJmgpP*cR$lAFp\pq>@֣.qn@ -Pn@pg~``=]p~So =nHXJV\@df$/.RNbtԪpM, MFBG|`bo8lJ.G4*.@#f7Hfb&,4*SCtbs0,.>.n6\NR"Ҁ{ÂP:.DRE=E=p2w.Ff`\@\g cAg"0.=p@b*3c6`&LALI\O-R1-qQ!P*Tnt|ù0gJ4Z֧\`LS\O-FZ=G^\@fg>9;f4P*S2u gb҇ qFf2ׄ `D$ΑxBC`{(@<(*n (n*.E:&n0PKT:|ΑJf&J*f2*0Ae f<jd:8&*gRS>l|D!u3ErAal3m 8emY1Could not-00 H<0&o:/bDp\BC\O`t0H$/3(-@""BA<"|1 RJfDR@:Jg,CiA6?; Ġ `B*_1;L\81A}A;f? Jfp`DA%;ݤ@0 g 0 g0 fB`C➁;wg7> c;XONu/ $o$ǧpOHxsTPO06\0Bj5|z@B@0BAa0A 5@4$_NuGention count musfenzeror+bArchive gGlimit i}sw %u Ons onOBff14write to aC deletvrunDVadj@w8PAnoI Zoo: Noy matcheydfPackpPPdon|APuxH?}_ BnPPՄPPP~BB*BDgzxvFT60H `of. co>oPojDlftRqx]xjd.L,XO Dࠧ`J`atJDf} fxȢ&9`k`h`bx`mZo`mDG0RLl4H`db`Px`|0Pgn01g`0qgo`RP`&dp~`H?/b=*POfr{)4</HnT .lЮpPO2.)6 /r$@.u?D/{JB4Hnn:)b.vfrGsa&9`fB` 0.~@2=@~9A"tǚB`fn~bΠDf xX; @Yl:D/`Ɛ;P| .E:*@//b PAz hzgBA`f D۬fg0JÐf vLmؒr=AxtԎ<XO B3l /7VZ|RxYJ28Vb@;2/up<n2Zp`TQlN2PPƂPz`=FR`nR=z (Hxyf${@ h @7u&9/اf2>@u:`$C/`Y$t'zDNԊ^~g=u|ؒPb f6.ndPy(<`munfrUp0<=@ V &=$pgr r n3)n3B H HHJ@n#&%^J`j=N#!&XO`ozLrrofl@.Z" A/+$`0@. |BϠ"h$%tJE2` F0$'&73ZA22#|$.@uyBnBafafRG63P;`3@pA`kd6.<fF8S"Bgi/8 f5*&n2M/9ܨ,$?겮eW1$J2r(Z~G -!&h ,$*ԥNn\O!gaآrp.f~Cv 4Xxf@YN`<g&:|l2G,@Y4-#T Ohi >-#L7~Iܘ%*b& !":5BgX,$#QV`BBg3TO`tZagtZ`a&32A`F2@}n+jDި6|Zg0Ysc40oR3w|$i}/RGfKb.p0rg;& `l}J\Opl$ /,$ />X'ONuԫ~G>Uh&000JanFebMarAprMayJunJulAugSepOctNovDec..,.zoo) ս ;s %*sLengCF Size Now DyaHTime8lu %3u%% %2d %-.3s %0ʀ:Ά%04x2dg --CD*s灝%03o ??Z* (V%d.%d) --deleuGeneration limit %u off)uus D:uTher?e is 1N`Qaasu:has attachcommentV: min_imum Bs0of Zoo need thdW*Mire?ctory may berrup#ʐ}(^}!dempty.)g*d:u>^ M 8wNVN6RT4ฌ:4ఌ84਌4`U$44r.4ጰ*`|(4`t`n&`h```ZRLl r璠4(PH?RLJJg R,g#a8,!0W@=@"HnL&TWB?<Hn@/;?+JL0.JHA(hg *z-Ee A>BBR"g 4.Yhr80PcY4d(@P^2-/]!?vsXfHa`Jg./.K04Z/_s/ NE bg`:Rg2 Lef >0c".H4JPګWfф0aC *z#./ Lz˺t 2fآMt ̤V ~񮌰R0g *.H01 .gБ"J.gg>XOy :4::nwRa(0Д\R2o=u -аBp@nQc ^  <`G2I4B8_D: i<FFA?=A6C82 2$f:rҎjgp<`p&b"@ A*gOA RJf߈D4&f gpNBl ⲹ x4àgf&"Sq3XOs83կ @jP40n7B|`No@$v:96x3jᬲ$b|$rrc4NPO??.?JDg:`0PPHdH@`B@?0@B&ZO/ ?$(R¤HXFHXBJ?җj*g.Rg,0.f d"pg2 ` pB?T>+g>2~%d">B8:.xEt 0Qym 23N`fo҉<(0bG23'B1t4Y4B?ԨA:r@okC?rE2 fvf fe4BKb4^(8f>(B8QoB`>f C)TF-Gn8H 51.r( 1S(Z(@3fsqvXPS( 0lA9Q8fKL*\OBPIrOrpJϮ`lhXb2vOOOFuC@ &*`2Mg@f $qr +%1d~r/4/Dg"$JBlVBBHxsTPO@0TST& J@v# ` DPr7F$2c.bakr+bF%lreadxists. Jor use PP op/ould nOot cpt+'ora%vseekԑdataFWriqoxpackT pfaNss mov$Renag errorҪpP!dninTsgk,$q_Bn B{oBG:1gT Egn.g"`$Pgqg `RB`*R`$*RM`H?110\>fBJJfDfSBPr|/5V,7"FoHngC#` @`6JgRHJfPr =(POf/!Mj/+-@/+? .Юge>̀\O0ؚ:IPXJBf,$/»4H</Pr|B8"Fth @B54P`K2wx=&o.g.AM2.A*p0 D!@r*!A 1nΠ`y/&Rl@l7g(Bg9// ̪ g/"`NA,0 b!P/Lc,`b?<Gt{24,4G#c/rg0:X]OgfTOgT(@f6¹⯑ꇄ ̀ t*$BE@ -BH gxx4j*⒐ N0g*t.Sbjf Bg3TwO`njgjf0ݪ男vӬg`2(ȰGb fvʲc >O?=n<Œb]t||"ar RbANNg*pfpq`uχjg,˘|0d@bMķ ¹`>`?.?<*bl аA,1mf`|&"a,t3O g at';tPO*g ~ h,XO(o4h=6}"Jn CP~J=GvJb0%`a2 <.o1G20 C~/1 Jc!bt4 90o=A0"0 R}@!66>+0kgx> dCg&tRCCf=MpJ=|v0o0 > 0cN0.B@! :X4R1`a40'02@Jb"46Id@%91Ie`38s00v2h426JgZrJPf(2.!:A&BsFALA0Rn0ng2! @7`jI&LSCfZ@3=y^@4bqhq @\l >op!<2RP`2ҁ4̐`®@?0("aN풮ANSBXNu17002GBBC0!Bp0BoBCt*YB00h@SBJBnJCgLFAaP4BAZnv: @ZL<\RX0!$@Bo,T1n2RC2H2|Va<07P/d40S2I`#PBBBo$BC0Q"ہP0B3RPR`n0$>/,.(o2&o63A#X#Q<@Z^ CHhS0cxR\J@\ qBI`P7Pg @Z:@RM3al351Cni bB^0BZVB@6%blQ`CJCo?uߥTOSpns#QxR^6`tS0Ss g4qPb쵥8{S:RFo4H0c s2Va:7P1`.C1(S1(TOvVs?r/ / ?ᦦ0L<`@80|^@d02Rq0HtHl2<Lo0AJ1fSAJAnҁHojFAo\փ,@fIׁh֐s3倴8pJ-fRHR@HnnQ`$nRR`fRQZRT` Tm2RFL߽PH80FJBoLn0BiQ?9 4ӀXOJodFAn*RJnw?`riA?XOJf(`Jː@JxJl0 ޑ֒AJn@>> O6G> Jl0CRE0HC HI`0@RE8RE:@BB0 gHRB2=8@ JaP2n?ԥXicLpB2ki> A?Bl`0ĮC{zf@ReBFrg2\"7QF FՓBfB#8F`H@`fR6 BސBbb`VRrb3ׁb@^AS@b%a^BaPzZbQq0U1A<JlJov“qwf~ k f/4<Ph@IJR`Af np`0ޑ쓟8̑TOJf6`B˒SCjJnMnSij֮bă ˂<0ND84Ah>:<cG"{"v:PCwfH c`ܱo42<HC0Ag 0S43P aPIܱn@0 BLFJBft`(Zf4VB`QBpBk"SBj`ȏ8mlQGM x < ެnfNnpB@pA7NQjQnX_Gj:v8grՂCg 214I`` 4$KbܒhAaPBS80TQ)8[\n c<6w//= 7Ɛ%:TOJBgpԟri4@TP5n`K_4fv#QAR2Hx!AMNP1D.HxBE$/<D $J$AC4Āf/2< t$jqp cjA j?c^#q(rQ4RA1` AcCBh?2<@BEppch><2`q(0@$B&o38q(t.B2A&c, "F4178a5x15;T7CP Qq 58USBqmUS$5Kq,c*(c2BD4C@C@:H S82X5X3H*S7H3*B3чq.Rqq,2CBB4$0A@A@8H42H5H2C0S3oPNR3QR|&q`*qptjQ(q<Q*RFF 0HC0f"hq4ԖDU`fc418`>0A* E1=Pt3(1mC 1C.R}D`jQBGl4 Fc 4<3ƂQ`&Tf04v0EO3łQR*,7q,m Ts@2$HwЁRCb`Nrc-@&<2LsS1 1OtC ^cDD?nD`9Xee20JA{lDq$AUmAAl6Q>G 1ÇDm Bp"eCɠ< d0D.tA1KHtLPbxnLC҃.㿇 G80-2%P0:¹j5`L. &G831P835Є 1Bs"/q(76xݺc E"B}g(z@1XO`R,F@M>G ?T^ο(457HXZlΡCCC4ɂa4϶ʹ4fbDɌB7 C0BTߐfxߔ{B*S60b7L. $G62{71P4b715 SEJEnn[!*a"o oP/ `2S@JAn3j81`#8/$oBBBb8k.vr6R62_PR@hh6RBBg,Pj֤!X2f Ab1xf0`^A3R420BK0dnPXjg~`|660&oJJgJf *fZ ? n0 *g`0 [gD0 \f_RJ!"RJ(!gJfp$p/ RK/O2POfn$ p`f *^fj B@6gM $BARuJ .."]g&0 -fRJnH@o`P!frHf ҶAgzRK!f8 B`:" 0"B!"fB@ Nudirectory stack overflow 6`@nВ@`T@xTA}0@mpB5/581N/~BAN(p[INpZNQN,XBb@R{/5Q&*_fPV D C"HA CHp&1܌FSR@$@:"D Cfz@ CJg?RHJf:dQGn` Xc:cNPG߀g ef/Hjx"A JBfOHxRg#isO/80QPzq `Sl:go`c [` }B/.0fָ1/0fF\O $#Ho /v#$q#")NRJJg2T/Q/. 4 0B-@=|Bn-|B.Hn@R? nB֏ "PRJ!`fNu f S PcxJ1t\Jϰ҂u0123456789abcdef(null)ABCDEF0 *,@-|VBnB@&F@``0%gN;\0gWfBD4|BRHzxb":;NPl~$̭6k2_:RZݴJp< `Df=]?lDEjfb+fR߆&F * 4`B @ft6&F0Pg0@B@4A"1gSJBls04&Y bjeZ~&FRʱзff=BSfj*fjf jk ITM=|BPDd@ ]`00@$lD]b-v Z f ]6 ` ]0b`2ޜ$vm$v(]uE1PPAm,6J/ Bg/ D JgL=@: pb=J Z L = CD Dϲ `*vfgJg@BmD߿(NJfbBf b H@4@B@H@$&n3l`$6C-K/.a$_4APOP C* 0g<0 2 AA6.AJ CfgT[C=l4@0 0f.JEg(4 El c&X[RB&m‚t844,04&FH3?q)0 f#uD4&࠴D⠰00~SBj`bSAjfg&R$,08D' `",r RR/bh" `XQ&n-njd$!X!yz N8p~oDBF`%fzov4Wt hf=J`=b>@aϨA:f6h"nhc +0f`b K`g. ]CC0Cij6A4CnfSM? HTOxxwb>8c?@T*<NVVopITVHt rDfVh5BB`t` t_`t GRg$o>fP7gJBfDGx%LfTx0$ 0oxxLgxQXJ vl JGf0 B f*x-LW>G@x+$  NB(n?#@n,B8$@PgofZJCfl`RSChgP"J:B/ rPO"nD*ځ+/#PBJ@*nj$U u!D}"0hg$Px4?1r"4*34dP6bE#RK~^fRK`$p]P-?fB@2J@gnNp0`<g4`4*2AmUJAo B@RA1nop`1W@ۆ1fB`2|*3JCg2?Q#\83`Np"0b0"2? TOOo"SCg6KJHNp"2hZBBR`ZSK`BP?g;8vOo<`Lf&K"2XjRK0n[l "0dXMm@N*pd8" B"CBgB( g\jDFWdlPFWe4Joh 6BAHAg0H@2QQ`vҁрeRAQAPjDJ_P& $Nu`x)"TP \SL?lPA@@JBjDC@BFWHgJBgBH‡ЁQSZVeQ+gBd|T__4YVYUH<0z/PA\O&(/e L <a80x/k&Lf`ԗ/4O8_J@m` *qHB@fw` 3$p$.XSTH> *%Dv֎/~#??bCNA4POogx J. m@q|NpR{l*8@VFsqfNPV@ @@DB3"s1Lo|<"B@` @tdP-W8ERr9aJ@l D@3tJDgƁ{F8E0rpp>[<&mqf:,P@ (8Aw^qf f,A%Hn;B$p虿&j! nk@(@G(vgʃ8F`rB"0!r "qr Lufatal signreceived`04mrf nl2Hh  pWH *J2@ۂ?"g ݔVgTqOaԑ찡`gɁ!t`?.~ۘB@TOdn<0(@"D"08E =ıgB``/s޳`8Ef1PO$c4pN/*R0&R(誀Ž <n&$j[ 2Gi&o/NAT`*NAXO n`~.'l ,ޘj| S'|\nL B*Hu"n|`'`4 Q1$q|/rP 0y`V{@k1'n6HBU/2 Ё/05ݐpPUOr%"tu<9r$@XGt68P?8@g8XOg&4 ((DCjXOt0p,H%D r %0@@4r.~@. p/xa)d8 yla.,6`z)d&l Jg:0oBdKLl \mtbrzm6n:b0`(TC*gqk~yg(*K&S·`3gNn ʢ +"BBz1n 2gr2`JKkf'Dޠ@f IJ/! xx؎ !#f2`lF2'ot6ʣB@f (`0ʢ&~2*`)SDt6(JCH0@pЈrGb.2ײY"ШڮƢܿn8T8w`zPf`pP`fP`\tPnRP`HP`>@:H0bШ&[F`@v{gwr7$_|$00\!0 &/H P\qkpp2$C gJ*T!Q$BB `$Cw&,RJ׼$F<0B,R 9oNARdZo|$S X!:p:0z(Cp"CRpVsΐ@dr{g2P.fi@ގ Ef;RBg4@?2(ڄgR JR1fJ" rm8_.`(&JRޮ~rd 3U0g "C DVs`V DBAgR}@No` uڜ oB J@JBg{pģ ΢..\9qQ &Qn>.2EBF G nJfg "@ Lԭp \ggHB/fB.1wrg$vYH?!!rB,RK`T +:>z(|TKBƺHP`VgtԎv֎Rpp`BHPg*Bp`BE/2X1|&5f)hxTB0NBD怤*o@ -`p$@\2~?z"jGf"LjVs3/4x/gA "*"<& L] *{dq"C`H2RA?g/  `"$ |4`J'DfJX : Fg:*>FVs0bX!/devLf07<0Hi!gmk4BdqXO0i@|g"KppA@v,HGQ<fkgv"؜!0\" &"P,(p+l $/gJ+f[ p!g^K`\KBg ` `u46R0f</dq0]y<* v+<>00\z gTOB)g(!p& RKt BBpn3*CB3,! g*F 0 DC `B6`/㌮PزQ*C\& ޸XBb| /"/Jf u`#4JsfA0 BC/@/4_NPONC^H`p`@0(v `2(AA2'PH"P v aH4(BhH‚v砀iЃ:px vnr- p|`G|XOdF/.|S-@xzV$=Q8m(&P:`!a<Wb bb8g DD3ľ<̣dRo/S&zO8+ab-a D@aY"C``" `nr {J{gV`<Lb`JP`HHA4֠Bpwph p""B AVs $.+b`a@jh(`nr(SkJggJӀmpbb`Jb H7a$>a`@a Bb` jb&4"Skg QBASd^p Bhplr :ufaF` t`a$Sf`Za@t  K $$fD z%gJfP . Z&caBpg0 @"Ce"SЁb @ rSHSISf` *4 ЃuBBp@gBAAf `RH4*@;yB`W@r:aa ( zBS" & 㹀Sxg IXIBhxȀ́TIBwPQjpCSppȀg BQ}zpBSdF>a0@ @ Nu#JC`g 6`BB z`BA496r@`60bgLn60+g:60ag*`~60tgBPbgF/l!ֱRBJo8bEBDL6áX>JlߐFTx/\&$o$b$/F 1'ؕ؂|"gRvd8*$! n Jf0<`0<@hj_$`PR{؀QJo 2P|VA?0$$0(@,(00z>1~6 >_0Ԝp(Kvpd $y dB',Ւ&5fΥbLڂ3ฃbPT\㶂gfڂJ2 3 D$v2à||g Jg gΦyB~|!&D`W0ؐb$g&¹[Ѓ2/ (0Υ;Bgj/|!$_A># i<>F&ZћgLfv} jF&. @,?~m`j$JFf| RDԫpJmm n,ᕒ`*4Г  8bvaC wJ`g6&`&{f 2=(`C( `_ XK$S^BҤx0t0R$CJg =gRRJJf8@fTg d* g$k&cfz0ò\BB3p`1fj $! `n0HJ߰g#RB!#f0T@,!в$*49$m$\'#!2Pbt#*#%Bp28(c lE`P0,HA߰6(00S@2l 4lV@@@0f} ^ؐ@4T < GWp{/QHPO2 @/<3Hyа0$ Ԁ$4j @431Ԁa`6 BpRn&b 8` &lP$3TPO @`PO9GtF }.0o,0%2B0 Ro{`0̀RB`9Bs =087T!.a6_0$〸pm@C#A`PH0`3p"g2-A@A0zPC$@PI#? yp2jFl6`n(`T5| Rj joBj>ѦR!0/Q PP?CRQ>п%E@2 jl_2PPrUCTTZBA XO>##5A A 0fx/6*3wzBSVpwBH06 <ڜBBA-fxRJgB0@A4B9nHB0`H?ѲTOB02@,of6 0:f`BA`no>oPobotk0!րRLog"6Pok!`g#D` #RL8q,rL2vH#pq x؃$DpxĄl&G('D&Hkw2oy {(b$n( {'0_tW`4ƕ& +{/z'K& XOQ tqzʱ/T7& qf80u3CRPRT0$<~$C6GzjPO"h$$B / "$n Jl-?RD?.ġƓI P^$ Qw0@?/@=@># R^@xBAb` MiNTf 3 PHJf輳PNIXMODETTYAUX:aux:gBBx1(dQ{B¶V(0 /&oNN\OA v@PNT3BN\ g0B/vAXA0Bwʰ?p"` TJf(l޴@g6] Cx??9FNA\/}81D31D"8BB&HE 7B?R6}fRR9~x1PXORB= BoBB!2H ЁB'BDotBRB^@o/y xE'b L萲yp/!B 4] wVBk}%wX I@NSBjBBH} 2B/} "02g8 r?no`&b88vҤx" L0vӜwV !0R&"G P6qwXp,!!\@'@v 4Jl 0 Z4pgj0@Pfbݵ!fgs] gA}0/= XJn Jf ` 0<`0<@h S$ J"P?B@R2< g #P.$b ] .$_` <%1P`%`.$Ʋf #XOfj7{jptԊt`jApT xpM2$0( X*gpЊ` $R~"؜nU\*. @,H?/HW$.0T/Hj  `<^ PO`nC <^RDFZrފ5nJ>0L|nI%nN:OpJgq(X .0()`4 #̀1 @<'āX G# g vsg0@3 QZ4yg D(vs!P1AP ^JCޠqXO$SR !ؕQ4`f "Y@` C3f0BS ( DE J`Xf "Xg&gft` Ђ$SJn&ւRJ0a|Ԉn ,6|`.@&: / l⢩Bghs䢠 `Re@""AJgh  RIJf p|^"J J p`SHeZ6@_R 6?X @TgJg?^NTϑ<>NAXO8l DDxVCkh C'nb0HL"Ҁ$op NpfJ7(ޠ0(*A2HLV0`b^0SPRN:lptty1CO0`consolePAa6撳b4p2D0$\Sbn"/g7AE洁Vk oePn@0n$ep6t*tt3q7u+q7u#q7u3p|R#pfu40:/$8VDjp?!Y P g}p DPw22]0T2A AWЅq~|??/:BNA&@~BF}^0n~g%QBC`vBG?ptrBJCg c0Β`@R k0< 8zp??~l 6DC3òQ$<>6|KfM,C|j4r?.~x /1N`Y0QgQn~PPl vS֎q~=8gBDC@\>G. gJ. lJGg x`JGfxJDfT fjnT~foEm6[ :<*m||А}{FLO0PORX¤R|ۀ$88fD$mTaXU1c x DlUp 4+VBTXRdX@ GY3RLAQԁ"?A!P 6ш1hG(U,x$` 3\0?0:a0SBJ@ngN9fRX`| Rv7:gf&JZoSKSTJP"Pn::f,Sk" D SKQBCSdv3}:f^SK.N g fUB4 D Ԛ$g4 k Jf֮" &fpr~w`PF$Ewc}Jb`rzK n*z8 BC4/Bwnj fN޴@2A6A4SB Bghf0 Q_`Tf0 `D0B@?w`f0?TC ?>RCXO~QH0uQ2oBBr\0͐O s!f$t f? /a\H֬8@\O`TB`RBA? zP= ܶ` NuMPw` (r*!gTA`w 0RA0$~Z tԎ"À^vƒ }@{c1$`{?2@.( | 0J?2gu. #na{` >HNA\OJf '@#no#HangupInterruptQuitIllegal InstructionTrace 04`bortPrivi0e Viola2Flo@ng Point Excep2Ki0dBus ErrorSegmentB FaultBad Argu8A to System CallBroken PipeAlar]@lockTerminat(@UrgQACondi=B?@I/O ChannelStopped ($å)E@@uAhild Proces-@xiAF;`? inputFCoutBAPossibJ`CPU oLimiCed(@}F0 Size]Virtu0Timer pB0ofilAS%WindowWE_TUser-defin@_S 1z_02ON_EXITSIGHUPQINvRQUSILLQwTRARABRRPRIVQFPEQKTBUSQSEGRSYRPI^SALRMREcURGRTORTSTRCOSCHLDRTINGcOUROQXP]bFSZQVTePROFQWINCH. bSR1d2b>0^ (/"&48* Ob/k?jnc~Z?@$&Do4&qIf) !J, R8HpRKS}Ԁt | " od/"lDn`24 fLZS"~DN"* lvg2vg"1Sm`kV `Hxđր?1BXM쮐~W20A VtbB4;N  40V@`,Bgzgp`FΆ`"1Z% C kMnfNATO`b# 5 H%TO o`xDHPO @v2(Pg0R@OoB@1 0H0yI(TO pBCҢf= &İgGvR!ڐ%1`{ :5BC?ܓ8D$@5 Jg1p^fJCx($Zv@z fv` .fBC`.= 4תb¦fΤ`|JCfv01 AAjg`%4Rn &S|/$w|KHKtabcPghijklmnopqrs_uvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ@^`{}~!#$%&'()-.H[E~1 %scomPBfo thh@type /END] N@AAā@ A΁@ ˁ @ AAځ@߁@AՁ@AAЁ@01A32@67@54A<=@?>A:;A98@()@+*A./A-,@$%A'&@"#@! A`aAcb@fg@edAlm@onAjkAih@xy@{zA~A}|@tuAwv@rs@qpPQ@SRAVWAUT@\]A_^@Z[@YXAIAKJ@NO@MLADE@GFABCAA@@NXF`0Ա; N;Zx_0NBFydeNo XPes matched. Archive headLPfa0d consiZ@ncy ckInvalid co2@a0Q0or@disk fullDirectory 9@in cis@Ra@ut of meymSome|gnam0or@-- c)nlyU @d*P%O@𻰃Splease pacirst with Pmm`CgarPStarBs%@(offse) /Zooe%@DLPn"RTAynipu?The re0°(%lu bytes)UnoGt bCIL:AoB %ch[zHACRC,Ebab\ul@>oph@%sz2.1 $D@: 1991/07/14 22:39:26 $NIn n'umbLP0aMDUsag{acDeglLPTuUvx}[aAcCdEfInmMNoOpPqu1:/.@n]n} ("h"help, AHGexM /Novi0u-cm[.]|... wher|onese: -adQ_0t -mo{6pUdele-l o-upd-fñ- -buGp -NѲU#UG \$ z  VѰVVxV8 þ8 W&P qP P X` +N!XT` f` x` [ X+Y ^ [ YZ8#Z{ h'Z_ Zw[[[2ꨰ \5 # \w !]U! ] h'] []#^0(#2`200Ԫ#_c _/1W00jh'_,400 _}00``05H#` `r`0``0`0#a 060E0w 920b003:NInsufficiQAs< *BѲ%81%3u%% B %Y4m-(D R-1A+G*D(E%s6|%sK,@FOBZOO0 .^MħK*`;@)#([XBPa| left4N O;"pZ"pf"pr"p}"p"p"p"pp$"p"p% bpbp7bpKbp\bpqbpbpIp%bpbpbpbpbp*bpbpbpbp]p%bpbpM`&ʶpppip&&Ҷp.p`&5p&FʶpNpTpup&dpnpvpp ?ag__stksiz.0 (8 :"  )<E >>V\ (  { 0@ ]" ogq&( 4F PR  R&  6* B {: ^*(>"00'Z     \( ' EtP *@(*$Ym " $&L , *2 ' $6 $ *r``TtQ q \ YY*` ' v 'vp$ v*ȓ [ [ `?ZU K$`_*'Y *L"z   4( _* > 7\XB6PH:4J  ,R 4PN 6. `d'>   & "J"  _ 0nHF "< $FF , 0r. R0. ^1 ((  ^F "t@* 0 P6F .:0 : <\BF*0@ $ $.ﺲj$P   & T"6*w> 򀋀 :KtQIt  Y*> ^  ȱְ(<.0HV o4 (Z m@ 0X" * >*X&& &&T* II=$ 4L&l  ~ D,p ('N$2HHo . 6 I <    N   JD B"n _(     2 &T: *qf!O  .:YqZWNd#>Y&" $U8 yT 4"ơ ְ( Pr2 Д`  +}>$ ( X 8 8: L$4 )ꓑ "Y6ذ )20̐̐$\ >a ,? \    " 6`Vs u ^ *j"vY o 蠎ɰTU<,tP$8$+"<U  "Eΰ " n,ituJ;ʠ&S Er,, & f$ZD 2 *2P JY+jG  *\$q xw$j}0D, *f  :tPB*v"Y  DFN H*NTrv$,((*8&4>$ 2( $X2"ި (N,$  ,_ 8pLN48N :B?. *0*X"b&".X E" . 2"G R@ (,$F&L~4tD:j.6B&,<" ĐS6: 6 e;?0L@:  :(f, p2. H$>  0$6 .$Jx F .828 z""$ ,P*Zj2.Z(,"<6 RP2>:LHt`N (J:  D.(.(,",  u0 (R6T$ (:V_  E 2&b,=  ):)]6 XbB > .<86  _ t$\;0P4. R& 𘐴&f, J0$4b  " 2 (  &,,$ Ty\!nРfT  @ j00z,XY  P(f0 2Q< ,A&  (\TQ PT_OOOOA  B8/@O __&THnHnHn/9;Nd/nPONXOno0nB@=@ |r`XHXW PN`z0np n od0np#`T n n0n09'|`?./9;N$\O=@BgN$TOnlD nm=|0np]0.no6=n0.nlRn0@09'|`0.R@0@B`0.nl=n0.noSn0@B`?./9;N$\O=@BgN$|TOno``*oB?< NA/@Hz?< NA\E L&JY(JYM@: gtae `6xva|fb4`ahd6adda`eraBRB`aNex6<aPf6<6a"J!Q`f Nuxrtf BQ2RAISAfNurtf BQNua6t`v `NA\ kA -G,KJgѓrg<fG``T+R В+@+jЪ+@+j OA/C p0QNu - ЭTK&M*Sf*o m mNEfY +POMPEY PACKER V1.6`Y{dtIY&o .+/#&+ lCЫ /v <3J5It :p 2c M&d"jTZmN&?R *e~tˮT PpK C1%%p/ eׅx%d(/rX#/< HLKkD#-^ˮ RNAT>pGҺpG/ | #G>p$dgp%!VR %px&H~p'8c<p(c0 c/ 0SUU pU bxW"kR$g >G#XfL,I ,$pē$^X:إ:1jT\lc" ^f/cQ f* Fc*j-".g!`r]<UEQ2p*p beg /3` /?hLp%$#p &g!3`޴Hp~&u_AU^i42XqBQBS%Qbg"*FLTFJIuR6 d}Df#D~u$1<%gb4`fp 4g$)PL`:@g2h/&b:ѣ^~ K#{Qr6tg@V !G{` '"ahX>j&&EQ Xa"?B pzbelI& Nua2I2(&(ٓ,"*Qaojg,e ``pbn5!\TIFS# Da!L;p2 `y f/9^|.Y]fF%)q_[E68& Ĭ ȾC5ʈAFm`mbkRjFޠ*ACH6f `j1n158V~WF`p3&Q,(.-(xhKg ҫR Lvt/ {i)Q[]n!5DVpx :)%BtYpa(q3paC&r_tzIpXQp^0Pr-Ap@wp)anj[=N P R&(T>QVXFSZ3 0m\p3 Nup`ap  &0oWU.?LNA&"pu|p`VvRM<]o+ؾ1_ډ}f x Q Fh:DE1rzkjLGqhYH(H0Uža|eFsvh%CMf@Qz1&b HT/"SaQ!L-e!aL`&;$LX,+$(JpQ> Lmne?8?f4>ald:ahdad񍌢_aRe _Tf:!|cmNui7vYD>(2iZ,pT>htYEhoBP8 Q kkq !8Qmĩ 2U\Rd0Q&<{ ^:`v@Nt0C62Ilx+Y&`g. B҄RHSfꌲ HApr0qrL`ky (U "PQ^\NI#r6 j$6z859#)6i{ O 8Hk~ Pp@L2*: Z)$򐈰YjSfpZ#6Xd^s'Æ0EP}irateSP+}buFINALVeron.*10%y/cod(BbJ.P.im(|WOW 4Fti|:'POMPEPACKERUg3}\D +jtosavRunxQQ;bN)- ^ #f,TX xK'(~pZ ?n"5*FvC|*>+*`D $*JI*S}(Lb;*~T؋*f`.ah]B(7A bP.V#*fxR ,"Ir g64D㛈`X|X D@]ޯ61 L0'j(>ٸ 2,/$f"?E!Ţ5,K``lA:\PƣRcL~plfxdbXE:ZHV2$`*&L#ᢘێ|S\Bj$ =xQ-,gfJ`ƅ>Jx$pf%~#aD#8DW?f⼑D|)tJ&(2A ~I`÷"H ^K~$$ g(1T?0" &$#\^"k&^ &0ROS[&BQG 2*-D4TpҐ$BzR&(a, ҂0.$zHB҂b Db$RS(`H~ 4 x+4<~XaA4@}g"ǞSsrYOEr0SGo`Q[ft$3Y W"QC"#By m"|&OBFkRA]`0bhf`*qL$] 'S"*`db ow [/H7]EgVg%QDnDDp"D4HJAk^s%p#BBgh^2=&MPAK__n/dd?&* 4,1KD#){>/UTo#CT"~f4ɨ~r‰$jYZz A 4Vr%(f?Efp&$F6AHC(R.g ` ^f=?[b7gain@DYesq`g.FM0p6gRmN6-pxa>r1 U:{p6eba0$a6pTq5|aza`a VNMTODD aƘ|a/xZq*v`"cav` C?npa8v#`2avp)bz^x+ grM*U/DVpJpg"! &HETLH""JQf 3 " 2hog LP_BbB$9G(r^I 6`,`fJ,/$$\XBD]/zokL&(J0Y,| :bg%#eG`6*v*|fb4:ahd6adax`erN BRB@`aNex6aP(f6DVmNv`"a.et8gX8A8a>Ra"(J!Q`@"x[r2(RAISA rt6ύhBc a6Qt`vW`Fzs=ii>ժ;&ip{ z2/Ob 9t\/+4H,&X%hU R  p,\1 !in:NxegDTD@/[)j/ (~rM3<BD*'`q4 r^Mt r **7 &RMPVHDt8U ꠦ( P a:(o-$ (c b( e$ ʸn (j8TFjF\N(&S y&FL6DD4: < S60 4v" pg. O*)POPIolen;Spaltenoffset errechnen;Spalte dazu;Adresse auf dem Schirm;Adresse des 16x16-Fonts;Zeichen holen;Ende des Strings;Noch ein String;nchste Koordinate holen;nur einmal ausgeben;Zeichen mehrfach ausgeben?;Anzahl holen;Space ausgeben;Adresse des Zeichens;16 Pixelzeilen ausgeben;Zeichen invertieren;Pointer auf das nchste Zeichen;Zeichen mehrfach ausgeben` 2 oO&M. ( "#6//Bg?<JNAO ?<NATH@AC0A:\* "0<.*02Fy@ ABA waBE:aA aBE:aA Jy:gA aAaaj @Pg @Cg> @Dg0 @Sg" @Ig @QfԠ BgNAA aZa0`zFy:`A qaB?< NMT&GakA ma(G`a`a:@Ak ga8pNuAaaVgBy V`g A_ap`Aoada:: EDg EEfa| EDghG(K*NƹgܹmBA`a` rlB`Jg gJg`B g ,AAaRy>ARaAVaag CnJygR#XA <aD` Apa8Apa. N a&/a輟f0 A a(`NA6aprQQJykHVHy??<?NAO ,akJNuaBgHzF?<Nu??<>NAXJNuaPgf BgHz?<k&A,< a/??<>NAXf `, A/aa`KA aaBg8Jg0 HU?<9NA\? J_f RfS\*.*BaPpNupNua<`a>ag`g PNg POgLIN4Vx&H/(/NDP`&H?NDT.k?</NDT,@ .gX .gP?<Hn?<=NDP?k@A\/BB/<??<?NDO ?<>NDXA8 TPWMf MpQ `fT`G0hf\6`TBV/(/NDPJ@kl(.6(THgSCg&.Jf-C`8&֐lpag&0|l CHzBBHP?.?<?NAO Jgf .L6|`@0.hf:JVg4 (o&H>l".m  h"H$HL?GAޖIKA, K. JDjo*TJng JEg$` *J&<(n *G& օH`2. AgRRS Caր2An JkWH=@L,CGANg"0<'&Wg&I Sk &QR@`M`^pЋj.m*H`r <aZL*K,I`rf.&G`(SAkdJf&GvDTDKf&G*Jûlݵg*WSDk*HݵWf`۳f&GfSDKM* j @ Eo*NŐES@Q`,L*HݻmKP K@H* M"H? ѮL6|LINsEE Turbo Packer by Wolfgang Mayerle in 1990 Options: Pack Files Create DECOMP.PRG Drives Switch skipflag Info QuitY+ Drives: Source e, Destination Y- Ignore skipped files.Y- Copy skipped files. fE Turbo Packer stellt einen extrem leistungsfhigen, schnellen und kompatiblen Packer dar. Mit ihm lassen sich im Gegensatz zu herkmmlichen Packern auch Programme packen, die laufend gebraucht werden. Das Programm heit Turbo Packer, weil er sowohl beim Packvorgang selbst als auch beim Entpacken extrem schnelle Algorithmen benutzt. Dies zeigt sich z.B. darin, da manche gepackte Programme von Diskette schneller geladen werden als ungepackte. Eine genaue Bedienungsanleitung finden Sie im TOS-Magazin. E Select File or Directory to load (from).E Select Directory to save to.E Loading Recognized as Data-File. Recognized as Exec-File. Pack it as Exec- or Data-File? Symbols erased. Relocation Table corrected. Packing Already packed : j % Relation pack_difference/unpacked: %kjkj E Result: j %kE Saving File already packed. File skipped. Copying E I/O-Error. Check Drive and press a key. Insufficient memory. Press a key.DECOMP.PRGZTPWM <6Z\d&@`2B  r.l d6 move.w (a0)+,d4 move.w (a0)+,d5 move.w (a0),d6 mulu #2,d4 mulu #2,d5 mulu #2,d6 move.l d4,a1 move.l d4,a0 add.l #sin,a0 add.l #cos,a1 move.w (a0),dana1 move.w (a1),dana2 m(  $,( 86 @EXITPACKFILEBATCHDISC Offset :0000____9999Pompey Pirates Packer (c) v1.5DEPACK4k12k16k8kCompressionABFD00000000________99999999 ? ProcessKILLKEEPOutputEXECDATAFile Type000000______999999000000______999999____________AAAAAAAAAAAA____________AAAAAAAAAAAA000000______999999000000______99999900__%99000000__:__:__999999SAVEDeviceStatusFILESFORMATTHE ALIEN , GENIE , SLEDGE , DESLAWZ , RICHARD III and.....V1.5 5.3.90. 100% m/code.xɼ{|=ݼw7w;w;<;π??~<?<<Ϟ=7<yǾǿ<q~~?߿yyyyO|xx xxxxxxxxxxp`@~HMR     - :;H U\cjqx qq!   )*,  .!, $ )# !. 3 9>   W(  v  }        ! !  !! ! 0 +"*  #L$h% &  '()* !,, H-d . %  0 (    % ( tst #15,d0 bne lop7 and.l #$ffff,d0 bra lop8 lop7: swap d0 move.w #$ffff,d0 swap d0 lop8: btst #15,d2 bne lop9 and.l #$ffff,d2 bra lop10 lop9: swap d2 move.w #$ffff,d2 swap d2 lop10