home *** CD-ROM | disk | FTP | other *** search
- /*
- cOMMODORE 64 eMULATOR V0.4 eARLE f. pHILHOWER iii
- cOPYRIGHT (c) 1993-4 (ST916W9R@DUNX1.OCS.DREXEL.EDU)
-
- tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
- IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
- THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
- (AT YOUR OPTION) ANY LATER VERSION.
-
- tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
- BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
- merchantability OR fitness for a particular purpose. sEE THE
- gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
-
- yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
- ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
- fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
- */
-
- #INCLUDE "pROCESSOR.H"
- #INCLUDE "kEYBOARD.H"
- #INCLUDE "sTACK.H"
-
- BYTE KEYsCAN[8];
- BYTE SCANcODE[256];
-
- STATIC VOID sETUPsCANcODES()
- {$7b}
- INT X;
- BYTE Y, Z;
-
- FOR (X=0; X<256; X++)
- {$7b}
- Z=255;
- Y=X^255;
- IF (Y&1) Z &=KEYsCAN[0];
- IF (Y&2) Z &=KEYsCAN[1];
- IF (Y&4) Z &=KEYsCAN[2];
- IF (Y&8) Z &=KEYsCAN[3];
- IF (Y&16) Z &=KEYsCAN[4];
- IF (Y&32) Z &=KEYsCAN[5];
- IF (Y&64) Z &=KEYsCAN[6];
- IF (Y&128) Z &=KEYsCAN[7];
- SCANcODE[X]=Z;
- {$7d}
- {$7d}
-
- VOID aPPLEsCANkEYBOARD(BYTE CHR, INT MODIFIERS)
- {$7b}
- /* cLEAR OUT THE SCANCODES */
- KEYsCAN[0]=KEYsCAN[1]=KEYsCAN[2]=KEYsCAN[3]=KEYsCAN[4]=KEYsCAN[5]=KEYsCAN[6]=KEYsCAN[7]=255;
-
- IF (CHR==13)
- {$7b}
- /* return */
- KEYsCAN[0] -=2;
- IF (MODIFIERS&SHIFTkEY) KEYsCAN[1]-=128;
- sETUPsCANcODES();
- RETURN;
- {$7d}
-
- IF (CHR==0X08)
- {$7b}
- /* delete */
- KEYsCAN[0] -= 1;
- IF (MODIFIERS&SHIFTkEY) KEYsCAN[1]-=128;
- sETUPsCANcODES();
- RETURN;
- {$7d}
-
- IF (CHR==0X1B)
- {$7b}
- /* run/stop */
- KEYsCAN[7]-=128;
- sETUPsCANcODES();
- RETURN;
- {$7d}
-
- IF (CHR=='{$60}')
- {$7b}
- /* run/stop - restore */
- KEYsCAN[7]-=128;
- pUSHwORD(PC);
- pUSH(FLAGS);
- PC=wORDaT(nmitO);
- sETUPsCANcODES();
- RETURN;
- {$7d}
-
- IF (MODIFIERS&OPTIONkEY)
- {$7b}
- SWITCH(CHR)
- {$7b}
- /* f1, f2 */
- CASE 0XAA: KEYsCAN[1]-=128;
- CASE 0XC1: KEYsCAN[0]-=16; BREAK;
-
- /* f3, f4 */
- CASE 0XA2: KEYsCAN[1]-=128;
- CASE 0XA3: KEYsCAN[0]-=32; BREAK;
-
- /* f5, f6 */
- CASE 0XA4: KEYsCAN[1]-=128;
- CASE 0XB0: KEYsCAN[0]-=64; BREAK;
-
- /* f7, f8 */
- CASE 0XA5: KEYsCAN[1]-=128;
- CASE 0XA6: KEYsCAN[0]-=8; BREAK;
- {$7d}
- sETUPsCANcODES();
- RETURN;
- {$7d}
-
- IF (CHR==' ')
- {$7b}
- /* space */
- IF (MODIFIERS&SHIFTkEY) KEYsCAN[1]-=128;
- KEYsCAN[7]-=16;
- sETUPsCANcODES();
- RETURN;
- {$7d}
-
- IF ((CHR>=1)&&(CHR<=26))
- {$7b}
- /* mAKE control DOWN, MUNGE THE CHARS UP INTO ascii FOR FOLLOWING */
- KEYsCAN[7]-=4;
- CHR +=64+32;
- {$7d}
-
- IF (((CHR>='a')&&(CHR<='z')){$7c}{$7c}((CHR>='A')&&(CHR<='Z')))
- {$7b}
- IF (CHR<'A') KEYsCAN[1] -= 128;
- ELSE CHR -=32;
-
- SWITCH (CHR)
- {$7b}
- CASE 'a' : KEYsCAN[1]-=4; BREAK;
- CASE 'b' : KEYsCAN[3]-=16; BREAK;
- CASE 'c' : KEYsCAN[2]-=16; BREAK;
- CASE 'd' : KEYsCAN[2]-=4; BREAK;
- CASE 'e' : KEYsCAN[1]-=64; BREAK;
- CASE 'f' : KEYsCAN[2]-=32; BREAK;
- CASE 'g' : KEYsCAN[3]-=4; BREAK;
- CASE 'h' : KEYsCAN[3]-=32; BREAK;
- CASE 'i' : KEYsCAN[4]-=2; BREAK;
- CASE 'j' : KEYsCAN[4]-=4; BREAK;
- CASE 'k' : KEYsCAN[4]-=32; BREAK;
- CASE 'l' : KEYsCAN[5]-=4; BREAK;
- CASE 'm' : KEYsCAN[4]-=16; BREAK;
- CASE 'n' : KEYsCAN[4]-=128; BREAK;
- CASE 'o' : KEYsCAN[4]-=64; BREAK;
- CASE 'p' : KEYsCAN[5]-=2; BREAK;
- CASE 'q' : KEYsCAN[7]-=64; BREAK;
- CASE 'r' : KEYsCAN[2]-=2; BREAK;
- CASE 's' : KEYsCAN[1]-=32; BREAK;
- CASE 't' : KEYsCAN[2]-=64; BREAK;
- CASE 'u' : KEYsCAN[3]-=64; BREAK;
- CASE 'v' : KEYsCAN[3]-=128; BREAK;
- CASE 'w' : KEYsCAN[1]-=2; BREAK;
- CASE 'x' : KEYsCAN[2]-=128; BREAK;
- CASE 'y' : KEYsCAN[3]-=2; BREAK;
- CASE 'z' : KEYsCAN[1]-=16; BREAK;
- {$7d}
- sETUPsCANcODES();
- RETURN;
- {$7d}
- ELSE IF ((CHR>='0')&&(CHR<='9'))
- {$7b}
- SWITCH(CHR)
- {$7b}
- CASE '0': KEYsCAN[4]-=8; BREAK;
- CASE '1': KEYsCAN[7]-=1; BREAK;
- CASE '2': KEYsCAN[7]-=8; BREAK;
- CASE '3': KEYsCAN[1]-=1; BREAK;
- CASE '4': KEYsCAN[1]-=8; BREAK;
- CASE '5': KEYsCAN[2]-=1; BREAK;
- CASE '6': KEYsCAN[2]-=8; BREAK;
- CASE '7': KEYsCAN[3]-=1; BREAK;
- CASE '8': KEYsCAN[3]-=8; BREAK;
- CASE '9': KEYsCAN[4]-=1; BREAK;
- {$7d}
- sETUPsCANcODES();
- RETURN;
- {$7d}
- ELSE IF ((CHR>=0X1C)&&(CHR<=0X1F))
- {$7b}
- SWITCH (CHR)
- {$7b}
- /* up/down */
- CASE 0X1C: KEYsCAN[1] -=128;
- CASE 0X1D: KEYsCAN[0] -=4; BREAK;
- /* left/right */
- CASE 0X1E: KEYsCAN[1] -=128;
- CASE 0X1F: KEYsCAN[0] -=128; BREAK;
- {$7d}
- sETUPsCANcODES();
- RETURN;
- {$7d}
- ELSE IF ((CHR>='!')&&(CHR<='/'))
- {$7b}
- SWITCH (CHR)
- {$7b}
- CASE '!': KEYsCAN[1] -=128; KEYsCAN[7] -=1; BREAK;
- CASE '"': KEYsCAN[1] -=128; KEYsCAN[7] -=8; BREAK;
- CASE '#': KEYsCAN[1] -=128; KEYsCAN[1] -=1; BREAK;
- CASE '$': KEYsCAN[1] -=128; KEYsCAN[1] -=8; BREAK;
- CASE '%': KEYsCAN[1] -=128; KEYsCAN[2] -=1; BREAK;
- CASE '&': KEYsCAN[1] -=128; KEYsCAN[2] -=8; BREAK;
- CASE 39 : KEYsCAN[1] -=128; KEYsCAN[3] -=1; BREAK;
- CASE '(': KEYsCAN[1] -=128; KEYsCAN[3] -=8; BREAK;
- CASE ')': KEYsCAN[1] -=128; KEYsCAN[4] -=1; BREAK;
- CASE '*': KEYsCAN[6] -=2; BREAK;
- CASE '+': KEYsCAN[5] -=1; BREAK;
- CASE ',': KEYsCAN[5] -=128; BREAK;
- CASE '-': KEYsCAN[5] -=8; BREAK;
- CASE '.': KEYsCAN[5] -=16; BREAK;
- CASE '/': KEYsCAN[6] -=128; BREAK;
- {$7d}
- sETUPsCANcODES();
- RETURN;
- {$7d}
- ELSE IF ((CHR>=':')&&(CHR<='@'))
- {$7b}
- SWITCH (CHR)
- {$7b}
- CASE ';': KEYsCAN[6]-=4;
- CASE ':': KEYsCAN[5]-=32; BREAK;
- CASE '<': KEYsCAN[1]-=128; KEYsCAN[5]-=128; BREAK;
- CASE '=': KEYsCAN[6]-=32; BREAK;
- CASE '>': KEYsCAN[1]-=128; KEYsCAN[5]-=16; BREAK;
- CASE '?': KEYsCAN[1]-=128; KEYsCAN[6]-=128; BREAK;
- CASE '@': KEYsCAN[5]-=64; BREAK;
- {$7d}
- sETUPsCANcODES();
- RETURN;
- {$7d}
- {$7d}
-