Доброго времени суток коллеги! Непонятна инструкция в сабжевом контроллере jsr sub_B4B, x вроде аналог вызова call в Intel, но смущает , x. В мануале ничего про него не сказано, но такое чувство что это вызов со смещением... вот только относительно чего ? Может что просветит ?
Включил и напротив этой инструкции ничего (( sub_CFA: ; CODE XREF: ROM:0C34P ROM:0CFA ; ROM:0C3BP ... ROM:0CFA sta byte_BC ROM:0CFC stx byte_BD ROM:0CFE lda #$10 ROM:0D00 sta byte_C1 ROM:0D02 ROM:0D02 loc_D02: ; CODE XREF: sub_CFA+23j ROM:0D02 ldx byte_BC ROM:0D04 jsr byte_B4B, x <----- вот тут и непонятно ROM:0D07 ldx byte_BD ROM:0D09 lda word_D20, x ROM:0D0C bmi loc_D13 ROM:0D0E jsr sub_CDF ROM:0D11 ldx byte_BD ROM:0D13 ROM:0D13 loc_D13: ; CODE XREF: sub_CFA+12j ROM:0D13 ldx word_ADE, x ROM:0D16 jsr sub_9FC, x ROM:0D19 inc byte_BD ROM:0D1B dec byte_C1 ROM:0D1D bne loc_D02 ROM:0D1F rts ROM:0D1F ; End of function sub_CFA По адресу B4B находиться функция sub_B4B: ; DATA XREF: sub_CFA+Ao jsr sub_B67 lda byte_AE add #$99 sta byte_AE rts ; End of function sub_B4B
JSR(a,x); (a,x) - absoite Indxed Indirect Код (Text): Absolute Indexed Indirect -- (a,x) The second and third bytes of the instruction are added to the X Index Register to form a 16-bit pointer in Bank 0. The contents of this pointer are loaded in the Program Counter. The Program Bank Register is not changed. ____________________________ Instruction: | opcode | addrl | addrh | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | addrrh | addrl | + | | X Reg | ------------------------------- | 00 | address | Вообще, это от сеговского чипа, не думаю что есть отличие в этой инструкции.
twgt Да, я так и думаю, потому что сложив то что должно быть в Index Reg и адрес вызова, получился адрес по которому и начинается функция. Просто такой jsr со смещением встречается несколько раз и каждый раз ему предшествуют ldx с разными смещениями, я думаю это сделано для экономии места в ROM.
И еще вопрос что делает инструкция ? D9 0C D6 adc byte_CD6, x Первое что приходит в голову это прибавление к аккумулятору значения по адресу CD6 + carry flag + индексный регистр. Я прав ? И какой можно придумать аналог этой инструкции в x86 асме ?
DEADC0DE ну как бы (M) зависит от режима адресации. Если режим IX, IX1, IX2, Тогда используется индексный регистр. Как бы может стоит почитать даташиты, разобратся с режимами адресации, где и когда какие регистры юзаются?
n0name Ну вот, как раз, от адрессации\опкода это зависит. Если ты приводил псевдокод для опкода D9 то именно так, берётся значение.
n0name Не замечал такого раньше как-то - не часто включал комментирование кода для различных процессоров.