Легко!
Исходно 551 файл, суммарно 1461кБ
Сжато MLZ - 644 352 б
Сжато ZX0 - 605 339 б
Если отсечку делать по 7 секторов (1792б) - тогда на диск грубо говоря не 300 треков влезет, а 333
И таак сойдет (с)-2
Вид для печати
Процедурка для посторение таблицы TR/SEC:
Код:TRSEC_CALC:
ld a,[сколько секторов пропустить]
ld de,(TRSEC)
ld b,#10
add a,e
TRSEC_CALC2:
ccf
sub b
jr c,TRSEC_CALC1
inc d
jr TRSEC_CALC2
TRSEC_CALC1:
add a,b
ld e,a
ld (TRSEC),de
ret
у него скорее пропуск секторов возможен >255 (тут уже рег.пара нужна)
Надеюсь я понял правильно назначение процедуры.
Попробую реализовать. Спасибо.
Попробую, это не сложно.
Я сделал процедуру tiboh, теперь прыгает вперед на 10 треков и на 100.
Можно ли то же самое, но назад?) понимаю, что надо inc на dec менять, но я запутаюсь в сложении вычитания)
А каким образом делается переход на 10 и 100 треков сразу? Складываются смещения (длины) всей пачки и затем плюсуются к #5CF4? Тогда и менять ничего не нужно, достаточно один раз запомнить _исходное_ содержимое переменной #5CF4 ( начало первого трека),а затем плюсовать к сохраненному значению нужное смещение. Два байта памяти, думаю, не проблема.
А что за задача стоит?
Вот таким способом, без цикла, можно делать пропуск от 1 до 240 секторов:
Код:LD DE,[TR/SEC]
LD A,[Skip Sectors 1-240]
ADD A,E
LD B,A
AND #0F
LD E,A
LD A,B
RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,D
LD D,A
RET
Как бы сделать покрасивше:
в зависимости от состояния флага C поставить или сбросить 0-й бит в памяти по адресу (HL)?
Аккумулятор свободен.
Код:if CY=1
set 0, (HL);
else
res 0, (hl);
jerri, так а что rl (hl)? Мне (HL) двигать нельзя, биты 1-7 должны быть там, где они есть. Только нулевой бит нужно установить/сбросить.
Хорошо. А если не нулевой бит?
Код:if CY=1
set 5, (HL);
else
res 5, (hl);
Ну с переходом ясно. Думал, может есть какой-то красивый метод без перехода.
Красивые методы обычно ухудшают читабельность программы.
ld a, 0
vs
xor a
Что-то подобное я имел в виду под "красивым методом".
Пусть себе ухудшают. Место критическое к скорости.
Обдумайте, как его оптимизировать алгоритмически. В данном случае инструкции SET/RES просто находка, на ВМ80 было бы длиннее, c использованием аккумулятора, двумя переходами, и флаги бы были испорчены без их сохранения.
- - - Добавлено - - -
По ТЗ требуется:
if CY=1
set 0, (HL);
else
res 0, (hl);
вообще все эти трюки для неиспользования переходов полезны на х86, а на z80 каждый такт на вес золота )
Ну да, это крайности. В прямом смысле слова.
Схожий трюк можно проделать, если нужно сбросить/установить нулевой бит в аккуме или (HL), но перед этим проверить его.
Наиболее очевидны команды BIT 0,x: RES 0,x - но скроллы сэкономят байт: RRCA и следом SLA A/SLI A, для (HL) аналогично.
Ну и затем проверяем флаг переноса, а не нуля.
Очень странный и показательный ( в прямом смысле) тест инструкции CCF (ну или SCF)
По идее он проверяет установку\снятие 3 и 5 флагов, если не путаю.Код:.loop push hl
pop af
ccf
push af
pop bc
ld a,l
xor c
ld (hl),a
inc hl
ld a,h
and d
ld h,a
jp .loop
Вот только КАК он это делает - я плохо понимаю.
И да, это не для эмулей, они такое не могут эмулить. А вот на некоторых реальных процессорах красиво получается
https://drive.google.com/file/d/1lxI...ew?usp=sharing
Этого "мусора", в виде шевелящихся черных\белых точек - в эмулях не бывает.
Если это и глюки - то довольно интересные)))))
У меня 3 (три!) штуки профика и десяток процессоров Z80. От платы эти глюки не зависят, а онли от производителя процессора) На Зилогах такого нет, на ST, Sharp, Т34 и пр. - как с добрым утром :) Подделки? не думаю (с) :))))))
Просто это особенности работы флагов CCF\SCF, которые нафик никомуу не нужны, но все же эти особенности есть)
(Ну или проектировщики профиков совсем л.)
Вот ST-шка
https://drive.google.com/file/d/1N1h...ew?usp=sharing
во первых другой паттерн, ну и точки белые, в правом квадрате побольше, слева - поменьще, но они есть.
И это не артефакты экрана . Это уже в памИтИ так :)
Он ничего не проверяет, он строит регулярную картинку по заданному алгоритму, берет младший байт текущего адреса, ксорит с регистром F после CCF, и выводит на экран.
Это не весь тест, а его фрагмент, так как неизвестно содержимое регистров D и HL. Похоже, в HL выставлен #4000, а в D маска, не дающая HL выйти за пределы 4кб области, типа $EF.
Если содержимое F после CCF нестабильно, на регулярной картинке будут мерцающие точки.
Эмули могут всё сэмулить, была бы в этом необходимость. Раз на Zilog такого нет, я этим заниматься не буду)
Кстати, тут на форуме человек давно предполагал подобное поведение флагов 3 и 5 после CCF/SCF, но на реальные тесты его не хватило) Однако, на Зайлогах такой нестабильности не оказалось, что радует (меньше возни писателям эмулей :) ).
Новый тест Патрика проверяет разницу SCF\CCF у трех производителей, Zilog, ST, NEC. Мои процессоры (кроме Zilog и GS) ни в одну категорию не попадают. А именно NEC у меня и нет.
Не вижу особого смысла разбираться с поведением клонов Z80 на недокументированных фичах. Ибо там они могут плясать кто во что горазд.
- - - Добавлено - - -
Ссылка на то сообщение. Предполагается, что с понижением частоты проца его поведение для недокументированных флагов будет изменяться.
А никто никого и даже не просит разбираться. Колхоз - дело добровольное
https://s.micp.ru/E7yZL.jpg
и да, на картинках - два разных Зилог-а. Шах и мат.
И вполне ожидаемый "мусор" на втором зайлог-е
https://s.micp.ru/8rme9.jpg