PDA

Просмотр полной версии : Отладка монитора на FPGA (Орион-ПРО)



andreil
13.04.2021, 22:57
День добрый.
Сегодня дело дошло до запуска основного ROM для Орион-ПРО, но что-то пошло не так и работает некорректно.
К железу: процессор Z80 "железный", как и память основная. Остальное всё "спрятано" в FPGA.
Проблема: при старте есть операции CALL, и там я вижу 2 записи - по адресам 0x0000 и 0xFFFF.
Вопрос: Откуда взялся SP=0???
ROM брал из архива OrionZEmu, файл ROM1-321.BIN, находится по адресу 0x0000.
Вот дизасм того места, вместе с кодом до него:

ROM:0000 ; Segment type: Pure code
ROM:0000 segment ROM
ROM:0000
ROM:0000 loc_0: ; CODE XREF: ROM:0E59p
ROM:0000 ; ROM:0E5Ap ...
ROM:0000 jp loc_15B

ROM:015B ; ---------------------------------------------------------------------------
ROM:015B
ROM:015B loc_15B: ; CODE XREF: ROM:loc_0j
ROM:015B ld hl, 0A000h
ROM:015E
ROM:015E loc_15E: ; CODE XREF: ROM:0161j
ROM:015E dec hl
ROM:015F ld a, h
ROM:0160 or l
ROM:0161 jr nz, loc_15E
ROM:0163 ld a, 98h ; 'Ш'
ROM:0165 out (3), a
ROM:0167 ld a, 92h ; 'Т'
ROM:0169 out (1Dh), a
ROM:016B ld a, 16h
ROM:016D out (3Bh), a
ROM:016F ld a, 56h ; 'V'
ROM:0171 out (3Bh), a
ROM:0173 ld a, 96h ; 'Ц'
ROM:0175 out (3Bh), a
ROM:0177 ld a, 80h ; 'А'
ROM:0179 out (7), a
ROM:017B out (0Bh), a
ROM:017D ld a, 50h ; 'P'
ROM:017F out (0Ah), a
ROM:0181 call sub_19A2

Вот то, что я вижу на анализаторе в это время:
https://image.prntscr.com/image/wk_Y-5SFQ__O9NR-vOR5wQ.png
Сигналы, начиная с ZCLK, - сигналы на "ногах" самого Z80 (после преобразователя уровней, потому что анализатор внутри FPGA). Собственно, начало записи в память находится после пунктирной вертикальной линии.

PS: Из памяти потом читается в обратном порядке (0xFFFF, 0x0000), первое чтение вернуло ранее записанный результат (0x84). Так что преобразователи уровней тут точно не при чём - их работа стабильна "как часы", в частности переключение направления шины данных.
Тестовая прошивка не использовала CALL, а только различные переходы, потому таких проблем не было.

PPS: Тест на работу системы в целом проверен ещё и на самом "базовом" тесте, который есть и в брошурке к ПРОшке. Запуск успешен, прямоугольники по экрану бегают без помех.
Сброс процессора - стабильный, без дёрганий. Кнопку держал секунд 10 точно. Её выход ещё дебаунсером "устаканивается", что бы не было дребезга.

PPPS: Ещё однин запуск - и стартовое содержимое SP уже другое - 0x2c5e. Может процессор палёный?

HardWareMan
14.04.2021, 07:40
Проблема: при старте есть операции CALL, и там я вижу 2 записи - по адресам 0x0000 и 0xFFFF.
Вопрос: Откуда взялся SP=0???
1. Твой код начинается с 0000, стало быть это вектор сброса?
2. Вытекает из первого: так как в коде нет LD SP,#### то в SP там может быть каким угодно (хотя не в курсе конкретно за Z80, может там и очищается).
Так пишут программы только чудаки. Ну или есть ошибка в данных.

OrionExt
14.04.2021, 09:01
Есть такой документ z80-documented.pdf.


