.\ Test driver for Osborne Serial Port FVD21Oct84 1 9 THRU EXIT These screens define words to manipulate and inspect bits in the registers of the 6850 UART chip in the Osborne 1. Also supported is access to the RI pin on the PIA chip. This pin is wired to line CA2 on the chip, which is reflected in A-side STATUS (not data) register bit 6 (CRA6). Read A-side DATA register to reset bit CRA6. Note that the CD line into the 6850 also controls the receive section of the chip. Thus if the modem drops the CD line (sets NOT CD true), the chip stops listening. This means you cannot use your smart modem to tell the system RING or NO CARRIER, unless the 8HI switch is set on, which means the system cannot tell loss of carrier (unless it looks for NO CARRIER) .\ Test driver for Osborne Serial Port FVD21Oct84ONLY FORTH EMPTY ALSO VOCABULARY UART UART DEFINITIONS ALSO 2A00 CONSTANT UART-CTL \ ACIA Control & Status reg 2A01 CONSTANT UART-DATA \ ACIA Data register \ Assumes code (DP) above 4000H CODE (PUT-DATA) (S data -> ) \ Ignores Xmit status H POP L A MOV DI 0 OUT UART-DATA STA 1 OUT EI NEXT C; CODE GET-DATA (S -> data ) \ Ignores Xmit status DI 0 OUT UART-DATA LDA 1 OUT EI A L MOV 0 H MVI H PUSH NEXT C; CODE PUT-CONTROL (S ctl-data -> ) H POP L A MOV DI 0 OUT UART-CTL STA 1 OUT EI NEXT C; CODE GET-STATUS (S -> status ) DI 0 OUT UART-CTL LDA 1 OUT EI A L MOV 0 H MVI H PUSH NEXT C; .\ Test driver for Osborne Serial Port FVD21OCT84\ Video controller chip (as opposed to IEEE488/Centronics port) \ Only A-side Control/Status register is used for serial port 2C00 CONSTANT PIA-DATA \ PAI A-side Data register 2C01 CONSTANT PIA-CTL \ PAI (A) Control & Status reg \ Assumes code (DP) above 4000H CODE PUT-PIA-CONTROL H POP L A MOV DI 0 OUT PIA-CTL STA 1 OUT EI NEXT C; CODE GET-PIA-STATUS DI 0 OUT PIA-CTL LDA 1 OUT EI A L MOV 0 H MVI H PUSH NEXT C; CODE GET-PIA-DATA DI 0 OUT PIA-DATA LDA 1 OUT EI A L MOV 0 H MVI H PUSH NEXT C; .\ Test driver for Osborne Serial Port FVD21Oct84: RESET-UART 3 PUT-CONTROL ; \ Reset ACIA (RTS off) : SET-300 56 PUT-CONTROL ; \ With RTS (40) on : SET-1200 55 PUT-CONTROL ; \ RTS on : KEY?0 KEY? IF KEY ELSE 0 ENDIF ; : PUT-DATA \ Put when Xmit reg empty 0 BEGIN 1+ DUP 200 > ABORT" Xmit register still full" GET-STATUS 2 AND UNTIL DROP (PUT-DATA) ; .\ Test driver for Osborne Serial Port FVD19Oct84\ Serial Port Control register bits: \ *... .... Receive Interrupt Enable \ **. .... Xmit control (10=RTS high, 11=Break, 0.=RTS low) \ * **.. Word select (7/8 bits, parity, stops) \ ** Speed (00=1, 01=16, 10=64, 11=reset) : RTS-ON (S mask -> mask' ) 40 OR ; \ Set RTS=high bit on : RTS-OFF (S mask -> mask' ) 0B0 AND ; \ Set RTS=high bit off : BRK-ON (S mask -> mask' ) 0C0 OR ; \ Set BREAK mask on : BRK-OFF (S mask -> mask' ) 03F AND ; \ Set BREAK bits off : 8N1 00010100B ; \ 8 bits No parity, 1 Stop : 7E1 00001100B ; \ 7 bits Even parity, 1 Stop .\ Display Status/Data Bits FVD18Oct84: DISP-BITS (S 8bits -> ) BASE @ 2 BASE ! SWAP 0 \ Set binary <# # # # # 20 HOLD # # # # #> TYPE BASE ! ; : DISP-BITS? (S 8bits -> ) DISP-BITS KEY?0 DUP CONTROL S = IF KEY ENDIF CONTROL C = ABORT" ^C" ; : (MONITOR) (S word title -> ) CR TYPE BEGIN DUP EXECUTE \ Word to get bits to monitor DISP-BITS? 9 BACKSPACES AGAIN ; .\ Test driver for Osborne Serial Port FVD19Oct84: MONITOR-DATA ['] GET-DATA " Data: " (MONITOR) ; : MONITOR-STATUS ['] GET-STATUS " Status: " (MONITOR) ; : MONITOR-PIA-STATUS ['] GET-PIA-STATUS " PIA Status: " (MONITOR) ; .\ Test driver for Osborne Serial Port FVD19Oct84: MONITOR-ALL CR BEGIN ." Status: " GET-STATUS DISP-BITS? ." Data: " GET-DATA DISP-BITS? ." PIA Status: " GET-PIA-STATUS DISP-BITS? GET-PIA-DATA DROP \ Reset CRA6 CR AGAIN ; : MA CR BEGIN ." Status: " GET-STATUS DISP-BITS? ." Data: " GET-DATA DISP-BITS? ." PIA Status: " GET-PIA-STATUS DISP-BITS? GET-PIA-DATA DROP \ Reset CRA6 0D EMIT AGAIN ; .\ Test driver for Osborne Serial Port FVD21Oct84VARIABLE CTL-SAV : PUT-CTL-SAV DUP PUT-CONTROL CTL-SAV ! ; : PREP-UART RESET-UART 8N1 RTS-OFF PUT-CTL-SAV ; : BREAK CTL-SAV @ DUP BRK-ON PUT-CONTROL 100 MS PUT-CONTROL ; \ Display text conditionally : (?") (S flag -> ) R> COUNT ROT IF 2DUP TYPE ENDIF + >R ; : ?" COMPILE (?") HERE ," 0A0D , DUP C@ 2+ SWAP C! \ Force CR & LF after text ; IMMEDIATE .\ Test driver for Osborne Serial Port FVD20Oct84: XS \ EXPL-STATUS CR GET-STATUS DUP 01 AND ?" Recv Reg full" DUP 02 AND ?" Xmit Reg empty" DUP NOT 04 AND ?" Carrier Detect" DUP NOT 08 AND ?" Clear to Send (DTR)" F0 AND ?" Framing/Recv/Ovrrun" GET-PIA-STATUS 40 AND ?" Ring Indicator" ; .\ Test driver for Osborne Serial Port FVD21Oct84: T \ TERMINAL CR BEGIN GET-STATUS 01 AND IF GET-DATA 7F AND EMIT ENDIF KEY? IF KEY DUP DUP DUP CONTROL C = ABORT" ^C" EMIT PUT-DATA 0D = IF 0A EMIT ENDIF ENDIF AGAIN ; VARIABLE (ECHO) (ECHO) ON : ECHO (S char -> ) (ECHO) @ IF EMIT ELSE DROP ENDIF ; .\ Test driver for Osborne Serial Port FVD21Oct84: SET-RTS-ON CTL-SAV @ RTS-ON PUT-CTL-SAV ; : SET-RTS-OFF CTL-SAV @ RTS-OFF PUT-CTL-SAV ; \ Output text strings to modem : MDMTYPE (S addr, len -> ) 0 ?DO COUNT DUP ECHO PUT-DATA LOOP DROP ; : (.MDM") (S -> ) R> COUNT 2DUP MDMTYPE + >R ; : .MDM" COMPILE (.MDM") ," ; IMMEDIATE : .MCR" COMPILE (.MDM") HERE ," 0A0D , DUP C@ 2+ SWAP C! \ Force CR & LF after text ; IMMEDIATE : MCR .MCR" " ; \ Put null string (CRLF only) .\ Test driver for Osborne Serial Port FVD21OCT84: DIAL \ Dial number entered on line .MDM" ATDP" BL WORD COUNT MDMTYPE MCR ; : ANSWER .MCR" ATA" ; : NO-ANSWER .MCR" ATS0=0" ; : ECHO-ON .MCR" ATE1" ; : ECHO-OFF .MCR" ATE0" ; : HALF-DUP .MCR" ATF0" ; : FULL-DUP .MCR" ATF1" ; : SPEAKER-ON .MCR" ATM1" ; : SPEAKER-OFF .MCR" ATM0" ; : QUIET-ON .MCR" ATQ1" ; : QUIET-OFF .MCR" ATQ0" ; : EXTEND-ON .MCR" ATX1" ; : EXTEND-OFF .MCR" ATX0" ; : VERBOSE .MCR" ATV1" ; : TERSE .MCR" ATV0" ; : RESET .MCR" ATZ" ; : ESCAPE 200 MS .MDM" +++" 200 MS ; .\ Xmodem protocol FVD21Oct84VARIABLE SBUFF VARIABLE EBUFF \ Buffer pointer (start & end) VARIABLE NBUFF \ Buffer pointer (next) VARIABLE SEC# SEC# OFF \ No of next sector VARIABLE CRCCK CRCCK OFF \ CRC/Check sum accum : GET-CHR (S -> char | 0 ) GET-STATUS 1 AND IF GET-DATA ELSE 0 ENDIF ; : WAIT-CHR (S -> char ) 0 BEGIN 1+ DUP 200 > ABORT" Modem Input Timeout" GET-STATUS 1 AND UNTIL GET-DATA ; : GET-BLK-DATA \ Read 128 bytes into buffer NBUFF @ DUP 80 + DUP NBUFF ! DO WAIT-CHR DUP I C! CRCCK +! LOOP ; : PUT-BLK-DATA \ Send 128 bytes from buffer NBUFF @ DUP 80 + DUP NBUFF ! DO I C@ DUP PUT-DATA CRCCK +! LOOP ; .\ Test driver for Osborne Serial Port FVD21Oct84: GET-HDR# (S -> flag ) TRUE SEC# @ \ Flag & expected sector no WAIT-CHR DUP ROT XOR \ Is this wanted sector no SWAP NOT WAIT-CHAR XOR \ Same as complement OR OR ; : GET-HDR (S -> flag | EOT ) WAIT-CHR DUP 4 <> IF \ Is this EOT as in end of file 1 = GET-HDR# OR ; \ Validate header : PUT-HDR (S -> flag ) 1 PUT-DATA \ Put SOH marker SEC# @ DUP PUT-DATA \ Put 1 byte sector no NOT PUT-DATA ; \ & its complement .\ Test driver for Osborne Serial Port FVD21Oct84