           ;*******************************************************;
           ;                                                       ;
           ;                         87C751                        ;
           ;                SERIAL STREAM GENERATOR                ;
           ;                                                       ;
           ;                 Signetics Corporation                 ;
           ;                                                       ;
           ;                     AUGUST 1988                       ;
           ;*******************************************************;

$DEBUG
$MOD51

         BLOCK_END    DATA   022H
         BLOCK_START  DATA   023H

;******************************************************************************
;                               INTERRUPT VECTORS
;******************************************************************************

         ORG    00H                             ;
                AJMP    RESET                   ;

         ORG    03H                             ;EXTERNAL INTERRUPT 0
                RETI                            ;

         ORG    0BH                             ;
                RETI
    
         ORG    13H                             ;
                RETI                            

         ORG    1BH                             ;
                RETI

         ORG    23H                             ;SERIAL PORT INTERRUPT
                JMP     SEND_NXT                ;SERVICE INTERRUPT
    
    
;*****************************************************************************
;                               RESET ROUTINE
;*****************************************************************************

RESET: 
                JB      P3.2,HI_BAUD            ;HIGHER BAUD RATES?
LO_BAUD:        JB      P3.3,BAUD_2400     
BAUD_1200:      MOV     TH1,#0E8H               ;TIMER RELOAD VALUE, 1.2K  
                JMP     DATA_TYPE
BAUD_2400:      MOV     TH1,#0F4H               ;TIMER RELOAD VALUE, 2.4K 
                JMP     DATA_TYPE

HI_BAUD:        JB      P3.3,BAUD_9600
BAUD_4800:      MOV     TH1,#0FAH               ;TIMER RELOAD VALUE, 4.8K  
                JMP     DATA_TYPE
BAUD_9600:      MOV     TH1,#0FDH               ;TIMER RELOAD VALUE, 9.6K 

DATA_TYPE:      JB      P3.4,UNI_DATA
VARI_DATA:      MOV     BLOCK_START,#BLOCK_START_1
                MOV     BLOCK_END,#BLOCK_END_1
                JMP     SEND_DATA
UNI_DATA:       MOV     BLOCK_START,#BLOCK_START_2
                MOV     BLOCK_END,#BLOCK_END_2

SEND_DATA:      MOV     SCON,#040H              ;SERIAL MODE 1, 10 BIT MODE
                MOV     TMOD,#22H               ;TIMER 1, MODE 1
                MOV     TCON,#40H               ;RUN 
                MOV     IE,#90H                 ;ENABLE SERIAL INTERRUPT
                MOV     DPL,BLOCK_START
                MOV     DPH,#00H

;send first byte          
                JB      P1.0,$                  ;IF RTS IS UN-ASSERTED, WAIT
                CLR     TI                      ;CLEAR TRANSMIT INTERRUPT FLAG
                MOV     A,#00H
                MOVC    A,@A+DPTR
                MOV     SBUF,A                  ;
                INC     DPL
                JMP     WAIT                   

SEND_NXT:       JB      P3.5,NO_HOLD            ;IF PIN IS LOW, WAIT
                JNB     P3.5,$                  ;DON'T SEND ANY MORE BYTES
                ACALL   XRETI                   ;ENABLE SUBSEQUENT INTERRUPTS
                POP     ACC                     ;DISCARD INTERRUPT RETURN ADDR
                POP     ACC                     ;
                JMP     RESET                   ;POLL SET UPS AGAIN

NO_HOLD:        JB      P1.0,$                  ;IF RTS IS NEGATED, WAIT HERE 
                CLR     TI                      ;CLEAR TRANSMIT INTERRUPT FLAG
                MOV     A,#00H
                MOVC    A,@A+DPTR
                MOV     SBUF,A                  ;
                MOV     A,DPL
                CJNE    A,BLOCK_END,CYCLE
                MOV     DPL,BLOCK_START
                RETI
CYCLE:          INC     DPL
                RETI
 
WAIT:           JMP     $                       ;WAIT FOR NEXT INTERRUPT
;

XRETI:          RETI

BLOCK_START_1:  DB 055H
                DB 055H
BLOCK_END_1:    DB 055H
BLOCK_START_2:  DB 021H
                DB 022H
                DB 023H
                DB 024H
                DB 025H
                DB 026H
                DB 027H
                DB 028H
                DB 029H
                DB 02AH
                DB 02BH
                DB 02CH
                DB 02DH
                DB 02EH
                DB 02FH
                DB 030H
                DB 031H
                DB 032H
                DB 033H
                DB 034H
                DB 035H
                DB 036H
                DB 00DH
                DB 00AH
BLOCK_END_2:    DB 037H


END

                                        