; CTEC 350 - Project 3
; Serial Transmission of "CODE" using 8051 Microcontroller
; Timer 1, Mode 2 (Auto-Reload) as Baud Rate Generator @ 9600 baud
; SCON: Mode 1 (8-bit UART), REN Enabled

ORG 0000H               ; Program starts at address 0000H

;------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------
MAIN:
    ; --- Configure Timer 1: Mode 2 (8-bit auto-reload) ---
    MOV TMOD, #20H      ; Timer 1 in Mode 2 (bits[7:4] = 0010), Timer 0 off

    ; --- Set Baud Rate to 9600 ---
    ; Assuming 11.0592 MHz crystal, SMOD = 0:
    ; TH1 = 256 - (11059200 / (384 * 9600)) = 256 - 3 = 253 = FDH
    MOV TH1, #0FDH      ; Load auto-reload value for 9600 baud
    MOV TL1, #0FDH      ; Also initialize TL1 to same value

    ; --- Configure Serial Port (SCON) ---
    ; Mode 1: 8-bit UART, 1 start bit, 1 stop bit, REN enabled
    ; SM0=0, SM1=1, SM2=0, REN=1, TB8=0, RB8=0, TI=0, RI=0
    ; SCON = 0101 0000B = 50H
    MOV SCON, #50H      ; 8-bit UART mode, REN enabled

    ; --- Start Timer 1 ---
    SETB TR1            ; Start Timer 1 (bit TR1 in TCON)

;------------------------------------------------------
; TRANSMIT LOOP - Repeatedly send 'C', 'O', 'D', 'E'
;------------------------------------------------------
TRANSMIT_LOOP:
    MOV A, #43H         ; ASCII 'C' = 0x43
    ACALL TRANSMIT_BYTE

    MOV A, #4FH         ; ASCII 'O' = 0x4F
    ACALL TRANSMIT_BYTE

    MOV A, #44H         ; ASCII 'D' = 0x44
    ACALL TRANSMIT_BYTE

    MOV A, #45H         ; ASCII 'E' = 0x45
    ACALL TRANSMIT_BYTE

    SJMP TRANSMIT_LOOP  ; Repeat indefinitely

;------------------------------------------------------
; TRANSMIT_BYTE SUBROUTINE
; Input:  A = ASCII byte to transmit
; Action: Sends byte via SBUF, waits for TI flag,
;         then clears TI flag before returning
;------------------------------------------------------
TRANSMIT_BYTE:
    MOV SBUF, A         ; Load byte into Serial Buffer (begins transmission)

WAIT_TI:
    JNB TI, WAIT_TI     ; Wait until TI=1 (transmission complete)
                        ; <<< BREAKPOINT HERE to view SBUF and SCON >>>

    CLR TI              ; Clear TI flag for next transmission
    RET                 ; Return from subroutine

END                     ; End of program
