.PAGE .SBTTL A.8250 ASYNCHRONOUS INTERFACE SOFTWARE ; ; THIS SOFTWARE PACKAGE SUPPORTS THE INS8250 ; ASYNCHRONOUS COMMUNICATIONS ELEMENT. ; ENTRY POINTS ARE DEFINED HERE FOR EXTERNAL ; ACCESS (VIA JSR ____): ; ; A.MOSV --> SAVE 'X' AS 'MODEM' INTERRUPT ; SERVICE ROUTINE ADDRESS ; A.XMSV --> SAVE 'X' AS 'XMTR' INTERRUPT ; SERVICE ROUTINE ADDRESS ; A.RCSV --> SAVE 'X' AS 'RCVR' INTERRUPT ; SERVICE ROUTINE ADDRESS ; A.LNSV --> SAVE 'X' AS 'LINE' INTERRUPT ; SERVICE ROUTINE ADDRESS ; ; A.MOUP --> ENABLE 'MODEM' INTERRUPT ; A.XMUP --> ENABLE 'XMTR' INTERRUPT ; A.RCUP --> ENABLE 'RCVR' INTERRUPT ; A.LNUP --> ENABLE 'LINE' INTERRUPT ; ; A.MODN --> DISABLE 'MODEM' INTERRUPT ; A.XMDN --> DISABLE 'XMTR' INTERRUPT ; A.RCDN --> DISABLE 'RCVR' INTERRUPT ; A.LNDN --> DISABLE 'LINE' INTERRUPT ; ; ; STATUS REGISTER ACCESS TO/FROM ; ; A.MSRR --> READ MODEM STATUS REGISTER ; A.MSRW --> WRITE MODEM STATUS REGISTER ; ; A.MCRR --> READ MODEM CONTROL REGISTER ; A.MCRW --> WRITE MODEM CONTROL REGISTER ; ; A.LSRR --> READ LINE STATUS REGISTER ; A.LSRW --> WRITE LINE STATUS REGISTER ; ; A.LCRR --> READ LINE CONTROL REGISTER ; A.LCRW --> WRITE LINE CONTROL REGISTER ; ; A.DLLR --> READ DLL ; A.DLLW --> WRITE DLL ; ; A.DLMR --> READ DLM ; A.DLMW --> WRITE DLM ; ; .PAGE ; ; THE FOLLOWING ENTRY POINT IS VIA INTERRUPT ; AND PROVIDES 8250 ACE SERVICES FOR 'MODEM', 'XMTR', ; 'RCVR', AND 'LINE' INTERRUPTS. ; ; A.82$I --> MPU INTERRUPT ENTRY POINT ; FOR 8250 ACE ; ; ; NOTES ON INTERRUPT SERVICE ROUTINES ; ; MODEM --> READS MODEM STATUS REGISTER (MSR) INTO AND ; IF 'A.MO$V' IS NOT ZERO - ; THEN - CALLS ROUTINE VIA JSR 0,X(=A.MO$V) ; ELSE - NOTHING ; ; XMTR --> IF 'A.XM$V' IS NOT ZERO - ; THEN - CALLS ROUTINE VIA JSR 0,X(=A.XM$V) ; ON RETURN ; IF C=1 --> TRANSMITS CHARACTER IN ; IF C=0 --> DISABLES 'XMTR' INTERRUPT ; ELSE - DISABLES 'XMTR' INTERRUPT ; ; RCVR --> MOVE INPUT CHARACTER INTO ; IF 'A.RC$V' IS NOT ZERO - ; THEN - CALLS ROUTINE VIA JSR 0,X(=A.RC$V) ; ELSE - IGNORES INPUT CHARACTER ; ; LINE --> READS LINE STATUS REGISTER (LSR) INTO AND ; IF 'A.LN$V' IS NOT ZERO - ; THEN - CALLS ROUTINE VIA JSR 0,X(=A.LN$V) ; ELSE - NOTHING ; .PAGE .SBTTL A.8250 ASYNCHRONOUS HARDWARE ; ; THE ASYNCHRONOUS COMMUNICATION ELEMENT USED BY THE ;PORT IS THE NATIONAL SEMICONDUCTOR TYPE INS8250. ; THE FOLLOWING IS A SUMMARY OF THE REGISTERS AND ;SOME DEFINITIONS. ; ; DLAB (DATA LATCH ACCES BIT) = 0 ; ; REGISTER 0 RBR =0 ;RECEIVER BUFFER REGISTER (READ ONLY) THR =0 ;TRANSMITTER HOLDING REGISTER (WRITE ONLY) ; ; REGISTER 1 IER =1 ;INTERRUPT ENABLE REGISTER (READ/WRITE) ; ; REGISTER 2 IIR =2 ;INTERRUPT IDENTIFICATION REGISTER ; ; REGISTER 3 LCR =3 ;LINE CONTROL REGISTER (READ/WRITE) ; ; REGISTER 4 MCR =4 ;MODEM CONTROL REGISTER (READ/WRITE) ; ; REGISTER 5 LSR =5 ;LINE CONTROL STATUS REGISTER (READ/WRITE) ; ; REGISTER 6 MSR =6 ;MODEM STATUS REGISTER ; ; ; DLAB (DATA LATCH ACCESS BIT) = 1 ; ; REGISTER 0 DLL =0 ;DIVISOR LATCH LOW BYTE (READ/WRITE) ; ; REGISTER 1 DLM =1 ;DIVISOR LATCH HIGH BYTE (READ/WRITE) ; .PAGE .SBTTL A.8250 DETAILS ; ; RECEIVER BUFFER REGISTER (RBR) - 8 BIT READ ONLY REGISTER ; CONTAINING DATA RECEIVED ; ; TRANSMITTER HOLDING REGISTER (THR) - 8 BIT WRITE ONLY REGISTER ; CONTAINING CHARACTER TO BE TRANSMITTED ; ; INTERRUPT ENABLE REGISTER (IER) ; BIT 0 ENABLE RECEIVED DATA AVAILABLE INTERRUPT ; 1 ENABLE TRANSMITTER HOLDING REGISTER EMPTY INTERRUPT ; 2 ENABLE RECEIVER LINE STATUS INTERRUPT ; 3 ENABLE MODEM STATUS INTERRUPT ; 4-7 0'S ; ; INTERRUPT IDENTIFICATION REGISTER (IIR) ; BIT 0 '0' IF INTERRUPT PENDING ; BIT 1 2 ; _ _ ; 0 0 MODEM STATUS INTERRUPT (LOWEST PRIORITY) ; 1 0 TRANSMITTER HOLDING REGISTER EMPTY ; 0 1 RECEIVER DATA AVAILABLE ; 1 1 RECEIVER LINE STATUS (HIGHEST PRIORITY) ; ; LINE CONTROL REGISTER (LCR) ; BIT 0 1 WORD LENGTH SELECT BITS ; _ _ ; 0 0 5 BITS ; 1 0 6 BITS ; 0 1 7 BITS ; 1 0 8 BITS ; ; BIT 2 STOP BIT SELECT ; _ ; 0 1 STOP BIT ; 1 1.5 STOP BITS (5 BITS) / 2 STOP BITS ; ; BIT 3 4 5 PARITY SELECT ; _ _ _ ; 0 X X NO PARITY / NO STICK ; 1 0 0 ODD PARITY ; 1 1 0 EVEN PARITY ; 1 0 1 PARITY = STICK 1 ; 1 1 1 PARITY = STICK 0 ; ; BIT 6 BREAK CONTROL BIT ; _ ; 0 NORMAL OPERATION ; 1 SERIAL OUTPUT FORCED TO SPACING ; ; BIT 7 DIVISOR LATCH ACCESS BIT ; _ ; 0 ACCESS RECEIVER BUFFER / TRANSMITTER HOLDING REGISTERS ; 1 ACCESS DIVISOR LATCH REGISTERS ; .PAGE ; ; MODEM CONTROL REGISTER (MCR) ; BIT 0 DATA TERMINAL READY CONTROL (DSR OUTPUT) ; BIT 1 REQUEST TO SEND CONTROL (CTS OUTPUT) ; BIT 2 OUT 1 CONTROL ; BIT 3 OUT 2 CONTROL ; BIT 4 LOOP CONTROL ; ENABLES LOOP BACK MODE AND CONNECTS THE FOLLOWING - ; DTR >> DSR ; RTS >> CTS ; OUT1 >> RI ; OUT2 >> RLSD ; SO >> SI ; BIT 5-7 0'S ; ; LINE STATUS REGISTER (LSR) ; BIT 0 DATA READY ; BIT 1 OVERRUN ERROR ; BIT 2 PARITY ERROR ; BIT 3 FRAMING ERROR ; BIT 4 BREAK INTERRUPT ; BIT 5 TRANSMITTER HOLDING REGISTER EMPTY ; BIT 6 TRANSMITTER SHIFT REGISTER EMPTY ; BIT 7 0 ; ; MODEM STATUS REGISTER (MSR) ; BIT 0 DELTA CLEAR TO SEND ; BIT 1 DELTA DATA SET READY ; BIT 2 TRAILING EDGE RING INDICATOR ; BIT 3 DELTA LINE SIGNAL DETECT ; BIT 4 CLEAR TO SEND (RTS INPUT) ; BIT 5 DATA SET READY (DTR INPUT) ; BIT 6 RING INDICATOR ; BIT 7 RECEIVED LINE SIGNAL DETECT (SIN INPUT) ; ; DIVISOR LATCH (DLL/DLM) ; 16-BIT DIVISOR FOR BAUD RATE SELECTION ; BAUD COUNT TIME @ 1.8432 MHZ ; ____ _____ ____ ; 110 1047 9091 ; 150 768 6667 ; 300 384 3333 ; 600 192 1667 ; 1200 96 833 ; 1800 64 556 ; 2400 48 417 ; 4800 24 208 ; 9600 12 104 ; .PAGE .SBTTL A.8250 TYPICAL RS-232C WIRING CONNECTIONS ; ; ; 1 GROUND ; 2 RX (INPUT) ; 3 TX (OUTPUT) ; 4 RTS (INPUT) ; 5 CTS (OUTPUT) ; 6 DSR (OUTPUT) ; 7 GROUND ; 8 OUT1 (OUTPUT) ; 9 +12 VOLTS SOURCE ; 10 -12 VOLTS SOURCE ; 11 ; 12 ; 13 ; 14 ; 15 ; 16 ; 17 ; 18 RLSD (INPUT) ; 19 RI (INPUT) ; 20 DTR (INPUT) ; 21 ; 22 OUT2 (OUTPUT) ; 23 ; 24 ; 25 ; ; JUMPER RSLD(18) TO RX(2) FOR AUTO BAUD-RATE ; .PAGE .SBTTL A.8250 VARIABLES AND POINTERS ; ; PORT STATUS AND BUFFERS ; .IF NDF,$A.8250 A.8250 = 220 ;SERIAL PORT DEFAULT ADDRESS VARSAV = 0 ;DEFAULT VARIABLES ADDRESS PGMSAV = 100000 ;DEFAULT PROGRAM ADDRESS .=PGMSAV .ENDC ; PGMSAV=. .=VARSAV ; A.MO$V: .BYTE 0,0 ;MODEM DISPATCH VECTOR A.XM$V: .BYTE 0,0 ;XMTR DISPATCH VECTOR A.RC$V: .BYTE 0,0 ;RCVR DISPATCH VECTOR A.LN$V: .BYTE 0,0 ;LINE DISPATCH VECTOR ; A.LNST: .BYTE 0 ;LINE STATUS FLAG ; = 0 NO PROCESS PENDING ; =-1 REQUIRES BAUD RATE PROCESSING A.ERCT: .BYTE 0 ;LINE ERROR COUNTER A.LNBL: .BYTE 0 ;'LINE' SERVICE ENABLES A.MNBL: .BYTE 0 ;'MODEM' SERVICE ENABLES ; A.PBCT: .BYTE 0,0 ;PREVIOUS BAUD COUNT A.CBCT: .BYTE 0,0 ;CURRENT BAUD COUNT A.BDIF: .BYTE 0,0 ;COMPUTED DIFFERENCE A.LWCT: .BYTE 0,0 ;LOWEST DIFFERENCE FOUND A.BDVS: .BYTE 0,0 ;BAUD RATE DIVISOR ; VARSAV=. .=PGMSAV ; .PAGE .SBTTL A.8250 INTERRUPT CONTROL ROUTINES ; A.MOSV: STX A.MO$V ;SAVE 'MODEM' VECTOR ADDRESS RTS ; A.MOUP: LDA A IER+A.8250 ;ENABLE MODEM INTERRUPT ORA A #,10 STA A IER+A.8250 RTS ; A.MODN: LDA A IER+A.8250 ;DISABLE INTERRUPT AND A #,7 STA A IER+A.8250 RTS ; A.XMSV: STX A.XM$V ;SAVE 'XMTR' VECTOR ADDRESS RTS ; A.XMUP: LDA A IER+A.8250 ;ENABLE XMTR INTERRUPT ORA A #,2 STA A IER+A.8250 RTS ; A.XMDN: LDA A IER+A.8250 ;DISABLE INTERRUPT AND A #,15 STA A IER+A.8250 RTS ; .PAGE ; A.RCSV: STX A.RC$V ;SAVE 'RCVR' VECTOR ADDRESS RTS ; A.RCUP: LDA A IER+A.8250 ;ENABLE RCVR INTERRUPT ORA A #,1 STA A IER+A.8250 RTS ; A.RCDN: LDA A IER+A.8250 ;DISABLE INTERRUPT AND A #,16 STA A IER+A.8250 RTS ; A.LNSV: STX A.LN$V ;SAVE 'LINE' INTERRUPT SERVICE RTS ; A.LNUP: LDA A IER+A.8250 ;AND ENABLE LINE INTERRUPT ORA A #,4 STA A IER+A.8250 RTS ; A.LNDN: LDA A IER+A.8250 ;DISABLE INTERRUPT AND A #,13 STA A IER+A.8250 RTS ; .PAGE .SBTTL A.8250 STATUS REGISTER ACCESS ; ; ACCESS TO THE 8250 STATUS REGISTERS ; ; MCR IS THE OUTPUT REGISTER ; DATA FROM ; ; MSR IS THE INPUT REGISTER ; DATA PLACED IN ; ; A.MSRR: LDA B MSR+A.8250 ;GET MODEM STATUS RTS ; A.MSRW: STA B MSR+A.8250 ;WRITE TO STATUS RTS ; A.MCRR: LDA B MCR+A.8250 ;READ CONTROL RTS ; A.MCRW: STA B MCR+A.8250 ;STORE CONTROL RTS ; A.LSRR: LDA B LSR+A.8250 ;READ STATUS RTS ; A.LSRW: STA B LSR+A.8250 ;WRITE TO STATUS RTS ; A.LCRR: LDA B LCR+A.8250 ;READ CONTROL RTS ; A.LCRW: STA B LCR+A.8250 ;WRITE CONTROL RTS ; A.DLLR: LDA A LCR+A.8250 ;SET CONTROL TO ACCESS DLL PSH A ;SAVE ORA A #,200 STA A LCR+A.8250 LDA B DLL+A.8250 ;READ DLL PUL A ;RESTORE LCR STA A LCR+A.8250 RTS ; A.DLLW: LDA A LCR+A.8250 ;SET CONTROL TO ACCESS DLL PSH A ;SAVE ORA A #,200 STA A LCR+A.8250 STA B DLL+A.8250 ;WRITE DLL PUL A ;RESTORE LCR STA A LCR+A.8250 RTS ; A.DLMR: LDA A LCR+A.8250 ;SET CONTROL TO ACCESS DLM PSH A ;SAVE ORA A #,200 STA A LCR+A.8250 LDA B DLM+A.8250 ;READ DLM PUL A ;RESTORE LCR STA A LCR+A.8250 RTS ; A.DLMW: LDA A LCR+A.8250 ;SET CONTROL TO ACCESS DLM PSH A ;SAVE ORA A #,200 STA A LCR+A.8250 STA B DLM+A.8250 ;WRITE DLM PUL A ;RESTORE LCR STA A LCR+A.8250 RTS ; .PAGE .SBTTL A.8250 INTERRUPT HANDLER ; A.82$I: LDA A IIR+A.8250 ;GET INTERRUPT ID BIT A #,1 ;INTERRUPT PENDING ? BNE 1$ ;IF NOT - LEAVE TAB ;COMPUTE JUMP TABLE ENTRY ADDRESS ASR B ABA CLR B ADD A #,2$&377 ADC B #,2$&177400/400 PSH A PSH B RTS ;GO TO JUMP TABLE 1$: RTI ;RETURN FROM INTERRUPT ; 2$: JMP A.MODE ;MODEM STATUS INTERRUPT JMP A.XMTR ;TRANSMITTER INTERRUPT JMP A.RCVR ;RECEIVER INTERRUPT JMP A.LINE ;LINE STATUS INTERRUPT ; .PAGE .SBTTL A.8250 XMTR & RCVR INTERRUPT DISPATCHERS ; A.XMTR: LDA B LSR+A.8250 ;NEED A CHARACTER ? BIT B #,40 BEQ 2$ ;BRANCH IF NOT LDX A.XM$V ;XMTR VECTOR BEQ 1$ ;BETTER HAVE AN ADDRESS ! JSR 0,X ;GO TO ROUTINE BCC 1$ ;IF NO CHARACTERS (C=0) THEN TERMINATE STA B THR+A.8250 ;ELSE SEND NEW CHARACTER JMP A.82$I ;GO CHECK FOR OTHER INTERRUPTS 1$: JSR A.XMDN ;KILL TRANSMITTER 2$: JMP A.82$I ;AND CHECK FOR OTHER INTERRUPTS ; A.RCVR: LDA B LSR+A.8250 ;HAVE A CHARACTER ? BIT B #,1 BEQ 1$ ;BRANCH IF NOT LDA B RBR+A.8250 ;PLACE CHARACTER IN LDX A.RC$V ;RCVR VECTOR BEQ 1$ ;BETTER HAVE AN ADDRESS ! JSR 0,X ;GO TO ROUTINE 1$: JMP A.82$I ;GO CHECK FOR OTHER INTERRUPTS ; .PAGE .SBTTL A.8250 LINE AND MODEM INTERRUPT DISPATCHERS ; A.LINE: LDA B LSR+A.8250 ;GET STATUS, CLEAR FLAGS BIT B #,36 ;SOMETHING TO CHECK ? BEQ 1$ ;BRANCH IF NOT LDX A.LN$V ;EXTERNAL VECTOR ? BEQ 1$ ;BR IF NOT JSR 0,X ;GO TO ROUTINE 1$: JMP A.82$I ;CHECK FOR OTHER INTERRUPTS ; A.MODE: LDA B MSR+A.8250 ;GET MODEM STATUS, CLEAR FLAGS BIT B #,17 ;SOMETHING TO CHECK ? BEQ 1$ ;BRANCH IF NOT LDX A.MO$V ;EXTERNAL VECTOR ? BEQ 1$ ;BR IF NOT JSR 0,X ;GO TO ROUTINE 1$: JMP A.82$I ;CHECK FOR OTHER INTERRUPTS ; .PAGE .SBTTL A.8250 STANDARD LINE / MODEM SETTUP ; ; USING ROUTINES A.82$L AND A.82$M ; THE ASYNCHRONOUS INTERFACE IS PROGRAMMED ; INITIALLY FOR - ; 1 START BIT ; 7 DATA BITS ; 1 ODD PARITY BIT ; 2 STOP BITS ; ; ON A 'BREAK' INTERRUPT THE I/O ; IS RESET TO THE ABOVE PARAMETERS ; AND THE BAUD RATE IS DETERMINED DURING THE ; NEXT CHARACTER ; ; ON A 'PARITY' INTERRUPT THE I/O ; IS SEQUENCED TO THE NEXT POSSIBLE PARITY ; CONFIGURATION - THESE ARE: ; ODD PARITY ; EVEN PARITY ; STICK '1' PARITY ; STICK '0' PARITY ; ; ON A 'FRAMING' INTERRUPT THE I/O ; IS SEQUENCED TO THE NEXT STOP BIT ; CONFIGURATION - 1 OR 2 STOPS ; ; IF MORE THAN 20. ERRORS OCCUR THEN A ; 'BREAK' INTERRUPT SEQUENCE IS PERFORMED ; TO INITIALIZE THE HARDWARE ; ; ; ; WITH AN EXTERNAL DEVICE ATTACHED TO THE PORT - ; SELECT ONE OF THE FOLLOWING BAUD RATES - ; ; 110, 150, 300, 600, 1200, 1800, 2400, 4800, OR 9600 ; ; THE WORD LENGTH MUST BE 7 DATA BITS, ; ANY PARITY MODE - ODD, EVEN, STICK '1' OR '0', ; AND 1 OR 2 STOP BITS. ; ; THE PORT MATCHES YOUR DEVICE'S ; BAUD RATE, PARITY, AND STOPS WHEN THE ; DEVICE TRANSMITS A 'BREAK' FOLLOWED ; BY SEVERAL 'SPACE' CHARACTERS ; ; THE PORT IS NOW CONFIGURED FOR YOUR DEVICE. ; .PAGE .SBTTL A.8250 BAUD RATE TABLE ; A.BTBL: FDB 8.,12. ;9600 BAUD FDB 15.,24. ;4800 BAUD FDB 25.,48. ;2400 BAUD FDB 35.,64. ;1800 BAUD FDB 66.,96. ;1200 BAUD FDB 132.,192. ; 600 BAUD FDB 232.,384. ; 300 BAUD FDB 402.,768. ; 150 BAUD FDB 32767.,1047. ; 110 BAUD ; .PAGE .SBTTL A.8250 LINE STATUS HANDLER ; ; THIS IS THE STANDARD LINE STATUS ROUTINE ; AND MAY BE INVOKED BY SETTING A.LN$V=A.82$L. ; EACH LINE INTERRUPT FLAG IS COMPARED TO THOSE ; ENABLED CHECKS DEFINED IN A.LNBL (BIT FOR BIT). ; ENTER WITH LSR IN , B IS DESTROYED ; ; A.82$L: AND B A.LNBL ;MASK WITH ENABLES BIT B #,20 ;A 'BREAK' ? BEQ A.PRTY ;IF NOT - CHECK PARITY A.LBRK: LDA B #,16 ;RESET HARDWARE STA B LCR+A.8250 LDA B #,-1 ;SET UP A.LNST STA B A.LNST ;TO CHECK BAUD RATE LDA B #,21. ;ERROR COUNT PRESET STA B A.ERCT ;SAVE IN STATUS TABLE RTS ; A.PRTY: BIT B #,4 ;A 'PARITY' ? BEQ A.FRAM ;IF NOT - CHECK FRAME LDA A LCR+A.8250 ;GET LINE CONTROL REGISTER TAB ;SAVE AND A #,317 ;MASK OUT PARITY ADD B #,20 ;UPDATE PARITY SELECT AND B #,60 ;MASK OUT ALL BUT PARITY ABA ;COMBINE BITS STA A LCR+A.8250 ;STORE AT I/O BRA A.LERR ;GO FINISH UP ; A.FRAM: BIT B #,10 ;A 'FRAME' ? BEQ A.OVRN ;IF NOT - AN OVERRUN ERROR LDA B LCR+A.8250 ;GET CONTROL REGISTER EOR B #,4 ;FLIP/FLOP STOP BIT SELECT STA B LCR+A.8250 ;SAVE AT I/O A.LERR: DEC A.ERCT ;ZERO YET ? BLE A.LBRK ;IF SO - RESET HARDWARE A.OVRN: A.LEND: RTS ; .PAGE .SBTTL A.8250 MODEM STATUS HANDLER ; ; THIS IS THE STANDARD A.8250 MODEM STATUS ; HANDLER. IT MAY BE ACCESSED BY SETTING A.MO$V=A.82$M. ; ONLY THE RLSD BIT IS USED BY THIS ROUTINE ; FOR BAUD-RATE DETERMINATION. AND IS ENABLED ; BY SETTING THE CORRESPONDING BIT IN A.MNBL. ; ENTER WITH MSR IN , B IS DESTROYED ; ; A.MEND: RTS A.82$M: TBA ;COPY B TO A AND B A.MNBL ;MASK WITH ENABLES BIT B #,10 ;BAUD RATE ENABLED ? BEQ A.MEND ;EXIT IF NOT BIT A #,200 ;FIRST BIT OF CHARACTER ? BEQ A.MEND ;IF NOT - LEAVE LDA B A.LNST ;A BAUD RATE CHECK ? BEQ A.MEND ;IF NOT - LEAVE CLR A.LNST ;CLEAR STATUS LDX #,-6000. ;INITIALIZE COUNTER TO STX A.CBCT ;ABOUT 12 BIT TIMES @ 110 BAUD LDX #,32767. ;PRESET LOW COUNT STX A.LWCT 1$: LDA A MSR+A.8250 ;CHECK STATUS FOR TRANSITION BIT A #,10 BNE 3$ ;ON TRANSITION - SKIP INC A.CBCT+1 ;UPDATE COUNTER BNE 1$ ;LOOP UNTIL = 0 INC A.CBCT BNE 1$ 2$: BRA A.LBRK ;ELSE TIME RAN OUT ; 3$: LDX A.CBCT ;GET CURRENT COUNT STX A.PBCT ;SAVE IN PREVIOUS COUNT ; 4$: LDA A MSR+A.8250 ;GET STATUS BIT A #,10 ;CHECK FOR TRANSITION BEQ 6$ ;IF NONE - SKIP LDA A A.CBCT+1 ;GET CURRENT COUNT LDA B A.CBCT SUB A A.PBCT+1 ;COMPUTE DIFFERENCE SBC B A.PBCT ;WITH PREVIOUS COUNT STA A A.BDIF+1 ;SAVE DIFFERENCE STA B A.BDIF SUB A A.LWCT+1 ;DIFFERENCE LESS THAN SBC B A.LWCT ;CURRENT LOW COUNT ? BPL 5$ ;IF NOT - SKIP LDX A.BDIF ;ELSE SAVE AS NEW LOW COUNT STX A.LWCT 5$: LDA A A.CBCT+1 ;UPDATE AND SAVE COUNT LDA B A.CBCT STA A A.PBCT+1 STA B A.PBCT ADD A #,3 ADC B #,0 STA A A.CBCT+1 STA B A.CBCT 6$: INC A.CBCT+1 ;UPDATE COUNT BNE 4$ ;LOOP UNTIL TIME OUT INC A.CBCT BNE 4$ ; ; SCAN BAUD TABLE TO GET BAUD RATE DIVISOR ; LDX #,32767. ;CHECK A.LWCT CPX A.LWCT ;THE SAME ? BEQ 2$ ;IF SO - NO TRANSITION FOUND ; LDX #,A.BTBL ;GET POINTER TO TABLE 7$: LDA A A.LWCT+1 ;GET A.LWCT LDA B A.LWCT SUB A 1,X ;CHECK IF LESS THAN TABLE ELEMENT SBC B 0,X BMI 8$ ;IF SO - SKIP INX ;ELSE SCAN TABLE INX INX INX BRA 7$ ; 8$: LDX 2,X ;GET BAUD RATE DIVISOR STX A.BDVS ;SAVE DIVISOR LDA A LCR+A.8250 ;GET LINE CONTROL ORA A #,200 ;SET DLAB=1 STA A LCR+A.8250 LDA B A.BDVS+1 ;SET BAUD RATE DIVISOR AT I/O STA B DLL+A.8250 LDA B A.BDVS STA B DLM+A.8250 AND A #,177 ;SET DLAB=0 STA A LCR+A.8250 RTS ; .PAGE .SBTTL A.8250 INITIALIZATION ROUTINE ; A.82$B: LDA B #,36 ;SET UP A.LNBL STA B A.LNBL LDA B #,17 ;SET UP A.MNBL STA B A.MNBL LDA B #,-1 ;SET UP A.LNST STA B A.LNST ;TO CHECK BAUD RATE LDA B #,11 ;ERROR COUNT PRESET STA B A.ERCT ;IN STATUS TABLE LDA B #,216 ;LINE CONTROL STA B LCR+A.8250 LDA B #,12.&377 ;SET UP FOR 9600 BAUD STA B DLL+A.8250 LDA B #,12.&177400/400 STA B DLM+A.8250 LDA B #,16 STA B LCR+A.8250 RTS ; .IIF NDF,$A.8250 .END