home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / crossplatform / emulators / MacOS / mac64-04.hqx / MAC64-04.SEA / C64 / SOURCE / Traps.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-01  |  2.5 KB  |  89 lines  |  [TEXT/KAHL]

  1. /*
  2.     cOMMODORE 64 eMULATOR V0.4      eARLE f. pHILHOWER iii 
  3.     cOPYRIGHT (c) 1993-4            (ST916W9R@DUNX1.OCS.DREXEL.EDU)
  4.  
  5.     tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  6.     IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
  7.     THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
  8.     (AT YOUR OPTION) ANY LATER VERSION.
  9.  
  10.     tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
  11.     BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
  12.     merchantability OR fitness for a particular purpose.  sEE THE
  13.     gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
  14.  
  15.     yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
  16.     ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
  17.     fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
  18. */
  19.  
  20. #INCLUDE "pROCESSOR.H"
  21. #INCLUDE "mEMORY.H"
  22. #INCLUDE "eRROR.H"
  23. #INCLUDE "tRAPS.H"
  24.  
  25. #DEFINE maxtraps 16
  26. STATIC TRAP TRAPlIST[maxtraps];
  27. STATIC BYTE NUMtRAPS;
  28.  
  29. INT tRAPiNITIALIZE()
  30. {$7b}
  31.     NUMtRAPS=0;
  32.     RETURN KnOeRROR;
  33. {$7d}
  34.  
  35. INT aDDtRAP(TRAP T)
  36. {$7b}
  37. /* iF WE ARE AT OUT LIMIT FOR TRAPS, THEN INTERNAL ERROR */
  38. IF (NUMtRAPS==maxtraps) iNTERNALeRROR(KtRAPsTORAGEoVERFLOW);
  39.  
  40. /* cHECK TO SEE IF THE romS AND THE TRAP AGREE */
  41. IF (T.CHECK[0]!=bYTEaT(T.ADDR)) RETURN KwRONGromeRROR;
  42. IF (T.CHECK[1]!=bYTEaT(T.ADDR+1)) RETURN KwRONGromeRROR;
  43. IF (T.CHECK[2]!=bYTEaT(T.ADDR+2)) RETURN KwRONGromeRROR;
  44.  
  45. /* aDD THIS TRAP TO OUT LIST */
  46. TRAPlIST[NUMtRAPS++]=T;
  47.  
  48. /* eITHER MODIFY THE LOW rom OR HIGH rom, AS PER ADDRESS SPECIFIED */
  49. IF (T.ADDR < 0XC000) LOrom[T.ADDR&0X1FFF]=0XFF;
  50. ELSE HIrom[T.ADDR&0X1FFF]=0XFF;
  51.  
  52.     RETURN KnOeRROR;
  53. {$7d}
  54.  
  55. INT dELETEtRAP(WORD ADDR)
  56. {$7b}
  57.     INT X, Y;
  58.     
  59.     /* sEARCH THROUGH TRAPS ADDED FOR THE ADDRESS TO REMOVE FROM */
  60.     FOR (X=0; X<NUMtRAPS; X++)
  61.     IF (TRAPlIST[X].ADDR==ADDR) {$7b}
  62.     
  63.     /* fIX rom TO ITS INITIAL STATE */
  64. IF (ADDR <= 0XC000) LOrom[ADDR&0X1FFF]=TRAPlIST[X].CHECK[0];
  65. ELSE HIrom[ADDR&0X1FFF]=TRAPlIST[X].CHECK[0];
  66.  
  67. /* sHIFT ALL OF THE TRAPS DOWN ONE SLOT */
  68. FOR (Y=X; Y<NUMtRAPS-1; Y++) TRAPlIST[Y]=TRAPlIST[Y+1];
  69.  
  70. NUMtRAPS--;
  71. RETURN KnOeRROR; {$7d}
  72.  
  73. /* aTTEMPTED TO REMOVE A TRAP NOT ADDED */
  74. iNTERNALeRROR(KtRAPnOTiNSTALLED);
  75. {$7d}
  76.  
  77. VOID tRAPeXECUTE()
  78. {$7b}
  79. INT X;
  80.  
  81. /* sEARCH FOR A TRAP AT THE CURRENT PC LOCATION, AND IF SO EXECUTE IT */
  82. FOR (X=0; X<NUMtRAPS; X++)
  83. IF (TRAPlIST[X].ADDR==(PC-1)) {$7b}
  84. (*TRAPlIST[X].CALL)();
  85. RETURN; {$7d}
  86. /* tHIS IS NOT our TRAP CODE, SO IT'S A NONIMPLEMENTED INSTRUCTION */
  87. INI();
  88. {$7d}
  89.