Ассемблер продолжает меня вымучивать. Сегодня я наконец разобрался, как сложить два числа. И это оказалось не так просто.
Так как архитектура Commodore 8-ми битная, то один регистр памяти может принимать значения от 0 до 255. И сложить, например, 10 и 50 не сложно. Надо воспользоваться следующими командами:
lda #10 // загружаем в регистр А значение 10
adc #50 // складываем с 60
sta result // помещаем новое значение в нужный регистр памяти.
Так как архитектура Commodore 8-ми битная, то один регистр памяти может принимать значения от 0 до 255. И сложить, например, 10 и 50 не сложно. Надо воспользоваться следующими командами:
lda #10 // загружаем в регистр А значение 10
adc #50 // складываем с 60
sta result // помещаем новое значение в нужный регистр памяти.
Но что, если надо сложить числа больше 255-ти. Например, 1024 и 306.
В этом случае эти числа 16-ти битные, и каждое число занимает уже не один байт памяти, а два (16-ти битные числа могут принимать значения от 0 до 65 535).
Число 1024 в шестнадцатеричной системе - это 0400, а 306 - 0132. В памяти компьютера они занимают по два байта: 00 04 в первом случае, и 32 01 во втором.
В этом случае эти числа 16-ти битные, и каждое число занимает уже не один байт памяти, а два (16-ти битные числа могут принимать значения от 0 до 65 535).
Число 1024 в шестнадцатеричной системе - это 0400, а 306 - 0132. В памяти компьютера они занимают по два байта: 00 04 в первом случае, и 32 01 во втором.
Да, в Commodore 64 обратная запись, поэтому числа будут перевернуты.
И теперь осталось их сложить.
И теперь осталось их сложить.
Итак, первое число хранится в регистрах $fb-fc (00 40), а второе - в регистрах $fd-fe (32 01). Ради удобства я их обозвал в соответствии с назначением (low byte, то есть конец числа, и high byte, то есть начало).
В блоке init мы просто кладем в нужные регистры два слагаемых, здесь ничего интересного, и об этом я уже рассказывал.
А вот потом начинается магия.
В процессоре Commodore есть специальный регистр, который содержит разные флаги. Один из таких флагов называется Carry, и он переключается с 0 на 1, когда какое-нибудь значение после какой-либо операции перескочило 255. Этот флаг очень важен при сложении и вычитании.
В блоке init мы просто кладем в нужные регистры два слагаемых, здесь ничего интересного, и об этом я уже рассказывал.
А вот потом начинается магия.
В процессоре Commodore есть специальный регистр, который содержит разные флаги. Один из таких флагов называется Carry, и он переключается с 0 на 1, когда какое-нибудь значение после какой-либо операции перескочило 255. Этот флаг очень важен при сложении и вычитании.
Поэтому первым делом надо этот флаг очистить командой clc (clear carry).
Потом мы загружаем в регистр A вторую половину первого числа и прибавляем к ней вторую половину второго числа. Если эти два числа в сумме дают значение больше 255, то флаг carry становится равен единице, а регистр А перескакивает значение 255, обнуляется и к нулю добавляется недостающая разница, которую надо поместить в регистр результата (lda n1low, adc n2low, sta result).
Потом мы загружаем в регистр A вторую половину первого числа и прибавляем к ней вторую половину второго числа. Если эти два числа в сумме дают значение больше 255, то флаг carry становится равен единице, а регистр А перескакивает значение 255, обнуляется и к нулю добавляется недостающая разница, которую надо поместить в регистр результата (lda n1low, adc n2low, sta result).
Такую же операцию надо проделать со вторыми половинами чисел, при этом не надо забывать, что флаг carry включен, а команда adc помимо сложения, добавляет к результату значение carry (1 или 0), что увеличивает порядок второй половины числа. Второе значение кладем в регистр result+1.
Ну и надо вывести число на экран. Сперва загружаем его в регистры A и X, а потом вызываем встроенную команду, которая хранится в регистре $bdcd. Она конвертирует шестнадцатеричные числа в десятичные и выводит на экран.
1024 + 306 = 1330. Все получилось.
Ну и надо вывести число на экран. Сперва загружаем его в регистры A и X, а потом вызываем встроенную команду, которая хранится в регистре $bdcd. Она конвертирует шестнадцатеричные числа в десятичные и выводит на экран.
1024 + 306 = 1330. Все получилось.
Нашел на Ютубе офигенный канал, посвященный в основном Commodore, но и другие старые 8-ми битные компьютеры тоже мелькают.
Оказалось, что мужик не только офигенно рассказывает про программирование, но и на вопросы отвечает.
Причем ответ то совсем простым оказался, а я страдал несколько дней в поисках решения:)
Оказалось, что мужик не только офигенно рассказывает про программирование, но и на вопросы отвечает.
Причем ответ то совсем простым оказался, а я страдал несколько дней в поисках решения:)
🥰3
Немного про случайные числа.
Как известно, компьютеры по большей части не генерируют истинно случайные числа. Для генерации обычно пишут специальную функцию, которая берет за основу либо текущее время, либо какие-то другие непредсказуемые для пользователя значения из регистров памяти.
Вот и я столкнулся с такой проблемой. В Commodore Basic есть встроенная функция, которая генерирует случайные значения. Но проблема в том, что бейсик я отключил, чтобы осталось больше памяти для программы на ассемблере.
Поэтому на помощь, как ни странно, пришел звуковой чип 🎚
Как известно, компьютеры по большей части не генерируют истинно случайные числа. Для генерации обычно пишут специальную функцию, которая берет за основу либо текущее время, либо какие-то другие непредсказуемые для пользователя значения из регистров памяти.
Вот и я столкнулся с такой проблемой. В Commodore Basic есть встроенная функция, которая генерирует случайные значения. Но проблема в том, что бейсик я отключил, чтобы осталось больше памяти для программы на ассемблере.
Поэтому на помощь, как ни странно, пришел звуковой чип 🎚
Я не очень разбираюсь в звуке и музыке, поэтому напишу своими словами )
В звуковом чипе есть 3 дорожки, в каждую из которых можно записать последовательность нот. При этом можно изменить форму сигнала. Одна из форм сигнала - шум, и SID его генерирует случайным образом.
В общем, суть ясна. Мы включаем третью дорожку, дабы две другие остались для звуков и музыки. Накидываем на дорожку шум с максимальной частотой. А потом из специального регистра считываем случайное значение от 0 до 255.
В звуковом чипе есть 3 дорожки, в каждую из которых можно записать последовательность нот. При этом можно изменить форму сигнала. Одна из форм сигнала - шум, и SID его генерирует случайным образом.
В общем, суть ясна. Мы включаем третью дорожку, дабы две другие остались для звуков и музыки. Накидываем на дорожку шум с максимальной частотой. А потом из специального регистра считываем случайное значение от 0 до 255.
Потом полученное число можно модифицировать (например, если надо получить число от 0 до 31, то просто отсекаем 6-8 биты случайного числа побитовым И).
This media is not supported in your browser
VIEW IN TELEGRAM
И главный экран игры готов. На два вида машин ушло 8 изображений, так как они состоят из двух спрайтов (всего 64*8=512 байт), и разнонаправленные машины - это тоже разные изображения, а не отражения. При появлении новой машины меняется ее цвет на случайный (всего 7 цветов). Ну и направление движения тоже выбирается случайным образом.
👍2
Подошел только что ко мне коллега, которому уже лет под 70 наверное. Но он очень активный, активнее меня в 29. Тоже программист.
Говорит: нашел твою статью на DTF, классно пишешь)
Речь про это: https://dtf.ru/u/34713-aleksandr-logachev/1917240-commodore-64-issledovanie-dolin-pamyati.
Я, конечно, немного офигел от такого поворота событий, но было приятно☺️
Возникает вопрос: стоит ли поменять имя канала, прежде, чем на работе узнают, как он называется?)
Говорит: нашел твою статью на DTF, классно пишешь)
Речь про это: https://dtf.ru/u/34713-aleksandr-logachev/1917240-commodore-64-issledovanie-dolin-pamyati.
Я, конечно, немного офигел от такого поворота событий, но было приятно☺️
Возникает вопрос: стоит ли поменять имя канала, прежде, чем на работе узнают, как он называется?)
DTF
Commodore 64, или как я перестал бояться и полюбил оперативную память — Александр Логачев на DTF
Не так давно я приобрел Commodore 64. Он довольно долго стоял и пылился, ждал своего часа. И вот наконец-то я подключил к нему старенький ламповый монитор и купил аудиокассеты.
👍1