Эмуляция и разработка "Ириша"

 


Так получилось, что савецкие компьютеры прошли мимо меня - осталось только облизываться на публикации ЮТ-88. "Ириша" появилась раньше, в 1985 году. Но о существовании я узнал от Вити-номерного, и сейчас взялся за изучение. Раздел гф  можно назвать "Кладбище домашних любимцев": старые посты, ссылки на отсутствующие файлы и минимум информации.

Скачал эмулятор, литературу, и решил использовать sjasmplus - достаточно использовать мнемоники Z80, которые совпадают с i8080.

Внятной информации тоже не нашлось - на форуме ruecm сидят пара изгоев-неадекватов и делятся воспоминаниями, как они копались в схемах и находили нужную информацию.

В журнале "Микропроцессорные средства и системы" нашел описание адресов графических процедур и параметров, написал код рисование точек и не получил ничего. Нашел один пост:

Когда отладчик запускает программу, или редактирует память, он считает, что ПЗУ выключено. Т.е. чтобы что-либо вызвать из ПЗУ надо его включить командами MVI A,0 / OUT 12h

Там, однако, есть ещё один подводный камень: отладчик по умолчанию оставляет в регистре SP 100h, и если включить ПЗУ, то вернёшься чёрт знает куда. Поэтому нужно назначить стек выше 4000h.

Стандартная точка входа в CONOUT: 2000h, код символа нужно поместить в регистр С.


В моем коде неверно назначалось значение SP, поэтому после правки картинка появилась:


Исходный текст:
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
ld a,0
out ($12),a
ld a,$1A; 320x200 mono
out ($D8),a
ld a,15 ; color
call $2792
ld hl,0,de,hl,b,255
pp:
push hl,de,bc
call $2798
pop bc,de,hl
inc de,hl,hl
dec b
jp nz,pp
jp $
end
display /d,end-begin
savebin "plot.rk",begin,end-begin

На выходе получится файл простого формата .rk, который придется загрузить в эмулятор вручную: запустить программу, выбрать модель из списка, выбрать команду "Монитор", ввести команду R4000,<размер файла в шестнадцатеричном формате>, нажать Enter. Выбрать в диалоговом окне файл plot.rk и ввести команду G4000.

В документации упоминается три графических режима "Ириши", но чтение статей не подсказало, как включать эти режимы. Заданный вопрос на гф не дал ответа.

В статье упоминаются три адреса портов, связанных с графикой:

$D8 - регистр режима видеоадаптера.
$D9 - регистр цвета видеоадаптера
$DA - регистр страницы видеоадаптера

Список других адресов портов вместе с расшифровкой я не нашел.

Адреса видеопамяти для режимов 1-3 могут отличаться:

режим 1: 320x200 mono, запись в порт $D8 значение $1A,адрес $E000, размер 8000 байт

режим 2: 320x200 4 цвета, запись в порт $D8 значение $8A,адрес $C000, размер 16000 байт

режим 3: 640x200 mono, запись в порт $D8 значение $9A адрес $C000, размер 16000 байт

В журнале 1986-1.djvu нашел описание порта $DA: 0-страница $C000,1-$E0000. Работает только в режиме 1.

И остались цвета, назначение битов отличается для режимов:
Для режима 1
  0 0 цвет фона черный
  0 1 цвет фона синий
  1 0 цвет фона зеленый
  1 1 цвет фона малиновый
..5.4210
     000 цвет точки белый
     001 цвет точки синий
     010 цвет точки зеленый
     011 цвет точки голубой
     100 цвет точки красный
     101 цвет точки малиновый
     110 цвет точки желтый
     111 цвет точки белый

Для режима 2
  1 Палитра 1: 00-цвет фона,01-голубой,10-малиновый,11-коричневый
  0 Палитра 0: 00-цвет фона,01-зеленый,10-красный,11-коричневый
..5.3210
    0000 цвет фона черный
    0001 цвет фона синий
    0010 цвет фона зеленый
    0011 цвет фона голубой
    0100 цвет фона красный
    0101 цвет фона малиновый
    0110 цвет фона коричневый
    0111 цвет фона темно-серый
    1000 цвет фона светло-серый
    1001 цвет фона светло-синий
    1010 цвет фона светло-зеленый
    1011 цвет фона светло-голубой
    1100 цвет фона светло-красный
    1101 цвет фона светло-малиновый
    1110 цвет фона желтый
    1111 цвет фона белый

Для режима 3
....3210
    0000 цвет фона черный
    0001 цвет фона темно-синий
    0010 цвет фона темно-зеленый
    0011 цвет фона темно-голубой
    0100 цвет фона темно-красный
    0101 цвет фона темно-малиновый
    0110 цвет фона темно-коричневый
    0111 цвет фона серый
    1000 цвет фона черный
    1001 цвет фона светло-синий
    1010 цвет фона светло-зеленый
    1011 цвет фона светло-голубой
    1100 цвет фона светло-красный
    1101 цвет фона светло-малиновый
    1110 цвет фона желтый
    1111 цвет фона светло-серый


В мониторе есть команда записи значения в порт, что позволит проверить:

Теперь я решил написать код, который обращается к видеопамяти напрямую, после нескольких попыток получил картинку:
Исходник:
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
ld a,0
out ($12),a
ld a,%10001000;8A 320x200,4c   9A 640x200
out ($D8),a
ld a,$27;$27-cga;4 красное на черном, O20,D9 черный фон, O0,D9 rgb
out($d9),a
ld hl,$C000
ld de,$C000 ;D=color mask,E=y coord
ylp:
ld bc,320
xlp:
ld a,c
xor e ;and e
rrca
rrca
and 3
push hl
push de
ld e,a
ld d,0
ld hl,coldata
add hl,de
ld a,(hl)
pop de
pop hl
;put color
xor (hl)
and d
xor (hl)
ld (hl),a
ld a,d
rrca
rrca
ld d,a
cp $C0
jp nz,nomove
inc hl
nomove:
dec bc
ld a,b
or c
jp nz,xlp
inc e
ld a,e
cp 200
jp nz,ylp
jp $
coldata: ; color
db $00,$55,$aa,$FF
end
display /d,end-begin
savebin "plot.rk",begin,end-begin


И все же мне не дает покоя переключение режима, ведь придется рисовать с использованием цветов. Взял старую программу, изменил значение и получил неверную картинку. Стал копаться в дизассемблере ПЗУ и получил ответ: Есть системная переменная MODE(адрес $FF45), в которой используются следующие значения:
7 0=Символы нормальной ширины, 1=Символы двойной ширины
6 0=Режим вывода 20 строк, 1=Режим вывода 25 строк
5 1=Включение динамического сдвига маски цвета
4 0=Страница 1(C000..DF3F) 1=Страница 1(E000..FF3F)
3 не используется
2 не используется
1 |
0 |режимы
  |
  00 320x200 mono, страница определяется битом 4
  01 640x200 mono
  10 320x200 color
  11 запрещенная комбинация

Немного копания в дизассемблере, правки кода, и вот результат:
Исходный текст:
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
ld a,0
out ($12),a
ld a,$88; 320x200 color
out ($D8),a
;color
;0 1 2 3 4 5 6 7
ld a,$10; pal 0
out ($D9),a
ld c,$0C ; cls
call $2000 ; CONOUT
;set MODE
;76543210
;||||xx+-
;||||  |00 320x200 mono, страница определяется битом 4
;||||  |01 640x200 mono
;||||  |10 320x200 color
;||||  |11 запрещенная комбинация
;|||+---->0 Страница 1(C000..DF3F) 1 Страница 1(E000..FF3F)
;||+--------->1 Включение динамического сдвига маски цвета
;|+---------->0 Режим вывода 20 строк, 1-Режим вывода 25 строк
;+----------->0 Символы нормальной ширины, 1 Символы двойной ширины
ld a,%11100010
ld ($FF45),a
call $278c; init vars FFC7=$E000
ld hl,0,de,hl,b,255
pp:
push hl
push bc
ld a,e
call $2792
pop bc
pop hl

