Давным-давно столкнулся с этим древним компьютером, но забыл по какой-то причине. Недавно нашел упоминание об устройстве и вернулся. С эмулятором все грустно, старые наработки, написанные под msdos, показались неудобными в работе.
Нашелся более модный эмулятор, но не удалось внести в него хотя бы одну программу. Вернулся к эмулятору на JS, почитал документацию и стал экспериментировать. Программа 1:
000: 000 A
000 B
000 X
004 P
023 loada
252 imm
034 Storea
200 address
000 Halt (waiting for input)
000 B
000 X
004 P
023 loada
252 imm
034 Storea
200 address
000 Halt (waiting for input)
Пояснение для тех, кто не в курсе: у компа есть 256 байт память, регистры A,B,X,P привязаны к 0-3, ячейка 128(восьмиричный адрес 200) отвечает за светодиоды. Программу следует читать так:
A=170
POKE 128,A
STOP
Теперь я решил усложнить задачу, устроить анимацию. Проблема в том, что подобную программу легче отлаживать пошагово. Просматривая исходный текст симулятора, я увидел запрятанную за рисунки кнопку STEP, скачал файлы и исправил верстку:
<div id="button_step" onClick="doinstruction(); updatedump();">STEP</div>
div#button_step { top:116px; left:660px; width:8px; height:25px; cursor:pointer; position: absolute;}
Отлично, начал писать программу, плюясь над таблицей и переводя двоичные значения в восьмиричные числа. Один час мучений и программа заработала:
000: 000 A
000 B
000 X
004 P
004: 026 022 load a vv,x
034 200 Storea 200
024 002 loada 2
003 001 adda,01
323 017 anda,7
034 002 x=a
343 004 jmp 004
001 002 004 010 020 040 100 200
200 100 040 020 010 004 002 001
в переводе это выглядит так:
A-PEEK(022o+X)
POKE 128,A
A=(X+1)&7
X=A
В идеале программу можно упростить, надо только понять, как применить инструкции SKIP, и как работают сдвиги. Но не сейчас.
Вечерний зуд: написать программу
000
000
000
004
023 200 loada 128
034 200 storea 200
111 rotate A left 1
343 006 jmp 006
Дополнение 2: blinken lights
200 A
000 B
000 X
004 P
034 200 storea 200
111 rotate A right 1
302 000 skp Ab0=1 11000010
343 004 jmp 004
//here comes right shift
034 200 storea 200
311 rotate A left 1 11001001
372 000 skp Ab7=1 11111010
343 013 jmp 013
//goto right part
343 004 jmp 004
Долго думал, как применить SKIP-инструкции(считай условия). Вышло, что первая часть осуществляет сдвиг вправо пока бит0 аккумулятора равен 0. Вторая часть: те же яйца, только сбоку или в профиль.
Дополнение 3 файлы для записи
Комментарии
Отправить комментарий