Reset (input, active low). Initializes the CPU as follows: it resets the
interrupt ip-ops, clears the PC and IR registes, and set the interrupt mode to 0. During reset time, the address bus and data bus go to a highempedance state, and all control output signals go to the inactive state. Note that RESET must be active for a minimum of three full clock cycles before the reset operation is complete. Note that Matt found that SP and AF are set to FFFFh.

Перевод касательно SP: Обратите внимание, что Мэтт обнаружил, что SP и AF установлены на FFFFh.

Что там Мэтт обнаружил, Или не обнаружил науке это не известно. Соглашусь с предыдущем оратором. Перед использованием стека, код пишется как то так.

ld hl,$F300
ld sp,hl ; set $F300 to stack pointer

call init_ram

Romych
14.04.2021, 09:10
Если в FPGA классический вариант ОрионПРО, то лучше и ПЗУ брать v3.20. В v3.21, Error404 что-то допиливал под свои доработки схемы. Хотя, конечно, в данном случае, до этого дело ещё не доходит.

andreil
14.04.2021, 09:15
1. Твой код начинается с 0000, стало быть это вектор сброса?
2. Вытекает из первого: так как в коде нет LD SP,#### то в SP там может быть каким угодно (хотя не в курсе конкретно за Z80, может там и очищается).
Так пишут программы только чудаки. Ну или есть ошибка в данных.
1. Да, по стандарту Орион-ПРО.
2. ROM не мой, модифицировать его не возьмусь так вот сразу -_-

- - - Добавлено - - -


Если в FPGA классический вариант ОрионПРО, то лучше и ПЗУ брать v3.20. В v3.21, Error404 что-то допиливал под свои доработки схемы. Хотя, конечно, в данном случае, до этого дело ещё не доходит.
Именно, классический, где ROM1+ROM2.

Romych
14.04.2021, 09:51
Ткнул в первый попавшийся ROM1.BIN в папке с ROM-ами Ориона ПРО.



org 00000h

l0000h:
jp 0018bh ;0000
l0003h:
jp l0100h ;0003
l0006h:
jp l0ef4h ;0006
jp l10c8h ;0009
jp l103ah ;000c
jp l126ah ;000f
jp l166bh ;0012
jp l0657h ;0015
jp l17a1h ;0018
- - - - - - -
l019fh:
out (00bh),a ;019f
ld a,050h ;01a1
out (00ah),a ;01a3
xor a ;01a5
out (0fbh),a ;01a6
out (008h),a ;01a8
out (0fah),a ;01aa
ld (0ffbbh),a ;01ac
ld a,01fh ;01af
out (0fch),a ;01b1
ld a,00fh ;01b3
out (0f8h),a ;01b5
ld hl,0ffffh ;01b7
ld a,(hl) ;01ba
cp 05ah ;01bb
jr z,l01c7h ;01bd
ld (hl),05ah ;01bf
dec hl ;01c1
ld (hl),000h ;01c2
dec hl ;01c4
ld (hl),000h ;01c5
l01c7h:
ld sp,0f7c0h ;01c7
call sub_00e5h ;01ca
call sub_0148h ;01cd


Вот еще ROM1-320.BIN


; z80dasm 1.1.5
; command line: z80dasm --origin=0x0000 -al ROM1-320.BIN

org 00000h

l0000h:
jp 0015bh ;0000
l0003h:
....
ld a,098h ;0163
out (003h),a ;0165
ld a,092h ;0167
out (01dh),a ;0169
ld a,016h ;016b
out (03bh),a ;016d
l016fh:
ld a,056h ;016f
out (03bh),a ;0171
ld a,096h ;0173
out (03bh),a ;0175
ld a,080h ;0177
out (007h),a ;0179
out (00bh),a ;017b
ld a,050h ;017d
l017fh:
out (00ah),a ;017f
call sub_1ff9h ;0181
out (008h),a ;0184
out (0f9h),a ;0186
out (0fah),a ;0188
ld (0ffbbh),a ;018a
ld a,01fh ;018d
out (0fch),a ;018f
ld a,00fh ;0191
out (0f8h),a ;0193
ld hl,0ffffh ;0195
ld a,(hl) ;0198
cp 05ah ;0199
jr z,l01a5h ;019b
ld (hl),05ah ;019d
dec hl ;019f
ld (hl),000h ;01a0
dec hl ;01a2
ld (hl),000h ;01a3
l01a5h:
ld sp,0f7c0h ;01a5
call sub_00b5h ;01a8
call sub_0118h ;01ab


