Решить это можно очень просто. Надо обратиться к регистру памяти, в котором указано, какую линию экрана рисует компьютер. Спрайт можно двигать только в том случае, если видеочип уже полностью обновил экран и вернулся в нулевую строку. Делается это двумя строчками кода:
Заказал вот такую штуку для Commodore, и вроде как она ожидает меня в отделении почты.
И это очень полезная вещь. Сейчас у меня есть только кассетный магнитофон, с помощью которого я могу считывать программы на кассетах. Проблема в том, что на кассеты эти программы надо как-то записать. Для этого нужна кассетная дека или магнитофон с возможностью записи. Это все сложно и дорого.
И это очень полезная вещь. Сейчас у меня есть только кассетный магнитофон, с помощью которого я могу считывать программы на кассетах. Проблема в том, что на кассеты эти программы надо как-то записать. Для этого нужна кассетная дека или магнитофон с возможностью записи. Это все сложно и дорого.
А дисководы для дискет стоят от 8 тысяч рублей, и опять же, встает вопрос о том, как на эти дискеты записать программы.
Эта плата называется SD2IEC, и она эмулирует дисковод. В нее вставляется сд-карта с записанными программами, а Коммодор считывает их как с дискеты.
Но более подробно только вечером)
Эта плата называется SD2IEC, и она эмулирует дисковод. В нее вставляется сд-карта с записанными программами, а Коммодор считывает их как с дискеты.
Но более подробно только вечером)
👍4
Ассемблер продолжает меня вымучивать. Сегодня я наконец разобрался, как сложить два числа. И это оказалось не так просто.
Так как архитектура 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