PDA

Просмотр полной версии : Нужна помощь в загрузке с ленты(эмуль)



Dwa83
05.06.2018, 17:11
Решил немного изменить стандартную процедуру загрузки, находящейся по адресу 1366. Многое прочитал, скопипастил процедуру загрузки с книжки. Не работает. Пилот-тон не хочет видеть. Изменив временнЫе значения - все фронта видит, но считывает неправильно. На последний момент пробы было изменено всего две строчки(приведены устоявшиеся названия подпрограмм):

LD_LEADER LD B,#9C ;7
CALL LD_EDGE_2 ;17

JR NC,LD_BREAK ;12,7

LD A,#C2 ;вместо C6 ;7

и


LD_8_BITS CALL LD_EDGE_2 ;17
RET NC ;11,5

LD A,#C6 ;было CB ;7

После изменения времени сравнения и пилот-тон и байты(синхроимпульс считывает без ошибок) стали хотя бы работать, и даже после загрузки байт маркер(который до этого считывался с рандомным значением при каждой пробе загрузки от 01111111 до 00000011 и даже 00000000) стал правильным. Первые несколько байт совпадали с теми, что в тайп-менеджере показывалось в блоке загружаемого кода(дальше пока не проверял). При запуске программы - всё равно сброс(видимо не всё до конца считалось правильно).

Вопрос проcтой: почему так?

Вызывал из ПЗУ - норм работает.

Погрешил на ошибки в книге. Посмотрел несколько источников - одинаково. Посмотрел ПЗУ дизассемблером - одинаково. (За исключением отсутствия куска кода VERIFY. Добавил и его, там три строчки)

Слышал, что первая банка памяти работает быстрее, чем остальные.. А я помещаю загрузчик в 25000 для пробы. Может из за этого временнЫе интервалы в константах менять приходится? А почему тогда синхроимпульс без проблем?
Кто что подскажет?

На всякий:

сам кусок кода


ORG 25000

LD DE,15315
LD IX,32768
LD A,255
SCF


; DI
;NXT LD B,0
; CALL LD_EDGE_1
; JR NXT




