Барабанный секвенсор MIPS немедленно завершает работу в среде MARS.

Я пытаюсь создать барабанный секвенсор в MIPS, который я сохранил в памяти, с директивой «.word», значениями 0 и 1. 1 означает, что необходимо сыграть 1/16 4/4 такта цикла. Таким образом, регистр $t8 будет адресовать 16 слов в памяти, где программа будет контролировать, должен ли звук воспроизводиться (1) или спать (0). $t7 — это счетчик для проверки завершения цикла и необходимости перезапуска последовательности. Проблема в том, что когда я собираю программу (и MARS делает это нормально) и запускаю ее, после одного шага выполнения я получаю это сообщение: "--программа завершена (опущена снизу)--" хорошо...но Почему ?!

Вот исходный код:

.data

LOOP1: .word 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0


    la $t8, LOOP1           #

    addi $t9, $t9, 0        #increments $t8 with the correct amount to adress every 1/16

    li $t2, 114             #sound's timbre

Loop:

    addiu $t8, $t8, $t9

    lw $t1, 0($t8)

    addi $t7, $t7, 1        #$t7 is used to verify the loop's end

    bne $0, $t1, PlaySound      

    li $a0, 100


    li $v0, 32

    syscall                    #sleep syscall

Afterplayng:

    sll $t9, $t9, 2

    beq $t7, 16, ReinitializeLoopCounter

        j Loop                #jumps back to the top of loop

PlaySound:

    li $a0, 62 

    li $a1, 100

    move $a2, $t2

    li $a3, 120

    la $v0, 33

    syscall                #calls service 33, playing music

    j Afterplayng

ReinitializeLoopCounter:

    addi $t7, $0, 1

    addi $t8, $t8, -64

    j Loop

person davideAlbertini    schedule 07.10.2014    source источник


Ответы (1)


В вашем коде несколько ошибок. Во-первых, вы не сообщаете MARS, где начинается ваш код.

Вы должны добавить строку

.code

после этой строки:

LOOP1: .word 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0

Затем, если вы попытаетесь собрать MARS, вы увидите некоторые ошибки, например. вы выдаете addiu $t8, $t8, $t9, который ожидает немедленного, а не регистра в качестве третьего аргумента.

Там есть другой подозрительный код. Например, одна строка в начале гласит

addi $t9, $t9, 0        #increments $t8 with the correct amount to adress every 1/16

но на самом деле он не делает ничего полезного (добавляет константу 0 к $ t9, что не соответствует вашему описанию).

Если немного изменить ваш код, чтобы протестировать midi-возможности MARS:

.data

LOOP1: .word 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0
.text

  la $t8, LOOP1           #

  li $t2, 114             #sound's timbre  ???
Loop:

  lw $t1, 0($t8)
  addiu $t8, $t8, 4  # Increment play data
  addi $t7, $t7, 1        #$t7 is used to verify the loop's end
  bne $0, $t1, PlaySound      
  li $a0, 100
  li $v0, 32
  syscall                    #sleep syscall
Afterplayng:
  beq $t7, 16, ReinitializeLoopCounter
  j Loop                #jumps back to the top of loop
PlaySound:
  li $a0, 62 
#  li $a1, 100
  li $a1, 500  # half second
  move $a2, $t2
  li $a3, 120
  la $v0, 33
  syscall                #calls service 33, playing music
  j Afterplayng
ReinitializeLoopCounter:
  addi $t7, $0, 1
  la $t8, LOOP1           # Reinitialize $t8
  j Loop

Проверьте различия с вашим кодом. Этот просто воспроизводит звук, затем делает паузу и т. д. в соответствии с информацией, хранящейся в LOOP1.

person gusbro    schedule 07.10.2014
comment
Хорошо, большое спасибо, я впервые использую MARS. Я исправил ошибку addiu $t8, $t8, $t9 и .code, но она все равно заканчивается немедленно - person davideAlbertini; 08.10.2014
comment
@ user3689009: проверьте отредактированный ответ. Я немного повозился с вашим кодом, чтобы проверить, как MARS выводит MIDI-сэмплы. - person gusbro; 08.10.2014
comment
Большое спасибо, теперь последовательность Loop работает нормально, но у меня есть вопрос: есть ли способ одновременного воспроизведения нескольких звуков? - person davideAlbertini; 21.10.2014
comment
@ user3689009: Я думаю, что mars не поддерживает несколько звуков одновременно, поскольку использует только один MIDI-канал. Вы используете системный вызов 33, который ожидает длительность звука, поэтому, возможно, вы можете попробовать использовать несколько syscall 31, а затем подождать, используя syscall 32, хотя я не думаю, что это сработает. - person gusbro; 21.10.2014