10 REM > IO
   20 :
   30 REM Access absolute memory, checking for I/O devices
   40 REM ------------------------------------------------
   50 DEFPROCio_reset:ENDPROC
   60 :
   70 DEFFNio_rd(A%):IF ports%=0:=mem%?A%
   80 LOCAL C%:C%=FNio_type:IF C%<0:=mem%?A%
   90 IF(A%AND&FFFC)<>port%(C%,0):=mem%?A%
  100 A%=A%AND15:=EVAL("FNio_rd"+STR$port%(C%,1))
  110 :
  120 DEFPROCio_wr(A%,B%):IF ports%=0:mem%?A%=B%:ENDPROC
  130 LOCAL C%:C%=FNio_type:IF C%<0:mem%?A%=B%:ENDPROC
  140 IF(A%AND&FFFC)<>port%(C%,0):mem%?A%=B%:ENDPROC
  150 A%=A%AND15:A%=EVAL("FNio_wr"+STR$port%(C%,1)):ENDPROC
  160 :
  170 DEFFNio_type:C%=A%AND&FFFC
  180 IF port%(0,0):IF C%=port%(0,0):=0
  190 IF port%(1,0):IF C%=port%(1,0):=1
  200 REM IF C%=port%(2,0):=2
  210 REM IF C%=port%(3,0):=2
  220 =-1
  230 :
  240 REM 6850
  250 REM base+0 | b7: Enable receive ints    | b7: Interupt Request         |
  260 REM        | b6: RTS low/high           | b6: Receive Parity Error     |
  270 REM        | b5: Enable transmit ints   | b5: Receive Data Overrun     |
  280 REM        | b4: 7bit/8bit data         | b4: Framing Error            |
  290 REM        | b3: 2/1 stop bits          | b3: Clear To Send not present|
  300 REM        | b2: even/odd parity        | b2: DCD not present          |
  310 REM        | b1-0: Clock divide 1/16/64 | b1: Transmit Register Empty  |
  320 REM        |       or reset             | b0: Receive Register Full    |
  330 REM base+1 |         Write Data         |         Read Data            |
  340 DEFFNio_rd0
  350 IFA%=1:=GET                                          :REM 6850 RxData
  360 IFA%=0:IF INKEY-256=ASC"W":=2+((ADVAL(-1)<>&FF)AND1) :REM 6850 RxRDY
  370 IFA%=0:=2+((ADVAL(-1)<>&00)AND1)
  380 =&7F
  390 DEFFNio_wr0
  400 IFA%=1:VDU B%:=0:REM 6580 TxData
  410 IFA%=0:=0       :REM 6580 TxCtrl
  420 =0
  430 :
  440 REM 6551
  450 REM base+0 |  Data  | Data
  460 REM base+1 | Reset  | b7: Interupt Request
  470 REM        |        | b6: DSR level
  480 REM        |        | b5: DCD level
  490 REM        |        | b4: Transmit Reg Empty
  500 REM        |        | b3: Receive Register Full
  510 REM        |        | b2: Receive data overrun
  520 REM        |        | b1: Framing Error
  530 REM        |        | b0: Receive Parity error
  540 REM base+2 | b7-5: parity
  550 REM        | b4:   echo
  560 REM        | b3-2: TxControl
  570 REM        | b1:   TxIRQ disable
  580 REM        | b0:   RxIRQ enable
  590 REM base+3 | b7:   stop bits
  600 REM        | b6-5: word length
  610 REM        | b4:   clock
  620 REM        | b3-b0: baud rate
  630 DEFFNio_rd1
  640 IFA%=0:=GET                                      :REM 6551 RxData
  650 IFA%=1:IF INKEY-256=ASC"W":=(ADVAL(-1)<>&FF)AND8 :REM 6551 RxRDY
  660 IFA%=1:=(ADVAL(-1)<>&00)AND8
  670 =&7F
  680 DEFFNio_wr1
  690 IFA%=0:VDU B%:=0:REM 6551 TxData
  700 IFA%=1:=0       :REM 6551 TxRDY
  710 =0