#04 — И целого байта мало… | Берем БК за рога

    На прошлой неделе =RMDA= выпустила свой первый релиз для легендарного советского компьютера «Электроника БК-0011М» и я хочу рассказать вам некоторые подробности. Вот сама работа: Gift 2020

    image

    Это gift — такой тип поздравительных intro, обычно приуроченных к Дням Рождения. Так получилось, что к моменту завершения работы у двух видных деятелей российской демосцены синхронно случился день рождения, и мы решили немного переформатировать этот релиз в гифт, чтобы все остались довольны. В остальном, перед нами обычное intro/demo, никак не связанное с ограничениями по размерам.

    Программировать на БК не сложнее и не проще, чем на любом другом устройстве. Берешь средства разработки, мануалы, готовые библиотеки кода, соединяешь все вместе и добавляешь к этому идею. Средств разработки для БК очень много, справочной информации еще больше. Фактически, все что делалось на БК до 1997 года — это один непрерывный пласт справочной информации. Есть даже весьма приличный эмулятор, который продолжают обновлять на периодической основе, правда он строго под Windows.

    В чем же проблема? В чем технологический вызов? Особенно если мы пишем банальный HELLO WORLD для новой платформы?


    На демосцене принято снабжать релизы .NFO-файлом, где как раз и описаны, кратко, но емко, все детали происходящего. Фактически, статья на Хабре не нужна, если вы умеете читать .NFO:

             ________    ___  ____    _______    ________
           __\       \ _/   \/    \ _/       \ __\       \__
           \__   __   \\     \     \\   __    \\__   __   _/
            /    |/ __/           _/_   |/   _/_/    |/  /_
            \    /    \_           /    /      \          \
             \____\___//___\  /___/____________/\_____\___/
                            \/   redefine the future!
    gift 2020
    demo, Elektronika BK0011M + AY-8910
    
    code - siniy
     alarm - okin
      farted by ded
    
    YouTube: sorry, no YouTube, BK is too hard even for RMDA
    
    HowTO:
    
    1) Download emulator here http://gid.pdp-11.ru
    2) Install it and find installation directory
    3) Replace /image/MKDOS513.IMG with file from our release
    4) Launch emulator
    5) In NC-style enviroment navigate up, change dir/disk
    6) Find gft2o2o.com file and press Enter
    7) AY-8910 must be enabled
    8) Assembler+devtools also available at http://gid.pdp-11.ru
    
    BK - shit na veka!
    
    RMDA 2020 @ https://rmda.su
    
    02/04/2020
    
    russkie idut...
    

    В рамках этого цикла статей на Хабре мы конечно преследуем образовательные цели. Рассказываем вам о демосцене, но при этом не ставим целей научить вас программировать на ассемблере. Работа выше — это всего лишь три слайда меняющихся под музыку. Это очень и очень просто, но давайте посмотрим в код:

    	CALL CLS
    	MOV #msg3,R5
    	MOV #40000+4.+0x1B00,R0
    	CALL PRT
    
     MOV #8.,R0 ;сколько пустых циклов
     CLR R1
    L1: SOB R1,L1
     SOB R0,L1
     MOV #32768.,R0
     MOV R0,COL
    
    ;setup timer
    START:
     MOV #TICK,@#100
     MOV #2,@#102
     CLR @#177662 ;вкл таймер, 0 палитра
    
    SSH:
    ;load picture
     MOV #File_002,R1
     EMT 36
    
    	MOV #msg1,R5
    	MOV #40000+27.,R0
    	ADD #0x3600,R0
    	CALL PRT
    
    ;play song
    	MOV #1,R0
    	MOV R0,PSGPA
    	MOV #SONG+16.,R0
    	MOV R0,PSGPO
    	CALL PL
    	CALL CLS
    
     MOV #File_001,R1
     EMT 36
    
    	MOV #msg2,R5
    	MOV #40000+16.,R0
    	ADD #0x3600,R0
    	CALL PRT
    
    ;play song
    	MOV #1,R0
    	MOV R0,PSGPA
    	MOV #SONG+16.,R0
    	MOV R0,PSGPO
    	CALL PL
    	CALL CLS
    	JMP SSH
    CLS:
    	MOV #40000,R0
    CL:
    	CLR (R0)+
    	TST R0
    	BPL CL
    	RET
    ;**************************************************************************************
    ;play song
    PL: WAIT
    	MOV PSGPA,R0
    	TST R0
    	BEQ PSGA
    	DEC R0
    	MOV R0,PSGPA
    	BR PL
    PSGA:
    	MOV PSGPO,R0
    dumpreg:
    	MOVB (R0)+,R1
    	BIC #0xFF00,R1
    	CMP #0xFF,R1
    	BEQ stoplay
    	CMP #0xFE,R1
    	BNE nogetwait
    	MOVB (R0)+,R2
    	BIC #0xFF00,R2
    	ASL R2
    	ASL R2
    	MOV R2,PSGPA
    	BR stoplay
    nogetwait:
    	CMP #0xFD,R1
    	BEQ stoplay2
    	COMB R1
    	MOV R1,@#177714
    	MOVB (R0)+,R1
    	BIC #0xFF00,R1
    	COMB R1
    	MOVB R1,@#177714
        BR dumpreg
    stoplay2:
    	RET ;MOV #SONG+16.,R0
    stoplay:
    	MOV R0,PSGPO
    	JMP PL
    
    ;**************************************************************************************
    TICK:
    RTI
    PSGPA: .WORD 1
    
    PSGPO: .WORD SONG+16.
    SONG:
     .byte 0x50,0x53,0x47,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ----тут пропущены данные трека, смотрите полный исходник в архиве
     .byte 0x0F,0x09,0x10,0x0A,0x0F,0x0B,0x46,0x0D,0x0C,0xFE,0x01,0x00,0xA1,0x04,0x16,0x0B
     .byte 0xFD ; end of song
    .EVEN
    ;--------------------------------------------------------------
    COL: .WORD 49152.;32768.
    PRT:
    
    tout:
    	MOVB (R5)+,R3
    	SUB #32.,R3
    	BIC #0xFF00,R3
    ;*10
    	ADD R3,R3;*2
    	MOV R3,R1
    	ADD R3,R3;*4
    	ADD R3,R3;*8
    	ADD R3,R1;*10
    	ADD #112276,R1
    	
    	MOV R0,-(SP)
    	MOVB #10.,4(SP)
    cf:
    	MOVB (R1)+,R2
    
    ;make for standart
    
    	MOVB #8.,6(R6)
    	MOV #0,R3
    m2:
    	ASR R2
    	BCC m3
    	BIS @#COL,R3
    m3:
    	CLC
    	ROR R3
    	ROR R3
    
    	DECB 6(R6)
    	BNE m2
    
    	MOV R3,(R0);+
    	ADD #64.,R0
    	DECB 4(SP)
    	BNE cf
    	
    	MOV (SP)+,R0
    	INC R0
    	INC R0
    	TSTB (R5)
    	BNE tout
    	RET
    ;--------------------------------------------------------------
    msg1: .ascii /2 may 1945/
     .byte 0
    msg2: .ascii /Russkie idut.../
    	.byte 0,0
    msg3: .ascii /Happy birthday Tim & Random!/
    	.byte 0,0
    
    File_001:
     .WORD 3,0,0 ; 1=флаг чтения, адрес загрузки, длина (0! при чтении)
     .ASCII  "PO1             " ;имя 16 байт
     .BYTE 5,6   ;страницы 40-100, 100-140 (если WORD -1., то в текущие)
     .BLKB 20.   ;инфа о загруженном файле
    
    File_002:
     .WORD 3,0,0 ; 1=флаг чтения, адрес загрузки, длина (0! при чтении)
     .ASCII  "PO2             " ;имя 16 байт
     .BYTE 5,6   ;страницы 40-100, 100-140 (если WORD -1., то в текущие)
     .BLKB 20.   ;инфа о загруженном файле
    
     .EVEN
     .END
    

    ВАЖНО! Не пытайтесь собрать код из статьи! Он специально сокращен и отформатирован под нормальную читаемость на Хабре. Если вы хотите собрать работу сами — используйте оригинальный архив на Pouet и папку /source. Стоит сразу признать — сделано далеко не честь по чести, но для первого опыта на неведомом ранее компьютере все вполне прилично. Возможно, уже после Revision Online 2020 мы сделаем более продвинутую, финальную версию этого гифта. Возможно…

    Какие выводы мы сделали из проекта на БК? С одной стороны, все прекрасно, есть средства разработки, есть документация. То что БК — ужасная архитектура, мы знали и так. Однако, никто не ожидал после ZX и PC столкнуться с ситуацией ТОТАЛЬНОГО ОТСУТСТВИЯ самых базовых процедур и библиотек. Например, мы совершенно были не готовы к тому, что для проигрывания готового chiptune-трека (сирена), написанного в Vortex Tracker, нам понадобится помощь самого Manwe_SandS. И речь не о том, что на БК в порты звукового чипа AY нужно отправлять инвертированные значения, это пол-беды. У людей за 20 лет просто не появилось банального плеера PT3, хотя в 90-ых годах огромное количество музыки с ZX Spectrum переносилось на БК в несколько кликов мышью. Вот так, за 20 лет бездействия, сцена легендарного советского компьютера полностью утратила духовность.

    Ничего, =RMDA= поможет!

    В остальном, БК — это весело и задорно! Смело берите БК за рога! Спасибо.

    ---EOF---

    #FF — И целого байта мало… | Пилот)
    #00 — ИЦБМ… | Приглашение на Revision Online 2020
    #01 — ИЦБМ… | Какими бывают intro?
    #02 — ИЦБМ… | The Cross of Changes
    #03 — ИЦБМ… | 2B or not 2B
    #04 — ИЦБМ… | Берем БК за рога
    #05 — ИЦБМ… | Анимэ
    #06 — ИЦБМ… | Метеоризмы
    #07 — ИЦБМ… | Revision Online

    Развлекательный канал деда в Телеграм: teleg.run/bornded

    Рядом с каналом есть чат. В нем можно попробовать поднять вопросы за демосцену, ассемблер, пиксель-арт, трекерную музыку и другие аспекты процессы. Вам могут ответить либо отправят в другие, более тематические чаты.

    ТАК ПОБЕЖДАЛИ — ТАК ПОБЕДИМ!
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 26

      +2
      Я так и не понял, почему «БК ужасная архитектура», но ладно, плюсанул за релиз :) Лучше делать, чем не делать!
        0
        за одни цвета надо сослать в лагеря — уж тут хотя бы согласись :-)

        кто инвертнул регистры AY? Пушкин? Один диод сэкономили? Но у нас тут нет целей разбираться ZX vs БК — мы констатируем что увидели сами в процессе работы.
          +5
          Шина QBUS инвертированная, промышленный стандарт.
          Цвета у БК 0010 норм – ну а что делать при 2 битах на точку, если не RGB? А вот в БК 0011(м) палитры очень странные, я согласен. Из 16 штук только три-четыре нормальные, при этом не хватает самых важных типа чёрный-синий-жёлтый-белый (ala Norton Commander).
        0
        Ну с инвертировнной шиной на БК допустим понятно, но вот кто может внятно объяснить почему на БК повсеместно используется восьмеричная система счисления (OCT) для адресов и пр.?
        Я думал, что использовать 3 бита на разряд (0-7), имело бы смысл только при 6 или 8 битном Байте. Т.е. чем хороша шестнадцатеричная система (HEX), тем что на разряд использутеся 4 бита (0-F), и для обозначения байта хватает двух разрядов: 88, AA, FF и пр.
        А вот почему во всей документации к БК используется восьмеричная — не понятно, если шина всё равно 16-битная (даже не 15). А адресуемой памяти по прежнему 64Кб т.е. 0xFFFF, что oct'e выглядит убого 0177777.
        Да и вот это вот всё выглядит странно и не привычно:
        MOV R1,@#177714 
        ....
        ADD #112276,R1
          –1
          чтобы потенциальный противник при захвате на поле боя оборудования не смог быстро разобраться даже при наличии инструкций
            +2
            Который потенциальный противник? Это же архитектура ПДП-11!
            Вот что меня заставило поматериться, так это вычисление переходов во всех этих бранчах Bxx. У нас на кафедре импортозамещенная PDP-11 управляла промышленным роботом, тоже Электроникой. Ассемблировали мы, по традиции, на бумажке в клеточку, а с терминала в память вводили уже восьмеричные коды программы.
            И рядом, для сравения, стояли учебные стенды на К580, ввод программ также с клавиатуры, вывод на семисегментные дисплеи на АЛСках. Тот же ассемблер «в клеточку». Так что сравнить архитектурные прелести было с чем.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Спасибо, за развёрнутый ответ. Чего-то подобного я и ожидал, но не думал что настолько всё плохо, насколько далёк этот рудимент от современных реалий, но БКшники почему-то до сих пор живут с ним.
              Еще интересно было бы услышать мнение самих инженеров которые приложили руку к созданию БК, я знаю они где-то тут и читают Хабр, почему же всё таки в основе восьмеричная а не шестнадцатеричная системы, может быть просто не знали? Или просто перенесли всё как было, с PDP-11?
              • НЛО прилетело и опубликовало эту надпись здесь
              +4
              Все очень просто — у DEC 16 битное поле команды разбивалось на следующие секции
              oooommmsssmmmddd, поэтому поля источника и приемника удобно кодировать в восьмеричной 012737 — переслать непосредственный в прямой адрес, ну а код операции заодно с операндами.
                +1
                А-а, вот оно что, значит набор команд процессора специально разрабатывался таким образом, чтобы человек мог писать и вводить программы вручную с клавиатуры по их опкодам, не используя язык ассемблера. Поэтому в вашем примере — 012737 для комманды oooommmsssmmmddd: 01 — это opcode, 2 — это mode, 7 — source, 3 — dest mode, 7 — destination.
                Для ручного ввода команд — понятно, но для адресации памяти и портов, восьмеричная система всё равно не очень-то удобна, или там тоже периферия выровнена по 3м младшим битам, по инерции.
                  +3
                  8 регистров, 8 методов адресации – 8-ричная система подходит идеально для отображения кодов инструкций. Ну а числа (аргументы) можно записывать в 10-ной система (для этого после числа ставят точку).
                  В ПЗУ БК-0011м прошит простенький отладчик, который позволяет смотреть и изменять содержимое памяти. Он отображает всё в 8-ричной системе – в случае с инструкциями процессора сразу понятно за что отвечает каждая цифра числа.
                    +5
                    Ну не знаю, я до сих пор помню 177560, это не намного сложнее, чем FF70.
                    Да и возможность набирать только на цифровой клавиатуре тоже нельзя сбрасывать со счетов.
                      +3
                      Восьмеричная система упрощала программирование в кодах на клавишной панели. При отсутствии терминала можно было написать загрузчик или другю короткую программу просто взяв книгу или по памяти воспроизвести коды процессора введя их на панели переключателями.
                      Так же с ручкой и бумагой проще вычислять в уме именно в восьмеричной системе чем в шестнадцатиричной.
                      Архитектура PDP-11 (LSI-11) заимствованная для БК-0010 (и программируемого микрокалькулятора МК-85) на первый взгляд кажется неудобной. На самом деле всё продумано и просто. Работа с периферией сводится к обращениям с регистрами, так же как с переменными в памяти. Всё есть память! — девиз PDP-11.

                      habr.com/ru/post/435292
                      Так же ознакомьтесь с «Г.В. Вигдорчик — Основы программирования на Ассемблере для СМ ЭВМ.»
                        +2
                        8-я или 16-я системы счисления чисто вопрос привычки, поверьте как БК-шнику со стажем. У меня, например, были ломки при переходе на 16-ю систему на PC.
                        для адресации памяти и портов, восьмеричная система всё равно не очень-то удобна
                        Все очень удобно. 8-я о1000 — 512 байт, о2000 — 1024 байта. Все микросхемы памяти, сектора диска, все кратно целым значениям.
                          0
                          А-а, вот оно что, значит набор команд процессора специально разрабатывался таким образом, чтобы человек мог писать и вводить программы вручную с клавиатуры по их опкодам, не используя язык ассемблера.
                          Заметим, кстати, что и 8080/z80 и 8086/80286/80386 тоже разрабатывались с таким подходом. Там, правда, не машинное слово, а байты на части делятся, но то же самое — два поля по три бита, одно — в два бита.

                          А вот уже когда FMA4 и AVX512 делали — там дополнителный байт делится на две половинки по 4 бита. Видно, что четверть века работали с шестнадцатиричной системой… А вот в ARM, кстати, поля все четырёхбитные (но в ARM64 всё куда сложнее, тут уже под чтение опокодов без дизассемблера вообще никто не закладывался).
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Процессору конечно все-равно, но человеку не удобно выполнять лишние вычисление в уме: берем какую-нибудь команду в восьмеричном виде, например байтовые операнды, с op-кодом 1 и два аргумента — (R1), (R2), получаем: о111112
                              Читается прямо также: 1 (байт), 1(op-code), 1(adr1), 1(reg1), 1(adr2), 2(reg2).
                              в вашем варианте превращается в: х‭909A‬
                              Плюс вводится совершенно не нужный термин индирекции. Чем это лучше не понятно.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • НЛО прилетело и опубликовало эту надпись здесь
                                    0
                                    8-F — это значение в ячейке памяти с адресом в регистре — это не так. В PDP11 все намного круче. Там есть адресации как значение в ячейке памяти с адресом в регистре, так и значение в ячейке памяти с адресом адреса в регистре (двойная косвенность) — типа вот такой @(Rn)+. Т.е. по вашей классификации уже как минимум три типа.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  Это вряд ли имеет прямое отношение именно к триплетам цифр восьмеричной системы, а просто есть обоснованная необходимость.
                                  Посмотрите на систему команд 6502.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Если присутствует совершенно не родной для БК чип AY8910 то почему был выбран именно БК? И если уже рассуждать о легендарности отбросив в сторону клоны ZX Spectrum то скорее уж какой то Агат 7 или Агат 9 будет претендовать на легендарность, поскольку БК ну уж очень дубовый был.
                            0
                            это можно, но потом…

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое