⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.asm

📁 usb serial converter
💻 ASM
📖 第 1 页 / 共 4 页
字号:
    jz      Tx_Data_Done                    ; [5/4]

    iord    INPUT_PORT                      ; [5]
    and     A, CTS                          ; [4] 

IFDEF HW_FLOW_CONTROL

    jnz     Tx_Data_Exit                    ; [5/4]

ELSE

    nop                                     ; [4]

ENDIF

    mov     X, [tx_byte_counter]            ; [5]
    mov     A, [X + output_data]            ; [6]
    mov     [tx_data], A                    ; [5]

    mov     A, [parity_type]                ; [5]
    mov     [parity], A                     ; [5]

    mov     A, [temp]                       ; [5]
    and     A, ~TXD                         ; [4]
    
;***************************************************************

Tx_Start:
    iowr    OUTPUT_PORT                     ; [5]

    inc     [tx_byte_counter]               ; [7]
    
    ; Kill 56 cycles (104 - 48 = 56).
    call    50_Cycle_Delay                  ; [50]
    6_CYCLE_DELAY                           ; [6]

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]       
    xor     [parity], A                     ; [7]
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]
    
;***************************************************************

Tx_D0:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [tx_data]                    ; [5]       
    asr                                     ; [4]
    mov     [tx_data], A                    ; [5]

    ; Kill 49 cycles (104 - 55 = 49).
    call    42_Cycle_Delay                  ; [42]
    7_CYCLE_DELAY                           ; [7]

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]
    xor     [parity], A                     ; [7] 
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_D1:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [tx_data]                    ; [5]       
    asr                                     ; [4]
    mov     [tx_data], A                    ; [5]

    ; Kill 49 cycles (104 - 55 = 49).
    call    42_Cycle_Delay                  ; [42]
    7_CYCLE_DELAY                           ; [7]

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]
    xor     [parity], A                     ; [7] 
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_D2:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [tx_data]                    ; [5]       
    asr                                     ; [4]
    mov     [tx_data], A                    ; [5]

    ; Kill 49 cycles (104 - 55 = 49).
    call    42_Cycle_Delay                  ; [42]
    7_CYCLE_DELAY                           ; [7]

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]
    xor     [parity], A                     ; [7] 
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_D3:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [tx_data]                    ; [5]       
    asr                                     ; [4]
    mov     [tx_data], A                    ; [5]

    ; Kill 49 cycles (104 - 55 = 49).
    call    42_Cycle_Delay                  ; [42]
    7_CYCLE_DELAY                           ; [7]

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]
    xor     [parity], A                     ; [7] 
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_D4:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [data_bit_count]             ; [5]
    cmp     A, 05h                          ; [5]
    JNE     Tx_D4_D5_Next                   ; [5/4]

    mov     A, [parity_on]                  ; [5]
    cmp     A, TRUE                         ; [5]
    JNE     Tx_D4_Stop_Next                 ; [5/4]

;----------------------------------------------------------------

Tx_D4_Parity_Next:

    ; Kill 37 cycles (104 - 67 = 37).
    call    30_Cycle_Delay                  ; [30]
    7_CYCLE_DELAY                           ; [7]
    
    jmp     Tx_Parity_Next                  ; [5] -> [29]

;----------------------------------------------------------------

Tx_D4_Stop_Next:

    ; Kill 41 cycles (104 - 63 = 41).
    call    34_Cycle_Delay                  ; [34]
    7_CYCLE_DELAY                           ; [7]

    jmp     Tx_Stop_0_Next                  ; [5] -> [24]

;----------------------------------------------------------------

Tx_D4_D5_Next:
    mov     A, [tx_data]                    ; [5]       
    asr                                     ; [4]
    mov     [tx_data], A                    ; [5]

    ; Kill 34 cycles (104 - 70 = 34).
    call    34_Cycle_Delay                  ; [34]
    
;----------------------------------------------------------------

Tx_D5_Next:

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]
    xor     [parity], A                     ; [7] 
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_D5:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [data_bit_count]             ; [5]
    cmp     A, 06h                          ; [5]
    JNE     Tx_D5_D6_Next                   ; [5/4]

    mov     A, [parity_on]                  ; [5]
    cmp     A, TRUE                         ; [5]
    JNE     Tx_D5_Stop_Next                 ; [5/4]

