Comments 17
Пара мелочей:
"T" в RTI/RTS - не из "To", а из "ReTurn". Возвращают они не "в", а "из" того, что в третьей букве - "ReTurn from Interrupt"/"ReTurn from Subroutine".
секция векторов - не 3 байта, а 3 слова, указатели - 16-битные
Спасибо! На самом деле я пока сам больше использую переменные в zeropage, но так как zeropage не резиновая надо будет в некоторых участках использовать pha/pla ну или "TXA/PHA/TYA/PHA ..Какая то логика.. PLA/TAY/PLA/TAX ... продолжение логики". Так же сегодня столкнулся с тем что секция RODATA переполнена а значит пришло время использовать мапер пока выбрал MMC3. При этом я так понял он может вызывать прерывание irq по счетчику строк, во многих игр статус бар реализован как часть фона который не прокручивается. Данные карт и коллизий можно положит в переключаемую память PRG.
Я просто разбил код на подпрограммы которые не превышают данный лимит. У меня был к стати момент когда я этот лимит обходил конструкцией с несколькими JMP )) сначала JMP перескакивает метку в середине, и если надо в начало вернуться то делаем Branch на метку где был jmp в середине на начало ))) На самом деле не знаю про такой баг, знаю что сравнение с 0 и при декременте может не особо очевидно работать. Возможно это один и тот же баг.
Интересно, ни разу не встречал такого поведения, но зато постоянно с другим поведением кажущимся неправильным но когда углубляешься в флаги становится более понятно что к чему. В переключение nametable для коллизий сейчас проблема. Для первого к примеру можно сделать ADC $20 и это сработает с 20 - 23 младший байт. Но при определении что герой находиться на 2-й таблице вроде сделать бы ADC $24 и вот не могу никак найти как это сделать)) просто есть идея сэкономить и брать просто номер спрайта с таблице имён и по нему определять коллизии на фоновые платформы. Для первой таблице работает, для второй никак, там ещё особенности в адресации PPU могут вызывать как прокрутку так и может переключить nametable. Вот и не могу это победить никак)
нужно было вам статью писать (я серьезно). вы и русский язык в школе не прогуливали, в отличие от некоторых.
Полагаю, что это не баг, а умышленно реализованная особенность. Думаю, это сделано с целью увеличения быстродействия. Во всяком случае, в CMOS варианте чипа эту особенность убрали, что привело к увеличению времени выполнения команды на 1 такт. Изменение поведения некоторых команд в 65с02 (CMOS) по сравнению с 6502 (NMOS) можно рассматривать как работу над ошибками. Но нужно учесть, что 6502 работает на частотах в единицы МГц, а 65с02 хорошо себя чувствует на десятках МГц. Это позволило добавить сотню-другую транзисторов и без особого вреда для быстродействия получить более интуитивное поведение, в то время как разработчикам оригинального 6502 приходилось выгрызать каждый такт. Да и транзисторы стоили дороже.
Вообще косвенный JMP очень редко встречается в программах, далеко не в каждой найдётся, и даже если встречается, то один-два раза на многие килобайты кода - вряд ли один такт на такой редкой операции играл роль для быстродействия. Так что могли и просмотреть ошибку, или заметить, но (резонно) решить, что это не важно.
Программирование assembler 6502 nes/famicom/dendy векторы прерывания, процедуры и их вызов