Эмуляция и разработка "Орион-128"

 



В 90х видел этот компьютер, программы и игры интереса не вызвали. Позже владелец компьютера поменял на ZX Spectrum. Сейчас вернулся к изучению модели.

Эмулятор. Выбрал Emu80 с хорошим отладчиком(автор явно знал, что делал). Про запас взял OriZEmu. Документация нашлась на  emuverse.ru, дольше всего искал другие средства разработки.

Нашел файл ZeroCode.rar. В качестве ассемблера использовал ужасм - достаточно помнить, какие опкоды Z80 совпадают с i8080. В указанном архиве есть все необходимое для создания файла .bru для запуска.Формат .rko я не стал  изучать.

Теперь  я узнаю некоторые технические данные: 48Кб доступно, разрешение экрана 384х256, 3 видеорежима с различными наборами цветов и палитрами. Распределение памяти организовано примерно так:


Организация экрана реализована хитро:


И можно потренироваться в коде, написать программу вывода набора символов, хранящегося по адресу $F000-$F2FF, но я отложил эту задачу на потом. Сначала нужно разобраться со странным способом компиляции и переписать пример программы:

device zxspectrum48
        ORG #F0; заголовок .BRU
begin
db "HELLOWL$"
dw $100;start adddress
dw end-prg_b
db 0
db 0,0,$FF
prg_b: ; программа начинается по адресу $0100
ld a,$1F
call $F80F ; печать символа - очистка экрана
ld hl,TEXT
call $F818;MSG
call B1; ожидание нажатия клавиши F2 и F4
JP $F800; MONIT
B1:
call $F803;KBRD
cp 3 ; F4
ret z
cp 1 ;F2
jp nz,B1
ld hl,TEXT2
call $F818;MSG
call $F803;KBRD
ret
TEXT: DB "ORION-128!",0  
TEXT2: DB "F2!!!!!!!!!!!!!",0 
end
display /d,end-begin
savebin "hlw.bru",begin,end-begin

Начинаю читать документацию и получается, что видеорежимы переключаются с помощью порта $F8:

D0 0 — палитра №1 1 — палитра №2
D1 0 — режим 1 —16 цветов 1 — режим 2 — 4 цвета
D2 0 — монохромный режим 1 — цветной режим 

Статья в жрунале "Радио" 02-1990 приводит список возможных комбинаций:

00 — монохромный режим, палитра 1 (зеленый/черный) 
01 — ---------------//----------- палитра 2 (желтый/голубой) 
02 — гашение изображения 
03 — ----------------//------------------- 
04 — 4-цветный режим, палитра 1
05 — -----------//----------- палитра 2
06 — 16-цветный режим 
07 — ----------------//----------------


Стал читать про хранение цветов. Нужно использовать порт $F9 и переключить основную страницу 0 на страницу 1 и записать дополнительные данные цвета по адресам $C000-$EFFF. Интересно,  а что произойдет с моим кодом, который расположен по адресу $100? Запустил отладчик, вбил опкоды и стал проверять по шагам. Результат оказался предсказуемым - после записи значения 1 в порт $F9 память переключилась и отладчик показал NOP'ы. Вот это я попал... 

Стал читать дальше - есть доступная память $F000-$F2FF, которая хранит шрифт, попробую её использовать. Проблема в том, что файл .bru с указанным адресом не загрузился. Поэтому я снова переписал программу, и ничего не увидел. Оказалось, что мне была нужна только страница 1 с записью данных о цвете. Поэтому код стал выглядеть так:


device zxspectrum48
        ORG #100-16 ; заголовок файла
begin
db "HELLOWL$"
dw prg_b;start adddress
dw end-prg_b
db 0
db 0,0,$FF
prg_b: ;начало программы
ld a,$1F
call $F80F ;очистка экрана

ld hl,part_b ; копирование кода по адресу $F000
ld de,$F000
ld bc,part_e-part_b
copyp:
ld a,(hl),(de),a
inc hl,de
dec bc
ld a,b
or c
jp nz,copyp
ld a,6 ; Включение режима с 16ю цветами
out ($F8),a; 6=16 colors
ld hl,$C000; рисование простой полоски с цветом
ld bc,$E40F; B=цвет, C=битовые данные
linelp:
call $F000; вызов процедуры записи данных в страницы 0 и 1
ld a,c ; циклический сдвиг битовых данных
rrca
ld c,a
inc l ; переход вниз на 1 линию
jp nz,linelp; завершение цикла
stub:
jp stub; просто зацикливание программы
part_b:
xor a ; включение страницы 0 для записи битовых данных
out ($F9),a
ld (hl),c
inc a ;  включение страницы 1 для записи цветовых данных
out ($F9),a
ld (hl),b
dec a ; возврат к странице 0
out ($F9),a
ret ; выход из процедуры.
part_e:
end
display /d,end-begin
savebin "16c.bru",begin,end-begin

цветные данные режима 16 цветов кодируются двумя ниблами: ffffbbbb, ffff - цвет фона, bbbb - точек. Легко разобраться со значениями битов, я не буду описывать.

Остался режим 4 цветов, мне нужно написать простую программу вроде вывод xor-текстуры:


Сложность разработки: счетчик цикла по горизонтали будет 16-битный. Кроме того, программа, расположенная по адресу $F000 будет использовать условные переходы, но ужасму это никак не объяснишь.И последнее - ограниченный набор регистров, которые никак не втиснешь в код. Звучит жутко, но нас трудности не пугают - неужели машинка не подчинится инструкциям?

device zxspectrum48
        ORG #100-16
begin
db "HELLOWL$"
dw prg_b;start adddress
dw end-prg_b
db 0
db 0,0,$FF
prg_b:
ld a,$1F
call $F80F ;Print char
;D0 0 — палитра №1 1 — палитра №2
;D1 0 — режим 1 —16 цветов 1 — режим 2 — 4 цвета
;D2 0 — монохромный режим 1 — цветной режим 
;00 — монохромный режим, палитра 1 (зеленый/черный) 
;01 — ---------------//----------- палитра 2 (желтый/голубой) 
;02 — гашение изображения 
;03 — ----------------//------------------- 
;04 — 4-цветный режим, палитра 1
;05 — -----------//----------- палитра 2
;06 — 16-цветный режим 
;07 — ----------------//----------------
ld a,4
out ($F8),a
;copy routine to $F000
ld hl,part_b
ld de,$F000
ld bc,part_e-part_b
copyp:
ld a,(hl),(de),a
inc hl,de
dec bc
ld a,b
or c
jp nz,copyp
ylp:
ld de,0
xlp:
ld a,(yc)
xor e
and e;xor e
rra
rra
ld (co),a
push de
;x/8
ld a,d
or a
rra
ld d,a
ld a,e
rra
ld e,a
ld a,d
or a
rra
ld d,a
ld a,e
rra
ld e,a
ld a,d
or a
rra
ld d,a
ld a,e
rra
add $C0
ld h,a
ld a,(yc)
ld l,a
pop de
push de
ld a,e
and 7
ld e,a
ld d,$F0
ld a,(de)
ld b,a ; bit weigth
cpl
ld c,a;mask
ld a,(co)
ld e,a
call $F008;plot with color a
pop de
inc de
ld hl,-384
add hl,de
ld a,l
or h
jp nz,xlp
ld a,(yc)
inc a
ld (yc),a
jp nz,ylp
stub: jp stub
yc: db 0
co: db 0
part_b:
;bit weights
 db 128,64,32,16,8,4,2,1
;страница 0
xor a;ld a,0
out ($F9),a
ld a,(hl)
and c
ld (hl),a
ld a,e
rra
ld e,a
jp nc,b0-part_b+$F000
ld a,(hl)
or b
ld (hl),a
b0:
;страница 1
ld a,1
out ($F9),a
ld a,(hl)
and c
ld (hl),a
ld a,e
rra
jp nc,b1-part_b+$F000
ld a,(hl)
or b
ld (hl),a
b1:
xor a;ld a,0
out ($F9),a
ret
part_e:
end
display /d,end-begin
savebin "4col.bru",begin,end-begin

Недостаток 1 - мееедленная работа программы.Наверное, можно ускорить код, но пока не хочется.

И последний порт, который я не стал проверять - $FA. Запись значения в порт переключает адреса экранной области:

C000—EFFFH — экран 1 значение 0
8000—AFFFH — экран 2 значение 1
4000—6FFFH — экран 3 значение 2
0000—2FFFH — экран 4 значение 3

Меня уже не хватило на проверку работы. Наверное, вернусь позже к этому компьютеру

Дополнение. Взялся за задачу нарисовать набор символов и сделал не сразу:


device zxspectrum48
        ORG #F0
begin
db "CHARSET$";8 bytes
dw $100;start adddress
dw end-prg_b
db 0
db 0,0,$FF
prg_b:
ld a,$1F
call $F80F ;Print char

ld de,$F000
ld hl,$C000

ld c,6
lp1:
push hl
ld b,16
rowlp:
push hl
chlp:
ld a,(de)
ld (hl),a
inc de
inc l
ld a,e
and 7
jp nz,chlp
pop hl
inc h
inc h
dec b
jp nz,rowlp
pop hl
ld a,l
add a,8
ld l,a
dec c
jp nz,lp1

wk:
call $F812 ; wait keypressed
or a
jp z,wk
stub:
JP $f800 ; back to MONITOR
end
display /d,end-begin
savebin "char.bru",begin,end-begin


Забыл написать про графический режим с 4 цветами - формат хранения другой:

device zxspectrum48
        ORG #100-16
begin
db "HELLOWL$"
dw prg_b;start adddress
dw end-prg_b
db 0
db 0,0,$FF
prg_b:
ld a,$1F
call $F80F ;Print char
ld hl,part_b
ld de,$F000
ld bc,part_e-part_b
copyp:
ld a,(hl),(de),a
inc hl,de
dec bc
ld a,b
or c
jp nz,copyp
jp $F000
part_b:
;D0 0 — палитра №1 1 — палитра №2
;D1 0 — режим 1 —16 цветов 1 — режим 2 — 4 цвета
;D2 0 — монохромный режим 1 — цветной режим 
;00 — монохромный режим, палитра 1 (зеленый/черный) 
;01 — ---------------//----------- палитра 2 (желтый/голубой) 
;02 — гашение изображения 
;03 — ----------------//------------------- 
;04 — 4-цветный режим, палитра 1
;05 — -----------//----------- палитра 2
;06 — 16-цветный режим 
;07 — ----------------//----------------
ld a,4
out ($F8),a; 6=16 colors

ld hl,$C000
ld a,0
out ($F9),a
ld (hl),%11000000
ld a,1
out ($F9),a
ld (hl),%10100000
stub:
jp stub-part_b+$F000
part_e:
end
display /d,end-begin
savebin "4col.bru",begin,end-begin

Здесь цвета определяются последовательностью битов в странице 0 и 1:

11 - синий

10 - зеленый

01-красный

00-черный

Комментарии