Вот я собственно тоже уже лет так 15 не открывал его :)
Вид для печати
Да, что то я стал забывать, посмотрел, действительно, надо его защелкивать инверсным ALE на тм2. И как раз увидел еще момент - на А18 в моменты активности /RD или /WR присутствует флаг разрешения прерываний. Соответственно можно эту ножку именно по /RD защелкивать на второй половинке тм2, и этим управлять разрешением прерывания от NMI.
Mick, извини, но в текущем варианте даже не хочется разбираться, надо упрощать "схему начального пуска". Если выбирать между этим вариантом и предлжением PVV, то я однозначно за его, подумаешь добавить регистр, зато просто и понятно.
Если хочется спасти вариант без A19, то для отключения не стоит зацикливаться только на адресных линиях. Можно отключать например по факту обращения к порту. Т.е. jmp far (сделали CS=0) и потом in или out.
Не, ну какой вредный.
Вот вариант с A19 - https://disk.yandex.ru/d/OoTICcrkyOMKEQ
Можно еще один подрисовать, где по A19 рулить выбором ПЗУ или ОЗУ, но тогда сам понимаешь надо будет играться с сегментами и об этом надо будет помнить.
Видишь, как здорово, даже ошибиться особо негде (я про схему начального пуска).
Поправил печатную плату согласно последней схеме с A19
https://i.ibb.co/LpGvSD2/zx8088-pcb.png
- - - Добавлено - - -
Тут в качестве оффтопа нашел у себя на работе старую плату от факса и там вон какая плюшка
https://i.ibb.co/6gyJ6dR/IMG-20220603-165002.jpg
UPD70208 - NEC V40 и он тоже умеет эмулировать 8080А, ссылка на даташит - https://www.google.com/url?sa=t&rct=...54273844674378
- - - Добавлено - - -
Нашел пример, как типа эмуляция включается V20
Код:
; SBCV20 terminal test program
; Assembler: asm86.com/asm86.cmd
;
MEM equ 0000h ;Memory top
ROM equ 8000h ;Rom top
STACK equ 8000h ;Stack top
REGAD equ 00h ;8251 data register
REGAC equ 01h ;8251 control register
RTSHIG equ 17h ;RTS high
RTSLOW equ 37h ;RTS low
;
BUFSIZ equ 128 ;Buffer size(2^n, max128)
FULSIZ equ BUFSIZ*14/16 ;Buffer almost full
;
dseg MEM
org 0000h
;
; Interrupt vector
DEVERR rw 2 ;Devide error
BRKFLG rw 2 ;Break flag
NMIREQ rw 2 ;Non maskable interrupt
BR3INS rw 2 ;BRK3 instruction
BRVINS rw 2 ;BRKV instruction
CHKINS rw 2 ;CHKIND instruction
org 0400h-20
VGETCH rw 2 ;CALLN 251
VKBHIT rw 2 ;CALLN 252
VPUTCH rw 2 ;CALLN 253
VBRKEM rw 2 ;BRKEM 254
INTREQ rw 2 ;External interrupt
;
; Receive buffer
RECBUF rb BUFSIZ
RBFRDP rw 1
RBFWTP rw 1
RBFCNT rb 1
;
cseg MEM
org ROM
;
; 8251 -> buffer by interrupt
;
intsr: push ax ;Save ax
push bx ;Save bx
in al,REGAD ;Get char
mov ah,al ;Save it
;
mov al,RBFCNT ;Get count of chars
cmp al,BUFSIZ ;Buffer full?
jz isext ;If yes, ignore
inc al ;Count up
mov RBFCNT,al ;Update
cmp al,FULSIZ ;Buffer almost full?
jnz isst1 ;If no, skip flow control
mov al,RTSHIG ;RTS control
out REGAC,al ;Out it
;
isst1: mov bx,RBFWTP ;Get write point
mov al,ah ;Restore char
mov [bx],al ;Write char into buffer
;
inc bl ;Next write point
and bl,BUFSIZ-1 ;Wrap
mov RBFWTP,bx ;Update
;
isext: pop bx ;Restore bx
pop ax ;Restore ax
sti ;Enable interrupt
iret
;
; buffer -> al
getch: push bx ;Save bx
;
gcst1: mov al,RBFCNT ;Get count of chars
cmp al,0 ;Buffer enpty?
jz gcst1 ;If yes, wait
cli ;Disable interrupt
;
mov al,RBFCNT ;Critical timing measures
cmp al,FULSIZ ;Need flow control?
jnz gcst2 ;If no, skip flow control
mov ah,al ;Save char
mov al,RTSLOW ;RTS control
out REGAC,al ;Out it
mov al,ah ;Restore char
gcst2: dec al ;Count down
mov RBFCNT,al ;Update
;
mov bx,RBFRDP ;Get read point
mov al,[bx] ;Read char from buffer
;
inc bl ;Next read point
and bl,BUFSIZ-1 ;Wrap
mov RBFRDP,bx ;Update
;
pop bx ;Restore bx
sti ;Enable interrupt
ret
;
; al -> 8251
putch: push ax ;Save char
;
pcst1: in al,REGAC ;Get status
and al,01h ;check TxBUF enpty
jz pcst1 ;wait for empty
;
pop ax ;Restore char
out REGAD,al ;Out it
ret
;
; put string
puts: cld ;set DF for SI increment
ptst1: lodsb ;get data to AL and SI++
cmp al,00h ;check tail
jz ptext ;if tail, return
call putch ;display a charactor
jmp ptst1 ;loop until tail
ptext: ret
;
; message
ckcpu db 13,10,'PROCESSOR: ',0
nec db 'NEC V20(uPD70108)',13,10,0
intel db 'Intel 8088',13,10,0
;
; CALLN wrapping
ngetch: call getch
iret
nkbhit: mov al,RBFCNT ;Get count of chars
iret
nputch: call putch
iret
;
; start
start: mov ax,cs ;set com model
mov ds,ax
mov es,ax
mov ss,ax
mov sp,STACK ;set stack
;
mov VGETCH,offset ngetch
mov VGETCH+2,ax
mov VKBHIT,offset nkbhit
mov VKBHIT+2,ax
mov VPUTCH,offset nputch
mov VPUTCH+2,ax
mov VBRKEM,offset emu80
mov VBRKEM+2,ax
mov INTREQ,offset intsr
mov INTREQ+2,ax
;
; 8251 setup
mov dx,REGAC
mov al,00h ;Default mode or no operation
out dx,al ;Try command
out dx,al ;Try command
out dx,al ;Try command
mov al,40h ;reset
out dx,al ;Delay
mov CX,16 ;Delay
loop $ ;Delay
mov al,4eh ;mode
out dx,al ;Out it
mov al,37h ;command
out dx,al ;Out it
;
; Buffer initialize
xor al,al ;Clear al
mov RBFCNT,al ;Set count of chars
mov ax,offset RECBUF ;Get buffer top
mov RBFRDP,ax ;Set read point
mov RBFWTP,ax ;Set write point
;
sti ;Enable interrupt
;
; display CPU
mov si,offset ckcpu ;set message top
call puts ;display message
;
; Check CPU
mov ax,0101h
db 0d5h,10h ;aad 10h
cmp al,0Bh ;NEC V20 ignores the argument
je isv20
mov si,offset intel
isV20: call puts
;
; Emulation sequence
db 0fh,0ffh ;BRKEM
db offset VBRKEM/4 ;Vector number
;
emu80:
db 21h ;LXI
dw offset hello
string:
db 7Eh ;MOV A,M
db 0FEh,0 ;CPI 0
db 0CAh ;JZ
dw offset loop
db 0EDh,0EDh,0FDh ;CALLN 253(putch)
db 23h ;INX H
db 0C3h ;JMP
dw offset string
loop:
db 0EDh,0EDh,0FBh ;CALLN 251(getch)
db 0EDh,0EDh,0FDh ;CALLN 253(putch)
db 0C3h ;JMP
dw offset string
;
hello: ;HELLO, WORLD,CR,LF,0
db 48h,45h,4Ch,4Ch
db 4Fh,2Ch,20h,57h,4Fh,52h
db 4Ch,44h,0Dh,0Ah,00
;
; reset
org 0fff0h
db 0eah ;jmp
dw start ;offset
dw 0000h ;segment
;
end
Я вот этим проектом вдохновляюсь. Основная неприятность в том, что нет эмулятора V20.
offtop: хотел в личку написать, а она отключена, может отдельную тему сделать по V20-MBC?
не понятно как выполняется загрузка начального лоадера. Эмулировать можно попробовать в Протеусе. Сейчас режим эмуляции 8080 в x86.dll еще не реализован, но я на него закладывался, как раз хорошая возможность это сделать. Добавить к схеме ПЗУ и UART на 8250/1, а терминал в Протеусе есть.
Из этого проекта я взял очень мало - детект V20, переключение в режим 8080, может еще какие-то мелочи. Детально в нем не разбирался, про загрузку не могу ничего сказать.
Эмуляция в протеусе это в принципе хорошо, но мне она не поможет. Мне нужен быстрый эмулятор с хорошим отладчиком. Ограниченное решение я для себя нашел, просто отлаживаем отдельно части 8080 и 8088. В 8088 остается неотлаженным переключение, но можно понадеяться на копипасту из v20-mbc. Для простых вариантов (запустил v20, и он запустил программу 8080) это более-менее, но для сложных (использующих прерывания и вызовы кода 8088 из 8080) так конечно не наотлаживаешь.
Все же хочу развернуто написать про вариант с различением ram/rom только по A19.
1. Программная часть
1.1. Если хочется минимизировать работу с сегментами, то ее можно свести к начальному старту. Стартуем, перебрасываем сколько нужно из пзу в озу (можно и с распаковкой) и забываем про сегменты. Или не забываем, тут полная свобода.
1.2. Проще с переопределением векторов прерываний.
1.3. Можно использовать самодифицирующийся код в области ram 0000-3FFF.
2. Аппаратная часть.
2.1. Чуть проще.
2.2. Можно взять пзу до 64 Кб. Не то, чтобы это было нужно, но можно.
2.1 С одной стороны да, достаточно A19 подать на 1 вывод D12.1, но это ведь только чтение. А ведь про запись забыли.
Придется вводить тот же A19 в сигнал WE/. В этом случае придется сигналы IOM/ и WR/ перенести с D10.4 (ЛЕ1) на D14.4(ЛЛ1). А выход D14.4 подать на один из входов D10.4, а на второй вход подать A19.
Если не поправить сигнал записи, то любая команда записи в сегменте пзу будет проецироваться на запись в сегменте озу.
2.2 Ну пару адресов можно добавить, тут проблем не должно возникнуть
Вот нарисовал схему, где разные сегменты ОЗУ и ПЗУ по A19, а также увеличил объем ПЗУ до 64Кб - https://disk.yandex.ru/i/mIra7MgBw6dulg
В первых двух сериях ты использовал четверть объема пзушки, почему бы в этот раз не попробовать использовать полностью.
Насчет эмуляции в Emu. Распределение памяти, экран с бордюром, бипер - это получилось. Прерывания как на реале не получатся, по крайней мере я не могу средствами конфига. Проблема в том, что с кадровой частотой приходят прерывания с вектором 0 (не 255, как на реале). Думаю это можно пережить. Клавиатуру скопипастил, эмуляцию не проверял, но ее можно было и в zx8080/5 не проверять. На всякий случай напишу, что не смогу отладить обмен с магнитофоном, но и это в zx8080/5 не было востребовано (хотя для них то можно отладить, там эмуляция проца точная).
Агитировал за избавление от D46 - это я зря делал, надо оставить. В режиме 8080 nec v20 можно адресовать только порты 00-FF, тут D46 и пригодится.
Конфигурация планируемого реала похоже устаканилась, можно прикинуть конфиг для Emu. Ограничения я уже выше описал (нет прерываний). В пзу (до 64 Кб) прошит микротест базовых возможностей.
1. Поверхностное тестирование озу.
1.1. Заполнение байтом FF, проверка.
1.2. Заполнение байтом 00, проверка.
2. Печатаем на экране ZX8088. Если в пункте 1 была ошибка, то еще BAD RAM.
3. Крутимся в бесконечном цикле. По бордюру зелено-красные полосы и писк из бипера.
Озу для хранения переменных не используется, только для тестирования и вывода на экран.
Пока образовалась оперативная пауза, связанная с заказом плат, но до конца года надо так сказать эксперимент реализовать в железо. Так вот размышляя, а дальше что, есть из 8 битной шины данных 80188 и его аналог UPD70208 с возможностью эмуляции 8080. Либо совсем безобразничать и начать экспериментировать с другими процессорами типа 6502, 6800 и так далее.
А есть еще путь - расширение в сторону увеличение разрядности шины данных типа 8086. И как будет выглядеть комп в этом случае. Понятно можно сделать две линейки по 32кб, но это надо найти половинки РУ5, а можно условно пойти в сторону условного Ленинград-128, то есть две линейки по 64кб РУ5. Но это как бы только вопрос с памятью, но ведь есть еще видеовыход и другие узлы, которые придется модифицировать.
Перечисленные варианты вместе или вместо zx8088?
Интегрированные варианты (8018x, NEC V40/50) мне не особо интересны, но возможно кому-то совсем наоборот.
Мне интересен NEC V30 тем, что возможно это самый эффективный (команд/МГц) неинтегрированный проц с возможностью выполнения команд 8080 (круче разве что "интегрированный" eZ80).
Для zx6800 отлаживать не в чем, в emu 6800 не поддерживается.
Скажем так, ни вместе, ни вместо, а дальше. :)
NEC V30 это я так понимаю аналог 8086 только с эмуляцией 8080. То есть расширение в сторону разрядности шины данных, то бишь "Ленинград-128"
- - - Добавлено - - -
А если вдруг уговориться b2m какой нибудь комп на 6800 отэмулировать. :)
Поглядел что там еще нестандартного эмулируется - есть инопланетные компы БКшки
Насчет 6800 затрудняюсь, а вот на 6809 были популярные компы и приставки.
На MC6800 был такой комп как Пълдин 601 - https://ru.wikipedia.org/wiki/Пълдин_601
Вариант PVV
Так, опытные платы заказаны, а это значит, что проект по крайней мере оживет в железе :)
Попытался самописным скриптом сделать замену инструкций z80 в 8088 для ПЗУ 48K Спектрума. Естественно сейчас работать не должно от слова никак, но как заготовка для дальнейшей ручной переделки может сгодится. Оно даже в 16K не помещается, где-то на ¼ жирнее выходит...
Планов развивать скрипт нет, нужно думать об инструментах сравнения поведения оригинального и сконвертированного вариантов, а также как и на чём тестировать.
https://disk.yandex.ru/d/bERCKcINEM5xqg
где эти v30 заказывать собираетесь? раньше оно на алике россыпями валялось, так как китайцы сдули кучу деталей со многочисленных присланных им на утилизацию
старинных аналоговых атс, где и эти nec частенько были. но эти россыпи изобилия уже осушились и давно.
Получил таки я платки.
https://i.ibb.co/YT0wy0q/zx-8088-top.jpg
https://i.ibb.co/vB2kj41/zx-8088-bot.jpg
Теперь дело за малым - собрать все это дело. Надо ревизию деталек провести.