push hl,de,bc
call $2798
pop bc,de,hl
inc de,hl,hl
dec b
jp nz,pp
jp $
end
display /d,end-begin
savebin "plotc.rk",begin,end-begin

Зашедший на огонек разработчик эмулятора заметил, что надо использовать точку входа CONOUT($2000), а остальные манипуляции с портами это моветон.

Хорошо, стал копаться в коде рисования окружности:
Исходный текст:
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
xor a;ld a,0
out ($12),a

ld a,15 ; color
call $2792

; ld c,$0C ; cls
; call $2000

ld      de, unk_BF      ; _Circle
call    $40C
jp $

unk_BF:
db $0C ; cls

db  1Bh
; db  47h ; G             ; GraphLangStart
db "G"

; db  43h ; C             ; C1=Color
; db  31h ; 1
db "C1"

; db  50h ; P             ; P248,34=Pset
; db  32h ; 2
; db  34h ; 4
; db  38h ; 8
; db  2Ch ; ,
; db  33h ; 3
; db  34h ; 4
db "P248,34"

; db  53h ; S             ; S0,0=SzhatieOcr
; db  30h ; 0
; db  2Ch ; ,
; db  30h ; 0
db "S0,0"

; db  46h ; F             ; F0,0=Ellipse
; db  30h ; 0
; db  2Ch ; ,
; db  30h ; 0
db "F0,0"

; db  52h ; R             ; R32=Radius
; db  33h ; 3
; db  32h ; 2
db "R32"

; db  49h ; I             ; I=Circle
db "I"

; db  54h ; T             ; TT=Reset ConOut
; db  54h ; T
db "TT"
db    0; END

end
display end-begin
savebin "grlang.rk",begin,end-begin

Суть программы: при печати сообщения передается управляющий код Esc-G(старт графического языка) и дополнительные команды, с которыми не всё ясно. Например, центр окружности определяется командой Pset. Попробовал другой вариант определения координаты центра - не прокатило. Поэтому получился другой вариант в режиме 2 (320x200, 4 цвета)
Исходный текст:
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
xor a;ld a,0
out ($12),a

ld a,15 ; color
call $2792

; ld c,$0C ; cls
; call $2000

ld      de, unk_BF      ; _Circle
call    $40C
ld a,%000001;P.bbbb, p-palette,b-background
out ($D9),a
jp $

unk_BF:
db  1Bh

db "QC" ;320x200 4 colors
db $0C ; cls

; db  47h ; G             ; GraphLangStart
db $1B
db "G"

db "C0"
db "P160,100"

; db  43h ; C             ; C1=Color
; db  31h ; 1
db "C1"

; db  50h ; P             ; P248,34=Pset
; db  32h ; 2
; db  34h ; 4
; db  38h ; 8
; db  2Ch ; ,
; db  33h ; 3
; db  34h ; 4
; db "P248,34"

; db  53h ; S             ; S0,0=SzhatieOcr
; db  30h ; 0
; db  2Ch ; ,
; db  30h ; 0
db "S0,0"

; db  46h ; F             ; F0,0=Ellipse
; db  30h ; 0
; db  2Ch ; ,
; db  30h ; 0
db "F0,0"

; db  52h ; R             ; R32=Radius
; db  33h ; 3
; db  32h ; 2
db "R80"

; db  49h ; I             ; I=Circle
db "I"

; db  54h ; T             ; TT=Reset ConOut
; db  54h ; T
db "TT"
db    0; END

end
display end-begin
savebin "grlang.rk",begin,end-begin

Здесь ставится точка цвета 0. Пока неясно, в каких случаях использовать команды Esc. Остается только копаться в дизассемблере и разбираться в коде.

