|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 2485 (0x9b5) Types: TextFile Names: »codegen.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Adl/adlcomp/codegen.c«
/***************************************************************\ * * * codegen.c - routines to generate appropriate ADL * * stack machine instructions. * * Copyright 1987 by Ross Cunniff. * * * \***************************************************************/ #include <stdio.h> #include "adltypes.h" #include "virtmem.h" #include "adldef.h" address numcode = 1; /* Number of bytes of code written */ extern struct pagetab codetab; /* Code paging table. */ /***************************************************************\ * * * oldcode( addr, opcode, opnd ) - Emits instruction * * opcode opnd at address addr. Compresses the instr. * * if possible. * * * \***************************************************************/ address oldcode( addr, opcode, opnd ) address addr; int16 opnd; char opcode; { int16 num; switch( opcode ) { case PUSH : if( (opnd >= -127) && (opnd <= 0) ) { opcode = PUSHN | (char)(opnd & 0x07F); num = 1; } else if( (opnd >= -1024) && (opnd <= 1023) ) { opcode = PUSHS | (char)((opnd >> 8) & 0x03F); opnd &= 0x0FF; num = 2; } else num = 3; break; case PUSHARG : case PUSHLOCL : case CALL : opcode |= (char)(opnd & 0x01F); case NOP : case POP : case PUSHME : case RET : num = 1; break; case JMP : case JMPZ : case FILEN : case LINEN : num = 3; break; } vm_put8( opcode, (int32)(addr++), &codetab ); switch( num ) { case 1 : break; case 2 : vm_put8( (char)(opnd & 0x0ff), (int32)addr, &codetab ); break; case 3 : vm_put16( (int16)(opnd & 0x0ffff), (int32)addr, &codetab ); break; } return (address)num; } /***************************************************************\ * * * newcode( opcode, opnd ) - emit instruction opcode opnd * * at the current address in the code file. * * * \***************************************************************/ address newcode( opcode, opnd ) char opcode; int16 opnd; { address nc_save; nc_save = numcode; numcode += oldcode( numcode, opcode, opnd ); return nc_save; } /***************************************************************\ * * * currcode() - returns the current code address. * * * \***************************************************************/ address currcode() { return numcode; } /*** EOF codegen.c ***/