;LAST UPDATE 5/8/85 11:00 $TITLE(SUBROUTINES FOR VA212) $INCLUDE(:F1:VA212.MAC) ; ;THIS IS THE VA212 SUBROUTINE MODULE ; M1000 EQU 0FFFFH-1000 ;A CONSTANT,2**16-1000 DECIMAL M_F EQU 0FH M_7F EQU 07FH ; $EJECT ;ASSUME ALL FLAGS HAVE BEEN ZEROED AT POWER UP ;COME HERE TO SET SOME TO 1 INIT_FLG: SETB SCT_PIP ;PIPLIN FROM TO LIN TO 1 SETB DLIN_RXD ;SET STORAGE FROM LIN TO 1 SETB HUNT_FLG ;SET HUNT FOR MK TO SP SETB SNDOT_FLG ;IDLE DOTTING SETB RVDOT_FLG ;RECEIVE DOT SETB B212_FLG ;INIT TO 212 MODE SETB DOT_BIT ;THE DOTTING PATTERN CLR DOT_ERR ; INIT_F1: SETB TXD_BBB ;SET BBB_STORAGE TO 1 SETB BBB_FLG ;DTE BIT BY BIT ; SETB SCT_PIP ;SET PIPLIN TO LINE TO 1 ; SETB DLIN_RXD ;SET STORAGE FROM LIN TO 1 SETB TXD_PIP ;PIPLIN FROM DCE TO DTE ; SETB HUNT_FLG ;SET HUNT FOR MK TO SP ; SETB SNDOT_FLG ;IDLE DOTTING ; SETB RVDOT_FLG ; SETB B212_FLG ;INIT TO 212 MODE SETB SCRM_FLG ;SCRAMBLE FOR SELF TEST ; SETB DOT_BIT ;THE DOTTING PATTERN CLR DRDY_FLG CLR CORFIN_FLG CLR XBIT_FLG CLR BRK_FLG CLR BBRK_FLG CLR LGSP_FLG ; CLR DOT_ERR CLR SDMK_FLG ;SEND MK FOR SYN CLR SP_FLG ;SEND SP FOR 103 & SYN CLR CXRFLG RET ; ;COME HERE AND ASSUME ALL OTHER BUFFERS HAVE BEEN ZERO ;INIT PTRS AND CONSTANTS TO DEFAULT VALUE ; INIT_PTR: MOV A,#8 MOV DCOR_CNT,A MOV CORE_CNT,A MOV A,#5 MOV RCV_TICK,A MOV XMT_TICK,A MOV DBIT_CNT,A MOV A,#10 MOV M_CNT,A MOV DM_CNT,A MOV DFRM_CNT,A I_PTR1: MOV A,#11111110B ;THE WALKING 0 PTR MOV RCV_PTR,A MOV A,#11111011B MOV XMT_PTR,A ;INIT XMT & RCV PTR MOV A,#0FFH ;INIT THEM TO ALL 1 MOV LG_SP,A MOV LG_SP1,A MOV RCV_BUF,A MOV XMT_BUF1,A MOV XMT_BUF2,A ; MOV SCM1,A ; MOV SCM2,A ; MOV SCM3,A ; MOV DSCM1,A ; MOV DSCM2,A ; MOV DSCM3,A ;INIT RCV_BUF, SCRAMBLE AND ;DESCRAMBLE BUFFER RET ; ;$SAVE NOLIST $EJECT AATTN: RET ; ; ; R_ATTN: RET ; SET_ATTN: RET ; ;THIS SETS THE SOFTWARE TRAP ;THE TRAP ADDRESS IS SWAPPED WITH RETURN ADDRESS AND ;THE TIMER IS ACTIVATED. UPON RETURN, THE TRAP ADDRESS WILL REMAIN IN ;STACK. WHEN TIME IS UP, THE TIMER INTERRUPS AND AFTER GOING THRU THE ;NESTING , WILL GO TO THE TRAP ADDRESS THAT HAS BEEN PUSH INTO ;THE STACK BY THIS ROUTINE. NOTE THAT THE TRAP MECHANISM IS THAT ;OF A SOFT TYPE AND IT WILL FINISH ANY SUBROUTINE THAT IS BEING ;EXECUTED AT TIME. FOR LINEAR CODES, IT JUST CUT OFF AND BRANCH ;TO THE TRAP ADDRESS. ;********NOTE THAT THE STACK MUST BE INITIALIZED AFTER EACH TRAP ;AS EACH TRAP INSERTS TWO BYTES OF TRAP ADDRESS INTO THE STACK. IF NOT ;TAKEN CARE OF, THE STACK MAY OVERFLOW ;NOTE THAT WHEN A CALL IS EXECUTED, THE LO ADDRESS IS PUSHED INTO ;LO STACK AND HI ADDR IS PUSHED INTO HI STACK ; TM_TRAP:CLR ET0 CLR TR0 CLR TF0 MOV TTL0,TMCON_LO ;LOAD TIME CONSTANT ;******** ABOVE INSTR MAY BE ASSEMBLED WRONG BY V1.0 ASSEMBLER ; MOV TTH0,TMCON_HI ;******** ABOVE INSTR MAY BE ASSEMBLED WRONG BY V1.0 ASSEMBLER ; POP ACC ;SWAP ADDR, HI BYTE MOV TMCON_HI,A ;STORE TEMP POP ACC ;SWAP ADDR, LO BYTE MOV TMCON_LO,A ; MOV A,TMOUT_LO ;STASH IN TRAO PUSH ACC ;LO BYTE OF TRAP ADDR MOV A,TMOUT_HI ;STASH IN HI BYTE OF TRAP ADDR PUSH ACC ; MOV A,TMCON_LO PUSH ACC ;RESTORE RETURN ADDRESS MOV A,TMCON_HI PUSH ACC SETB TR0 SETB ET0 ;ENABLE TIMER & INTERR FROM TIMER RET ; ;THIS IS TO HANDLE THE GARBAGE COLLECTION IN THE STACK WHEN ;A TIME-OUT TRAP IS SET BUT NOT ACTIVATED AS THE TASK IS ;ACCOMPLISHED IN THE PRESET TIME. IT FIRST DISABLES THE ;TIME OUT TIMER, THEN POP THE STACK UNTIL THE TIME-OUT ;TRAP ADDRESS IS FOUND. ; UNTRAP: CLR TR0 CLR ET0 CLR TF0 ;DISABLE TIMER0 POP ACC MOV TMCON_HI,A ;SAVE RETURN ADDR HI BYT POP ACC MOV TMCON_LO,A ;SAVE RETURN ADDR LO BYTE UNDO1: POP ACC UNDO2: CJNE A,TMOUT_HI,UNDO1;MATCH HI BYT OF TRAP ADDRESS POP ACC CJNE A,TMOUT_LO,UNDO2 MOV A,TMCON_LO PUSH ACC MOV A,TMCON_HI PUSH ACC RET ; ; ;THIS IS THE INTERR SERVICE ROUTINE FOR TIMER0 ;TIMER0 IS USED FOR MEASURING PULSE WIDTH, SUCH AS DURING POWER UP ;TO AUTO DETERMINE BAUD RATE & PARITY, ;ALSO IT IS USED AS A TIME OUT DEVICE, SUCH AS SOFT TRAP ;AND INTERVALS. TIMER0 CAN EITHER USE THE INTERNAL CLK, WHICH IS ;1MHZ, OR THE EXTERNAL SOURCE ;HENCE, IT IS NECESSARY FOR THE USER TO PROGRAM TIMER0 EITHER ;AS A TIMER(INTERNAL CLK), OR AS A COUNTER(EXT CLK) ; ;WHEN USED AS TRAP,THE TIMER BRINGS IT HERE ;IT START SEARCHING FOR THE RETURN ADDRESS BEFORE ;THE TRAP ADDR. WHEN FOUND, THIS IS REPLACED WITH ;THE TRAP ADDR. HENCE, THE PROCESSOR WILL FINISH ANY ;SUBROUTINES BEFORE GOING TO THE TRAP ROUTINE ; ;TYMER0: JB TDMER0,LSTA ;LINE STATUS INTERRUPT AT 10MS ; TYMER0: XCH A,R0 PUSH ACC XCH A,R0 PUSH ACC PUSH PSW CLR TR0 ;STOP TIMER CLR ET0 ;DISABLE INTERR MOV R0,SP ;GET STACK PTR INC R0 TRAP1: DEC R0 MOV A,@R0 ;SEARCH FOR THE TRAP ADDRESS TRAP2: CJNE A,TMOUT_HI,TRAP1;LOOK FOR HI BYTE OF TRAP ADDR DEC R0 ;HI BYTE MATCH, WHAT ABOUT LO BYTE MOV A,@R0 CJNE A,TMOUT_LO,TRAP2;MATCH FOR LO BYTE INC R0 ;FOUND TRAP ADDRESS I STASH IN INC R0 ;BACK UP 2 WILL BE RETURN ADDR ;OF LAST SUBROUTINE MOV @R0,TMOUT_LO ;FORCE TRAP ADDR IN INC R0 MOV @R0,TMOUT_HI TRAP3: POP PSW POP ACC ;THIS IS ACC XCH A,R0 ;SAVE ACC IN R0 POP ACC ;THIS IS R0 XCH A,R0 RETI ; ;LSTA: JMP LSTAT ; ; ;THIS IS TO CONTROL THE FLASH CIRCUITRY IN ACCORDANCE WITH ;DOT_ERR FLG ; FLASH: RET ; $EJECT