Забыл упомянуть про печать текста. Классический вариант Hello,world:
Исходный текст:
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
ld a,0
out ($12),a
; ld a,$88; 320x200 color
; out ($D8),a
ld de,hlw1
call $40C
jp $
hlw1: db $0C,"Hello,Irisha!",$0D,$0A,0
end
display /d,end-begin
savebin "hlw.rk",begin,end-begin

В документации указано, что данные шрифта расположены по адресу $3800, используется кодировка KOI8:

Исходный текст:
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
ld a,0
out ($12),a
; ld a,$88; 320x200 color
; out ($D8),a
ld de,hlw1
call $40C
jp $
hlw1: db $0C
 db $F0,$D2,$C9,$d7,$C5,$D4,$2C,$20,$E9,$D2,$C9,$DB,$C1,$21
 db $0D,$0A,0
end
display /d,end-begin
savebin "hlw.rk",begin,end-begin
Еще одна программа, которую я написал до начала возни с режимами:
Исходный текст:
;Monitor commands
;R4000,3F where $4000 - address, $3F- size of block
;G4000 - run at address $4000
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
ld a,0
out ($12),a
;cls e000-ff3f
ld hl,$E000
ld bc, $3f40
push hl
cls:
ld (hl),0
inc hl
dec bc
ld a,b
or c
jp nz,cls
pop hl;ld h,$E0
ld de,$3800
ld a,16
linelp:
push af
push hl
rowlp:
push hl
ld bc,40
chlp:
ld a,(de)
ld (hl),a
add hl,bc
inc de
ld a,e
and 7
jp nz,chlp
pop hl
inc hl
ld a,l
and 15
jp nz,rowlp
pop hl
ld bc, 40*8
add hl,bc
pop af
dec a
jp nz,linelp
jp $
end
display /d,end-begin
savebin "char.rk",begin,end-begin

И напоследок оставлю пару программ, которые написал вчера:
Простой алгоритм Chaos Game
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
xor a;ld a,0
out ($12),a

ld a,15 ; color
call $2792

ld c,$0C ; cls
call $2000

pp:
inc hl
push hl
ld a,(hl)
xor h
sub l
and 3
jp z,noplot
dec a
ld l,a
ld h,0
ld bc,cgt
add hl,hl
add hl,hl
add hl,bc

ld c,(hl)
inc hl
ld b,(hl)
inc hl

ld e,(hl)
inc hl
ld d,(hl)
;      x=(x+x(c))/2
ld hl,(xc)
add hl,bc
ld a,h
add a,a
ld a,h
rra
ld h,a
ld a,l
rra
ld l,a
ld (xc),hl
ld bc,160
add hl,bc
push hl
;      y=(y+y(c))/2
ld hl,(yc)
add hl,de
ld a,h
add a,a
ld a,h
rra
ld h,a
ld a,l
rra
ld l,a
ld (yc),hl
ld bc,100
add hl,bc
ex de,hl
pop hl
;      Box(x+160,y+100,1,1,255)

call $2798;HL=X,DE=Y

; jp $
noplot:
pop hl
jp pp
xc: dw 0
yc: dw 0
cgt:;X,Y
dw 0,-100
dw -160,100
dw 160,100

end
display end-begin
savebin "cg.rk",begin,end-begin

Простое пианино - опрос клавиш и воспроизведение звука
device zxspectrum48
        ORG #4000
begin
ld sp,$5000
xor a;ld a,0
out ($12),a

ld a,15 ; color
call $2792

ld c,$0C ; cls
call $2000

wk:
call $5B
jp nc,wk
; and $3f
g40:
sub 39
jp nc,g40
add a,41
ld hl,note
ld (hl),a
dec hl
ld ($FFFC),hl
call $55
jp wk
db $9F;8F: 1/16, 9F: 1/8,BF: 1/4, FF:1/2
note: db 0,0
end
display end-begin
savebin "piano.rk",begin,end-begin

Итого: не разобрался с графическим языком и с портами управления памятью. Может, когда-нибудь это и произойдет. Исходники и документация.

Комментарии