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