]> cloudbase.mooo.com Git - z180-stamp.git/blame - z180/init.180
Remove STM32 variant (and submodule libopencm3)
[z180-stamp.git] / z180 / init.180
CommitLineData
a16ba2b0
L
1 page 255\r
2 .z80\r
3\r
4 extrn ddtz,bpent\r
5 extrn $stack\r
30d1329e 6 extrn charini,?const,?conin\r
8df5b655 7 extrn ?cono,?conos\r
a16ba2b0
L
8 extrn romend\r
9\r
10\r
64cc2207 11 global iobyte\r
a16ba2b0
L
12 global isv_sw\r
13\r
14 include config.inc\r
fecee241
L
15 if CPU_Z180\r
16 include z180reg.inc\r
17 include z180.lib\r
18 endif\r
815c1735 19\r
a16ba2b0
L
20\r
21\r
22\r
23;----------------------------------------------------------------------\r
24\r
25 cseg\r
8df5b655 26romstart equ $\r
a16ba2b0 27\r
8df5b655 28 org romstart+0\r
815c1735 29 jp start\r
a16ba2b0 30\r
64cc2207
L
31iobyte: db 2\r
32\r
a16ba2b0
L
33; restart vectors\r
34\r
35rsti defl 1\r
36 rept 7\r
8df5b655 37 org 8*rsti + romstart\r
fecee241
L
38 jp bpent\r
39rsti defl rsti+1\r
a16ba2b0
L
40 endm\r
41\r
42;----------------------------------------------------------------------\r
fecee241
L
43; Config space\r
44;\r
45\r
8df5b655 46 org romstart+40h\r
349c01b1
L
47\r
48 dw 0\r
49 db 0\r
50\r
a16ba2b0 51\r
fecee241
L
52 if ROMSYS\r
53$crom: defb c$rom ;\r
54 else\r
55 db 0 ;\r
56 endif\r
a16ba2b0 57\r
8df5b655 58INIWAITS defl CWAITIO\r
fecee241 59 if ROMSYS\r
8df5b655 60INIWAITS defl INIWAITS+CWAITROM\r
fecee241 61 endif\r
8df5b655
L
62\r
63;----------------------------------------------------------------------\r
64\r
65 org romstart+50h\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
75;----------------------------------------------------------------------\r
76\r
fecee241
L
77hwini0:\r
78 if CPU_Z180\r
8bbf185e 79 db ;count\r
fecee241
L
80 db rcr,CREFSH ;configure DRAM refresh\r
81 db dcntl,INIWAITS ;wait states\r
5f7f3586 82 db cbr,SYS$CBR\r
fecee241 83 db cbar,SYS$CBAR\r
fecee241 84 endif\r
2fe44122 85 db 0\r
fecee241
L
86\r
87 if CPU_Z180\r
a16ba2b0
L
88dmclrt: ;clear ram per dma\r
89 db dmct_e-dmclrt-2 ;\r
90 db sar0l ;first port\r
815c1735 91 dw nullbyte ;src (fixed)\r
a16ba2b0
L
92nullbyte:\r
93 db 000h ;src\r
94 dw romend ;dst (inc), start after "rom" code\r
95 db 00h ;dst\r
96 dw 0-romend ;count (64k)\r
97dmct_e:\r
2fe44122 98 db 0\r
fecee241
L
99 endif\r
100\r
a16ba2b0 101\r
8df5b655 102cstart:\r
fecee241 103 if CPU_Z180\r
a16ba2b0 104\r
30d1329e
L
105 push af\r
106 in0 a,(itc) ;Illegal opcode trap?\r
107 jp m,??st01\r
108 ld a,i ;I register == 0 ?\r
fecee241 109 jr z,hw_reset ; yes, harware reset\r
a16ba2b0
L
110\r
111??st01:\r
fecee241 112 ; TODO: SYS$CBR\r
30d1329e
L
113 ld a,(syscbr)\r
114 out0 (cbr),a\r
115 pop af ;restore registers\r
30d1329e 116 jp bpent ;\r
a16ba2b0 117\r
fecee241 118hw_reset:\r
a16ba2b0
L
119 di ;0058\r
120 ld a,CREFSH\r
121 out0 (rcr),a ; configure DRAM refresh\r
122 ld a,CWAITIO\r
123 out0 (dcntl),a ; wait states\r
124\r
815c1735
L
125 ld a,M_NCD ;No Clock Divide\r
126 out0 (ccr),a\r
bad2d92d
L
127; ld a,M_X2CM ;X2 Clock Multiplier\r
128; out0 (cmr),a\r
fecee241 129 else\r
8df5b655
L
130 di\r
131 xor a\r
132 ld (@cbnk),a\r
fecee241 133 endif\r
815c1735 134\r
fecee241 135; check warm start mark\r
a16ba2b0 136\r
8df5b655
L
137 ld ix,mark_55AA ; top of common area\r
138 ld a,0aah ;\r
139 cp (ix+000h) ;\r
140 jr nz,kstart ;\r
141 cp (ix+002h) ;\r
142 jr nz,kstart ;\r
143 cpl ;\r
144 cp (ix+001h) ;\r
145 jr nz,kstart ;\r
146 cp (ix+003h) ;\r
147 jr nz,kstart ;\r
148 ld sp,$stack ; mark found, check\r
149 jp z,wstart ; check ok,\r
fecee241 150\r
a16ba2b0
L
151; ram not ok, initialize -- kstart --\r
152\r
153kstart:\r
fecee241 154 if CPU_Z180\r
8bbf185e 155 ld a,SYS$CBR ;TODO:\r
8df5b655 156 out0 (cbr),a\r
5f7f3586
L
157 ld a,SYS$CBAR\r
158 out0 (cbar),a\r
fecee241 159 endif\r
a16ba2b0 160\r
a16ba2b0 161 ld sp,$stack ;01e1\r
815c1735 162\r
a16ba2b0
L
163; Clear RAM using DMA0\r
164\r
fecee241
L
165 if CPU_Z180\r
166 if 0\r
cdc4625b 167\r
a16ba2b0 168 ld hl,dmclrt ;load DMA registers\r
2fe44122 169 call ioiniml\r
a16ba2b0
L
170 ld a,0cbh ;01ef dst +1, src fixed, burst\r
171 out0 (dmode),a ;01f1\r
172\r
173 ld b,512/64\r
815c1735 174 ld a,062h ;01f4 enable dma0,\r
a16ba2b0
L
175??cl_1:\r
176 out0 (dstat),a ;01f9 clear (up to) 64k\r
177 djnz ??cl_1 ; end of RAM?\r
cdc4625b 178\r
fecee241
L
179 endif\r
180 endif\r
a16ba2b0
L
181\r
182 ld hl,055AAh ;set warm start mark\r
fecee241
L
183 ld (mark_55AA),hl\r
184 ld (mark_55AA+2),hl\r
185\r
186; -- wstart --\r
a16ba2b0 187\r
a16ba2b0 188wstart:\r
cdc4625b 189 call sysram_init\r
a16ba2b0 190 call ivtab_init\r
fecee241 191 if CPU_Z180\r
cdc4625b 192; call prt0_init\r
fecee241 193 endif\r
a16ba2b0 194\r
8bbf185e 195 call msginit\r
30d1329e 196 call charini\r
a16ba2b0 197\r
fecee241
L
198 if CPU_Z80\r
199 ld a,0\r
200 call selbnk\r
201 endif\r
a16ba2b0 202\r
cdc4625b
L
203 ld a,INIDONEVAL ;tell others (CP/M) that hardware and fifos\r
204 ld (INIDONE),a ; are allready initialized\r
205\r
206 im 2\r
207 ei\r
a16ba2b0 208\r
cdc4625b
L
209 call ?const\r
210 call ?const\r
211 or a\r
212 call nz,?conin\r
815c1735 213\r
fecee241
L
214 if CPU_Z180\r
215 ld e,0 ;Sys$Bank\r
216 else\r
8df5b655 217; TODO:\r
fecee241 218 endif\r
cdc4625b 219 jp ddtz\r
815c1735 220\r
30d1329e 221\r
fecee241 222 if CPU_Z180\r
8df5b655 223; TODO: SYS$CBR\r
5f7f3586 224syscbr: db 0\r
fecee241 225 endif\r
30d1329e 226\r
a16ba2b0
L
227;\r
228;----------------------------------------------------------------------\r
229;\r
230\r
8bbf185e 231 global bufinit\r
815c1735 232\r
8bbf185e
L
233bufinit:\r
234 ld (ix+o.in_idx),0 ;reset pointers (empty fifo)\r
a16ba2b0 235 ld (ix+o.out_idx),0\r
cdc4625b 236 ld a,(ix+o.id)\r
8bbf185e 237 ld hl,fifolst\r
cdc4625b
L
238 ld e,a\r
239 ld d,0\r
240 add hl,de\r
241 add hl,de\r
cdc4625b
L
242 push ix\r
243 pop de\r
8bbf185e
L
244 cp 4\r
245 jr nc,bfi_skip\r
246\r
cdc4625b
L
247 ld (hl),e\r
248 inc hl\r
249 ld (hl),d\r
cdc4625b 250\r
8bbf185e
L
251bfi_skip:\r
252 ex de,hl\r
253 call hwl2phy ;get phys. address of fifo\r
254 ld c,a\r
255 ld a,(ix+o.id) ;fifo id\r
256 or a ;test if fifo 0\r
257 ret z\r
cdc4625b 258\r
8bbf185e
L
259 ld b,a\r
260 push bc ;c: bank-addr, b: ignored\r
261 push hl ;address\r
262 ld c,0\r
263 push bc ;c: function, b:subf\r
264 ld b,5\r
265 ld h,c\r
266 ld l,c\r
267 add hl,sp\r
268 call msg.sm\r
269 pop hl\r
270 pop hl\r
271 pop hl\r
a16ba2b0
L
272 ret\r
273\r
8bbf185e
L
274 public fifolst\r
275fifolst :\r
cdc4625b
L
276 rept 4\r
277 dw 0\r
cdc4625b
L
278 endm\r
279\r
349c01b1 280;----------------------------------------------------------------------\r
4caee1ec 281\r
8bbf185e 282 extrn msg.sm\r
6a4e9540
L
283 extrn msginit,msg.sout\r
284 extrn mtx.fifo,mrx.fifo\r
8bbf185e 285 extrn ff.init,co.fifo,ci.fifo\r
4caee1ec
L
286\r
287\r
8bbf185e 288fifoinit:\r
fecee241 289 if CPU_Z180\r
6a4e9540 290\r
a16ba2b0 291 ret\r
fecee241 292\r
2fa1a706 293 else ;CPU_Z180\r
fecee241
L
294\r
295 call msginit\r
8df5b655
L
296\r
297 ld hl,buffers\r
298 ld b,buftablen\r
299bfi_1:\r
300 ld a,(hl)\r
301 inc hl\r
302 ld (bufdat+0),a\r
303 ld e,(hl)\r
304 inc hl\r
305 ld d,(hl)\r
306 inc hl\r
307 ex de,hl\r
308\r
309 or a\r
310 jr nz,bfi_2\r
311\r
312 ld a,(@cbnk)\r
2fa1a706 313 call bnk2phy\r
8df5b655
L
314\r
315 ld (40h+0),hl\r
316 ld (40h+2),a\r
317 out (AVRINT5),a\r
318 jr bfi_3\r
319bfi_2:\r
320\r
321 ld a,(@cbnk)\r
2fa1a706 322 call bnk2phy\r
8df5b655
L
323\r
324 ld (bufdat+1),hl\r
325 ld (bufdat+3),a\r
326 ld hl,inimsg\r
327 call msg.sout\r
328bfi_3:\r
329 ex de,hl\r
330 djnz bfi_1\r
331 ret\r
fecee241 332 endif\r
a16ba2b0 333\r
8bbf185e 334\r
a16ba2b0 335\r
4caee1ec 336\r
a16ba2b0
L
337;\r
338;----------------------------------------------------------------------\r
339;\r
340\r
341sysram_init:\r
342 ld hl,sysramw\r
343 ld de,topcodsys\r
344 ld bc,sysrame-sysramw\r
345 ldir\r
346\r
347 ret\r
348\r
349;----------------------------------------------------------------------\r
350\r
351ivtab_init:\r
352 ld hl,ivtab ;\r
353 ld a,h ;\r
354 ld i,a ;\r
fecee241 355 if CPU_Z180\r
a16ba2b0 356 out0 (il),l ;\r
fecee241 357 endif\r
a16ba2b0
L
358\r
359; Let all vectors point to spurious int routines.\r
360\r
361 ld d,high sp.int0\r
362 ld a,low sp.int0\r
363 ld b,9\r
815c1735 364ivt_i1:\r
a16ba2b0
L
365 ld (hl),a\r
366 inc l\r
367 ld (hl),d\r
368 inc l\r
369 add a,sp.int.len\r
370 djnz ivt_i1\r
371 ret\r
372\r
4caee1ec 373;----------------------------------------------------------------------\r
a16ba2b0 374\r
845cbdbd
L
375; Reload value for 10 ms Int. (0.1KHz):\r
376; tc10ms = phi/prescale/0.1KHz = phi / (prescale/10)\r
377\r
378PRT_TC10MS equ 18432 / (PRT_PRE/10)\r
379\r
380\r
fecee241 381 if CPU_Z180\r
a16ba2b0
L
382prt0_init:\r
383 ld a,i\r
384 ld h,a\r
385 in0 a,(il)\r
386 and 0E0h\r
387 or IV$PRT0\r
388 ld l,a\r
389 ld (hl),low iprt0\r
390 inc hl\r
391 ld (hl),high iprt0\r
392 ld hl,prt0itab\r
2fe44122 393 call ioiniml\r
a16ba2b0 394 ret\r
815c1735 395\r
a16ba2b0
L
396prt0itab:\r
397 db prt0it_e-prt0itab-2\r
398 db tmdr0l\r
399 dw PRT_TC10MS\r
400 dw PRT_TC10MS\r
401 db M_TIE0+M_TDE0 ;enable timer 0 interrupt and down count.\r
402prt0it_e:\r
2fe44122 403 db 0\r
fecee241 404 endif\r
a16ba2b0 405\r
4caee1ec 406\r
a16ba2b0
L
407;\r
408;----------------------------------------------------------------------\r
409;\r
410\r
2fe44122 411 if CPU_Z180\r
a16ba2b0 412io.ini:\r
2fe44122 413 if 0\r
a16ba2b0
L
414 push bc\r
415 ld b,0 ;high byte port adress\r
2fe44122 416ioi_nxt:\r
a16ba2b0
L
417 ld a,(hl) ;count\r
418 inc hl\r
8df5b655
L
419 or a\r
420 jr z,ioi_e\r
2fe44122 421\r
a16ba2b0
L
422 ld c,(hl) ;port address\r
423 inc hl\r
2fe44122 424ioi_r:\r
a16ba2b0
L
425 outi\r
426 inc b ;outi decrements b\r
427 dec a\r
2fe44122
L
428 jr nz,ioi_r\r
429 jr ioi_nxt\r
cdc4625b 430ioi_e:\r
2fe44122
L
431 pop bc\r
432 ret\r
cdc4625b 433\r
2fe44122 434 else ;(if 1/0)\r
cdc4625b 435\r
2fe44122
L
436 push bc\r
437 jr ioi_nxt\r
438ioi_l:\r
439 ld c,(hl) ;port address\r
440 inc hl\r
441 inc c\r
442ioi_r:\r
443 dec c ;otim increments c\r
444 otim\r
445 jr z,ioi_r\r
446ioi_nxt:\r
447 ld b,(hl) ;count\r
448 inc hl\r
449 inc b ;stop if count == 0\r
450 djnz ioi_l\r
451 pop bc\r
452 ret\r
cdc4625b 453\r
2fe44122
L
454 endif ;(1/0)\r
455\r
fecee241 456 else\r
2fe44122
L
457\r
458io.ini:\r
459 push bc\r
8df5b655
L
460 jr ioi_nxt\r
461ioi_l:\r
462 ld c,(hl) ;port address\r
463 inc hl\r
464 otir\r
465ioi_nxt:\r
466 ld b,(hl) ;count\r
467 inc hl\r
468 inc b\r
469 djnz ioi_l\r
fecee241 470 endif\r
a16ba2b0
L
471 pop bc\r
472 ret\r
473\r
2fe44122
L
474;----------------------------------------------------------------------\r
475\r
fecee241 476 if CPU_Z180\r
2fe44122
L
477\r
478 global ioiniml\r
479\r
480ioiniml:\r
a16ba2b0 481 push bc\r
2fe44122
L
482 xor a\r
483ioml_lp:\r
a16ba2b0
L
484 ld b,(hl)\r
485 inc hl\r
2fe44122
L
486 cp b\r
487 jr z,ioml_e\r
cdc4625b 488\r
a16ba2b0
L
489 ld c,(hl)\r
490 inc hl\r
815c1735 491 otimr\r
2fe44122
L
492 jr ioml_lp\r
493ioml_e:\r
815c1735 494 pop bc\r
2fe44122 495 ret z\r
fecee241 496 endif\r
815c1735 497\r
a16ba2b0
L
498io.ini.l:\r
499;\r
500\r
a16ba2b0 501\r
a16ba2b0 502\r
4caee1ec 503;----------------------------------------------------------------------\r
a16ba2b0 504;\r
fecee241 505 if CPU_Z180\r
a16ba2b0 506\r
2fa1a706
L
507;--------------------------------------------------------------------\r
508; Return the BBR value for the given bank number\r
fecee241 509;\r
2fa1a706 510; in a: Bank number\r
fecee241 511; out a: bbr value\r
a16ba2b0 512\r
fecee241 513bnk2log:\r
2fa1a706
L
514 or a ;\r
515 ret z ; Bank 0 is at physical address 0\r
516\r
517 push bc ;\r
518 ld b,a ;\r
519 ld c,CA ;\r
520 mlt bc ;\r
521 ld a,c ;\r
522 add a,10h ;\r
523 pop bc ;\r
524 ret ;\r
525\r
526;--------------------------------------------------------------\r
a16ba2b0 527\r
2fa1a706
L
528;in hl: Log. Address\r
529; a: Bank number\r
a16ba2b0
L
530;\r
531;out ahl: Phys. (linear) Address\r
532\r
533\r
2fa1a706 534bnk2phy:\r
fecee241 535 call bnk2log\r
a16ba2b0 536 ; fall thru\r
2fa1a706 537\r
a16ba2b0
L
538;--------------------------------------------------------------\r
539;\r
2fa1a706 540; hl: Log. Address\r
fecee241 541; a: Bank base (bbr)\r
a16ba2b0 542;\r
2fa1a706
L
543; 2 0 0\r
544; 0 6 8 0\r
545; hl hhhhhhhhllllllll\r
546; a + bbbbbbbb\r
547;\r
548; OP: ahl = (a<<12) + (h<<8) + l\r
a16ba2b0 549;\r
4caee1ec 550;out ahl: Phys. (linear) Address\r
a16ba2b0 551\r
2fa1a706 552log2phy:\r
a16ba2b0 553 push bc ;\r
2fa1a706 554l2p_i:\r
a16ba2b0
L
555 ld c,a ;\r
556 ld b,16 ;\r
fecee241 557 mlt bc ; bc = a<<4\r
2fa1a706
L
558 ld a,c ;\r
559 add a,h ;\r
560 ld h,a ;\r
561 ld a,b ;\r
562 adc a,0 ;\r
fecee241
L
563 pop bc ;\r
564 ret ;\r
565\r
8df5b655
L
566;--------------------------------------------------------------\r
567;\r
2fa1a706
L
568; hl: Log. Address\r
569;\r
8df5b655
L
570;\r
571; OP: ahl = (bankbase<<12) + (d<<8) + e\r
572;\r
573;out ahl: Phys. (linear) Address\r
574\r
8bbf185e 575 public hwl2phy\r
8df5b655 576\r
2fa1a706 577hwl2phy:\r
8df5b655 578 push bc ;\r
2fa1a706
L
579 in0 c,(cbar) ;\r
580 ld a,h ;\r
581 or 00fh ; log. addr in common1?\r
8df5b655
L
582 cp c\r
583 jr c,hlp_1\r
2fa1a706
L
584\r
585 in0 a,(cbr) ; yes, cbr is address base\r
586 jr hl2p_x\r
8df5b655 587hlp_1:\r
2fa1a706 588 ld b,16 ; log. address in baked area?\r
8df5b655 589 mlt bc\r
2fa1a706 590 ld a,h\r
8df5b655 591 cp c\r
2fa1a706
L
592 jr c,hlp_2\r
593 in0 a,(bbr) ; yes, bbr is address base\r
594 jr hl2p_x\r
595hlp_2:\r
596 xor a ; common1\r
597hl2p_x:\r
598 jr nz,l2p_i\r
599\r
600 pop bc ; bank part is 0, no translation\r
8df5b655
L
601 ret ;\r
602\r
8df5b655 603\r
2fa1a706
L
604\r
605 else ;CPU_Z180\r
606\r
8df5b655
L
607;----------------------------------------------------------------------\r
608;\r
609\r
2fa1a706 610bnk2phy:\r
8df5b655
L
611 sla h\r
612 jr nc,b2p_1 ;A15=1 --> common\r
613 ld a,3\r
614b2p_1:\r
615 srl a\r
616 rr h\r
617 ret\r
618\r
fecee241 619 endif\r
a16ba2b0
L
620\r
621;--------------------------------------------------------------\r
622;\r
623;return:\r
624; hl = hl + a\r
625; Flags undefined\r
626;\r
627\r
628add_hl_a:\r
815c1735
L
629 add a,l\r
630 ld l,a\r
631 ret nc\r
632 inc h\r
633 ret\r
a16ba2b0
L
634\r
635; ---------------------------------------------------------\r
636\r
637sysramw:\r
638\r
639 .phase isvsw_loc\r
640topcodsys:\r
641\r
642; Trampoline for interrupt routines in banked ram.\r
643; Switch stack pointer to "system" stack in top ram\r
644; Save cbar\r
815c1735 645\r
a16ba2b0 646isv_sw: ;\r
2fa1a706 647 ex (sp),hl ;save hl, 'return adr' in hl\r
a16ba2b0
L
648 push de ;\r
649 push af ;\r
2fa1a706 650 ex de,hl ;'return address' in de\r
a16ba2b0
L
651 ld hl,0 ;\r
652 add hl,sp ;\r
653 ld a,h ;\r
654 cp 0f8h ;\r
2fa1a706 655 jr nc,isw_1 ;stack allready in top ram\r
a16ba2b0
L
656 ld sp,$stack ;\r
657isw_1:\r
2fa1a706 658 push hl ;save user stack pointer\r
a16ba2b0
L
659 in0 h,(cbar) ;\r
660 push hl ;\r
661 ld a,SYS$CBAR ;\r
662 out0 (cbar),a ;\r
663 ex de,hl ;\r
664 ld e,(hl) ;\r
665 inc hl ;\r
666 ld d,(hl) ;\r
667 ex de,hl ;\r
668 push bc ;\r
669 call jphl ;\r
670\r
671 pop bc ;\r
672 pop hl ;\r
673 out0 (cbar),h ;\r
674 pop hl ;\r
675 ld sp,hl ;\r
676 pop af ;\r
677 pop de ;\r
678 pop hl ;\r
679 ei ;\r
680 ret ;\r
681jphl:\r
682 jp (hl) ;\r
683\r
684; ---------------------------------------------------------\r
685\r
fecee241 686 if CPU_Z180\r
4caee1ec 687\r
a16ba2b0
L
688iprt0:\r
689 push af\r
690 push hl\r
691 in0 a,(tcr)\r
692 in0 a,(tmdr0l)\r
693 in0 a,(tmdr0h)\r
694 ld a,(tim_ms)\r
695 inc a\r
696 cp 100\r
697 jr nz,iprt_1\r
698 xor a\r
699 ld hl,(tim_s)\r
700 inc hl\r
701 ld (tim_s),hl\r
702iprt_1:\r
703 ld (tim_ms),a\r
704 pop hl\r
705 pop af\r
706 ei\r
707 ret\r
708\r
fecee241 709 endif\r
8df5b655 710\r
a16ba2b0
L
711; ---------------------------------------------------------\r
712\r
713sp.int0:\r
714 ld a,0d0h\r
715 jr sp.i.1\r
716sp.int.len equ $-sp.int0\r
717 ld a,0d1h\r
718 jr sp.i.1\r
719 ld a,0d2h\r
720 jr sp.i.1\r
721 ld a,0d3h\r
722 jr sp.i.1\r
723 ld a,0d4h\r
724 jr sp.i.1\r
725 ld a,0d5h\r
726 jr sp.i.1\r
727 ld a,0d6h\r
728 jr sp.i.1\r
729 ld a,0d7h\r
730 jr sp.i.1\r
731 ld a,0d8h\r
732sp.i.1:\r
733; out (80h),a\r
734 halt\r
735\r
8df5b655
L
736; ---------------------------------------------------------\r
737\r
fecee241 738 if CPU_Z80\r
8df5b655
L
739\r
740; Get IFF2\r
741; This routine may not be loaded in page zero\r
742;\r
743; return Carry clear, if INTs are enabled.\r
744;\r
745 global getiff\r
746getiff:\r
747 xor a ;clear accu and carry\r
748 push af ;stack bottom := 00xxh\r
749 pop af\r
750 ld a,i ;P flag := IFF2\r
751 ret pe ;exit carry clear, if enabled\r
752 dec sp\r
753 dec sp ;has stack bottom been overwritten?\r
754 pop af\r
755 and a ;if not 00xxh, INTs were\r
756 ret nz ;actually enabled\r
757 scf ;Otherwise, they really are disabled\r
758 ret\r
759\r
760;----------------------------------------------------------------------\r
761\r
762 global selbnk\r
763\r
764; a: bank (0..2)\r
765\r
766selbnk:\r
767 push bc\r
768 ld c,a\r
769 call getiff\r
770 push af\r
771\r
772 ld a,c\r
773 di\r
774 ld (@cbnk),a\r
775 ld a,5\r
776 out (SIOAC),a\r
777 ld a,(mm_sio0)\r
778 rla\r
779 srl c\r
780 rra\r
781 out (SIOAC),a\r
782 ld (mm_sio0),a\r
783\r
784 ld a,5\r
785 out (SIOBC),a\r
786 ld a,(mm_sio1)\r
787 rla\r
788 srl c\r
789 rra\r
790 out (SIOBC),a\r
791 ld (mm_sio1),a\r
792 pop af\r
793 pop bc\r
794 ret c ;INTs were disabled\r
795 ei\r
796 ret\r
797\r
798;----------------------------------------------------------------------\r
799\r
800; c: bank (0..2)\r
801\r
fecee241 802 if 0\r
8df5b655
L
803\r
804selbnk:\r
805 ld a,(@cbnk)\r
806 xor c\r
807 and 3\r
808 ret z ;no change\r
809\r
810 call getiff\r
811 push af\r
812 ld a,c\r
813 di\r
814 ld (@cbnk),a\r
815 ld a,5\r
816 out (SIOAC),a\r
817 ld a,(mm_sio0)\r
818 rla\r
819 srl c\r
820 rra\r
821 out (SIOAC),a\r
822 ld (mm_sio0),a\r
823\r
824 ld a,5\r
825 out (SIOBC),a\r
826 ld a,(mm_sio1)\r
827 rla\r
828 srl c\r
829 rra\r
830 out (SIOBC),a\r
831 ld (mm_sio1),a\r
832 pop af\r
833 ret nc ;INTs were disabled\r
834 ei\r
835 ret\r
836\r
fecee241 837 endif\r
8df5b655
L
838\r
839;----------------------------------------------------------------------\r
840\r
fecee241 841 if 0\r
8df5b655
L
842 ex af,af'\r
843 push af\r
844 ex af,af'\r
845\r
846 rra\r
847 jr nc,stbk1\r
848 ex af,af'\r
849 ld a,5\r
850 out (SIOAC),a\r
851 ld a,(mm_sio0)\r
852 rla\r
853 srl c\r
854 rra\r
855 out (SIOAC),a\r
856 ld (mm_sio1),a\r
857 ex af,af'\r
858\r
859stbk1:\r
860 rra\r
861 jr nc,stbk2\r
862 ex af,af'\r
863 ld a,5\r
864 out (SIOBC),a\r
865 ld a,(mm_sio1)\r
866 rla\r
867 srl c\r
868 rra\r
869 out (SIOBC),a\r
870 ld (mm_sio1),a\r
871 ex af,af'\r
872\r
873stbk2:\r
fecee241 874 endif\r
8df5b655
L
875\r
876 global @cbnk\r
877 global mm_sio0, mm_sio1\r
878\r
879@cbnk: db 0 ; current bank (0..2)\r
880mm_sio0:\r
881 ds 1\r
882mm_sio1:\r
883 ds 1\r
884\r
885\r
fecee241 886 endif\r
8df5b655
L
887\r
888;----------------------------------------------------------------------\r
889\r
a16ba2b0
L
890curph defl $\r
891 .dephase\r
892sysrame:\r
893 .phase curph\r
894tim_ms: db 0\r
895tim_s: dw 0\r
896 .dephase\r
815c1735 897\r
a16ba2b0
L
898;-----------------------------------------------------\r
899\r
8df5b655 900\r
a16ba2b0
L
901 cseg\r
902\r
903 ;.phase 0ffc0h\r
904;ivtab equ 0ffc0h ; 0ffc0h ;int vector table\r
905 ;.dephase\r
906\r
fecee241
L
907 ;.phase 0fffah\r
908mark_55AA equ 0 - 2 - 4 ;2 byte for trap stack\r
909 ;ds 4\r
a16ba2b0
L
910 ;.dephase\r
911\r
912\r
913 end\r