[AC2] Aula01 Addicionals
Signed-off-by: TiagoRG <tiago.rgarcia@ua.pt>
This commit is contained in:
parent
ec81a6b4d9
commit
b0f6d15cac
|
@ -0,0 +1,39 @@
|
|||
#include <detpic32.h>
|
||||
|
||||
#define UP 1
|
||||
#define DOWN 0
|
||||
|
||||
void wait(int);
|
||||
|
||||
int main(void) {
|
||||
int state = 0;
|
||||
int cnt = 0;
|
||||
char c;
|
||||
do {
|
||||
putChar('\r'); // Carriage return character
|
||||
printInt(cnt, 10 | 3 << 16); // 0x0003000A: decimal w/ 3 digits
|
||||
putChar('\t'); // Tab character
|
||||
printInt(cnt, 2 | 8 << 16); // 0x00080002: binary w/ 8 bits
|
||||
|
||||
wait(5); // wait 0.5s
|
||||
|
||||
c = inkey();
|
||||
if (c == '+')
|
||||
state = UP;
|
||||
if (c == '-')
|
||||
state = DOWN;
|
||||
if (c == 'S')
|
||||
while (inkey() != 'R');
|
||||
|
||||
if (state == UP)
|
||||
cnt = (cnt + 1) & 0xFF; // Up counter MOD 256
|
||||
else
|
||||
cnt = (cnt - 1) & 0xFF; // Down counter MOD 256
|
||||
} while (c != 'q');
|
||||
return 0;
|
||||
}
|
||||
|
||||
void wait(int ts) {
|
||||
int i;
|
||||
for (i = 0; i < 515000 * ts; i++); // wait approximately ts/10 seconds
|
||||
}
|
|
@ -0,0 +1,107 @@
|
|||
.equ INKEY, 1
|
||||
.equ GETCHAR, 2
|
||||
.equ PUTCHAR, 3
|
||||
.equ READ_INT, 4
|
||||
.equ READ_INT10, 5
|
||||
.equ PRINT_INT, 6
|
||||
.equ PRINT_INT10, 7
|
||||
.equ PRINT_STR, 8
|
||||
.equ READ_STR, 9
|
||||
.equ EXIT, 10
|
||||
.equ READ_CORE_TIMER, 11
|
||||
.equ RESET_CORE_TIMER, 12
|
||||
|
||||
.equ UP, 1
|
||||
.equ DOWN, 0
|
||||
|
||||
.data
|
||||
.text
|
||||
.globl main
|
||||
|
||||
# Mapa de registos
|
||||
# $t0 → state
|
||||
# $t1 → cnt
|
||||
# $t2 → c
|
||||
|
||||
main:
|
||||
li $t0, 0
|
||||
li $t1, 0
|
||||
|
||||
do:
|
||||
li $a0, '\r'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
move $a0, $t1
|
||||
li $a1, 3
|
||||
sll $a1, $a1, 16
|
||||
ori $a1, $a1, 10
|
||||
li $v0, PRINT_INT
|
||||
syscall
|
||||
|
||||
li $a0, '\t'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
move $a0, $t1
|
||||
li $a1, 8
|
||||
sll $a1, $a1, 16
|
||||
ori $a1, $a1, 2
|
||||
li $v0, PRINT_INT
|
||||
syscall
|
||||
|
||||
addi $sp, $sp, -16
|
||||
sw $ra, 0($sp)
|
||||
sw $t0, 4($sp)
|
||||
sw $t1, 8($sp)
|
||||
sw $t2, 12($sp)
|
||||
li $a0, 5
|
||||
jal wait
|
||||
lw $ra, 0($sp)
|
||||
lw $t0, 4($sp)
|
||||
lw $t1, 8($sp)
|
||||
lw $t2, 12($sp)
|
||||
addi $sp, $sp, 16
|
||||
|
||||
li $v0, INKEY
|
||||
syscall
|
||||
move $t2, $v0
|
||||
|
||||
beq $t2, '+', if_plus
|
||||
beq $t2, '-', if_minus
|
||||
beq $t2, 'S', if_stop
|
||||
j if
|
||||
if_plus:
|
||||
li $t0, UP
|
||||
j if
|
||||
if_minus:
|
||||
li $t0, DOWN
|
||||
j if
|
||||
if_stop:
|
||||
li $v0, INKEY
|
||||
syscall
|
||||
move $t2, $v0
|
||||
bne $t2, 'R', if_stop
|
||||
|
||||
if:
|
||||
bne $t0, UP, else
|
||||
addi $t1, $t1, 1
|
||||
andi $t1, $t1, 0xFF
|
||||
j endif
|
||||
else:
|
||||
addi $t1, $t1, -1
|
||||
andi $t1, $t1, 0xFF
|
||||
endif:
|
||||
bne $t2, 'q', do
|
||||
jr $ra
|
||||
|
||||
|
||||
wait:
|
||||
li $t0, 0
|
||||
mul $t1, $a0, 515000
|
||||
wait_loop:
|
||||
bge $t0, $t1, wait_return
|
||||
addi $t0, $t0, 1
|
||||
j wait_loop
|
||||
wait_return:
|
||||
jr $ra
|
|
@ -0,0 +1,68 @@
|
|||
#include <detpic32.h>
|
||||
|
||||
#define SIZE 20
|
||||
|
||||
char *strcat(char *, char *);
|
||||
char *strcpy(char *, char *);
|
||||
int strlen(char *);
|
||||
int strcmp(char *str1, char *str2);
|
||||
|
||||
int main(void) {
|
||||
static char str1[SIZE + 1];
|
||||
static char str2[SIZE + 1];
|
||||
static char str3[2 * SIZE + 1];
|
||||
|
||||
printStr("Introduza 2 strings:\n");
|
||||
readStr(str1, SIZE);
|
||||
putChar('\n');
|
||||
readStr(str2, SIZE);
|
||||
putChar('\n');
|
||||
printStr("Resultados:\n");
|
||||
printStr("Str1 len: ");
|
||||
printInt(strlen(str1), 10);
|
||||
putChar('\n');
|
||||
printStr("Str2 len: ");
|
||||
printInt(strlen(str2), 10);
|
||||
putChar('\n');
|
||||
strcpy(str3, str1);
|
||||
printStr("Str3 + Str2: ");
|
||||
printStr(strcat(str3, str2));
|
||||
putChar('\n');
|
||||
printStr("Str1 == Str2: ");
|
||||
printInt10(strcmp(str1, str2));
|
||||
putChar('\n');
|
||||
return 0;
|
||||
}
|
||||
// Returns the length of string "str" (excluding the null character)
|
||||
int strlen(char *str) {
|
||||
int len;
|
||||
for (len = 0; *str != '\0'; len++, str++);
|
||||
return len;
|
||||
}
|
||||
// Copy the string pointed by "src" (including the null character) to
|
||||
// destination (pointed by "dst")
|
||||
char *strcpy(char *dst, char *src) {
|
||||
char *p = dst;
|
||||
for (; (*dst = *src) != '\0'; dst++, src++);
|
||||
return p;
|
||||
}
|
||||
// Concatenates "dst" and "src" strings
|
||||
// The result is stored in the "dst" string
|
||||
char *strcat(char *dst, char *src) {
|
||||
char *p = dst;
|
||||
for (; *dst != '\0'; dst++);
|
||||
strcpy(dst, src);
|
||||
return p;
|
||||
}
|
||||
|
||||
// Compares two strings, character by character
|
||||
// Returned value is:
|
||||
// < 0 string "str1" is "less than" string "str2" (first
|
||||
// non-matching character in str1 is lower, in ASCII, than that of str2)
|
||||
// = 0 string "str1" is equal to string "str2"
|
||||
// > 0 string "str1" is "greater than" string "str2" (first
|
||||
// non-matching character in str1 is greater, in ASCII, than that of str2)
|
||||
int strcmp(char *str1, char *str2) {
|
||||
for (; (*str1 == *str2) && (*str1 != '\0'); str1++, str2++);
|
||||
return (*str1 - *str2);
|
||||
}
|
|
@ -0,0 +1,223 @@
|
|||
.equ INKEY, 1
|
||||
.equ GETCHAR, 2
|
||||
.equ PUTCHAR, 3
|
||||
.equ READ_INT, 4
|
||||
.equ READ_INT10, 5
|
||||
.equ PRINT_INT, 6
|
||||
.equ PRINT_INT10, 7
|
||||
.equ PRINT_STR, 8
|
||||
.equ READ_STR, 9
|
||||
.equ EXIT, 10
|
||||
.equ READ_CORE_TIMER, 11
|
||||
.equ RESET_CORE_TIMER, 12
|
||||
|
||||
.equ SIZE, 20
|
||||
|
||||
.data
|
||||
|
||||
input: .asciiz "Introduza 2 strings:\n"
|
||||
r_str: .asciiz "Resultados:\n"
|
||||
res1: .asciiz "Str1 len: "
|
||||
res2: .asciiz "Str2 len: "
|
||||
res3: .asciiz "Str3 + Str2: "
|
||||
res4: .asciiz "Str1 == Str2: "
|
||||
|
||||
str1: .space 21
|
||||
str2: .space 21
|
||||
str3: .space 41
|
||||
|
||||
.text
|
||||
.globl main
|
||||
|
||||
main:
|
||||
move $s0, $ra # Save $ra
|
||||
|
||||
la $a0, input
|
||||
li $v0, PRINT_STR
|
||||
syscall
|
||||
|
||||
la $a0, str1
|
||||
li $a1, SIZE
|
||||
li $v0, READ_STR
|
||||
syscall
|
||||
|
||||
li $a0, '\n'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
la $a0, str2
|
||||
li $a1, SIZE
|
||||
li $v0, READ_STR
|
||||
syscall
|
||||
|
||||
li $a0, '\n'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
la $a0, r_str
|
||||
li $v0, PRINT_STR
|
||||
syscall
|
||||
|
||||
la $a0, res1
|
||||
li $v0, PRINT_STR
|
||||
syscall
|
||||
|
||||
la $a0, str1
|
||||
jal strlen
|
||||
move $a0, $v0
|
||||
li $a1, 10
|
||||
li $v0, PRINT_INT
|
||||
syscall
|
||||
|
||||
li $a0, '\n'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
la $a0, res2
|
||||
li $v0, PRINT_STR
|
||||
syscall
|
||||
|
||||
la $a0, str2
|
||||
jal strlen
|
||||
move $a0, $v0
|
||||
li $a1, 10
|
||||
li $v0, PRINT_INT
|
||||
syscall
|
||||
|
||||
li $a0, '\n'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
la $a0, str3
|
||||
la $a1, str1
|
||||
jal strcpy
|
||||
|
||||
la $a0, res3
|
||||
li $v0, PRINT_STR
|
||||
syscall
|
||||
|
||||
la $a0, str3
|
||||
la $a1, str2
|
||||
jal strcat
|
||||
move $a0, $v0
|
||||
li $v0, PRINT_STR
|
||||
syscall
|
||||
|
||||
li $a0, '\n'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
la $a0, res4
|
||||
li $v0, PRINT_STR
|
||||
syscall
|
||||
|
||||
la $a0, str1
|
||||
la $a1, str2
|
||||
jal strcmp
|
||||
move $a0, $v0
|
||||
li $v0, PRINT_INT10
|
||||
syscall
|
||||
|
||||
li $a0, '\n'
|
||||
li $v0, PUTCHAR
|
||||
syscall
|
||||
|
||||
jr $s0
|
||||
|
||||
|
||||
|
||||
#----------------------------------------------
|
||||
# STRLEN
|
||||
#----------------------------------------------
|
||||
# Mapa de registos
|
||||
# $a0 → str
|
||||
# $t0 → len
|
||||
# $t1 → *str
|
||||
strlen:
|
||||
li $t0, 0
|
||||
strlen_loop:
|
||||
lb $t1, 0($a0)
|
||||
beq $t1, 0, strlen_return
|
||||
addiu $t0, $t0, 1
|
||||
addiu $a0, $a0, 1
|
||||
j strlen_loop
|
||||
strlen_return:
|
||||
move $v0, $t0
|
||||
jr $ra
|
||||
#----------------------------------------------
|
||||
|
||||
#----------------------------------------------
|
||||
# STRCPY
|
||||
#----------------------------------------------
|
||||
# Mapa de registos
|
||||
# $a0 → dst
|
||||
# $a1 → src
|
||||
# $t0 → p
|
||||
# $t1 → *src
|
||||
strcpy:
|
||||
move $t0, $a0
|
||||
strcpy_loop:
|
||||
lb $t1, 0($a1)
|
||||
sb $t1, 0($a0)
|
||||
beq $t1, 0, strcpy_return
|
||||
addiu $a0, $a0, 1
|
||||
addiu $a1, $a1, 1
|
||||
j strcpy_loop
|
||||
strcpy_return:
|
||||
move $v0, $t0
|
||||
jr $ra
|
||||
#----------------------------------------------
|
||||
|
||||
#----------------------------------------------
|
||||
# STRCAT
|
||||
#----------------------------------------------
|
||||
# Mapa de registos
|
||||
# $a0 → dst
|
||||
# $a1 → src
|
||||
# $t0 → p
|
||||
# $t1 → *dst
|
||||
strcat:
|
||||
move $t0, $a0
|
||||
strcat_loop:
|
||||
lb $t1, 0($a0)
|
||||
beq $t1, 0, strcat_return
|
||||
addiu $a0, $a0, 1
|
||||
j strcat_loop
|
||||
strcat_return:
|
||||
addiu $sp, $sp, -20
|
||||
sw $ra, 0($sp)
|
||||
sw $a0, 4($sp)
|
||||
sw $a1, 8($sp)
|
||||
sw $t0, 12($sp)
|
||||
sw $t1, 16($sp)
|
||||
jal strcpy
|
||||
lw $ra, 0($sp)
|
||||
lw $a0, 4($sp)
|
||||
lw $a1, 8($sp)
|
||||
lw $t0, 12($sp)
|
||||
lw $t1, 16($sp)
|
||||
addiu $sp, $sp, 20
|
||||
move $v0, $t0
|
||||
jr $ra
|
||||
#----------------------------------------------
|
||||
|
||||
#----------------------------------------------
|
||||
# STRCMP
|
||||
#----------------------------------------------
|
||||
# Mapa de registos
|
||||
# $a0 → str1
|
||||
# $a1 → str2
|
||||
# $t0 → *str1
|
||||
# $t1 → *str2
|
||||
strcmp:
|
||||
lb $t0, 0($a0)
|
||||
lb $t1, 0($a1)
|
||||
bne $t0, $t1, strcmp_return
|
||||
beq $t0, 0, strcmp_return
|
||||
addiu $a0, $a0, 1
|
||||
addiu $a1, $a1, 1
|
||||
j strcmp
|
||||
strcmp_return:
|
||||
sub $v0, $t0, $t1
|
||||
jr $ra
|
||||
#----------------------------------------------
|
Loading…
Reference in New Issue