FALSE equ 0\r
TRUE equ NOT FALSE\r
\r
+banked equ true\r
+\r
;-----------------------------------------------------\r
; CPU and BANKING types\r
\r
COMMON_SIZE equ 4*1024 ;Common Area size in bytes\r
;must be multiple of 4K\r
\r
-if (COMMON_SIZE mod 1000h) \r
+if (COMMON_SIZE mod 1000h)\r
.printx COMMON_SIZE not multiple of 4K!\r
end ;stop assembly\r
endif\r
dseg\r
ds ??ps.len\r
endm\r
-\r
ld (ix+o.mask),a\r
ret\r
\r
-;----------------------------------------------------------------------\r
-if 0\r
- extrn msginit,msg_tx_fifo,msg_rx_fifo\r
- extrn msg.sout\r
-\r
-bufferinit:\r
-\r
- ld de,msg_tx_fifo\r
- in0 a,cbr\r
- call log2phys\r
- ld (40h+0),hl\r
- ld (40h+2),a\r
-\r
-; ld (bufdat+1),hl\r
-; ld (bufdat+3),a\r
-; ld a,1\r
-; ld (bufdat+0),a\r
-; ld hl,inimsg\r
-; call msg.sout\r
-\r
- ld de,msg_rx_fifo\r
- in0 a,cbr\r
- call log2phys\r
- ld (bufdat+1),hl\r
- ld (bufdat+3),a\r
- ld a,2\r
- ld (bufdat+0),a\r
- ld hl,inimsg\r
- call msg.sout\r
-\r
- ret\r
-\r
-inimsg:\r
- db inimsg_e - $ - 1\r
- db 0AEh\r
- db inimsg_e - $ - 1\r
- db 0\r
-bufdat:\r
- db 0\r
- dw 0\r
- db 0\r
-inimsg_e:\r
-\r
-endif\r
-\r
;----------------------------------------------------------------------\r
\r
extrn msginit,msg.sout\r
inc hl\r
ld d,(hl)\r
inc hl\r
- push hl\r
+ ex de,hl\r
\r
or a\r
jr nz,bfi_2\r
- call hw_log2phys\r
+ call hwl2phy\r
ld (40h+0),hl\r
ld (40h+2),a\r
- out0 (AVRINT5),a\r
+ out (AVRINT5),a\r
jr bfi_3 \r
bfi_2:\r
- call hw_log2phys\r
+ call hwl2phy\r
ld (bufdat+1),hl\r
ld (bufdat+3),a\r
ld hl,inimsg\r
call msg.sout\r
bfi_3:\r
- pop hl\r
+ ex de,hl\r
djnz bfi_1\r
ret\r
\r
- else\r
+ else ;CPU_Z180\r
\r
call msginit\r
\r
jr nz,bfi_2\r
\r
ld a,(@cbnk)\r
- call bnk2phys\r
+ call bnk2phy\r
\r
ld (40h+0),hl\r
ld (40h+2),a\r
bfi_2:\r
\r
ld a,(@cbnk)\r
- call bnk2phys\r
+ call bnk2phy\r
\r
ld (bufdat+1),hl\r
ld (bufdat+3),a\r
;\r
if CPU_Z180\r
\r
-; a: Bank number\r
+;--------------------------------------------------------------------\r
+; Return the BBR value for the given bank number\r
;\r
+; in a: Bank number\r
; out a: bbr value\r
\r
bnk2log:\r
- push bc\r
- ld b,a\r
- ld c,CA\r
- mlt bc\r
- add a,10h\r
- pop bc\r
- ret\r
+ or a ;\r
+ ret z ; Bank 0 is at physical address 0\r
\r
-; de: Log. Address\r
-; a: Bank number\r
+ push bc ;\r
+ ld b,a ;\r
+ ld c,CA ;\r
+ mlt bc ;\r
+ ld a,c ;\r
+ add a,10h ;\r
+ pop bc ;\r
+ ret ;\r
+\r
+;--------------------------------------------------------------\r
+\r
+;in hl: Log. Address\r
+; a: Bank number\r
;\r
;out ahl: Phys. (linear) Address\r
\r
\r
-bnk2phys:\r
+bnk2phy:\r
call bnk2log\r
-\r
; fall thru\r
+\r
;--------------------------------------------------------------\r
;\r
-; de: Log. Address\r
+; hl: Log. Address\r
; a: Bank base (bbr)\r
;\r
-; OP: ahl = (a<<12) + (d<<8) + e\r
+; 2 0 0\r
+; 0 6 8 0\r
+; hl hhhhhhhhllllllll\r
+; a + bbbbbbbb\r
+;\r
+; OP: ahl = (a<<12) + (h<<8) + l\r
;\r
;out ahl: Phys. (linear) Address\r
\r
-\r
-log2phys:\r
+log2phy:\r
push bc ;\r
+l2p_i:\r
ld c,a ;\r
ld b,16 ;\r
- mlt bc ; bc = a<<4\r
- ld l,d ;4\r
- ld h,0 ;6\r
- add hl,bc ;7 bc + d == a<<4 + d\r
- ld a,h ;4\r
- ld h,l ;4\r
- ld l,e ;4\r
- pop bc ;\r
- ret ;\r
-\r
- if 0\r
- \r
-log2phys:\r
- push bc ;\r
- ld b,a ;\r
- ld c,16 ;\r
mlt bc ; bc = a<<4\r
- ld a,c ;4\r
- add a,h ;4\r
- ld h,a ;4\r
- ld a,b ;4\r
- adc a,0 ;6\r
+ ld a,c ;\r
+ add a,h ;\r
+ ld h,a ;\r
+ ld a,b ;\r
+ adc a,0 ;\r
pop bc ;\r
ret ;\r
\r
- endif\r
;--------------------------------------------------------------\r
;\r
-; de: Log. Address\r
-; \r
+; hl: Log. Address\r
+;\r
;\r
; OP: ahl = (bankbase<<12) + (d<<8) + e\r
;\r
;out ahl: Phys. (linear) Address\r
\r
\r
-hw_log2phys:\r
+hwl2phy:\r
push bc ;\r
- in0 c,(cbar)\r
- ld a,d\r
- or 00fh\r
+ in0 c,(cbar) ;\r
+ ld a,h ;\r
+ or 00fh ; log. addr in common1?\r
cp c\r
jr c,hlp_1\r
- in0 c,(cbr)\r
- jr hlp_e\r
+\r
+ in0 a,(cbr) ; yes, cbr is address base\r
+ jr hl2p_x\r
hlp_1:\r
- ld b,16\r
+ ld b,16 ; log. address in baked area?\r
mlt bc\r
- ld a,d\r
+ ld a,h\r
cp c\r
- ld c,0\r
- jr c,hlp_e\r
- in0 c,(bbr)\r
-hlp_e: \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
+ jr c,hlp_2\r
+ in0 a,(bbr) ; yes, bbr is address base\r
+ jr hl2p_x\r
+hlp_2:\r
+ xor a ; common1\r
+hl2p_x:\r
+ jr nz,l2p_i\r
+\r
+ pop bc ; bank part is 0, no translation\r
ret ;\r
\r
- else\r
\r
-;\r
+\r
+ else ;CPU_Z180\r
+\r
;----------------------------------------------------------------------\r
;\r
\r
-bnk2phys:\r
+bnk2phy:\r
sla h\r
jr nc,b2p_1 ;A15=1 --> common\r
ld a,3\r
; Save cbar\r
\r
isv_sw: ;\r
- ex (sp),hl ; save hl, return adr in hl\r
+ ex (sp),hl ;save hl, 'return adr' in hl\r
push de ;\r
push af ;\r
- ex de,hl ;\r
+ ex de,hl ;'return address' in de\r
ld hl,0 ;\r
add hl,sp ;\r
ld a,h ;\r
cp 0f8h ;\r
- jr nc,isw_1 ;\r
+ jr nc,isw_1 ;stack allready in top ram\r
ld sp,$stack ;\r
isw_1:\r
- push hl ;\r
+ push hl ;save user stack pointer\r
in0 h,(cbar) ;\r
push hl ;\r
ld a,SYS$CBAR ;\r
page 255\r
.z80\r
- \r
+\r
global mrx.fifo,mtx.fifo\r
\r
global msginit,msgi.st,msg.in,msgo.st,msg.out\r
global msg.sout\r
- \r
+\r
extrn buf.init\r
\r
include config.inc\r
;\r
; Init buffer\r
;\r
- \r
+\r
msginit:\r
ld ix,mrx.fifo\r
ld a,mrx.fifo.mask\r
ret z\r
or 0ffh\r
ret\r
- \r
+\r
;--------------------------------------------------------------\r
\r
msg.in:\r
inc h\r
bg.nc:\r
ld l,(hl)\r
- \r
+\r
ld a,(ix+o.out_idx) ;\r
inc a\r
and (ix+o.mask)\r
ld (ix+o.out_idx),a\r
- \r
+\r
ld a,l\r
pop hl\r
pop ix\r
\r
;--------------------------------------------------------------\r
\r
+ if 0\r
+\r
msg.out:\r
push ix\r
ld ix,mtx.fifo ;\r
jr z,bp.wait\r
ld (hl),b\r
ld (ix+o.in_idx),a\r
- \r
+\r
ld a,b\r
out (AVRINT5),a\r
pop bc\r
pop ix\r
ret\r
\r
+ endif\r
\r
;--------------------------------------------------------------\r
-;\r
-; (hl): data\r
\r
-msg.sout:\r
+\r
+\r
+msg.out:\r
push ix\r
ld ix,mtx.fifo ;\r
\r
+buf.put:\r
push bc\r
- push de\r
- ld b,(hl) ;\r
- inc hl\r
- ex de,hl\r
- \r
-ms.ol:\r
- push ix\r
- pop hl\r
ld c,(ix+o.in_idx) ;\r
- ld a,c\r
- add l\r
- ld l,a\r
- jr nc,ms.on\r
- inc h\r
-ms.on:\r
+ ld b,0\r
+ push ix ;14\r
+ add ix,bc ;10\r
+ ld (ix+0),a ;15\r
+ pop ix ;12 / 51\r
+ ld b,a ; 4\r
ld a,c ;\r
- inc a\r
- and (ix+o.mask)\r
-ms.wait:\r
+ inc a ;\r
+ and (ix+o.mask) ;\r
+bp.wait:\r
cp (ix+o.out_idx) ;\r
- jr z,ms.wait\r
- ld c,a\r
- ld a,(de)\r
- inc de\r
- ld (hl),a\r
- ld (ix+o.in_idx),c\r
- djnz ms.ol\r
+ jr z,bp.wait ;\r
+ ld (ix+o.in_idx),a ;\r
+\r
+ ld a,b\r
out (AVRINT5),a\r
- ex de,hl\r
- pop de\r
pop bc\r
pop ix\r
ret\r
\r
+\r
+;--------------------------------------------------------------\r
+\r
+ if 0\r
+ ; Works only, if buffer size < (128 - 3)\r
+ ; --> mask must be 03fh or less\r
+\r
+msg.out:\r
+ push ix\r
+ ld ix,mtx.fifo ;\r
+\r
+buf.put:\r
+ push bc\r
+ ld b,a ; 4\r
+ ld a,(ix+o.in_idx) ;14\r
+ ld ($ + 3 + 2),a ;15\r
+ ld (ix+0),b ;15\r
+ inc a ;\r
+ and (ix+o.mask) ;\r
+bp.wait:\r
+ cp (ix+o.out_idx) ;\r
+ jr z,bp.wait ;\r
+ ld (ix+o.in_idx),a ;\r
+\r
+ ld a,b\r
+ out (AVRINT5),a\r
+ pop bc\r
+ pop ix\r
+ ret\r
+\r
+ endif\r
+\r
+;--------------------------------------------------------------\r
+;\r
+; (hl): data\r
+\r
+msg.sout:\r
+ push ix ;14\r
+ ld ix,mtx.fifo ;12\r
+ push bc ;11\r
+ push de ;11\r
+ ld c,(hl) ; 6\r
+ ld b,0 ; 6\r
+ inc hl ; 7\r
+ms.ol: ; \\r
+ ld a,low mtx.fifo ; 6\r
+ add a,(ix+o.in_idx) ;14\r
+ ld e,a ; 4\r
+ ld a,high mtx.fifo ; 6\r
+ adc a,b ; 4\r
+ ld d,a ; 4\r
+\r
+ ld a,(ix+o.in_idx) ;14\r
+ inc a ; 4\r
+ and (ix+o.mask) ;14\r
+ms.wait:\r
+ cp (ix+o.out_idx) ;14\r
+ jr z,ms.wait ; 6/8\r
+\r
+ ldi ;12\r
+ ld (ix+o.in_idx),a ;15\r
+ jp pe,ms.ol ; 6/9 -- 126\r
+\r
+ out (AVRINT5),a ;10\r
+ pop de ; 9\r
+ pop bc ; 9\r
+ pop ix ;12\r
+ ret ; 9\r
+\r
+;--------------------------------------------------------------\r
+;\r
+; (hl): data\r
+\r
+ if 0\r
+\r
+msg.sout:\r
+ push ix ;14\r
+ ld ix,mtx.fifo ;12\r
+ push bc ;11\r
+ push de ;11\r
+ ld b,(hl) ; 6\r
+ inc hl ; 4\r
+ ex de,hl ; 3\r
+ms.ol: ; \\r
+ push ix ;14\r
+ pop hl ; 9\r
+ ld c,(ix+o.in_idx) ;14\r
+ ld a,c ; 4\r
+ add l ; 4\r
+ ld l,a ; 4\r
+ jr nc,ms.on ; 6/8\r
+ inc h ; 4\r
+ms.on:\r
+ ld a,c ; 4\r
+ inc a ; 4\r
+ and (ix+o.mask) ;14\r
+ms.wait:\r
+ cp (ix+o.out_idx) ;14\r
+ jr z,ms.wait ; 6/8\r
+ ld c,a ; 4\r
+ ld a,(de) ; 6\r
+ inc de ; 4\r
+ ld (hl),a ; 7\r
+ ld (ix+o.in_idx),c ;15\r
+ djnz ms.ol ; 7/9 -- 130\r
+\r
+ out (AVRINT5),a ;10\r
+ ex de,hl ; 3\r
+ pop de ; 9\r
+ pop bc ; 9\r
+ pop ix ;12\r
+ ret ; 9\r
+\r
+ endif\r
+\r
;--------------------------------------------------------------\r
\r
msg.co:\r
pop hl\r
pop af\r
ret\r
- \r
- \r
+\r
+\r
buf:\r
db buf_end - $ - 1 ;output string length\r
db 0AEh ; message start token\r
;----------------------------------------------------------------------\r
\r
end\r
-\r