;*************************************************************** ; ; TEROT - Output a character to the system console ; update PHEAD position. ; ;*************************************************************** ; STEROT: MOV R5,#' ' ;OUTPUT A SPACE ; TEROT: PUSH ACC ;SAVE THE ACCUMULATOR PUSH DPH ;SAVE THE DPTR PUSH DPL JNB CNT_S,$+7 ;WAIT FOR A CONTROL Q ACALL BCK ;GET SERIAL STATUS SJMP $-5 MOV A,R5 ;PUT OUTPUT BYTE IN A JNB BO,$+8 ;CHECK FOR MONITOR LCALL 2040H ;DO THE MONITOR AJMP TEROT1 ;CLEAN UP JNB COUB,$+8 ;SEE IF USER WANTS OUTPUT LCALL 4030H AJMP TEROT1 JNB UPB,T_1 ;NO AT IF NO XBIT JNB LPB,T_1 ;AT PRINT LCALL 403CH ;CALL AT LOCATION AJMP TEROT1 ;FINISH OFF OUTPUT ; T_1: JNB COB,TXX ;SEE IF LIST SET MOV DPTR,#SPV ;LOAD BAUD RATE ACALL LD_T CLR LP ;OUTPUT START BIT ACALL TIMER_LOAD ;LOAD AND START THE TIMER MOV A,R5 ;GET THE OUTPUT BYTE SETB C ;SET CARRY FOR LAST OUTPUT MOV R5,#9 ;LOAD TIMER COUNTDOWN ; LTOUT1: RRC A ;ROTATE A JNB TF1,$ ;WAIT TILL TIMER READY MOV LP,C ;OUTPUT THE BIT ACALL TIMER_LOAD ;DO THE NEXT BIT DJNZ R5,LTOUT1 ;LOOP UNTIL DONE JNB TF1,$ ;FIRST STOP BIT ACALL TIMER_LOAD JNB TF1,$ ;SECOND STOP BIT MOV R5,A ;RESTORE R5 SJMP TEROT1 ;BACK TO TEROT ; newpage TXX: JNB TI,$ ;WAIT FOR TRANSMIT READY CLR TI MOV SBUF,R5 ;SEND OUT THE CHARACTER ; TEROT1: CJNE R5,#CR,$+6 ;SEE IF A CR MOV PHEAD,#00H ;IF A CR, RESET PHEAD AND ; CJNE R5,#LF,NLC ;SEE IF A LF MOV A,NULLCT ;GET THE NULL COUNT JZ NLC ;NO NULLS IF ZERO ; TEROT2: MOV R5,#NULL ;PUT THE NULL IN THE OUTPUT REGISTER ACALL TEROT ;OUTPUT THE NULL DEC A ;DECREMENT NULL COUNT JNZ TEROT2 ;LOOP UNTIL DONE ; NLC: CJNE R5,#BS,$+5 ;DEC PHEAD IF A BACKSPACE DEC PHEAD CJNE R5,#20H,$+3 ;IS IT A PRINTABLE CHARACTER? JC $+4 ;DON'T INCREMENT PHEAD IF NOT PRINTABLE INC PHEAD ;BUMP PRINT HEAD POP DPL ;RESTORE DPTR POP DPH POP ACC ;RESTORE ACC RET ;EXIT ;