А вот в ROM v3.21, дейстрительно, нет инициализации SP! Код, как у Вас.

andreil
14.04.2021, 10:22
А вот в ROM v3.21, дейстрительно, нет инициализации SP! Код, как у Вас.
В коде ROM1-320 так же нет инициализации до вызова первого - смотри адрес 0x0181. Там идёт вызов уже, а инит SP - по адресу 0x01a5.
В общем, я у себя эту инициализацию просто поменял местами - сперва инит SP по адресу 0x015b, потом весь остальной код.

HardWareMan
14.04.2021, 10:31
Чудесный Орион-ПРО чудаками создан. :)

А что у вас там по адресу вызова до инициализации SP? Может там RET и не требуется?

- - - Добавлено - - -


Что там Мэтт обнаружил, Или не обнаружил науке это не известно.
Кто-то же разбирал, вроде, Z80 как мы ВМ80? Призовите его сюда, он прояснит. А в ВМ80 обнуляется только PC, всё остальное не тронуто, как и триггер обмена HL и DE.

andreil
14.04.2021, 10:34
Чудесный Орион-ПРО чудаками создан. :)

А что у вас там по адресу вызова до инициализации SP? Может там RET и не требуется?
Требуется - там проверка бита в одном из портов.
Пока дальше отлаживаю, сравнивая пошагово с эмулятором - пока что тяжело, потому что ROM2 никак не уместить в ячейки кристалла :(

HardWareMan
14.04.2021, 10:43
Быстрый гуглёж выдаёт только такие наблюдения:

Well, a real Z80 resets SP to 0x0000. I'm guessing on power-on the SMS Z80 SP is also 0x0000. However, on the SMS the Reset button is software controlled, so on reset the SP could be anywhere, depending on the game that's running.
Т.е., при включении питания там вполне может быть 0000, а при сбросе - то, что было в последний раз. Т.е., даже 0000 нелогично для стэка, т.к. там ПЗУ.

andreil
14.04.2021, 10:48
Быстрый гуглёж выдаёт только такие наблюдения:

Т.е., при включении питания там вполне может быть 0000, а при сбросе - то, что было в последний раз. Т.е., даже 0000 нелогично для стэка, т.к. там ПЗУ.
Да, уже заметил такое поведение - после сброса там часто оказывалось 0x3FFF, что попадало на область ROM2, в итоге запись в память так же не происходила.

Error404
14.04.2021, 21:05
В 3.21 вполне возможны баги - он сделан из 3.20 в HEX-редакторе - оба и ROM1 и ROM2
С какой целью делалось: в нем есть ЕМНИП более правильная поддержка инициализации IDE для авторской схемы (что выражается в том что на 3.20/2.10 не работала половина IDE устройств), п.п 0F834 для загрузки Альтаир-Дос в режиме 128 без MBOOT$/Ordos (а просто поставив нужный джампер) и "РОМ-диск для бедных" (8к в теле ROM2?) Что-то в ROM1, что-то в ROM2. Там увязаны оба ROM, надо оба ставить 3.21. Никаких аппаратных изменений это за собой не тянет, более того в 3.21 правильно инициализируется порт 0FBh (заработает больше игр ZX если делать доработки для этого порта). Несмотря на косяк со стеком, именно 3.21 у меня все время использовался в реале, как-то работал. :)

Но хорошо что нашли этот баг. Поправленную версию положите на форуме, например тут. Остальное же там не отключали?

andreil
14.04.2021, 21:26
Но хорошо что нашли этот баг. Поправленную версию положите на форуме, например тут. Остальное же там не отключали?
Только инициализацию стэка сместил. Исправленный вариант во вложении.
Попробую на выходных подключить оба ROM'а к своей макетке, надо ещё буфера добавить и кучу МГТФа :(