summaryrefslogtreecommitdiff
path: root/gs/psi/zdosio.c
diff options
context:
space:
mode:
Diffstat (limited to 'gs/psi/zdosio.c')
-rw-r--r--gs/psi/zdosio.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/gs/psi/zdosio.c b/gs/psi/zdosio.c
new file mode 100644
index 000000000..132877951
--- /dev/null
+++ b/gs/psi/zdosio.c
@@ -0,0 +1,105 @@
+/* Copyright (C) 2001-2006 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id$ */
+/* MS-DOS direct I/O operators. */
+/* These should NEVER be included in a released configuration! */
+#include "dos_.h"
+#include "ghost.h"
+#include "oper.h"
+#include "store.h"
+
+/* <port> .inport <word> */
+static int
+zinport(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_type(*op, t_integer);
+ make_int(op, inport((int)op->value.intval));
+ return 0;
+}
+
+/* <port> .inportb <byte> */
+static int
+zinportb(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_type(*op, t_integer);
+ make_int(op, inportb((int)op->value.intval));
+ return 0;
+}
+
+/* <port> <word> .outport - */
+static int
+zoutport(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_type(*op, t_integer);
+ check_type(op[-1], t_integer);
+ outport((int)op[-1].value.intval, (int)op->value.intval);
+ pop(1);
+ return 0;
+}
+
+/* <port> <byte> .outportb - */
+static int
+zoutportb(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_type(*op, t_integer);
+ check_int_leu(op[-1], 0xff);
+ outportb((int)op[-1].value.intval, (byte) op->value.intval);
+ pop(1);
+ return 0;
+}
+
+/* <loc> .peek <byte> */
+static int
+zpeek(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_type(*op, t_integer);
+ make_int(op, *(byte *) (op->value.intval));
+ return 0;
+}
+
+/* <loc> <byte> .poke - */
+static int
+zpoke(i_ctx_t *i_ctx_p)
+{
+ os_ptr op = osp;
+
+ check_type(*op, t_integer);
+ check_int_leu(op[-1], 0xff);
+ *(byte *) (op[-1].value.intval) = (byte) op->value.intval;
+ pop(1);
+ return 0;
+}
+
+/* ------ Operator initialization ------ */
+
+const op_def zdosio_op_defs[] =
+{
+ {"1.inport", zinport},
+ {"1.inportb", zinportb},
+ {"2.outport", zoutport},
+ {"2.outportb", zoutportb},
+ {"1.peek", zpeek},
+ {"2.poke", zpoke},
+ op_def_end(0)
+};