PCem
view src/nvr.c @ 154:d0d530adce12
Initial port to Linux (using Allegro).
64-bit fixes.
Some changes to aid portability.
A few other tweaks.
| author | TomW |
|---|---|
| date | Thu Sep 04 21:07:24 2014 +0100 |
| parents | a87be069d268 |
| children | 153d673e767a |
line source
1 #include <stdio.h>
2 #include "ibm.h"
3 #include "io.h"
4 #include "nvr.h"
5 #include "pic.h"
6 #include "timer.h"
8 int oldromset;
9 int nvrmask=63;
10 uint8_t nvrram[128];
11 int nvraddr;
13 int nvr_dosave = 0;
15 void getnvrtime()
16 {
17 time_get(nvrram);
18 }
20 void nvr_recalc()
21 {
22 int c;
23 int newrtctime;
24 c=1<<((nvrram[0xA]&0xF)-1);
25 newrtctime=(int)(RTCCONST * c * (1 << TIMER_SHIFT));
26 if (rtctime>newrtctime) rtctime=newrtctime;
27 }
29 void nvr_rtc()
30 {
31 int c;
32 if (!(nvrram[0xA]&0xF))
33 {
34 rtctime=0x7fffffff;
35 return;
36 }
37 c=1<<((nvrram[0xA]&0xF)-1);
38 rtctime += (int)(RTCCONST * c * (1 << TIMER_SHIFT));
39 // pclog("RTCtime now %f\n",rtctime);
40 nvrram[0xC]=0x40;
41 if (nvrram[0xB]&0x40)
42 {
43 nvrram[0xC]|=0x80;
44 if (AMSTRAD) picint(2);
45 else picint(0x100);
46 // pclog("RTC int\n");
47 }
48 }
50 void writenvr(uint16_t addr, uint8_t val, void *priv)
51 {
52 int c;
53 // printf("Write NVR %03X %02X %02X %04X:%04X %i\n",addr,nvraddr,val,cs>>4,pc,ins);
54 if (addr&1)
55 {
56 // if (nvraddr == 0x33) pclog("NVRWRITE33 %02X %04X:%04X %i\n",val,CS,pc,ins);
57 if (nvraddr >= 0xe && nvrram[nvraddr] != val)
58 nvr_dosave = 1;
59 if (nvraddr!=0xC && nvraddr!=0xD) nvrram[nvraddr]=val;
61 if (nvraddr==0xA)
62 {
63 // pclog("NVR rate %i\n",val&0xF);
64 if (val&0xF)
65 {
66 c=1<<((val&0xF)-1);
67 rtctime += (int)(RTCCONST * c * (1 << TIMER_SHIFT));
68 }
69 else
70 rtctime = 0x7fffffff;
71 }
72 }
73 else nvraddr=val&nvrmask;
74 }
76 uint8_t readnvr(uint16_t addr, void *priv)
77 {
78 uint8_t temp;
79 // printf("Read NVR %03X %02X %02X %04X:%04X\n",addr,nvraddr,nvrram[nvraddr],cs>>4,pc);
80 if (addr&1)
81 {
82 if (nvraddr<=0xA) getnvrtime();
83 if (nvraddr==0xD) nvrram[0xD]|=0x80;
84 if (nvraddr==0xA)
85 {
86 temp=nvrram[0xA];
87 nvrram[0xA]&=~0x80;
88 return temp;
89 }
90 if (nvraddr==0xC)
91 {
92 if (AMSTRAD) picintc(2);
93 else picintc(0x100);
94 temp=nvrram[0xC];
95 nvrram[0xC]=0;
96 return temp;
97 }
98 // if (AMIBIOS && nvraddr==0x36) return 0;
99 // if (nvraddr==0xA) nvrram[0xA]^=0x80;
100 return nvrram[nvraddr];
101 }
102 return nvraddr;
103 }
105 void loadnvr()
106 {
107 FILE *f;
108 int c;
109 nvrmask=63;
110 oldromset=romset;
111 switch (romset)
112 {
113 case ROM_PC1512: f = romfopen("pc1512.nvr", "rb"); break;
114 case ROM_PC1640: f = romfopen("pc1640.nvr", "rb"); break;
115 case ROM_PC200: f = romfopen("pc200.nvr", "rb"); break;
116 case ROM_PC2086: f = romfopen("pc2086.nvr", "rb"); break;
117 case ROM_PC3086: f = romfopen("pc3086.nvr", "rb"); break;
118 case ROM_IBMAT: f = romfopen("at.nvr" , "rb"); break;
119 case ROM_CMDPC30: f = romfopen("cmdpc30.nvr", "rb"); nvrmask = 127; break;
120 case ROM_AMI286: f = romfopen("ami286.nvr", "rb"); nvrmask = 127; break;
121 case ROM_DELL200: f = romfopen("dell200.nvr", "rb"); nvrmask = 127; break;
122 case ROM_IBMAT386: f = romfopen("at386.nvr" , "rb"); nvrmask = 127; break;
123 case ROM_ACER386: f = romfopen("acer386.nvr", "rb"); nvrmask = 127; break;
124 case ROM_MEGAPC: f = romfopen("megapc.nvr", "rb"); nvrmask = 127; break;
125 case ROM_AMI386: f = romfopen("ami386.nvr", "rb"); nvrmask = 127; break;
126 case ROM_AMI486: f = romfopen("ami486.nvr", "rb"); nvrmask = 127; break;
127 case ROM_WIN486: f = romfopen("win486.nvr", "rb"); nvrmask = 127; break;
128 case ROM_PCI486: f = romfopen("hot-433.nvr", "rb"); nvrmask = 127; break;
129 case ROM_SIS496: f = romfopen("sis496.nvr", "rb"); nvrmask = 127; break;
130 case ROM_430VX: f = romfopen("430vx.nvr", "rb"); nvrmask = 127; break;
131 default: return;
132 }
133 if (!f)
134 {
135 memset(nvrram,0xFF,128);
136 return;
137 }
138 fread(nvrram,128,1,f);
139 fclose(f);
140 nvrram[0xA]=6;
141 nvrram[0xB]=0;
142 c=1<<((6&0xF)-1);
143 rtctime += (int)(RTCCONST * c * (1 << TIMER_SHIFT));
144 }
145 void savenvr()
146 {
147 FILE *f;
148 switch (oldromset)
149 {
150 case ROM_PC1512: f = romfopen("pc1512.nvr" , "wb"); break;
151 case ROM_PC1640: f = romfopen("pc1640.nvr" , "wb"); break;
152 case ROM_PC200: f = romfopen("pc200.nvr" , "wb"); break;
153 case ROM_PC2086: f = romfopen("pc2086.nvr" , "wb"); break;
154 case ROM_PC3086: f = romfopen("pc3086.nvr" , "wb"); break;
155 case ROM_IBMAT: f = romfopen("at.nvr" , "wb"); break;
156 case ROM_CMDPC30: f = romfopen("cmdpc30.nvr", "wb"); break;
157 case ROM_AMI286: f = romfopen("ami286.nvr" , "wb"); break;
158 case ROM_DELL200: f = romfopen("dell200.nvr", "wb"); break;
159 case ROM_IBMAT386: f = romfopen("at386.nvr" , "wb"); break;
160 case ROM_ACER386: f = romfopen("acer386.nvr", "wb"); break;
161 case ROM_MEGAPC: f = romfopen("megapc.nvr" , "wb"); break;
162 case ROM_AMI386: f = romfopen("ami386.nvr" , "wb"); break;
163 case ROM_AMI486: f = romfopen("ami486.nvr" , "wb"); break;
164 case ROM_WIN486: f = romfopen("win486.nvr" , "wb"); break;
165 case ROM_PCI486: f = romfopen("hot-433.nvr", "wb"); break;
166 case ROM_SIS496: f = romfopen("sis496.nvr" , "wb"); break;
167 case ROM_430VX: f = romfopen("430vx.nvr" , "wb"); break;
168 default: return;
169 }
170 fwrite(nvrram,128,1,f);
171 fclose(f);
172 }
174 void nvr_init()
175 {
176 io_sethandler(0x0070, 0x0002, readnvr, NULL, NULL, writenvr, NULL, NULL, NULL);
177 timer_add(nvr_rtc, &rtctime, TIMER_ALWAYS_ENABLED, NULL);
178 }
