--- /dev/null
+ page 200\r
+\r
+\r
+ extrn buf.init\r
+ extrn isv_sw\r
+\r
+ \r
+ global ser.init\r
+ global ser.instat,ser.in\r
+ global ser.out\r
+\r
+;TODO: define a trampoline area somewhere in top ram. \r
+rtxisvjmp equ 0FF60h ;momentan frei...\r
+\r
+ include config.inc\r
+ include z180reg.inc\r
+\r
+\r
+;-----------------------------------------------------\r
+\r
+ dseg\r
+ \r
+buf_start:\r
+ mkbuf ser1.inbuf,s1.rx_len\r
+ mkbuf ser1.outbuf,s1.tx_len\r
+buf_end:\r
+\r
+\r
+\r
+;-----------------------------------------------------\r
+\r
+ cseg\r
+;\r
+; Init Serial I/O for console input and output (ASCI1)\r
+;\r
+ \r
+\r
+ser.init:\r
+; ld a,i\r
+; push af ;save IFF\r
+; di\r
+\r
+ xor a ;\r
+ out0 (stat1),a ;Disable rx/tx interrupts\r
+ \r
+ ld hl,rxtx_src ;move rx and tx isv to common ram\r
+ ld de,rxtx_dst ;\r
+ ld bc,rxtx_src_e-rxtx_src ; \r
+ ldir ;\r
+\r
+ ld hl,rtxisvjmp ;rx/tx int vector\r
+ ld (ivtab + IV$ASCI1),hl;\r
+ ld a,0cdh ;\r
+ ld (rtxisvjmp),a ;\r
+ ld hl,isv_sw ;\r
+ ld (rtxisvjmp + 1),hl ;\r
+ ld hl,rxtxisv ;\r
+ ld (rtxisvjmp + 3),hl ;\r
+\r
+; ASCI1: 8N1, highest baudrate (56700), CTS disabled\r
+\r
+ ld a,M_MPBT \r
+ out0 (cntlb1),a\r
+ ld a,M_RE + M_TE + M_MOD2\r
+ out0 (cntla1),a\r
+ ld a,M_RIE\r
+ out0 (stat1),a ;Enable rx interrupts\r
+\r
+ ld ix,ser1.inbuf\r
+ ld a,ser1.inbuf.mask\r
+ call buf.init\r
+ ld ix,ser1.outbuf\r
+ ld a,ser1.outbuf.mask\r
+ call buf.init\r
+\r
+; pop af\r
+; ret po\r
+; ei\r
+ ret ;\r
+\r
+ser.instat:\r
+ push ix\r
+ ld ix,ser1.inbuf ;\r
+\r
+buf.empty:\r
+ ld a,(ix+o.in_idx) ;\r
+ sub (ix+o.out_idx) ;\r
+ pop ix\r
+ ret z\r
+ or 0ffh\r
+ ret\r
+ \r
+ser.in:\r
+ push hl ;11 \r
+ push de ;11\r
+ ld hl,ser1.inbuf-1 ; 9 hl = &rx.out_idx \r
+ ld a,(hl) ; 6 a = rx.out_idx\r
+ dec hl ; 4 hl = &rx.in_idx\r
+ jr bg.w1\r
+bg.wait:\r
+ halt\r
+bg.w1:\r
+ cp (hl) ; 6 while (out_idx==in_idx) \r
+ jr z,bg.wait ; 6 (/8) ;\r
+\r
+ inc a ; 4\r
+ ld e,a ; 4 \r
+ inc e ; 4\r
+ ld d,0 ; 6\r
+\r
+ ex de,hl ; 3\r
+ add hl,de ;10\r
+ ld l,(hl) ; 6\r
+ ex de,hl ; 3 \r
+ \r
+ dec hl ; 4\r
+ and (hl) ; 6 \r
+ inc hl ; 4\r
+ inc hl ; 4\r
+ ld (hl),a ; 7\r
+ \r
+ ld a,e ; 4\r
+ pop de ; 9\r
+ pop hl ; 9\r
+ ret ; 9\r
+ ; 153 \r
+\r
+ser.outstat:\r
+ push ix\r
+ ld ix,ser1.outbuf ;\r
+buf.full:\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
+ser.out:\r
+ push ix\r
+ ld ix,ser1.outbuf ;\r
+buf.put:\r
+ push hl ;\r
+ push bc\r
+ push ix\r
+ pop hl\r
+ ld c,(ix+o.in_idx) ;\r
+ ld b,0\r
+ add hl,bc\r
+ ld b,a\r
+\r
+ ld a,c ;\r
+ inc a\r
+ and (ix+o.mask)\r
+bp.wait:\r
+ cp (ix+o.out_idx) ;\r
+ jr z,bp.wait\r
+ ld (hl),b\r
+ ld (ix+o.in_idx),a\r
+\r
+ di ;036f\r
+ in0 a,(stat1) ;0374\r
+ set TIE,a ;0377\r
+ out0 (stat1),a ;0379\r
+ ei ;037c\r
+\r
+ ld a,b\r
+ pop bc\r
+ pop hl\r
+ pop ix\r
+ ret\r
+\r
+\r
+;------------------------------------------\r
+; ASCI 1 Transmit/Receive interupt routines\r
+; moved to common ram\r
+\r
+rxtx_src:\r
+ dseg\r
+rxtx_dst: ; (0c097h) old\r
+\r
+rxtxisv:\r
+ inidat\r
+ in0 a,(stat1) ;receive flag set?\r
+ jp p,txisv ;\r
+\r
+ in0 d,(rdr1) ;todo: break detection\r
+ bit FE,a ;framing error?\r
+ jr nz,??ri_1\r
+ \r
+ push ix\r
+ ld ix,ser1.inbuf ;\r
+ ld hl,ser1.inbuf ;\r
+ ld c,(ix+o.in_idx) ;\r
+ ld b,0\r
+ add hl,bc\r
+\r
+ ld a,c ;\r
+ inc a\r
+ and (ix+o.mask)\r
+ cp (ix+o.out_idx) ;\r
+ jr z,??ri_0\r
+ ld (hl),d\r
+ ld (ix+o.in_idx),a\r
+??ri_0:\r
+ pop ix\r
+??ri_1:\r
+ in0 a,(cntla1) ;0705 c0c0\r
+ res EFR,a ;0708\r
+ out0 (cntla1),a ;070a\r
+ ret\r
+\r
+ inidate\r
+\r
+txisv:\r
+ inidat\r
+ push ix\r
+ ld ix,ser1.outbuf ;\r
+\r
+ ld a,(ix+o.out_idx) ;\r
+ cp (ix+o.in_idx) ;\r
+ jr z,??ti_2\r
+\r
+ ld hl,ser1.outbuf ;\r
+ add a,l\r
+ ld l,a\r
+ jr nc,??ti_1\r
+ inc h\r
+??ti_1:\r
+ ld l,(hl)\r
+ out0 (tdr1),l ;071b\r
+ \r
+ ld a,(ix+o.out_idx) ;\r
+ inc a\r
+ and (ix+o.mask)\r
+ ld (ix+o.out_idx),a\r
+ jr ??ti_3\r
+??ti_2:\r
+ in0 a,(stat1) ;0730 disable tx-int\r
+ res TIE,a ;0733\r
+ out0 (stat1),a ;0735\r
+??ti_3:\r
+ pop ix\r
+ ret\r
+\r
+ inidate\r
+\r
+ cseg\r
+rxtx_src_e:\r
+\r
+\r
+ end\r
+\r
+\r