summaryrefslogtreecommitdiff
path: root/z180/init.180
diff options
context:
space:
mode:
authorLeo C2015-04-30 20:34:28 +0200
committerLeo C2015-04-30 20:34:28 +0200
commitfecee2418b6aea15008ed6d3a856d202d59a5cdb (patch)
treef125e7782d2af4023a011f1611b66004ea557ab9 /z180/init.180
parent8df5b65577a04a48849387475634b3b694094dca (diff)
downloadz180-stamp-fecee2418b6aea15008ed6d3a856d202d59a5cdb.zip
Remove memory test and bank manager.
First phys. 64K block contains common and system (debugger). Banks for user progs (CP/M) can be assigned from 0x10000.
Diffstat (limited to 'z180/init.180')
-rw-r--r--z180/init.180654
1 files changed, 132 insertions, 522 deletions
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