
  TxBlock     BIT   0H          ;Transmission Hi or Low bit selection for buffer
  RxBlock     BIT   1H          ;Received shift out Hi or Low bit selection
  INT0_test   BIT   10H
  
  
  TxBuffStart EQU   30H
  RxBuffStart EQU   40H


;Test serial port with out any buffer
  ORG     0000H
  AJMP    Initialize_Program

  ORG     0003H                 ;interrupt section
  AJMP    External0_Interrupted
  
  ORG     0023H                 ;serial interrupt
  AJMP    Serial_Interrupted    ;jump to serial interrupt handler

Initialize_Program:
  MOV     SCON, #52H            ;serial mode 1
  MOV     TMOD, #20H            ;timer mode 2
  MOV     A, PCON               ;setting SMOD = 1, Read-Modify-Write
  SETB    ACC.7                 ;
  MOV     PCON, A               ;
  MOV     TH1, #0FEH            ;set 57600 baud rate
  MOV     IE, #10010001B        ;set interrupt
  SETB    TR1                   ;start timer 
  SETB    PX0
  SETB    PS
  CLR     TxBlock
  CLR     RxBlock
  MOV     SBUF, #00000000B      ;send start byte
  JNB     TI, $
  JMP     $

;*******************************************************************************
External0_Interrupted:

;Interrupt Test
  JB      INT0_test, on_off
  SETB    INT0_test
  SETB     P2.2
  AJMP    END_TEST
on_off:
  CLR     INT0_test
  CLR     P2.2
END_TEST:

;Save variable
;-------------
  PUSH    ACC

;Move Rx data onto Port 1
;-------------------------
  MOV     A, RxBuffStart
  JNB     RxBlock, Low_RxBlock
  RL      A
  RL      A
  RL      A
  RL      A
  MOV     P1, A
  CLR     RxBlock
  SETB    P2.0
  AJMP    Tx_Start

;Low Rx Block
;--------------
Low_RxBlock:
  MOV     P1, A
  SETB    RxBlock
  CLR     P2.0

;Start Transmission section
;--------------------------
Tx_Start:
  ;Save incoming data
  MOV     A, P0
  ANL     A, #00001111B
  JNB     TxBlock, Low_TxBlock

  RL      A
  RL      A
  RL      A
  RL      A

;Begin to add High byte to low byte and send data out from serial port
;----------------------------------------------------------------------
  ORL     A, TxBuffStart
  JNB     TI, $                       ;loop until transmittor is ready
  CLR     TI
  MOV     SBUF, A
  CLR     TxBlock
  AJMP    End_External0_Interrupted

Low_TxBlock:
;Begin to add Low byte into buffer
;---------------------------------
  MOV     TxBuffStart, A
  SETB    TxBlock

End_External0_Interrupted:
  ;Restore variable
  POP     ACC
  RETI
  
;*******************************************************************************
Serial_Interrupted:
;Make sure that it is Rx interrupt
;----------------------------------
  JNB     RI, End_Serial_Interrupt
  CLR     RI
  
;Save data from internal serial buffer
;-------------------------------------
  MOV     RxBuffStart, SBUF
  
End_Serial_Interrupted:
  RETI

