From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/x00api.c | 411 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 411 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/x00api.c (limited to 'reference/C/CONTRIB/SNIP/x00api.c') diff --git a/reference/C/CONTRIB/SNIP/x00api.c b/reference/C/CONTRIB/SNIP/x00api.c new file mode 100755 index 0000000..927ed04 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/x00api.c @@ -0,0 +1,411 @@ +/* + * X00API.C: X00 FOSSIL driver + * + * Created by R.F. Pels. + * modified by Bob Stout + * Placed in the public domain by R.F. Pels. + */ + +#include "x00api.h" +#include + +static union REGS x00regs; +static struct SREGS x00sregs; +int x00error = 0; + +#if __cplusplus + extern "C" { +#endif + +#ifdef __TURBOC__ + #define PEEK(s,o) peek(s,o) +#else /* MSC or ZTC */ + #define PEEK(s,o) *((unsigned _far *)(MK_FP((s),(o)))) +#endif + +#ifndef MK_FP + #define MK_FP(seg,offset) \ + ((void _far *)(((unsigned long)(seg)<<16) | (unsigned)(offset))) +#endif + +unsigned int x00_detect(void) +{ + unsigned int segofx00; + unsigned int ofsofx00; + + /* Peek in interrupt vector table for start of FOSSIL */ + + ofsofx00 = PEEK(0, X00_VECTOR * 4); + segofx00 = PEEK(0, (X00_VECTOR * 4) + 2); + + /* Peek in start of FOSSIL + X00_IDOFFSET */ + + return (PEEK(segofx00, ofsofx00 + X00_IDOFFSET)); +} + +FOSSILSTATUS x00_set(unsigned char set, PORT port) +{ + FOSSILSTATUS retval; + + x00regs.x.ax = SET_BAUDRATE | set; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + retval.statusword = x00regs.x.ax; + return retval; +} + +FOSSILSTATUS x00_tx_char(unsigned char c, PORT port) +{ + FOSSILSTATUS retval; + + x00regs.x.ax = TX_CHAR | c; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + retval.statusword = x00regs.x.ax; + return retval; +} + +unsigned char x00_rx_char(PORT port) +{ + x00regs.x.ax = RX_CHAR; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + return (unsigned char)(x00regs.x.ax & 0xff); +} + +FOSSILSTATUS x00_status(PORT port) +{ + FOSSILSTATUS retval; + + x00regs.x.ax = STATUS; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + retval.statusword = x00regs.x.ax; + return retval; +} + +FOSSILINIT x00_init(PORT port, unsigned char far *ctlc_flagbyte) +{ + FOSSILINIT retval; + + x00regs.x.ax = INITIALIZE; + if (ctlc_flagbyte != (unsigned char far *)0) + { + x00regs.x.dx = 0x00ff; + x00regs.x.bx = 0x4F50; + segread(&x00sregs); + x00sregs.es = FP_SEG(ctlc_flagbyte); + x00regs.x.cx = FP_OFF(ctlc_flagbyte); + } + else + { + x00regs.x.bx = 0x0000; /* in any case _NOT_ 0x4f50 */ + x00regs.x.dx = port; + } + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + retval.result = x00regs.x.ax; + retval.max_function = (unsigned char)(x00regs.x.bx & 0xff); + retval.revision = (unsigned char)(x00regs.x.bx >> 8); + return retval; +} + +void x00_deinit(PORT port) +{ + x00regs.x.ax = DEINITIALIZE; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +unsigned int x00_raise_dtr(PORT port) +{ + unsigned int retval; + + x00regs.x.ax = RAISE_DTR; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + if ((x00regs.x.ax & 0x0001) == 1) + { + retval = X00_DTR_HIGH; + } + else retval = X00_DTR_LOW; + return retval; +} + +unsigned int x00_lower_dtr(PORT port) +{ + unsigned int retval; + + x00regs.x.ax = LOWER_DTR; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + if ((x00regs.x.ax & 0x0001) == 1) + { + retval = X00_DTR_HIGH; + } + else retval = X00_DTR_LOW; + return retval; +} + +FOSSILSYSINFO x00_sysinfo(void) +{ + FOSSILSYSINFO retval; + + x00regs.x.ax = GET_SYS_INFO; + int86(X00_VECTOR, &x00regs, &x00regs); + retval.tick_number = (unsigned char)(x00regs.x.ax & 0xff); + retval.ticks_per_second = (unsigned char)(x00regs.x.ax >> 8); + retval.approx_ms_per_tick = x00regs.x.dx; + return retval; +} + +void x00_flush_output(PORT port) +{ + x00regs.x.ax = FLUSH_OUTPUT; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +void x00_purge_output(PORT port) +{ + x00regs.x.ax = PURGE_OUTPUT; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +void x00_purge_input(PORT port) +{ + x00regs.x.ax = PURGE_INPUT; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +unsigned int x00_tx_char_nowait(unsigned char c, PORT port) +{ + unsigned int retval; + + x00regs.x.ax = TX_CHAR_NOWAIT | c; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + if ((x00regs.x.ax & 0x0001) == 1) + { + retval = X00_OK; + } + else retval = X00_CHAR_NOT_SENT; + return retval; +} + +unsigned int x00_peek_ahead_input(PORT port) +{ + x00regs.x.ax = PEEK_AHEAD_INPUT; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + return x00regs.x.ax; +} + +unsigned int x00_peek_ahead_kbd(void) +{ + x00regs.x.ax = PEEK_AHEAD_KBD; + int86(X00_VECTOR, &x00regs, &x00regs); + return x00regs.x.ax; +} + +unsigned int x00_read_kbd(void) +{ + x00regs.x.ax = READ_KBD; + int86(X00_VECTOR, &x00regs, &x00regs); + return x00regs.x.ax; +} + +void x00_flow_control(FOSSILFLOWCTRL f, PORT port) +{ + x00regs.x.ax = FLOW_CONTROL | 0xf0 | f.flowword; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +unsigned int x00_ctlc_ctlk_check(FOSSILCTLCCTLK c, PORT port) +{ + x00regs.x.ax = CTLC_CTLK_CHECK | c.checkword; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); + return x00regs.x.ax; +} + +void x00_set_cup(unsigned char row, unsigned char col) +{ + x00regs.x.ax = SET_CUP; + x00regs.x.dx = (row << 8) | col; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +void x00_get_cup(unsigned char *row, unsigned char *col) +{ + x00regs.x.ax = GET_CUP; + int86(X00_VECTOR, &x00regs, &x00regs); + *col = (unsigned char)(x00regs.x.dx & 0xff); + *row = (unsigned char)(x00regs.x.dx >> 8); +} + +void x00_write_ANSI_char(unsigned char c) +{ + x00regs.x.ax = WRITE_ANSI_CHAR | c; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +void x00_enable_watchdog(PORT port) +{ + x00regs.x.ax = ENABLE_WATCHDOG; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +void x00_disable_watchdog(PORT port) +{ + x00regs.x.ax = DISABLE_WATCHDOG; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +void x00_write_BIOS_char(unsigned char c) +{ + x00regs.x.ax = WRITE_BIOS_CHAR | c; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +unsigned int x00_insert_tick_func(void (far *tickfunc)()) +{ + unsigned int retval; + + x00regs.x.ax = INSERT_TICK_FUNC; + x00regs.x.dx = FP_OFF(tickfunc); + segread(&x00sregs); + x00sregs.es = FP_SEG(tickfunc); + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + if (x00regs.x.ax == 0x0000) + { + retval = X00_OK; + } + else retval = X00_INS_TICK; + return retval; +} + +unsigned int x00_delete_tick_func(void (far *tickfunc)()) +{ + unsigned int retval; + + x00regs.x.ax = DELETE_TICK_FUNC; + x00regs.x.dx = FP_OFF(tickfunc); + segread(&x00sregs); + x00sregs.es = FP_SEG(tickfunc); + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + if (x00regs.x.ax == 0x0000) + { + retval = X00_OK; + } + else retval = X00_DEL_TICK; + return retval; +} + +void x00_boot_machine(unsigned int boottype) +{ + x00regs.x.ax = BOOT_MACHINE | (boottype & 0x0001); + int86(X00_VECTOR, &x00regs, &x00regs); +} + +unsigned int x00_read_block(unsigned int count, void far *buf, PORT port) +{ + x00regs.x.ax = READ_BLOCK; + x00regs.x.cx = count; + x00regs.x.dx = port; + segread(&x00sregs); + x00sregs.es = FP_SEG(buf); + x00regs.x.di = FP_OFF(buf); + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + return x00regs.x.ax; +} + +unsigned int x00_write_block(unsigned int count, void far *buf, PORT port) +{ + x00regs.x.ax = WRITE_BLOCK; + x00regs.x.cx = count; + x00regs.x.dx = port; + segread(&x00sregs); + x00sregs.es = FP_SEG(buf); + x00regs.x.di = FP_OFF(buf); + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + return x00regs.x.ax; +} + +void x00_start_break_signal(PORT port) +{ + x00regs.x.ax = START_BREAK_SIGNAL; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +void x00_stop_break_signal(PORT port) +{ + x00regs.x.ax = STOP_BREAK_SIGNAL; + x00regs.x.dx = port; + int86(X00_VECTOR, &x00regs, &x00regs); +} + +unsigned int x00_get_driverinfo(void far *buf, PORT port) +{ + x00regs.x.ax = GET_DRIVER_INFO; + x00regs.x.cx = sizeof(FOSSILINFO); + segread(&x00sregs); + x00sregs.es = FP_SEG(buf); + x00regs.x.di = FP_OFF(buf); + x00regs.x.dx = port; + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + return x00regs.x.ax; +} + +unsigned int x00_install_appendage(unsigned char appcode, + void (far *appfunc)()) +{ + unsigned int retval; + + x00regs.x.ax = INSTALL_APPENDAGE | appcode; + segread(&x00sregs); + x00sregs.es = FP_SEG(appfunc); + x00regs.x.dx = FP_OFF(appfunc); + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + if (x00regs.x.ax == X00_PRESENT) + { + if ((x00regs.x.bx & 0xff00) == 1) + { + retval = X00_OK; + } + else retval = X00_INS_APP; + } + else retval = X00_NOT_HERE; + return retval; +} + +unsigned int x00_remove_appendage(unsigned char appcode, + void (far *appfunc)()) +{ + unsigned int retval; + + x00regs.x.ax = REMOVE_APPENDAGE | appcode; + segread(&x00sregs); + x00sregs.es = FP_SEG(appfunc); + x00regs.x.dx = FP_OFF(appfunc); + int86x(X00_VECTOR, &x00regs, &x00regs, &x00sregs); + if (x00regs.x.ax == X00_PRESENT) + { + if ((x00regs.x.bx & 0xff00) == 1) + { + retval = X00_OK; + } + else retval = X00_REM_APP; + } + else retval = X00_NOT_HERE; + return retval; +} + +#if __cplusplus + } +#endif -- cgit v1.2.3-54-g00ecf