page 255\r
.z80\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
- extrn buf.init\r
+ public mrx.fifo,mtx.fifo\r
+\r
+ public msginit,msgi.st,msg.in,msgo.st\r
+ public msg.sm,msg.sout\r
+\r
+ extrn bufinit,hwl2phy\r
+ extrn fifolst\r
\r
include config.inc\r
+ if CPU_Z180\r
include z180reg.inc\r
+ endif\r
\r
;--------------------------------------------------------------\r
\r
dseg\r
\r
- mkbuf mrx.fifo,mrx.fifo_len\r
- mkbuf mtx.fifo,mtx.fifo_len\r
+ mkbuf mtx.fifo_id, mtx.fifo, mtx.fifo_len\r
+ mkbuf mrx.fifo_id, mrx.fifo, mrx.fifo_len\r
\r
;--------------------------------------------------------------\r
\r
;\r
; Init buffer\r
;\r
- \r
+\r
msginit:\r
- ld ix,mrx.fifo\r
- ld a,mrx.fifo.mask\r
- call buf.init\r
+ ld a,(043h)\r
+;TODO: value should be 0\r
ld ix,mtx.fifo\r
- ld a,mtx.fifo.mask\r
- jp buf.init\r
+ call bufinit\r
+ push ix\r
+ pop hl\r
+ call hwl2phy\r
+ ld (040h),hl\r
+ ld (040h+2),a\r
+ ld a,0ffh\r
+ ld (043h),a\r
+ out (AVRINT5),a\r
+wait:\r
+ ld a,(043h)\r
+ or a\r
+ jr nz,wait\r
+\r
+ ld ix,mrx.fifo\r
+ jp bufinit\r
\r
;--------------------------------------------------------------\r
\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
- out0 (AVRINT5),a\r
+ out (AVRINT5),a\r
pop bc\r
pop hl\r
pop ix\r
ret\r
\r
+ endif\r
\r
;--------------------------------------------------------------\r
-;\r
-; (hl): data\r
\r
-msg.sout:\r
+ if 0\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
- out0 (AVRINT5),a\r
- ex de,hl\r
- pop de\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
+; Put char in message buffer:\r
+; ix: buffer to put into\r
+; c: char\r
+\r
+buf.put:\r
+ push ix ;15\r
+ push bc ;11\r
+ ld a,(ix+o.in_idx) ;19\r
+ ld c,a ;4\r
+ ld b,0 ;7\r
+ add ix,bc ;11\r
+ pop bc ;10\r
+ ld (ix),c ;7\r
+ pop ix ;14\r
+\r
+ inc a ;4\r
+ and (ix+o.mask) ;19 =121\r
+bufp.wait:\r
+ cp (ix+o.out_idx) ;19\r
+ jr z,bufp.wait ;12/7\r
+ ld (ix+o.in_idx),a ;19\r
+\r
+ out (AVRINT5),a ;11\r
+ ld a,c ;4\r
+ ret ;10 =191\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 081h ; message start token\r
+ db 0AEh ; message start token\r
db buf_end - $ - 1 ; message length\r
db 1 ; command\r
db 1 ; subcommand\r
\r
;----------------------------------------------------------------------\r
\r
- end\r
+;----------------------------------------------------------------------\r
+; Send message MEMORY\r
+;\r
+; hl: pointer to message (netto)\r
+; b: msg length\r
\r
+msg.sm:\r
+ push ix\r
+ ld ix,mtx.fifo\r
+ ld c,0AEh\r
+ call buf.put\r
+ ld c,b\r
+ call buf.put\r
+msm_l:\r
+ ld c,(hl)\r
+ inc hl\r
+ call buf.put\r
+ djnz msm_l\r
+ pop ix\r
+ ret\r
+\r
+\r
+ end\r