229 lines
6.5 KiB
NASM
229 lines
6.5 KiB
NASM
# riscv assembly raspberry pico2 rp2350
|
|
# program compinteger.s
|
|
# connexion putty com3
|
|
/*********************************************/
|
|
/* CONSTANTES */
|
|
/********************************************/
|
|
/* for this file see risc-v task include a file */
|
|
.include "../../constantesRiscv.inc"
|
|
|
|
.equ BUFFERSIZE, 80
|
|
/*******************************************/
|
|
/* INITIALED DATAS */
|
|
/*******************************************/
|
|
.data
|
|
szMessStart: .asciz "Program riscv start.\r\n"
|
|
szMessEnd: .asciz "\nProgram end OK.\r\n"
|
|
szCariageReturn: .asciz "\r\n"
|
|
szMessNumber1: .asciz "Enter an integer : "
|
|
szMessNumber2: .asciz "Enter other integer : "
|
|
szMessErreurBuf: .asciz "Buffer too small !!"
|
|
szMessErrDep: .asciz "Number too large for 32 bits\r\n"
|
|
szMessEqual: .asciz "number 1 equal number 2."
|
|
szMessLower: .asciz "number 1 smaller number 2."
|
|
szMessGreater: .asciz "number 1 greater number 2."
|
|
.align 2
|
|
|
|
|
|
/*******************************************/
|
|
/* UNINITIALED DATA */
|
|
/*******************************************/
|
|
.bss
|
|
.align 2
|
|
sConvArea: .skip 24
|
|
sBuffer: .skip BUFFERSIZE
|
|
/**********************************************/
|
|
/* SECTION CODE */
|
|
/**********************************************/
|
|
.text
|
|
.global main
|
|
|
|
main:
|
|
call stdio_init_all # général init
|
|
1: # start loop connexion
|
|
li a0,0 # raz argument register
|
|
call tud_cdc_n_connected # waiting for USB connection
|
|
beqz a0,1b # return code = zero ?
|
|
|
|
la a0,szMessStart # message address
|
|
call writeString # display message
|
|
2:
|
|
la a0,szMessNumber1
|
|
call writeString # display message
|
|
la a0,sBuffer
|
|
li a1,BUFFERSIZE
|
|
call readString # read keyboard string
|
|
la a0,sBuffer
|
|
call conversionAtoD # conversion to decimal
|
|
mv s0,a0
|
|
call displayresult
|
|
|
|
la a0,szMessNumber2 # number 2
|
|
call writeString
|
|
la a0,sBuffer
|
|
li a1,BUFFERSIZE
|
|
call readString # read keyboard string
|
|
la a0,sBuffer
|
|
call conversionAtoD # conversion to decimal
|
|
mv s1,a0
|
|
call displayresult
|
|
blt s0,s1,4f # compare number 1 number 2
|
|
bgt s0,s1,3f
|
|
la a0,szMessEqual
|
|
call writeString
|
|
j 20f
|
|
3:
|
|
la a0,szMessGreater
|
|
call writeString
|
|
j 20f
|
|
4:
|
|
la a0,szMessLower
|
|
call writeString
|
|
20:
|
|
la a0,szCariageReturn
|
|
call writeString
|
|
j 2b # loop other compare number
|
|
|
|
la a0,szMessEnd
|
|
call writeString
|
|
call getchar
|
|
100: # final loop
|
|
j 100b
|
|
/***************************************************/
|
|
/* number display */
|
|
/***************************************************/
|
|
# a0 contains number
|
|
# a0 return length
|
|
displayresult:
|
|
addi sp, sp, -4 # reserve stack
|
|
sw ra, 0(sp) # save registers
|
|
la a1,sConvArea
|
|
call conversion10S # call decimal conversion
|
|
la a0,sConvArea # display result message
|
|
call writeString
|
|
la a0,szCariageReturn
|
|
call writeString
|
|
lw ra, 0(sp)
|
|
addi sp, sp, 4
|
|
ret
|
|
|
|
/**************************************************/
|
|
/* read keyboard string */
|
|
/**************************************************/
|
|
/* a0 buffer address */
|
|
/* a1 buffer size */
|
|
readString: # INFO: readString
|
|
addi sp, sp, -16
|
|
sw ra, 0(sp)
|
|
sw s0, 4(sp)
|
|
sw s1, 8(sp)
|
|
sw s2, 12(sp)
|
|
mv s0,a0 # buffer address
|
|
li s1,0
|
|
mv s2,a1
|
|
1:
|
|
li a0,100
|
|
call getchar # read a character
|
|
beqz a0,2f # end ?
|
|
li a1,0xD
|
|
beq a0,a1,2f # return char ?
|
|
add t1,s0,s1
|
|
sb a0,(t1) # store char in buffer
|
|
addi s1,s1,1 # next char
|
|
bge s1,s2,99f
|
|
call putchar # display char
|
|
j 1b # and loop
|
|
|
|
2:
|
|
add s1,s0,s1
|
|
sb x0,(s1) # zero final
|
|
|
|
li a0,0xA
|
|
call putchar
|
|
li a0,0xD
|
|
call putchar
|
|
mv a0,s1 # return counter character
|
|
j 100f
|
|
99: # error
|
|
la a0,szMessErreurBuf
|
|
call writeString
|
|
li a0,-1
|
|
100:
|
|
lw ra, 0(sp)
|
|
lw s0, 4(sp)
|
|
lw s1, 8(sp)
|
|
lw s2, 12(sp)
|
|
addi sp, sp, 16
|
|
ret
|
|
/******************************************************************/
|
|
/* String conversion numeric to register */
|
|
/******************************************************************/
|
|
.equ NUMMAXI, 1073741824
|
|
/* a0 string address */
|
|
/* a0 return value */
|
|
conversionAtoD: # INFO: conversionAtoD
|
|
addi sp, sp, -4 # save registres
|
|
sw ra, 0(sp)
|
|
li t2,10 # factor
|
|
li t3,0 # counter
|
|
mv t4,a0 # string address
|
|
li t1,0 # default positive sign
|
|
li a0,0 # init to 0
|
|
|
|
1: # loop removing leading spaces
|
|
add t0,t4,t3
|
|
lbu t5,(t0) # load a byte
|
|
beqz t5,100f # string end -> end
|
|
li t0,0x0A #
|
|
beq t5,t0,100f # string end -> end
|
|
li t0,' ' #
|
|
bne t5,t0,2f # no space ?
|
|
addi t3,t3,1 # yes --> loop next position
|
|
j 1b
|
|
|
|
2:
|
|
li t0,'-' # first byte is - ?
|
|
bne t5,t0,21f
|
|
li t1,1 # negative sign
|
|
j 4f # next position
|
|
21:
|
|
li t0,'+' # first byte is + ?
|
|
beq t5,t0,4f # yes -> next position
|
|
3: # debut de boucle de traitement des chiffres
|
|
li t0,'0'
|
|
blt t5,t0,4f # byte is not numeric
|
|
li t0,'9'
|
|
bgt t5,t0,4f # byte is not numeric
|
|
addi t5,t5,-48
|
|
li t0,NUMMAXI
|
|
bgt a0,t0,99f # number maxi ?
|
|
|
|
mul a0,t2,a0 # multiply by factor 10
|
|
add a0,a0,t5 # and add new byte
|
|
|
|
4:
|
|
addi t3,t3,1 # next position
|
|
add t0,t4,t3
|
|
lbu t5,(t0) # load byte
|
|
beq t5,x0,5f # string end -> end
|
|
li t0,0x0A
|
|
beq t5,t0,5f # string end -> end
|
|
j 3b # or loop
|
|
5:
|
|
beqz t1,100f # positive sign ?
|
|
neg a0,a0 # no
|
|
j 100f
|
|
99: # overflow error
|
|
la a0,szMessErrDep
|
|
call writeString
|
|
li a0,0 # on error return zero
|
|
100:
|
|
lw ra, 0(sp)
|
|
addi sp, sp, 4
|
|
ret
|
|
|
|
/************************************/
|
|
/* file include Fonctions */
|
|
/***********************************/
|
|
/* for this file see risc-v task include a file */
|
|
.include "../../includeFunctions.s"
|