]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - z180/msgbuf-s.180
new fifos msg in, msg out, console in, console out
[z180-stamp.git] / z180 / msgbuf-s.180
diff --git a/z180/msgbuf-s.180 b/z180/msgbuf-s.180
new file mode 100644 (file)
index 0000000..2c67527
--- /dev/null
@@ -0,0 +1,129 @@
+       page    255\r
+       .z80\r
+       \r
+       global  msg_fifo\r
+       global  msginit\r
+       global  msg.out,msg.sout,msg.co\r
+       \r
+       extrn   buf.init\r
+\r
+       include config.inc\r
+       include z180reg.inc\r
+\r
+;--------------------------------------------------------------\r
+\r
+       dseg\r
+\r
+       mkbuf   msg_fifo, 0\r
+\r
+\r
+;--------------------------------------------------------------\r
+\r
+       cseg\r
+\r
+;\r
+; Init buffer\r
+;\r
+       \r
+msginit:\r
+       ld      ix,msg_fifo\r
+       ld      a,msg_fb_len-1\r
+       jp      buf.init\r
+\r
+\r
+;--------------------------------------------------------------\r
+\r
+msg.sts:\r
+       push    ix\r
+       ld      ix,msg_fifo             ;\r
+\r
+       ld      a,(ix+o.in_idx)         ;\r
+       inc     a\r
+       and     (ix+o.mask)\r
+       sub     (ix+o.out_idx)          ;\r
+       pop     ix\r
+       ret     z\r
+       or      0ffh\r
+       ret\r
+\r
+;--------------------------------------------------------------\r
+\r
+msg.out:\r
+       push    ix\r
+       ld      ix,msg_fifo             ;\r
+\r
+       push    bc\r
+       ld      b,a                     ;save char\r
+       ld      a,(ix+o.in_idx)         ;\r
+       inc     a\r
+       and     (ix+o.mask)\r
+bp.wait:\r
+       cp      (ix+o.out_idx)          ;\r
+       jr      z,bp.wait\r
+       ld      c,a\r
+       ld      a,b\r
+       out     (PMSG),a\r
+       ld      (ix+o.in_idx),c\r
+       \r
+       pop     bc\r
+       pop     ix\r
+       ret\r
+\r
+;--------------------------------------------------------------\r
+;\r
+; (hl): data\r
+  \r
+msg.sout:\r
+       push    ix\r
+       ld      ix,msg_fifo             ;\r
+       push    bc\r
+\r
+       ld      b,(hl)                  ;count\r
+       inc     hl\r
+obs_1:\r
+       ld      a,(ix+o.out_idx)        ;\r
+       sub     (ix+o.in_idx)           ;\r
+       dec     a\r
+       and     (ix+o.mask)\r
+       cp      b\r
+       jr      c,obs_1\r
+\r
+       ld      c,(hl)                  ;port address\r
+       inc     hl\r
+       ld      a,b\r
+       otir\r
+       add     (ix+o.in_idx)\r
+       and     (ix+o.mask)\r
+       ld      (ix+o.in_idx),a\r
+       pop     bc\r
+       pop     ix\r
+       ret\r
+\r
+;----------------------------------------------------------------------\r
+\r
+msg.co:\r
+       push    af\r
+       push    hl\r
+       ld      (buf_char),a\r
+       ld      hl,buf\r
+       call    msg.sout\r
+       pop     hl\r
+       pop     af\r
+       ret\r
+       \r
+       \r
+buf:\r
+       db      buf_end - $ - 2         ;output string length\r
+       db      PMSG                    ;output port\r
+       db      081h                    ; message start token\r
+       db      buf_end - $ - 1         ; message length\r
+       db      1                       ; command\r
+       db      1                       ; subcommand\r
+buf_char:\r
+       db      0                       ; pay load\r
+buf_end:\r
+\r
+;----------------------------------------------------------------------\r
+\r
+       end\r
+\r