home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff274.lzh
/
HP11
/
hp11.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-16
|
5KB
|
163 lines
#include "exec/types.h"
#include "proto/dos.h"
#include "hp11/hp11.h"
#include "hp11/amiga/amiga.h"
#include "hp11/io.h"
#include "hp11/support.h"
#include "hp11/ins.h"
#include "hp11/codes.h"
#include <stdlib.h>
/* Values for Cback */
LONG _stack = 4000;
char *_procname = "HP11C";
LONG _BackGroundIO = 0;
LONG _priority = 0;
struct Regs hp11r;
int running, fast, error, skip;
int PC, retStack[MAXSTACK], retCnt;
int Flags;
int quit, on = TRUE; /* Set to false to quit */
static void ExecAction(int act) /* Execute an Action in normal mode */
{
if (act >= IGTO_LINE) { /* GTO .nnn where act = IGTO_LINE + nnn */
entering = FALSE; /* Digit entry disabled */
GTOLine(act - IGTO_LINE);
}
else switch (act) {
case ISST: SST(); break;
case IBST: BST(); break;
case IP_R: ProgramEntry(); break;
case IUSER: USER(); break;
case ICLR_PRGM: RTN(); break; /* Clear Prgm = RTN() in normal mode */
case ION: on = !RelKey(); break; /* Allow user to change his mind */
case IMEM: MEM(); break;
case ICLR_PREFIX: PREFIX(); break;
case IBACK:if (entering) EnterNum(-IBACK); /* Correct during digit entry */
else CLX();
break;
}
}
void ExecIns(ins) /* Execute an instruction (normal or run mode) */
register int ins;
{
skip = FALSE;
if (ins < KCOMPLEX) (*insfunc[ins])(); /* miscellaneous ins */
else if (ins < KFLAGS + OCF) SF(ins - (KFLAGS + OSF));
else if (ins < KFLAGS + OSET) SF(ins - (KFLAGS + OSF));
else if (ins < KFIG) SF(ins - (KFLAGS + OSF));
else if (ins < KFIX) EnterNum(ins);
else if (ins < KSCI) FIX(ins - KFIX);
else if (ins < KENG) SCI(ins - KSCI);
else if (ins < KLBL) ENG(ins - KENG);
else if (ins < KGTO) ENABLE() /* LBL : ignore, just enable stack */;
else if (ins < KGSB) GTO(ins - KGTO);
else if (ins < KSTO) GSB(ins - KGSB);
else if (ins < KRCL) STO((ins - KSTO) % OPLUS,
(enum StoTypes)((ins - KSTO) / OPLUS));
/* compute type of operation to do : there are 21 regs per operation,
+ indirect, the codes are sequential : all the stos, all the pluses ...
PLUS is first so it is 22, hence the division to determine the operation */
else if (ins < KRCL + 22) RCL(ins - KRCL);
X = Check(X); Y = Check(Y); /* Check the values in X & Y to conform to HP11
limits. The testing is done here to save code space so that all the instructions
don't have to include the check */
}
static BOOL Init(int argc, APTR argv) /* Initialize the calculator, return FALSE if it fails */
{
DEG(); /* Initial state, all other values are zero */
FIX(4);
/* Computer specific intialisation, can load an initial program */
return(AmigaInit(argc, argv));
}
static void CleanUp(void)
{
AmigaCleanUp();
}
/* Standard version of sleep */
/* On Amiga, iconifies (special routine in amiga.c */
/* static void sleep()
{
int key;
Display("");
while (!quit && !on) {
key = PollKey(TRUE);
RelKey();
on = key == 30 (* ON *), replace ( with / if you uncomment this;
}
} */
void main(int argc, char **argv)
{
WORD code;
enum KeyTypes type;
if (Init(argc, (APTR)argv))
do { /* while (!quit) */
while (on && !quit) { /* Exit when calculator turned off */
Disp();
error = FALSE; overflow = FALSE;
if (running) { /* Run mode */
if (PollKey(FALSE) != -1) { /* User pressed a key */
running = FALSE;
RelKey(); /* Wait for him to release it */
}
else {
if (!fast) Wait50(2L); /* Slow calculator down to make it more realistic (wait 2/50 s) */
ExecIns(Prog[PC]); /* Exec current ins */
if (error || overflow) running = FALSE; /* An error occured, halt */
else {
if (skip) PC++; /* A conditional instruction asked for the next
instruction to be skipped */
PC++;
while (PC > lastIns) { /* There is an implicit return at the end of the program */
RTN();
PC++;
}
}
}
}
else { /* normal mode operation */
MenusOn();
EditOn();
type = ReadKey(&code);
EditOff();
switch (type) { /* Read an instruction/action */
case Action:
ExecAction(code); /* Execute corresponding action */
break;
case Instruction:
ExecIns(code); /* Interpret instruction */
break;
}
MenusOff();
RelKey();
}
}
if (!quit) {
sleep(); /* Wait till woken up */
ENABLE();
}
} while (!quit);
CleanUp();
}