;----------------------------------------------------------------

Tx_D5_Parity_Next:

    ; Kill 37 cycles (104 - 67 = 37).
    call    30_Cycle_Delay                  ; [30]
    7_CYCLE_DELAY                           ; [7]

    jmp     Tx_Parity_Next                  ; [5] -> [29]

;----------------------------------------------------------------

Tx_D5_Stop_Next:

    ; Kill 41 cycles (104 - 63 = 41).
    call    34_Cycle_Delay                  ; [34]
    7_CYCLE_DELAY                           ; [7]

    jmp     Tx_Stop_0_Next                  ; [5] -> [24]

;----------------------------------------------------------------

Tx_D5_D6_Next:
    mov     A, [tx_data]                    ; [5]       
    asr                                     ; [4]
    mov     [tx_data], A                    ; [5]

    ; Kill 34 cycles (104 - 70 = 34).
    call    34_Cycle_Delay                  ; [34]

;----------------------------------------------------------------

Tx_D6_Next:

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]
    xor     [parity], A                     ; [7] 
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_D6:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [data_bit_count]             ; [5]
    cmp     A, 07h                          ; [5]
    JNE     Tx_D6_D7_Next                   ; [5/4]

    mov     A, [parity_on]                  ; [5]
    cmp     A, TRUE                         ; [5]
    JNE     Tx_D6_Stop_Next                 ; [5/4]

;----------------------------------------------------------------

Tx_D6_Parity_Next:

    ; Kill 37 cycles (104 - 67 = 37).
    call    30_Cycle_Delay                  ; [30]
    7_CYCLE_DELAY                           ; [7]
    
    jmp     Tx_Parity_Next                  ; [5] -> [29]

;----------------------------------------------------------------

Tx_D6_Stop_Next:

    ; Kill 41 cycles (104 - 63 = 41).
    call    34_Cycle_Delay                  ; [34]
    7_CYCLE_DELAY                           ; [7]

    jmp     Tx_Stop_0_Next                  ; [5] -> [24]

;----------------------------------------------------------------

Tx_D6_D7_Next:
    mov     A, [tx_data]                    ; [5]       
    asr                                     ; [4]
    mov     [tx_data], A                    ; [5]

    ; Kill 34 cycles (104 - 70 = 34).
    call    34_Cycle_Delay                  ; [34]

;----------------------------------------------------------------

Tx_D7_Next:

    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [tx_data]                    ; [5]
    xor     [parity], A                     ; [7] 
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_D7:
    iowr    OUTPUT_PORT                     ; [5]

    mov     A, [parity_on]                  ; [5]
    cmp     A, TRUE                         ; [5]
    JEQ     Tx_D7_Parity_Next               ; [5/4] 

;----------------------------------------------------------------

Tx_D7_Stop_0_Next:

    ; Kill 58 cycles (104 - 48 = 56).
    call    50_Cycle_Delay                  ; [50]
    6_CYCLE_DELAY                           ; [6]

    jmp     Tx_Stop_0_Next                  ; [5] -> [24]

;----------------------------------------------------------------

Tx_D7_Parity_Next:

    ; Kill 55 cycles (104 - 49 = 55).
    call    50_Cycle_Delay                  ; [50]
    5_CYCLE_DELAY                           ; [5]
    
;----------------------------------------------------------------

Tx_Parity_Next:
    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, [parity]                     ; [5]
    and     A, TXD                          ; [4] 
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_Parity:
    iowr    OUTPUT_PORT                     ; [5]

    ; Kill 75 cycles (104 - 29 = 75).
    call    34_Cycle_Delay                  ; [34]
    call    34_Cycle_Delay                  ; [34]
    7_CYCLE_DELAY                           ; [7]

;----------------------------------------------------------------

Tx_Stop_0_Next:
    BIT_DELAY                               ; [14 + (bit_rate * 104)]

    mov     A, TXD                          ; [4]
    or      A, [temp]                       ; [6]

;***************************************************************

Tx_Stop_0:
    iowr    OUTPUT_PORT                     ; [5]

    ; If stop_bit_count is 2, insert the
    ; proper delay time prior to the 2nd
    ; stop bit.
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -