(бухай): программируй
148 subscribers
465 photos
96 videos
3 files
65 links
Мысли, дегустация и код
Download Telegram
А вот с ассемблером все посложнее.
Вот полный код программы:
Теперь надо разобраться, что же здесь происходит.
Первая строка указывает на место в памяти компьютера, куда будет помещен код. В данном случае это байт 1000 в шестнадцатеричной или 4096 в десятичной.

В процессоре Commodore есть три регистра: A, X и Y, в которые можно помещать восьмибитные значения (от 0 до 255 в десятичной) или считывать их. Первым делом надо очистить регистр X командой ldx #0 (решетка указывает, что мы помещаем в регистр число, а не указатель на другой байт).

Потом мы вводим основной цикл программы "loop", который будет считывать текст и помещать его на экран. Значения этот цикл будет брать из другого лейбла "text". В лейбле "text" последнее значение будет равно нулю, чтобы программа могла понять, когда строка закончилась.
Итак, мы помещаем в регистр A значение из "text" со смещением X (по одной букве) (lda text,x). Потом сравниваем полученное значение с нулем (beq done).
Если значение равно нулю, то перемещаемся в лейбл "done" и командой rts (выход из программы) завершаем работу.
Если значение не равно нулю, то выводим на экран букву начиная с байта $0400 (или 1024 в десятичной) со смещением X (sta $0400,x). Именно с этого байта начинается экранная память Commodore.

После этого надо увеличить регистр X на 1 и вернуться в начало цикла (bne loop). За счет увеличения X и происходит смещение вправо по тексту.

И вот как-то так это можно изобразить.
Потом надо загрузить эту программу в компьютер и набрать SYS 4096 (начало в памяти, которое было указано в первой строке). И текст появится на экране.
Сам не понял, что понаписал...
А вообще это я к чему.

Надо учить ассемблер. Да, это не просто, но результат превосходит все ожидания. Приведу пример.

Я написал программу, которая в бейсике заняла всего одну строчку, а в ассемблере 21-у.
Эта программа просто заполняет экран кружочками. И сейчас я покажу, что вышло.
This media is not supported in your browser
VIEW IN TELEGRAM
А вот это ассемблер. Чуточку быстрее=)
И это я не говорю о том, что программа на бейсике весит 28 байт, а на ассемблере - 27, а работает в сотни раз быстрее⌨️
1
This media is not supported in your browser
VIEW IN TELEGRAM
2😁1
Тут даже комментировать нечего )
🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Я победил ограничение перемещения спрайтов в Commodore. Как я говорил в статье, движение спрайта по горизонтали ограничено 256 координатами, так как регистр памяти, отвечающий за это, может принимать только значения от 0 до 255. При этом, экран то у нас целых 320 пикселя в ширину.
Для этого разработчики придумали так называемый "старший бит" - это бит (для каждого спрайта свой) в отдельном регистре, который, если принимает значение 1, позволяет перемещать спрайт за пределы 255-ой координаты0️⃣0️⃣0️⃣0️⃣0️⃣0️⃣0️⃣1️⃣
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Но, программируя спрайты, да и вообще любую графику на этом компьютере, можно не учесть одну небольшую деталь, и получится примерно следующее
Это происходит, потому что в старые времена телевизоры выводили картинку на экран построчно, линия за линией. И видеочип Commodore следует этим правилам.
Проблема возникает, когда нужно переместить спрайт на экране, а линия, например, уже отрисовала половину изображения. Спрайт перемещается дальше, и отрисовка второй половины изображения происходит уже в другом месте.
Примерно так
Но так как видеочип в Commodore обновляет экран 60 (или 50, в зависимости от региона) раз в секунду, то каждая новая линия спрайта будет отрисована не в том месте, где надо. Из-за этого и возникает такой эффект
Решить это можно очень просто. Надо обратиться к регистру памяти, в котором указано, какую линию экрана рисует компьютер. Спрайт можно двигать только в том случае, если видеочип уже полностью обновил экран и вернулся в нулевую строку. Делается это двумя строчками кода:
Начинаем с лейбла loop. команда lda $d012 загружает из этого регистра номер текущей линии отрисовки. А команда bne loop сравнивает номер линии с нулем. Если номер больше нуля, то проверяем заново.
Покопавшись в старых запасах, обнаружил вот такое сокровище. Правда диск не в лучшем состоянии, надеюсь, что получится его запустить