Коды программ для zx spectrum

Я не буду делать днинное вступление. Один знакомый хакер однажды сказал, что 10 строк кода могут быть понятнее и интереснее, чем 1000 слов объяснений. Все эти примеры написаны на ассемблере для архитектуры Z80 и запускаются на ретро-компьютере ZX Spectrum 48k.

Книги, ссылки, разные полезности и все такое прочее

Выводим текст на экран. Сами символы будут рисоваться с помощью кода, который уже есть в ROM памяти.

DEVICE ZXSPECTRUM48 ; даем компилятору знать, для какого компьютера мы пишем. Это влияет на экспорт .TAP файла org $8000 ; пусть все наши байты попадут в память начиная с адреса 0x8000 ld a, 2 ; загружаем двойку в регистр A call $1601 ; вызываем функцию, которая лежит где-то в прошивке (переключение потока печати) ld bc, string_end — string ; просим компилятор вычесть одно из другого, это такой хитрый способ вычисления длины строки ld de, string ; кладем адрес начала строки в регистровую пару de call $203c ; и вызываем что-то, что находится в прошивке (печать строки) ; когда оно отработает, выполнение продолжится с этого же места ret ; программа закончилась, пора возвращаться в интерпретатор string: db «zx spectrum rulez»,$0d ; строка текста будет лежать по этому адресу string_end: code_end: ; это просто метки, когда компилятор примется за дело, он расставит нужные адреса вместо меток SAVEBIN «noise.bin»,$8000,code_end — $8000 ; встроенная в компилятор функция. ; можно экспортировать произвольный промежуток как бинарник EMPTYTAP «noise.tap» ; а еще можно сохранить tap прямо из ассемблера, если ваш компилятор так умеет SAVETAP «noise.tap»,CODE,»run32768″,$8000,code_end — $8000,$8000

https://skoolkid.github.io/rom/index.html — список интересных адресов в прошивке, с комментариями.

Быстрая загрузка программ для ZX Spectrum


https://skoolkid.github.io/rom/asm/1FFC.html — вот тут спрятана $203c процедура.

Сохраняем программу как текстовый файл noise.asm. Запускаем компилятор:

wine sjasmplus.exe noise.asm —lst=noise.lst —sym=noise.sym

А вот так выгдядит список меток. Теперь каждая метка получила свой адрес:

code_end: EQU 0x00008021 string: EQU 0x0000800F string_end: EQU 0x00008021

Включаем эмулятор спектрума, вставляем кассету с нашей программой, отдаем команду LOAD «» CODE , включаем кассету на воспроизведение. Программа засасывается в память по адресу, который указан в заголовке блока, то есть, 32768 ($8000).

Запускаем то, что лежит в памяти: RANDOMIZE USR 32768

Добавим пробелы по сторонам и цветовые коды. Пусть надпись будет в центре.

db $16,11,4,$11,$01,$10,$06,» zx spectrum rulez » ; немного поменяем эту строку

Байты можно указывать в 16-ричном виде ($00 — $ff), а можно в десятичном (0 — 255), а можно в виде строкового литерала.

Байт $16 — это команда ‘AT’ , и после нее должны идти еще два байта, задающие новые координаты курсора.

Байты $10, $11 — это команды ‘INK’ и ‘PAPER’ , после каждой из них должен идти один байт, задающий цвет ($00 — $07).

Надо добавить бейсиковый загрузчик, чтобы программа могла сама запускаться после загрузки с кассеты.

Формат .tap описан здесь: https://documentation.help/BASin/format_tape.html https://sinclair.wiki.zxnet.co.uk/wiki/TAP_format

