+++ /dev/null
- page 255\r
- .z80\r
-\r
- extrn ddtz,bpent\r
- extrn $stack\r
- extrn $coninit,$cists,$ci\r
-\r
- extrn romend\r
-\r
-\r
- global isv_sw\r
-\r
- include config.inc\r
- include z180reg.inc\r
- include z180.lib\r
- \r
-CR equ 0dh\r
-\r
-\r
-\r
-;----------------------------------------------------------------------\r
-\r
- cseg\r
-\r
- jp start \r
-\r
-; restart vectors\r
-\r
-rsti defl 1\r
- rept 7\r
- db 0, 0, 0, 0, 0\r
- jp bpent\r
-rsti defl rsti+1\r
- endm\r
-\r
-;----------------------------------------------------------------------\r
-\r
- if ROMSYS\r
-$crom: defb c$rom ;\r
- else\r
- db 0 ;\r
- endif\r
-\r
-dmclrt: ;clear ram per dma\r
- db dmct_e-dmclrt-2 ;\r
- db sar0l ;first port\r
- dw nullbyte ;src (fixed) \r
-nullbyte:\r
- db 000h ;src\r
- dw romend ;dst (inc), start after "rom" code\r
- db 00h ;dst\r
- dw 0-romend ;count (64k)\r
-dmct_e:\r
-\r
-\r
-INIWAITS defl CWAITIO\r
- if ROMSYS\r
-INIWAITS defl INIWAITS+CWAITROM\r
- endif\r
-\r
-hwini0:\r
- db 3 ;count\r
- db rcr,CREFSH ;configure DRAM refresh\r
- db dcntl,INIWAITS ;wait states\r
- db cbar,SYS$CBAR\r
-\r
-;----------------------------------------------------------------------\r
-\r
-start:\r
- push af ;003c\r
- in0 a,(itc) ;003d Illegal opcode trap?\r
- jp p,??st01 ;0040\r
- pop af ;0043\r
- jp bpent ;0044 yes, handle\r
-\r
-??st01:\r
- ld a,i ;0047 I register == 0 ? \r
- jr z,??st02 ;004b yes, harware reset\r
- pop af ;004d \r
- jp bpent ;004e no, allready set up\r
-\r
-??st02:\r
- di ;0058\r
- ld a,CREFSH\r
- out0 (rcr),a ; configure DRAM refresh\r
- ld a,CWAITIO\r
- out0 (dcntl),a ; wait states\r
-\r
-; search warm start mark\r
-\r
- ld ix,mark_55AA ;00b8 ; top of common area\r
- ld a,SYS$CBAR ;\r
- out0 (cbar),a ;\r
- ld a,071h ;00bc\r
- ex af,af' ;00be ;for cbr = 0x70 downto 0x40\r
-swsm_l:\r
- ex af,af' ;00bf \r
- dec a ;00c0\r
- cp 03fh ;00c1\r
- jr z,kstart ;00c3 ; break (mark not found)\r
- out0 (cbr),a ;00c5\r
- ex af,af' ;00c8\r
- ld a,0aah ;00c9\r
- cp (ix+000h) ;00cb\r
- jr nz,swsm_l ;00ce\r
- cp (ix+002h) ;00d0\r
- jr nz,swsm_l ;00d3\r
- cpl ;00d5\r
- cp (ix+001h) ;00d6\r
- jr nz,swsm_l ;00d9\r
- cp (ix+003h) ;00db\r
- jr nz,swsm_l ;00de\r
- ld sp,$stack ;00e0 mark found, check\r
- call checkcrc_alv ;00e3\r
- jp z,wstart ;00e6 check ok,\r
-\r
-;\r
-; ram not ok, initialize -- kstart --\r
-\r
-kstart:\r
-\r
- ld a,088h ;00e9 0000-7fff: common 0\r
- out0 (cbar),a ;00eb 8000-ffff: common 1\r
- ld ix,08000h ;00f3\r
- ld a,0 ;00f1 start at 008000 (2. phys. 32k block)\r
-??f_0:\r
- out0 (cbr),a ;00f9\r
-\r
- ld (ix+0),a ;0103 \r
- cpl\r
- ld (ix+1),a ;0103 \r
- cpl\r
- add a,8 ;010a next 'bank'\r
- cp 078h ;010c stop at 078000\r
- jr nz,??f_0 ;010e\r
-\r
- ld de,8000h ;0114 first block not tested, but mark as ok\r
- ld a,0 ;00f1 start at 008000 (2. phys. 32k block)\r
-??cp_0:\r
- out0 (cbr),a ;011c\r
- ld c,a\r
- xor (ix+0)\r
- ld b,a\r
- ld a,c\r
- cpl\r
- xor (ix+1)\r
- or b\r
- jr nz,??cp_1\r
- scf\r
-??cp_1:\r
- rr d\r
- rr e\r
- ld a,c\r
- add a,8\r
- cp 078h ; stop at 078000\r
- jr nz,??cp_0\r
- \r
-;\r
-; ram test found 1 or more error free blocks (32k)\r
-;\r
-\r
-ramok:\r
- ld a,SYS$CBAR ;01c8\r
- out0 (cbar),a ;01ca\r
- ld h,d\r
- ld l,e\r
- ld c,070h ;01ce highest block\r
- ld b,15 ;01d0\r
-??sr_1:\r
- add hl,hl\r
- jr c,alloc ;01d4 highest "error free" block\r
- ld a,c ;01d6\r
- sub 008h ;01d7\r
- ld c,a ;01d9\r
- djnz ??sr_1 ;01da\r
-\r
- slp ;01dc should never be reached\r
-\r
-alloc:\r
- out0 (cbr),c ;01de\r
- ld sp,$stack ;01e1\r
- \r
-; Clear RAM using DMA0\r
-\r
- ld hl,dmclrt ;load DMA registers\r
- call io.ini.m\r
- ld a,0cbh ;01ef dst +1, src fixed, burst\r
- out0 (dmode),a ;01f1\r
-\r
- ld b,512/64\r
- ld a,062h ;01f4 enable dma0, \r
-??cl_1:\r
- out0 (dstat),a ;01f9 clear (up to) 64k\r
- djnz ??cl_1 ; end of RAM?\r
- \r
-; Init bank manager\r
- \r
- ld hl,banktabsys ;020f\r
- ld (hl),c ; Common area\r
- inc hl ;0213\r
- ld (hl),c ; System work area\r
- inc hl ;0215 Point to bank 0 entry\r
- ld b,BANKS ;0216\r
-l0218h:\r
- ld (hl),0ffh ;0218 Mark all banks as unassigned\r
- inc hl ;021a\r
- djnz l0218h ;021b\r
-\r
- ld hl,memalv ;\r
- ld b,8 ; 8*4k ie. first 32k\r
-??a_0:\r
- ld (hl),0e0h ; mark as sys ("rom"/monitor)\r
- inc hl\r
- djnz ??a_0\r
- \r
- rr d ; shift out bit for block 0\r
- rr e ;\r
- ld c,15 ;022c 15*32k remaining blocks\r
-l022eh:\r
- ld a,0feh ; 0xfe == block with error(s)\r
- rr d ;\r
- rr e\r
- adc a,0 ; ==> 0xff : block ok\r
- ld b,32/4 ; 32k == 8 * 4k \r
-l0236h:\r
- ld (hl),a ;\r
- inc hl ;\r
- djnz l0236h ;\r
- dec c ;\r
- jr nz,l022eh ;next 32k block\r
- \r
- ld hl,memalv+0ch ;memalv+0ch\r
- ld a,(banktabsys) ;\r
- call add_hl_a\r
- ld b,3 ;\r
-l024ah:\r
- ld (hl),0ech ;alloc system ram\r
- inc hl ;\r
- djnz l024ah ;\r
- ld (hl),0efh ;alloc common\r
- call gencrc_alv\r
-\r
- ld hl,0000h ;bank # \r
- ld bc,0f0fh ; size (?) (4k blocks)\r
- xor a ;\r
- call sub_0420h ;alloc mem for bank 0\r
- ld c,l ;\r
- or a ;\r
- call z,sub_04b5h ;\r
-\r
- ld hl,0101h ;\r
- ld bc,0f0fh ;\r
- xor a ;\r
- call sub_0420h ;\r
- ld c,l ;\r
- or a ;\r
- call z,sub_04b5h ;\r
-\r
- ld hl,055AAh ;set warm start mark\r
- ld (mark_55AA),hl ;\r
- ld (mark_55AA+2),hl;\r
-\r
-;\r
-; crc ok -- wstart --\r
-;\r
-wstart:\r
- call sysram_init ;027f\r
- call ivtab_init\r
-\r
- call prt0_init\r
-\r
-\r
- call bufferinit\r
-\r
-\r
- call $coninit\r
-\r
-\r
-\r
-\r
- im 2 ;?030e\r
- ei ;0282\r
-\r
- call $cists ;0284\r
- call $cists ;0287\r
- or a ;028a\r
- call nz,$ci ;028d\r
- \r
- ld a,(banktab) ; \r
- ld e,a ; \r
- jp ddtz ;0290\r
- \r
-\r
-;\r
-;----------------------------------------------------------------------\r
-;\r
-\r
- extrn msginit,msg.sout,msg_fifo\r
- extrn tx.buf,rx.buf\r
-\r
-\r
-;TODO: Make a ringbuffer module.\r
-\r
- global buf.init\r
- \r
-buf.init:\r
- ld (ix+o.in_idx),0\r
- ld (ix+o.out_idx),0\r
- ld (ix+o.mask),a\r
- ret\r
-\r
-;----------------------------------------------------------------------\r
-\r
-bufferinit:\r
- call msginit\r
- \r
- ld hl,buffers\r
- ld bc,0300h\r
-bfi_1:\r
- ld e,(hl)\r
- inc hl\r
- ld d,(hl)\r
- inc hl\r
- push hl\r
- in0 a,cbr\r
- call log2phys\r
- ld (bufdat+1),hl\r
- ld (bufdat+3),a\r
- ld a,c\r
- ld (bufdat+0),a\r
- ld hl,inimsg\r
- call msg.sout\r
- pop hl\r
- inc c\r
- djnz bfi_1\r
- ret\r
-\r
- rept 20\r
- db 0\r
- endm\r
- \r
-buffers:\r
- dw msg_fifo\r
- dw tx.buf\r
- dw rx.buf\r
- \r
-inimsg: \r
- db inimsg_e - $ -2\r
- db PMSG\r
- db 81h\r
- db inimsg_e - $ -1\r
- db 0\r
-bufdat:\r
- db 0\r
- dw 0\r
- db 0\r
-inimsg_e\r
-\r
-;\r
-;----------------------------------------------------------------------\r
-;\r
-\r
-sysram_init:\r
- ld hl,sysramw\r
- ld de,topcodsys\r
- ld bc,sysrame-sysramw\r
- ldir\r
-\r
- ret\r
-\r
-;----------------------------------------------------------------------\r
-\r
-ivtab_init:\r
- ld hl,ivtab ;\r
- ld a,h ;\r
- ld i,a ;\r
- out0 (il),l ;\r
-\r
-; Let all vectors point to spurious int routines.\r
-\r
- ld d,high sp.int0\r
- ld a,low sp.int0\r
- ld b,9\r
-ivt_i1: \r
- ld (hl),a\r
- inc l\r
- ld (hl),d\r
- inc l\r
- add a,sp.int.len\r
- djnz ivt_i1\r
- ret\r
-\r
-\r
-prt0_init:\r
- ld a,i\r
- ld h,a\r
- in0 a,(il)\r
- and 0E0h\r
- or IV$PRT0\r
- ld l,a\r
- ld (hl),low iprt0\r
- inc hl\r
- ld (hl),high iprt0\r
- ld hl,prt0itab\r
- call io.ini.m\r
- ret\r
- \r
-prt0itab:\r
- db prt0it_e-prt0itab-2\r
- db tmdr0l\r
- dw PRT_TC10MS\r
- dw PRT_TC10MS\r
- db M_TIE0+M_TDE0 ;enable timer 0 interrupt and down count.\r
-prt0it_e:\r
-\r
-;\r
-;----------------------------------------------------------------------\r
-;\r
-\r
-io.ini:\r
- push bc\r
- ld b,0 ;high byte port adress\r
- ld a,(hl) ;count\r
- inc hl\r
-ioi_1:\r
- ld c,(hl) ;port address\r
- inc hl\r
- outi\r
- inc b ;outi decrements b\r
- dec a\r
- jr nz,ioi_1\r
- pop bc\r
- ret\r
-\r
-io.ini.m:\r
- push bc\r
- ld b,(hl)\r
- inc hl\r
- ld c,(hl)\r
- inc hl\r
- otimr \r
- pop bc \r
- ret\r
- \r
-io.ini.l:\r
-;\r
-\r
-;----------------------------------------------------------------------\r
-;\r
-\r
-; compute crc\r
-; hl: start adr\r
-; bc: len\r
-; bc returns crc val\r
-\r
-do_crc16:\r
- ld de,0FFFFh\r
-crc1:\r
- ld a,(hl)\r
- xor e\r
- ld e,a\r
- rrca\r
- rrca\r
- rrca\r
- rrca\r
- and 0Fh\r
- xor e\r
- ld e,a\r
- rrca\r
- rrca\r
- rrca\r
- push af\r
- and 1Fh\r
- xor d\r
- ld d,a\r
- pop af\r
- push af\r
- rrca\r
- and 0F0h\r
- xor d\r
- ld d,a\r
- pop af\r
- and 0E0h\r
- xor e\r
- ld e,d\r
- ld d,a\r
- cpi\r
- jp pe,crc1\r
- or e ;z-flag\r
- ret\r
-\r
-\r
-gencrc_alv:\r
- push hl ;03f6\r
- push de ;03f7\r
- push bc\r
- push af ;03f8\r
- ld hl,banktabsys ;03f9\r
- ld bc,crc_len ;03fc\r
- call do_crc16 ;03ff\r
- ld (hl),e\r
- inc hl\r
- ld (hl),d\r
- pop af ;0406\r
- pop bc\r
- pop de ;0407\r
- pop hl ;0408\r
- ret ;0409\r
-\r
-checkcrc_alv:\r
- push hl ;040a\r
- push de\r
- push bc ;040b\r
- ld hl,banktabsys ;040d\r
- ld bc,crc_len+2 ;0410\r
- call do_crc16 ;0413\r
- pop bc ;041d\r
- pop de\r
- pop hl ;041e\r
- ret ;041f\r
-\r
-;\r
-; alloc\r
-;\r
-; h: max bank #\r
-; l: min bank #\r
-; b: max size\r
-; c: min size\r
-;\r
-; ret:\r
-; a: 0 == ok\r
-; 1 == \r
-; 2 == no bank # in requested range\r
-; ff == crc error\r
-;\r
-\r
-sub_0420h:\r
- call checkcrc_alv ;0420\r
- jr nz,l049ch ;0424 crc error, tables corrupt\r
- \r
- call sub_049dh ;0427 bank # in req. range available?\r
- jr c,l0499h ;042a\r
- push ix ;042c\r
- push iy ;042e\r
- push de ;0430\r
- push hl ;0431\r
- push bc ;0432\r
- ld c,b ;0433\r
- ld b,alv_len+1 ;0434\r
- ld d,0 ;0436\r
- ld hl,memalv-1 ;0438\r
- jr l0441h ;043b\r
-\r
-; find free blocks\r
-\r
-l043dh:\r
- ld a,(hl) ;043d\r
- inc a ;043e free blocks are marked 0ffh\r
- jr z,l0446h ;043f\r
-l0441h:\r
- inc hl ;0441\r
- djnz l043dh ;0442\r
- jr l0464h ;0444\r
-l0446h:\r
- push hl ;0446 \r
- pop ix ;0447 free blocks start here\r
- ld e,000h ;0449\r
- jr l0451h ;044b\r
-l044dh: ; count free blocks\r
- ld a,(hl) ;044d\r
- inc a ;044e\r
- jr nz,l0457h ;044f\r
-l0451h:\r
- inc e ;0451\r
- inc hl ;0452\r
- djnz l044dh ;0453\r
- jr l0464h ;0455\r
-\r
-; end of free blocks run. \r
-\r
-l0457h:\r
- ld a,d ;0457\r
- cp e ;0458 nr of blocks >= requested ?\r
- jr nc,l0441h ;0459 \r
-\r
- ld d,e ;045b\r
- push ix ;045c\r
- pop iy ;045e\r
- ld a,d ;0460\r
- cp c ;0461\r
- jr c,l0441h ;0462\r
-l0464h:\r
- pop bc ;0464\r
- ld a,d ;0465\r
- cp b ;0466\r
- jr c,l046ch ;0467\r
- ld d,b ;0469\r
- jr l0471h ;046a\r
-l046ch:\r
- cp c ;046c\r
- jr nc,l0471h ;046d\r
- ld d,000h ;046f\r
-l0471h:\r
- ld a,d ;0471\r
- push iy ;0472\r
- pop hl ;0474\r
- ld de,memalv ;0475\r
- or a ;0478\r
- sbc hl,de ;0479\r
- ld b,l ;047b\r
- ld c,a ;047c\r
- pop hl ;047d\r
-l047eh:\r
- or a ;047e\r
- jr z,l0489h ;047f\r
- ld (iy+0),l ;0481\r
- inc iy ;0484\r
- dec a ;0486\r
- jr l047eh ;0487\r
-l0489h:\r
- pop de ;0489\r
- pop iy ;048a\r
- pop ix ;048c\r
- call gencrc_alv ;048e\r
- ld a,c ;0491\r
- or a ;0492\r
- ld a,000h ;0493\r
- ret nz ;0495\r
- or 001h ;0496\r
- ret ;0498\r
-\r
-l0499h:\r
- ld a,2 ;0499\r
-l049ch:\r
- or a\r
- ret ;049c\r
-\r
-\r
-; search a free bank number in range\r
-; h: max #\r
-; l: min #\r
-; ret:\r
-; l: bank number available\r
-; nc, if found, bank nr. in l\r
-; cy, if none found\r
-\r
-sub_049dh:\r
- push de ;049d\r
- push bc ;049e\r
- ex de,hl ;049f\r
- dec e ;04a0\r
-l04a1h:\r
- inc e ;04a1 test next #\r
- ld a,d ;04a2\r
- cp e ;04a3\r
- jr c,l04b1h ;04a4 \r
- ld a,e ;04a6\r
- ld hl,memalv ;04a7\r
- ld bc,alv_len ;04aa\r
- cpir ;04ad bank# allready allocated?\r
- jr z,l04a1h ;04af if yes, search for next\r
-l04b1h:\r
- ex de,hl ;04b1\r
- pop bc ;04b2\r
- pop de ;04b3\r
- ret ;04b4\r
-\r
-\r
-sub_04b5h:\r
- ld a,l ;04b5\r
- cp 012h ;04b6\r
- ccf ;04b8\r
- ret c ;04b9\r
- push hl ;04ba\r
- ld hl,banktab ;04bb\r
- call add_hl_a\r
- ld (hl),b ;04c3\r
- call gencrc_alv ;04c4\r
- pop hl ;04c7\r
- or a ;04c8 clear carry\r
- ret ;04c9\r
-\r
-\r
-;--------------------------------------------------------------\r
-;\r
-; de: Log. Address\r
-; a: Bank number\r
-;\r
-;out ahl: Phys. (linear) Address\r
-\r
-\r
-bnk2phys:\r
- push hl\r
- ld hl,banktab\r
- call add_hl_a\r
- ld a,(hl)\r
- pop hl\r
-\r
- ; fall thru\r
-;--------------------------------------------------------------\r
-;\r
-; de: Log. Address\r
-; a: Bank (bbr)\r
-;\r
-; OP: ahl = (a<<12) + (d<<8) + e\r
-;\r
-;out ehl: Phys. (linear) Address\r
-\r
-\r
-log2phys:\r
- push bc ;\r
- ld c,a ;\r
- ld b,16 ;\r
- mlt bc ;bc = a<<4\r
- ld l,d ;\r
- ld h,0 ;\r
- add hl,bc ;bc + d == a<<4 + d \r
- ld a,h ;\r
- ld h,l ;\r
- ld l,e ;\r
- pop bc ;\r
- ret ;\r
-\r
-\r
-;--------------------------------------------------------------\r
-;\r
-;return:\r
-; hl = hl + a\r
-; Flags undefined\r
-;\r
-\r
-add_hl_a:\r
- add a,l \r
- ld l,a \r
- ret nc \r
- inc h \r
- ret \r
-\r
-; ---------------------------------------------------------\r
-\r
-sysramw:\r
-\r
- .phase isvsw_loc\r
-topcodsys:\r
-\r
-; Trampoline for interrupt routines in banked ram.\r
-; Switch stack pointer to "system" stack in top ram\r
-; Save cbar\r
- \r
-isv_sw: ;\r
- ex (sp),hl ; save hl, return adr in hl\r
- push de ;\r
- push af ;\r
- ex de,hl ;\r
- ld hl,0 ;\r
- add hl,sp ;\r
- ld a,h ;\r
- cp 0f8h ;\r
- jr nc,isw_1 ;\r
- ld sp,$stack ;\r
-isw_1:\r
- push hl ;\r
- in0 h,(cbar) ;\r
- push hl ;\r
- ld a,SYS$CBAR ;\r
- out0 (cbar),a ;\r
- ex de,hl ;\r
- ld e,(hl) ;\r
- inc hl ;\r
- ld d,(hl) ;\r
- ex de,hl ;\r
- push bc ;\r
- call jphl ;\r
-\r
- pop bc ;\r
- pop hl ;\r
- out0 (cbar),h ;\r
- pop hl ;\r
- ld sp,hl ;\r
- pop af ;\r
- pop de ;\r
- pop hl ;\r
- ei ;\r
- ret ;\r
-jphl:\r
- jp (hl) ;\r
-\r
-; ---------------------------------------------------------\r
-\r
-iprt0:\r
- push af\r
- push hl\r
- in0 a,(tcr)\r
- in0 a,(tmdr0l)\r
- in0 a,(tmdr0h)\r
- ld a,(tim_ms)\r
- inc a\r
- cp 100\r
- jr nz,iprt_1\r
- xor a\r
- ld hl,(tim_s)\r
- inc hl\r
- ld (tim_s),hl\r
-iprt_1:\r
- ld (tim_ms),a\r
- pop hl\r
- pop af\r
- ei\r
- ret\r
-\r
-; ---------------------------------------------------------\r
-\r
-sp.int0:\r
- ld a,0d0h\r
- jr sp.i.1\r
-sp.int.len equ $-sp.int0\r
- ld a,0d1h\r
- jr sp.i.1\r
- ld a,0d2h\r
- jr sp.i.1\r
- ld a,0d3h\r
- jr sp.i.1\r
- ld a,0d4h\r
- jr sp.i.1\r
- ld a,0d5h\r
- jr sp.i.1\r
- ld a,0d6h\r
- jr sp.i.1\r
- ld a,0d7h\r
- jr sp.i.1\r
- ld a,0d8h\r
-sp.i.1:\r
-; out (80h),a\r
- halt\r
-\r
-curph defl $\r
- .dephase\r
-sysrame:\r
- .phase curph\r
-tim_ms: db 0\r
-tim_s: dw 0\r
- .dephase\r
- \r
-;-----------------------------------------------------\r
-\r
- dseg\r
-\r
- ds 1\r
-banktabsys:\r
- ds 1 ;0c001h\r
- ds 1 ;0c002h\r
-banktab:\r
- ds BANKS ;0c003h\r
-memalv:\r
- ds 512/4 ;Number of 4k blocks\r
-alv_len equ $-memalv\r
-crc_len equ $-banktabsys\r
-\r
-crc_memalv: \r
- ds 2 ;\r
-\r
- cseg\r
-\r
- ;.phase 0ffc0h\r
-;ivtab equ 0ffc0h ; 0ffc0h ;int vector table\r
- ;.dephase\r
-\r
- ;.phase 0fffch\r
-mark_55AA equ 0fffch\r
- ;ds 4 ; 0fffch\r
- ;.dephase\r
-\r
-\r
- end\r
-\r