00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "lpc2000.h"
00023 #include "global.h"
00024 #include "processor.h"
00025 #include "timer.h"
00026 #include "membus.h"
00027
00028 u16 MembusAddr = 0;
00029
00030 void membusInit(void)
00031 {
00032
00033 IOCLR = MEMBUS_LATCH;
00034 IOSET = MEMBUS_nRD;
00035 IOSET = MEMBUS_nWR;
00036
00037 IODIR &= ~P015;
00038
00039 IODIR |= (MEMBUS_IO | MEMBUS_LATCH | MEMBUS_nRD | MEMBUS_nWR);
00040 }
00041
00042 uint16_t membusRead(uint16_t addr)
00043 {
00044 uint16_t data;
00045 int flags;
00046
00047
00048 flags = disableIRQ();
00049 if(MembusAddr != addr)
00050 {
00051
00052 IODIR |= MEMBUS_IO;
00053
00054 IOCLR = MEMBUS_IO;
00055 IOSET = addr<<16 | MEMBUS_LATCH;
00056
00057 MEMBUS_DELAY;
00058 IOCLR = MEMBUS_LATCH | MEMBUS_IO;
00059 MembusAddr = addr;
00060 }
00061
00062
00063 IODIR &= ~MEMBUS_IO;
00064
00065 IOCLR = MEMBUS_nRD;
00066
00067 MEMBUS_DELAY;
00068
00069 data = IOPIN>>16;
00070
00071 IOSET = MEMBUS_nRD;
00072
00073 restoreIRQ(flags);
00074
00075 return data;
00076 }
00077
00078 void membusWrite(uint16_t addr, uint16_t data)
00079 {
00080 int flags;
00081
00082
00083 flags = disableIRQ();
00084
00085 IODIR |= MEMBUS_IO;
00086 if(MembusAddr != addr)
00087 {
00088
00089 IOCLR = MEMBUS_IO;
00090 IOSET = addr<<16 | MEMBUS_LATCH;
00091
00092 MEMBUS_DELAY;
00093 IOCLR = MEMBUS_LATCH | MEMBUS_IO;
00094 MembusAddr = addr;
00095 }
00096
00097
00098
00099 IOSET = ((uint32_t)data)<<16;
00100
00101 IOCLR = MEMBUS_nWR;
00102
00103 MEMBUS_DELAY;
00104
00105 IOSET = MEMBUS_nWR;
00106
00107 restoreIRQ(flags);
00108 }