Rev 635 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
633 | savelij | 1 | |
2 | ; ORG 0X6000 |
||
3 | |||
4 | ; rom programming example for PENTEVO |
||
5 | ; contains 2 parts: example and working procedures |
||
6 | |||
7 | |||
8 | ; prepare hardware |
||
9 | |||
10 | ; DI |
||
11 | |||
12 | ; LD A,3 |
||
13 | ; OUT (0XBF),A ; enable shadow ports, enable ROM write |
||
14 | |||
15 | |||
16 | ; write byte |
||
17 | ; |
||
18 | ; LD E,0X04 |
||
19 | ; LD HL,0X0001 |
||
20 | ; LD A,0X55 |
||
21 | ; CALL PGM_BYTE |
||
22 | |||
23 | ; LD HL,0X0123 |
||
24 | ; LD A,0XAA |
||
25 | ;CALL PGM_BYTE |
||
26 | |||
27 | |||
28 | ; erase 64Kb block |
||
29 | |||
30 | ; LD E,0X04 |
||
31 | ; LD HL,0X0000 |
||
32 | ; CALL ERASE_BLK |
||
33 | |||
34 | |||
35 | ; program 16k of shit |
||
36 | |||
37 | ; LD E,0X04 |
||
38 | ; LD HL,0X0000 |
||
39 | ; LD IX,0X8000 |
||
40 | ; LD BC,0X4000 |
||
41 | |||
42 | ;L2 |
||
43 | ; LD A,(IX) |
||
44 | ; CALL PGM_BYTE |
||
45 | |||
46 | ; INC IX |
||
47 | ;CALL INC_EHL |
||
48 | ; DEC BC |
||
49 | ; LD A,B |
||
50 | ; OR C |
||
51 | ; JR NZ,L2 |
||
52 | |||
53 | ; read page |
||
54 | |||
55 | ; LD E,0X04 |
||
56 | ; LD HL,0X0000 |
||
57 | ; LD IX,0X8000 |
||
58 | ; LD BC,0X4000 |
||
59 | ;L1 |
||
60 | ; CALL RDBYTE |
||
61 | ; LD (IX),A |
||
62 | |||
63 | ; CALL INC_EHL |
||
64 | ; INC IX |
||
65 | ; DEC BC |
||
66 | ; LD A,B |
||
67 | ; OR C |
||
68 | ; JR NZ,L1 |
||
69 | |||
70 | ; LD BC,0XFFF7 ;return RAM to 0XC000..0XFFFF |
||
71 | ; LD A,0XFF |
||
72 | ; OUT (C),A |
||
73 | |||
74 | ; LD A,0 |
||
75 | ; OUT (0XBF),A ; disable ports, disable ROM write |
||
76 | |||
77 | ; EI |
||
78 | ; RET |
||
79 | |||
80 | |||
81 | |||
82 | |||
83 | |||
84 | ;INC_EHL |
||
85 | ; INC L |
||
86 | ; RET NZ |
||
87 | ; INC H |
||
88 | ; RET NZ |
||
89 | ; INC E |
||
90 | ; RET |
||
91 | |||
92 | |||
93 | |||
94 | PGM_BYTE |
||
95 | ; programs byte to the given location |
||
96 | ; address in EHL (512kB only) |
||
97 | ; byte in A |
||
98 | |||
99 | ; preserves BC,DE,HL |
||
100 | |||
101 | ; returns carry=1 if error |
||
102 | |||
103 | PUSH DE |
||
104 | PUSH HL |
||
105 | PUSH AF |
||
106 | |||
107 | LD E,0X00 |
||
108 | LD HL,0X0555 |
||
109 | LD A,0XAA |
||
110 | CALL WRBYTE |
||
111 | |||
112 | LD HL,0X2AA |
||
113 | LD A,0X55 |
||
114 | CALL WRBYTE |
||
115 | |||
116 | LD HL,0X555 |
||
117 | LD A,0XA0 |
||
118 | CALL WRBYTE |
||
119 | |||
120 | POP AF |
||
121 | POP HL |
||
122 | POP DE |
||
123 | CALL WRBYTE |
||
124 | |||
125 | JR ERR_END ; wait for end/error as always |
||
126 | |||
127 | |||
128 | ERASE_BLK |
||
129 | ; erases 64kB block of ROM. |
||
130 | ; block address is given in EHL (any addr in block) |
||
131 | |||
132 | ; returns carry=1 if error |
||
133 | |||
134 | ; BC,DE,HL are preserved |
||
135 | |||
136 | |||
137 | PUSH DE |
||
138 | PUSH HL |
||
139 | |||
140 | LD E,0X00 |
||
141 | LD HL,0X0555 |
||
142 | LD A,0XAA |
||
143 | CALL WRBYTE |
||
144 | |||
145 | LD HL,0X2AA |
||
146 | LD A,0X55 |
||
147 | CALL WRBYTE |
||
148 | |||
149 | LD HL,0X555 |
||
150 | LD A,0X80 |
||
151 | CALL WRBYTE |
||
152 | |||
153 | LD A,0XAA |
||
154 | CALL WRBYTE |
||
155 | |||
156 | LD HL,0X2AA |
||
157 | LD A,0X55 |
||
158 | CALL WRBYTE |
||
159 | |||
160 | POP HL |
||
161 | POP DE |
||
162 | LD A,0X30 |
||
163 | CALL WRBYTE |
||
164 | |||
165 | ;now wait 100uS @ 14MHz to start actual block erase |
||
166 | |||
167 | LD A,87 |
||
168 | DEC A |
||
169 | JR NZ,$-1 |
||
170 | |||
171 | ; then wait for erase end |
||
172 | ERR_END |
||
173 | CALL WAIT_END |
||
174 | |||
175 | RET NC ; if no error - return |
||
176 | |||
177 | ; send read/reset command to ROM |
||
178 | |||
179 | LD A,0XF0 |
||
180 | CALL WRBYTE |
||
181 | |||
182 | ;then wait 10uS @ 14MHz |
||
183 | |||
184 | LD A,9 |
||
185 | DEC A |
||
186 | JR NZ,$-1 |
||
187 | |||
188 | SCF |
||
189 | RET ; set error condition |
||
190 | |||
191 | WAIT_END;wait for ROM to end op or to indicate error |
||
192 | |||
193 | PUSH BC |
||
194 | |||
195 | WE_REPEAT |
||
196 | CALL RDBYTE |
||
197 | LD B,A |
||
198 | |||
199 | CALL RDBYTE |
||
200 | XOR B |
||
201 | |||
202 | BIT 6,A |
||
203 | JR Z,WE_END ; no toggle - end! (carry is clear) |
||
204 | |||
205 | BIT 5,A |
||
206 | JR NZ,WE_REPEAT ; if toggle and error bit toggles - |
||
207 | ; repeat reading |
||
208 | |||
209 | BIT 5,B ; toggle, error bit is set - error! |
||
210 | JR Z,WE_REPEAT ; otherwise - just toggle, wait more |
||
211 | |||
212 | ;WE_ERROR |
||
213 | SCF |
||
214 | |||
215 | WE_END POP BC |
||
216 | RET |
||
217 | |||
218 | WRBYTE ; writes given in A byte to rom at address EHL |
||
219 | ; in a range 0..512kB |
||
220 | |||
221 | ; assumes shadow ports are on |
||
222 | ; uses paging in 0XC000..0XFFFF window |
||
223 | |||
224 | ; preserves A,BC,DE,HL |
||
225 | |||
226 | PUSH BC |
||
227 | PUSH AF |
||
228 | |||
229 | LD A,E |
||
230 | AND 7 ; 512kB only |
||
231 | LD B,A |
||
232 | |||
233 | LD A,H |
||
234 | AND 0XC0 |
||
235 | OR B |
||
236 | |||
237 | RLCA |
||
238 | RLCA |
||
239 | |||
240 | CPL |
||
241 | AND 0X3F |
||
242 | ;;;;;;;;OR 0X00 |
||
243 | |||
244 | LD BC,WIN_A3;0XFFF7 |
||
245 | OUT (C),A ; page is done |
||
246 | |||
247 | LD A,H |
||
248 | OR 0XC0 |
||
249 | LD B,A |
||
250 | LD A,L |
||
251 | LD C,A |
||
252 | |||
253 | POP AF |
||
254 | LD (BC),A |
||
255 | |||
256 | POP BC |
||
257 | RET |
||
258 | |||
259 | RDBYTE ; read byte (same as WRBYTE), reads in A |
||
260 | |||
261 | PUSH BC |
||
262 | |||
263 | |||
264 | LD A,E |
||
265 | AND 7 ; 512kB only |
||
266 | LD B,A |
||
267 | |||
268 | LD A,H |
||
269 | AND 0XC0 |
||
270 | OR B |
||
271 | |||
272 | RLCA |
||
273 | RLCA |
||
274 | |||
275 | CPL |
||
276 | AND 0X3F |
||
277 | ;;;;;;;;OR 0X00 |
||
278 | |||
279 | LD BC,WIN_A3;0XFFF7 |
||
280 | OUT (C),A ; page is done |
||
281 | |||
282 | LD A,H |
||
283 | OR 0XC0 |
||
284 | LD B,A |
||
285 | LD A,L |
||
286 | LD C,A |
||
287 | |||
288 | LD A,(BC) |
||
289 | |||
290 | POP BC |
||
291 | RET |