]> cloudbase.mooo.com Git - z180-stamp.git/blame - z180/init-80.180
Version 0.6.8.2
[z180-stamp.git] / z180 / init-80.180
CommitLineData
64cc2207
L
1 page 255\r
2 .z80\r
3\r
4 extrn ddtz,bpent\r
5 extrn $stack\r
6 extrn charini,?const,?conin\r
7 extrn ?cono,?conos\r
8\r
9 extrn romend\r
10\r
11 global iobyte\r
12 global isv_sw\r
13\r
14 include config.inc\r
15\r
16\r
17\r
18\r
19;----------------------------------------------------------------------\r
20\r
21 cseg\r
22romstart equ $\r
23\r
24 org romstart+0\r
25 jp start\r
26\r
27iobyte: db 0\r
28\r
29; restart vectors\r
30\r
31rsti defl 1\r
32 rept 7\r
33\r
34 org 8*rsti + romstart\r
35 jp bpent\r
36rsti defl rsti+1\r
37 endm\r
38\r
39;----------------------------------------------------------------------\r
40 \r
41 org romstart+40h\r
42\r
43 dw 0\r
44 db 0\r
45\r
46 cseg\r
47\r
48 if ROMSYS\r
49$crom: defb c$rom ;\r
50 else\r
51 db 0 ;\r
52 endif\r
53\r
54\r
55hwini0:\r
56 db 0 ;count\r
57; db rcr,CREFSH ;configure DRAM refresh\r
58; db dcntl,INIWAITS ;wait states\r
59; db cbar,SYS$CBAR\r
60\r
61\r
62;----------------------------------------------------------------------\r
63\r
64 org romstart+50h\r
65\r
66start:\r
67 jp cstart\r
68 jp wstart\r
69 jp ?const\r
70 jp ?conin\r
71 jp ?cono\r
72 jp ?conos\r
73 jp charini\r
74\r
75cstart:\r
76 di\r
77\r
78 xor a\r
79 ld (@cbnk),a\r
80\r
81; search warm start mark\r
82\r
83 ld ix,mark_55AA ; top of common area\r
84 ld a,0aah ;\r
85 cp (ix+000h) ;\r
86 jr nz,kstart ;\r
87 cp (ix+002h) ;\r
88 jr nz,kstart ;\r
89 cpl ;\r
90 cp (ix+001h) ;\r
91 jr nz,kstart ;\r
92 cp (ix+003h) ;\r
93 jr nz,kstart ;\r
94 ld sp,$stack ; mark found, check\r
95; call checkcrc_alv ;\r
96 jp z,wstart ; check ok,\r
97\r
98;\r
99; ram not ok, initialize -- kstart --\r
100\r
101kstart:\r
102 ld sp,$stack ;01e1\r
103\r
104; Clear RAM \r
105\r
106; Init bank manager\r
107\r
108;----------------------------------------------------------------------\r
109;\r
110\r
111 ld hl,055AAh ;set warm start mark\r
112 ld (mark_55AA),hl ;\r
113 ld (mark_55AA+2),hl;\r
114\r
115;\r
116; -- wstart --\r
117;\r
118wstart:\r
119 call sysram_init ;027f\r
120 call ivtab_init\r
121\r
122 call charini\r
123 call bufferinit\r
124\r
125 ld c,0\r
126 call selbnk\r
127\r
128\r
129 im 2 ;?030e\r
130 ei ;0282\r
131\r
132 call ?const ;0284\r
133 call ?const ;0287\r
134 or a ;028a\r
135 call nz,?conin ;028d\r
136\r
137;;; ld a,(banktab) ;\r
138;;; ld e,a ;\r
139 jp ddtz ;0290\r
140\r
141\r
142;----------------------------------------------------------------------\r
143;\r
144\r
145;TODO: Make a ringbuffer module.\r
146\r
147 global buf.init\r
148\r
149buf.init:\r
150 ld (ix+o.in_idx),0\r
151 ld (ix+o.out_idx),0\r
152 ld (ix+o.mask),a\r
153 ret\r
154\r
155;----------------------------------------------------------------------\r
156\r
157\r
158 extrn msginit,msg.sout\r
159 extrn mtx.fifo,mrx.fifo\r
160 extrn co.fifo,ci.fifo\r
161\r
162\r
163bufferinit:\r
164 call msginit\r
165\r
166 ld hl,buffers\r
167 ld b,buftablen\r
168bfi_1:\r
169 ld a,(hl)\r
170 inc hl\r
171 ld (bufdat+0),a\r
172 ld e,(hl)\r
173 inc hl\r
174 ld d,(hl)\r
175 inc hl\r
176 ex de,hl\r
177\r
178 or a\r
179 jr nz,bfi_2\r
180\r
181 ld a,(@cbnk)\r
182 call bnk2phys\r
183\r
184 ld (40h+0),hl\r
185 ld (40h+2),a\r
186 out (AVRINT5),a\r
187 jr bfi_3\r
188bfi_2:\r
189\r
190 ld a,(@cbnk)\r
191 call bnk2phys\r
192\r
193 ld (bufdat+1),hl\r
194 ld (bufdat+3),a\r
195 ld hl,inimsg\r
196 call msg.sout\r
197bfi_3:\r
198 ex de,hl\r
199 djnz bfi_1\r
200 ret\r
201\r
202\r
203buffers:\r
204 db 0\r
205 dw mtx.fifo\r
206 db 1\r
207 dw mrx.fifo\r
208 db 2\r
209 dw co.fifo\r
210 db 3\r
211 dw ci.fifo\r
212buftablen equ ($ - buffers)/3\r
213\r
214inimsg:\r
215 db inimsg_e - $ -1\r
216 db 0AEh\r
217 db inimsg_e - $ -1\r
218 db 0\r
219bufdat:\r
220 db 0\r
221 dw 0\r
222 db 0\r
223inimsg_e:\r
224\r
225\r
226;\r
227;----------------------------------------------------------------------\r
228;\r
229\r
230bnk2phys:\r
231 sla h\r
232 jr nc,b2p_1 ;A15=1 --> common\r
233 ld a,3\r
234b2p_1:\r
235 srl a\r
236 rr h\r
237 ret\r
238\r
239;\r
240;----------------------------------------------------------------------\r
241;\r
242\r
243sysram_init:\r
244 ld hl,sysramw\r
245 ld de,topcodsys\r
246 ld bc,sysrame-sysramw\r
247 ldir\r
248\r
249 ret\r
250\r
251;----------------------------------------------------------------------\r
252\r
253ivtab_init:\r
254 ld hl,ivtab ;\r
255 ld a,h ;\r
256 ld i,a ;\r
257; out0 (il),l ;\r
258\r
259; Let all vectors point to spurious int routines.\r
260\r
261 ld d,high sp.int0\r
262 ld a,low sp.int0\r
263 ld b,9\r
264ivt_i1:\r
265 ld (hl),a\r
266 inc l\r
267 ld (hl),d\r
268 inc l\r
269 add a,sp.int.len\r
270 djnz ivt_i1\r
271 ret\r
272\r
273;----------------------------------------------------------------------\r
274;\r
275\r
276 global io.ini\r
277 \r
278io.ini:\r
279 push bc\r
280\r
281 if CPU_Z180\r
282\r
283 ld b,0 ;high byte port adress\r
284 ld a,(hl) ;count\r
285 inc hl\r
286 or a\r
287 jr z,ioi_e\r
288ioi_1:\r
289 ld c,(hl) ;port address\r
290 inc hl\r
291 outi\r
292 inc b ;outi decrements b\r
293 dec a\r
294 jr nz,ioi_1\r
295\r
296 else\r
297 jr ioi_nxt\r
298ioi_l:\r
299 ld c,(hl) ;port address\r
300 inc hl\r
301 otir\r
302ioi_nxt:\r
303 ld b,(hl) ;count\r
304 inc hl\r
305 inc b\r
306 djnz ioi_l\r
307 endif\r
308ioi_e: \r
309 pop bc\r
310 ret\r
311\r
312 if CPU_Z180\r
313io.ini.m:\r
314 push bc\r
315 ld b,(hl)\r
316 inc hl\r
317 ld c,(hl)\r
318 inc hl\r
319 otimr\r
320 pop bc\r
321 ret\r
322 endif\r
323\r
324io.ini.l:\r
325;\r
326\r
327\r
328;----------------------------------------------------------------------\r
329;\r
330;return:\r
331; hl = hl + a\r
332; Flags undefined\r
333;\r
334\r
335add_hl_a:\r
336 add a,l\r
337 ld l,a\r
338 ret nc\r
339 inc h\r
340 ret\r
341\r
342; ---------------------------------------------------------\r
343\r
344sysramw:\r
345\r
346 .phase isvsw_loc\r
347topcodsys:\r
348\r
349; Trampoline for interrupt routines in banked ram.\r
350; Switch stack pointer to "system" stack in top ram\r
351\r
352; todo: z80 bank switch\r
353\r
354isv_sw: ;\r
355 ex (sp),hl ; save hl, return adr in hl\r
356 push de ;\r
357 push af ;\r
358 ex de,hl ;\r
359 ld hl,0 ;\r
360 add hl,sp ;\r
361 ld a,h ;\r
362 cp 0f8h ;\r
363 jr nc,isw_1 ;\r
364 ld sp,$stack ;\r
365isw_1:\r
366 push hl ;\r
367 ; save current bank\r
368; in0 h,(cbar) ;\r
369 push hl ;\r
370 ; switch to system bank\r
371; ld a,SYS$CBAR ;\r
372; out0 (cbar),a ; \r
373 ex de,hl ;\r
374 ld e,(hl) ;\r
375 inc hl ;\r
376 ld d,(hl) ;\r
377 ex de,hl ;\r
378 push bc ;\r
379 call jphl ;\r
380\r
381 pop bc ;\r
382 pop hl ; restore bank\r
383; out0 (cbar),h ;\r
384 pop hl ;\r
385 ld sp,hl ;\r
386 pop af ;\r
387 pop de ;\r
388 pop hl ;\r
389 ei ;\r
390 ret ;\r
391jphl:\r
392 jp (hl) ;\r
393\r
394; ---------------------------------------------------------\r
395\r
396sp.int0:\r
397 ld a,0d0h\r
398 jr sp.i.1\r
399sp.int.len equ $-sp.int0\r
400 ld a,0d1h\r
401 jr sp.i.1\r
402 ld a,0d2h\r
403 jr sp.i.1\r
404 ld a,0d3h\r
405 jr sp.i.1\r
406 ld a,0d4h\r
407 jr sp.i.1\r
408 ld a,0d5h\r
409 jr sp.i.1\r
410 ld a,0d6h\r
411 jr sp.i.1\r
412 ld a,0d7h\r
413 jr sp.i.1\r
414 ld a,0d8h\r
415sp.i.1:\r
416; out (80h),a\r
417 halt\r
418\r
419; ---------------------------------------------------------\r
420\r
421; Get IFF2\r
422; This routine may not be loaded in page zero\r
423;\r
424; return Carry clear, if INTs are enabled.\r
425;\r
426 global getiff\r
427getiff:\r
428 xor a ;clear accu and carry\r
429 push af ;stack bottom := 00xxh\r
430 pop af\r
431 ld a,i ;P flag := IFF2\r
432 ret pe ;exit carry clear, if enabled\r
433 dec sp\r
434 dec sp ;has stack bottom been overwritten?\r
435 pop af\r
436 and a ;if not 00xxh, INTs were\r
437 ret nz ;actually enabled\r
438 scf ;Otherwise, they really are disabled\r
439 ret\r
440\r
441;----------------------------------------------------------------------\r
442\r
443 global selbnk\r
444\r
445; a: bank (0..2)\r
446\r
447selbnk:\r
448 push bc\r
449 ld c,a\r
450 call getiff\r
451 push af\r
452\r
453 ld a,c\r
454 di\r
455 ld (@cbnk),a\r
456 ld a,5\r
457 out (SIOAC),a\r
458 ld a,(mm_sio0)\r
459 rla\r
460 srl c\r
461 rra\r
462 out (SIOAC),a\r
463 ld (mm_sio0),a\r
464\r
465 ld a,5\r
466 out (SIOBC),a\r
467 ld a,(mm_sio1)\r
468 rla\r
469 srl c\r
470 rra\r
471 out (SIOBC),a\r
472 ld (mm_sio1),a\r
473 pop af\r
474 pop bc\r
475 ret c ;INTs were disabled\r
476 ei\r
477 ret\r
478\r
479;----------------------------------------------------------------------\r
480\r
481; c: bank (0..2)\r
482\r
483 if 0\r
484\r
485selbnk:\r
486 ld a,(@cbnk)\r
487 xor c\r
488 and 3\r
489 ret z ;no change\r
490\r
491 call getiff\r
492 push af\r
493 ld a,c\r
494 di\r
495 ld (@cbnk),a\r
496 ld a,5\r
497 out (SIOAC),a\r
498 ld a,(mm_sio0)\r
499 rla\r
500 srl c\r
501 rra\r
502 out (SIOAC),a\r
503 ld (mm_sio0),a\r
504\r
505 ld a,5\r
506 out (SIOBC),a\r
507 ld a,(mm_sio1)\r
508 rla\r
509 srl c\r
510 rra\r
511 out (SIOBC),a\r
512 ld (mm_sio1),a\r
513 pop af\r
514 ret nc ;INTs were disabled\r
515 ei\r
516 ret\r
517\r
518 endif\r
519\r
520;----------------------------------------------------------------------\r
521\r
522 if 0\r
523 ex af,af'\r
524 push af\r
525 ex af,af'\r
526\r
527 rra\r
528 jr nc,stbk1\r
529 ex af,af'\r
530 ld a,5\r
531 out (SIOAC),a\r
532 ld a,(mm_sio0)\r
533 rla\r
534 srl c\r
535 rra\r
536 out (SIOAC),a\r
537 ld (mm_sio1),a\r
538 ex af,af'\r
539\r
540stbk1:\r
541 rra\r
542 jr nc,stbk2\r
543 ex af,af'\r
544 ld a,5\r
545 out (SIOBC),a\r
546 ld a,(mm_sio1)\r
547 rla\r
548 srl c\r
549 rra\r
550 out (SIOBC),a\r
551 ld (mm_sio1),a\r
552 ex af,af'\r
553\r
554stbk2:\r
555 endif\r
556\r
557 global @cbnk\r
558 global mm_sio0, mm_sio1\r
559\r
560@cbnk: db 0 ; current bank (0..2)\r
561mm_sio0:\r
562 ds 1\r
563mm_sio1:\r
564 ds 1\r
565\r
566;----------------------------------------------------------------------\r
567\r
568curph defl $\r
569 .dephase\r
570sysrame:\r
571 .phase curph\r
572tim_ms: db 0\r
573tim_s: dw 0\r
574 .dephase\r
575\r
576;-----------------------------------------------------\r
577\r
578 cseg\r
579\r
580 ;.phase 0ffc0h\r
581;ivtab equ 0ffc0h ; 0ffc0h ;int vector table\r
582 ;.dephase\r
583\r
584 ;.phase 0fffch\r
585mark_55AA equ 0fffch\r
586 ;ds 4 ; 0fffch\r
587 ;.dephase\r
588\r
589\r
590 end\r
591\r