Практический экзамен

Для сдачи экзамена необходимо решить все домашние задания

Offline-вариант

Разряди бобму! (исследовательская задача)

Оказывается, Digital Lab Sim умеет тоже работать по прерываниям, причём даже лучше. чем консоль.

Во-первых, если в регистр 0xffff0012 записать 0x80 (7-й бит) вместо бита строки, включится прерывание активации клавиши ( 11, т. е. 11-й бит 13-го регистра управляющего сопросессора Cause, 0x800). При этом для сканирования строк потом всё равно надо записывать туда 1,2,4 или 8 (точнее, 0x81, 0x82, 0x84 или 0x8, чтобы не запретить прерывание), но в этой задаче это не понадобится. Таким образом, активацию клавиши можно отловить обработчиком прерываний (в котором проверить, что 11-бит cause действительно 1).

Во-вторых, что ещё интереснее, если в регистр 0xffff0013 записать не 0 (например, 1), Digital Lab через каждые 30 выполненных Mars-ом инструкций будет генерировать прерывание № 10 (10-й бит регистра Cause, 0x400).

Таким образом можно:

Итак, задание. Написать программу, которая запускает обратный отчёт от 9 до 0 примерно посекундно и изображает соответствующие цифры на индикаторе (см. решение задачи «Осваиваем Digital Lab»). Если пользователь успел нажать клавишу, ему выводится одно сообщение (например. красивое окошко "Win!" с помощью syscall 55), а если не успел — другое (например, "Boom!"), после чего программа завершается.

Подсказка 1: не забывайте нажимать Reset перед каждым запуском, а не то возможны артефакты.

Подсказка 2: Оба прерывания могут произойти одновременно, тогда в регистре Cause окажутся оба бита (0xc00 с возможными другими).

Как я решал эту задачу

Вообще-то всё

LecturesCMC/ArchitectureAssembler2019/Exam (last edited 2019-05-26 09:43:58 by FrBrGeorge)