]> cloudbase.mooo.com Git - z180-stamp.git/blame - z180/r3init.180
my_getchar() parameter: allow return without new character
[z180-stamp.git] / z180 / r3init.180
CommitLineData
a16ba2b0
L
1 page 255\r
2 .z80\r
3\r
4 extrn ddtz,bpent\r
5 extrn $stack\r
6 extrn $coninit,$cists,$ci\r
7\r
8 extrn romend\r
9\r
10\r
11 global isv_sw\r
12\r
13 include config.inc\r
14 include z180reg.inc\r
15 include z180.lib\r
815c1735 16\r
f4d5b4fe 17;CR equ 0dh\r
a16ba2b0
L
18\r
19\r
20\r
21;----------------------------------------------------------------------\r
22\r
23 cseg\r
24\r
815c1735 25 jp start\r
a16ba2b0
L
26\r
27; restart vectors\r
28\r
29rsti defl 1\r
30 rept 7\r
31 db 0, 0, 0, 0, 0\r
32 jp bpent\r
33rsti defl rsti+1\r
34 endm\r
349c01b1 35 db 0, 0, 0, 0, 0\r
a16ba2b0
L
36\r
37;----------------------------------------------------------------------\r
349c01b1
L
38 \r
39 ;org 40h\r
40\r
41 dw 0\r
42 db 0\r
43\r
a16ba2b0
L
44\r
45 if ROMSYS\r
46$crom: defb c$rom ;\r
47 else\r
48 db 0 ;\r
49 endif\r
50\r
51dmclrt: ;clear ram per dma\r
52 db dmct_e-dmclrt-2 ;\r
53 db sar0l ;first port\r
815c1735 54 dw nullbyte ;src (fixed)\r
a16ba2b0
L
55nullbyte:\r
56 db 000h ;src\r
57 dw romend ;dst (inc), start after "rom" code\r
58 db 00h ;dst\r
59 dw 0-romend ;count (64k)\r
60dmct_e:\r
61\r
a16ba2b0
L
62INIWAITS defl CWAITIO\r
63 if ROMSYS\r
64INIWAITS defl INIWAITS+CWAITROM\r
65 endif\r
66\r
67hwini0:\r
68 db 3 ;count\r
69 db rcr,CREFSH ;configure DRAM refresh\r
70 db dcntl,INIWAITS ;wait states\r
71 db cbar,SYS$CBAR\r
72\r
73;----------------------------------------------------------------------\r
74\r
75start:\r
76 push af ;003c\r
77 in0 a,(itc) ;003d Illegal opcode trap?\r
78 jp p,??st01 ;0040\r
79 pop af ;0043\r
80 jp bpent ;0044 yes, handle\r
81\r
82??st01:\r
815c1735 83 ld a,i ;0047 I register == 0 ?\r
a16ba2b0 84 jr z,??st02 ;004b yes, harware reset\r
815c1735 85 pop af ;004d\r
a16ba2b0
L
86 jp bpent ;004e no, allready set up\r
87\r
88??st02:\r
89 di ;0058\r
90 ld a,CREFSH\r
91 out0 (rcr),a ; configure DRAM refresh\r
92 ld a,CWAITIO\r
93 out0 (dcntl),a ; wait states\r
94\r
815c1735
L
95 ld a,M_NCD ;No Clock Divide\r
96 out0 (ccr),a\r
bad2d92d
L
97; ld a,M_X2CM ;X2 Clock Multiplier\r
98; out0 (cmr),a\r
815c1735 99\r
a16ba2b0
L
100; search warm start mark\r
101\r
102 ld ix,mark_55AA ;00b8 ; top of common area\r
103 ld a,SYS$CBAR ;\r
104 out0 (cbar),a ;\r
105 ld a,071h ;00bc\r
106 ex af,af' ;00be ;for cbr = 0x70 downto 0x40\r
107swsm_l:\r
815c1735 108 ex af,af' ;00bf\r
a16ba2b0
L
109 dec a ;00c0\r
110 cp 03fh ;00c1\r
111 jr z,kstart ;00c3 ; break (mark not found)\r
112 out0 (cbr),a ;00c5\r
113 ex af,af' ;00c8\r
114 ld a,0aah ;00c9\r
115 cp (ix+000h) ;00cb\r
116 jr nz,swsm_l ;00ce\r
117 cp (ix+002h) ;00d0\r
118 jr nz,swsm_l ;00d3\r
119 cpl ;00d5\r
120 cp (ix+001h) ;00d6\r
121 jr nz,swsm_l ;00d9\r
122 cp (ix+003h) ;00db\r
123 jr nz,swsm_l ;00de\r
124 ld sp,$stack ;00e0 mark found, check\r
125 call checkcrc_alv ;00e3\r
126 jp z,wstart ;00e6 check ok,\r
127\r
128;\r
129; ram not ok, initialize -- kstart --\r
130\r
131kstart:\r
132\r
133 ld a,088h ;00e9 0000-7fff: common 0\r
134 out0 (cbar),a ;00eb 8000-ffff: common 1\r
135 ld ix,08000h ;00f3\r
136 ld a,0 ;00f1 start at 008000 (2. phys. 32k block)\r
137??f_0:\r
138 out0 (cbr),a ;00f9\r
139\r
815c1735 140 ld (ix+0),a ;0103\r
a16ba2b0 141 cpl\r
815c1735 142 ld (ix+1),a ;0103\r
a16ba2b0
L
143 cpl\r
144 add a,8 ;010a next 'bank'\r
145 cp 078h ;010c stop at 078000\r
146 jr nz,??f_0 ;010e\r
147\r
148 ld de,8000h ;0114 first block not tested, but mark as ok\r
149 ld a,0 ;00f1 start at 008000 (2. phys. 32k block)\r
150??cp_0:\r
151 out0 (cbr),a ;011c\r
152 ld c,a\r
153 xor (ix+0)\r
154 ld b,a\r
155 ld a,c\r
156 cpl\r
157 xor (ix+1)\r
158 or b\r
159 jr nz,??cp_1\r
160 scf\r
161??cp_1:\r
162 rr d\r
163 rr e\r
164 ld a,c\r
165 add a,8\r
166 cp 078h ; stop at 078000\r
167 jr nz,??cp_0\r
815c1735 168\r
a16ba2b0
L
169;\r
170; ram test found 1 or more error free blocks (32k)\r
171;\r
172\r
173ramok:\r
174 ld a,SYS$CBAR ;01c8\r
175 out0 (cbar),a ;01ca\r
176 ld h,d\r
177 ld l,e\r
178 ld c,070h ;01ce highest block\r
179 ld b,15 ;01d0\r
180??sr_1:\r
181 add hl,hl\r
182 jr c,alloc ;01d4 highest "error free" block\r
183 ld a,c ;01d6\r
184 sub 008h ;01d7\r
185 ld c,a ;01d9\r
186 djnz ??sr_1 ;01da\r
187\r
188 slp ;01dc should never be reached\r
189\r
190alloc:\r
191 out0 (cbr),c ;01de\r
192 ld sp,$stack ;01e1\r
815c1735 193\r
a16ba2b0
L
194; Clear RAM using DMA0\r
195\r
196 ld hl,dmclrt ;load DMA registers\r
197 call io.ini.m\r
198 ld a,0cbh ;01ef dst +1, src fixed, burst\r
199 out0 (dmode),a ;01f1\r
200\r
201 ld b,512/64\r
815c1735 202 ld a,062h ;01f4 enable dma0,\r
a16ba2b0
L
203??cl_1:\r
204 out0 (dstat),a ;01f9 clear (up to) 64k\r
205 djnz ??cl_1 ; end of RAM?\r
815c1735 206\r
a16ba2b0 207; Init bank manager\r
815c1735 208\r
a16ba2b0
L
209 ld hl,banktabsys ;020f\r
210 ld (hl),c ; Common area\r
211 inc hl ;0213\r
212 ld (hl),c ; System work area\r
213 inc hl ;0215 Point to bank 0 entry\r
214 ld b,BANKS ;0216\r
215l0218h:\r
216 ld (hl),0ffh ;0218 Mark all banks as unassigned\r
217 inc hl ;021a\r
218 djnz l0218h ;021b\r
219\r
220 ld hl,memalv ;\r
221 ld b,8 ; 8*4k ie. first 32k\r
222??a_0:\r
223 ld (hl),0e0h ; mark as sys ("rom"/monitor)\r
224 inc hl\r
225 djnz ??a_0\r
815c1735 226\r
a16ba2b0
L
227 rr d ; shift out bit for block 0\r
228 rr e ;\r
229 ld c,15 ;022c 15*32k remaining blocks\r
230l022eh:\r
231 ld a,0feh ; 0xfe == block with error(s)\r
232 rr d ;\r
233 rr e\r
234 adc a,0 ; ==> 0xff : block ok\r
815c1735 235 ld b,32/4 ; 32k == 8 * 4k\r
a16ba2b0
L
236l0236h:\r
237 ld (hl),a ;\r
238 inc hl ;\r
239 djnz l0236h ;\r
240 dec c ;\r
241 jr nz,l022eh ;next 32k block\r
815c1735 242\r
a16ba2b0
L
243 ld hl,memalv+0ch ;memalv+0ch\r
244 ld a,(banktabsys) ;\r
245 call add_hl_a\r
246 ld b,3 ;\r
247l024ah:\r
248 ld (hl),0ech ;alloc system ram\r
249 inc hl ;\r
250 djnz l024ah ;\r
251 ld (hl),0efh ;alloc common\r
252 call gencrc_alv\r
253\r
815c1735 254 ld hl,0000h ;bank #\r
a16ba2b0
L
255 ld bc,0f0fh ; size (?) (4k blocks)\r
256 xor a ;\r
257 call sub_0420h ;alloc mem for bank 0\r
258 ld c,l ;\r
259 or a ;\r
260 call z,sub_04b5h ;\r
261\r
262 ld hl,0101h ;\r
263 ld bc,0f0fh ;\r
264 xor a ;\r
265 call sub_0420h ;\r
266 ld c,l ;\r
267 or a ;\r
268 call z,sub_04b5h ;\r
269\r
270 ld hl,055AAh ;set warm start mark\r
271 ld (mark_55AA),hl ;\r
272 ld (mark_55AA+2),hl;\r
273\r
274;\r
275; crc ok -- wstart --\r
276;\r
277wstart:\r
278 call sysram_init ;027f\r
279 call ivtab_init\r
280\r
281 call prt0_init\r
282\r
a16ba2b0
L
283 call $coninit\r
284\r
bad2d92d 285 call bufferinit\r
a16ba2b0
L
286\r
287\r
288\r
289 im 2 ;?030e\r
290 ei ;0282\r
291\r
292 call $cists ;0284\r
293 call $cists ;0287\r
294 or a ;028a\r
295 call nz,$ci ;028d\r
815c1735
L
296\r
297 ld a,(banktab) ;\r
298 ld e,a ;\r
a16ba2b0 299 jp ddtz ;0290\r
815c1735 300\r
a16ba2b0
L
301;\r
302;----------------------------------------------------------------------\r
303;\r
304\r
a16ba2b0
L
305;TODO: Make a ringbuffer module.\r
306\r
307 global buf.init\r
815c1735 308\r
a16ba2b0
L
309buf.init:\r
310 ld (ix+o.in_idx),0\r
311 ld (ix+o.out_idx),0\r
312 ld (ix+o.mask),a\r
313 ret\r
314\r
315;----------------------------------------------------------------------\r
349c01b1 316\r
bad2d92d
L
317 extrn msginit,msg_tx_fifo,msg_rx_fifo\r
318 extrn msg.sout\r
349c01b1
L
319\r
320bufferinit:\r
349c01b1 321\r
bad2d92d 322 ld de,msg_tx_fifo\r
349c01b1
L
323 in0 a,cbr\r
324 call log2phys\r
325 ld (40h+0),hl\r
326 ld (40h+2),a\r
bad2d92d
L
327\r
328 ld (bufdat+1),hl\r
329 ld (bufdat+3),a\r
330 xor a\r
349c01b1
L
331 ld (bufdat+0),a\r
332 ld hl,inimsg\r
333 call msg.sout\r
349c01b1 334\r
bad2d92d
L
335 ld de,msg_rx_fifo\r
336 in0 a,cbr\r
337 call log2phys\r
338 ld (bufdat+1),hl\r
339 ld (bufdat+3),a\r
340 ld a,1\r
341 ld (bufdat+0),a\r
342 ld hl,inimsg\r
343 call msg.sout\r
349c01b1 344\r
bad2d92d 345 ret\r
a16ba2b0 346\r
349c01b1 347inimsg:\r
bad2d92d 348 db inimsg_e - $ - 1\r
349c01b1 349 db 81h\r
bad2d92d 350 db inimsg_e - $ - 1\r
349c01b1
L
351 db 0\r
352bufdat:\r
353 db 0\r
354 dw 0\r
355 db 0\r
356inimsg_e:\r
bad2d92d 357\r
349c01b1
L
358;----------------------------------------------------------------------\r
359;\r
360if 0\r
4caee1ec
L
361\r
362 extrn msginit,msg.sout,msg_fifo\r
363 extrn tx.buf,rx.buf\r
364\r
365\r
a16ba2b0
L
366bufferinit:\r
367 call msginit\r
815c1735 368\r
a16ba2b0 369 ld hl,buffers\r
bad2d92d 370 ld bc,0300h ; b:count, c:buffer nr\r
a16ba2b0
L
371bfi_1:\r
372 ld e,(hl)\r
373 inc hl\r
374 ld d,(hl)\r
375 inc hl\r
376 push hl\r
377 in0 a,cbr\r
378 call log2phys\r
379 ld (bufdat+1),hl\r
380 ld (bufdat+3),a\r
381 ld a,c\r
382 ld (bufdat+0),a\r
383 ld hl,inimsg\r
384 call msg.sout\r
385 pop hl\r
386 inc c\r
387 djnz bfi_1\r
388 ret\r
389\r
390 rept 20\r
391 db 0\r
392 endm\r
815c1735 393\r
a16ba2b0
L
394buffers:\r
395 dw msg_fifo\r
396 dw tx.buf\r
397 dw rx.buf\r
815c1735
L
398\r
399inimsg:\r
a16ba2b0
L
400 db inimsg_e - $ -2\r
401 db PMSG\r
402 db 81h\r
403 db inimsg_e - $ -1\r
404 db 0\r
405bufdat:\r
406 db 0\r
407 dw 0\r
408 db 0\r
e598b357 409inimsg_e:\r
a16ba2b0 410\r
349c01b1 411endif\r
4caee1ec 412\r
a16ba2b0
L
413;\r
414;----------------------------------------------------------------------\r
415;\r
416\r
417sysram_init:\r
418 ld hl,sysramw\r
419 ld de,topcodsys\r
420 ld bc,sysrame-sysramw\r
421 ldir\r
422\r
423 ret\r
424\r
425;----------------------------------------------------------------------\r
426\r
427ivtab_init:\r
428 ld hl,ivtab ;\r
429 ld a,h ;\r
430 ld i,a ;\r
431 out0 (il),l ;\r
432\r
433; Let all vectors point to spurious int routines.\r
434\r
435 ld d,high sp.int0\r
436 ld a,low sp.int0\r
437 ld b,9\r
815c1735 438ivt_i1:\r
a16ba2b0
L
439 ld (hl),a\r
440 inc l\r
441 ld (hl),d\r
442 inc l\r
443 add a,sp.int.len\r
444 djnz ivt_i1\r
445 ret\r
446\r
4caee1ec 447;----------------------------------------------------------------------\r
a16ba2b0
L
448\r
449prt0_init:\r
450 ld a,i\r
451 ld h,a\r
452 in0 a,(il)\r
453 and 0E0h\r
454 or IV$PRT0\r
455 ld l,a\r
456 ld (hl),low iprt0\r
457 inc hl\r
458 ld (hl),high iprt0\r
459 ld hl,prt0itab\r
460 call io.ini.m\r
461 ret\r
815c1735 462\r
a16ba2b0
L
463prt0itab:\r
464 db prt0it_e-prt0itab-2\r
465 db tmdr0l\r
466 dw PRT_TC10MS\r
467 dw PRT_TC10MS\r
468 db M_TIE0+M_TDE0 ;enable timer 0 interrupt and down count.\r
469prt0it_e:\r
470\r
4caee1ec 471\r
a16ba2b0
L
472;\r
473;----------------------------------------------------------------------\r
474;\r
475\r
476io.ini:\r
477 push bc\r
478 ld b,0 ;high byte port adress\r
479 ld a,(hl) ;count\r
480 inc hl\r
481ioi_1:\r
482 ld c,(hl) ;port address\r
483 inc hl\r
484 outi\r
485 inc b ;outi decrements b\r
486 dec a\r
487 jr nz,ioi_1\r
488 pop bc\r
489 ret\r
490\r
491io.ini.m:\r
492 push bc\r
493 ld b,(hl)\r
494 inc hl\r
495 ld c,(hl)\r
496 inc hl\r
815c1735
L
497 otimr\r
498 pop bc\r
a16ba2b0 499 ret\r
815c1735 500\r
a16ba2b0
L
501io.ini.l:\r
502;\r
503\r
504;----------------------------------------------------------------------\r
505;\r
506\r
507; compute crc\r
508; hl: start adr\r
509; bc: len\r
510; bc returns crc val\r
511\r
512do_crc16:\r
513 ld de,0FFFFh\r
514crc1:\r
515 ld a,(hl)\r
516 xor e\r
517 ld e,a\r
518 rrca\r
519 rrca\r
520 rrca\r
521 rrca\r
522 and 0Fh\r
523 xor e\r
524 ld e,a\r
525 rrca\r
526 rrca\r
527 rrca\r
528 push af\r
529 and 1Fh\r
530 xor d\r
531 ld d,a\r
532 pop af\r
533 push af\r
534 rrca\r
535 and 0F0h\r
536 xor d\r
537 ld d,a\r
538 pop af\r
539 and 0E0h\r
540 xor e\r
541 ld e,d\r
542 ld d,a\r
543 cpi\r
544 jp pe,crc1\r
545 or e ;z-flag\r
546 ret\r
547\r
548\r
549gencrc_alv:\r
550 push hl ;03f6\r
551 push de ;03f7\r
552 push bc\r
553 push af ;03f8\r
554 ld hl,banktabsys ;03f9\r
555 ld bc,crc_len ;03fc\r
556 call do_crc16 ;03ff\r
557 ld (hl),e\r
558 inc hl\r
559 ld (hl),d\r
560 pop af ;0406\r
561 pop bc\r
562 pop de ;0407\r
563 pop hl ;0408\r
564 ret ;0409\r
565\r
566checkcrc_alv:\r
567 push hl ;040a\r
568 push de\r
569 push bc ;040b\r
570 ld hl,banktabsys ;040d\r
571 ld bc,crc_len+2 ;0410\r
572 call do_crc16 ;0413\r
573 pop bc ;041d\r
574 pop de\r
575 pop hl ;041e\r
576 ret ;041f\r
577\r
4caee1ec
L
578;----------------------------------------------------------------------\r
579\r
a16ba2b0
L
580;\r
581; alloc\r
582;\r
583; h: max bank #\r
584; l: min bank #\r
585; b: max size\r
586; c: min size\r
587;\r
588; ret:\r
589; a: 0 == ok\r
815c1735 590; 1 ==\r
a16ba2b0
L
591; 2 == no bank # in requested range\r
592; ff == crc error\r
593;\r
594\r
595sub_0420h:\r
596 call checkcrc_alv ;0420\r
597 jr nz,l049ch ;0424 crc error, tables corrupt\r
815c1735 598\r
a16ba2b0
L
599 call sub_049dh ;0427 bank # in req. range available?\r
600 jr c,l0499h ;042a\r
601 push ix ;042c\r
602 push iy ;042e\r
603 push de ;0430\r
604 push hl ;0431\r
605 push bc ;0432\r
606 ld c,b ;0433\r
607 ld b,alv_len+1 ;0434\r
608 ld d,0 ;0436\r
609 ld hl,memalv-1 ;0438\r
610 jr l0441h ;043b\r
611\r
612; find free blocks\r
613\r
614l043dh:\r
615 ld a,(hl) ;043d\r
616 inc a ;043e free blocks are marked 0ffh\r
617 jr z,l0446h ;043f\r
618l0441h:\r
619 inc hl ;0441\r
620 djnz l043dh ;0442\r
621 jr l0464h ;0444\r
622l0446h:\r
815c1735 623 push hl ;0446\r
a16ba2b0
L
624 pop ix ;0447 free blocks start here\r
625 ld e,000h ;0449\r
626 jr l0451h ;044b\r
627l044dh: ; count free blocks\r
628 ld a,(hl) ;044d\r
629 inc a ;044e\r
630 jr nz,l0457h ;044f\r
631l0451h:\r
632 inc e ;0451\r
633 inc hl ;0452\r
634 djnz l044dh ;0453\r
635 jr l0464h ;0455\r
636\r
815c1735 637; end of free blocks run.\r
a16ba2b0
L
638\r
639l0457h:\r
640 ld a,d ;0457\r
641 cp e ;0458 nr of blocks >= requested ?\r
815c1735 642 jr nc,l0441h ;0459\r
a16ba2b0
L
643\r
644 ld d,e ;045b\r
645 push ix ;045c\r
646 pop iy ;045e\r
647 ld a,d ;0460\r
648 cp c ;0461\r
649 jr c,l0441h ;0462\r
650l0464h:\r
651 pop bc ;0464\r
652 ld a,d ;0465\r
653 cp b ;0466\r
654 jr c,l046ch ;0467\r
655 ld d,b ;0469\r
656 jr l0471h ;046a\r
657l046ch:\r
658 cp c ;046c\r
659 jr nc,l0471h ;046d\r
660 ld d,000h ;046f\r
661l0471h:\r
662 ld a,d ;0471\r
663 push iy ;0472\r
664 pop hl ;0474\r
665 ld de,memalv ;0475\r
666 or a ;0478\r
667 sbc hl,de ;0479\r
668 ld b,l ;047b\r
669 ld c,a ;047c\r
670 pop hl ;047d\r
671l047eh:\r
672 or a ;047e\r
673 jr z,l0489h ;047f\r
674 ld (iy+0),l ;0481\r
675 inc iy ;0484\r
676 dec a ;0486\r
677 jr l047eh ;0487\r
678l0489h:\r
679 pop de ;0489\r
680 pop iy ;048a\r
681 pop ix ;048c\r
682 call gencrc_alv ;048e\r
683 ld a,c ;0491\r
684 or a ;0492\r
685 ld a,000h ;0493\r
686 ret nz ;0495\r
687 or 001h ;0496\r
688 ret ;0498\r
689\r
690l0499h:\r
691 ld a,2 ;0499\r
692l049ch:\r
693 or a\r
694 ret ;049c\r
695\r
696\r
697; search a free bank number in range\r
698; h: max #\r
699; l: min #\r
700; ret:\r
701; l: bank number available\r
702; nc, if found, bank nr. in l\r
703; cy, if none found\r
704\r
705sub_049dh:\r
706 push de ;049d\r
707 push bc ;049e\r
708 ex de,hl ;049f\r
709 dec e ;04a0\r
710l04a1h:\r
711 inc e ;04a1 test next #\r
712 ld a,d ;04a2\r
713 cp e ;04a3\r
815c1735 714 jr c,l04b1h ;04a4\r
a16ba2b0
L
715 ld a,e ;04a6\r
716 ld hl,memalv ;04a7\r
717 ld bc,alv_len ;04aa\r
718 cpir ;04ad bank# allready allocated?\r
719 jr z,l04a1h ;04af if yes, search for next\r
720l04b1h:\r
721 ex de,hl ;04b1\r
722 pop bc ;04b2\r
723 pop de ;04b3\r
724 ret ;04b4\r
725\r
726\r
727sub_04b5h:\r
728 ld a,l ;04b5\r
729 cp 012h ;04b6\r
730 ccf ;04b8\r
731 ret c ;04b9\r
732 push hl ;04ba\r
733 ld hl,banktab ;04bb\r
734 call add_hl_a\r
735 ld (hl),b ;04c3\r
736 call gencrc_alv ;04c4\r
737 pop hl ;04c7\r
738 or a ;04c8 clear carry\r
739 ret ;04c9\r
740\r
741\r
742;--------------------------------------------------------------\r
743;\r
744; de: Log. Address\r
745; a: Bank number\r
746;\r
747;out ahl: Phys. (linear) Address\r
748\r
749\r
750bnk2phys:\r
751 push hl\r
752 ld hl,banktab\r
753 call add_hl_a\r
754 ld a,(hl)\r
755 pop hl\r
756\r
757 ; fall thru\r
758;--------------------------------------------------------------\r
759;\r
760; de: Log. Address\r
761; a: Bank (bbr)\r
762;\r
763; OP: ahl = (a<<12) + (d<<8) + e\r
764;\r
4caee1ec 765;out ahl: Phys. (linear) Address\r
a16ba2b0
L
766\r
767\r
768log2phys:\r
769 push bc ;\r
770 ld c,a ;\r
771 ld b,16 ;\r
772 mlt bc ;bc = a<<4\r
773 ld l,d ;\r
774 ld h,0 ;\r
815c1735 775 add hl,bc ;bc + d == a<<4 + d\r
a16ba2b0
L
776 ld a,h ;\r
777 ld h,l ;\r
778 ld l,e ;\r
779 pop bc ;\r
780 ret ;\r
781\r
782\r
783;--------------------------------------------------------------\r
784;\r
785;return:\r
786; hl = hl + a\r
787; Flags undefined\r
788;\r
789\r
790add_hl_a:\r
815c1735
L
791 add a,l\r
792 ld l,a\r
793 ret nc\r
794 inc h\r
795 ret\r
a16ba2b0
L
796\r
797; ---------------------------------------------------------\r
798\r
799sysramw:\r
800\r
801 .phase isvsw_loc\r
802topcodsys:\r
803\r
804; Trampoline for interrupt routines in banked ram.\r
805; Switch stack pointer to "system" stack in top ram\r
806; Save cbar\r
815c1735 807\r
a16ba2b0
L
808isv_sw: ;\r
809 ex (sp),hl ; save hl, return adr in hl\r
810 push de ;\r
811 push af ;\r
812 ex de,hl ;\r
813 ld hl,0 ;\r
814 add hl,sp ;\r
815 ld a,h ;\r
816 cp 0f8h ;\r
817 jr nc,isw_1 ;\r
818 ld sp,$stack ;\r
819isw_1:\r
820 push hl ;\r
821 in0 h,(cbar) ;\r
822 push hl ;\r
823 ld a,SYS$CBAR ;\r
824 out0 (cbar),a ;\r
825 ex de,hl ;\r
826 ld e,(hl) ;\r
827 inc hl ;\r
828 ld d,(hl) ;\r
829 ex de,hl ;\r
830 push bc ;\r
831 call jphl ;\r
832\r
833 pop bc ;\r
834 pop hl ;\r
835 out0 (cbar),h ;\r
836 pop hl ;\r
837 ld sp,hl ;\r
838 pop af ;\r
839 pop de ;\r
840 pop hl ;\r
841 ei ;\r
842 ret ;\r
843jphl:\r
844 jp (hl) ;\r
845\r
846; ---------------------------------------------------------\r
847\r
4caee1ec 848\r
a16ba2b0
L
849iprt0:\r
850 push af\r
851 push hl\r
852 in0 a,(tcr)\r
853 in0 a,(tmdr0l)\r
854 in0 a,(tmdr0h)\r
855 ld a,(tim_ms)\r
856 inc a\r
857 cp 100\r
858 jr nz,iprt_1\r
859 xor a\r
860 ld hl,(tim_s)\r
861 inc hl\r
862 ld (tim_s),hl\r
863iprt_1:\r
864 ld (tim_ms),a\r
865 pop hl\r
866 pop af\r
867 ei\r
868 ret\r
869\r
870; ---------------------------------------------------------\r
871\r
872sp.int0:\r
873 ld a,0d0h\r
874 jr sp.i.1\r
875sp.int.len equ $-sp.int0\r
876 ld a,0d1h\r
877 jr sp.i.1\r
878 ld a,0d2h\r
879 jr sp.i.1\r
880 ld a,0d3h\r
881 jr sp.i.1\r
882 ld a,0d4h\r
883 jr sp.i.1\r
884 ld a,0d5h\r
885 jr sp.i.1\r
886 ld a,0d6h\r
887 jr sp.i.1\r
888 ld a,0d7h\r
889 jr sp.i.1\r
890 ld a,0d8h\r
891sp.i.1:\r
892; out (80h),a\r
893 halt\r
894\r
895curph defl $\r
896 .dephase\r
897sysrame:\r
898 .phase curph\r
899tim_ms: db 0\r
900tim_s: dw 0\r
901 .dephase\r
815c1735 902\r
a16ba2b0
L
903;-----------------------------------------------------\r
904\r
905 dseg\r
906\r
907 ds 1\r
908banktabsys:\r
909 ds 1 ;0c001h\r
910 ds 1 ;0c002h\r
911banktab:\r
912 ds BANKS ;0c003h\r
913memalv:\r
914 ds 512/4 ;Number of 4k blocks\r
915alv_len equ $-memalv\r
916crc_len equ $-banktabsys\r
917\r
815c1735 918crc_memalv:\r
a16ba2b0
L
919 ds 2 ;\r
920\r
921 cseg\r
922\r
923 ;.phase 0ffc0h\r
924;ivtab equ 0ffc0h ; 0ffc0h ;int vector table\r
925 ;.dephase\r
926\r
927 ;.phase 0fffch\r
928mark_55AA equ 0fffch\r
929 ;ds 4 ; 0fffch\r
930 ;.dephase\r
931\r
932\r
933 end\r
934\r