mirror of
https://github.com/Interlisp/maiko.git
synced 2026-01-15 15:57:13 +00:00
cases for subrs UNCOLORIZE-BITMAP, COLORIZE-BITMAP, COLOR-8BPPDRAWLINE (which are not compiled into current code) can have the numbers replaced by the symbolic constants that are now defined in subrs.h
813 lines
19 KiB
C
813 lines
19 KiB
C
/* $Id: subr.c,v 1.3 1999/05/31 23:35:42 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
|
|
/* Manufactured in the United States of America. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
#include "version.h"
|
|
|
|
/***********************************************************/
|
|
/*
|
|
File Name : subr.c
|
|
Including : OP_subrcall
|
|
|
|
Created : May 12, 1987 Takeshi Shimizu
|
|
Changed : May 15 87 take
|
|
Changed : Jun 2 87 NMitani
|
|
Jun. 5 87 take
|
|
Jun. 29 87 NMitani
|
|
Oct. 13 87 Hayata
|
|
Oct. 16 87 take
|
|
Nov. 18 87 Matsuda
|
|
Dec. 17 1987 Tomtom
|
|
2/17/89 Sybalsky (Add SXHASH)
|
|
|
|
*/
|
|
/***********************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include "lispemul.h"
|
|
#include "address.h"
|
|
#include "adr68k.h"
|
|
#include "lsptypes.h"
|
|
#include "lispmap.h"
|
|
#include "lspglob.h"
|
|
#include "cell.h"
|
|
#include "stack.h"
|
|
#include "arith.h"
|
|
#include "subrs.h"
|
|
#include "dbprint.h"
|
|
|
|
#include "subrdefs.h"
|
|
#include "bbtsubdefs.h"
|
|
#include "chardevdefs.h"
|
|
#include "commondefs.h"
|
|
#include "dirdefs.h"
|
|
#include "dskdefs.h"
|
|
#include "dspsubrsdefs.h"
|
|
#include "etherdefs.h"
|
|
#include "gcarraydefs.h"
|
|
#include "gcrdefs.h"
|
|
#include "inetdefs.h"
|
|
#include "kbdsubrsdefs.h"
|
|
#include "mkcelldefs.h"
|
|
#include "osmsgdefs.h"
|
|
#include "rpcdefs.h"
|
|
#include "storagedefs.h"
|
|
#include "timerdefs.h"
|
|
#include "ufsdefs.h"
|
|
#include "unixcommdefs.h"
|
|
#include "uutilsdefs.h"
|
|
#include "vmemsavedefs.h"
|
|
#ifdef MAIKO_ENABLE_FOREIGN_FUNCTION_INTERFACE
|
|
#include "foreigndefs.h"
|
|
#endif
|
|
|
|
extern LispPTR *PENDINGINTERRUPT68k;
|
|
|
|
/***********************************************************/
|
|
/*
|
|
|
|
Func Name : OP_subrcall
|
|
|
|
Last Modify : 13-Oct 1987 take
|
|
|
|
*/
|
|
/***********************************************************/
|
|
|
|
extern LispPTR Uraid_mess;
|
|
|
|
LispPTR subr_lisperror(); /* 0377 */
|
|
|
|
char *atom_to_str(LispPTR atom_index) {
|
|
PNCell *pnptr;
|
|
char *pname_base;
|
|
|
|
pnptr = (PNCell *)GetPnameCell(atom_index);
|
|
pname_base = (char *)Addr68k_from_LADDR(pnptr->pnamebase);
|
|
return (pname_base + 1);
|
|
} /*atom_to_str*/
|
|
|
|
#define POP_SUBR_ARGS \
|
|
do { \
|
|
args[0] = NIL_PTR; \
|
|
if ((arg_num = (argnum /* = (Get_BYTE(PC+2))*/)) > 0) { \
|
|
while (arg_num > 0) PopStackTo(args[--arg_num]); \
|
|
} \
|
|
} while(0)
|
|
|
|
void OP_subrcall(int subr_no, int argnum) {
|
|
static LispPTR args[30];
|
|
int arg_num;
|
|
|
|
PushCStack; /* save TOS in memory */
|
|
|
|
DBPRINT(("Subr call to subr 0%o.\n", subr_no));
|
|
|
|
switch (subr_no) {
|
|
case sb_SHOWDISPLAY:
|
|
POP_SUBR_ARGS;
|
|
DSP_showdisplay(args);
|
|
break; /* showdisplay */
|
|
|
|
case sb_DSPBOUT:
|
|
POP_SUBR_ARGS;
|
|
DSP_dspbout(args);
|
|
break; /*dspbout */
|
|
|
|
case sb_RAID:
|
|
POP_SUBR_ARGS;
|
|
Uraid_mess = args[0];
|
|
PC += 3; /* for the case of hardreset */
|
|
error("URAID Called:");
|
|
Uraid_mess = NIL;
|
|
TopOfStack = NIL;
|
|
return; /* Direct return;avoid to increment PC */
|
|
/* break; */
|
|
/*************************/
|
|
/* for Local File System */
|
|
/*************************/
|
|
case sb_COM_OPENFILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_openfile(args);
|
|
break;
|
|
|
|
case sb_COM_CLOSEFILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_closefile(args);
|
|
break;
|
|
|
|
case sb_UFS_GETFILENAME:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = UFS_getfilename(args);
|
|
break;
|
|
|
|
case sb_UFS_DELETEFILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = UFS_deletefile(args);
|
|
break;
|
|
|
|
case sb_UFS_RENAMEFILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = UFS_renamefile(args);
|
|
break;
|
|
|
|
case sb_COM_READPAGES:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_readpage(args);
|
|
break;
|
|
|
|
case sb_COM_WRITEPAGES:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_writepage(args);
|
|
break;
|
|
|
|
case sb_COM_TRUNCATEFILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_truncatefile(args);
|
|
break;
|
|
|
|
case sb_COM_NEXT_FILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_next_file(args);
|
|
break;
|
|
|
|
case sb_COM_FINISH_FINFO:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_finish_finfo(args);
|
|
break;
|
|
|
|
case sb_COM_GEN_FILES:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_gen_files(args);
|
|
break;
|
|
|
|
case sb_UFS_DIRECTORYNAMEP:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = UFS_directorynamep(args);
|
|
break;
|
|
|
|
case sb_COM_GETFILEINFO:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_getfileinfo(args);
|
|
break;
|
|
|
|
case sb_COM_CHANGEDIR:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_changedir(args);
|
|
break;
|
|
|
|
case sb_COM_GETFREEBLOCK:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_getfreeblock(args);
|
|
break;
|
|
|
|
case sb_COM_SETFILEINFO:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = COM_setfileinfo(args);
|
|
break;
|
|
|
|
/*************/
|
|
/* for Timer */
|
|
/*************/
|
|
case sb_SETUNIXTIME:
|
|
POP_SUBR_ARGS;
|
|
subr_settime(args);
|
|
/* don't know whether it worked or not */
|
|
TopOfStack = NIL;
|
|
break;
|
|
|
|
case sb_GETUNIXTIME:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = subr_gettime(args);
|
|
break;
|
|
|
|
case sb_COPYTIMESTATS:
|
|
POP_SUBR_ARGS;
|
|
subr_copytimestats(args);
|
|
/* no result */
|
|
TopOfStack = NIL;
|
|
break;
|
|
|
|
/*************/
|
|
/* for Ether */
|
|
/*************/
|
|
case sb_CHECK_SUM:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = check_sum(args);
|
|
break;
|
|
|
|
case sb_ETHER_SUSPEND:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = ether_suspend(args);
|
|
break;
|
|
|
|
case sb_ETHER_RESUME:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = ether_resume(args);
|
|
break;
|
|
|
|
case sb_ETHER_AVAILABLE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = ether_ctrlr(args);
|
|
break;
|
|
|
|
case sb_ETHER_RESET:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = ether_reset(args);
|
|
break;
|
|
|
|
case sb_ETHER_GET:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = ether_get(args);
|
|
break;
|
|
|
|
case sb_ETHER_SEND:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = ether_send(args);
|
|
break;
|
|
|
|
case sb_ETHER_SETFILTER:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = ether_setfilter(args);
|
|
break;
|
|
|
|
case sb_ETHER_CHECK:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = check_ether();
|
|
break;
|
|
|
|
/***************/
|
|
/* for Display */
|
|
/***************/
|
|
case sb_DSPCURSOR:
|
|
POP_SUBR_ARGS;
|
|
DSP_Cursor(args, argnum);
|
|
break;
|
|
|
|
case sb_SETMOUSEXY:
|
|
POP_SUBR_ARGS;
|
|
DSP_SetMousePos(args);
|
|
break;
|
|
|
|
case sb_DSP_VIDEOCOLOR:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = DSP_VideoColor(args);
|
|
break;
|
|
|
|
case sb_DSP_SCREENWIDTH:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = DSP_ScreenWidth(args);
|
|
break;
|
|
|
|
case sb_DSP_SCREENHEIGHT:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = DSP_ScreenHight(args);
|
|
break;
|
|
|
|
/*************************/
|
|
/* for color experiments */
|
|
/*************************/
|
|
#ifdef COLOR
|
|
case sb_COLOR_INIT:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = cgfour_init_color_display(args[0]);
|
|
break;
|
|
|
|
case sb_COLOR_SCREENMODE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = cgfour_change_screen_mode(args[0]);
|
|
break;
|
|
|
|
case sb_COLOR_MAP:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = cgfour_set_colormap(args);
|
|
break;
|
|
|
|
case sb_COLOR_BASE:
|
|
POP_SUBR_ARGS;
|
|
/* return DLword offset between LISPBASE and Lisp_world */
|
|
TopOfStack = S_POSITIVE | (((int)Lisp_world >> 1) & 0xffff);
|
|
break;
|
|
|
|
case sb_C_SlowBltChar:
|
|
POP_SUBR_ARGS;
|
|
/* \\SLOWBLTCHAR for 8BITCOLOR */
|
|
C_slowbltchar(args);
|
|
break;
|
|
|
|
case sb_UNCOLORIZE_BITMAP:
|
|
POP_SUBR_ARGS;
|
|
Uncolorize_Bitmap(args);
|
|
break;
|
|
|
|
case sb_COLORIZE_BITMAP:
|
|
POP_SUBR_ARGS;
|
|
Colorize_Bitmap(args);
|
|
break;
|
|
|
|
case sb_COLOR_8BPPDRAWLINE:
|
|
POP_SUBR_ARGS;
|
|
Draw_8BppColorLine(args);
|
|
break;
|
|
#endif /* COLOR */
|
|
|
|
/***************************/
|
|
/*** bitbltsub, bltchar ***/
|
|
/***************************/
|
|
case sb_BITBLTSUB:
|
|
POP_SUBR_ARGS;
|
|
bitbltsub(args);
|
|
break;
|
|
|
|
case sb_BLTCHAR:
|
|
POP_SUBR_ARGS; /* argnum * DLwordsperCell*/
|
|
bltchar(args);
|
|
break;
|
|
|
|
case sb_NEW_BLTCHAR:
|
|
POP_SUBR_ARGS;
|
|
newbltchar(args);
|
|
break;
|
|
|
|
case sb_TEDIT_BLTCHAR:
|
|
POP_SUBR_ARGS;
|
|
tedit_bltchar(args);
|
|
break;
|
|
|
|
/* case 209: JDS 4 may 91 - this is code for CHAR-FILLBUFFER?? */
|
|
case sb_BITBLT_BITMAP:
|
|
POP_SUBR_ARGS; /* BITBLT to a bitmap */
|
|
TopOfStack = bitblt_bitmap(args);
|
|
break;
|
|
|
|
case 0111 /*sb_BITSHADE_BITMAP*/:
|
|
POP_SUBR_ARGS; /* BITSHADE to a bitmap */
|
|
TopOfStack = bitshade_bitmap(args);
|
|
break;
|
|
|
|
/**************/
|
|
/* For RS232C */
|
|
/**************/
|
|
#ifdef RS232
|
|
case sb_RS232C_CMD: RS232C_cmd(); break;
|
|
case sb_RS232C_READ_INIT: RS232C_readinit(); break;
|
|
case sb_RS232C_WRITE: RS232C_write(); break;
|
|
#endif /* RS232 */
|
|
|
|
/***********/
|
|
/* for K/B */
|
|
/***********/
|
|
case sb_KEYBOARDBEEP:
|
|
POP_SUBR_ARGS;
|
|
KB_beep(args);
|
|
break;
|
|
|
|
case sb_KEYBOARDMAP:
|
|
POP_SUBR_ARGS;
|
|
KB_setmp(args);
|
|
break;
|
|
|
|
case sb_KEYBOARDSTATE:
|
|
POP_SUBR_ARGS;
|
|
KB_enable(args);
|
|
break;
|
|
|
|
case sb_VMEMSAVE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = vmem_save0(args);
|
|
break;
|
|
|
|
case sb_LISPFINISH:
|
|
case sb_LISP_FINISH:
|
|
POP_SUBR_ARGS;
|
|
if ((argnum > 0) && (args[0] == S_POSITIVE))
|
|
/* 8/03/88 This branch impossible to take, subr has no args */
|
|
{
|
|
TopOfStack = suspend_lisp(args);
|
|
} else
|
|
lisp_finish();
|
|
break;
|
|
|
|
case sb_NEWPAGE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = newpage(args[0]);
|
|
break;
|
|
|
|
case sb_DORECLAIM:
|
|
POP_SUBR_ARGS;
|
|
doreclaim(); /* top-level GC function */
|
|
TopOfStack = NIL_PTR;
|
|
break;
|
|
|
|
/* read & write a abs memory address */
|
|
|
|
case sb_NATIVE_MEMORY_REFERENCE:
|
|
POP_SUBR_ARGS;
|
|
|
|
switch (args[0] & 0xffff) {
|
|
case 00: {
|
|
register UNSIGNED iarg;
|
|
if (argnum != 2) goto ret_nil;
|
|
N_GETNUMBER(args[1], iarg, ret_nil);
|
|
ARITH_SWITCH(*((LispPTR *)iarg), TopOfStack);
|
|
break;
|
|
}
|
|
|
|
case 01: {
|
|
register UNSIGNED iarg, iarg2;
|
|
if (argnum != 3) goto ret_nil;
|
|
N_GETNUMBER(args[1], iarg, ret_nil);
|
|
N_GETNUMBER(args[2], iarg2, ret_nil);
|
|
*((LispPTR *)iarg) = iarg2;
|
|
break;
|
|
}
|
|
|
|
/* case 02: Used to be get an emulator address for
|
|
* defunct NATIVETRAN feature. */
|
|
}
|
|
break;
|
|
|
|
ret_nil:
|
|
TopOfStack = NIL_PTR;
|
|
break;
|
|
|
|
case sb_DISABLEGC:
|
|
POP_SUBR_ARGS;
|
|
disablegc1(NIL);
|
|
TopOfStack = NIL_PTR;
|
|
break;
|
|
|
|
case sb_GET_NATIVE_ADDR_FROM_LISP_PTR:
|
|
POP_SUBR_ARGS;
|
|
ARITH_SWITCH(Addr68k_from_LADDR(args[0]), TopOfStack);
|
|
break;
|
|
|
|
case sb_GET_LISP_PTR_FROM_NATIVE_ADDR:
|
|
POP_SUBR_ARGS;
|
|
{
|
|
register UNSIGNED iarg;
|
|
N_GETNUMBER(args[0], iarg, ret_nil);
|
|
ARITH_SWITCH(LADDR_from_68k(iarg), TopOfStack);
|
|
break;
|
|
};
|
|
|
|
case sb_DSK_GETFILENAME:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = DSK_getfilename(args);
|
|
break;
|
|
|
|
case sb_DSK_DELETEFILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = DSK_deletefile(args);
|
|
break;
|
|
|
|
case sb_DSK_RENAMEFILE:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = DSK_renamefile(args);
|
|
break;
|
|
|
|
case sb_DSK_DIRECTORYNAMEP:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = DSK_directorynamep(args);
|
|
break;
|
|
|
|
/* Communications with Unix Subprocess */
|
|
|
|
case sb_UNIX_HANDLECOMM: POP_SUBR_ARGS;
|
|
#ifndef DOS
|
|
TopOfStack = Unix_handlecomm(args);
|
|
#endif /* DOS */
|
|
break;
|
|
|
|
/*
|
|
case 0166: POP_SUBR_ARGS;
|
|
error("called SUBR 0166, not defined!!");
|
|
{register int temp;
|
|
N_GETNUMBER(TopOfStack, temp, badarg);
|
|
temp = (UNSIGNED) Addr68k_from_LADDR(temp);
|
|
ARITH_SWITCH(temp, TopOfStack);
|
|
break;
|
|
badarg: TopOfStack = NIL;
|
|
break;
|
|
}
|
|
*/
|
|
/* OS message print routines */
|
|
|
|
case sb_MESSAGE_READP:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = mess_readp();
|
|
break;
|
|
|
|
case sb_MESSAGE_READ:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = mess_read(args);
|
|
break;
|
|
|
|
/* RPC routines */
|
|
|
|
case sb_RPC_CALL:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = rpc(args);
|
|
break;
|
|
|
|
/* Unix username/password utilities */
|
|
|
|
case sb_CHECKBCPLPASSWORD:
|
|
POP_SUBR_ARGS;
|
|
/* Check Unix username/password */
|
|
TopOfStack = check_unix_password(args);
|
|
break;
|
|
|
|
case sb_UNIX_USERNAME:
|
|
POP_SUBR_ARGS;
|
|
/* Get Unix username */
|
|
TopOfStack = unix_username(args);
|
|
break;
|
|
|
|
case sb_UNIX_FULLNAME:
|
|
POP_SUBR_ARGS;
|
|
/* Get Unix person-name (GECOS field) */
|
|
TopOfStack = unix_fullname(args);
|
|
break;
|
|
|
|
case sb_UNIX_GETENV:
|
|
POP_SUBR_ARGS;
|
|
/* get value of environment variable, or NIL */
|
|
TopOfStack = unix_getenv(args);
|
|
break;
|
|
|
|
case sb_UNIX_GETPARM:
|
|
POP_SUBR_ARGS;
|
|
/* get built in parameter */
|
|
TopOfStack = unix_getparm(args);
|
|
break;
|
|
|
|
case sb_SUSPEND_LISP:
|
|
POP_SUBR_ARGS;
|
|
/* Suspend Maiko */
|
|
TopOfStack = suspend_lisp(args);
|
|
break;
|
|
|
|
case sb_MONITOR_CONTROL:
|
|
POP_SUBR_ARGS;
|
|
/* MONITOR CONTROL STOP(0) or RESUME(1) */
|
|
#ifdef PROFILE
|
|
moncontrol(args[0] & 1);
|
|
#endif /* PROFILE */
|
|
break;
|
|
|
|
/*****************/
|
|
/* Character I/O */
|
|
/*****************/
|
|
case sb_CHAR_OPENFILE:
|
|
POP_SUBR_ARGS; /* Char-device openfile. */
|
|
TopOfStack = CHAR_openfile(args);
|
|
break;
|
|
|
|
case sb_CHAR_BIN:
|
|
POP_SUBR_ARGS; /* Char-device bin. */
|
|
TopOfStack = CHAR_bin(args[0], args[1]);
|
|
break;
|
|
|
|
case sb_CHAR_BOUT:
|
|
POP_SUBR_ARGS; /* Char-device bout. */
|
|
TopOfStack = CHAR_bout(args[0], args[1], args[2]);
|
|
break;
|
|
|
|
case sb_CHAR_IOCTL:
|
|
POP_SUBR_ARGS; /* Char-device IOCTL. */
|
|
TopOfStack = CHAR_ioctl(args);
|
|
break;
|
|
|
|
case sb_CHAR_CLOSEFILE:
|
|
POP_SUBR_ARGS; /* Char-device CLOSEFILE. */
|
|
TopOfStack = CHAR_closefile(args);
|
|
break;
|
|
|
|
case sb_CHAR_BINS:
|
|
POP_SUBR_ARGS; /* Char-device \BINS. */
|
|
TopOfStack = CHAR_bins(args);
|
|
break;
|
|
|
|
case sb_CHAR_BOUTS:
|
|
POP_SUBR_ARGS; /* Char-device \BOUTS. */
|
|
TopOfStack = CHAR_bouts(args);
|
|
break;
|
|
|
|
case sb_TCP_OP:
|
|
POP_SUBR_ARGS; /* TCP operations */
|
|
TopOfStack = subr_TCP_ops(args[0], args[1], args[2], args[3], args[4], args[5]);
|
|
break;
|
|
|
|
#ifdef TRUECOLOR
|
|
case sb_PICTURE_OP:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Picture_Op(args);
|
|
break;
|
|
|
|
case sb_TRUE_COLOR_OP:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = TrueColor_Op(args);
|
|
break;
|
|
|
|
#ifdef VIDEO
|
|
case sb_VIDEO_OP:
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Video_Op(args);
|
|
break;
|
|
#endif /* VIDEO */
|
|
|
|
#endif /* TRUECOLOR */
|
|
|
|
case sb_PUPLEVEL1STATE:
|
|
POP_SUBR_ARGS; /* Do nothing with PUP on sun */
|
|
break;
|
|
|
|
case sb_WITH_SYMBOL:
|
|
POP_SUBR_ARGS; /* Symbol lookup */
|
|
TopOfStack = with_symbol(args[0], args[1], args[2], args[3], args[4], args[5]);
|
|
break;
|
|
|
|
case sb_CAUSE_INTERRUPT: /* Cause an interrupt to occur. Used by */
|
|
/* Lisp INTERRUPTED to re-set an interrupt */
|
|
/* when it's uninterruptible. */
|
|
POP_SUBR_ARGS;
|
|
Irq_Stk_Check = Irq_Stk_End = 0;
|
|
*PENDINGINTERRUPT68k = ATOM_T;
|
|
TopOfStack = ATOM_T;
|
|
break;
|
|
|
|
#ifdef MAIKO_ENABLE_FOREIGN_FUNCTION_INTERFACE
|
|
/*****************************************/
|
|
/* foreign-function-call support subrs */
|
|
/*****************************************/
|
|
case sb_CALL_C_FUNCTION: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = call_c_fn(args); /* args[0]=fnaddr, args[1]=fn type */
|
|
break;
|
|
}
|
|
case sb_DLD_LINK: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Mdld_link(args);
|
|
break;
|
|
}
|
|
case sb_DLD_UNLINK_BY_FILE: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Mdld_unlink_by_file(args);
|
|
break;
|
|
}
|
|
case sb_DLD_UNLINK_BY_SYMBOL: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Mdld_unlink_by_symbol(args);
|
|
break;
|
|
}
|
|
case sb_DLD_GET_SYMBOL: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Mdld_get_symbol(args);
|
|
break;
|
|
}
|
|
case sb_DLD_GET_FUNC: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Mdld_get_func(args);
|
|
break;
|
|
}
|
|
case sb_DLD_FUNCTION_EXECUTABLE_P: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Mdld_function_executable_p(args);
|
|
break;
|
|
}
|
|
case sb_DLD_LIST_UNDEFINED_SYMBOLS: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = Mdld_list_undefined_sym();
|
|
break;
|
|
}
|
|
case sb_C_MALLOC: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = c_malloc(args);
|
|
break;
|
|
}
|
|
case sb_C_FREE: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = c_free(args);
|
|
break;
|
|
}
|
|
case sb_C_PUTBASEBYTE: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = put_c_basebyte(args);
|
|
break;
|
|
}
|
|
case sb_C_GETBASEBYTE: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = get_c_basebyte(args);
|
|
break;
|
|
}
|
|
case sb_SMASHING_APPLY: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = smashing_c_fn(args);
|
|
break;
|
|
}
|
|
#endif /* MAIKO_ENABLE_FOREIGN_FUNCTION_INTERFACE */
|
|
|
|
#ifdef MNW
|
|
case sb_FILL_IN: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = init_mnw_instance(args);
|
|
break;
|
|
}
|
|
case sb_QUERY_WINDOWS: {
|
|
break;
|
|
}
|
|
case sb_MNW_OP: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = dispatch_mnw_method(args);
|
|
break;
|
|
}
|
|
#endif /* MNW */
|
|
|
|
#ifdef LPSOLVE
|
|
/* Linear-programming solver interface from Lisp */
|
|
case sb_LP_SETUP: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = lpsetup(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],
|
|
args[8], args[9], args[10]);
|
|
break;
|
|
}
|
|
case sb_LP_RUN: {
|
|
POP_SUBR_ARGS;
|
|
TopOfStack = lpmain(args[0]);
|
|
break;
|
|
}
|
|
#endif /* LPSOLVE */
|
|
case sb_YIELD: {
|
|
struct timespec rqts = {0, 833333};
|
|
unsigned sleepnanos;
|
|
POP_SUBR_ARGS;
|
|
N_GETNUMBER(args[0], sleepnanos, ret_nil);
|
|
if (sleepnanos > 999999999) {
|
|
TopOfStack = NIL;
|
|
break;
|
|
}
|
|
rqts.tv_nsec = sleepnanos;
|
|
nanosleep(&rqts, NULL);
|
|
TopOfStack = ATOM_T;
|
|
break;
|
|
}
|
|
default: {
|
|
char errtext[200];
|
|
sprintf(errtext, "OP_subrcall: Invalid alpha byte 0%o", ((*(PC + 1)) & 0xff));
|
|
printf("%s\n", errtext);
|
|
error(errtext);
|
|
break;
|
|
}
|
|
|
|
} /* switch end */
|
|
|
|
PC += 3; /* Move PC forward to next opcode */
|
|
|
|
} /* OP_subrcall */
|