LD_BYTES INC D ;4 УСТАНОВИМ ФЛАГ Z В 0
EX AF,AF' ;4 И СОХРАНИМ В РЕЗЕРВЕ
DEC D ;4
DI ;4
LD A,#0F ;7 БЕЛЫЙ ЦВЕТ БОРДЮРА
OUT (#FE),A ;11
LD HL,#053F ;10
PUSH HL

;-------------------------------
IN A,(254) ;11 ЗАПОМИНАЕМ ПЕРВОЕ ЗНАЧЕНИЕ ПОРТА
RRA ;4 СМЕЩАЕМ С 6 НА 5 БИТ ВХОДА
AND 32 ;7 ВЫДЕЛЯЕМ ТОЛЬКО 5 БИТ
OR 2 ;7 ПРИБАВИМ КРАСНЫЙ ЦВЕТ
LD C,A ;4 ХРАНИТ ЗНАЧЕНИЕ ПОРТА И КРАСНОГО БОРДЮРА
CP A ;4 УСТАНОВИМ ФЛАГ Z В 1 ЧТОБ НЕ ВЫЙТИ НА СЛЕДУЮЩЕЙ СТРОКЕ

LD_BREAK RET NZ ;11,7
LD_START CALL LD_EDGE_1 ;17
JR NC,LD_BREAK ;12,7

;ПРОИЗОШЛО ИЗМЕНЕНИЕ БИТА - ПОШЁЛ СИГНАЛ

LD HL,#0415 ;10 / 2 698 195 ТАКТОВ
LD_WAIT DJNZ LD_WAIT ;10,6 |
DEC HL ;6 |
LD A,H ;4 |
OR L ;4 |
JR NZ,LD_WAIT ;12,7 \


CALL LD_EDGE_2 ;17
JR NC,LD_BREAK ;12,7

LD_LEADER LD B,#9C ;7
CALL LD_EDGE_2 ;17

JR NC,LD_BREAK ;12,7

LD A,#C2 ;7
CP B ;4 ПРОВЕРЯЕМ ВРЕМЯ

JR NC,LD_START ;12,7

INC H ;4 256 ПАР ИМПУЛЬСОВ
JR NZ,LD_LEADER ;12,7

LD_SYNC LD B,#C9 ;7
CALL LD_EDGE_1 ;17

JR NC,LD_BREAK ;12,7
LD A,B ;4
CP #D4 ;7
JR NC,LD_SYNC ;12,7

CALL LD_EDGE_1 ;17 ОЖИДАЕМ КОНЕЧНЫЙ ФРОНТ СИНХРОИМПУЛЬСА
RET NC ;11,5 НЕ ДОЖДАЛИСЬ

LD A,C ;4
XOR #03 ;7 МЕНЯЕМ ЦВЕТ БОРДЮРА НА СИНИЙ
LD C,A ;4

LD H,#00 ;7
LD B,#B0 ;7

JR LD_MARKER ;12


LD_LOOP
EX AF,AF' ;4
JR NZ,LD_FLAG ;12,7
JR NC,LD_VERIFY ;12,7
LD A,255
LD (65500),A
LD (IX+0),L ;19
JR LD_NEXT ;12
LD_FLAG

RL C ;4
XOR L ;4

RET NZ ;11,5
;CALL DEB
LD A,C ;4
RRA ;4
LD C,A ;4
INC DE ;4
JR LD_DEC ;12
LD_VERIFY LD A,(IX+0)
XOR L
RET NZ
LD_NEXT INC IX ;10
LD_DEC DEC DE ;6
EX AF,AF' ;4
LD B,#B1 ;7
LD_MARKER
LD L,01 ;7
LD_8_BITS CALL LD_EDGE_2 ;17
RET NC ;11,5

LD A,#C6;CB ;7
CP B ;4
RL L ;4
LD B,#B0 ;7
JP NC,LD_8_BITS ;10

LD A,H ;4
XOR L ;4
LD H,A ;4

LD A,D ;4
OR E ;4
JR NZ,LD_LOOP ;12,7

LD A,H ;4
CP #01 ;7
RET ;10

LD_EDGE_2 CALL LD_EDGE_1 ;17
RET NC ;11,5 ВЫХОД ПО BREAK

LD_EDGE_1
;-----------------------------------------------
LD A,22 ;7 /ЗАДЕРЖКА 358 ТАКТОВ
LD_DELAY DEC A ;4
JR NZ,LD_DELAY ;12,7
AND A ;4 \
;-----------------------------------------------

LD_SAMPLE INC B ;4 ПРОВЕРКА СЧЁТЧИКА ВРЕМЕНИ
RET Z ;11,7 Z-ЕСЛИ ВРЕМЯ ИСТЕКЛО

;-----------------------------------------------
LD A,#7F ;7 ПРОВЕРКА КЛАВИШИ BREAK
IN A,(254) ;11 И СЧИТЫВАНИЕ ЗНАЧЕНИЯ ВХОДА
RRA ;4
RET NC ;11,7
;-----------------------------------------------

XOR C ;4
AND 32 ;7
JR Z,LD_SAMPLE ;12,7 ЗНАЧЕНИЕ БИТА НЕ ИЗМЕНИЛОСЬ


LD A,C ;4 ИНВЕРТИРУЕМ БИТ И ЦВЕТ ФОНА
CPL ;4
LD C,A ;4 СОХРАНИМ ОБРАТНО В С

AND #07 ;7 ВЫДЕЛИМ ТОЛЬКО ЦВЕТ
OR #08 ;7 УСТАНОВИМ БИТ ДИНАМИКА
OUT (254),A ;11 ОТПРАВИМ В ПОРТ
SCF ;4
RET


;--------------------ПОКА НЕ ЗАДЕЙСТВОВАНО
COLOR ;364
LD HL,22893 ;10
LD C,(HL) ;7
LD B,7 ;7
C4 INC HL ;6 323
LD A,(HL) ;7
DEC HL ;6
LD (HL),A ;7
INC HL ;6
DJNZ C4 ;13,8
LD (HL),C ;7
RET ;10
;--------------------
DEB ;ОТЛАДОЧНАЯ-ИНДИКАЦИОННАЯ
PUSH HL
PUSH BC
DB0 LD HL,16384
LD B,8
DB1 LD A,255
XOR (HL)
LD (HL),A
INC H
DJNZ DB1


LD A,#7F ;7 ПРОВЕРКА КЛАВИШИ BREAK
IN A,(254) ;11 И СЧИТЫВАНИЕ ЗНАЧЕНИЯ ВХОДА
RRA ;4
JR C,DB0 ;11,7

POP BC
POP HL
RET

Dwa83
05.06.2018, 17:25
Попробую до #BFFF и после #BBD3, так как с #8000 по #BBD3 сама программа. Посмотрю что получится.

Dwa83
05.06.2018, 17:45
Вау, работает! Поместил загрузчик в #BBE0. И считало без заковык и запустилось. Спасибо за инфу про медленную #4000-#7FFF, буду знать.
А напоследок вопрос. Я так понимаю, что эти нежелательные задержки работы с памятью вызваны аппаратным сетом. Неужели разрабы эмулей програмно эмулируют полностью физическую работу чипов?