   1              		.file	"core_uart_apb.c"
   2              		.option nopic
   3              		.attribute arch, "rv32i2p0_m2p0"
   4              		.attribute unaligned_access, 0
   5              		.attribute stack_align, 16
   6              		.text
   7              		.section	.text.UART_init,"ax",@progbits
   8              		.align	2
   9              		.globl	UART_init
  11              	UART_init:
  12 0000 630A0502 		beq	a0,zero,.L22
  13              	.L2:
  14 0004 93077000 		li	a5,7
  15 0008 63F4D700 		bleu	a3,a5,.L3
  16              	 #APP
  17              	# 50 "../drivers/CoreUARTapb/core_uart_apb.c" 1
   1              	/*******************************************************************************
   2              	 * (c) Copyright 2007-2023 Microchip FPGA Embedded Systems Solutions.
   3              	 * 
   4              	 * SPDX-License-Identifier: MIT
   5              	 *
   6              	 * @file core_uart_apb.c
   7              	 * @author Microchip FPGA Embedded Systems Solutions
   8              	 * @brief CoreUARTapb driver implementation. See file "core_uart_apb.h" for 
   9              	 * description of the functions implemented in this file.
  10              	 * 
  11              	 */
  12              	
  13              	#include "coreuartapb_regs.h"
  14              	#include "core_uart_apb.h"
  15              	
  16              	#ifdef __cplusplus
  17              	extern "C" {
  18              	#endif
  19              	
  20              	#define NULL_INSTANCE ( ( UART_instance_t* ) 0 )
  21              	#define NULL_BUFFER   ( ( uint8_t* ) 0 )
  22              	
  23              	#define MAX_LINE_CONFIG     ( ( uint8_t )( DATA_8_BITS | ODD_PARITY ) )
  24              	#define MAX_BAUD_VALUE      ( ( uint16_t )( 0x1FFF ) )
  25              	#define STATUS_ERROR_MASK   ( ( uint8_t )( STATUS_PARITYERR_MASK | \
  26              	                                           STATUS_OVERFLOW_MASK  | \
  27              	                                           STATUS_FRAMERR_MASK ) )
  28              	#define BAUDVALUE_LSB ( (uint16_t) (0x00FF) )
  29              	#define BAUDVALUE_MSB ( (uint16_t) (0xFF00) )
  30              	#define BAUDVALUE_SHIFT ( (uint8_t) (5) )
  31              	
  32              	#define STATUS_ERROR_OFFSET STATUS_PARITYERR_SHIFT 
  33              	
  34              	/***************************************************************************//**
  35              	 * UART_init()
  36              	 * See "core_uart_apb.h" for details of how to use this function.
  37              	 */
  38              	void
  39              	UART_init
  40              	(
  41              	    UART_instance_t * this_uart,
  42              	    addr_t base_addr,
  43              	    uint16_t baud_value,
  44              	    uint8_t line_config
  45              	)
  46              	{
  47              	    uint8_t rx_full;
  48              	    
  49              	    HAL_ASSERT( this_uart != NULL_INSTANCE )
  50 000c 73001000 	    HAL_ASSERT( line_config <= MAX_LINE_CONFIG )
  51              	    HAL_ASSERT( baud_value <= MAX_BAUD_VALUE )
  18              		ebreak
  19              	# 0 "" 2
  20              	 #NO_APP
  21              	.L3:
  22 0010 B7270000 		li	a5,8192
  23 0014 6364F600 		bltu	a2,a5,.L4
  24              	 #APP
  25              	# 51 "../drivers/CoreUARTapb/core_uart_apb.c" 1
  52              	
  26              		ebreak
  27              	# 0 "" 2
  28              	 #NO_APP
  29              	.L4:
  30 001c 630A0500 		beq	a0,zero,.L18
  31 0020 93077000 		li	a5,7
  32 0024 63E6D700 		bgtu	a3,a5,.L18
  33 0028 B7270000 		li	a5,8192
  34 002c 6368F600 		bltu	a2,a5,.L23
  35              	.L18:
  36 0030 67800000 		ret
  37              	.L22:
  38              	 #APP
  39              	# 49 "../drivers/CoreUARTapb/core_uart_apb.c" 1
  40              		ebreak
  41              	# 0 "" 2
  42              	 #NO_APP
  43 0038 6FF0DFFC 		j	.L2
  44              	.L23:
  45 003c 130101FE 		addi	sp,sp,-32
  46 0040 23244101 		sw	s4,8(sp)
  47 0044 138A8500 		addi	s4,a1,8
  48 0048 232C8100 		sw	s0,24(sp)
  49 004c 23263101 		sw	s3,12(sp)
  50 0050 13040500 		mv	s0,a0
  51 0054 93890500 		mv	s3,a1
  52 0058 13050A00 		mv	a0,s4
  53 005c 9375F60F 		andi	a1,a2,0xff
  54 0060 232E1100 		sw	ra,28(sp)
  55 0064 232A9100 		sw	s1,20(sp)
  56 0068 23282101 		sw	s2,16(sp)
  57 006c 93040600 		mv	s1,a2
  58 0070 13890600 		mv	s2,a3
  59 0074 97000000 		call	HW_set_8bit_reg
  59      E7800000 
  60 007c 93D55440 		srai	a1,s1,5
  61 0080 93F5857F 		andi	a1,a1,2040
  62 0084 B3E52501 		or	a1,a1,s2
  63 0088 1385C900 		addi	a0,s3,12
  64 008c 97000000 		call	HW_set_8bit_reg
  64      E7800000 
  65 0094 13050A00 		mv	a0,s4
  66 0098 23203401 		sw	s3,0(s0)
  67 009c 97000000 		call	HW_get_8bit_reg
  67      E7800000 
  68 00a4 83270400 		lw	a5,0(s0)
  69 00a8 93190501 		slli	s3,a0,16
  70 00ac 93D90901 		srli	s3,s3,16
  71 00b0 1385C700 		addi	a0,a5,12
  72 00b4 97000000 		call	HW_get_8bit_reg
  72      E7800000 
  73 00bc 937785FF 		andi	a5,a0,-8
  74 00c0 93F7F70F 		andi	a5,a5,0xff
  75 00c4 93975700 		slli	a5,a5,5
  76 00c8 B3E7F900 		or	a5,s3,a5
  77 00cc 13757500 		andi	a0,a0,7
  78 00d0 6384F400 		beq	s1,a5,.L6
  79              	 #APP
  80              	# 85 "../drivers/CoreUARTapb/core_uart_apb.c" 1
  53              	    if( ( this_uart != NULL_INSTANCE ) &&
  54              	        ( line_config <= MAX_LINE_CONFIG ) &&
  55              	        ( baud_value <= MAX_BAUD_VALUE ) )
  56              	    {
  57              	        /*
  58              	         * Store lower 8-bits of baud value in CTRL1.
  59              	         */
  60              	        HAL_set_8bit_reg( base_addr, CTRL1, (uint_fast8_t)(baud_value &
  61              	                                                       BAUDVALUE_LSB ) );
  62              	    
  63              	        /*
  64              	         * Extract higher 5-bits of baud value and store in higher 5-bits 
  65              	         * of CTRL2, along with line configuration in lower 3 three bits.
  66              	         */
  67              	        HAL_set_8bit_reg( base_addr, CTRL2, (uint_fast8_t)line_config | 
  68              	                                           (uint_fast8_t)((baud_value &
  69              	                                   BAUDVALUE_MSB) >> BAUDVALUE_SHIFT ) );
  70              	    
  71              	        this_uart->base_address = base_addr;
  72              	#ifndef NDEBUG
  73              	        {
  74              	            uint8_t  config;
  75              	            uint8_t  temp;
  76              	            uint16_t baud_val;
  77              	            baud_val = HAL_get_8bit_reg( this_uart->base_address, CTRL1 );
  78              	            config =  HAL_get_8bit_reg( this_uart->base_address, CTRL2 );
  79              	            /*
  80              	             * To resolve operator precedence between & and <<
  81              	             */
  82              	            temp =  ( config  &  (uint8_t)(CTRL2_BAUDVALUE_MASK ) );
  83              	            baud_val |= (uint16_t)( (uint16_t)(temp) << BAUDVALUE_SHIFT );
  84              	            config &= (uint8_t)(~CTRL2_BAUDVALUE_MASK);
  85 00d4 73001000 	            HAL_ASSERT( baud_val == baud_value );
  86              	            HAL_ASSERT( config == line_config );
  81              		ebreak
  82              	# 0 "" 2
  83              	 #NO_APP
  84              	.L6:
  85 00d8 630EA900 		beq	s2,a0,.L7
  86              	 #APP
  87              	# 86 "../drivers/CoreUARTapb/core_uart_apb.c" 1
  87              	        }        
  88              		ebreak
  89              	# 0 "" 2
  90              	 #NO_APP
  91 00e0 6F004001 		j	.L7
  92              	.L24:
  93 00e4 03250400 		lw	a0,0(s0)
  94 00e8 13054500 		addi	a0,a0,4
  95 00ec 97000000 		call	HW_get_8bit_reg
  95      E7800000 
  96              	.L7:
  97 00f4 03250400 		lw	a0,0(s0)
  98 00f8 13050501 		addi	a0,a0,16
  99 00fc 97000000 		call	HW_get_8bit_reg
  99      E7800000 
 100 0104 13752500 		andi	a0,a0,2
 101 0108 E31E05FC 		bne	a0,zero,.L24
 102 010c 23020400 		sb	zero,4(s0)
 103 0110 8320C101 		lw	ra,28(sp)
 104 0114 03248101 		lw	s0,24(sp)
 105 0118 83244101 		lw	s1,20(sp)
 106 011c 03290101 		lw	s2,16(sp)
 107 0120 8329C100 		lw	s3,12(sp)
 108 0124 032A8100 		lw	s4,8(sp)
 109 0128 13010102 		addi	sp,sp,32
 110 012c 67800000 		jr	ra
 112              		.section	.text.UART_send,"ax",@progbits
 113              		.align	2
 114              		.globl	UART_send
 116              	UART_send:
 117 0000 63060508 		beq	a0,zero,.L48
 118 0004 63800508 		beq	a1,zero,.L49
 119              	.L27:
 120 0008 63140600 		bne	a2,zero,.L28
 121              	 #APP
 122              	# 127 "../drivers/CoreUARTapb/core_uart_apb.c" 1
  88              	#endif
  89              	        
  90              	        /*
  91              	         * Flush the receive FIFO of data that may have been received before the
  92              	         * driver was initialized.
  93              	         */
  94              	        rx_full = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &
  95              	                                                    STATUS_RXFULL_MASK;
  96              	        while ( rx_full )
  97              	        {
  98              	            HAL_get_8bit_reg( this_uart->base_address, RXDATA );
  99              	            rx_full = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &
 100              	                                                        STATUS_RXFULL_MASK;
 101              	        }
 102              	
 103              	        /*
 104              	         * Clear status of the UART instance.
 105              	         */
 106              	        this_uart->status = (uint8_t)0;
 107              	    }
 108              	}
 109              	
 110              	/***************************************************************************//**
 111              	 * UART_send()
 112              	 * See "core_uart_apb.h" for details of how to use this function.
 113              	 */
 114              	void
 115              	UART_send
 116              	(
 117              	    UART_instance_t * this_uart,
 118              	    const uint8_t * tx_buffer,
 119              	    size_t tx_size
 120              	)
 121              	{
 122              	    size_t char_idx;
 123              	    uint8_t tx_ready;
 124              	
 125              	    HAL_ASSERT( this_uart != NULL_INSTANCE )
 126              	    HAL_ASSERT( tx_buffer != NULL_BUFFER )
 127 000c 73001000 	    HAL_ASSERT( tx_size > 0 )
 128              	      
 123              		ebreak
 124              	# 0 "" 2
 125              	 #NO_APP
 126              	.L28:
 127 0010 63040508 		beq	a0,zero,.L45
 128 0014 63820508 		beq	a1,zero,.L45
 129 0018 63000608 		beq	a2,zero,.L45
 130 001c 130101FF 		addi	sp,sp,-16
 131 0020 23248100 		sw	s0,8(sp)
 132 0024 23229100 		sw	s1,4(sp)
 133 0028 23202101 		sw	s2,0(sp)
 134 002c 23261100 		sw	ra,12(sp)
 135 0030 13040500 		mv	s0,a0
 136 0034 93840500 		mv	s1,a1
 137 0038 3389C500 		add	s2,a1,a2
 138              	.L30:
 139 003c 03250400 		lw	a0,0(s0)
 140 0040 13050501 		addi	a0,a0,16
 141 0044 97000000 		call	HW_get_8bit_reg
 141      E7800000 
 142 004c 13751500 		andi	a0,a0,1
 143 0050 E30605FE 		beq	a0,zero,.L30
 144 0054 83C50400 		lbu	a1,0(s1)
 145 0058 03250400 		lw	a0,0(s0)
 146 005c 93841400 		addi	s1,s1,1
 147 0060 97000000 		call	HW_set_8bit_reg
 147      E7800000 
 148 0068 E31A99FC 		bne	s2,s1,.L30
 149 006c 8320C100 		lw	ra,12(sp)
 150 0070 03248100 		lw	s0,8(sp)
 151 0074 83244100 		lw	s1,4(sp)
 152 0078 03290100 		lw	s2,0(sp)
 153 007c 13010101 		addi	sp,sp,16
 154 0080 67800000 		jr	ra
 155              	.L49:
 156              	 #APP
 157              	# 126 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 158              		ebreak
 159              	# 0 "" 2
 160              	 #NO_APP
 161 0088 6FF01FF8 		j	.L27
 162              	.L48:
 163              	 #APP
 164              	# 125 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 165              		ebreak
 166              	# 0 "" 2
 167              	 #NO_APP
 168 0090 E39C05F6 		bne	a1,zero,.L27
 169 0094 6FF01FFF 		j	.L49
 170              	.L45:
 171 0098 67800000 		ret
 173              		.section	.text.UART_fill_tx_fifo,"ax",@progbits
 174              		.align	2
 175              		.globl	UART_fill_tx_fifo
 177              	UART_fill_tx_fifo:
 178 0000 130101FE 		addi	sp,sp,-32
 179 0004 232E1100 		sw	ra,28(sp)
 180 0008 232C8100 		sw	s0,24(sp)
 181 000c 232A9100 		sw	s1,20(sp)
 182 0010 23282101 		sw	s2,16(sp)
 183 0014 23263101 		sw	s3,12(sp)
 184 0018 63040504 		beq	a0,zero,.L74
 185 001c 638E0502 		beq	a1,zero,.L75
 186              	.L52:
 187 0020 63140600 		bne	a2,zero,.L53
 188              	 #APP
 189              	# 164 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 129              	    if( (this_uart != NULL_INSTANCE) &&
 130              	        (tx_buffer != NULL_BUFFER)   &&
 131              	        (tx_size > (size_t)0) )
 132              	    {
 133              	        for ( char_idx = (size_t)0; char_idx < tx_size; char_idx++ )
 134              	        {
 135              	            /* Wait for UART to become ready to transmit. */
 136              	            do {
 137              	                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &
 138              	                                                              STATUS_TXRDY_MASK;
 139              	            } while ( !tx_ready );
 140              	            /* Send next character in the buffer. */
 141              	            HAL_set_8bit_reg( this_uart->base_address, TXDATA,
 142              	                              (uint_fast8_t)tx_buffer[char_idx] );
 143              	        }
 144              	    }
 145              	}
 146              	
 147              	/***************************************************************************//**
 148              	 * UART_fill_tx_fifo()
 149              	 * See "core_uart_apb.h" for details of how to use this function.
 150              	 */
 151              	size_t
 152              	UART_fill_tx_fifo
 153              	(
 154              	    UART_instance_t * this_uart,
 155              	    const uint8_t * tx_buffer,
 156              	    size_t tx_size
 157              	)
 158              	{
 159              	    uint8_t tx_ready;
 160              	    size_t size_sent = 0u;
 161              	    
 162              	    HAL_ASSERT( this_uart != NULL_INSTANCE )
 163              	    HAL_ASSERT( tx_buffer != NULL_BUFFER )
 164 0024 73001000 	    HAL_ASSERT( tx_size > 0 )
 165              	      
 190              		ebreak
 191              	# 0 "" 2
 192              	 #NO_APP
 193              	.L53:
 194 0028 63060500 		beq	a0,zero,.L54
 195 002c 63840500 		beq	a1,zero,.L54
 196 0030 631E0602 		bne	a2,zero,.L76
 197              	.L54:
 198 0034 93040000 		li	s1,0
 199              	.L50:
 200 0038 8320C101 		lw	ra,28(sp)
 201 003c 03248101 		lw	s0,24(sp)
 202 0040 13850400 		mv	a0,s1
 203 0044 03290101 		lw	s2,16(sp)
 204 0048 83244101 		lw	s1,20(sp)
 205 004c 8329C100 		lw	s3,12(sp)
 206 0050 13010102 		addi	sp,sp,32
 207 0054 67800000 		jr	ra
 208              	.L75:
 209              	 #APP
 210              	# 163 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 211              		ebreak
 212              	# 0 "" 2
 213              	 #NO_APP
 214 005c 6FF05FFC 		j	.L52
 215              	.L74:
 216              	 #APP
 217              	# 162 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 218              		ebreak
 219              	# 0 "" 2
 220              	 #NO_APP
 221 0064 E39E05FA 		bne	a1,zero,.L52
 222 0068 6FF01FFF 		j	.L75
 223              	.L76:
 224 006c 13040500 		mv	s0,a0
 225 0070 03250500 		lw	a0,0(a0)
 226 0074 93090600 		mv	s3,a2
 227 0078 13890500 		mv	s2,a1
 228 007c 13050501 		addi	a0,a0,16
 229 0080 97000000 		call	HW_get_8bit_reg
 229      E7800000 
 230 0088 13751500 		andi	a0,a0,1
 231 008c E30405FA 		beq	a0,zero,.L54
 232 0090 93040000 		li	s1,0
 233 0094 6F008000 		j	.L56
 234              	.L77:
 235 0098 E38099FA 		beq	s3,s1,.L50
 236              	.L56:
 237 009c B3079900 		add	a5,s2,s1
 238 00a0 83C50700 		lbu	a1,0(a5)
 239 00a4 03250400 		lw	a0,0(s0)
 240 00a8 93841400 		addi	s1,s1,1
 241 00ac 97000000 		call	HW_set_8bit_reg
 241      E7800000 
 242 00b4 03250400 		lw	a0,0(s0)
 243 00b8 13050501 		addi	a0,a0,16
 244 00bc 97000000 		call	HW_get_8bit_reg
 244      E7800000 
 245 00c4 13751500 		andi	a0,a0,1
 246 00c8 E31805FC 		bne	a0,zero,.L77
 247 00cc 6FF0DFF6 		j	.L50
 249              		.section	.text.UART_get_rx,"ax",@progbits
 250              		.align	2
 251              		.globl	UART_get_rx
 253              	UART_get_rx:
 254 0000 130101FE 		addi	sp,sp,-32
 255 0004 232E1100 		sw	ra,28(sp)
 256 0008 232C8100 		sw	s0,24(sp)
 257 000c 232A9100 		sw	s1,20(sp)
 258 0010 23282101 		sw	s2,16(sp)
 259 0014 23263101 		sw	s3,12(sp)
 260 0018 63040504 		beq	a0,zero,.L102
 261 001c 638E0502 		beq	a1,zero,.L103
 262              	.L80:
 263 0020 63140600 		bne	a2,zero,.L81
 264              	 #APP
 265              	# 206 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 166              	    /* Fill the UART's Tx FIFO until the FIFO is full or the complete input 
 167              	     * buffer has been written. */
 168              	    if( (this_uart != NULL_INSTANCE) &&
 169              	        (tx_buffer != NULL_BUFFER)   &&
 170              	        (tx_size > 0u) )
 171              	    {
 172              	        tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &
 173              	                                                      STATUS_TXRDY_MASK;
 174              	        if ( tx_ready )
 175              	        {
 176              	            do {
 177              	                HAL_set_8bit_reg( this_uart->base_address, TXDATA,
 178              	                                  (uint_fast8_t)tx_buffer[size_sent] );
 179              	                size_sent++;
 180              	                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &
 181              	                                                              STATUS_TXRDY_MASK;
 182              	            } while ( (tx_ready) && ( size_sent < tx_size ) );
 183              	        }
 184              	    }    
 185              	    return size_sent;
 186              	}
 187              	
 188              	/***************************************************************************//**
 189              	 * UART_get_rx()
 190              	 * See "core_uart_apb.h" for details of how to use this function.
 191              	 */
 192              	size_t
 193              	UART_get_rx
 194              	(
 195              	    UART_instance_t * this_uart,
 196              	    uint8_t * rx_buffer,
 197              	    size_t buff_size
 198              	)
 199              	{
 200              	    uint8_t new_status;
 201              	    uint8_t rx_full;
 202              	    size_t rx_idx = 0u;
 203              	    
 204              	    HAL_ASSERT( this_uart != NULL_INSTANCE )
 205              	    HAL_ASSERT( rx_buffer != NULL_BUFFER )
 206 0024 73001000 	    HAL_ASSERT( buff_size > 0 )
 207              	      
 266              		ebreak
 267              	# 0 "" 2
 268              	 #NO_APP
 269              	.L81:
 270 0028 63060500 		beq	a0,zero,.L82
 271 002c 63840500 		beq	a1,zero,.L82
 272 0030 631E0602 		bne	a2,zero,.L104
 273              	.L82:
 274 0034 93040000 		li	s1,0
 275              	.L78:
 276 0038 8320C101 		lw	ra,28(sp)
 277 003c 03248101 		lw	s0,24(sp)
 278 0040 13850400 		mv	a0,s1
 279 0044 03290101 		lw	s2,16(sp)
 280 0048 83244101 		lw	s1,20(sp)
 281 004c 8329C100 		lw	s3,12(sp)
 282 0050 13010102 		addi	sp,sp,32
 283 0054 67800000 		jr	ra
 284              	.L103:
 285              	 #APP
 286              	# 205 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 287              		ebreak
 288              	# 0 "" 2
 289              	 #NO_APP
 290 005c 6FF05FFC 		j	.L80
 291              	.L102:
 292              	 #APP
 293              	# 204 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 294              		ebreak
 295              	# 0 "" 2
 296              	 #NO_APP
 297 0064 E39E05FA 		bne	a1,zero,.L80
 298 0068 6FF01FFF 		j	.L103
 299              	.L104:
 300 006c 13040500 		mv	s0,a0
 301 0070 03250500 		lw	a0,0(a0)
 302 0074 93090600 		mv	s3,a2
 303 0078 13890500 		mv	s2,a1
 304 007c 13050501 		addi	a0,a0,16
 305 0080 97000000 		call	HW_get_8bit_reg
 305      E7800000 
 306 0088 03474400 		lbu	a4,4(s0)
 307 008c 93772500 		andi	a5,a0,2
 308 0090 3365E500 		or	a0,a0,a4
 309 0094 2302A400 		sb	a0,4(s0)
 310 0098 E38E07F8 		beq	a5,zero,.L82
 311 009c 93040000 		li	s1,0
 312 00a0 6F008000 		j	.L84
 313              	.L105:
 314 00a4 E38A99F8 		beq	s3,s1,.L78
 315              	.L84:
 316 00a8 03250400 		lw	a0,0(s0)
 317 00ac 13054500 		addi	a0,a0,4
 318 00b0 97000000 		call	HW_get_8bit_reg
 318      E7800000 
 319 00b8 B3079900 		add	a5,s2,s1
 320 00bc 2380A700 		sb	a0,0(a5)
 321 00c0 03250400 		lw	a0,0(s0)
 322 00c4 93841400 		addi	s1,s1,1
 323 00c8 13050501 		addi	a0,a0,16
 324 00cc 97000000 		call	HW_get_8bit_reg
 324      E7800000 
 325 00d4 03474400 		lbu	a4,4(s0)
 326 00d8 93772500 		andi	a5,a0,2
 327 00dc 3365E500 		or	a0,a0,a4
 328 00e0 2302A400 		sb	a0,4(s0)
 329 00e4 E39007FC 		bne	a5,zero,.L105
 330 00e8 6FF01FF5 		j	.L78
 332              		.section	.text.UART_polled_tx_string,"ax",@progbits
 333              		.align	2
 334              		.globl	UART_polled_tx_string
 336              	UART_polled_tx_string:
 337 0000 130101FF 		addi	sp,sp,-16
 338 0004 23229100 		sw	s1,4(sp)
 339 0008 23261100 		sw	ra,12(sp)
 340 000c 23248100 		sw	s0,8(sp)
 341 0010 93840500 		mv	s1,a1
 342 0014 630E0504 		beq	a0,zero,.L123
 343 0018 63800506 		beq	a1,zero,.L112
 344 001c 83C70400 		lbu	a5,0(s1)
 345 0020 13040500 		mv	s0,a0
 346 0024 638C0702 		beq	a5,zero,.L106
 347              	.L110:
 348 0028 03250400 		lw	a0,0(s0)
 349 002c 13050501 		addi	a0,a0,16
 350 0030 97000000 		call	HW_get_8bit_reg
 350      E7800000 
 351 0038 13751500 		andi	a0,a0,1
 352 003c E30605FE 		beq	a0,zero,.L110
 353 0040 83C50400 		lbu	a1,0(s1)
 354 0044 03250400 		lw	a0,0(s0)
 355 0048 93841400 		addi	s1,s1,1
 356 004c 97000000 		call	HW_set_8bit_reg
 356      E7800000 
 357 0054 83C70400 		lbu	a5,0(s1)
 358 0058 E39807FC 		bne	a5,zero,.L110
 359              	.L106:
 360 005c 8320C100 		lw	ra,12(sp)
 361 0060 03248100 		lw	s0,8(sp)
 362 0064 83244100 		lw	s1,4(sp)
 363 0068 13010101 		addi	sp,sp,16
 364 006c 67800000 		jr	ra
 365              	.L123:
 366              	 #APP
 367              	# 243 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 208              	    if( (this_uart != NULL_INSTANCE) &&
 209              	        (rx_buffer != NULL_BUFFER)   &&
 210              	        (buff_size > 0u) )
 211              	    {
 212              	        rx_idx = 0u;
 213              	        new_status = HAL_get_8bit_reg( this_uart->base_address, STATUS );
 214              	        this_uart->status |= new_status;
 215              	        rx_full = new_status & STATUS_RXFULL_MASK;
 216              	        while ( ( rx_full ) && ( rx_idx < buff_size ) )
 217              	        {
 218              	            rx_buffer[rx_idx] = HAL_get_8bit_reg( this_uart->base_address,
 219              	                                                  RXDATA );
 220              	            rx_idx++;
 221              	            new_status = HAL_get_8bit_reg( this_uart->base_address, STATUS );
 222              	            this_uart->status |= new_status;
 223              	            rx_full = new_status & STATUS_RXFULL_MASK;
 224              	        }
 225              	    }
 226              	    return rx_idx;
 227              	}
 228              	
 229              	/***************************************************************************//**
 230              	 * UART_polled_tx_string()
 231              	 * See "core_uart_apb.h" for details of how to use this function.
 232              	 */
 233              	void 
 234              	UART_polled_tx_string
 235              	( 
 236              	    UART_instance_t * this_uart, 
 237              	    const uint8_t * p_sz_string
 238              	)
 239              	{
 240              	    uint32_t char_idx;
 241              	    uint8_t tx_ready;
 242              	
 243 0070 73001000 	    HAL_ASSERT( this_uart != NULL_INSTANCE )
 244              	    HAL_ASSERT( p_sz_string != NULL_BUFFER )
 368              		ebreak
 369              	# 0 "" 2
 370              	 #NO_APP
 371 0074 E39405FE 		bne	a1,zero,.L106
 372              	.L112:
 373              	 #APP
 374              	# 244 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 245              	    
 375              		ebreak
 376              	# 0 "" 2
 377              	 #NO_APP
 378 007c 8320C100 		lw	ra,12(sp)
 379 0080 03248100 		lw	s0,8(sp)
 380 0084 83244100 		lw	s1,4(sp)
 381 0088 13010101 		addi	sp,sp,16
 382 008c 67800000 		jr	ra
 384              		.section	.text.UART_get_rx_status,"ax",@progbits
 385              		.align	2
 386              		.globl	UART_get_rx_status
 388              	UART_get_rx_status:
 389 0000 630C0500 		beq	a0,zero,.L128
 390 0004 83474500 		lbu	a5,4(a0)
 391 0008 23020500 		sb	zero,4(a0)
 392 000c 13D52740 		srai	a0,a5,2
 393 0010 13757500 		andi	a0,a0,7
 394 0014 67800000 		ret
 395              	.L128:
 396              	 #APP
 397              	# 276 "../drivers/CoreUARTapb/core_uart_apb.c" 1
 246              	    if( ( this_uart != NULL_INSTANCE ) && ( p_sz_string != NULL_BUFFER ) )
 247              	    {
 248              	        char_idx = 0U;
 249              	        while( 0U != p_sz_string[char_idx] )
 250              	        {
 251              	            /* Wait for UART to become ready to transmit. */
 252              	            do {
 253              	                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &
 254              	                                                              STATUS_TXRDY_MASK;
 255              	            } while ( !tx_ready );
 256              	            /* Send next character in the buffer. */
 257              	            HAL_set_8bit_reg( this_uart->base_address, TXDATA,
 258              	                              (uint_fast8_t)p_sz_string[char_idx] );
 259              	            char_idx++;
 260              	        }
 261              	    }
 262              	}
 263              	
 264              	/***************************************************************************//**
 265              	 * UART_get_rx_status()
 266              	 * See "core_uart_apb.h" for details of how to use this function.
 267              	 */
 268              	uint8_t
 269              	UART_get_rx_status
 270              	(
 271              	    UART_instance_t * this_uart
 272              	)
 273              	{
 274              	    uint8_t status = UART_APB_INVALID_PARAM;
 275              	
 276 0018 73001000 	    HAL_ASSERT( this_uart != NULL_INSTANCE )
 277              	    /*
 398              		ebreak
 399              	# 0 "" 2
 400              	 #NO_APP
 401 001c 1305F00F 		li	a0,255
 402 0020 67800000 		ret
 404              		.ident	"GCC: (xPack GNU RISC-V Embedded GCC (Microsemi SoftConsole build), 64-bit) 8.3.0"
DEFINED SYMBOLS
                            *ABS*:0000000000000000 core_uart_apb.c
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:11     .text.UART_init:0000000000000000 UART_init
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:116    .text.UART_send:0000000000000000 UART_send
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:177    .text.UART_fill_tx_fifo:0000000000000000 UART_fill_tx_fifo
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:253    .text.UART_get_rx:0000000000000000 UART_get_rx
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:336    .text.UART_polled_tx_string:0000000000000000 UART_polled_tx_string
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:388    .text.UART_get_rx_status:0000000000000000 UART_get_rx_status
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:37     .text.UART_init:0000000000000034 .L22
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:21     .text.UART_init:0000000000000010 .L3
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:29     .text.UART_init:000000000000001c .L4
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:35     .text.UART_init:0000000000000030 .L18
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:44     .text.UART_init:000000000000003c .L23
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:13     .text.UART_init:0000000000000004 .L2
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:84     .text.UART_init:00000000000000d8 .L6
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:96     .text.UART_init:00000000000000f4 .L7
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:92     .text.UART_init:00000000000000e4 .L24
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:162    .text.UART_send:000000000000008c .L48
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:155    .text.UART_send:0000000000000084 .L49
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:126    .text.UART_send:0000000000000010 .L28
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:170    .text.UART_send:0000000000000098 .L45
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:138    .text.UART_send:000000000000003c .L30
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:119    .text.UART_send:0000000000000008 .L27
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:215    .text.UART_fill_tx_fifo:0000000000000060 .L74
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:208    .text.UART_fill_tx_fifo:0000000000000058 .L75
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:193    .text.UART_fill_tx_fifo:0000000000000028 .L53
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:197    .text.UART_fill_tx_fifo:0000000000000034 .L54
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:223    .text.UART_fill_tx_fifo:000000000000006c .L76
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:186    .text.UART_fill_tx_fifo:0000000000000020 .L52
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:236    .text.UART_fill_tx_fifo:000000000000009c .L56
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:199    .text.UART_fill_tx_fifo:0000000000000038 .L50
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:234    .text.UART_fill_tx_fifo:0000000000000098 .L77
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:291    .text.UART_get_rx:0000000000000060 .L102
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:284    .text.UART_get_rx:0000000000000058 .L103
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:269    .text.UART_get_rx:0000000000000028 .L81
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:273    .text.UART_get_rx:0000000000000034 .L82
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:299    .text.UART_get_rx:000000000000006c .L104
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:262    .text.UART_get_rx:0000000000000020 .L80
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:315    .text.UART_get_rx:00000000000000a8 .L84
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:275    .text.UART_get_rx:0000000000000038 .L78
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:313    .text.UART_get_rx:00000000000000a4 .L105
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:365    .text.UART_polled_tx_string:0000000000000070 .L123
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:372    .text.UART_polled_tx_string:0000000000000078 .L112
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:359    .text.UART_polled_tx_string:000000000000005c .L106
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:347    .text.UART_polled_tx_string:0000000000000028 .L110
C:\Users\i68629\AppData\Local\Temp\ccZI3l8X.s:395    .text.UART_get_rx_status:0000000000000018 .L128

UNDEFINED SYMBOLS
HW_set_8bit_reg
HW_get_8bit_reg
