Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #definicao do mapa de enderecamento de MMIO
- .eqv VGAADDRESSINI 0xFF000000
- .eqv VGAADDRESSFIM 0xFF012C00
- .eqv NUMLINHAS 240
- .eqv NUMCOLUNAS 320
- .eqv KDMMIO_Ctrl 0xFF100000
- .eqv KDMMIO_Data 0xFF200004
- .eqv Buffer0Teclado 0xFF200100
- .eqv Buffer1Teclado 0xFF200104
- .eqv TecladoxMouse 0xFF200110
- .eqv BufferMouse 0xFF200114
- .eqv AudioBase 0xFF200160
- .eqv AudioINL 0xFF200160
- .eqv AudioINR 0xFF200164
- .eqv AudioOUTL 0xFF200168
- .eqv AudioOUTR 0xFF20016C
- .eqv AudioCTRL1 0xFF200170
- .eqv AudioCTRL2 0xFF200174
- # Sintetizador - 2015/1
- .eqv NoteData 0xFF200178
- .eqv NoteClock 0xFF20017C
- .eqv NoteMelody 0xFF200180
- .eqv MusicTempo 0xFF200184
- .eqv MusicAddress 0xFF200188
- .eqv IrDA_CTRL 0xFF20 0500
- .eqv IrDA_RX 0xFF20 0504
- .eqv IrDA_TX 0xFF20 0508
- .eqv STOPWATCH 0xFF200510
- .eqv LFSR 0xFF200514
- .eqv KeyMap0 0xFF200520
- .eqv KeyMap1 0xFF200524
- .eqv KeyMap2 0xFF200528
- .eqv KeyMap3 0xFF20052C
- ######### Macro que verifica se eh a DE2 ###############
- .macro DE2(%salto)
- li t6, 0x10008000
- bne gp,t6,%salto
- .end_macro
- .data
- LabelTabChar:
- .word 0x00000000, 0x00000000, 0x10101010, 0x00100010, 0x00002828, 0x00000000, 0x28FE2828, 0x002828FE,
- 0x38503C10, 0x00107814, 0x10686400, 0x00004C2C, 0x28102818, 0x003A4446, 0x00001010, 0x00000000,
- 0x20201008, 0x00081020, 0x08081020, 0x00201008, 0x38549210, 0x00109254, 0xFE101010, 0x00101010,
- 0x00000000, 0x10081818, 0xFE000000, 0x00000000, 0x00000000, 0x18180000, 0x10080402, 0x00804020,
- 0x54444438, 0x00384444, 0x10103010, 0x00381010, 0x08044438, 0x007C2010, 0x18044438, 0x00384404,
- 0x7C482818, 0x001C0808, 0x7840407C, 0x00384404, 0x78404438, 0x00384444, 0x1008047C, 0x00202020,
- 0x38444438, 0x00384444, 0x3C444438, 0x00384404, 0x00181800, 0x00001818, 0x00181800, 0x10081818,
- 0x20100804, 0x00040810, 0x00FE0000, 0x000000FE, 0x04081020, 0x00201008, 0x08044438, 0x00100010,
- 0x545C4438, 0x0038405C, 0x7C444438, 0x00444444, 0x78444478, 0x00784444, 0x40404438, 0x00384440,
- 0x44444478, 0x00784444, 0x7840407C, 0x007C4040, 0x7C40407C, 0x00404040, 0x5C404438, 0x00384444,
- 0x7C444444, 0x00444444, 0x10101038, 0x00381010, 0x0808081C, 0x00304848, 0x70484444, 0x00444448,
- 0x20202020, 0x003C2020, 0x92AAC682, 0x00828282, 0x54546444, 0x0044444C, 0x44444438, 0x00384444,
- 0x38242438, 0x00202020, 0x44444438, 0x0C384444, 0x78444478, 0x00444850, 0x38404438, 0x00384404,
- 0x1010107C, 0x00101010, 0x44444444, 0x00384444, 0x28444444, 0x00101028, 0x54828282, 0x00282854,
- 0x10284444, 0x00444428, 0x10284444, 0x00101010, 0x1008047C, 0x007C4020, 0x20202038, 0x00382020,
- 0x10204080, 0x00020408, 0x08080838, 0x00380808, 0x00442810, 0x00000000, 0x00000000, 0xFE000000,
- 0x00000810, 0x00000000, 0x3C043800, 0x003A4444, 0x24382020, 0x00582424, 0x201C0000, 0x001C2020,
- 0x48380808, 0x00344848, 0x44380000, 0x0038407C, 0x70202418, 0x00202020, 0x443A0000, 0x38043C44,
- 0x64584040, 0x00444444, 0x10001000, 0x00101010, 0x10001000, 0x60101010, 0x28242020, 0x00242830,
- 0x08080818, 0x00080808, 0x49B60000, 0x00414149, 0x24580000, 0x00242424, 0x44380000, 0x00384444,
- 0x24580000, 0x20203824, 0x48340000, 0x08083848, 0x302C0000, 0x00202020, 0x201C0000, 0x00380418,
- 0x10381000, 0x00101010, 0x48480000, 0x00344848, 0x44440000, 0x00102844, 0x82820000, 0x0044AA92,
- 0x28440000, 0x00442810, 0x24240000, 0x38041C24, 0x043C0000, 0x003C1008, 0x2010100C, 0x000C1010,
- 0x10101010, 0x00101010, 0x04080830, 0x00300808, 0x92600000, 0x0000000C, 0x243C1818, 0xA55A7E3C,
- 0x99FF5A81, 0x99663CFF, 0x10280000, 0x00000028, 0x10081020, 0x00081020
- # scancode -> ascii
- LabelScanCode:
- # 0 1 2 3 4 5 6 7 8 9 A B C D E F
- .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # 00 a 0F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x31, 0x00, 0x00, 0x00, 0x7a, 0x73, 0x61, 0x77, 0x32, 0x00, # 10 a 1F
- 0x00, 0x63, 0x78, 0x64, 0x65, 0x34, 0x33, 0x00, 0x00, 0x20, 0x76, 0x66, 0x74, 0x72, 0x35, 0x00, # 20 a 2F 29 espaco => 20
- 0x00, 0x6e, 0x62, 0x68, 0x67, 0x79, 0x36, 0x00, 0x00, 0x00, 0x6d, 0x6a, 0x75, 0x37, 0x38, 0x00, # 30 a 3F
- 0x00, 0x2c, 0x6b, 0x69, 0x6f, 0x30, 0x39, 0x00, 0x00, 0x2e, 0x2f, 0x6c, 0x3b, 0x70, 0x2d, 0x00, # 40 a 4F
- 0x00, 0x00, 0x27, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x5b, 0x00, 0x5d, 0x00, 0x00, # 50 a 5F 5A enter => 0A (= ao Mars)
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x34, 0x37, 0x00, 0x00, 0x00, # 60 a 6F
- 0x30, 0x2e, 0x32, 0x35, 0x36, 0x38, 0x00, 0x00, 0x00, 0x2b, 0x33, 0x2d, 0x2a, 0x39, 0x00, 0x00, # 70 a 7F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 # 80 a 85
- # scancode -> ascii (com shift)
- LabelScanCodeShift:
- .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x21, 0x00, 0x00, 0x00, 0x5a, 0x53, 0x41, 0x57, 0x40, 0x00,
- 0x00, 0x43, 0x58, 0x44, 0x45, 0x24, 0x23, 0x00, 0x00, 0x00, 0x56, 0x46, 0x54, 0x52, 0x25, 0x00,
- 0x00, 0x4e, 0x42, 0x48, 0x47, 0x59, 0x5e, 0x00, 0x00, 0x00, 0x4d, 0x4a, 0x55, 0x26, 0x2a, 0x00,
- 0x00, 0x3c, 0x4b, 0x49, 0x4f, 0x29, 0x28, 0x00, 0x00, 0x3e, 0x3f, 0x4c, 0x3a, 0x50, 0x5f, 0x00,
- 0x00, 0x00, 0x22, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- #instructionMessage: .ascii " Instrucao "
- # .asciiz " Invalida! "
- .align 2
- #buffer do ReadString, ReadFloat, SDread, etc. 512 caracteres/bytes
- TempBuffer:
- .asciiz ""
- #.space 512
- # tabela de conversao hexa para ascii
- TabelaHexASCII: .asciiz "0123456789ABCDEF "
- NumDesnormP: .asciiz "+desnorm"
- NumDesnormN: .asciiz "-desnorm"
- NumZero: .asciiz "0.00000000"
- NumInfP: .asciiz "+Infinity"
- NumInfN: .asciiz "-Infinity"
- NumNaN: .asciiz "NaN"
- .align 2
- # variaveis para implementar a fila de eventos de input
- eventQueueBeginAddr: .word 0x90000E00
- eventQueueEndAddr: .word 0x90001000
- eventQueueBeginPtr: .word 0x90000E00
- eventQueueEndPtr: .word 0x90000E00
- #test string
- string: .asciz "opa isso eh um teste"
- ##MOUSE
- #DATA_X: .word 0
- #DATA_Y: .word 0
- #DATA_CLICKS: .word 0
- ##### Preparado para considerar syscall similar a jal ktext para o pipeline
- ### Obs.: a forma 'LABEL: instru��o' embora fique feio facilita o debug no Rars, por favor n�o reformatar!!!
- .text
- # mfc0 t0,12
- # mfc0 t0,13
- # mfc0 t0,14
- # addi t0,t0,4
- # mtc0 t0,14
- # eret
- # inicio do exception handler
- # exceptionHandling:
- # addi sp,sp,-8
- ############# interrupcao de SYSCALL ###################
- syscallException:
- addi sp,sp,-264
- sw x1,0(sp)
- sw x2,4(sp)
- sw x3,8(sp)
- sw x4,12(sp)
- sw x5,16(sp)
- sw x6,20(sp)
- sw x7,24(sp)
- sw x8,28(sp)
- sw x9,32(sp)
- sw x10,36(sp)
- sw x11,40(sp)
- sw x12,44(sp)
- sw x13,48(sp)
- sw x14,52(sp)
- sw x15,56(sp)
- sw x16,60(sp)
- sw x17,64(sp)
- sw x18,68(sp)
- sw x19,72(sp)
- sw x20,76(sp)
- sw x21,80(sp)
- sw x22,84(sp)
- sw x23,88(sp)
- sw x24,92(sp)
- sw x25,96(sp)
- sw x26,100(sp)
- sw x27,104(sp)
- sw x28,108(sp)
- sw x29,112(sp)
- sw x30,116(sp)
- sw x31,120(sp)
- fsw f0,124(sp)
- fsw f1,128(sp)
- fsw f2,132(sp)
- fsw f3,136(sp)
- fsw f4,140(sp)
- fsw f5,144(sp)
- fsw f6,148(sp)
- fsw f7,152(sp)
- fsw f8,156(sp)
- fsw f9,160(sp)
- fsw f10,164(sp)
- fsw f11,168(sp)
- fsw f12,172(sp)
- fsw f13,176(sp)
- fsw f14,180(sp)
- fsw f15,184(sp)
- fsw f16,188(sp)
- fsw f17,192(sp)
- fsw f18,196(sp)
- fsw f19,200(sp)
- fsw f20,204(sp)
- fsw f21,208(sp)
- fsw f22,212(sp)
- fsw f23,216(sp)
- fsw f24,220(sp)
- fsw f25,224(sp)
- fsw f26,228(sp)
- fsw f27,232(sp)
- fsw f28,236(sp)
- fsw f29,240(sp)
- fsw f30,244(sp)
- fsw f31,256(sp)
- #Zera os registradores temporarios
- add t0, zero, zero
- add t1, zero, zero
- add t2, zero, zero
- add t3, zero, zero
- add t4, zero, zero
- add t5, zero, zero
- add t6, zero, zero
- li a7,105 # SERVICO SELECIONADO
- # li a0, 12345678 # valor de teste
- addi t0, zero, 10
- beq t0, a7, goToExit # syscall exit
- addi t0, zero, 110
- beq t0, a7, goToExit # syscall exit
- addi t0, zero, 1 # sycall 1 = print int
- beq t0, a7, goToPrintInt
- addi t0, zero, 101 # sycall 1 = print int
- beq t0, a7, goToPrintInt
- # addi t0, zero, 2 # syscall 2 = print float
- # beq t0, a7, goToPrintFloat
- # addi t0, zero, 102 # syscall 2 = print float
- # beq t0, a7, goToPrintFloat
- addi t0, zero, 4 # syscall 4 = print string
- beq t0, a7, goToPrintString
- addi t0, zero, 104 # syscall 4 = print string
- beq t0, a7, goToPrintString
- addi t0, zero, 5 # syscall 5 = read int
- beq t0, a7, goToReadInt
- addi t0, zero, 105 # syscall 5 = read int
- beq t0, a7, goToReadInt
- # addi t0, zero, 6 # syscall 6 = read float
- # beq t0, a7, goToReadFloat
- # addi t0, zero, 106 # syscall 6 = read float
- # beq t0, a7, goToReadFloat
- addi t0, zero, 8 # syscall 8 = read string
- beq t0, a7, goToReadString
- addi t0, zero, 108 # syscall 8 = read string
- beq t0, a7, goToReadString
- addi t0, zero, 11 # syscall 11 = print char
- beq t0, a7, goToPrintChar
- addi t0, zero, 111 # syscall 11 = print char
- beq t0, a7, goToPrintChar
- addi t0, zero, 12 # syscall 12 = read char
- beq t0, a7, goToReadChar
- addi t0, zero, 112 # syscall 12 = read char
- beq t0, a7, goToReadChar
- # addi t0, zero, 30 # syscall 30 = time
- # beq t0, a7, goToTime
- # addi t0, zero, 130 # syscall 30 = time
- # beq t0, a7, goToTime
- # addi t0, zero, 32 # syscall 32 = sleep
- # beq t0, a7, goToSleep
- # addi t0, zero, 132 # syscall 32 = sleep
- # beq t0, a7, goToSleep
- # addi t0, zero, 41 # syscall 41 = random
- # beq t0, a7, goToRandom
- # addi t0, zero, 141 # syscall 41 = random
- # beq t0, a7, goToRandom
- #addi t0, zero, 34 # syscall 34 = print hex
- #beq t0, a7, goToPrintHex
- #addi t0, zero, 134 # syscall 41 = print hex
- #beq t0, a7, goToPrintHex
- # addi t0, zero, 31 # syscall 31 = MIDI out
- # beq t0, a7, goToMidiOut # Generate tone and return immediately
- # addi t0, zero, 131 # syscall 31 = MIDI out
- # beq t0, a7, goToMidiOut
- # addi t0, zero, 33 # syscall 33 = MIDI out synchronous
- # beq t0, a7, goToMidiOutSync # Generate tone and return upon tone completion
- # addi t0, zero, 133 # syscall 33 = MIDI out synchronous
- # beq t0, a7, goToMidiOutSync
- # addi t0, zero, 49 # syscall 49 = SD Card read
- # beq t0, a7, goToSDread
- # addi t0, zero, 149 # syscall 49 = SD Card read
- # beq t0, a7, goToSDread
- # addi t0, zero, 48 # syscall 48 = CLS
- # beq t0, a7, goToCLS
- # addi t0, zero, 148 # syscall 48 = CLS
- # beq t0, a7, goToCLS
- # addi t0, zero, 150 # syscall 150 = pop event
- # beq t0, a7, goToPopEvent
- # Funcoes de chamada de sistema
- goToExit:
- li a7,10
- ecall
- goToPrintInt:
- jal printInt
- j endEcall
- goToPrintHex:
- jal printHex
- j endEcall
- goToPrintString:
- jal printString
- j endEcall
- goToPrintChar:
- jal printChar
- j endEcall
- goToReadChar:
- jal readChar
- j endEcall
- goToReadString:
- jal readString
- j endEcall
- goToReadInt:
- jal readInt
- jal endEcall
- #############################################
- # PrintInt #
- # $a0 = valor inteiro #
- # $a1 = x #
- # $a2 = y #
- # $a3 = cor #
- #############################################
- printInt:
- addi sp,sp,-4 # aloca espaco
- sw ra,0(sp) # salva ra
- la t0,TempBuffer # carrega o endereco do buffer
- bge a0,zero, ehposprintInt #se eh positivo
- li t1,'-' #carrega o sinal -
- sb t1,0(t0) # armazena - no buffer
- addi t0,t0,1 # incrementa endereco do buffer
- sub a0,zero,a0 # torna o numero positivo
- ehposprintInt:
- li t2,10 # carrega
- li t1,0 # carrega numero de digitos com 0
- loop1printInt:
- div t4,a0,t2 #divide por 10, t4 = quociente
- rem t3,a0,t2 # resto
- addi sp,sp,-4 # aloca espaco na pilha
- sw t3,0(sp) # coloca o restp na pilha
- mv a0,t4
- addi t1,t1,1 # incrementa o contador de digitos
- bne a0,zero,loop1printInt #verifica se o número eh zero
- loop2printInt:
- lw t2,0(sp) # le digito da pilha
- addi sp,sp,4 # libera espaco na pilha
- addi t2,t2,48 # converte o digito para ascii
- sb t2,0(t0) # coloca caractere no buffer
- addi t0,t0,1 # encrementa o contador do buffer
- addi t1,t1,-1 # decrementa contador de digitos
- bne t1,zero, loop1printInt # eh o ultimo?
- sb zero,0(t0) # insere /NULL na string
- la a0, TempBuffer # endereco do buffer na string
- jal printString # chama print string
- lw ra,0(sp) # carrega o endereco de retorno
- addi sp,sp,4 # libera espaco da pilha
- fimprintInt:
- jalr zero, ra,0 # retorna
- #############################################
- # PrintHex #
- # $a0 = valor inteiro #
- # $a1 = x #
- # $a2 = y #
- # $a3 = cor #
- #############################################
- printHex:
- addi sp,sp,-4 # aloca espaco
- sw ra,0(sp) # guarda endereco de retorno na pilha
- mv t0,a0 # inteiro de 32 bits a ser impresso em hex
- la t1,TabelaHexASCII # endereco da tabela HEX > ASCII
- la t2, TempBuffer # onde a string será montada
- li t3,'0' # t3 recebe caractere 0 de '0x'
- sb t3,0(t2) # escreve caractere no buffer da string
- li t3,'x' # caractere 'x'
- sb t3,1(t2) # escreve caractere no buffer da string
- addi t2,t2,2 # novo endereco inicial da string
- li t3,28 # contador de nibble, inicio = 28
- loopprintHex:
- blt t3,zero, fimloopprintHex #se t3 < 0, terminou
- srl t4,t0,t3 #desloca o nibble para a direita
- andi t4,t3,0x000F # mascara o nibble
- add t4,t1,t4 # endereco ASCII do nibble
- lb t4,0(t4) # armazena o ASCII do nibble em t4
- sb t4,0(t2) # armazena o caractere no buffer da string
- addi t2,t2,1 # incrementa o contador
- addi t3,t3,-4 # decrementa o numero do nibble
- j loopprintHex # chama a funcao para o proximo nibble
- fimloopprintHex:
- sb zero,0(t2) # escreve o caractere null
- la a0, TempBuffer # argumento do printString
- jal printString # imprime a numero
- lw ra, 0(sp) # retira o endereco de retorno da pilha
- addi sp,sp,4 # libera espaco da pilha
- fimprintHex:
- jalr zero, ra,0 #retorna
- #####################################
- # PrintSring #
- # a0 = endereco da string #
- # a1 = x #
- # a2 = y #
- # a3 = cor #
- #####################################
- printString:
- addi sp, sp, -8 # aloca espaco
- sw ra, 0(sp) # salva ra
- sw s0, 4(sp) # salva s0
- mv s0, a0 # s0 = endereco do caractere na string
- loopprintString:
- lb a0, 0(s0) # le em a0 o caracter a ser impresso
- beq a0, zero, fimloopprintString # string ASCIIZ termina com NULL
- jal printChar # imprime char
- addi a1, a1, 8 # incrementa a coluna
- li t0,313
- blt a1, t0, NaoPulaLinha # se ainda tiver lugar na linha
- addi a2, a2, 8 # incrementa a linha
- mv a1, zero # volta a coluna zero
- NaoPulaLinha:
- addi s0, s0, 1 # proximo caractere
- j loopprintString # volta ao loop
- fimloopprintString:
- lw ra, 0(sp) # recupera ra
- lw s0, 0(sp) # recupera s0
- addi sp, sp, 8 # libera espaco
- fimprintString:
- jalr zero,ra,0 # retorna
- #########################################################
- # PrintChar #
- # a0 = char(ASCII) #
- # a1 = x #
- # a2 = y #
- #########################################################
- # t0 = i #
- # t1 = j #
- # t2 = endereco do char na memoria #
- # t3 = metade do char (2a e depois 1a) #
- # t4 = endereco para impressao #
- # t5 = background color #
- # t6 = foreground color #
- # t7 = 2 #
- #########################################################
- printChar:
- addi t5, a3, 0x0AA # cor fundo
- addi t6,a3,0xFF # cor frente
- #srli t5, t5, 8 # numero da cor de fundo
- li t0,' '
- blt a0, t0, NAOIMPRIMIVEL # ascii menor que 32 nao eh imprimivel
- li t0,'~'
- bgt a0, t0, NAOIMPRIMIVEL # ascii Maior que 126 nao eh imprimivel
- j IMPRIMIVEL
- NAOIMPRIMIVEL:
- li a0, 32 # Imprime espaco
- IMPRIMIVEL:
- li t0, NUMCOLUNAS # Num colunas 320
- mul t4,t0, a2 # multiplica a2x320
- add t4, t4, a1 # t4 = 320*y + x
- addi t4, t4, 7 # t4 = 320*y + (x+7)
- #la s0, VGAADDRESSINI # Endereco de inicio da memoria VGA
- lui s1,0xFF00
- ori s1,s1,0
- slli s1,s1,4
- add t4, t4, s1 # t4 = endereco de impressao do ultimo pixel da primeira linha do char
- addi t2, a0, -32 # indice do char na memoria
- slli t2, t2, 3 # offset em bytes em relacao ao endereco inicial
- la t3, LabelTabChar # endereco dos caracteres na memoria
- add t2, t2, t3 # endereco do caractere na memoria
- lw t3, 0(t2) # carrega a primeira word do char
- li t0, 4 # i=4
- forChar1I:
- beq t0, zero, endForChar1I # if(i == 0) end for i
- addi t1, zero, 8 # j = 8
- forChar1J:
- beq t1, zero, endForChar1J # if(j == 0) end for j
- andi s1, t3, 0x0001 # primeiro bit do caracter
- srli t3, t3, 1 # retira o primeiro bit
- beq s1, zero, printCharPixelbg1 # pixel eh fundo?
- sb t6, 0(t4) # imprime pixel com cor de frente
- j endCharPixel1
- printCharPixelbg1:
- sb t5, 0(t4) # imprime pixel com cor de fundo
- endCharPixel1:
- addi t1, t1, -1 # j--
- addi t4, t4, -1 # t4 aponta um pixel para a esquerda
- j forChar1J # vollta novo pixel
- endForChar1J:
- addi t0, t0, -1 # i--
- addi t4, t4, 328 # 2**12 + 8
- j forChar1I # volta ao loop
- endForChar1I:
- lw t3, 4(t2) # carrega a segunda word do char
- li t0, 4 # i = 4
- forChar2I:
- beq t0, zero, endForChar2I # if(i == 0) end for i
- addi t1, zero, 8 # j = 8
- forChar2J:
- beq t1, zero, endForChar2J # if(j == 0) end for j
- andi s1, t3, 0x0001 # pixel a ser impresso
- srli t3, t3, 1 # desloca para o proximo
- beq s1, zero, printCharPixelbg2 # pixel eh fundo?
- sb t6, 0(t4) # imprime cor frente
- j endCharPixel2 # volta ao loop
- printCharPixelbg2:
- sb t5, 0(t4) # imprime cor de fundo
- endCharPixel2:
- addi t1, t1, -1 # j--
- addi t4, t4, -1 # t4 aponta um pixel para a esquerda
- j forChar2J
- endForChar2J:
- addi t0, t0, -1 # i--
- addi t4, t4, 328 #
- j forChar2I # volta ao loop
- endForChar2I:
- jalr zero,ra,0 # retorna
- #########################################
- # ReadChar #
- # $v0 = valor ascii da tecla #
- # 2017/2 #
- #########################################
- readChar: #DE2(readCharKDMMIODE2)
- readCharKDMMIO:
- li t0,KDMMIO_Ctrl
- #lui t0,0XFF20
- #ori t0,t0,0
- #slli t0,t0,4
- loopReadCharKDMMIO:
- lbu a7,0(t0)
- andi a7,a7,0x0001
- beq a7,zero,loopReadCharKDMMIO
- lw a7,4(t0)
- j fimreadChar
- fimreadChar:
- ret
- #INCOMPLETO
- #########################################
- # ReadString #
- # $a0 = end Inicio #
- # $a1 = tam Max String #
- # a7/$v0 = end do ultimo caractere #
- # s0/$v1 = num de caracteres digitados #
- # s1/$fp #
- # 2017/2 #
- #########################################
- # muda $v0, $v1, $a0 e $fp
- readString:
- addi sp,sp,-4 # aloca espaco na pilha
- sw ra,0(sp) # guarda o endereco de retorno
- li s0,0 # zera o contador de caracteres digitados
- li a1,100
- la a0, TempBuffer # endereco inicial da string
- la s1, LabelScanCode # endereco da tabela de ScanCode inicial de readChar
- loopreadString:
- beq a1,s0, fimreadString # buffer cheio fim
- mv t1,ra # salva ra
- jal readChar # chama readChar
- mv ra,t1
- li t1,0x0A
- beq a7,t1,fimreadString # se for ENTER exit
- sb a7,0(a0) # grava no buffer
- addi s0,s0,1 # incrementa contador de caracteres
- addi a0,a0,1 # incrementa endereco do buffer
- j loopreadString
- fimreadString:
- sb zero,0(a0) # grava null no buffer
- addi a7,a0,-1 # a7 recebe o endereco do outro caractere
- lw ra,0(sp) # recupera ra
- addi sp,sp,4 # libera espaco na pilha
- jalr zero,ra,0 # retorna
- ###########################
- # ReadInt #
- # $a7 = valor do inteiro #
- # #
- ###########################
- readInt:
- addi sp,sp,-4 # aloca espaco na pilha
- sw ra,0(sp) # guarda endereco de retorno na pilha
- la a0, TempBuffer #endereco do buffer da string
- li a1, 10 # numero maximo de digitos
- jal readString # le uma string de ate 10 digitos
- mv t0, a7 # copia endereco do ultimo digito
- li t2,10 # 10
- li t3,1 # dezenas, centenas, etc
- mv a7,zero # zera o numero
- loopReadInt:
- beq s0, zero, fimReadInt # leu todos os digitos
- lb t1, 0(t0) # le um digito
- li t4,0x2d
- beq t1, t4, ehnegReadInt # = '-'
- li t4,0x2b
- beq t1,t4, ehposReadInt # = '+'
- li t4,0x30
- blt t1,t4,naoehReadInt # < '0'
- li t4,0x39
- bgt t1,t4,naoehReadInt # > '9'
- addi t1,t1,-48 # transforma ascii em numero
- mul t1,t1,t3 # multiplica por dezenas,centenas
- add a7,a7,t1 # soma no numero
- mul t3,t3,t2 # proxima dezena centena
- addi t0,t0,-1 # busca o digito anterior
- addi s0,s0,-1 # reduz o contador de digitos
- j loopReadInt # volta para buscar proximo digito
- naoehReadInt:
- j endEcall # gera erro instrucao invalida
- ehnegReadInt:
- sub a7,zero,a7 # se for negativo
- ehposReadInt:
- j loopReadInt
- fimReadInt:
- lw ra,0(sp) # recupera ra
- addi sp,sp,4 # libera espaco da pilha
- ret # retorna
- # EXIT
- endEcall:
- li a7,10
- ecall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement