6510 Сборка с использованием CBM Studio - Граница страницы с ошибками ветвления
Когда я запускаю программу, граница страницы с ошибкой пересекается. Нигде в справке по приложению CBM prg studio для Windows 10 не объясняется, как я могу увеличить эту границу или что мне нужно сделать, чтобы избежать этих ошибок.
Это происходит по той же инструкции, основанной на Строках 110 и Строке 127 внутри меток E1cycle и E2cycle ...
**Line 110:** BEQ space2reset ; branch/jump if the result in A is 0
**Line 127:** BEQ space2reset ; branch/jump if the result in A is 0
The errors...
**Line 110**:Page boundary crossed. - F:\C64\UltimateTests\test.asm
**Line 127**:Page boundary crossed. - F:\C64\UltimateTests\test.asm
[Error] Line 72:Invalid branch (200 bytes) "BEQ Name2 ; if we find it we branch using BEQ to name2 for msg2 "
[Error] Line 143:Invalid branch (-275 bytes) "BEQ StartBlackOut"
Кроме того, как вы можете видеть выше, я получаю неверные ошибки ветки с этими странными (200 байтов) и (-275 байтов) - вот часть кода ...
getnameb
jsr $FF9F ;SCNKEY, place ASCII character into keyboard queue
jsr $FFE4 ;GETIN, this places the ASCII value into the Accumulator
BEQ getnameb ;loop until keys are pressed. (Branch if equal to zero)
JSR $FFD2 ; CHROUT, print it to the screen as it is being typed in.
CMP #13 ; CMP looks for the carrige return
BEQ Name2 ; if we find it we branch using BEQ to name2 for msg2
CMP #32 ; Looking for space bar. If true error 1 is returned
BEQ ErrorInput1
ldx $0900 ; load into x the value at $0900 - replace what was there from JSRs
STA $0019,x ; also store what is being typed in consecutively?
INX ; X IS INCREASED BY 1.
stx $0900 ; Store X back to $0900, avoid being molested by the above JSRs
; The value at $0900 is the length of the string!
LDA $0900 ; Load into A the current length of the string
CMP #08 ; Looking for max 8 chars. If true error 2 is returned
BEQ ErrorInput2
JMP getnameb ; if we don't we loop!
;PRINT ERRORS 1 OR 2
;-----1
ErrorInput1
LDX #00 ; load into the x registry zero
E1cycle
LDA E1msg,x ; load into A the E1msg, the x sequence.
CMP #00 ; compare memory and accumulator to the value 0?
BEQ space2reset ; branch/jump if the result in A is 0
STA 1424,x ; where on the screen does E1msg start?
INX ; inc x to move the print along 1 space?
JMP E1cycle ; jump back to the beginning of cycle and do it all again.
E1msg text 'ERROR: NO SPACES PERMITTED - SPACE TO RESET'
byte 0
;-----2
ErrorInput2
LDX #00 ; load into the x registry zero
E2cycle
LDA E2msg,x ; load into A the E1msg, the x sequence.
CMP #00 ; compare memory and accumulator to the value 0?
BEQ space2reset ; branch/jump if the result in A is 0
STA 1424,x ; where on the screen does E1msg start?
INX ; inc x to move the print along 1 space?
JMP E2cycle ; jump back to the beginning of cycle and do it all again.
E2msg text 'ERROR: MAX 8 CHARACTERS PERMITTED - SPACE TO RESET'
byte 0
space2reset
jsr $FF9F ;SCNKEY, place ASCII character into keyboard queue
jsr $FFE4 ;GETIN, this places the ASCII value into the Accumulator
BEQ space2reset ;loop until keys are pressed. (Branch if equal to zero)
CMP #32
BEQ StartBlackOut ; Go to the very beginning of the programming and reset the whole thing!
Мне нужно, чтобы это объяснили мне очень простыми словами, поскольку я все еще учусь, и иногда нахожу жаргон трудным для понимания. Спасибо!
2 ответа
Каждая инструкция занимает определенное количество байтов (см. Ссылку на каждую инструкцию, чтобы узнать о ней больше). Например, LDA nnnn занимает 3 байта. Таким образом, в случае использования относительного ветвления (beq, bcs, bcc и т. Д.) Вместо абсолютных переходов (jmp) счетчик программ (PC) может переходить только внутри страницы, т.е. в диапазоне от -128 до 127 байт. (со 128 байтов назад до 127 байтов вперед).
Чтобы исправить это, вы можете изменить это:
beq longShot
... // more than 127 bytes of code here...
longShot
в это:
bne +
jmp longShot
+
... // more than 127 bytes of code here...
longShot
Стоит отметить, что некоторые компиляторы сборки, например 64tass, поддерживают долгое ветвление. Он автоматически компилирует относительное ветвление в абсолютное, если оно выходит за пределы этого диапазона. Я не использую эту опцию, так как предпочитаю контролировать ее самостоятельно.
Когда я запускаю программу, граница страницы с ошибкой пересекается. Нигде в справке по приложению CBM prg studio для Windows 10 не объясняется, как я могу увеличить эту границу или что мне нужно сделать, чтобы избежать этих ошибок.
Увеличивать границу нельзя, это аппаратное ограничение. Вместо этого вы должны убедиться, что цель вашей условной ветки (то есть, куда она переходит) не слишком далеко от самой инструкции ветвления. Другими словами, инструкция перехода не может перейти к месту назначения, которое находится слишком далеко. (Слишком далеко означает, что расстояние между ними составляет 128 или более байтов).
Чтобы исправить это, можно перестроить код так, чтобы цели были ближе к инструкциям ветвления. Но в противном случае вы можете сделать это:
bne n
jmp where_you_want_to_go
n: ; label for the next instruction after the jump
вместо этого
beq where_you_want_to_go