|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Радио-86РК на SRAM 128K Alpha (2014) & Beta (2024)
Author |
Message |
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 138 Location: 93.80.157.217
|
всё ж таки интересует скорость на 8080, т.к. в нём нет хитросделанных команд, да и скорость РК так себе (особенно на 1,77) плюс, мне ещё пришлось решать задачу -- как сделать распаковщик без использования ОЗУ (без команд PUSH/POP, CALL/RET), т.к. мой распаковщик находится в теневом ПЗУ и память ему недоступна.
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
27 Jan 2024 22:52 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Пишу депакер для 8080 на основе перемещаемого z80-кода - пока получается 48 тактов на один байт непакованных данных (на 1 такт быстрее чем z80): а простое копирование байтов в 8080 (из HL в DE с размером блока в BC) занимает столько же: т.е. для плохосжимаемых данных оно занимает как минимум столько же, сколько и простое копирование Сжатые данные будут обрабатываться чуток похуже и мне нужен стек, чтобы периодически прятать туда внутренние переменные - с другой стороны это же подпрограмма - её вызвали через CALL т.е. стек в системе есть, однако ей похоже и память будет нужна, чтобы сохранять 2 байта по ходу пьесы (последняя использованная длинная дистанция - в z80-коде я юзал регистр IY для этой цели). P.S. Вот как-то так получилось - размер после ассемблирования 137 байт: deshaff0.asm | | | | Code: ; SHAFF0 block depacker for 8080/8085 written by Shaos on 27-JAN-2024 ; See http://nedoPC.org/forum/ for more info about SHAFF packer ; This code is PUBLIC DOMAIN - use it on your own RISK!
; This depacker is doing decoding of a single data block with size <=16KB ; No SHAFF header is expected - it's already known that it's SHAFF0 format: ; 1st byte sets a Key to use further instead of #FF (but usually it's #FF) ; then any byte other than Key goes directly to output ; #FF 00000000 - single byte #FF, otherwise ; #FF 0xxxxxxx LENGTH - distance 1..127 and LENGTH (see below) ; #FF 10xxxxxx LENGTH - distance 128..190 and LENGTH (see below), but ; #FF 10111111 LENGTH - reuses previous long distance -191 or longer ; #FF 11xxxxxx xxxxxxxx LENGTH - directly encoded long negative distance, but ; #FF 11000000 00000000 - end of block (with no length after) ; where LENGTH encoded by 1 or 2 bytes: ; 1xxxxxxx - for 4..131 ; 01xxxxxx - for 132..195 ; 00xxxxxx xxxxxxxx - direcly encoded length for up to 16383
; Size of assembled code is 137 bytes ; HL - address of packed data (data starts with a key byte) ; DE - pointer to the buffer where depacked data should appear (16KB max) ; Subroutine uses 2 bytes of memory as variable (DSH0D)
DESHAFF0: mov b,m ; B is a Key byte (#FF in normal case) inx h DSH0L: mov a,m ; +7=7 ; main loop inx h ; +5=12 cmp b ; +4=16 ; compare with a Key jz DSH0FF ; +10=26 DSH0LL: stax d ; +7=33 ; it was not a Key so decode byte as is inx d ; +5=38 jmp DSH0L ; +10=48 ; 1 byte of unpackable data takes 48 clock cycles DSH0FF: mov a,m ; read byte after Key inx h ora a ; check for 0 jnz DSH0F1 mov a,b ; it was 0 after a Key so decode it as Key value jmp DSH0LL ; go back to the loop DSH0F1: mov c,a ; it was not 0 after a Key so store it and ani 0C0H ; check if it's 1-byte distance cpi 0C0H ; by comparing 2 most significant bits with 11 jz DSH0F2 ; go to handle 2-byte case ; 1-byte distance mov a,c ; now check if distance is 191 (special case) cpi 0BFH jz DSH0F3 ; go to special case handler push b ; temporarily push Key to stack xra a ; clear A and flagC ; mov b,a ; here BC is a distance back (1..190) ; mov a,b ; invert B cma mov b,a mov a,c ; invert C cma mov c,a inx b ; make it two's complement negative number jmp DSH0LN ; go to read length ; 2-byte distance DSH0F2: push b ; temporary push Key to stack mov b,c ; it should be 2-byte distance, so this is higher byte mov c,m ; read lower byte of the distance inx h ; now BC is a negative distance for 2-byte case - save it mov a,c sta DSH0D mov a,b sta DSH0DH ; check for end of the block mov a,b cpi 0C0H ; compare higher byte with #C0 jnz DSH0LN ; go to read length mov a,c ori 0 ; compare lower byte with #00 jnz DSH0LN ; go to read length pop b ; balance the stack before return ret DSH0F3: push b ; temporary push Key to stack ; retrieve stored distance lda DSH0D mov c,a lda DSH0DH mov b,a ; now BC is a negative distance for special case DSH0LN: mov a,m ; read length code from stream add a ; check if bit 7 of length code was 1 jnc DSH0L1 ; if not go to next step ; 1xxxxxxx - Length 4..131 (0x80->4, 0x81->5 ... 0xFF->131) mov a,m ; read length code from stream again sui 7CH ; convert code to actual length DSH0L0: inx h push d ; temporarily push DE to stack mvi d,0 ; higher byte of the length is 0 mov e,a ; lower byte of the length is taken from A jmp DSH0L3 DSH0L1: add a ; check if bit 6 of length code was 1 jnc DSH0L2 ; if not go to next step ; 01xxxxxx - Length 132..195 (0x40->132, 0x41->133 ... 0x7F->195) mov a,m ; read length code from stream again adi 44H ; convert code to actual length jmp DSH0L0 DSH0L2: push d ; temporarily push DE to stack ; 00xxxxxx xxxxxxxx - Length up to 16383 mov d,m ; read higher byte of the length from stream again inx h mov e,m ; read lower byte of the length from stream inx h DSH0L3: xthl ; exchange top of the stack (stored DE) with HL push d ; push length of the data to stack mov d,h mov e,l ; now DE is current destination address dad b ; now HL is address of the reference pop b ; now BC is length of the data to copy ; perform copying of the data (as if it's LDIR) DSH0L4: mov a,m stax d inx h inx d dcx b mov a,c ora b jnz DSH0L4 pop h ; restore old source pop b ; restore a Key jmp DSH0L ; go back to main loop DSH0D: db 0 ; lower byte of last used long distance DSH0DH: db 0 ; higher byte of last used long distance
| | | | |
Ща пойду проверять... вроде работает
|
27 Jan 2024 23:55 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
На эмуляторе Emu80 декодирование fonts.bff происходит почти мгновенно - завернул это всё в цикл, который запускается 100 раз и получил 12.8 секунд т.е. одна распаковка заняла 0.128 секунды, что примерно соответствует 1777777*0.128=227555 без учёта ПДП (надо чтоли научиться отключать его временно), а если предположить, что ПДП съедает 10% CPU, то это будет примерно 100 тактов на 1 байт (напомню, что сжатый SHAFF0 образ весит 1501 байт, которые распаковываются в 2048): Вот исходник тестовой программки, собираемой через pdp11asm от vinxru: После возвращения программы в монитор я сохранил образ памяти и сравнил с файлом fonts.bin - первые 2КБ как и ожидалось, совпадают P.S. 1/8 секунды на распаковку сжатых через SHAFF0 шрифтов это достаточно быстро - так что пожалуй надо ещё и депакер SHAFF1 на 8080 портировать, раз уж на то пошло В этом случае сжатие будет ещё лучше - 1108 байт вместо 1501, но если сохранится тенденция и депакер SHAFF1 будет в 12 раз медленнее чем депакер SHAFF0 (как на Z80), то распаковка шрифтов займёт уже полторы секунды, но сэкономит ещё 400 байт...
|
28 Jan 2024 11:53 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Ребяты, а как ПДП отключить временно? Чото я с ходу не нахожу...
|
28 Jan 2024 12:42 |
|
|
Alikberov
Maniac
Joined: 14 Oct 2019 18:10 Posts: 327 Location: Tashkent
|
|
28 Jan 2024 12:52 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
О, круто - спасибо! С выключенным ПДП сто циклов крутятся 9.4 секунды, т.е. ПДП съедает не 10%, как я предполагал, а все 35% CPU Значит реальное быстродействие депакера SHAFF0 на 8080 (применительно к распаковке двойных шрифтов) - примерно 82 такта на 1 байт (что на 70% медленнее теоретического максимума 48 тактов на байт в случае непакуемых данных). Поправленная тестовая программа - под спойлером: test.asm | | | | Code: .i8080 ; i8080 assembler code prompt equ 0F86Ch puts equ 0F818h
org 0 jmp start
ds 2045
start: lxi h,msg call 0F818h
; disable DMA mvi a,80H sta 0E008H
lxi h,100 shld count
mainloop:
lxi h,PACKED+12 lxi d,0 call deshaff0
lhld count dcx h shld count mov a,l ora h jnz mainloop
; enable DMA call 0F82DH
jmp prompt
count dw 0
msg: db 1fh,'SUPER-86RK/128K',0dh,0ah,0
.include "deshaff0.asm"
PACKED:
insert_file "fonts.bff"
make_radio86rk_rom "test.rkr"
| | | | |
P.S. Попробовал 1000 циклов - с работающий ПДП получилось по секундомеру 2:03 или 123 секунды, а с выключенным - 1:30 или 90 секунд, т.е. разница между ними 36.6% (это если в качестве основания брать работу без ПДП, а если считать какое будет ускорение при выключении ПДП, то получится порядка 26.8%). С такой точностью скорость распаковки получается примерно 78 тактов на байт (на самом деле скорость зависит от самих данных насколько они запакованы т.е. как много в них повторяющихся последовательностей). P.P.S. Эмулятор Emu80 оказывается пишет время работы ПДП (как процент от общего времени работы) внизу справа - 27%
|
28 Jan 2024 13:13 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Наконец-то я это сделал - произвёл хирургическое вмешательство в свою продолжающуюся сборку Radio-86RK SRAM 128K для исправления вышеописанной ошибки через 10 лет после того как alexcp её обнаружил и предложил способ её устранения После просверливания переходного отверстия округлённого на фотке надо будет RESET с первой ноги ГФ24 проводочком подать на третью лапку микросхемы IC9 (там как раз метализированное переходное отверстие имеется - на фотке это место помечено стрелочкой)...
|
28 Jan 2024 20:20 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
По прошествию 10 лет таки расписал полную карту памяти для своего клона клона: и вставил её в первое сообщение топика, чтобы народу не приходилось самостоятельно по схеме разбираться. P.S. Заодно немножко почистил тему от срача - если кто заметил, что тут стало меньше страниц. P.P.S. Также, пока есть задор, исправил свою схему 10-летней давности в Eagle v5.12 по указаниям от alexcp, но разводку пока не исправляю и заказывать новый вариант не буду, пока не дособеру и не доотлажу старый вариант - может ещё чего вылезет например с переключением страниц ОЗУ или звуком, да и ещё надо выкинуть атмегу - может ещё и под цвет место освободится P.P.P.S. В следующей версии со сменным шрифтом (Super-86RK) планирую ещё побить #E000...#EFFF на пополам, чтобы вторая половина (#E800...#EFFF) использовалась для записи в шрифты и ещё надо будет добавить второй регистр управления (наряду с #F000) для управления новым цветом (переключение палитр/шрифтов и установку акцентов) - скорее всего это будет #F001 (т.е. эти два регистра будут чередоваться по всему диапазону #F000...#FFFF в чётных и нечётных адресах).
|
29 Jan 2024 09:47 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Доразвёл порт C и наставил резюков, диодов и светодиодов, а также надписей понаписал Текущий размер платки 9.1 x 3.3 дюйма (23.1см х 8.4см)...
|
31 Jan 2024 00:48 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Выкинул атмегу - место освободилось только под разъёмы на матричную клаву Ещё выкинул индикацию РУС/ЛАТ т.к. она теперь будет на плате клавы - в результате высвободился один инвертор, который я воткнул вместо одного вентиля И-НЕ, который до этого использовался как инвертор, а высвободившийся гейт И-НЕ вставил на разрешение буфера по рецепту от alexcp. Также сделал плату ширше, чтобы заполнить все разрешённые стандартной лицензией 16x10 см и поставил туда гребёнки контактов - выводы ВГ75, которые могли бы представлять интерес (плюс 2 старших бита знакогенератора под цветной шрифт) - пока вот схема (плату недоразводил):
|
01 Feb 2024 21:24 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Доразводил плату беты Недоразведёнными остались шесть адресных линий на разъёме расширения (т.е. ещё меньше, чем в альфе): A2,A3,A4,A5,A6,A7 (если кому нужен будет разъём - например мне, то надо будет кинуть проводочки) кинуть проводочки Проводочек на сигнал A2: Проводочек на сигнал A3: Проводочек на сигнал A4: Проводочек на сигнал A5: Проводочек на сигнал A6: Проводочек на сигнал A7: Монтажка: Архив с исходниками и герберами (тот же урл, что был для альфы, но теперь там бета): http://nedopc.org/nedopc/radio/rk86new.zip (2.2MB)Тут же в архиве есть ZIP с герберами в формате JLCPCB - они берутся изготовить 5 плат за полсотни баксов плюс доставка: Интересно, что пока я не был залогинен они показывали цену $36, а как залогинился и перезалил - добавили "Via Covering" $16.96 - это типа покрытие переходных отверстий? Я как бы их файл конверсии использовал для игла - выходит они специально там их открыли, чтобы потом денег "лишних" содрать при заказе за их закрытие...
|
02 Feb 2024 02:04 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Не вывел 2 тактовых сигнала для регистра аля Апогей - их придётся проводочками цеплять прям к ногам микрух (а то мало ли - наводки мне наведут при таком плотной разводке) P.S. Внешний вид платы с приближением: P.P.S. Если сделать эту версию платки в синем цвете, то она может выглядеть примерно так: P.P.P.S. Список компонентов для этой версии платы:
|
02 Feb 2024 10:50 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Кстати экранная область будет всегда из активной страницы ОЗУ браться! Это значит, что чтобы не сбивалась синхронизация на телеке, надо заполнить нулями область экрана во всех четырёх страницах! Также это означает, что у нас есть 4 РАЗНЫХ ЭКРАНА, которые могут мгновенно переключаться между собой P.S. Интересно, считать это "багом" или "фичей"? Я думаю изначально (конец 2013) я наверное планировал, чтобы ПДП обращался только к нулевой странице ОЗУ - по идее это реализуемо, но потребует некоторой дополнительной логики...
|
02 Feb 2024 19:56 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22735 Location: Silicon Valley
|
Раз уж мы взялись править монитор (хотя бы для того, чтобы почистить все экраны), то можно некоторые апогеевские директивы добавить - ниже список букв в алфавитном порядке где подсвечено жирным то, что было на РК86 (и стрелочками что хотелось бы добавить): A - загрузить данные с магнитофона в формате Микроши B - сохранить данные на магнитофон в формате Микроши C - сравнить блоки данных в памяти D - напечатать значения байтов из памяти в 16-ричном виде E F - заполнить память байтом G - запуск программы по адресу H - показать сумму и разность двух слов <==I - загрузить данные с магнитофона J - прочитать данные с магнитофона в формате MSX K - посчитать контрольную сумму блока данных <==L - напечатать значения байтов из памяти в виде символов M - вывод и модификация ячеек памяти N O - вывести данные на магнитофон P - тест ОЗУ и ПЗУ ???Q - показать константы скорости для работы с магнитофоном R - чтение данных из квазидиска S - произвести поиск байта в диапазоне адресов T - пересылка блока данных в пределах памяти U - скрытая директива, перекидывающая на адрес 0F000H V - недокументированная директива для записи во внешнее запоминающее устройствоW - произвести поиск слова в диапазоне адресов <==X - вывод и модификация содержимого регистров процессора Y Z - сохранить данные на магнитофон в фромате MSX Также можно добавить директиву дизассемблера и скажем помощь P.S. В существующем мониторе РК уже есть типа "пользовательская" директива U - если её ввести, то управление будет передано на адрес #F000 (туда же будет передано управление, если введённая директива непонятна) - вот на неё и можно прицепить дизассемблер
|
03 Feb 2024 03:44 |
|
|
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 138 Location: 93.80.157.217
|
вместо того, чтоб разместить в Мониторе действительно полезный код, давайте его забьём мусором? как часто понадобиться загружаться с магнитофона во всех мыслимых форматах?
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
03 Feb 2024 04:39 |
|
|
Who is online |
Users browsing this forum: No registered users and 0 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|