home *** CD-ROM | disk | FTP | other *** search
- /*
- MYLIB2.C
-
- These routines are CONDITIONALLY compiled; i.e., only as needed.
-
- ----------------------------------------------------------------------
- Incorporates special mods used by my Backgammon game, BACKGMMN.C etc.
- ----------------------------------------------------------------------
-
- A set of common I/O functions that seem to turn up a lot in my programs,
- including terminal functions for Kaypro 10, 4'84, 2X etc.
-
- Uses Software Toolworks' C/80 3.1 compiler. Place #include "mylib2.c" at the
- end of your source file for correct CONDITIONAL COMPILATION.
-
- David C. Oshel
- 1219 Harding Ave.
- Ames, Iowa 50010
-
- Last modified: March 25, 1986
-
- -----------------------------------------------------------------------------
- ** WARNING ** These routines use direct console IO, bdos function 6!
-
- YOU MUST CALL INIT_LIB() BEFORE USING THESE ROUTINES!
-
- ======= UTILITIES =======
-
- * init_lib() - CALL THIS FIRST, OR THE RESULT WILL BE VERY STRANGE!
- *
- * puts(p) - unformatted print, e.g., puts("Hello, sailor!\n");
- * gets(p,max) - printable input only, no prompt character
- *
- * ask(p) - demand Yes or No response to question p
- * random() - effective random 16-bit integer IFF gets() is used
- * sleep(n) - sleep n/10ths of a second, roughly (from C80.LIB)
- * rollup() - roll up 23 lines of screen
- * ONscript() - printer echo ON for output via puts, chrout
- * OFFscript() - printer echo OFF for output via puts, chrout
- * ONinterrupt() - Ctl-C, Ctl-B cause program exit
- * OFFinterrupt() - Ctl-C, Ctl-B cause comedy
- * hide_input(p,max) - like gets, but used when entering passwords
- * chrout(c) - if scripting, echo output also to LST:
- * putscreen(p) - like puts, but always and only to screen
-
-
- ======= KAYPRO 10 TERMINAL/VIDEO FUNCTIONS =======
-
- * gotoxy(x,y) - 0,0 is top left, horz <= 79 precedes vert <= 24,
- * where 0,24 is on the 25th, status, line.
- * beep() - terminal bell
- * home() - home cursor, do not clear screen
- * clr_screen() - home and clear
- *
- * shadow_box(h,v,x1,y1,x2,y2) - like box, but with shadow, calls box
- * box(tlx,tly,brx,bry) - draw a line box, coords: topleft XY, bottomright XY
- * note that box calls ldraw(x1,y1,x2,y2), below
- *
- * clr_lend() - clear from cursor to end of line
- * clr_send() - clear from cursor to end of screen
- * rev_vid(),
- * nor_vid() - reverse field
- * dim_vid(),
- * bri_vid() - low/high intensity
- * on_blink(),
- * off_blink() - blinking chars
- * ul_start(),
- * ul_stop() - start/stop underline
- * save_cursor(),
- * retn_cursor() - remember/restore current cursor location
- * ins_line(),
- * del_line() - insert/delete screen text line
- * on_cursor(),
- * off_cursor() - hide/show cursor
- * vm_on(),
- * vm_off() - "Video Mode" commands
- * pixel(x,y) - draw pixel at x,y (video coords, x <= 159, y <= 99)
- * no_pixel(x,y) - erase pixel at x,y
- * ldraw(x1,y1,x2,y2) - draw/ erase graphics line, see discussion for box
- * lwipe(x1,y1,x2,y2) - range for video coordinates as for pixel
- */
-
-
- #ifndef TRUE
- #define TRUE 1
- #endif
- #ifndef FALSE
- #define FALSE 0
- #endif
-
-
- /* hide this here so's not to worry about it elsewhere */
- /* "printf.c" collides with one of these, can't remember which */
- /* puts() takes longer to write, but executes faster */
- extern char Cmode, IOpread[4], IOpwrit[4], IOpeof[4];
-
- /* make these known only to what follows */
- static int MYbstout, MYscrtp, MYretnirp; /* odd names mark semi-private */
- static unsigned RNDloc; /* effective random location, bumped by gets() */
- /* and scrambled when the LCG random() is called */
- /* makes a decent algorithm for interactive games */
-
-
- #ifneed init_lib
- init_lib() {
-
- MYretnirp = fopen("LST:","w");
- OFFscript();
- ONinterrupt();
- Cmode = 0;
- IOpread[0] = 6; IOpwrit[0] = 6;
-
- } /* end: init_lib */
- #endif
-
-
-
-
- #ifneed random
- random() { /* depends on effective random location spun by gets() */
-
- RNDloc = 2053 * RNDloc + 13849;
- return (RNDloc);
- }
- #endif
-
-
-
- #ifneed ONscript
- ONscript() {
-
- MYscrtp = TRUE;
-
- }
- #endif
- #ifneed OFFscript
- OFFscript() {
-
- MYscrtp = FALSE;
-
- }
- #endif
-
-
- #ifneed ONinterrupt
- ONinterrupt() {
-
- MYbstout = TRUE;
-
- }
- #endif
- #ifneed OFFinterrupt
- OFFinterrupt() {
-
- MYbstout = FALSE;
-
- }
- #endif
-
-
- #ifneed ask
- ask(p) char *p; {
-
- char ch, resp[2];
-
- loo: puts(p);
- gets(resp,1);
- ch = toupper( *resp );
- if ( !( ch == 'Y' || ch == 'N' )) {
- puts("Please answer the question, Yes or No.\n");
- goto loo;
- }
- return (ch == 'Y');
-
- } /* end: ask */
- #endif
-
-
- #ifneed rollup
- rollup() {
-
- int i;
-
- for (i=0; i<23; i++) puts("\n");
-
- } /* end: rollup */
- #endif
-
-
- #ifneed sleep
- sleep( n ) int n; { /* sleep for n/10 seconds, 0 <= n < 256 */
-
- n; /* get n into HL */
- #asm
- MOV B,L ;delay B/10ths of a second
- __DL0: MVI A,100 ;100 milliseconds, 1/10 second
- __DL1: MVI C,249 ;1 millisecond per unit of A at 4 MHz
- __DL2: DCR C ;Leventhal, Z80 Assembly Language Programming
- JNZ __DL2
- DCR A
- JNZ __DL1
- DCR B
- JNZ __DL0 ;on exit, HL has FALSE if n was 0, else TRUE
- #endasm
- } /* end: sleep */
- #endif
-
-
- /*========================================*/
- /* GETS(p, maxinput) */
- /* Local getline function with special *---* WARNING: */
- /* input handling, 1 <= len <= maxinput *---* Execute INIT_LIB() first !! */
- /* Updates effective random, RNDloc, */
- /* Forces input from CONSOLE only! */
- /*========================================*/
-
- #ifneed gets
- gets(p,maxinput) char *p; int maxinput; {
-
- /* This function depends on BDOS Function #6. Init_lib() sets Cmode=0 and
- IOpread[0]=6 and IOpwrit[0]=6 (courtesy of and peculiar to C/80 3.1)
- YOU must ensure that the target string is long enough to collect the
- entire maximum input allowed and specified, INCLUDING FINAL NULL! */
-
- static int len;
- static char ch;
-
- len = -1;
- if (maxinput < 1 || maxinput > 127) maxinput = 79;
-
- /*--------------------------------*/
- /* SPECIAL ROUTINE FOR BACKGAMMON */
- /*--------------------------------*/
-
- loo: while ( !(ch = getc(0)) ) acg(); /* keep the game lively */
-
- if (len < 0) len = 0; /* don't destroy prompt by backing up */
- if (ch == '\n') { /* end of line? don't store newline */
- *p = '\0'; /* mark it with a B for baby and me */
- /* chrout('\n'); */ /* but DON'T echo newline */
- return ( len ); /* <--- HERE IS THE FUNCTION EXIT! */
- }
- else if (ch == '\b' || ch == 0x7F) { /* backspace? rubout? */
- if (len--) { /* where's the prompt? */
- puts("\008 \008"); /* we're ok, echo erase */
- p--; /* delete from string */
- }
- }
-
- /*--------------------------------*/
- /* SPECIAL ROUTINE FOR BACKGAMMON */
- /*--------------------------------*/
-
- else if (ch == '\003') { /* user bailout key is Ctrl-C, not ESC */
- if (MYbstout) exit();
- else {
- haltgame(); /* sets whofirst flag and does jumpjack() */
- }
- }
-
- else if (ch == '\025' || ch == '\030') { /* Ctl-U, Ctl-X */
- while (len--) {
- p--;
- puts("\008 \008");
- }
- }
- else if (len == maxinput) { /* test specials before testing len */
- chrout('\007');
- }
- else if (ch > 31 && ch < 127) { /* printable char? */
- chrout(ch); /* yes, echo it */
- *p++ = ch; /* collect it */
- len++; /* keep track of it */
- }
- else { /* control chars? */
- chrout('\007');
- }
- goto loo;
-
- } /* end: gets */
- #endif
-
-
-
-
- #ifneed hide_input
- hide_input(s,len) char *s; int len; {
-
- /* receive at most len chars in s buffer,
- terminate string with zero,
- but echo each char with 1, 2, or 3 meaningless dots */
-
- char ch; int num;
-
- if ((len < 1) || (len > 127)) len = 127;
- num = 0;
- for (;;) { /* forever */
- while ((ch = getc(0)) == 0) /* bdos 6 does not wait, so we do */
- ;
- if ((ch == '\r') || (ch == '\n') || (num++ > len)) {
- /* not sure what the CR key actually is to bdos 6 & C/80 */
- *s++ = '\0';
- return; /* this way out */
- }
- if ((num % 2) == 0) putc('.',0); /* deception, illusion */
- if ((num % 5) == 0) putc('.',0);
- putc('.',0);
- *s++ = ch;
- }
-
- } /* end: hide_input */
- #endif
-
-
-
-
- /*------------------------ kpro stuff -------------------------*/
-
- #ifneed shadow_box
- /* like box, but with horizontal & vertical displacement for shadow */
- shadow_box(h,v,x1,y1,x2,y2) int h,v,x1,y1,x2,y2;
- {
- box(x1+h,y1+v,x2+h,y2+v); /* draw the shadow */
- box(x1,y1,x2,y2); /* draw the box */
- ldraw(x1+h,y1+v,x1,y1); /* draw the corners */
- ldraw(x2+h,y2+v,x2,y2);
- ldraw(x2+h,y1+v,x2,y1);
- ldraw(x1+h,y2+v,x1,y2);
- }
- #endif
-
-
- #ifneed box
- /* parameters are topleft X,Y and bottomright X,Y
- X ranges from 0 to 159, Y ranges from 0 to 99, top left is 0,0
- */
- box(x1,y1,x2,y2) int x1,y1,x2,y2; {
- ldraw(x1,y1,x1,y2);
- ldraw(x1,y2,x2,y2); /* appears to draw the box anticlockwise */
- ldraw(x2,y1,x2,y2);
- ldraw(x1,y1,x2,y1);
- }
- #endif
-
-
-
- #ifneed gotoxy
- gotoxy (xpos,ypos) int xpos,ypos; { /* 0,0 is top left corner */
- putscreen("\033=");
- putc(ypos+' ',0);
- putc(xpos+' ',0);
- }
- #endif
-
-
- #ifneed beep
- beep() { putc(7,0); } /* send bell character */
- #endif
-
- #ifneed home
- home() { putc(30,0); } /* home cursor to top left */
- #endif
-
- #ifneed clr_screen
- clr_screen() { putc(26,0); } /* home and erase screen */
- #endif
-
-
- #ifneed clr_lend
- clr_lend() { putc(24,0); } /* clear to end of line */
- #endif
-
- #ifneed clr_send
- clr_send() { putc(23,0); } /* clear to end of screen */
- #endif
-
-
-
- #ifneed rev_vid
- rev_vid() { putscreen ("\033B0"); } /* reverse background */
- #endif
-
- #ifneed nor_vid
- nor_vid() { putscreen ("\033C0"); }
- #endif
-
-
-
- #ifneed dim_vid
- dim_vid() { putscreen ("\033B1"); } /* low intensity */
- #endif
-
- #ifneed bri_vid
- bri_vid() { putscreen ("\033C1"); }
- #endif
-
-
-
- #ifneed on_blink
- on_blink() { putscreen ("\033B2"); } /* blinking characters */
- #endif
-
- #ifneed off_blink
- off_blink() { putscreen ("\033C2"); }
- #endif
-
-
-
- #ifneed ul_start
- ul_start() { putscreen ("\033B3"); } /* underline */
- #endif
-
- #ifneed ul_stop
- ul_stop() { putscreen ("\033C3"); }
- #endif
-
-
- #ifneed save_cursor
- save_cursor() { putscreen ("\033B6"); } /* remember cursor position */
- #endif
- #ifneed retn_cursor
- retn_cursor() { putscreen ("\033C6"); } /* return to remembered pos */
- #endif
-
-
- #ifneed on_status
- on_status() { putscreen ("\033B7"); } /* status line preservation on */
- #endif
- #ifneed off_status
- off_status() { putscreen ("\033C7"); }
- #endif
-
-
- #ifneed ins_line
- ins_line() { /* insert text line */
- putscreen("\033R");
- }
- #endif
- #ifneed del_line
- del_line() { /* delete text line */
- putscreen("\033E");
- }
- #endif
-
-
- #ifneed on_cursor
- on_cursor() { putscreen ("\033B4"); } /* (in)visible cursor */
- #endif
- #ifneed off_cursor
- off_cursor() { putscreen ("\033C4"); }
- #endif
-
-
-
- /* Video Mode ON/OFF: video WORD, 8 bit video if 15 and 7 are both high */
- /* VM-ON 10000001 11111111 VM-OFF */
- /* ^video ^x^video */
- /* otherwise, video BYTE, high bit 7 interprets bits 0-6 as screen dots */
- /* 11111111 */
- /* ^video */
- /* e.g., */
- /* Non-VideoMode VideoMode */
- /* xx 1 11:0 where % is 1 01:0 1 11:0 xx */
- /* xx 3 11 2 the video 3 00 2 3 11 2 xx */
- /* xx 5 11 4 flag bit, 5 00 4 5 11 4 xx */
- /* x 7:%1 6 x is pixel 7:%0 6 7:%1 6 xx */
- /* ^ ^ ^ */
- /* to set the pixels, first do a gotoxy to character screen position */
- /* this mode is faster than Pixel ON/OFF if values are drawn from table */
- #ifneed vm_on
- vm_on() { putscreen ("\033B5"); } /* video mode on */
- #endif
- #ifneed vm_off
- vm_off() { putscreen ("\033C5"); }
- #endif
-
-
- #ifneed pixel
- pixel(x,y) int x,y; { /* x <= 159, y <= 99 */
- putscreen("\033*");
- putc(y+' ',0); putc(x+' ',0);
- }
- #endif
-
- #ifneed no_pixel
- no_pixel(x,y) int x,y; { /* x <= 159, y <= 99 */
- putscreen("\033 ");
- putc(y+' ',0); putc(x+' ',0);
- }
- #endif
-
-
- #ifneed ldraw
- /* use x1 <= x2, y1 <= y2, order is significant (Kaypro bug?) */
- ldraw(x1,y1,x2,y2) int x1,x2,y1,y2; { /* x <= 159, y <= 99 */
- putscreen("\033L");
- putc(y1+' ',0); putc(x1+' ',0);
- putc(y2+' ',0); putc(x2+' ',0);
- }
- #endif
-
-
- #ifneed lwipe
- lwipe(x1,y1,x2,y2) int x1,x2,y1,y2; { /* x <= 159, y <= 99 */
- putscreen("\033D");
- putc(y1+' ',0); putc(x1+' ',0);
- putc(y2+' ',0); putc(x2+' ',0);
- }
- #endif
-
-
- #ifneed putscreen
- putscreen(p) char *p; {
-
- while (*p) putc(*p++,0);
-
- } /* end: putscreen */
- #endif
-
-
- #ifneed puts
- puts(p) char *p; {
-
- while (*p) chrout(*p++);
-
- } /* end: puts */
- #endif
-
-
- #ifneed chrout
- chrout(c) char c; { /* SPECIAL FOR SCRIPT OPTION WITH LST: */
-
- putc(c,0);
- if ( MYscrtp ) putc(c,MYretnirp);
-
- } /* end: chrout */
- #endif
-
- /* end: MYLIB.C */
-