DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T c

⟦0a81a2bd6⟧ TextFile

    Length: 2485 (0x9b5)
    Types: TextFile
    Names: »codegen.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Adl/adlcomp/codegen.c« 

TextFile

	/***************************************************************\
	*								*
	*	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 ***/