1 {Unit containing the devices supported by the directive $PROCESSOR.
2 The list of devices supported doesn't have to be complete, because the use
3 of directive $PROCESSOR is no recommended. It's preferred using units with
4 device definition like PIC16F84.pas.
5 }
6 unit Pic16Devices;
7 {$mode objfpc}{$H+}
8 interface
9 uses
10   Classes, SysUtils , PicCore, Pic16Utils;
11 
12 procedure GetSupportedDevices(list: TStrings);
GetHardwareInfonull13 function GetHardwareInfo(pic: TPIC16; model: string): boolean;
14 
15 implementation
16 
17 procedure GetSupportedDevices(list: TStrings);
18 {Devuelve la lista de dispositivos soportados. Esta lista debe ser la misma que hay en
19  GetHardwareInfo. }
20 begin
21    list.Add('PIC16C63');
22    list.Add('PIC16CR63');
23    list.Add('PIC16C65');
24    list.Add('PIC16C65A');
25    list.Add('PIC16CR65');
26 
27    list.Add('PIC16F72');
28    list.Add('PIC16F83');
29    list.Add('PIC16CR83');
30    list.Add('PIC16F84');
31    list.Add('PIC16CR84');
32    list.Add('PIC16F84A');
33 
34    list.Add('PIC16F870');
35    list.Add('PIC16F871');
36    list.Add('PIC16F872');
37    list.Add('PIC16F873');
38    list.Add('PIC16F873A');
39    list.Add('PIC16F874');
40    list.Add('PIC16F874A');
41    list.Add('PIC16F876');
42    list.Add('PIC16F876A');
43    list.Add('PIC16F877');
44    list.Add('PIC16F877A');
45    list.Add('PIC16F887');
46    list.Add('PIC16F627A');
47    list.Add('PIC16F628A');
48    list.Add('PIC16F648A');
49 end;
GetHardwareInfonull50 function GetHardwareInfo(pic: TPIC16; model: string): boolean;
51 {Obtiene información parra un modelo de PIC en especial. Si no lo encuentra, devuelve
52  FALSE}
53 begin
54    Result := true;
55    pic.MaxFlash := 0;  //inicia valor
56    pic.MaxFreq := 0;
57    pic.DisableAllRAM;
58    pic.Model := model;
59    case Upcase(model) of
60    'DEFAULT': begin   //Configuración por defecto. Se toma la del PIC16F84
61      pic.MaxFreq:=20000000;  //Pero a 20MHz
62      pic.NumBanks:=2;
63      pic.NumPages:=1; pic.MaxFlash:=1024;  //banco 0 implementado parcialmente
64      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
65      pic.SetStatRAMCom('000-00B:SFR, 00C-04F:GPR');
66      pic.SetStatRAMCom('080-08B:SFR, 08C-0CF:GPR');
67      pic.SetMappRAMCom('08C-0CF:bnk0');
68      //Hardware definition
69      pic.Npins := 18;
70      pic.SetUnimpBITS('003:3F,083:3F,005:1F,085:1F,00A:1F,08A:1F');
71      pic.ram[$005].name := 'PORTA';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
72      pic.MapRAMtoPIN('005:0-17,1-18,2-1,3-2,4-3');
73      pic.ram[$006].name := 'PORTB';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
74      pic.MapRAMtoPIN('006:0-6,1-7,2-8,3-9,4-10,5-11,6-12,7-13');
75      PIC.SetPin(5, 'VSS', pptGND);
76      PIC.SetPin(14, 'VDD', pptVcc);
77      end;
78    'PIC16C63',
79    'PIC16CR63':begin
80      pic.MaxFreq:=20000000;
81      pic.Npins := 28;
82      pic.NumBanks:=2;
83      pic.NumPages:=2; pic.MaxFlash:=4096;
84      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
85      pic.SetStatRAMCom('000-01D:SFR, 020-07F:GPR');
86      pic.SetStatRAMCom('080-08E:SFR, 092-094:SFR, 098-099:SFR, 0A0-0FF:GPR');
87    end;
88    'PIC16C65',
89    'PIC16C65A',
90    'PIC16CR65': begin
91      pic.MaxFreq:=20000000;
92      pic.Npins := 40;
93      pic.NumBanks:=2;
94      pic.NumPages:=2; pic.MaxFlash:=4096;
95      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
96      pic.SetStatRAMCom('000-01D:SFR, 020-07F:GPR');
97      pic.SetStatRAMCom('080-08E:SFR, 092-094:SFR, 098-099:SFR, 0A0-0FF:GPR');
98    end;
99    'PIC16F72': begin
100      pic.MaxFreq:=20000000;
101      pic.Npins := 28;
102      pic.NumBanks:=4;    //los bancos 2 y 3 están reflejados
103      pic.NumPages:=1; pic.MaxFlash:=2048;
104      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
105      pic.SetStatRAMCom('000-017:SFR, 01E-01F:SFR, 020-07F:GPR');
106      pic.SetStatRAMCom('080-094:SFR, 09F-09F:SFR, 0A0-0FF:GPR');
107      pic.SetStatRAMCom('100-10F:SFR, 120-17F:GPR');
108      pic.SetStatRAMCom('180-18C:SFR, 1A0-1FF:GPR');
109      pic.SetMappRAMCom('0C0-0FF:bnk0');
110      pic.SetMappRAMCom('120-17F:bnk0');
111      pic.SetMappRAMCom('1A0-1BF:bnk1, 1C0-1FF:bnk0');
112    end;
113    'PIC16F83',
114    'PIC16CR83': begin
115      pic.MaxFreq:=10000000;
116      pic.Npins := 18;
117      pic.NumBanks:=2;    //los bancos 2 y 3 están reflejados
118      pic.NumPages:=1; pic.MaxFlash:=512;  //banco 0 implementado parcialmente
119      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
120      pic.SetStatRAMCom('000-00B:SFR, 00C-02F:GPR');
121      pic.SetStatRAMCom('080-08B:SFR, 08C-0AF:GPR');
122      pic.SetMappRAMCom('08C-0AF:bnk0');
123    end;
124    'PIC16F84',
125    'PIC16CR84': begin
126      pic.MaxFreq:=10000000;
127      pic.NumBanks:=2;
128      pic.NumPages:=1; pic.MaxFlash:=1024;  //banco 0 implementado parcialmente
129      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
130      pic.SetStatRAMCom('000-006:SFR, 008-00B:SFR, 00C-04F:GPR');
131      pic.SetStatRAMCom('080-086:SFR, 088-08B:SFR, 08C-0CF:GPR');
132      pic.SetMappRAMCom('08C-0CF:bnk0');
133      //Hardware definition
134      pic.Npins := 18;
135      pic.SetUnimpBITS('003:FF,083:3F,005:1F,085:1F,00A:1F,08A:1F');
136      pic.ram[$005].name := 'PORTA';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
137      pic.MapRAMtoPIN('005:0-17,1-18,2-1,3-2,4-3');
138      pic.ram[$006].name := 'PORTB';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
139      pic.MapRAMtoPIN('006:0-6,1-7,2-8,3-9,4-10,5-11,6-12,7-13');
140      PIC.SetPin(5, 'VSS', pptGND);
141      PIC.SetPin(14, 'VDD', pptVcc);
142    end;
143    'PIC16F84A': begin
144      pic.MaxFreq:=20000000;
145      pic.NumBanks:=2;    //los bancos 2 y 3 están reflejados
146      pic.NumPages:=1; pic.MaxFlash:=1024;  //banco 0 implementado parcialmente
147      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
148      pic.SetStatRAMCom('000-006:SFR, 008-00B:SFR, 00C-04F:GPR');
149      pic.SetStatRAMCom('080-086:SFR, 088-08B:SFR, 08C-0CF:GPR');
150      pic.SetMappRAMCom('08C-0CF:bnk0');
151      //Hardware definition
152      pic.Npins := 18;
153      pic.SetUnimpBITS('003:3F,083:3F,005:1F,085:1F,00A:1F,08A:1F');
154      pic.ram[$005].name := 'PORTA';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
155      pic.MapRAMtoPIN('005:0-17,1-18,2-1,3-2,4-3');
156      pic.ram[$006].name := 'PORTB';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
157      pic.MapRAMtoPIN('006:0-6,1-7,2-8,3-9,4-10,5-11,6-12,7-13');
158      PIC.SetPin(5, 'VSS', pptGND);
159      PIC.SetPin(14, 'VDD', pptVcc);
160    end;
161    'PIC16F870': begin
162      pic.MaxFreq:=20000000;
163      pic.Npins := 28;
164      pic.NumBanks := 4;  //tiene un bloque sin usar en el banco 1 y reflejado los bancos 2 y 3
165      pic.NumPages:=1; pic.MaxFlash:=2048;
166      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
167      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
168      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
169      pic.SetMappRAMCom('101-101:bnk0');
170      pic.SetMappRAMCom('181-181:bnk1');
171 
172      pic.SetStatRAMCom('000-012:SFR, 015-01A:SFR, 01E-01F:SFR, 020-07F:GPR');
173      pic.SetStatRAMCom('080-08E:SFR, 092-092:SFR, 098-099:SFR, 09E-09F:SFR, 0A0-0BF:GPR, 0F0-0FF:GPR');
174      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 120-17F:GPR');
175      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 1A0-1BF:GPR, 1F0-1FF:GPR');
176      //Direcciones mapeadas
177      pic.SetMappRAMCom('0F0-1FF:bnk0');
178      pic.SetMappRAMCom('120-17F:bnk0');
179      pic.SetMappRAMCom('1A0-1BF:bnk1, 1F0-1FF:bnk0');
180    end;
181    'PIC16F871': begin
182      pic.MaxFreq:=20000000;
183      pic.Npins := 40;
184      pic.NumBanks := 4;  //tiene un bloque sin usar en el banco 1 y reflejado los bancos 2 y 3
185      pic.NumPages:=1; pic.MaxFlash:=2048;
186      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
187      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
188      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
189      pic.SetMappRAMCom('101-101:bnk0');
190      pic.SetMappRAMCom('181-181:bnk1');
191 
192      pic.SetStatRAMCom('000-012:SFR, 015-01A:SFR, 01E-01F:SFR, 020-07F:GPR');
193      pic.SetStatRAMCom('080-08E:SFR, 092-092:SFR, 098-099:SFR, 09E-09F:SFR, 0A0-0BF:GPR, 0F0-0FF:GPR');
194      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 120-17F:GPR');
195      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 1A0-1BF:GPR, 1F0-1FF:GPR');
196      //Direcciones mapeadas
197      pic.SetMappRAMCom('0F0-1FF:bnk0');
198      pic.SetMappRAMCom('120-17F:bnk0');
199      pic.SetMappRAMCom('1A0-1BF:bnk1, 1F0-1FF:bnk0');
200    end;
201    'PIC16F872': begin
202      pic.MaxFreq:=20000000;
203      pic.Npins := 28;
204      pic.NumBanks := 2;  //tiene un bloque sin usar en el banco 1 y reflejado los bancos 2 y 3
205      pic.NumPages:=1; pic.MaxFlash:=2048;
206      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
207      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
208      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
209      pic.SetMappRAMCom('101-101:bnk0');
210      pic.SetMappRAMCom('181-181:bnk1');
211 
212      pic.SetStatRAMCom('000-007:SFR, 00A-017:SFR, 01E-01F:SFR, 020-07F:GPR');
213      pic.SetStatRAMCom('080-087:SFR, 08A-08E:SFR, 091-094:SFR, 09E-09F:SFR, 0A0-0BF:GPR, 0F0-0FF:GPR');
214      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 120-17F:GPR');
215      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 1A0-1BF:GPR, 1F0-1FF:GPR');
216      //Direcciones mapeadas
217      pic.SetMappRAMCom('0F0-1FF:bnk0');
218      pic.SetMappRAMCom('120-17F:bnk0');
219      pic.SetMappRAMCom('1A0-1BF:bnk1, 1F0-1FF:bnk0');
220    end;
221    'PIC16F873',
222    'PIC16F873A': begin
223      pic.MaxFreq:=20000000;
224      pic.Npins := 28;
225      pic.NumBanks:=4;    //los bancos 2 y 3 están reflejados
226      pic.NumPages:=2; pic.MaxFlash:=4096;
227      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
228      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
229      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
230      pic.SetMappRAMCom('101-101:bnk0');
231      pic.SetMappRAMCom('181-181:bnk1');
232 
233      pic.SetStatRAMCom('000-01F:SFR, 020-07F:GPR');
234      pic.SetStatRAMCom('080-08E:SFR, 091-094:SFR, 098-099:SFR, 09E-09F:SFR, 0A0-0FF:GPR');
235      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 120-17F:GPR');
236      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 1A0-1FF:GPR');
237      pic.SetMappRAMCom('120-17F:bnk0, 1A0-1FF:bnk1');
238      pic.ram[$005].name := 'PORTA';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
239      pic.MapRAMtoPIN('005:0-2,1-3,2-4,3-5,4-6,5-7');
240      pic.ram[$006].name := 'PORTB';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
241      pic.MapRAMtoPIN('006:0-21,1-22,2-23,3-24,4-25,5-26,6-27,7-28');
242      pic.ram[$007].name := 'PORTC';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
243      pic.MapRAMtoPIN('007:0-11,1-12,2-13,3-14,4-15,5-16,6-17,7-18');
244      PIC.SetPin(8, 'VSS', pptGND);
245      PIC.SetPin(19, 'VSS', pptGND);
246      PIC.SetPin(20, 'VDD', pptVcc);
247    end;
248    'PIC16F874',
249    'PIC16F874A': begin
250      pic.MaxFreq:=20000000;
251      pic.Npins := 40;
252      pic.NumBanks:=4;    //los bancos 2 y 3 están reflejados
253      pic.NumPages:=2; pic.MaxFlash:=4096;
254      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
255      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
256      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
257      pic.SetMappRAMCom('101-101:bnk0');
258      pic.SetMappRAMCom('181-181:bnk1');
259 
260      pic.SetStatRAMCom('000-01F:SFR, 020-07F:GPR');
261      pic.SetStatRAMCom('080-08E:SFR, 091-094:SFR, 098-099:SFR, 09E-09F:SFR, 0A0-0FF:GPR');
262      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 120-17F:GPR');
263      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 1A0-1FF:GPR');
264      pic.SetMappRAMCom('120-17F:bnk0, 1A0-1FF:bnk1');
265    end;
266    'PIC16F876',
267    'PIC16F876A': begin
268      pic.MaxFreq:=20000000;
269      pic.Npins := 28;
270      pic.NumBanks:=4;
271      pic.NumPages:=4; pic.MaxFlash:=8192;
272      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
273      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
274      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
275      pic.SetMappRAMCom('101-101:bnk0');
276      pic.SetMappRAMCom('181-181:bnk1');
277 
278      pic.SetStatRAMCom('000-01F:SFR, 020-07F:GPR');
279      pic.SetStatRAMCom('080-08E:SFR, 091-094:SFR, 098-099:SFR, 09E-09F:SFR, 0A0-0FF:GPR');
280      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 110-17F:GPR');
281      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 190-1FF:GPR');
282      pic.SetMappRAMCom('0F0-0FF:bnk0, 170-17F:bnk0, 1F0-1FF:bnk0');
283      pic.ram[$005].name := 'PORTA';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
284      pic.MapRAMtoPIN('005:0-2,1-3,2-4,3-5,4-6,5-7');
285      pic.ram[$006].name := 'PORTB';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
286      pic.MapRAMtoPIN('006:0-21,1-22,2-23,3-24,4-25,5-26,6-27,7-28');
287      pic.ram[$007].name := 'PORTC';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
288      pic.MapRAMtoPIN('007:0-11,1-12,2-13,3-14,4-15,5-16,6-17,7-18');
289      PIC.SetPin(8, 'VSS', pptGND);
290      PIC.SetPin(19, 'VSS', pptGND);
291      PIC.SetPin(20, 'VDD', pptVcc);
292    end;
293    'PIC16F877',
294    'PIC16F877A': begin
295      pic.MaxFreq:=20000000;
296      pic.NumBanks:=4;
297      pic.NumPages:=4; pic.MaxFlash:=8192;
298      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
299      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
300      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
301      pic.SetMappRAMCom('101-101:bnk0');
302      pic.SetMappRAMCom('181-181:bnk1');
303 
304      pic.SetStatRAMCom('000-01F:SFR, 020-07F:GPR');
305      if Upcase(model) = 'PIC16F877' then
306        pic.SetStatRAMCom('080-08E:SFR, 091-094:SFR, 098-099:SFR, 09E-09F:SFR, 0A0-0FF:GPR')
307      else
308        pic.SetStatRAMCom('080-08E:SFR, 091-094:SFR, 098-099:SFR, 09C-09F:SFR, 0A0-0FF:GPR');
309      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 110-17F:GPR');
310      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 190-1FF:GPR');
311      pic.SetMappRAMCom('0F0-0FF:bnk0, 170-17F:bnk0, 1F0-1FF:bnk0');
312      //Hardware definition
313      pic.Npins := 40;
314      pic.SetUnimpBITS('005:3F,009:03,00A:1F,00D:59,010:3F,012:7F,017:3F,01D:3F');
315      if Upcase(model) = 'PIC16F877' then
316        pic.SetUnimpBITS('085:3F,089:F7,08A:1F,08D:59,08E:03,09F:8F')
317      else
318        pic.SetUnimpBITS('085:3F,089:F7,08A:1F,08D:59,08E:03,09D:EF,09F:CF');
319      PIC.SetUnimpBITS('10A:1F,10E:3F,10F:1F,18A:1F,18C:8F');
320      pic.ram[$005].name := 'PORTA';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
321      pic.MapRAMtoPIN('005:0-2,1-3,2-4,3-5,4-6,5-7');
322      pic.ram[$006].name := 'PORTB';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
323      pic.MapRAMtoPIN('006:0-33,1-34,2-35,3-36,4-37,5-38,6-39,7-40');
324      pic.ram[$007].name := 'PORTC';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
325      pic.MapRAMtoPIN('007:0-15,1-16,2-17,3-18,4-23,5-24,6-25,7-26');
326      pic.ram[$008].name := 'PORTD';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
327      pic.MapRAMtoPIN('008:0-19,1-20,2-21,3-22,4-27,5-28,6-29,7-30');
328      pic.ram[$009].name := 'PORTE';   //Pone un nombre, para que MapRAMtoPIN, asigne nombre a los pines
329      pic.MapRAMtoPIN('009:0-8,1-9,2-10');
330      PIC.SetPin(12, 'VSS', pptGND);
331      PIC.SetPin(31, 'VSS', pptGND);
332      PIC.SetPin(11, 'VDD', pptVcc);
333      PIC.SetPin(12, 'VDD', pptVcc);
334    end;
335    'PIC16F887': begin
336      pic.MaxFreq:=20000000;
337      pic.Npins := 40;
338      pic.NumBanks:=4;
339      pic.NumPages:=4; pic.MaxFlash:=8192;
340      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
341      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
342      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
343      pic.SetMappRAMCom('101-101:bnk0');
344      pic.SetMappRAMCom('181-181:bnk1');
345 
346      pic.SetStatRAMCom('000-01F:SFR, 020-07F:GPR');
347      pic.SetStatRAMCom('080-08E:SFR, 091-094:SFR, 098-099:SFR, 09E-09F:SFR, 0A0-0FF:GPR');
348      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10F:SFR, 110-17F:GPR');
349      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18F:SFR, 190-1FF:GPR');
350      pic.SetMappRAMCom('0F0-0FF:bnk0, 170-17F:bnk0, 1F0-1FF:bnk0');
351      //Falta definir bits no implementados.
352    end;
353    'PIC16F627A': begin
354      pic.MaxFreq:=20000000;
355      pic.Npins := 16;
356      pic.NumBanks:=4;
357      pic.NumPages:=1; pic.MaxFlash:=1024;  //banco 0 implementado parcialmente
358 
359      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
360      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
361      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
362      pic.SetMappRAMCom('101-101:bnk0');
363      pic.SetMappRAMCom('181-181:bnk1');
364 
365      pic.SetStatRAMCom('000-006:SFR, 00A-00C:SFR, 00E-012:SFR, 015-01A:SFR, 01F-01F:SFR, 020-07F:GPR');
366      pic.SetStatRAMCom('080-086:SFR, 08A-08C:SFR, 08E-08E:SFR, 092-092:SFR, 098-09D:SFR, 09F-09F:SFR, 0A0-0FF:GPR');
367      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10B:SFR, 120-14F:GPR, 170-17F:GPR');
368      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18B:SFR, 1F0-1FF:GPR');
369      pic.SetMappRAMCom('0F0-0FF:bnk0, 170-17F:bnk0, 1F0-1FF:bnk0');
370    end;
371    'PIC16F628A': begin
372      pic.MaxFreq:=20000000;
373      pic.Npins := 16;
374      pic.NumBanks:=4;
375      pic.NumPages:=1; pic.MaxFlash:=2048;
376 
377      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
378      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
379      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
380      pic.SetMappRAMCom('101-101:bnk0');
381      pic.SetMappRAMCom('181-181:bnk1');
382 
383      pic.SetStatRAMCom('000-006:SFR, 00A-00C:SFR, 00E-012:SFR, 015-01A:SFR, 01F-01F:SFR, 020-07F:GPR');
384      pic.SetStatRAMCom('080-086:SFR, 08A-08C:SFR, 08E-08E:SFR, 092-092:SFR, 098-09D:SFR, 09F-09F:SFR, 0A0-0FF:GPR');
385      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10B:SFR, 120-14F:GPR, 170-17F:GPR');
386      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18B:SFR, 1F0-1FF:GPR');
387      pic.SetMappRAMCom('0F0-0FF:bnk0, 170-17F:bnk0, 1F0-1FF:bnk0');
388    end;
389    'PIC16F648A': begin
390      pic.MaxFreq:=20000000;
391      pic.Npins := 16;
392      pic.NumBanks:=4;
393      pic.NumPages:=2; pic.MaxFlash:=4096;
394 
395      pic.SetMappRAMCom('080-080:bnk0, 082-084:bnk0, 08A-08B:bnk0');
396      pic.SetMappRAMCom('100-100:bnk0, 102-104:bnk0, 10A-10B:bnk0');
397      pic.SetMappRAMCom('180-180:bnk0, 182-184:bnk0, 18A-18B:bnk0');
398      pic.SetMappRAMCom('101-101:bnk0');
399      pic.SetMappRAMCom('181-181:bnk1');
400 
401      pic.SetStatRAMCom('000-006:SFR, 00A-00C:SFR, 00E-012:SFR, 015-01A:SFR, 01F-01F:SFR, 020-07F:GPR');
402      pic.SetStatRAMCom('080-086:SFR, 08A-08C:SFR, 08E-08E:SFR, 092-092:SFR, 098-09D:SFR, 09F-09F:SFR, 0A0-0FF:GPR');
403      pic.SetStatRAMCom('100-104:SFR, 106-106:SFR, 10A-10B:SFR, 120-17F:GPR');
404      pic.SetStatRAMCom('180-184:SFR, 186-186:SFR, 18A-18B:SFR, 1F0-1FF:GPR');
405      pic.SetMappRAMCom('0F0-0FF:bnk0, 170-17F:bnk0, 1F0-1FF:bnk0');
406    end
407    else
408      exit(false);
409    end;
410 end;
411 
412 end.
413 
414