]> cloudbase.mooo.com Git - z180-stamp.git/blame - z180/r3init.180
working connect command, new sleep command
[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
6a4e9540 316if 0\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 327\r
6a4e9540
L
328; ld (bufdat+1),hl\r
329; ld (bufdat+3),a\r
330; ld a,1\r
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
6a4e9540 340 ld a,2\r
bad2d92d
L
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
6a4e9540 358endif\r
349c01b1
L
359;----------------------------------------------------------------------\r
360;\r
4caee1ec 361\r
6a4e9540
L
362 extrn msginit,msg.sout\r
363 extrn mtx.fifo,mrx.fifo\r
364 extrn co.fifo,ci.fifo\r
4caee1ec
L
365\r
366\r
a16ba2b0
L
367bufferinit:\r
368 call msginit\r
815c1735 369\r
a16ba2b0 370 ld hl,buffers\r
6a4e9540 371 ld b,buftablen\r
a16ba2b0 372bfi_1:\r
6a4e9540
L
373 ld a,(hl)\r
374 inc hl\r
375 ld (bufdat+0),a\r
a16ba2b0
L
376 ld e,(hl)\r
377 inc hl\r
378 ld d,(hl)\r
379 inc hl\r
380 push hl\r
6a4e9540
L
381\r
382 or a\r
383 jr nz,bfi_2\r
384 in0 a,cbr\r
385 call log2phys\r
386 ld (40h+0),hl\r
387 ld (40h+2),a\r
388 out0 (AVRINT5),a\r
389 jr bfi_3 \r
390bfi_2:\r
a16ba2b0
L
391 in0 a,cbr\r
392 call log2phys\r
393 ld (bufdat+1),hl\r
394 ld (bufdat+3),a\r
a16ba2b0
L
395 ld hl,inimsg\r
396 call msg.sout\r
6a4e9540 397bfi_3:\r
a16ba2b0 398 pop hl\r
a16ba2b0
L
399 djnz bfi_1\r
400 ret\r
401\r
a16ba2b0 402buffers:\r
6a4e9540
L
403 db 0\r
404 dw mtx.fifo\r
405 db 1\r
406 dw mrx.fifo\r
407 db 2\r
408 dw co.fifo\r
409 db 3\r
410 dw ci.fifo\r
411buftablen equ ($ - buffers)/3\r
815c1735
L
412\r
413inimsg:\r
6a4e9540 414 db inimsg_e - $ -1\r
a16ba2b0
L
415 db 81h\r
416 db inimsg_e - $ -1\r
417 db 0\r
418bufdat:\r
419 db 0\r
420 dw 0\r
421 db 0\r
e598b357 422inimsg_e:\r
a16ba2b0 423\r
4caee1ec 424\r
a16ba2b0
L
425;\r
426;----------------------------------------------------------------------\r
427;\r
428\r
429sysram_init:\r
430 ld hl,sysramw\r
431 ld de,topcodsys\r
432 ld bc,sysrame-sysramw\r
433 ldir\r
434\r
435 ret\r
436\r
437;----------------------------------------------------------------------\r
438\r
439ivtab_init:\r
440 ld hl,ivtab ;\r
441 ld a,h ;\r
442 ld i,a ;\r
443 out0 (il),l ;\r
444\r
445; Let all vectors point to spurious int routines.\r
446\r
447 ld d,high sp.int0\r
448 ld a,low sp.int0\r
449 ld b,9\r
815c1735 450ivt_i1:\r
a16ba2b0
L
451 ld (hl),a\r
452 inc l\r
453 ld (hl),d\r
454 inc l\r
455 add a,sp.int.len\r
456 djnz ivt_i1\r
457 ret\r
458\r
4caee1ec 459;----------------------------------------------------------------------\r
a16ba2b0
L
460\r
461prt0_init:\r
462 ld a,i\r
463 ld h,a\r
464 in0 a,(il)\r
465 and 0E0h\r
466 or IV$PRT0\r
467 ld l,a\r
468 ld (hl),low iprt0\r
469 inc hl\r
470 ld (hl),high iprt0\r
471 ld hl,prt0itab\r
472 call io.ini.m\r
473 ret\r
815c1735 474\r
a16ba2b0
L
475prt0itab:\r
476 db prt0it_e-prt0itab-2\r
477 db tmdr0l\r
478 dw PRT_TC10MS\r
479 dw PRT_TC10MS\r
480 db M_TIE0+M_TDE0 ;enable timer 0 interrupt and down count.\r
481prt0it_e:\r
482\r
4caee1ec 483\r
a16ba2b0
L
484;\r
485;----------------------------------------------------------------------\r
486;\r
487\r
488io.ini:\r
489 push bc\r
490 ld b,0 ;high byte port adress\r
491 ld a,(hl) ;count\r
492 inc hl\r
493ioi_1:\r
494 ld c,(hl) ;port address\r
495 inc hl\r
496 outi\r
497 inc b ;outi decrements b\r
498 dec a\r
499 jr nz,ioi_1\r
500 pop bc\r
501 ret\r
502\r
503io.ini.m:\r
504 push bc\r
505 ld b,(hl)\r
506 inc hl\r
507 ld c,(hl)\r
508 inc hl\r
815c1735
L
509 otimr\r
510 pop bc\r
a16ba2b0 511 ret\r
815c1735 512\r
a16ba2b0
L
513io.ini.l:\r
514;\r
515\r
516;----------------------------------------------------------------------\r
517;\r
518\r
519; compute crc\r
520; hl: start adr\r
521; bc: len\r
522; bc returns crc val\r
523\r
524do_crc16:\r
525 ld de,0FFFFh\r
526crc1:\r
527 ld a,(hl)\r
528 xor e\r
529 ld e,a\r
530 rrca\r
531 rrca\r
532 rrca\r
533 rrca\r
534 and 0Fh\r
535 xor e\r
536 ld e,a\r
537 rrca\r
538 rrca\r
539 rrca\r
540 push af\r
541 and 1Fh\r
542 xor d\r
543 ld d,a\r
544 pop af\r
545 push af\r
546 rrca\r
547 and 0F0h\r
548 xor d\r
549 ld d,a\r
550 pop af\r
551 and 0E0h\r
552 xor e\r
553 ld e,d\r
554 ld d,a\r
555 cpi\r
556 jp pe,crc1\r
557 or e ;z-flag\r
558 ret\r
559\r
560\r
561gencrc_alv:\r
562 push hl ;03f6\r
563 push de ;03f7\r
564 push bc\r
565 push af ;03f8\r
566 ld hl,banktabsys ;03f9\r
567 ld bc,crc_len ;03fc\r
568 call do_crc16 ;03ff\r
569 ld (hl),e\r
570 inc hl\r
571 ld (hl),d\r
572 pop af ;0406\r
573 pop bc\r
574 pop de ;0407\r
575 pop hl ;0408\r
576 ret ;0409\r
577\r
578checkcrc_alv:\r
579 push hl ;040a\r
580 push de\r
581 push bc ;040b\r
582 ld hl,banktabsys ;040d\r
583 ld bc,crc_len+2 ;0410\r
584 call do_crc16 ;0413\r
585 pop bc ;041d\r
586 pop de\r
587 pop hl ;041e\r
588 ret ;041f\r
589\r
4caee1ec
L
590;----------------------------------------------------------------------\r
591\r
a16ba2b0
L
592;\r
593; alloc\r
594;\r
595; h: max bank #\r
596; l: min bank #\r
597; b: max size\r
598; c: min size\r
599;\r
600; ret:\r
601; a: 0 == ok\r
815c1735 602; 1 ==\r
a16ba2b0
L
603; 2 == no bank # in requested range\r
604; ff == crc error\r
605;\r
606\r
607sub_0420h:\r
608 call checkcrc_alv ;0420\r
609 jr nz,l049ch ;0424 crc error, tables corrupt\r
815c1735 610\r
a16ba2b0
L
611 call sub_049dh ;0427 bank # in req. range available?\r
612 jr c,l0499h ;042a\r
613 push ix ;042c\r
614 push iy ;042e\r
615 push de ;0430\r
616 push hl ;0431\r
617 push bc ;0432\r
618 ld c,b ;0433\r
619 ld b,alv_len+1 ;0434\r
620 ld d,0 ;0436\r
621 ld hl,memalv-1 ;0438\r
622 jr l0441h ;043b\r
623\r
624; find free blocks\r
625\r
626l043dh:\r
627 ld a,(hl) ;043d\r
628 inc a ;043e free blocks are marked 0ffh\r
629 jr z,l0446h ;043f\r
630l0441h:\r
631 inc hl ;0441\r
632 djnz l043dh ;0442\r
633 jr l0464h ;0444\r
634l0446h:\r
815c1735 635 push hl ;0446\r
a16ba2b0
L
636 pop ix ;0447 free blocks start here\r
637 ld e,000h ;0449\r
638 jr l0451h ;044b\r
639l044dh: ; count free blocks\r
640 ld a,(hl) ;044d\r
641 inc a ;044e\r
642 jr nz,l0457h ;044f\r
643l0451h:\r
644 inc e ;0451\r
645 inc hl ;0452\r
646 djnz l044dh ;0453\r
647 jr l0464h ;0455\r
648\r
815c1735 649; end of free blocks run.\r
a16ba2b0
L
650\r
651l0457h:\r
652 ld a,d ;0457\r
653 cp e ;0458 nr of blocks >= requested ?\r
815c1735 654 jr nc,l0441h ;0459\r
a16ba2b0
L
655\r
656 ld d,e ;045b\r
657 push ix ;045c\r
658 pop iy ;045e\r
659 ld a,d ;0460\r
660 cp c ;0461\r
661 jr c,l0441h ;0462\r
662l0464h:\r
663 pop bc ;0464\r
664 ld a,d ;0465\r
665 cp b ;0466\r
666 jr c,l046ch ;0467\r
667 ld d,b ;0469\r
668 jr l0471h ;046a\r
669l046ch:\r
670 cp c ;046c\r
671 jr nc,l0471h ;046d\r
672 ld d,000h ;046f\r
673l0471h:\r
674 ld a,d ;0471\r
675 push iy ;0472\r
676 pop hl ;0474\r
677 ld de,memalv ;0475\r
678 or a ;0478\r
679 sbc hl,de ;0479\r
680 ld b,l ;047b\r
681 ld c,a ;047c\r
682 pop hl ;047d\r
683l047eh:\r
684 or a ;047e\r
685 jr z,l0489h ;047f\r
686 ld (iy+0),l ;0481\r
687 inc iy ;0484\r
688 dec a ;0486\r
689 jr l047eh ;0487\r
690l0489h:\r
691 pop de ;0489\r
692 pop iy ;048a\r
693 pop ix ;048c\r
694 call gencrc_alv ;048e\r
695 ld a,c ;0491\r
696 or a ;0492\r
697 ld a,000h ;0493\r
698 ret nz ;0495\r
699 or 001h ;0496\r
700 ret ;0498\r
701\r
702l0499h:\r
703 ld a,2 ;0499\r
704l049ch:\r
705 or a\r
706 ret ;049c\r
707\r
708\r
709; search a free bank number in range\r
710; h: max #\r
711; l: min #\r
712; ret:\r
713; l: bank number available\r
714; nc, if found, bank nr. in l\r
715; cy, if none found\r
716\r
717sub_049dh:\r
718 push de ;049d\r
719 push bc ;049e\r
720 ex de,hl ;049f\r
721 dec e ;04a0\r
722l04a1h:\r
723 inc e ;04a1 test next #\r
724 ld a,d ;04a2\r
725 cp e ;04a3\r
815c1735 726 jr c,l04b1h ;04a4\r
a16ba2b0
L
727 ld a,e ;04a6\r
728 ld hl,memalv ;04a7\r
729 ld bc,alv_len ;04aa\r
730 cpir ;04ad bank# allready allocated?\r
731 jr z,l04a1h ;04af if yes, search for next\r
732l04b1h:\r
733 ex de,hl ;04b1\r
734 pop bc ;04b2\r
735 pop de ;04b3\r
736 ret ;04b4\r
737\r
738\r
739sub_04b5h:\r
740 ld a,l ;04b5\r
741 cp 012h ;04b6\r
742 ccf ;04b8\r
743 ret c ;04b9\r
744 push hl ;04ba\r
745 ld hl,banktab ;04bb\r
746 call add_hl_a\r
747 ld (hl),b ;04c3\r
748 call gencrc_alv ;04c4\r
749 pop hl ;04c7\r
750 or a ;04c8 clear carry\r
751 ret ;04c9\r
752\r
753\r
754;--------------------------------------------------------------\r
755;\r
756; de: Log. Address\r
757; a: Bank number\r
758;\r
759;out ahl: Phys. (linear) Address\r
760\r
761\r
762bnk2phys:\r
763 push hl\r
764 ld hl,banktab\r
765 call add_hl_a\r
766 ld a,(hl)\r
767 pop hl\r
768\r
769 ; fall thru\r
770;--------------------------------------------------------------\r
771;\r
772; de: Log. Address\r
773; a: Bank (bbr)\r
774;\r
775; OP: ahl = (a<<12) + (d<<8) + e\r
776;\r
4caee1ec 777;out ahl: Phys. (linear) Address\r
a16ba2b0
L
778\r
779\r
780log2phys:\r
781 push bc ;\r
782 ld c,a ;\r
783 ld b,16 ;\r
784 mlt bc ;bc = a<<4\r
785 ld l,d ;\r
786 ld h,0 ;\r
815c1735 787 add hl,bc ;bc + d == a<<4 + d\r
a16ba2b0
L
788 ld a,h ;\r
789 ld h,l ;\r
790 ld l,e ;\r
791 pop bc ;\r
792 ret ;\r
793\r
794\r
795;--------------------------------------------------------------\r
796;\r
797;return:\r
798; hl = hl + a\r
799; Flags undefined\r
800;\r
801\r
802add_hl_a:\r
815c1735
L
803 add a,l\r
804 ld l,a\r
805 ret nc\r
806 inc h\r
807 ret\r
a16ba2b0
L
808\r
809; ---------------------------------------------------------\r
810\r
811sysramw:\r
812\r
813 .phase isvsw_loc\r
814topcodsys:\r
815\r
816; Trampoline for interrupt routines in banked ram.\r
817; Switch stack pointer to "system" stack in top ram\r
818; Save cbar\r
815c1735 819\r
a16ba2b0
L
820isv_sw: ;\r
821 ex (sp),hl ; save hl, return adr in hl\r
822 push de ;\r
823 push af ;\r
824 ex de,hl ;\r
825 ld hl,0 ;\r
826 add hl,sp ;\r
827 ld a,h ;\r
828 cp 0f8h ;\r
829 jr nc,isw_1 ;\r
830 ld sp,$stack ;\r
831isw_1:\r
832 push hl ;\r
833 in0 h,(cbar) ;\r
834 push hl ;\r
835 ld a,SYS$CBAR ;\r
836 out0 (cbar),a ;\r
837 ex de,hl ;\r
838 ld e,(hl) ;\r
839 inc hl ;\r
840 ld d,(hl) ;\r
841 ex de,hl ;\r
842 push bc ;\r
843 call jphl ;\r
844\r
845 pop bc ;\r
846 pop hl ;\r
847 out0 (cbar),h ;\r
848 pop hl ;\r
849 ld sp,hl ;\r
850 pop af ;\r
851 pop de ;\r
852 pop hl ;\r
853 ei ;\r
854 ret ;\r
855jphl:\r
856 jp (hl) ;\r
857\r
858; ---------------------------------------------------------\r
859\r
4caee1ec 860\r
a16ba2b0
L
861iprt0:\r
862 push af\r
863 push hl\r
864 in0 a,(tcr)\r
865 in0 a,(tmdr0l)\r
866 in0 a,(tmdr0h)\r
867 ld a,(tim_ms)\r
868 inc a\r
869 cp 100\r
870 jr nz,iprt_1\r
871 xor a\r
872 ld hl,(tim_s)\r
873 inc hl\r
874 ld (tim_s),hl\r
875iprt_1:\r
876 ld (tim_ms),a\r
877 pop hl\r
878 pop af\r
879 ei\r
880 ret\r
881\r
882; ---------------------------------------------------------\r
883\r
884sp.int0:\r
885 ld a,0d0h\r
886 jr sp.i.1\r
887sp.int.len equ $-sp.int0\r
888 ld a,0d1h\r
889 jr sp.i.1\r
890 ld a,0d2h\r
891 jr sp.i.1\r
892 ld a,0d3h\r
893 jr sp.i.1\r
894 ld a,0d4h\r
895 jr sp.i.1\r
896 ld a,0d5h\r
897 jr sp.i.1\r
898 ld a,0d6h\r
899 jr sp.i.1\r
900 ld a,0d7h\r
901 jr sp.i.1\r
902 ld a,0d8h\r
903sp.i.1:\r
904; out (80h),a\r
905 halt\r
906\r
907curph defl $\r
908 .dephase\r
909sysrame:\r
910 .phase curph\r
911tim_ms: db 0\r
912tim_s: dw 0\r
913 .dephase\r
815c1735 914\r
a16ba2b0
L
915;-----------------------------------------------------\r
916\r
917 dseg\r
918\r
919 ds 1\r
920banktabsys:\r
921 ds 1 ;0c001h\r
922 ds 1 ;0c002h\r
923banktab:\r
924 ds BANKS ;0c003h\r
925memalv:\r
926 ds 512/4 ;Number of 4k blocks\r
927alv_len equ $-memalv\r
928crc_len equ $-banktabsys\r
929\r
815c1735 930crc_memalv:\r
a16ba2b0
L
931 ds 2 ;\r
932\r
933 cseg\r
934\r
935 ;.phase 0ffc0h\r
936;ivtab equ 0ffc0h ; 0ffc0h ;int vector table\r
937 ;.dephase\r
938\r
939 ;.phase 0fffch\r
940mark_55AA equ 0fffch\r
941 ;ds 4 ; 0fffch\r
942 ;.dephase\r
943\r
944\r
945 end\r
946\r