Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #definicao do mapa de enderecamento de MMIO
  2. .eqv VGAADDRESSINI      0xFF000000
  3. .eqv VGAADDRESSFIM      0xFF012C00
  4. .eqv NUMLINHAS          240
  5. .eqv NUMCOLUNAS         320
  6.  
  7. .eqv KDMMIO_Ctrl    0xFF100000
  8. .eqv KDMMIO_Data    0xFF200004
  9.  
  10. .eqv Buffer0Teclado     0xFF200100
  11. .eqv Buffer1Teclado     0xFF200104
  12.  
  13. .eqv TecladoxMouse      0xFF200110
  14. .eqv BufferMouse        0xFF200114
  15.  
  16. .eqv AudioBase      0xFF200160
  17. .eqv AudioINL           0xFF200160
  18. .eqv AudioINR           0xFF200164
  19. .eqv AudioOUTL          0xFF200168
  20. .eqv AudioOUTR          0xFF20016C
  21. .eqv AudioCTRL1         0xFF200170
  22. .eqv AudioCTRL2         0xFF200174
  23.  
  24. # Sintetizador - 2015/1
  25. .eqv NoteData           0xFF200178
  26. .eqv NoteClock          0xFF20017C
  27. .eqv NoteMelody         0xFF200180
  28. .eqv MusicTempo         0xFF200184
  29. .eqv MusicAddress       0xFF200188
  30.  
  31.  
  32. .eqv IrDA_CTRL      0xFF20 0500
  33. .eqv IrDA_RX        0xFF20 0504
  34. .eqv IrDA_TX        0xFF20 0508
  35.  
  36. .eqv STOPWATCH      0xFF200510
  37.  
  38. .eqv LFSR       0xFF200514
  39.  
  40. .eqv KeyMap0        0xFF200520
  41. .eqv KeyMap1        0xFF200524
  42. .eqv KeyMap2        0xFF200528
  43. .eqv KeyMap3        0xFF20052C
  44.  
  45. ######### Macro que verifica se eh a DE2 ###############
  46. .macro DE2(%salto)
  47.     li t6, 0x10008000
  48.     bne gp,t6,%salto
  49. .end_macro
  50.  
  51. .data
  52.  
  53. LabelTabChar:
  54. .word   0x00000000, 0x00000000, 0x10101010, 0x00100010, 0x00002828, 0x00000000, 0x28FE2828, 0x002828FE,
  55.     0x38503C10, 0x00107814, 0x10686400, 0x00004C2C, 0x28102818, 0x003A4446, 0x00001010, 0x00000000,
  56.     0x20201008, 0x00081020, 0x08081020, 0x00201008, 0x38549210, 0x00109254, 0xFE101010, 0x00101010,
  57.     0x00000000, 0x10081818, 0xFE000000, 0x00000000, 0x00000000, 0x18180000, 0x10080402, 0x00804020,
  58.     0x54444438, 0x00384444, 0x10103010, 0x00381010, 0x08044438, 0x007C2010, 0x18044438, 0x00384404,
  59.     0x7C482818, 0x001C0808, 0x7840407C, 0x00384404, 0x78404438, 0x00384444, 0x1008047C, 0x00202020,
  60.     0x38444438, 0x00384444, 0x3C444438, 0x00384404, 0x00181800, 0x00001818, 0x00181800, 0x10081818,
  61.     0x20100804, 0x00040810, 0x00FE0000, 0x000000FE, 0x04081020, 0x00201008, 0x08044438, 0x00100010,
  62.     0x545C4438, 0x0038405C, 0x7C444438, 0x00444444, 0x78444478, 0x00784444, 0x40404438, 0x00384440,
  63.     0x44444478, 0x00784444, 0x7840407C, 0x007C4040, 0x7C40407C, 0x00404040, 0x5C404438, 0x00384444,
  64.     0x7C444444, 0x00444444, 0x10101038, 0x00381010, 0x0808081C, 0x00304848, 0x70484444, 0x00444448,
  65.     0x20202020, 0x003C2020, 0x92AAC682, 0x00828282, 0x54546444, 0x0044444C, 0x44444438, 0x00384444,
  66.     0x38242438, 0x00202020, 0x44444438, 0x0C384444, 0x78444478, 0x00444850, 0x38404438, 0x00384404,
  67.     0x1010107C, 0x00101010, 0x44444444, 0x00384444, 0x28444444, 0x00101028, 0x54828282, 0x00282854,
  68.     0x10284444, 0x00444428, 0x10284444, 0x00101010, 0x1008047C, 0x007C4020, 0x20202038, 0x00382020,
  69.     0x10204080, 0x00020408, 0x08080838, 0x00380808, 0x00442810, 0x00000000, 0x00000000, 0xFE000000,
  70.     0x00000810, 0x00000000, 0x3C043800, 0x003A4444, 0x24382020, 0x00582424, 0x201C0000, 0x001C2020,
  71.     0x48380808, 0x00344848, 0x44380000, 0x0038407C, 0x70202418, 0x00202020, 0x443A0000, 0x38043C44,
  72.     0x64584040, 0x00444444, 0x10001000, 0x00101010, 0x10001000, 0x60101010, 0x28242020, 0x00242830,
  73.     0x08080818, 0x00080808, 0x49B60000, 0x00414149, 0x24580000, 0x00242424, 0x44380000, 0x00384444,
  74.     0x24580000, 0x20203824, 0x48340000, 0x08083848, 0x302C0000, 0x00202020, 0x201C0000, 0x00380418,
  75.     0x10381000, 0x00101010, 0x48480000, 0x00344848, 0x44440000, 0x00102844, 0x82820000, 0x0044AA92,
  76.     0x28440000, 0x00442810, 0x24240000, 0x38041C24, 0x043C0000, 0x003C1008, 0x2010100C, 0x000C1010,
  77.     0x10101010, 0x00101010, 0x04080830, 0x00300808, 0x92600000, 0x0000000C, 0x243C1818, 0xA55A7E3C,
  78.     0x99FF5A81, 0x99663CFF, 0x10280000, 0x00000028, 0x10081020, 0x00081020
  79.  
  80. # scancode -> ascii
  81. LabelScanCode:
  82. #   0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F
  83. .byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # 00 a 0F
  84.     0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x31, 0x00, 0x00, 0x00, 0x7a, 0x73, 0x61, 0x77, 0x32, 0x00, # 10 a 1F
  85.     0x00, 0x63, 0x78, 0x64, 0x65, 0x34, 0x33, 0x00, 0x00, 0x20, 0x76, 0x66, 0x74, 0x72, 0x35, 0x00, # 20 a 2F  29 espaco => 20
  86.     0x00, 0x6e, 0x62, 0x68, 0x67, 0x79, 0x36, 0x00, 0x00, 0x00, 0x6d, 0x6a, 0x75, 0x37, 0x38, 0x00, # 30 a 3F
  87.     0x00, 0x2c, 0x6b, 0x69, 0x6f, 0x30, 0x39, 0x00, 0x00, 0x2e, 0x2f, 0x6c, 0x3b, 0x70, 0x2d, 0x00, # 40 a 4F
  88.     0x00, 0x00, 0x27, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x5b, 0x00, 0x5d, 0x00, 0x00, # 50 a 5F   5A enter => 0A (= ao Mars)
  89.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x34, 0x37, 0x00, 0x00, 0x00, # 60 a 6F
  90.     0x30, 0x2e, 0x32, 0x35, 0x36, 0x38, 0x00, 0x00, 0x00, 0x2b, 0x33, 0x2d, 0x2a, 0x39, 0x00, 0x00, # 70 a 7F
  91.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00                              # 80 a 85
  92. # scancode -> ascii (com shift)
  93. LabelScanCodeShift:
  94. .byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  95.     0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x21, 0x00, 0x00, 0x00, 0x5a, 0x53, 0x41, 0x57, 0x40, 0x00,
  96.     0x00, 0x43, 0x58, 0x44, 0x45, 0x24, 0x23, 0x00, 0x00, 0x00, 0x56, 0x46, 0x54, 0x52, 0x25, 0x00,
  97.     0x00, 0x4e, 0x42, 0x48, 0x47, 0x59, 0x5e, 0x00, 0x00, 0x00, 0x4d, 0x4a, 0x55, 0x26, 0x2a, 0x00,
  98.     0x00, 0x3c, 0x4b, 0x49, 0x4f, 0x29, 0x28, 0x00, 0x00, 0x3e, 0x3f, 0x4c, 0x3a, 0x50, 0x5f, 0x00,
  99.     0x00, 0x00, 0x22, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x00,
  100.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  101.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  102.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  103.  
  104. #instructionMessage:     .ascii  "   Instrucao    "
  105. #                        .asciiz "   Invalida!    "
  106.  
  107. .align 2
  108.  
  109. #buffer do ReadString, ReadFloat, SDread, etc. 512 caracteres/bytes
  110. TempBuffer:
  111. .asciiz ""
  112. #.space 512
  113.  
  114. # tabela de conversao hexa para ascii
  115. TabelaHexASCII:     .asciiz "0123456789ABCDEF  "
  116. NumDesnormP:        .asciiz "+desnorm"
  117. NumDesnormN:        .asciiz "-desnorm"
  118. NumZero:        .asciiz "0.00000000"
  119. NumInfP:        .asciiz "+Infinity"
  120. NumInfN:        .asciiz "-Infinity"
  121. NumNaN:         .asciiz "NaN"
  122.  
  123. .align 2
  124. # variaveis para implementar a fila de eventos de input
  125. eventQueueBeginAddr:    .word 0x90000E00
  126. eventQueueEndAddr:      .word 0x90001000
  127. eventQueueBeginPtr:     .word 0x90000E00
  128. eventQueueEndPtr:       .word 0x90000E00
  129.  
  130.  
  131. #test string
  132. string: .asciz "opa isso eh um teste"
  133.  
  134. ##MOUSE
  135. #DATA_X:         .word 0
  136. #DATA_Y:         .word 0
  137. #DATA_CLICKS:    .word 0
  138.  
  139. ##### Preparado para considerar syscall similar a jal ktext  para o pipeline
  140.  
  141. ### Obs.: a forma 'LABEL: instru��o' embora fique feio facilita o debug no Rars, por favor n�o reformatar!!!
  142.  
  143. .text
  144.  
  145. #   mfc0 t0,12
  146. #   mfc0 t0,13
  147. #   mfc0 t0,14
  148. #   addi t0,t0,4
  149. #   mtc0 t0,14
  150. #   eret
  151.    
  152. # inicio do exception handler
  153. # exceptionHandling:
  154. #   addi sp,sp,-8
  155.  
  156. ############# interrupcao de SYSCALL ###################
  157. syscallException:
  158.     addi sp,sp,-264
  159.  
  160.     sw x1,0(sp)
  161.     sw x2,4(sp)
  162.     sw x3,8(sp)
  163.     sw x4,12(sp)
  164.     sw x5,16(sp)
  165.     sw x6,20(sp)
  166.     sw x7,24(sp)
  167.     sw x8,28(sp)
  168.     sw x9,32(sp)
  169.     sw x10,36(sp)
  170.     sw x11,40(sp)
  171.     sw x12,44(sp)
  172.     sw x13,48(sp)
  173.     sw x14,52(sp)
  174.     sw x15,56(sp)
  175.     sw x16,60(sp)
  176.     sw x17,64(sp)
  177.     sw x18,68(sp)
  178.     sw x19,72(sp)
  179.     sw x20,76(sp)
  180.     sw x21,80(sp)
  181.     sw x22,84(sp)
  182.     sw x23,88(sp)
  183.     sw x24,92(sp)
  184.     sw x25,96(sp)
  185.     sw x26,100(sp)
  186.     sw x27,104(sp)
  187.     sw x28,108(sp)
  188.     sw x29,112(sp)
  189.     sw x30,116(sp)
  190.     sw x31,120(sp)
  191.  
  192.     fsw f0,124(sp)
  193.     fsw f1,128(sp)
  194.     fsw f2,132(sp)
  195.     fsw f3,136(sp)
  196.     fsw f4,140(sp)
  197.     fsw f5,144(sp)
  198.     fsw f6,148(sp)
  199.     fsw f7,152(sp)
  200.     fsw f8,156(sp)
  201.     fsw f9,160(sp)
  202.     fsw f10,164(sp)
  203.     fsw f11,168(sp)
  204.     fsw f12,172(sp)
  205.     fsw f13,176(sp)
  206.     fsw f14,180(sp)
  207.     fsw f15,184(sp)
  208.     fsw f16,188(sp)
  209.     fsw f17,192(sp)
  210.     fsw f18,196(sp)
  211.     fsw f19,200(sp)
  212.     fsw f20,204(sp)
  213.     fsw f21,208(sp)
  214.     fsw f22,212(sp)
  215.     fsw f23,216(sp)
  216.     fsw f24,220(sp)
  217.     fsw f25,224(sp)
  218.     fsw f26,228(sp)
  219.     fsw f27,232(sp)
  220.     fsw f28,236(sp)
  221.     fsw f29,240(sp)
  222.     fsw f30,244(sp)
  223.     fsw f31,256(sp)
  224.  
  225.     #Zera os registradores temporarios
  226.  
  227.     add     t0, zero, zero
  228.     add     t1, zero, zero
  229.     add     t2, zero, zero
  230.     add     t3, zero, zero
  231.     add     t4, zero, zero
  232.     add     t5, zero, zero
  233.     add     t6, zero, zero
  234.    
  235.     li a7,105               # SERVICO SELECIONADO
  236.    # li a0, 12345678                # valor de teste
  237.  
  238.     addi    t0, zero, 10
  239.     beq     t0, a7, goToExit          # syscall exit
  240.     addi    t0, zero, 110
  241.     beq     t0, a7, goToExit          # syscall exit
  242.    
  243.     addi    t0, zero, 1               # sycall 1 = print int
  244.     beq     t0, a7, goToPrintInt
  245.     addi    t0, zero, 101             # sycall 1 = print int
  246.     beq     t0, a7, goToPrintInt
  247.  
  248.     # addi    t0, zero, 2               # syscall 2 = print float
  249.     # beq     t0, a7, goToPrintFloat
  250.     # addi    t0, zero, 102             # syscall 2 = print float
  251.     # beq     t0, a7, goToPrintFloat
  252.  
  253.     addi    t0, zero, 4               # syscall 4 = print string
  254.     beq     t0, a7, goToPrintString
  255.     addi    t0, zero, 104             # syscall 4 = print string
  256.     beq     t0, a7, goToPrintString
  257.  
  258.     addi    t0, zero, 5               # syscall 5 = read int
  259.     beq     t0, a7, goToReadInt
  260.     addi    t0, zero, 105             # syscall 5 = read int
  261.     beq     t0, a7, goToReadInt
  262.  
  263.     # addi    t0, zero, 6               # syscall 6 = read float
  264.     # beq     t0, a7, goToReadFloat
  265.     # addi    t0, zero, 106             # syscall 6 = read float
  266.     # beq     t0, a7, goToReadFloat
  267.  
  268.     addi    t0, zero, 8               # syscall 8 = read string
  269.     beq     t0, a7, goToReadString
  270.     addi    t0, zero, 108             # syscall 8 = read string
  271.     beq     t0, a7, goToReadString
  272.  
  273.     addi    t0, zero, 11              # syscall 11 = print char
  274.     beq     t0, a7, goToPrintChar
  275.     addi    t0, zero, 111             # syscall 11 = print char
  276.     beq     t0, a7, goToPrintChar
  277.  
  278.     addi    t0, zero, 12              # syscall 12 = read char
  279.     beq     t0, a7, goToReadChar
  280.     addi    t0, zero, 112             # syscall 12 = read char
  281.     beq     t0, a7, goToReadChar
  282.  
  283.     # addi    t0, zero, 30              # syscall 30 = time
  284.     # beq     t0, a7, goToTime
  285.     # addi    t0, zero, 130             # syscall 30 = time
  286.     # beq     t0, a7, goToTime
  287.    
  288.     # addi    t0, zero, 32              # syscall 32 = sleep
  289.     # beq     t0, a7, goToSleep
  290.     # addi    t0, zero, 132             # syscall 32 = sleep
  291.     # beq     t0, a7, goToSleep
  292.  
  293.     # addi    t0, zero, 41              # syscall 41 = random
  294.     # beq     t0, a7, goToRandom
  295.     # addi    t0, zero, 141             # syscall 41 = random
  296.     # beq     t0, a7, goToRandom
  297.  
  298.     #addi    t0, zero, 34               # syscall 34 = print hex
  299.     #beq     t0, a7, goToPrintHex
  300.     #addi    t0, zero, 134      # syscall 41 = print hex
  301.     #beq     t0, a7, goToPrintHex
  302.    
  303.     # addi    t0, zero, 31              # syscall 31 = MIDI out
  304.     # beq     t0, a7, goToMidiOut       # Generate tone and return immediately
  305.     # addi    t0, zero, 131             # syscall 31 = MIDI out
  306.     # beq     t0, a7, goToMidiOut
  307.  
  308.     # addi    t0, zero, 33              # syscall 33 = MIDI out synchronous
  309.     # beq     t0, a7, goToMidiOutSync   # Generate tone and return upon tone completion
  310.     # addi    t0, zero, 133             # syscall 33 = MIDI out synchronous
  311.     # beq     t0, a7, goToMidiOutSync
  312.  
  313.     # addi    t0, zero, 49              # syscall 49 = SD Card read
  314.     # beq     t0, a7, goToSDread
  315.     # addi    t0, zero, 149              # syscall 49 = SD Card read
  316.     # beq     t0, a7, goToSDread
  317.  
  318.     # addi    t0, zero, 48              # syscall 48 = CLS
  319.     # beq     t0, a7, goToCLS
  320.     # addi    t0, zero, 148              # syscall 48 = CLS
  321.     # beq     t0, a7, goToCLS
  322.    
  323.     # addi    t0, zero, 150             # syscall 150 = pop event
  324.     # beq     t0, a7, goToPopEvent
  325.  
  326.  
  327. # Funcoes de chamada de sistema
  328.  
  329. goToExit:
  330.     li a7,10
  331.     ecall
  332.  
  333. goToPrintInt:
  334.     jal printInt
  335.     j endEcall
  336.  
  337. goToPrintHex:
  338.     jal printHex
  339.     j endEcall
  340.  
  341. goToPrintString:
  342.     jal printString
  343.     j endEcall
  344.    
  345. goToPrintChar:
  346.     jal printChar
  347.     j endEcall 
  348.  
  349. goToReadChar:
  350.     jal readChar
  351.     j endEcall
  352.  
  353. goToReadString:
  354.     jal readString
  355.     j endEcall
  356.  
  357. goToReadInt:
  358.     jal readInt
  359.     jal endEcall
  360.  
  361. #############################################
  362. #  PrintInt                                 #
  363. #  $a0    =    valor inteiro                #
  364. #  $a1    =    x                            #
  365. #  $a2    =    y                #
  366. #  $a3    =    cor                          #
  367. #############################################
  368.  
  369. printInt:
  370.     addi sp,sp,-4           # aloca espaco
  371.     sw ra,0(sp)             # salva ra
  372.     la t0,TempBuffer        # carrega o endereco do buffer
  373.  
  374.     bge a0,zero, ehposprintInt  #se eh positivo
  375.     li t1,'-'       #carrega o sinal -
  376.     sb t1,0(t0)     #  armazena - no buffer
  377.     addi t0,t0,1    # incrementa endereco do buffer
  378.     sub a0,zero,a0  # torna o numero positivo
  379.  
  380. ehposprintInt:
  381.     li t2,10        # carrega
  382.     li t1,0         # carrega numero de digitos com 0
  383.  
  384. loop1printInt:
  385.     div t4,a0,t2        #divide por 10, t4 = quociente
  386.     rem t3,a0,t2        # resto
  387.     addi sp,sp,-4       # aloca espaco na pilha
  388.     sw t3,0(sp)         # coloca o restp na pilha
  389.     mv a0,t4
  390.     addi t1,t1,1        # incrementa o contador de digitos
  391.     bne a0,zero,loop1printInt   #verifica se o número eh zero
  392.  
  393. loop2printInt:
  394.     lw t2,0(sp)         # le digito da pilha
  395.     addi sp,sp,4        # libera espaco na pilha
  396.     addi t2,t2,48       # converte o digito para ascii
  397.     sb t2,0(t0)         # coloca caractere no buffer
  398.     addi t0,t0,1        # encrementa o contador do buffer
  399.     addi t1,t1,-1       # decrementa contador de digitos
  400.     bne t1,zero, loop1printInt  # eh o ultimo?
  401.     sb zero,0(t0)               # insere /NULL na string
  402.  
  403.     la a0, TempBuffer       # endereco do buffer na string
  404.     jal printString         # chama print string
  405.  
  406.     lw ra,0(sp)             # carrega o endereco de retorno
  407.     addi sp,sp,4            # libera espaco da pilha
  408.  
  409. fimprintInt:
  410.     jalr zero, ra,0     # retorna
  411.  
  412.  
  413. #############################################
  414. #  PrintHex                                 #
  415. #  $a0    =    valor inteiro                #
  416. #  $a1    =    x                            #
  417. #  $a2    =    y                            #
  418. #  $a3    =    cor              #
  419. #############################################
  420.  
  421. printHex:
  422.     addi sp,sp,-4           # aloca espaco
  423.     sw ra,0(sp)             # guarda endereco de retorno na pilha
  424.     mv t0,a0                # inteiro de 32 bits a ser impresso em hex
  425.     la t1,TabelaHexASCII    # endereco da tabela HEX > ASCII
  426.     la t2, TempBuffer       # onde a string será montada
  427.  
  428.     li t3,'0'               # t3 recebe caractere 0 de '0x'
  429.     sb t3,0(t2)             # escreve caractere no buffer da string
  430.     li t3,'x'               # caractere 'x'
  431.     sb t3,1(t2)             # escreve caractere no buffer da string
  432.     addi t2,t2,2            # novo endereco inicial da string
  433.  
  434.     li t3,28                # contador de nibble, inicio = 28
  435.  
  436. loopprintHex:
  437.     blt t3,zero, fimloopprintHex    #se t3 < 0, terminou
  438.     srl t4,t0,t3                    #desloca o nibble para a direita
  439.     andi t4,t3,0x000F               # mascara o nibble
  440.     add t4,t1,t4                    # endereco ASCII do nibble
  441.     lb t4,0(t4)                     # armazena o ASCII do nibble em t4
  442.     sb t4,0(t2)                     # armazena o caractere no buffer da string
  443.     addi t2,t2,1                        # incrementa o contador
  444.     addi t3,t3,-4                   # decrementa o numero do nibble
  445.     j loopprintHex                  # chama a funcao para o proximo nibble
  446.  
  447. fimloopprintHex:
  448.     sb zero,0(t2)                   # escreve o caractere null
  449.     la a0, TempBuffer               # argumento do printString
  450.     jal printString                 # imprime a numero
  451.     lw ra, 0(sp)                    # retira o endereco de retorno da pilha
  452.     addi sp,sp,4                    # libera espaco da pilha
  453.  
  454. fimprintHex:
  455.     jalr zero, ra,0                 #retorna
  456.  
  457. #####################################
  458. #  PrintSring                       #
  459. #  a0    =  endereco da string     #
  460. #  a1    =  x                      #
  461. #  a2    =  y                      #
  462. #  a3    =  cor         #
  463. #####################################
  464.  
  465. printString:   
  466.     addi sp, sp, -8         # aloca espaco
  467.     sw  ra, 0(sp)           # salva ra
  468.     sw  s0, 4(sp)           # salva s0
  469.     mv  s0, a0                      # s0 = endereco do caractere na string
  470.  
  471. loopprintString:
  472.     lb a0, 0(s0)                    # le em a0 o caracter a ser impresso
  473.     beq a0, zero, fimloopprintString   # string ASCIIZ termina com NULL
  474.     jal printChar               # imprime char
  475.            
  476.     addi a1, a1, 8                  # incrementa a coluna      
  477.     li t0,313
  478.     blt a1, t0, NaoPulaLinha            # se ainda tiver lugar na linha
  479.     addi a2, a2, 8                  # incrementa a linha
  480.     mv a1, zero         # volta a coluna zero
  481.  
  482. NaoPulaLinha:  
  483.     addi s0, s0, 1          # proximo caractere
  484.     j loopprintString               # volta ao loop
  485.  
  486. fimloopprintString:
  487.     lw ra, 0(sp)            # recupera ra
  488.     lw s0, 0(sp)        # recupera s0
  489.     addi sp, sp, 8      # libera espaco
  490.  
  491. fimprintString:    
  492.     jalr zero,ra,0              # retorna
  493.  
  494.  
  495. #########################################################
  496. #  PrintChar                                            #
  497. #  a0 = char(ASCII)                                    #
  498. #  a1 = x                                              #
  499. #  a2 = y                                              #
  500. #########################################################
  501. #   t0 = i                                             #
  502. #   t1 = j                                             #
  503. #   t2 = endereco do char na memoria                   #
  504. #   t3 = metade do char (2a e depois 1a)               #
  505. #   t4 = endereco para impressao                       #
  506. #   t5 = background color                              #
  507. #   t6 = foreground color                              #
  508. #   t7 = 2                                             #
  509. #########################################################
  510.  
  511.  
  512. printChar:
  513.     addi t5, a3, 0x0AA              # cor fundo
  514.     addi t6,a3,0xFF             # cor frente
  515.     #srli t5, t5, 8         # numero da cor de fundo
  516.  
  517.     li t0,' '
  518.     blt a0, t0, NAOIMPRIMIVEL       # ascii menor que 32 nao eh imprimivel
  519.     li t0,'~'
  520.     bgt a0, t0, NAOIMPRIMIVEL       # ascii Maior que 126  nao eh imprimivel
  521.     j IMPRIMIVEL
  522.    
  523. NAOIMPRIMIVEL:    
  524.     li a0, 32           # Imprime espaco
  525.  
  526. IMPRIMIVEL:
  527.     li  t0, NUMCOLUNAS      # Num colunas 320
  528.     mul t4,t0, a2           # multiplica a2x320
  529.     add t4, t4, a1                  # t4 = 320*y + x
  530.     addi t4, t4, 7                  # t4 = 320*y + (x+7)
  531.    
  532.    
  533.     #la s0, VGAADDRESSINI           # Endereco de inicio da memoria VGA
  534.     lui s1,0xFF00
  535.     ori s1,s1,0
  536.     slli s1,s1,4
  537.    
  538.    
  539.     add t4, t4, s1                  # t4 = endereco de impressao do ultimo pixel da primeira linha do char
  540.     addi t2, a0, -32                # indice do char na memoria
  541.     slli t2, t2, 3                  # offset em bytes em relacao ao endereco inicial
  542.     la t3, LabelTabChar     # endereco dos caracteres na memoria
  543.     add t2, t2, t3                  # endereco do caractere na memoria
  544.     lw t3, 0(t2)                    # carrega a primeira word do char
  545.     li t0, 4                # i=4
  546.  
  547. forChar1I: 
  548.     beq t0, zero, endForChar1I  # if(i == 0) end for i
  549.     addi t1, zero, 8                # j = 8
  550.  
  551.     forChar1J:      
  552.         beq t1, zero, endForChar1J      # if(j == 0) end for j
  553.         andi s1, t3, 0x0001     # primeiro bit do caracter
  554.         srli t3, t3, 1              # retira o primeiro bit
  555.         beq s1, zero, printCharPixelbg1 # pixel eh fundo?
  556.         sb t6, 0(t4)                # imprime pixel com cor de frente
  557.         j endCharPixel1
  558.  
  559. printCharPixelbg1:      
  560.     sb t5, 0(t4)                    # imprime pixel com cor de fundo
  561.  
  562. endCharPixel1:      
  563.     addi t1, t1, -1                 # j--
  564.     addi t4, t4, -1                 # t4 aponta um pixel para a esquerda
  565.     j forChar1J         # vollta novo pixel
  566.  
  567. endForChar1J:  
  568.     addi t0, t0, -1         # i--
  569.     addi t4, t4, 328           # 2**12 + 8
  570.     j forChar1I     # volta ao loop
  571.  
  572. endForChar1I:  
  573.     lw t3, 4(t2)            # carrega a segunda word do char
  574.     li  t0, 4           # i = 4
  575.  
  576. forChar2I:      
  577.     beq t0, zero, endForChar2I      # if(i == 0) end for i
  578.         addi t1, zero, 8               # j = 8
  579.  
  580.     forChar2J: 
  581.         beq t1, zero, endForChar2J      # if(j == 0) end for j
  582.         andi s1, t3, 0x0001         # pixel a ser impresso
  583.         srli t3, t3, 1                  # desloca para o proximo
  584.         beq s1, zero, printCharPixelbg2 # pixel eh fundo?
  585.         sb t6, 0(t4)            # imprime cor frente
  586.         j endCharPixel2         # volta ao loop
  587.  
  588. printCharPixelbg2:      
  589.     sb      t5, 0(t4)           # imprime cor de fundo
  590.  
  591. endCharPixel2:
  592.     addi t1, t1, -1         # j--
  593.     addi t4, t4, -1                 # t4 aponta um pixel para a esquerda
  594.     j forChar2J
  595.  
  596. endForChar2J:  
  597.     addi t0, t0, -1         # i--
  598.     addi t4, t4, 328        #
  599.     j forChar2I     # volta ao loop
  600.  
  601. endForChar2I:  
  602.     jalr zero,ra,0              # retorna
  603.  
  604. #########################################
  605. # ReadChar                      #
  606. # $v0 = valor ascii da tecla        #
  607. # 2017/2                #
  608. #########################################
  609. readChar: #DE2(readCharKDMMIODE2)
  610.  
  611. readCharKDMMIO:
  612.     li t0,KDMMIO_Ctrl
  613.     #lui t0,0XFF20
  614.     #ori t0,t0,0
  615.     #slli t0,t0,4
  616.    
  617. loopReadCharKDMMIO:
  618.     lbu a7,0(t0)
  619.     andi a7,a7,0x0001
  620.     beq a7,zero,loopReadCharKDMMIO
  621.     lw a7,4(t0)
  622.     j fimreadChar
  623.  
  624. fimreadChar:
  625.     ret
  626.    
  627. #INCOMPLETO
  628. #########################################
  629. #    ReadString                 #
  630. # $a0 = end Inicio              #
  631. # $a1 = tam Max String          #
  632. # a7/$v0 = end do ultimo caractere  #
  633. # s0/$v1 = num de caracteres digitados  #
  634. # s1/$fp                #
  635. # 2017/2                        #
  636. #########################################
  637. # muda $v0, $v1, $a0 e $fp  
  638.  
  639. readString:
  640.     addi sp,sp,-4           # aloca espaco na pilha
  641.     sw ra,0(sp)             # guarda o endereco de retorno
  642.     li s0,0                 # zera o contador de caracteres digitados
  643.     li a1,100
  644.     la a0, TempBuffer       # endereco inicial da string
  645.     la s1, LabelScanCode    # endereco da tabela de ScanCode inicial de readChar
  646.  
  647. loopreadString:
  648.     beq a1,s0, fimreadString # buffer cheio fim
  649.     mv t1,ra                # salva ra
  650.     jal readChar            # chama readChar
  651.     mv ra,t1
  652.     li t1,0x0A
  653.     beq a7,t1,fimreadString # se for ENTER exit
  654.     sb a7,0(a0)             # grava no buffer
  655.     addi s0,s0,1            # incrementa contador de caracteres
  656.     addi a0,a0,1            # incrementa endereco do buffer
  657.     j loopreadString
  658.  
  659. fimreadString:
  660.     sb zero,0(a0)       # grava null no buffer
  661.     addi a7,a0,-1       # a7 recebe o endereco do outro caractere
  662.     lw ra,0(sp)     # recupera ra
  663.     addi sp,sp,4        # libera espaco na pilha
  664.     jalr zero,ra,0              # retorna
  665.  
  666. ###########################
  667. #    ReadInt              #
  668. # $a7 = valor do inteiro  #
  669. #                         #
  670. ###########################
  671.  
  672. readInt:
  673.     addi sp,sp,-4   # aloca espaco na pilha
  674.     sw ra,0(sp)     # guarda endereco de retorno na pilha
  675.     la a0, TempBuffer   #endereco do buffer da string
  676.     li a1, 10           # numero maximo de digitos
  677.     jal readString      # le uma string de ate 10 digitos
  678.     mv t0, a7           # copia endereco do ultimo digito
  679.     li t2,10            # 10
  680.     li t3,1             # dezenas, centenas, etc
  681.     mv a7,zero          # zera o numero
  682.  
  683. loopReadInt:
  684.     beq s0, zero, fimReadInt        # leu todos os digitos
  685.     lb t1, 0(t0)                    # le um digito
  686.     li t4,0x2d
  687.     beq t1, t4, ehnegReadInt        # = '-'
  688.     li t4,0x2b
  689.     beq t1,t4, ehposReadInt         # = '+'
  690.     li t4,0x30
  691.     blt t1,t4,naoehReadInt      # < '0'
  692.     li t4,0x39
  693.     bgt t1,t4,naoehReadInt                  # > '9'
  694.     addi t1,t1,-48                  # transforma ascii em numero
  695.     mul t1,t1,t3                    # multiplica por dezenas,centenas
  696.     add a7,a7,t1                    # soma no numero
  697.     mul t3,t3,t2                    # proxima dezena centena
  698.     addi t0,t0,-1                   # busca o digito anterior
  699.     addi s0,s0,-1                   # reduz o contador de digitos
  700.     j loopReadInt                   # volta para buscar proximo digito
  701.  
  702. naoehReadInt:
  703.     j endEcall          # gera erro instrucao invalida
  704.  
  705. ehnegReadInt:
  706.     sub a7,zero,a7      # se for negativo
  707.  
  708. ehposReadInt:
  709.     j loopReadInt
  710.  
  711. fimReadInt:
  712.     lw ra,0(sp)         # recupera ra
  713.     addi sp,sp,4        # libera espaco da pilha
  714.     ret     # retorna
  715. # EXIT
  716.  
  717. endEcall:
  718.     li a7,10
  719.     ecall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement