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 "mEMORY.H"
- #INCLUDE "eRROR.H"
- #INCLUDE "tRAPS.H"
-
- #DEFINE maxtraps 16
- STATIC TRAP TRAPlIST[maxtraps];
- STATIC BYTE NUMtRAPS;
-
- INT tRAPiNITIALIZE()
- {$7b}
- NUMtRAPS=0;
- RETURN KnOeRROR;
- {$7d}
-
- INT aDDtRAP(TRAP T)
- {$7b}
- /* iF WE ARE AT OUT LIMIT FOR TRAPS, THEN INTERNAL ERROR */
- IF (NUMtRAPS==maxtraps) iNTERNALeRROR(KtRAPsTORAGEoVERFLOW);
-
- /* cHECK TO SEE IF THE romS AND THE TRAP AGREE */
- IF (T.CHECK[0]!=bYTEaT(T.ADDR)) RETURN KwRONGromeRROR;
- IF (T.CHECK[1]!=bYTEaT(T.ADDR+1)) RETURN KwRONGromeRROR;
- IF (T.CHECK[2]!=bYTEaT(T.ADDR+2)) RETURN KwRONGromeRROR;
-
- /* aDD THIS TRAP TO OUT LIST */
- TRAPlIST[NUMtRAPS++]=T;
-
- /* eITHER MODIFY THE LOW rom OR HIGH rom, AS PER ADDRESS SPECIFIED */
- IF (T.ADDR < 0XC000) LOrom[T.ADDR&0X1FFF]=0XFF;
- ELSE HIrom[T.ADDR&0X1FFF]=0XFF;
-
- RETURN KnOeRROR;
- {$7d}
-
- INT dELETEtRAP(WORD ADDR)
- {$7b}
- INT X, Y;
-
- /* sEARCH THROUGH TRAPS ADDED FOR THE ADDRESS TO REMOVE FROM */
- FOR (X=0; X<NUMtRAPS; X++)
- IF (TRAPlIST[X].ADDR==ADDR) {$7b}
-
- /* fIX rom TO ITS INITIAL STATE */
- IF (ADDR <= 0XC000) LOrom[ADDR&0X1FFF]=TRAPlIST[X].CHECK[0];
- ELSE HIrom[ADDR&0X1FFF]=TRAPlIST[X].CHECK[0];
-
- /* sHIFT ALL OF THE TRAPS DOWN ONE SLOT */
- FOR (Y=X; Y<NUMtRAPS-1; Y++) TRAPlIST[Y]=TRAPlIST[Y+1];
-
- NUMtRAPS--;
- RETURN KnOeRROR; {$7d}
-
- /* aTTEMPTED TO REMOVE A TRAP NOT ADDED */
- iNTERNALeRROR(KtRAPnOTiNSTALLED);
- {$7d}
-
- VOID tRAPeXECUTE()
- {$7b}
- INT X;
-
- /* sEARCH FOR A TRAP AT THE CURRENT PC LOCATION, AND IF SO EXECUTE IT */
- FOR (X=0; X<NUMtRAPS; X++)
- IF (TRAPlIST[X].ADDR==(PC-1)) {$7b}
- (*TRAPlIST[X].CALL)();
- RETURN; {$7d}
- /* tHIS IS NOT our TRAP CODE, SO IT'S A NONIMPLEMENTED INSTRUCTION */
- INI();
- {$7d}
-