X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/8df5b65577a04a48849387475634b3b694094dca..fecee2418b6aea15008ed6d3a856d202d59a5cdb:/z180/init.180?ds=sidebyside diff --git a/z180/init.180 b/z180/init.180 index 16ca852..0bd37c1 100644 --- a/z180/init.180 +++ b/z180/init.180 @@ -12,10 +12,10 @@ global isv_sw include config.inc - if CPU_Z180 - include z180reg.inc - include z180.lib - endif + if CPU_Z180 + include z180reg.inc + include z180.lib + endif @@ -34,39 +34,30 @@ iobyte: db 0 rsti defl 1 rept 7 org 8*rsti + romstart - jp bpent -rsti defl rsti+1 + jp bpent +rsti defl rsti+1 endm ;---------------------------------------------------------------------- - +; Config space +; + org romstart+40h dw 0 db 0 - if ROMSYS -$crom: defb c$rom ; - else - db 0 ; - endif + if ROMSYS +$crom: defb c$rom ; + else + db 0 ; + endif INIWAITS defl CWAITIO - if ROMSYS + if ROMSYS INIWAITS defl INIWAITS+CWAITROM - endif - -hwini0: - if CPU_Z180 - - db 3 ;count - db rcr,CREFSH ;configure DRAM refresh - db dcntl,INIWAITS ;wait states - db cbar,SYS$CBAR - else - db 0 - endif + endif ;---------------------------------------------------------------------- @@ -82,6 +73,18 @@ start: ;---------------------------------------------------------------------- +hwini0: + if CPU_Z180 + + db 3 ;count + db rcr,CREFSH ;configure DRAM refresh + db dcntl,INIWAITS ;wait states + db cbar,SYS$CBAR + else + db 0 + endif + + if CPU_Z180 dmclrt: ;clear ram per dma db dmct_e-dmclrt-2 ; db sar0l ;first port @@ -92,24 +95,26 @@ nullbyte: db 00h ;dst dw 0-romend ;count (64k) dmct_e: + endif + cstart: - if CPU_Z180 + if CPU_Z180 push af in0 a,(itc) ;Illegal opcode trap? jp m,??st01 ld a,i ;I register == 0 ? - jr z,??st02 ; yes, harware reset + jr z,hw_reset ; yes, harware reset ??st01: -; TODO: SYS$CBR + ; TODO: SYS$CBR ld a,(syscbr) out0 (cbr),a pop af ;restore registers jp bpent ; -??st02: +hw_reset: di ;0058 ld a,CREFSH out0 (rcr),a ; configure DRAM refresh @@ -120,42 +125,14 @@ cstart: out0 (ccr),a ; ld a,M_X2CM ;X2 Clock Multiplier ; out0 (cmr),a - else + else di xor a ld (@cbnk),a - endif + endif -; search warm start mark +; check warm start mark - if CPU_Z180 - - ld ix,mark_55AA ;00b8 ; top of common area - ld a,SYS$CBAR ; - out0 (cbar),a ; - ld a,071h ;00bc - ex af,af' ;00be ;for cbr = 0x70 downto 0x40 -swsm_l: - ex af,af' ;00bf - dec a ;00c0 - cp 03fh ;00c1 - jr z,kstart ;00c3 ; break (mark not found) - out0 (cbr),a ;00c5 - ex af,af' ;00c8 - ld a,0aah ;00c9 - cp (ix+000h) ;00cb - jr nz,swsm_l ;00ce - cp (ix+002h) ;00d0 - jr nz,swsm_l ;00d3 - cpl ;00d5 - cp (ix+001h) ;00d6 - jr nz,swsm_l ;00d9 - cp (ix+003h) ;00db - jr nz,swsm_l ;00de - ld sp,$stack ;00e0 mark found, check - call checkcrc_alv ;00e3 - jp z,wstart ;00e6 check ok, - else ld ix,mark_55AA ; top of common area ld a,0aah ; cp (ix+000h) ; @@ -169,92 +146,23 @@ swsm_l: jr nz,kstart ; ld sp,$stack ; mark found, check jp z,wstart ; check ok, - endif -; + ; ram not ok, initialize -- kstart -- kstart: - if CPU_Z180 - - if 0 - - ld a,088h ;00e9 0000-7fff: common 0 - out0 (cbar),a ;00eb 8000-ffff: common 1 - ld ix,08000h ;00f3 - ld a,0 ;00f1 start at 008000 (2. phys. 32k block) -??f_0: - out0 (cbr),a ;00f9 - - ld (ix+0),a ;0103 - cpl - ld (ix+1),a ;0103 - cpl - add a,8 ;010a next 'bank' - cp 078h ;010c stop at 078000 - jr nz,??f_0 ;010e - - ld de,8000h ;0114 first block not tested, but mark as ok - ld a,0 ;00f1 start at 008000 (2. phys. 32k block) -??cp_0: - out0 (cbr),a ;011c - ld c,a - xor (ix+0) - ld b,a - ld a,c - cpl - xor (ix+1) - or b - jr nz,??cp_1 - scf -??cp_1: - rr d - rr e - ld a,c - add a,8 - cp 078h ; stop at 078000 - jr nz,??cp_0 - - else - - ld de,0ffffh - ld a,070h + if CPU_Z180 + ld a,SYS$CBAR + out0 (cbar),a + ld a,SYS$CBR out0 (cbr),a - - endif - -; -; ram test found 1 or more error free blocks (32k) -; + endif -ramok: - ld a,SYS$CBAR ;01c8 - out0 (cbar),a ;01ca - ld h,d - ld l,e - ld c,070h ;01ce highest block - ld b,15 ;01d0 -??sr_1: - add hl,hl - jr c,alloc ;01d4 highest "error free" block - ld a,c ;01d6 - sub 008h ;01d7 - ld c,a ;01d9 - djnz ??sr_1 ;01da - - slp ;01dc should never be reached - -alloc: - out0 (cbr),c ;01de - ld a,c - ld (syscbr),a - endif ld sp,$stack ;01e1 ; Clear RAM using DMA0 - if CPU_Z180 - - if 0 + if CPU_Z180 + if 0 ld hl,dmclrt ;load DMA registers call io.ini.m @@ -267,94 +175,29 @@ alloc: out0 (dstat),a ;01f9 clear (up to) 64k djnz ??cl_1 ; end of RAM? - endif - -; Init bank manager - - ld hl,banktabsys ;020f - ld (hl),c ; Common area - inc hl ;0213 - ld (hl),c ; System work area - inc hl ;0215 Point to bank 0 entry - ld b,BANKS ;0216 -l0218h: - ld (hl),0ffh ;0218 Mark all banks as unassigned - inc hl ;021a - djnz l0218h ;021b - - ld hl,memalv ; - ld b,8 ; 8*4k ie. first 32k -??a_0: - ld (hl),0e0h ; mark as sys ("rom"/monitor) - inc hl - djnz ??a_0 - - rr d ; shift out bit for block 0 - rr e ; - ld c,15 ;022c 15*32k remaining blocks -l022eh: - ld a,0feh ; 0xfe == block with error(s) - rr d ; - rr e - adc a,0 ; ==> 0xff : block ok - ld b,32/4 ; 32k == 8 * 4k -l0236h: - ld (hl),a ; - inc hl ; - djnz l0236h ; - dec c ; - jr nz,l022eh ;next 32k block - - ld hl,memalv+0ch ;memalv+0ch - ld a,(banktabsys) ; - call add_hl_a - ld b,3 ; -l024ah: - ld (hl),0ech ;alloc system ram - inc hl ; - djnz l024ah ; - ld (hl),0efh ;alloc common - call gencrc_alv - - ld hl,0000h ;bank # - ld bc,0f0fh ; size (?) (4k blocks) - xor a ; - call sub_0420h ;alloc mem for bank 0 - ld c,l ; - or a ; - call z,sub_04b5h ; - - ld hl,0101h ; - ld bc,0f0fh ; - xor a ; - call sub_0420h ; - ld c,l ; - or a ; - call z,sub_04b5h ; - endif + endif + endif ld hl,055AAh ;set warm start mark - ld (mark_55AA),hl ; - ld (mark_55AA+2),hl; + ld (mark_55AA),hl + ld (mark_55AA+2),hl + +; -- wstart -- -; -; (crc ok) -- wstart -- -; wstart: call sysram_init ;027f call ivtab_init - if CPU_Z180 - call prt0_init - endif + if CPU_Z180 + call prt0_init + endif call charini call bufferinit - iff CPU_Z180 - ld a,0 - call selbnk - endif - + if CPU_Z80 + ld a,0 + call selbnk + endif im 2 ;?030e ei ;0282 @@ -364,19 +207,18 @@ wstart: or a ;028a call nz,?conin ;028d - if CPU_Z180 - ld a,(banktab) ; - ld e,a ; - else + if CPU_Z180 + ld e,0 ;Sys$Bank + else ; TODO: - endif + endif jp ddtz ;0290 - if CPU_Z180 + if CPU_Z180 ; TODO: SYS$CBR syscbr: db 1 - endif + endif ; ;---------------------------------------------------------------------- @@ -436,8 +278,8 @@ bufdat: inimsg_e: endif + ;---------------------------------------------------------------------- -; extrn msginit,msg.sout extrn mtx.fifo,mrx.fifo @@ -445,8 +287,8 @@ endif bufferinit: - if CPU_Z180 - call msginit + if CPU_Z180 + call msginit ld hl,buffers ld b,buftablen @@ -462,14 +304,12 @@ bfi_1: or a jr nz,bfi_2 -; in0 a,(cbr) call hw_log2phys ld (40h+0),hl ld (40h+2),a out0 (AVRINT5),a jr bfi_3 bfi_2: -; in0 a,(cbr) call hw_log2phys ld (bufdat+1),hl ld (bufdat+3),a @@ -479,8 +319,10 @@ bfi_3: pop hl djnz bfi_1 ret - else - call msginit + + else + + call msginit ld hl,buffers ld b,buftablen @@ -517,7 +359,7 @@ bfi_3: ex de,hl djnz bfi_1 ret - endif + endif buffers: db 0 @@ -560,9 +402,9 @@ ivtab_init: ld hl,ivtab ; ld a,h ; ld i,a ; - if CPU_Z180 + if CPU_Z180 out0 (il),l ; - endif + endif ; Let all vectors point to spurious int routines. @@ -580,7 +422,7 @@ ivt_i1: ;---------------------------------------------------------------------- - if CPU_Z180 + if CPU_Z180 prt0_init: ld a,i ld h,a @@ -602,7 +444,7 @@ prt0itab: dw PRT_TC10MS db M_TIE0+M_TDE0 ;enable timer 0 interrupt and down count. prt0it_e: - endif + endif ; @@ -611,7 +453,7 @@ prt0it_e: io.ini: push bc - if CPU_Z180 + if CPU_Z180 ld b,0 ;high byte port adress ld a,(hl) ;count @@ -625,8 +467,8 @@ ioi_1: inc b ;outi decrements b dec a jr nz,ioi_1 - - else +ioi_e: + else jr ioi_nxt ioi_l: ld c,(hl) ;port address @@ -637,12 +479,11 @@ ioi_nxt: inc hl inc b djnz ioi_l - endif -ioi_e: + endif pop bc ret - if CPU_Z180 + if CPU_Z180 io.ini.m: push bc ld b,(hl) @@ -652,254 +493,30 @@ io.ini.m: otimr pop bc ret - endif + endif io.ini.l: ; -; -;---------------------------------------------------------------------- -; - if CPU_Z180 - -; compute crc -; hl: start adr -; bc: len -; bc returns crc val - -do_crc16: - ld de,0FFFFh -crc1: - ld a,(hl) - xor e - ld e,a - rrca - rrca - rrca - rrca - and 0Fh - xor e - ld e,a - rrca - rrca - rrca - push af - and 1Fh - xor d - ld d,a - pop af - push af - rrca - and 0F0h - xor d - ld d,a - pop af - and 0E0h - xor e - ld e,d - ld d,a - cpi - jp pe,crc1 - or e ;z-flag - ret - - -gencrc_alv: - push hl ;03f6 - push de ;03f7 - push bc - push af ;03f8 - ld hl,banktabsys ;03f9 - ld bc,crc_len ;03fc - call do_crc16 ;03ff - ld (hl),e - inc hl - ld (hl),d - pop af ;0406 - pop bc - pop de ;0407 - pop hl ;0408 - ret ;0409 - -checkcrc_alv: - push hl ;040a - push de - push bc ;040b - ld hl,banktabsys ;040d - ld bc,crc_len+2 ;0410 - call do_crc16 ;0413 - pop bc ;041d - pop de - pop hl ;041e - ret ;041f ;---------------------------------------------------------------------- - -; -; alloc -; -; h: max bank # -; l: min bank # -; b: max size -; c: min size -; -; ret: -; a: 0 == ok -; 1 == -; 2 == no bank # in requested range -; ff == crc error ; + if CPU_Z180 -sub_0420h: - call checkcrc_alv ;0420 - jr nz,l049ch ;0424 crc error, tables corrupt - - call sub_049dh ;0427 bank # in req. range available? - jr c,l0499h ;042a - push ix ;042c - push iy ;042e - push de ;0430 - push hl ;0431 - push bc ;0432 - ld c,b ;0433 - ld b,alv_len+1 ;0434 - ld d,0 ;0436 - ld hl,memalv-1 ;0438 - jr l0441h ;043b - -; find free blocks - -l043dh: - ld a,(hl) ;043d - inc a ;043e free blocks are marked 0ffh - jr z,l0446h ;043f -l0441h: - inc hl ;0441 - djnz l043dh ;0442 - jr l0464h ;0444 -l0446h: - push hl ;0446 - pop ix ;0447 free blocks start here - ld e,000h ;0449 - jr l0451h ;044b -l044dh: ; count free blocks - ld a,(hl) ;044d - inc a ;044e - jr nz,l0457h ;044f -l0451h: - inc e ;0451 - inc hl ;0452 - djnz l044dh ;0453 - jr l0464h ;0455 - -; end of free blocks run. - -l0457h: - ld a,d ;0457 - cp e ;0458 nr of blocks >= requested ? - jr nc,l0441h ;0459 - - ld d,e ;045b - push ix ;045c - pop iy ;045e - ld a,d ;0460 - cp c ;0461 - jr c,l0441h ;0462 -l0464h: - pop bc ;0464 - ld a,d ;0465 - cp b ;0466 - jr c,l046ch ;0467 - ld d,b ;0469 - jr l0471h ;046a -l046ch: - cp c ;046c - jr nc,l0471h ;046d - ld d,000h ;046f -l0471h: - ld a,d ;0471 - push iy ;0472 - pop hl ;0474 - ld de,memalv ;0475 - or a ;0478 - sbc hl,de ;0479 - ld b,l ;047b - ld c,a ;047c - pop hl ;047d -l047eh: - or a ;047e - jr z,l0489h ;047f - ld (iy+0),l ;0481 - inc iy ;0484 - dec a ;0486 - jr l047eh ;0487 -l0489h: - pop de ;0489 - pop iy ;048a - pop ix ;048c - call gencrc_alv ;048e - ld a,c ;0491 - or a ;0492 - ld a,000h ;0493 - ret nz ;0495 - or 001h ;0496 - ret ;0498 - -l0499h: - ld a,2 ;0499 -l049ch: - or a - ret ;049c - - -; search a free bank number in range -; h: max # -; l: min # -; ret: -; l: bank number available -; nc, if found, bank nr. in l -; cy, if none found - -sub_049dh: - push de ;049d - push bc ;049e - ex de,hl ;049f - dec e ;04a0 -l04a1h: - inc e ;04a1 test next # - ld a,d ;04a2 - cp e ;04a3 - jr c,l04b1h ;04a4 - ld a,e ;04a6 - ld hl,memalv ;04a7 - ld bc,alv_len ;04aa - cpir ;04ad bank# allready allocated? - jr z,l04a1h ;04af if yes, search for next -l04b1h: - ex de,hl ;04b1 - pop bc ;04b2 - pop de ;04b3 - ret ;04b4 - - -sub_04b5h: - ld a,l ;04b5 - cp 012h ;04b6 - ccf ;04b8 - ret c ;04b9 - push hl ;04ba - ld hl,banktab ;04bb - call add_hl_a - ld (hl),b ;04c3 - call gencrc_alv ;04c4 - pop hl ;04c7 - or a ;04c8 clear carry - ret ;04c9 +; a: Bank number +; +; out a: bbr value +bnk2log: + push bc + ld b,a + ld c,CA + mlt bc + add a,10h + pop bc + ret -;-------------------------------------------------------------- -; ; de: Log. Address ; a: Bank number ; @@ -907,17 +524,13 @@ sub_04b5h: bnk2phys: - push hl - ld hl,banktab - call add_hl_a - ld a,(hl) - pop hl + call bnk2log ; fall thru ;-------------------------------------------------------------- ; ; de: Log. Address -; a: Bank (bbr) +; a: Bank base (bbr) ; ; OP: ahl = (a<<12) + (d<<8) + e ; @@ -928,16 +541,32 @@ log2phys: push bc ; ld c,a ; ld b,16 ; - mlt bc ;bc = a<<4 - ld l,d ; - ld h,0 ; - add hl,bc ;bc + d == a<<4 + d - ld a,h ; - ld h,l ; - ld l,e ; + mlt bc ; bc = a<<4 + ld l,d ;4 + ld h,0 ;6 + add hl,bc ;7 bc + d == a<<4 + d + ld a,h ;4 + ld h,l ;4 + ld l,e ;4 pop bc ; ret ; + if 0 + +log2phys: + push bc ; + ld b,a ; + ld c,16 ; + mlt bc ; bc = a<<4 + ld a,c ;4 + add a,h ;4 + ld h,a ;4 + ld a,b ;4 + adc a,0 ;6 + pop bc ; + ret ; + + endif ;-------------------------------------------------------------- ; ; de: Log. Address @@ -977,7 +606,7 @@ hlp_e: pop bc ; ret ; - else + else ; ;---------------------------------------------------------------------- @@ -992,7 +621,7 @@ b2p_1: rr h ret - endif + endif ;-------------------------------------------------------------- ; @@ -1059,7 +688,7 @@ jphl: ; --------------------------------------------------------- - if CPU_Z180 + if CPU_Z180 iprt0: push af @@ -1082,7 +711,7 @@ iprt_1: ei ret - endif + endif ; --------------------------------------------------------- @@ -1111,7 +740,7 @@ sp.i.1: ; --------------------------------------------------------- - iff CPU_Z180 + if CPU_Z80 ; Get IFF2 ; This routine may not be loaded in page zero @@ -1175,7 +804,7 @@ selbnk: ; c: bank (0..2) - if 0 + if 0 selbnk: ld a,(@cbnk) @@ -1210,11 +839,11 @@ selbnk: ei ret - endif + endif ;---------------------------------------------------------------------- - if 0 + if 0 ex af,af' push af ex af,af' @@ -1247,7 +876,7 @@ stbk1: ex af,af' stbk2: - endif + endif global @cbnk global mm_sio0, mm_sio1 @@ -1259,7 +888,7 @@ mm_sio1: ds 1 - endif + endif ;---------------------------------------------------------------------- @@ -1273,25 +902,6 @@ tim_s: dw 0 ;----------------------------------------------------- - if CPU_Z180 - - dseg - - ds 1 -banktabsys: - ds 1 ;0c001h - ds 1 ;0c002h -banktab: - ds BANKS ;0c003h -memalv: - ds 512/4 ;Number of 4k blocks -alv_len equ $-memalv -crc_len equ $-banktabsys - -crc_memalv: - ds 2 ; - - endif cseg @@ -1299,9 +909,9 @@ crc_memalv: ;ivtab equ 0ffc0h ; 0ffc0h ;int vector table ;.dephase - ;.phase 0fffch -mark_55AA equ 0fffch - ;ds 4 ; 0fffch + ;.phase 0fffah +mark_55AA equ 0 - 2 - 4 ;2 byte for trap stack + ;ds 4 ;.dephase