На волне увлечения древними процессорами я попытался ознакомиться с Signetics 2650, но ничего путного мне не попалось на глаза. Два года назад я решился на сей отчаянный подвиг.
С этим эмулятором вышло много возни - сначала пришлось пострадать и собрать в .exe с помощью утилки unwrap. Но только по странному капризу скрипт Tcl грузит несколько файлов, не знаю, как это победить. Бонусом для эмулятора включена программа PIPBUG, которая позволяет вколачивать программу по байтам, на страничке всё подробно описано. Загрузка перфокарт реализована через задницу, автор объяснял, как сделать, но я нихрена не понял :\
Беглый поиск вывел на сырки Clinstructor.На удивление программа скомпилировалась, но работает она иначе:
И еще один плюс - приложеннные примеры в неудобном hex-виде. Но меня это не остановило, об изучении речь пойдет позже.
И последний эмулятор - Phuncy. Из плюсов - внятная документация и возможность чтения .hex-файлов в формате Motorola. И монитор-отладчик.
Ассемблер тоже нашелся. Осталось попробовать начать кодить. У компьютера Phuncy область отведена просто: $800 - память, $1000 - videoRAM. Поэтому возникла простая идея вывести на экран сообщение. Доки по опкодам 1, 2.
Естественно, что после прочтения в голове образуется простая каша, поэтому я вернулся к примерам clinstructor'a.
store-to-memory.hex
040093
05FF
CD0019
0C0019
Перегоняю текст в бинарь(PureBasic в помощь):
ReadFile(0,"store-to-memory.hex")
CreateFile(1,"store.bin")
While Not Eof(0)
s.s=ReadString(0)
For i=1 To Len(s) Step 2
WriteAsciiCharacter(1,Val("$"+Mid(s,i,2)) )
Next i
Wend
CloseFile(1)
CloseFile(0)
с дизассемблерами всё грустно, нашелся Dasmx 1.40. И тут я делаю ошибку - формирую листинг в формате ассемблера:
в чем ошибка? не видно байт рядом с опкодами. Если убрать ключ -a, то получится листинг. Итак, программа
org H'0000'
;
0000 : 04 00 " " lodi,r0 H'00'
0002 : 93 " " lpsl
0003 : 05 FF " " lodi,r1 H'FF'
0005 : CD 00 19 " " stra,r1 X0019
0008 : 0C 00 19 " " loda,r0 X0019
На скриншоте выше видно, как прога сработала - по адресу $0019 записано $FF. После чтения доков я начал понимать кое-что и накатал программу.
Новый облом - ассемблер тупо валится, после мучений с синтаксисом я взял программу helloworld.asm и скомпилировал. Зачем ассемблеру понадобилось include "arcadia.h" неясно. Короче, написал прогу, вот результат
Сама программа:
; This file assembles well under VACS v1.24/w32 (by W.H. Taphoorn; updated by D.D. Spreen)
; asm32 test -m
;
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r1 0 ; Zero-out registers 0
lp:
loda,r0 me,r1
comi,r0 0FFh
BCTR,eq exl
stra,r0 01000h,r1+
BCTR,un lp
exl:
retc,un ; ??
me: db "Hello,2650!"
db 0FFh
end ; End of assembly
Здесь я не стал извращаться и использовал простой способ: регистр r1 8битный, его хватит для короткой строки.Для удобства ограничение строки реализовано как байт $FF - почему-то первая задумка не заработала.
Теперь я написал другой вариант
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r1 0 ; Zero-out registers 0
lp:
loda,r0 me,r1
; comi,r0 0FFh
; BCTR,eq exl
stra,r0 01000h,r1+
; BCTR,un lp
comi,r1 0Bh
BCTR,lt lp
exl:
retc,un ; ??
me: db "Hello,2650!"
; db 0FFh
end ; End of assembly
Здесь r1 используется в качестве индекса для чтения из памяти и для записи. Завершение строки - проверка на длину r1<0Bh. Описание опкодов найдете в доках. Как оклемаюсь после дня рождения, вернусь к коду, попробую написать программ. Для меня достаточно средств для создания программ.
Насчет остальных компьютеров с процессором - список платформ весьма внушительный:
Emerson Arcadia 2001 console family
Interton VC 4000 console family (c. 1978);
Elektor TV Games Computer (1979);
Signetics Instructor 50 trainer (c. 1978);
Central Data 2650 computer (1977);
Chaos 1 and 2 computers (1977/1983);
PIPBUG-based machines (c. 1977) (Embargo?);
BINBUG-based machines (c. 1978) (Meadows Games' coin-ops?);
Atari Quiz Show (1976);
Cinematronics Embargo (1977);
Meadows Games 3D Bowling (1978);
Meadows Games Gypsy Juggler (1978);
Malzak 1 and 2 coin-ops (c. 1980);
Astro Wars, Cat'N Mouse, Galaxia and Laser Battle coin-ops (1979-1981);
PHUNSY computer (c. 1980);
Chaos 2 computer (1983);
MIKIT 2650 trainer (1978);
Dolphin trainer computer (1979);
Ravensburger Selbstbaucomputer aka 2650 Minimal Computer trainer (1984)
Zaccaria pinball machines
Правда, документации не так уж и много.
Дополнение, 6-7-2020
Написал программу:
Как видно, можно использовать популярную семиграфику.
lodi,r1 0 ; Zero-out registers 0
lp:
stra,r0 01000h,r0
addi,r0 1
bctr,eq exl
BCTR,un lp
exl:
retc,un
Дополнение 7-7-2020 Составил таблицу опкодов и совсем запутался, неясны адресации. Забирайте версию 1, 2я часть появится позже.
С этим эмулятором вышло много возни - сначала пришлось пострадать и собрать в .exe с помощью утилки unwrap. Но только по странному капризу скрипт Tcl грузит несколько файлов, не знаю, как это победить. Бонусом для эмулятора включена программа PIPBUG, которая позволяет вколачивать программу по байтам, на страничке всё подробно описано. Загрузка перфокарт реализована через задницу, автор объяснял, как сделать, но я нихрена не понял :\
Беглый поиск вывел на сырки Clinstructor.На удивление программа скомпилировалась, но работает она иначе:
И еще один плюс - приложеннные примеры в неудобном hex-виде. Но меня это не остановило, об изучении речь пойдет позже.
И последний эмулятор - Phuncy. Из плюсов - внятная документация и возможность чтения .hex-файлов в формате Motorola. И монитор-отладчик.
Ассемблер тоже нашелся. Осталось попробовать начать кодить. У компьютера Phuncy область отведена просто: $800 - память, $1000 - videoRAM. Поэтому возникла простая идея вывести на экран сообщение. Доки по опкодам 1, 2.
Естественно, что после прочтения в голове образуется простая каша, поэтому я вернулся к примерам clinstructor'a.
store-to-memory.hex
040093
05FF
CD0019
0C0019
Перегоняю текст в бинарь(PureBasic в помощь):
ReadFile(0,"store-to-memory.hex")
CreateFile(1,"store.bin")
While Not Eof(0)
s.s=ReadString(0)
For i=1 To Len(s) Step 2
WriteAsciiCharacter(1,Val("$"+Mid(s,i,2)) )
Next i
Wend
CloseFile(1)
CloseFile(0)
с дизассемблерами всё грустно, нашелся Dasmx 1.40. И тут я делаю ошибку - формирую листинг в формате ассемблера:
в чем ошибка? не видно байт рядом с опкодами. Если убрать ключ -a, то получится листинг. Итак, программа
org H'0000'
;
0000 : 04 00 " " lodi,r0 H'00'
0002 : 93 " " lpsl
0003 : 05 FF " " lodi,r1 H'FF'
0005 : CD 00 19 " " stra,r1 X0019
0008 : 0C 00 19 " " loda,r0 X0019
Новый облом - ассемблер тупо валится, после мучений с синтаксисом я взял программу helloworld.asm и скомпилировал. Зачем ассемблеру понадобилось include "arcadia.h" неясно. Короче, написал прогу, вот результат
Сама программа:
; This file assembles well under VACS v1.24/w32 (by W.H. Taphoorn; updated by D.D. Spreen)
; asm32 test -m
;
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r1 0 ; Zero-out registers 0
lp:
loda,r0 me,r1
comi,r0 0FFh
BCTR,eq exl
stra,r0 01000h,r1+
BCTR,un lp
exl:
retc,un ; ??
me: db "Hello,2650!"
db 0FFh
end ; End of assembly
Здесь я не стал извращаться и использовал простой способ: регистр r1 8битный, его хватит для короткой строки.Для удобства ограничение строки реализовано как байт $FF - почему-то первая задумка не заработала.
Теперь я написал другой вариант
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r1 0 ; Zero-out registers 0
lp:
loda,r0 me,r1
; comi,r0 0FFh
; BCTR,eq exl
stra,r0 01000h,r1+
; BCTR,un lp
comi,r1 0Bh
BCTR,lt lp
exl:
retc,un ; ??
me: db "Hello,2650!"
; db 0FFh
end ; End of assembly
Насчет остальных компьютеров с процессором - список платформ весьма внушительный:
Emerson Arcadia 2001 console family
Interton VC 4000 console family (c. 1978);
Elektor TV Games Computer (1979);
Signetics Instructor 50 trainer (c. 1978);
Central Data 2650 computer (1977);
Chaos 1 and 2 computers (1977/1983);
PIPBUG-based machines (c. 1977) (Embargo?);
BINBUG-based machines (c. 1978) (Meadows Games' coin-ops?);
Atari Quiz Show (1976);
Cinematronics Embargo (1977);
Meadows Games 3D Bowling (1978);
Meadows Games Gypsy Juggler (1978);
Malzak 1 and 2 coin-ops (c. 1980);
Astro Wars, Cat'N Mouse, Galaxia and Laser Battle coin-ops (1979-1981);
PHUNSY computer (c. 1980);
Chaos 2 computer (1983);
MIKIT 2650 trainer (1978);
Dolphin trainer computer (1979);
Ravensburger Selbstbaucomputer aka 2650 Minimal Computer trainer (1984)
Zaccaria pinball machines
Правда, документации не так уж и много.
Дополнение, 6-7-2020
Написал программу:
Как видно, можно использовать популярную семиграфику.
lodi,r1 0 ; Zero-out registers 0
lp:
stra,r0 01000h,r0
addi,r0 1
bctr,eq exl
BCTR,un lp
exl:
retc,un
Нет, надо все-таки полистать доки. Нашелся другой способ:
lodi,r1 0 ; Zero-out registers 0
lp:
stra,r0 01000h,r0
bira,r0 lp
; addi,r0 1
; bctr,eq exl
; BCTR,un lp
retc,un
Дополнение 7-7-2020 Составил таблицу опкодов и совсем запутался, неясны адресации. Забирайте версию 1, 2я часть появится позже.
Дополнение 8-7-2020 Нашел у себя в архиве ассемблер VAX50, делюсь. Стал переводить примеры clinstructor50 в бинари и листинги, архив здесь. Интересно, что Dasmx неверно дизассемблировал файл zbrr. Нашел свалку софта для phunsy. И решил попробовать эмулятор Emerson Arcadia с неудобным отладчиком.
Дополнение 8-7-2020 Собрал справочник опкодов, даже с индексом. Стал разбираться с адресацией. Какой порядок байт - младший, старший? Вроде наоборот, но не помню, где видел.Написал программу:
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt+1
eorz r0
stra,r0 tt
lodi,r0 41h
stra,r0 *tt
retc,un
tt db 0,0
end ; End of assembly
Эмулятор вылетел при запуске. Пошел ва-банк и поменял позиции местами:
16:14. Жара, настроение паршивое, и возня с неработающей программой только усилило настроение.
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r0 21h
ylp:
lodi,r1 0
xlp:
stra,r0 *tt,r1
addi,r1 1
comi,r1 40h
bctr,lt xlp
; retc,un
;next address+64
loda,r1 tt+1
CPSL 4;clear With Carry (WC) bit
addi,r1 40h
stra,r1 tt+1
bcfr,eq noinc
CPSL 4
loda,r1 tt
addi,r1 1
stra,r1 tt
noinc:
CPSL 4
addi,r0 1
comi,r0 40h
bctr,eq exl;ylp
bctr,un ylp
exl:
bctr,un exl
; stra,r0 *tt
retc,un
tt db 0,0
end
По идее, нужно исправить часть кода, но сейчас уже нет сил.
9-7-2020. Код в программе правильный, но хотелось бы разобраться. Нашел список документов, где появилось решение, но я до конца не разобрался.
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r0 21h
ylp:
stra,r0 *tt
;next address+64
loda,r1 tt+1
CPSL 8;clear With Carry (WC) bit
addi,r1 41h
stra,r1 tt+1
TPSL 1 ;*Test carry
BCFR,eq LBL; *Branch if no carry
; BCTR,eq LBL; *Branch if carry
; bcfr,eq noinc
CPSL 8
loda,r1 tt
addi,r1 1
stra,r1 tt
LBL:;noinc:
CPSL 8
addi,r0 1
comi,r0 40h
bcfr,eq ylp
; bctr,eq exl;ylp
; bctr,un ylp
;exl:
; bctr,un exl
; stra,r0 *tt
retc,un
tt db 0,0
end
Начал дурить отладчик в WinArcadia - он грузит бинарь не по адресу $800, а по адресу $2000.
Удобнее собрать 256б одним файлом: asm32 test -k 256. Каждый шаг к изучению как прогулка по минному полю.
Дополнение 10-07-2020
Закончил со списком опкодов. Вчера стал разбираться с типом адресаций:
Это у Phunsy
А это у WinArcadia с офигенным скриншотом для кино (: Как видно, что с абсолютной адресацией полная путаница - в первой программе адрес совпадает с кодовым блоком, а для эмулятора указывает на не пойми что.
А здесь я поменял абсолютную адресацию на relative, которая задает смещение от инструкции, похоже на экономию байта, но для адресации есть ограничение на смещение -64..63.
Что использовать лучше, пока неясно. Инфа а проце смешанная и неточная, поэтому многое неясно. Накопал в жрунальчике KilobyteMagazine 2017-3 статью, но толку от неё тоже мало
В общем, осталась одна простая задачка - написать процедуру PLOT, вернусь когда-нибудь. На этом изучение прекращается.
Дополнение 11-07-2020
Вчера засел за код, потратил 6 часов. Проблема со сдвигами, которые работают не пойми как. Дошло до того, что код на разных эмуляторах работает иначе. Или я чего-то не понимаю, или одно из двух, причем скорее всего третье. Короче, вышел код, который работает на двух эмуляторах.
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
tt equ 0900H
;clear screen with $C0
bstr,un cls
lodi,r2 03Fh;0Bh ;X
tp:
lodz r2
strz r1
bstr,un plot
bdrr,r2 tp
retc,un
;///////////////////////////////////////////////////////////////
cls:
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r3 020h
ylp:
lodi,r1 40h
lodi,r0 0C0h
xlp:
stra,r0 *tt,r1
bdrr,r1 xlp
;next address+64
loda,r0 tt+1
CPSL 8;clear With Carry (WC) bit
addi,r0 40h
stra,r0 tt+1
TPSL 1 ;*Test carry
BCFR,eq LBL; *Branch if no carry
CPSL 8
loda,r0 tt
addi,r0 1
stra,r0 tt
LBL:
bdrr,r3 ylp
retc,un
;///////////////////////////////////////////////////////////////
plot: ;r2=X,r1=Y
;12
;48
;
lodz r1
CPSL 8+1
rrr,r0
lodi,r3 0
tmi,r0 1
bcfr,eq br1
iori,r3 40h
br1:
tmi,r0 2
bcfr,eq br2
iori,r3 80h
br2:
CPSL 8+1
rrr,r0
rrr,r0
andi,r0 01Fh
CPSL 8
addi,r0 10h
stra,r0 tt
stra,r3 tt+1
lodz r2 ;r2=X
strz r3
;check bit value
;r0=1
lodi,r0 1
;if y&1:r0=4
tmi,r2 1
bcfr,eq bra1
lodi,r0 4
bra1:
;if x&1:r0=r0*2
tmi,r1 1
bcfr,eq bra2
CPSL 8
addz r0
bra2:
CPSL 8
rrr,r3
andi,r3 07Fh
iori,r0 0C0h
iora,r0 *tt,r3
stra,r0 *tt,r3
retc,un
end
Бонус: описание битовых операций.
Дополнение 8-7-2020 Собрал справочник опкодов, даже с индексом. Стал разбираться с адресацией. Какой порядок байт - младший, старший? Вроде наоборот, но не помню, где видел.Написал программу:
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt+1
eorz r0
stra,r0 tt
lodi,r0 41h
stra,r0 *tt
retc,un
tt db 0,0
end ; End of assembly
Эмулятор вылетел при запуске. Пошел ва-банк и поменял позиции местами:
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r0 41h
stra,r0 *tt
retc,un
tt db 0,0
end ; End of assembly
Объясню для читателей суть телодвижений: по адресу tt помещаются два байта $10,0, которые используются при адресации stra,r0 *tt. Это следует читать как poke peek(tt)*256+peek(tt+1),r0.
Похоже на трюки 6502, но посложнее. Будет настроение, попробую написать заполнение экран символами.
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r0 41h
stra,r0 *tt
retc,un
tt db 0,0
end ; End of assembly
Объясню для читателей суть телодвижений: по адресу tt помещаются два байта $10,0, которые используются при адресации stra,r0 *tt. Это следует читать как poke peek(tt)*256+peek(tt+1),r0.
Похоже на трюки 6502, но посложнее. Будет настроение, попробую написать заполнение экран символами.
16:14. Жара, настроение паршивое, и возня с неработающей программой только усилило настроение.
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r0 21h
ylp:
lodi,r1 0
xlp:
stra,r0 *tt,r1
addi,r1 1
comi,r1 40h
bctr,lt xlp
; retc,un
;next address+64
loda,r1 tt+1
CPSL 4;clear With Carry (WC) bit
addi,r1 40h
stra,r1 tt+1
bcfr,eq noinc
CPSL 4
loda,r1 tt
addi,r1 1
stra,r1 tt
noinc:
CPSL 4
addi,r0 1
comi,r0 40h
bctr,eq exl;ylp
bctr,un ylp
exl:
bctr,un exl
; stra,r0 *tt
retc,un
tt db 0,0
end
9-7-2020. Код в программе правильный, но хотелось бы разобраться. Нашел список документов, где появилось решение, но я до конца не разобрался.
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r0 21h
ylp:
stra,r0 *tt
;next address+64
loda,r1 tt+1
CPSL 8;clear With Carry (WC) bit
addi,r1 41h
stra,r1 tt+1
TPSL 1 ;*Test carry
BCFR,eq LBL; *Branch if no carry
; BCTR,eq LBL; *Branch if carry
; bcfr,eq noinc
CPSL 8
loda,r1 tt
addi,r1 1
stra,r1 tt
LBL:;noinc:
CPSL 8
addi,r0 1
comi,r0 40h
bcfr,eq ylp
; bctr,eq exl;ylp
; bctr,un ylp
;exl:
; bctr,un exl
; stra,r0 *tt
retc,un
tt db 0,0
end
Удобнее собрать 256б одним файлом: asm32 test -k 256. Каждый шаг к изучению как прогулка по минному полю.
Дополнение 10-07-2020
Закончил со списком опкодов. Вчера стал разбираться с типом адресаций:
Это у Phunsy
А это у WinArcadia с офигенным скриншотом для кино (: Как видно, что с абсолютной адресацией полная путаница - в первой программе адрес совпадает с кодовым блоком, а для эмулятора указывает на не пойми что.
А здесь я поменял абсолютную адресацию на relative, которая задает смещение от инструкции, похоже на экономию байта, но для адресации есть ограничение на смещение -64..63.
Что использовать лучше, пока неясно. Инфа а проце смешанная и неточная, поэтому многое неясно. Накопал в жрунальчике KilobyteMagazine 2017-3 статью, но толку от неё тоже мало
В общем, осталась одна простая задачка - написать процедуру PLOT, вернусь когда-нибудь. На этом изучение прекращается.
Дополнение 11-07-2020
Вчера засел за код, потратил 6 часов. Проблема со сдвигами, которые работают не пойми как. Дошло до того, что код на разных эмуляторах работает иначе. Или я чего-то не понимаю, или одно из двух, причем скорее всего третье. Короче, вышел код, который работает на двух эмуляторах.
name HelloWorld ; module name
include "arcadia.h" ; v1.01
org 0800H ; Start of Arcadia ROM
tt equ 0900H
;clear screen with $C0
bstr,un cls
lodi,r2 03Fh;0Bh ;X
tp:
lodz r2
strz r1
bstr,un plot
bdrr,r2 tp
retc,un
;///////////////////////////////////////////////////////////////
cls:
lodi,r0 10h
stra,r0 tt
eorz r0
stra,r0 tt+1
lodi,r3 020h
ylp:
lodi,r1 40h
lodi,r0 0C0h
xlp:
stra,r0 *tt,r1
bdrr,r1 xlp
;next address+64
loda,r0 tt+1
CPSL 8;clear With Carry (WC) bit
addi,r0 40h
stra,r0 tt+1
TPSL 1 ;*Test carry
BCFR,eq LBL; *Branch if no carry
CPSL 8
loda,r0 tt
addi,r0 1
stra,r0 tt
LBL:
bdrr,r3 ylp
retc,un
;///////////////////////////////////////////////////////////////
plot: ;r2=X,r1=Y
;12
;48
;
lodz r1
CPSL 8+1
rrr,r0
lodi,r3 0
tmi,r0 1
bcfr,eq br1
iori,r3 40h
br1:
tmi,r0 2
bcfr,eq br2
iori,r3 80h
br2:
CPSL 8+1
rrr,r0
rrr,r0
andi,r0 01Fh
CPSL 8
addi,r0 10h
stra,r0 tt
stra,r3 tt+1
lodz r2 ;r2=X
strz r3
;check bit value
;r0=1
lodi,r0 1
;if y&1:r0=4
tmi,r2 1
bcfr,eq bra1
lodi,r0 4
bra1:
;if x&1:r0=r0*2
tmi,r1 1
bcfr,eq bra2
CPSL 8
addz r0
bra2:
CPSL 8
rrr,r3
andi,r3 07Fh
iori,r0 0C0h
iora,r0 *tt,r3
stra,r0 *tt,r3
retc,un
end
Комментарии
Отправить комментарий