home *** CD-ROM | disk | FTP | other *** search
- /* Program ospeed.c --- displays Osborne 1 disk speed */
- /* Copyright 1984 by Bob Briggs */
- /* May be copied freely but not for profit */
-
- /* Based on counting clock cycles through one rotation of index hole */
- /* Period is 200 milliseconds (300 RPM), Osborne clock is 15.9744/4 MHz */
- /* Software loop is 80 T (clock) cycles */
- /* Correct count of times through software loop */
- /* per index hole is 200*15974.4/4/80 = 9984 */
- /* Calculated speed = 300*9984/(measured count) RPM */
-
- /* Compiles with Software Toolworks C/80 */
-
- /* Must assemble above 4000 Hex. */
- /* In C/80, modify CLIBRARY.ASM as follows: */
- /* After ORG 256, add lines: */
- /* (space) JMP 4000H */
- /* (space) ORG 4000H */
- /* */
- /* To reduce size of .COM file, move program to lower memory with DDT */
- /* after assembly and then insert move routine to move back to 4000H at */
- /* runtime. The following accomplishes this */
- /* 1. Load the program and DDT with the command DDT OSPD.COM */
- /* 2. Move the program to lower memory with the command M4000,5C00,110 */
- /* 3. Use DDT commands to load in the following block move and SAVE */
- /* S100
- /* 0100 C3 21 LD HL,0110H ;SOURCE
- /* 0101 00 10 LD DE,4000H ;DESTINATION
- /* 0102 40 01 LD BC,1C00H ;BLOCK SIZE
- /* 0103 00 11 LDIR ;MOVE IT
- /* 0104 00 00 JMP 4000H ;CONTINUE
- /* 0105 00 40
- /* 0106 00 01
- /* 0107 00 00
- /* 0108 00 1C
- /* 0109 00 ED
- /* 010A 00 B0
- /* 010B 00 C3
- /* 010C 00 00
- /* 010D 00 40
- /* 010E 00 .
- /* - ^C exits DDT
- /* SAVE 28 OSPD.COM creates new file */
- /* */
- #define HOME 0xF000 /* upper left of Osborne screen RAM */
- #define LINE 128 /* screen line width */
- #define NULL 0
- #define STODIM 015DH /* ROM location of dim control routine */
- #define WIDCON 0X2400 /* Screenwidth control port in bank 2 */
-
- main()
- {
- int speed, pd; /* disk speed, period */
- int d; /* current logged drive */
- int m; /* motor to be started */
- int c, i; /* dummy variables */
- char *p; /* text pointer */
- int w; /* screenwidth = 52, 80, or 100 */
-
-
- cls(); /* clear screen and reset screen window */
- w = 52; /* screen width 52 columns */
- setwid(w); /* set screenwidth */
- d = getdsk() + 1; /* current logged drive, A = 1, B = 2 */
- while(1) /* keep looping on menu */
- {
- blanksc(); /* fill screen with spaces (avoids BDOS keybd chk) */
- for(i = 0; i < 100; ++i) while(keychk() != NULL); /* wait for key release */
- brite(); /* undim screen */
- greet(); /* sign on message asks for L or R key */
- motor(0); /* turn off disk drive motor(s) */
-
- for(i = 0; i < 100; ++i) while(keychk() != NULL); /* wait for key release */
- /* needed after first time */
- /* through menu loop */
-
- do /* choose left or right disk */
- switch(c = lrkey()) /* get l or r key from keyboard input */
- {
- case 'l':
- blanksc(); /* fill screen with spaces */
- p = " Left Disk: hold down SPACE BAR to stop"; i = 21;
- putstr(p,i);
- p = " Correct speed = 300 RPM (295 - 305 OK)"; i = 22;
- putstr(p,i);
- m = 1; /* left motor */
- motor(m); /* start left motor */
- break; /* out of switch */
- case 'r':
- blanksc(); /* fill screen with spaces */
- p = " Right Disk: hold down SPACE BAR to stop"; i = 21;
- putstr(p,i);
- p = " Correct speed = 300 RPM (295 - 305 OK)"; i = 22;
- putstr(p,i);
- m = 2; /* right motor */
- motor(m); /* start right motor */
- break;
- case -1: /* not l or r key so exit */
- blanksc(); /* fill screen with spaces */
- p = " Stopped on keyboard command"; i = 18;
- putstr(p,i);
- for(i = 0; i < 100; ++i) while(keychk() != NULL); /* wait for key release */
- brite(); /* undim screen */
- setwid(80); /* set screenwidth to 80 columns */
- motor(0); /* stop motors */
- for(i = 0; i < 10; ++i) rdcon(); /* clear console buffer */
- motor(d); /* start current logged drive motor */
- exit(); /* exit to current disk */
- break;
- default:
- c = NULL; /* not a valid key */
- break;
- }
- /* endo */ while(c == NULL); /* wait for valid key */
-
- for(i = 0; i < 100; ++i) while(keychk() != NULL); /* wait for key release */
-
- while(pd = getpd()) /* get disk rotation period */
- { speed = 602 - pd/33; /* approximation for speed = 300*9984/pd */
- intdisp(speed); /* display speed on screen */
- britedim(); /* alternate display intensity */
- motor(m); /* restart motor stopped by timeout */
- /* can't disable timeout because */
- /* ROM STODIM routine has EI */
- }
- }
- }
-
- cls() /* clear screen */
- {
- #asm
- MVI E,1AH
- MVI C,2
- CALL 5
- #endasm
- }
-
- blanksc() /* blank screen rows 1 - 23, columns 1 - 60 */
- {
- char *p,*q;
-
- for(p = HOME; p < (HOME + 24*LINE); p += LINE)
- for(q = p; q <= (p + 60); ++q)
- *q = ' ';
- }
-
- greet()
- {
- char *p; /* character pointer */
- int l; /* line number */
-
- p = " Disk speed test program for Osborne 1"; l = 5;
- putstr(p,l);
-
- p = "Make sure drives to be tested contain disks"; l = 12;
- putstr(p,l);
-
- p = "Press L or R to select Left or Right Disk Drive"; l = 16;
- putstr(p,l);
-
- p = "Any other key terminates program"; l = 18;
- putstr(p,l);
- }
-
- putstr(p,lin) /* output string to screen at line number lin */
- char *p;
- int lin;
- {
- char *q;
-
- q = HOME + lin*LINE + 2;
- while(*p) *q++ = *p++;
- }
-
- intdisp(n) int n; /* displays integer in decimal format */
- {
- int i;
- i = 3;
-
- while(n > 0) /* display right hand digit first */
- { dispbig(n%10,i--); /* use big digits */
- n /= 10;
- }
- }
-
- /* lrkey() checks for keys L or l or R or r */
- lrkey()
- { int i;
-
- if(keychk() == 0) return(0);
- else if(lkey() == 1) return('l');
- else if(rkey() == 1) return('r');
- else return(-1); /* some other key was pressed */
- }
-
- motor(i)
- int i;
- {
- if(i == 0)
- #asm
- ;turn motors off
- CALL SETROM ;ENTER SHADOW MODE
- LDA 2C02H ;GET PIA STATUS
- ANI 03FH ;RESET BITS 6,7
- STA 2C02H ;BOTH DRIVES OFF
- CALL SETRAM ;EXIT SHADOW MODE
- EI ;ENABLE INTERRUPTS
- #endasm
- ;
- if(i == 1)
- #asm
- ;select left drive
- CALL SETROM ;ENTER SHADOW MODE
- LDA 2C02H ;GET PIA STATUS
- ORI 40H ;SET BIT 6
- ANI 07FH ;RESET BIT 7
- STA 2C02H ;LEFT DRIVE ON, RIGHT 0FF
- CALL SETRAM ;EXIT SHADOW MODE
- #endasm
- ;
-
- if(i == 2)
- #asm
- ;select right drive
- CALL SETROM ;ENTER SHADOW MODE
- LDA 2C02H ;GET PIA STATUS
- ORI 80H ;SET BIT 7
- ANI 0BFH ;RESET BIT 6
- STA 2C02H ;LEFT DRIVE OFF, RIGHT ON
- CALL SETRAM ;EXIT SHADOW MODE
- #endasm
- ;
- }
-
- getdsk() /* get logged disk drive */
- {
- #asm
- MVI C,19H ;return current disk function
- CALL 5
- LXI H,0
- MOV L,A ;answer returned in HL
- #endasm
- }
-
- getpd() /* get period of disk rotation */
- {
- #asm
-
- ;send cmd type 1 to
- ;access index status
- CALL SETROM ;ENTER SHADOW
- MVI A,03H ;RESTORE COMMAND
- STA 2100H ;NEED TYPE 1 CMD TO
- ;ENABLE INDEX STATUS
- ;
- DI ;OTHERWISE DISK TIMEOUT
- ;CAN CRASH PROGRAM
- STAT1 LDA 2100H ;GET DISK STATUS
- ANI 02H ;MASK INDEX HOLE
- JZ STAT1 ;WAIT FOR INDEX
- ;
- STAT2 LDA 2100H ;GET DISK STATUS
- ANI 02H ;MASK INDEX HOLE
- JNZ STAT2 ;WAIT FOR NO INDEX
- ;
- LXI H,00H ;INITIALIZE CNTR1
- ;
- COUNT1 INX H ;BUMP CNTR1
- LDA 2220H ;KYBD ROW 5
- ANI 08H ;SPACE BAR
- JZ EXIT ;EXIT IF PRESSED
- LDA 2100H ;GET DISK STATUS
- ANI 02H ;MASK INDEX HOLE
- JZ COUNT1 ;WAIT FOR INDEX
- ;
- COUNT2 INX H ;6 CLOCK CYCLES
- LDA 2220H ;13
- ANI 08H ;7
- JZ EXIT ;10
- LDA 2100H ;13
- ANI 02H ;7
- JNZ COUNT2 ;10
- ; TOTAL: 66 CLOCK CYCLES
- ; PLUS 14 WAIT STATES
- ; EQUALS 80 CYCLES IN LOOP
- JMP END ;DONE
- ;
- SETROM DI ;SWITCH TO ROM BANK
- PUSH PSW ;SAVE A, FLAGS
- OUT 0 ;SET ROMBANK
- XRA A ;CLEAR A
- STA 0EF08H ;STORE FLAG
- POP PSW ;RESTORE A, FLAGS
- ; EI ;LEAVE DISABLED OR
- ;DISK TIMEOUT CAN
- ;CRASH PROGRAM
- RET
-
- SETRAM DI ;SWITCH TO RAM BANK
- PUSH PSW ;SAVE A, FLAGS
- OUT 01 ;SET RAMBANK
- MVI A,1 ;FLAG
- STA 0EF08H ;STORE FLAG
- POP PSW
- ; EI
- RET
- ;
-
- EXIT LXI H,0 ;KEY PRESSED
- END CALL SETRAM ;EXIT SHADOW MODE
- ; EI ;ENABLE INTERRUPTS
- #endasm ;disk speed returned in HL
- }
-
- /* keychk() checks if any key down */
- /* Cannot call BDOS because disk stops */
- keychk()
- {
- #asm
- CALL SETROM ;leaves interrupts disabled
- LXI H,0 ;initialize HL
- LDA 227EH ;keyboard, all rows but capslock
- CPI 0FFH ;any key
- CALL SETRAM
- RZ ;return 0 if no keydown
- MVI L,01 ;return 1 if keydown
- #endasm
- }
-
- /* lkey() checks for key L or key l */
- lkey()
- {
- #asm
- CALL SETROM
- LXI H,0
- LDA 2240H ;keyboard row containing 'L'
- CPI 0BFH ;seventh column contains 'L'
- CALL SETRAM
- RNZ ;return 0 if not 'L' or 'l'
- MVI L,01 ;return 1 if 'L' or 'l'
- #endasm
- }
-
- /* rkey() checks for key R or key r */
- rkey()
- {
- #asm
- CALL SETROM
- LXI H,0
- LDA 2204H ;keyboard row containing 'R'
- CPI 0F7H ;fourth column contains 'R'
- CALL SETRAM
- RNZ ;return 0 if not 'R' or 'r'
- MVI L,01 ;return 1 if 'R' or 'r'
- #endasm
- }
-
- /* dispbig(n,m) displays a number n in big font at position m = 1, 2, or 3 */
- dispbig(n,m) int n,m;
- {
- char *p;
- int r,c,o; /* row, column, offset */
-
- static char one[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,32,32,32,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,22,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,32,32,22,22,32,32,32,32},
- {32,32,32,22,22,22,22,22,22,32,32},
- {32,32,32,22,22,22,22,22,22,32,32}
- };
-
- static char two[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,22,22,22,22,32,32,32,32},
- {32,32,22,22,22,22,22,22,32,32,32},
- {32,22,22,32,32,32,32,22,22,32,32},
- {32,22,22,32,32,32,32,22,22,32,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,22,22,22,32},
- {32,32,32,32,32,32,22,22,22,32,32},
- {32,32,32,32,32,22,22,22,32,32,32},
- {32,32,32,32,22,22,22,32,32,32,32},
- {32,32,32,22,22,22,32,32,32,32,32},
- {32,32,22,22,22,32,32,32,32,32,32},
- {32,22,22,22,32,32,32,32,32,32,32},
- {32,22,22,32,32,32,32,32,32,32,32},
- {22,22,22,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {22,22,22,22,22,22,22,22,22,22,32},
- {22,22,22,22,22,22,22,22,22,22,32}
- };
-
- static char three[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,32,22,22,22,32,32,32,32},
- {32,32,22,22,22,22,22,22,32,32,32},
- {32,32,22,22,32,32,32,22,22,32,32},
- {32,32,32,32,32,32,32,22,22,32,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,22,22,32,32},
- {32,32,32,32,32,32,32,22,22,32,32},
- {32,32,32,32,22,22,22,22,32,32,32},
- {32,32,32,32,22,22,22,22,32,32,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,32,22,22},
- {32,32,32,32,32,32,32,32,32,22,22},
- {32,32,32,32,32,32,32,32,32,22,22},
- {32,32,32,32,32,32,32,32,32,22,22},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,22,22,22,22,22,22,22,22,22,32},
- {32,32,32,22,22,22,22,22,32,32,32}
- };
-
- static char four[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,32,32,32,22,22,32,32,32},
- {32,32,32,32,32,32,22,22,32,32,32},
- {32,32,32,32,32,22,22,22,32,32,32},
- {32,32,32,32,22,22,22,22,32,32,32},
- {32,32,32,22,22,32,22,22,32,32,32},
- {32,32,32,22,22,32,22,22,32,32,32},
- {32,32,22,22,32,32,22,22,32,32,32},
- {32,22,22,32,32,32,22,22,32,32,32},
- {32,22,22,32,32,32,22,22,32,32,32},
- {22,22,32,32,32,32,22,22,32,32,32},
- {22,22,22,22,22,22,22,22,22,22,32},
- {22,22,22,22,22,22,22,22,22,22,32},
- {32,32,32,32,32,32,22,22,32,32,32},
- {32,32,32,32,32,32,22,22,32,32,32},
- {32,32,32,32,32,32,22,22,32,32,32},
- {32,32,32,32,32,32,22,22,32,32,32},
- {32,32,32,32,32,32,22,22,32,32,32},
- {32,32,32,32,32,22,22,22,22,32,32},
- {32,32,32,32,32,22,22,22,22,32,32}
- };
-
- static char five[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,22,22,22,22,22,22,22,22},
- {32,32,22,22,22,22,22,22,22,22,22},
- {32,32,22,22,32,32,32,32,32,32,32},
- {32,22,22,32,32,32,32,32,32,32,32},
- {32,22,22,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,22,22,22,22,22,22,32,32,32},
- {22,22,22,22,22,22,22,22,22,32,32},
- {32,32,32,32,32,32,32,22,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,32,22,22},
- {32,32,32,32,32,32,32,32,32,22,22},
- {32,32,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,22,22,22,22,22,22,22,22,22,32},
- {32,32,32,22,22,22,22,22,32,32,32}
- };
-
- static char six[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,22,22,22,22,22,32,32,32},
- {32,32,22,22,22,22,22,22,22,32,32},
- {32,22,22,22,32,32,32,22,22,22,32},
- {22,22,22,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,32,22,22,22,22,22,32,32,32},
- {22,22,22,22,22,22,22,22,22,32,32},
- {22,22,22,22,32,32,32,22,22,22,32},
- {22,22,22,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,22,32,32,32,32,32,22,22,22},
- {32,22,22,22,32,32,32,22,22,22,32},
- {32,22,22,22,22,22,22,22,22,22,32},
- {32,32,32,22,22,22,22,22,32,32,32}
- };
-
- static char seven[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {22,22,22,22,22,22,22,22,22,22,32},
- {22,22,22,22,22,22,22,22,22,22,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,22,22,22,32},
- {32,32,32,32,32,32,22,22,22,32,32},
- {32,32,32,32,32,22,22,22,32,32,32},
- {32,32,32,32,22,22,22,32,32,32,32},
- {32,32,32,22,22,22,32,32,32,32,32},
- {32,32,32,22,22,32,32,32,32,32,32},
- {32,32,22,22,22,32,32,32,32,32,32},
- {32,32,22,22,32,32,32,32,32,32,32},
- {32,22,22,22,32,32,32,32,32,32,32},
- {32,22,22,32,32,32,32,32,32,32,32},
- {22,22,22,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32},
- {22,22,32,32,32,32,32,32,32,32,32}
- };
-
- static char eight[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,32,22,22,22,32,32,32,32},
- {32,32,32,22,22,22,22,22,32,32,32},
- {32,32,22,22,32,32,32,22,22,32,32},
- {32,32,22,22,32,32,32,22,22,32,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,32,22,22,32,32,32,22,22,32,32},
- {32,32,22,22,32,32,32,22,22,32,32},
- {32,32,32,22,22,22,22,22,32,32,32},
- {32,32,22,22,22,22,22,22,22,32,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,32,22,22,22,22,22,22,22,32,32},
- {32,32,32,22,22,22,22,22,32,32,32}
- };
-
- static char nine[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,22,22,22,22,32,32,32,32},
- {32,32,22,22,22,22,22,22,32,32,32},
- {32,22,22,22,32,32,22,22,22,32,32},
- {32,22,22,32,32,32,32,22,22,32,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {32,22,22,32,32,32,32,22,22,22,32},
- {32,22,22,22,32,32,22,22,22,22,32},
- {32,32,22,22,22,22,22,22,22,22,32},
- {32,32,32,22,22,22,22,32,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {32,32,32,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,22,22,32,32},
- {32,22,22,32,32,32,32,22,22,32,32},
- {32,32,22,22,22,22,22,22,32,32,32},
- {32,32,32,22,22,22,22,32,32,32,32}
- };
-
- static char zero[20][11] =
- { {32,32,32,32,32,32,32,32,32,32,32},
- {32,32,32,22,22,22,22,22,32,32,32},
- {32,32,22,22,22,22,22,22,22,32,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {22,22,32,32,32,32,32,32,32,22,22},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,22,22,32,32,32,32,32,22,22,32},
- {32,32,22,22,22,22,22,22,22,32,32},
- {32,32,32,22,22,22,22,22,32,32,32}
- };
-
- if(m == 1) o = 02; /* character starting offset */
- if(m == 2) o = 19;
- if(m == 3) o = 36;
-
- for(r = 0; r < 20; ++r)
- { p = HOME + o + r*LINE;
- for(c = 0; c < 11; ++c)
- switch (n)
- { case 1: *p++ = one[r][c]; break;
- case 2: *p++ = two[r][c]; break;
- case 3: *p++ = three[r][c]; break;
- case 4: *p++ = four[r][c]; break;
- case 5: *p++ = five[r][c]; break;
- case 6: *p++ = six[r][c]; break;
- case 7: *p++ = seven[r][c]; break;
- case 8: *p++ = eight[r][c]; break;
- case 9: *p++ = nine[r][c]; break;
- case 0: *p++ = zero[r][c]; break;
- default: *p++ = zero[r][c]; break;
- }
- }
- }
-
- britedim() /* alternate intensity of screen rows 1 - 20, columns 1 - 60 */
- {
- static int i = 0;
-
- (i == 0) ? (i = 1) : (i = 0); /* reverse i */
-
- if(i == 0) brite();
- else dim();
- }
-
- brite() /* make screen bright */
- {
- char *p,*q;
-
- for(p = HOME; p < (HOME + 21*LINE); p += LINE)
- for(q = p; q <= (p + 60); ++q)
- stobrite(q);
- }
-
- dim() /* make screen dim */
- {
- char *p,*q;
- for(p = HOME; p < (HOME + 21*LINE); p += LINE)
- for(q = p; q <= (p + 60); ++q)
- stodim(q);
- }
-
- stobrite(q) char *q;
- {
- q; /* put q in HL */
-
- #asm
- CALL SETROM ;switch to ROM
- MVI B,0FFH ;all bits hi
- CALL STODIM ;put in dimRAM
- CALL SETRAM ;switch back to RAM
- #endasm
- }
-
- /* STODIM is in ROM and looks like this:
-
- 015D JMP O6D5
- 06D5 DI
- OUT 2
- MOV M,B
- OUT 3
- EI
- RET
- */
-
- stodim(q) char *q;
- {
- q; /* put q in HL */
-
- #asm
- CALL SETROM ;switch to ROM
- MVI B,07FH ;bit 8 lo
- CALL STODIM ;put in dimRAM
- CALL SETRAM ;switch back to RAM
- #endasm
- }
-
- setwid(w) int w; /* sets screenwidth to 52, 80, or 100 columns */
- {
- char c; /* screen width: 1 = 100 columns */
- /* 2 = 52 columns */
- /* 3 = 80 columns */
-
- char *pw; /* pointer to screen width control port */
-
- pw = WIDCON; /* points to screenwidth control port */
-
- switch(w)
- { case 52: c = 2; break;
- case 80: c = 3; break;
- case 100: c = 1; break;
- default: c = 3;
- }
-
- #asm
- CALL SETROM ;switch to ROM
- #endasm
-
- *pw = c; /* set screenwidth */
-
- #asm
- CALL SETRAM ;switch back to RAM
- #endasm
- }
-
- rdcon() /* read console */
- {
- #asm
- MVI E,0FFH
- MVI C,6
- CALL 5
- #endasm
- }
-