diff options
Diffstat (limited to 'src/z_lp.c')
-rw-r--r-- | src/z_lp.c | 148 |
1 files changed, 0 insertions, 148 deletions
diff --git a/src/z_lp.c b/src/z_lp.c deleted file mode 100644 index bb1cc54..0000000 --- a/src/z_lp.c +++ /dev/null @@ -1,148 +0,0 @@ - /* - (c) 2000:forum::für::umläute:2004 - - write to the parallel port - extended to write to any port (if we do have permissions) -*/ -#define BASE0 0x3bc -#define BASE1 0x378 -#define BASE2 0x278 - -#define MODE_IOPERM 1 -#define MODE_IOPL 0 - -#include "zexy.h" - -/* ----------------------- lpt --------------------- */ - -#ifdef Z_WANT_LPT -# include <sys/io.h> -# include <stdlib.h> -static int count_iopl = 0; -#endif - - -static t_class *lpt_class; - -typedef struct _lpt -{ - t_object x_obj; - - unsigned long port; - - int mode; // MODE_IOPERM, MODE_IOPL -} t_lpt; - -static void lpt_float(t_lpt *x, t_floatarg f) -{ -#ifdef Z_WANT_LPT - if (x->port) { - unsigned char b = f; - outb(b, x->port); - } -#endif /* Z_WANT_LPT */ -} - -static void *lpt_new(t_symbol *s, int argc, t_atom *argv) -{ - t_lpt *x = (t_lpt *)pd_new(lpt_class); - if(s==gensym("lp")) - error("lpt: the use of 'lp' has been deprecated; use 'lpt' instead"); - -#ifdef Z_WANT_LPT - x->port = 0; - - if ((argc==0)||(argv->a_type==A_FLOAT)) { - /* FLOAT specifies a parallel port */ - switch ((int)((argc)?atom_getfloat(argv):0)) { - case 0: - x->port = BASE0; - break; - case 1: - x->port = BASE1; - break; - case 2: - x->port = BASE2; - break; - default: - error("lpt : only lpt0, lpt1 and lpt2 are accessible"); - x->port = 0; - return (x); - } - } else { - /* SYMBOL might be a file or a hex port-number; - we ignore the file (device) case by now; - LATER think about this - */ - x->port=strtol(atom_getsymbol(argv)->s_name, 0, 16); - } - - if (!x->port || x->port>65535){ - post("lpt : bad port %x", x->port); - x->port = 0; - return (x); - } - - if (x->port && x->port < 0x400){ - if (ioperm(x->port, 8, 1)) { - error("lpt : couldn't get write permissions"); - x->port = 0; - return (x); - } - x->mode = MODE_IOPERM; - } else { - if (iopl(3)){ - error("lpt : couldn't get write permissions"); - x->port = 0; - return (x); - } - x->mode=MODE_IOPL; - count_iopl++; - // post("iopl.............................%d", count_iopl); - } - - post("connected to port %x in mode '%s'", x->port, (x->mode==MODE_IOPL)?"iopl":"ioperm"); - if (x->mode==MODE_IOPL)post("warning: this might seriously damage your pc..."); -#else - error("zexy has been compiled without [lpt]!"); -#endif /* Z_WANT_LPT */ - - return (x); -} - -static void lpt_free(t_lpt *x) -{ -#ifdef Z_WANT_LPT - if (x->port) { - if (x->mode==MODE_IOPERM && ioperm(x->port, 8, 0)) error("lpt: couldn't clean up device"); - else if (x->mode==MODE_IOPL && (!--count_iopl) && iopl(0)) - error("lpt: couldn't clean up device"); - } -#endif /* Z_WANT_LPT */ -} - - -static void helper(t_lpt *x) -{ - post("\n%c lpt :: direct access to the parallel port", HEARTSYMBOL); - post("<byte>\t: write byte to the parallel-port"); - post("\ncreation:\t\"lpt [<port>]\": connect to parallel port <port> (0..2)"); - post("\t\t\"lpt <portaddr>\": connect to port @ <portaddr> (hex)"); -} - -void z_lpt_setup(void) -{ - lpt_class = class_new(gensym("lpt"), - (t_newmethod)lpt_new, (t_method)lpt_free, - sizeof(t_lpt), 0, A_GIMME, 0); - class_addcreator((t_newmethod)lpt_new, gensym("lp"), A_GIMME, 0); - - class_addfloat(lpt_class, (t_method)lpt_float); - - class_addmethod(lpt_class, (t_method)helper, gensym("help"), 0); - class_sethelpsymbol(lpt_class, gensym("zexy/lpt")); -} - -void z_lp_setup(void){ - z_lpt_setup(); -} |