Спектрум хранит бейсиковые программы в особом формате (https://habr.com/ru/post/103127/). И если набрать программу на эмуляторе спектрума, потом сделать дамп памяти, то можно найти то место, где все это хранится:

Затем эти байты можно вставить прямо в асм и попросить sjasmplus собрать нам tap файл, который содержит загрузчик. Это немного дурацкий метод, но он работает.

org $4000 ; выбираем какой-нибудь адрес, и ничего, что он попадает в дисплей. Это временно basic_loader: db $00,$0a,$0e,$00,$20,$fd,»32767″,$0e,$00,$00,$ff,$7f,$00,$0d ; 10 CLEAR 32767 db $00,$14,$07,$00,$20,$ef,$22,$22,$20,$af,$0d ; 20 LOAD «» CODE db $00,$1e,$0f,$00,$20,$f9,$c0,»32768″,$0e,$00,$00,$00,$80,$00,$0d ; 30 RANDOMIZE USR 32768 basic_loader_end: SAVEBIN «noise.bin»,$8000,code_end — $8000 EMPTYTAP «noise.tap» SAVETAP «noise.tap»,BASIC,»loader»,basic_loader,basic_loader_end — basic_loader, 10 SAVETAP «noise.tap»,CODE,»run32768″,$8000,code_end — $8000,$8000

Чтобы загрузить такую кассету, нужна команда LOAD «»

Получается, на кассете будет записан сначала заголовок BASIC блока, потом сама программа на бейсике, которая сразу же самозапустится (номер строки, с которой начнется выполнение, хранится в заголовке). А она уже загрузит наш код и запустит его.

Добавим движения. Пусть надпись будет ползать по экрану по диагонали, менять цвет и оставлять следы. Еще сделаем клавишу для выхода.

Длиннотекст и анимированная гифка

DEVICE ZXSPECTRUM48 org $8000 ld a, 2 call $1601 ; select stream ld a, %00000001 out ($fe), a ; переключим цвет бордюра на синий main_loop: halt ; после этой команды процессор ничего не может выполнять, программа виснет halt ; пока не придет прерывание (а оно срабатывает в начале кадра, 50 кадров в секунду) halt ; прерывания же включены, не так ли? halt ; наша строка будет делать один шаг каждые четыре кадра push bc ; у нас в регистре B хранится переменная. Надо ее сохранить в стеке ld bc, string_end — string ld de, string call $203c ; output string pop bc ; и не забыть вынуть ее обратно из стека ld hl, string + 1 ; Будем прямо на ходу менять байты в строке ld a, (hl) ld b, a ; сохраняем регистр A в регистр B, чтобы потом вернуть, если что inc a cp 22 ; если цифра больше 21, то это уже много, нужно поставить ноль jr nz, vertical_check_ok xor a ; обнуляем регистр A vertical_check_ok: ld (hl), a ; записываем получившийся байт обратно в строку inc hl ld a, (hl) or a ; сравниваем регистр A с самим собой.

Если он нулевой, то прыгаем jr z, horisontal_need_to_jump dec a ; уменьшаем на единичку ld (hl), a jr horisontal_ok horisontal_need_to_jump: ld a, 31 ; ставим курсор на крайний правый символ ld (hl), a dec hl ld (hl), b ; тут мы снова лезем в вертикальный байт и меняем его обратно inc hl horisontal_ok: inc hl inc hl ld a, (hl) ; меняем цвет фона inc a and %00000111 ; обнуляем биты, чтобы цифра была от 0 до 7 ld (hl), a inc hl inc hl ld a, (hl) ; меняем цвет текста inc a and %00000111 ; то же самое ld (hl), a ld a, %01111111 in a, ($fe) ; читаем клавиатуру and $00000001 ; если нажать пробел, то программа выходит обратно в бэйсик jr nz, main_loop ; это такой цикл, он будет крутиться все время ret ; return to basic string: db $16,11,4,$11,$01,$10,$06,» zx spectrum rulez » string_end: code_end: org $4000 basic_loader: db $00,$0a,$0e,$00,$20,$fd,»32767″,$0e,$00,$00,$ff,$7f,$00,$0d ; 10 CLEAR 32767 db $00,$14,$07,$00,$20,$ef,$22,$22,$20,$af,$0d ; 20 LOAD «» CODE db $00,$1e,$0f,$00,$20,$f9,$c0,»32768″,$0e,$00,$00,$00,$80,$00,$0d ; 30 RANDOMIZE USR 32768 basic_loader_end: SAVEBIN «noise.bin»,$8000,code_end — $8000 EMPTYTAP «noise.tap» SAVETAP «noise.tap»,BASIC,»loader»,basic_loader,basic_loader_end — basic_loader, 10 SAVETAP «noise.tap»,CODE,»run32768″,$8000,code_end — $8000,$8000

К чему это все?

Кому это может понадобиться? Дело в том, что у ассемблерщиков сформировалась традиция проводить фестивали демосцены. Демосцена возникла не на пустом месте, у нее есть свои традиции и своя история. И вы читаете эту статью не случайно. Вам ведь надо срочно научиться кодить на Z80, чтобы успеть отправить свою первую работу на competition.

Читайте также:
Служба помощника по совместимости программ можно ли отключить

Верно?

Готовые работы других демосценеров доступны для всех желающих (можно запустить на эмуляторе самому или посмотреть видео в YouTube)

  • https://www.pouet.net/prodlist.php?platform[]=ZX+Spectrumhttps://temofeev.ru/info/articles/primery-assemblernogo-koda-dlya-zx-spectrum/» target=»_blank»]temofeev.ru[/mask_link]

    Примеры ассемблерного кода для ZX Spectrum

    Я не буду делать длинное вступление. Один знакомый хакер однажды сказал, что 10 строк кода могут быть понятнее и интереснее, чем 1000 слов объяснений. Все эти примеры написаны на ассемблере для архитектуры Z80 и запускаются на ретро-компьютере ZX Spectrum 48k.

    Книги, ссылки, разные полезности и все такое прочее

    Выводим текст на экран. Сами символы будут рисоваться с помощью кода, который уже есть в ROM памяти.

    DEVICE ZXSPECTRUM48 ; даем компилятору знать, для какого компьютера мы пишем. Это влияет на экспорт .TAP файла org $8000 ; пусть все наши байты попадут в память начиная с адреса 0x8000 ld a, 2 ; загружаем двойку в регистр A call $1601 ; вызываем функцию, которая лежит где-то в прошивке (переключение потока печати) ld bc, string_end — string ; просим компилятор вычесть одно из другого, это такой хитрый способ вычисления длины строки ld de, string ; кладем адрес начала строки в регистровую пару de call $203c ; и вызываем что-то, что находится в прошивке (печать строки) ; когда оно отработает, выполнение продолжится с этого же места ret ; программа закончилась, пора возвращаться в интерпретатор string: db «zx spectrum rulez»,$0d ; строка текста будет лежать по этому адресу string_end: code_end: ; это просто метки, когда компилятор примется за дело, он расставит нужные адреса вместо меток SAVEBIN «noise.bin»,$8000,code_end — $8000 ; встроенная в компилятор функция. ; можно экспортировать произвольный промежуток как бинарник EMPTYTAP «noise.tap» ; а еще можно сохранить tap прямо из ассемблера, если ваш компилятор так умеет SAVETAP «noise.tap»,CODE,»run32768″,$8000,code_end — $8000,$8000

    Сохраняем программу как текстовый файл noise.asm. Запускаем компилятор:

    wine sjasmplus.exe noise.asm —lst=noise.lst —sym=noise.sym

    А вот так выгдядит список меток. Теперь каждая метка получила свой адрес:

    code_end: EQU 0x00008021 string: EQU 0x0000800F string_end: EQU 0x00008021

    Включаем эмулятор спектрума, вставляем кассету с нашей программой, отдаем команду LOAD «» CODE , включаем кассету на воспроизведение. Программа засасывается в память по адресу, который указан в заголовке блока, то есть, 32768 ($8000).

    Запускаем то, что лежит в памяти: RANDOMIZE USR 32768

    Добавим пробелы по сторонам и цветовые коды. Пусть надпись будет в центре.

    db $16,11,4,$11,$01,$10,$06,» zx spectrum rulez » ; немного поменяем эту строку

    Байты можно указывать в 16-ричном виде ($00 — $ff), а можно в десятичном (0 — 255), а можно в виде строкового литерала.

    Байт $16 — это команда ‘AT’ , и после нее должны идти еще два байта, задающие новые координаты курсора.

    Байты $10, $11 — это команды ‘INK’ и ‘PAPER’ , после каждой из них должен идти один байт, задающий цвет ($00 — $07).

    Надо добавить бейсиковый загрузчик, чтобы программа могла сама запускаться после загрузки с кассеты.

    Спектрум хранит бейсиковые программы в особом формате (https://habr.com/ru/post/103127/). И если набрать программу на эмуляторе спектрума, потом сделать дамп памяти, то можно найти то место, где все это хранится:

    Затем эти байты можно вставить прямо в асм и попросить sjasmplus собрать нам tap файл, который содержит загрузчик. Это немного дурацкий метод, но он работает.

    org $4000 ; выбираем какой-нибудь адрес, и ничего, что он попадает в дисплей. Это временно basic_loader: db $00,$0a,$0e,$00,$20,$fd,»32767″,$0e,$00,$00,$ff,$7f,$00,$0d ; 10 CLEAR 32767 db $00,$14,$07,$00,$20,$ef,$22,$22,$20,$af,$0d ; 20 LOAD «» CODE db $00,$1e,$0f,$00,$20,$f9,$c0,»32768″,$0e,$00,$00,$00,$80,$00,$0d ; 30 RANDOMIZE USR 32768 basic_loader_end: SAVEBIN «noise.bin»,$8000,code_end — $8000 EMPTYTAP «noise.tap» SAVETAP «noise.tap»,BASIC,»loader»,basic_loader,basic_loader_end — basic_loader, 10 SAVETAP «noise.tap»,CODE,»run32768″,$8000,code_end — $8000,$8000

    Чтобы загрузить такую кассету, нужна команда LOAD «»

    Получается, на кассете будет записан сначала заголовок BASIC блока, потом сама программа на бейсике, которая сразу же самозапустится (номер строки, с которой начнется выполнение, хранится в заголовке). А она уже загрузит наш код и запустит его.

    Добавим движения. Пусть надпись будет ползать по экрану по диагонали, менять цвет и оставлять следы. Еще сделаем клавишу для выхода.

    Длиннотекст и анимированная гифка

    DEVICE ZXSPECTRUM48 org $8000 ld a, 2 call $1601 ; select stream ld a, %00000001 out ($fe), a ; переключим цвет бордюра на синий main_loop: halt ; после этой команды процессор ничего не может выполнять, программа виснет halt ; пока не придет прерывание (а оно срабатывает в начале кадра, 50 кадров в секунду) halt ; прерывания же включены, не так ли? halt ; наша строка будет делать один шаг каждые четыре кадра push bc ; у нас в регистре B хранится переменная. Надо ее сохранить в стеке ld bc, string_end — string ld de, string call $203c ; output string pop bc ; и не забыть вынуть ее обратно из стека ld hl, string + 1 ; Будем прямо на ходу менять байты в строке ld a, (hl) ld b, a ; сохраняем регистр A в регистр B, чтобы потом вернуть, если что inc a cp 22 ; если цифра больше 21, то это уже много, нужно поставить ноль jr nz, vertical_check_ok xor a ; обнуляем регистр A vertical_check_ok: ld (hl), a ; записываем получившийся байт обратно в строку inc hl ld a, (hl) or a ; сравниваем регистр A с самим собой.

    Если он нулевой, то прыгаем jr z, horisontal_need_to_jump dec a ; уменьшаем на единичку ld (hl), a jr horisontal_ok horisontal_need_to_jump: ld a, 31 ; ставим курсор на крайний правый символ ld (hl), a dec hl ld (hl), b ; тут мы снова лезем в вертикальный байт и меняем его обратно inc hl horisontal_ok: inc hl inc hl ld a, (hl) ; меняем цвет фона inc a and %00000111 ; обнуляем биты, чтобы цифра была от 0 до 7 ld (hl), a inc hl inc hl ld a, (hl) ; меняем цвет текста inc a and %00000111 ; то же самое ld (hl), a ld a, %01111111 in a, ($fe) ; читаем клавиатуру and $00000001 ; если нажать пробел, то программа выходит обратно в бэйсик jr nz, main_loop ; это такой цикл, он будет крутиться все время ret ; return to basic string: db $16,11,4,$11,$01,$10,$06,» zx spectrum rulez » string_end: code_end: org $4000 basic_loader: db $00,$0a,$0e,$00,$20,$fd,»32767″,$0e,$00,$00,$ff,$7f,$00,$0d ; 10 CLEAR 32767 db $00,$14,$07,$00,$20,$ef,$22,$22,$20,$af,$0d ; 20 LOAD «» CODE db $00,$1e,$0f,$00,$20,$f9,$c0,»32768″,$0e,$00,$00,$00,$80,$00,$0d ; 30 RANDOMIZE USR 32768 basic_loader_end: SAVEBIN «noise.bin»,$8000,code_end — $8000 EMPTYTAP «noise.tap» SAVETAP «noise.tap»,BASIC,»loader»,basic_loader,basic_loader_end — basic_loader, 10 SAVETAP «noise.tap»,CODE,»run32768″,$8000,code_end — $8000,$8000

    К чему это все?

    Кому это может понадобиться? Дело в том, что у ассемблерщиков сформировалась традиция проводить фестивали демосцены. Демосцена возникла не на пустом месте, у нее есть свои традиции и своя история. И вы читаете эту статью не случайно. Вам ведь надо срочно научиться кодить на Z80, чтобы успеть отправить свою первую работу на competition.

    Верно?

    Готовые работы других демосценеров доступны для всех желающих (можно запустить на эмуляторе самому или посмотреть видео в YouTube)

    • https://www.pouet.net/prodlist.php?platform[]=ZX+Spectrumhttps://habr.com/ru/articles/598689/» target=»_blank»]habr.com[/mask_link]

      Вспоминаем старый добрый ZX Spectrum, пишем «Hello World» и знакомимся с демосценой

      Вспоминаем старый добрый ZX Spectrum, пишем «Hello World» и знакомимся с демосценой

      2016-07-07 в 21:01, admin , рубрики: open source, Wct, zx spectrum, доброе прошлое, ненормальное программирование, ностальгия, отладка, Программирование, прошлое, спектрум

      «Пословица звучит витиевато:
      “Не восхищайтесь прошлогодним небом”.
      Не возвращайся – где был рай когда-то.
      И брось дурить – иди туда, где не был»

      Доброго времени суток, товарищи! Я более чем уверен, что большинство из вас знакомы с такой вещицей, как ZX Spectrum. Как много теплых воспоминаний связано с этой чёрной коробочкой, начинённой различными микросхемами!

      В этом посту я поведаю о том, как использовать и настраивать эмулятор Fuse под линуксом, а также расскажу, как написать простейшую программу в машинных кодах под ZX Spectrum и запустить её в эмуляторе.

      На сладкое — я познакомлю вас с миром демосцены, в котором каждый найдёт себе место под солнцем и сможет как почерпнуть для себя новых знаний, так и просто насладиться уютом, теплотой и ламповостью сего места.

      Elite, Exolon, Spellbound, Dizzy — если эти слова вам о чём-либо говорят, то милости прошу под кат!

      image

      Предисловие

      Для начала хотелось бы познакомить вас с самим спектрумом. Если вам не шибко повезло и вы не застали его в живую, то рекомендую к прочтению текст ниже, ибо в противном случае дальнейшее чтение статьи будет попросту бессмысленно.

      ZX Spectrum — это такой бытовой компьютер, выпуск которого пришёлся на 1982 год. Он пользовался большой популярностью в те времена и чего мелочиться — именно с этого компьютера началась эра персональных компьютеров.

      image

      ZX Spectrum был (и остаётся до сих пор ) восьмибитным, всего было выпущено четыре официальных модели — ZX Spectrum 16K/48K, ZX Spectrum+, ZX Spectrum 128, имеющие, соответственно, 16, 48 и 128к оперативной памяти. Отнюдь, сейчас существуют клоны спектрума, имеющие различные характеристики, пентева, к примеру.

      Знакомимся с Fuse

      Fuse, как вы могли догадаться ранее — это эмулятор спектрума, поддерживаемый во многих операционных системах, начиная от линукса и заканчивая вендой.

      Давайте соберём его и немедля приступим к изучению нутра этой вещицы.
      Сразу оговорюсь, если вы используете Ubuntu, то вам будет достаточно выполнить следующую команду:

      sudo apt-get install fuse

      Ну а чтобы собрать исходники этого эмулятора, нам потребуется:

      1. Скачать сам эмулятор — бдыщ;
      2. В папке проекта выполняем —

      ./configure make install

      3. Слышим истошные крики о том, что нам не хватает библиотеки «libspectrum» —

      checking libspectrum.h usability. no
      checking libspectrum.h presence. no
      checking for libspectrum.h. no
      configure: error: Sorry — I need libspectrum to be available

      К всеобщему счастью, проблема решается довольно легко — достаточно проследовать по ссылке и установить недостающую библиотеку, после чего заново запустить ./configure.
      4. После проделанных операций вы можете смело запускать fuse. Voila!

      Настраиваем Fuse

      Пришло время настроить наш свежескомпиленный эмулятор, но перед этим рекомендую загрузить пак rom-ов и поместить его в папку, из коей впредь будут запускаться программы для спектрума.

      Запускаем Fuse, заходим в меню Options -> Filter и ставим галочку напротив пункта «Double size» —

      Вот это

      image

      Если вы хотите, чтобы образы .TAP и .TRD считывались мгновенно и ручками ничего не приходилось делать, то рекомендую не трогать настройки и оставить всё, как есть, ну а ежели вы хотите вспомнить былое и максимально окунуться в прошлое, то выставьте настройки, которые спрятаны под спойлером.

      Скучное название спойлера
      Options -> Sound:

      image

      image

      После того, как вы успешно проделали махинации с Fuse, можете смело запускать вашу любимую игру, прежде найдя её на www.worldofspectrum.org. Если решились использовать sdl-версию, запустите образ из консоли, используя
      fuse .tap

      После выполнения команды выше вы увидите серый экран, на котором либо будет меню, либо, соответственно, не будет. В первом случае вам нужно нажать «Enter», после чего запустить кассету (F8), а во втором — нажмите следующие клавиши — «J, Ctrl+P, Ctrl+P, Enter», после, опять же, F8.

      image

      Отлично! Во время загрузки вы услышите тот самый звук, который, возможно, станет проводником в ваше детство.
      Что же, самое время найти парочку старых игр и насладиться их прохождением! Несколько томительных минут ожидания и уже никто не в силах оторвать вас от этой замечательной вещицы .

      Пишем простую программу под ZX Spectrum

      Пришло время развеять завесу тайны и узнать, что же действительно представляет из себя ZX Spectrum. Наша программа будет просто выводить текст “Wct One Love” на экран, после чего передавать управление спеку.

      image

      image

      Использовать мы, разумеется, будем Wct, что и следовало ожидать от меня — это такая hex-подобная система счисления со своим компилятором и прочими фишками. Отличается от хексов тем, что состоит только из букв, а последние две поменялись местами. Одним словом — сумасброд, но я использую его на протяжении длительного времени и уже привык и полюбил его. Не серчайте, я понимаю, что некоторых это порядком достало . Если обобщить, то Wct представляет из себя не более, чем обычную игрушку. Не будем тянуть кота за хвост — приступим к написанию самого кода.

      А вот так выглядит Wct
      A B C D E F G H I J K L M N P O

      Чтобы понимать, что мы делаем, будем использовать таблицу, в которой можно найти соответствующий код для каждой мнемоники.

      Первым делом нам нужно поместить в регистр «A» число Cw (в десятичной системе счисления — 2). Для выполнения многих команд обрабатываемые данные должны быть занесены в регистр «A», прежде чем будут выполняться следующие действия.

      Dp AC // В регистр «A» помещаем число Cw

      После же нам надо вызвать функцию печати символа — «BG AB».
      Так реализуем же это посредством использования команды «Mn». Следует обратить внимание на то, в каком порядке идут байты. В данном случае это Big Endian, то бишь порядок «от старшего к младшему» из байтов.

      Mn ab bg // Вызываем функцию печати символа — «BG AB».

      Пришло время упомянуть регистры спектрума. Микропроцессор Z80, в отличие от 18080, работает с двумя наборами регистров — основным и альтернативным, Оба набора состоят из семи 8-разрядных регистров данных и флагового регистра. Регистры основного набора обозначаются буквами А, В, С, D, Е, Н, L и F (флаговый).

      Регистры альтернативного набора соответственно — А’, В'( С, Dr, Е Hr, L’ и F). Для пользователя эти наборы совершенно идентичны, и знак’ (апостроф) означает лишь то, что в данный момент регистр не является активным.

      Команды, обрабатывающие 16-разрядные числа, используют пары регистров в следующих сочетаниях: ВС, DE, HL, AF и, соответственно, ВС, DE HL AF’. При этом в регистры В, D, Н, А, В’, D’, Н А’ записывается старший байт числа, а в С, Е, L, F, С, Е L’ и F’ — младший. Спаренные регистры можно использовать, например, для хранения и обработки адресов ячеек памяти.

      Нам же надо загрузить в пару HL адрес нашей строки, которая располагается по адресу IABAw с использованием команды Cb.

      Cb ba ia // Загружаем в HL строку по адресу // IABA, и начинаем обрабатывать текст, // который мы получили из этой строки

      Теперь нам надо загрузить адрес, который мы запихнули в HL, в регистр A, соответственно, использовать мы будем команду Hp —

      Hp // Загрузка адреса из HL в регистр «А»

      Теперь нам нужно проверить, не закончилась ли строка. В противном случае нам нужно будет вернуть управление спектруму, а ежели в памяти всё ещё остались символы, то мы проверим это с использованием команды Op, где операндом будет AAw, то бишь «0».

      Если же строка закончилась, то выполним команду прерывания процесса — Mi.

      Op AA // Проверяем, не закончилась ли строка. // Если закончилась, то переходим к выполнению // следующей команды. Mi // Если строка закончилась, то передаём // управление спеку.

      Следующие три команды должны выполнить чтение по адресу IABAw, увеличить текущее значение в регистре HL на единицу и совершить цикл.

      Nh // Выполняем функцию чтения — BA. Cd // Увеличиваем регистр «HL» на единицу // и продолжаем выполнение программы. Bi OI // Цикл. Переходим на метку, выполняем «Cb ba ia»

      Теперь мы должны разместить непосредственно наш текст. Его можно записать двумя способами — либо разместив в кавычках, либо же предварительно переведя его в набор байтов. Чтобы осуществить перевод текста вручную, воспользуемся таблицей по адресу wctsite.tk/table.
      «Wct One Love» или же «FH GD HE CA EO GP GF CA EM GO HG GF».

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

      An AA // Конец.

      Чудно! Мы завершили написание нашей первой программы под спектрум, давайте взглянем на полный код:

      /* ZX-Spectrum Example Coded in Wct */ Dp AC // Помещаем в регистр «А» число C (2); Mn ab bg // Вызываем функцию печати символа — BG AB. // Заметьте, что после команды операнды // идут в обратном порядке, тобишь от // последнего и до первого. Cb ba ia // Загружаем в HL строку по адресу ───────┼───────┐ // │ │ Hp // Загрузка адреса из HL в регистр «А» │ │ Op AA // Проверяем, не закончилась ли строка. │ │ // Если закончилась, то переходим к выполнению │ │ // следующей команды. │ │ // │ │ Mi // Если строка закончилась, то передаём │ │ // управление спеку. │ │ // │ │ Nh // Выполняем функцию чтения — BA. │ │ Cd // Увеличиваем регистр «HL» на единицу │ │ // и продолжаем выполнение программы. │ │ // │ │ Bi OI // Цикл.

      Переходим на метку. >───────┘ │ // │ «Wct One Love» // Наш текст

      Теперь пришло время разобраться со сборкой вышеприведённого кода. Для начала нам нужно собрать утилиту «bin2tap», которая позволит сконвертировать бинарник в образ кассеты, с которой будет считываться программа в спектрум. Достаточно скомпилировать файл raw.githubusercontent.com/Mihip/Wct/master/source/spectrum/bin2tap.c при помощи, допустим, GCC, и приступить к следующему шагу.

      image

      Чтобы собрать бинарник нам понадобится воспользоваться билдером. Вставьте туда код, скомпилируйте его и сохраните бинарник на вашем компьютере.

      Теперь нам нужно создать образ кассеты, для этого воспользуемся командой bin2tap -b name_of.bin с флагом «-b», который означает то, что также в образ будет включен бейсик код, который загрузит нашу программу в память спектрума самостоятельно.

      Всё готово, можно запускать программу ─

      image

      Отлично! Всё сработало. Поздравляю, вполне вероятно, что это ваша первая программа, написанная для спектрума!

      Знакомимся с демосценой

      Что же такое демосцена? Демосцена — это место, где каждый может проявить себя в лучшем свете. Демосцена — это раскрытие своих способностей, изучение новых платформ для написания демок. На самом деле я имею ввиду ретро демосцену, где зачастую используется как раз спектрум как платформа для написания дем. Что такое демо?

      Это программа, раскрывающая способности не только компьютера, но и автора.

      Демосцена — это своеобразное искусство. Имеет место и рассказать о демопати. Демопати — мероприятия, где демомейкеры встречаются и непосредственно демонстрируют свои навыки, а также демы, которые они создавали специально для пати. Отличие демопати от обычных фестивалей искусства состоит в том, что работы зачастую доделываются непосредственно на демопати, и это является частью процесса мероприятия. Кроме этого, крупнейшие демопати обычно проходят несколько дней (чаще всего — 3-4) и одновременно являются пристанищем демосценеров из разных стран (для этого есть специальные спальные места, где можно спать в спальном мешке).

      Из слов VBI:

      1:16:20 — vbi-: Демо — это обычно способ показать своё владение железом.
      1:16:29 — vbi-: Не важно, гитара это или комп.
      1:16:47 — vbi-: Это, возможно, демонстрация возможностей железа,
      1:16:59 — vbi-: то, что ты можешь из него достать.
      1:17:04 — vbi-: А вот хорошее демо —
      1:17:24 — vbi-: это такое, в котором используется непривычное использование железа,
      1:17:40 — vbi-: Либо же железо отрабатывает на все свои 100%.
      1:18:55 — vbi-: То есть демо обычно — это выход на уровень выше, чем, как казалось, позволяет железо.

      wbcbz7_k016> сцена — это когда ты пилишь проды, чтобы и себя показать, и на других посмотреть, и просто оттянутьсяотдохнутьнаучиться
      wbcbz7_k016> 🙂

      Если же моё определение вам не по душе, то ниже приведена цитата из википедии:

      image

      Демосце́на — киберкультура, зародившаяся в конце 1970-х годов вместе с распространением первых домашних компьютеров. Направление компьютерного искусства, главной особенностью которого является выстраивание сюжетного видеоряда, создаваемого в реальном времени компьютером, по принципу работы компьютерных игр. Таким образом, демо является симбиозом программирования и искусства.

      Моё любимое демо для спектрума — «Eager (to live)», автором которого является introspec (a.k.a spke).

      image

      Товарищи, присоединяйтесь к демосцене, творите чудеса и никогда не забывайте про спектрум !

      Послесловие

      Друзья, спасибо за то, что вы поддерживаете меня своими тёплыми комментариями и отзывами, я рад, что вам действительно интересны мои статьи и заметки. Хотелось бы верить в то, что ZX Spectrum навсегда останется в ваших сердцах и всегда будет дарить только хорошие воспоминания. Спасибо за то, что уделили время на прочтение этой статьи!

      image

      Использованная литература
      Приветы

      image

      Пользуясь случаем, хотелось бы передать привет моим знакомым из #z80 — Kakos_Nonos, Nuts, introspec, wbcbz7, organism, TSL, nyuk, jam, kowalski, g0blinish, vbi, zedOFF и всем, всем, всем, кого я забыл упомянуть .

      Ссылки

      wctportal.ru — портал, посвящённый Wct;
      wctsite.tk — официальный сайт, посвящённый Wct, домен так и не сменился;
      github.com/Mihip/Wct — репозиторий на гитхабе;
      zxpress.ru — материалы по ZX Spectrum;
      worldofspectrum.org — архив работ для ZX Spectrum.

      Источник: www.pvsm.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru