Компиляция простой программы с использованием ca65

Я начинаю изучать сборку 6502, используя книгу Родни Закса «Программирование 6502». В ней есть пример кода, я хотел бы иметь возможность запускать его на своем macbook. Я надеюсь, что код сможет работать в том виде, в котором он представлен в книге, но я не уверен.

Я скачал ассемблер ca65, но столкнулся с проблемой. Команда ca65 3_1.as работает, но после нее с ld65 -o example 3_1.o (что я считал правильным) возникла ошибка: ld65: Error: Memory configuration missing

Код из файла 3_1.as ниже.

Может кто подскажет как решить мою проблему?

(В качестве небольшого побочного вопроса: на данный момент я предполагаю, что 100 и 200 долларов на самом деле не содержат никаких значений, поэтому фактическое добавление не будет выполнено, даже если программа сможет работать, это правильно?)

CLC      ; CLEAR CARRY BIT
CLD      ; CLEAR DECIMAL BIT

ADR1 = $100 ; WHERE IN MEMORY ARE THESE THINGS
ADR2 = $200
ADR3 = $300 

LDA ADR1 ; LOAD CONTENTS OF ADR1 INTO ACCUMULATOR
ADC ADR2 ; ADD CONTENTS OF ADR2 INTO ACCUMULATOR 
STA ADR3 ; TRANSFER CONTENT OF ACC TO ADR3

person Andrew    schedule 28.07.2019    source источник
comment
Это похоже на проблему установки. Что касается добавления, что-то все еще находится в этих ячейках памяти, и процессор добавит их просто отлично, даже если вы не знаете, какими будут входные данные и, следовательно, выходные данные.   -  person Jester    schedule 28.07.2019
comment
Я попытался удалить, а затем снова установить, но мне не повезло. Добавив в него файл конфигурации с адресами памяти, мне удалось устранить ошибку. Однако теперь я получаю новую ошибку: ошибка формата exec. В качестве обходного пути я немного изменил код и теперь использую github.com/skilldrick/6502js для скомпилировать и запустить его   -  person Andrew    schedule 28.07.2019
comment
на данный момент я предполагаю, что 100 и 200 долларов на самом деле не содержат никаких значений - память и регистры всегда содержат значение. Состояние регистров и памяти при включении или запуске программы может ничем не гарантироваться, но загрузка с этого адреса получит значение. (Даже если к вашему 6502 подключено не так много ОЗУ, я думаю, что он будет считывать какое-то значение после помещения адреса в адресную шину. Моделируемый 6502 может просто считывать нули.)   -  person Peter Cordes    schedule 29.07.2019


Ответы (2)


Чтобы исправить ошибку компоновщика, вам необходимо указать целевую систему. который обеспечит конфигурацию памяти.

Например, немного глупо, что это не значение по умолчанию:

ld65 -t none -o example 3_1.o

Обратите внимание, что вы также можете собрать и связать с помощью одной команды. См. мой ответ здесь.

person Nick Westgate    schedule 28.07.2019
comment
спасибо, ник, странно, что не по умолчанию. Теперь я могу заставить его скомпилировать, но я получаю ошибку формата exec error: ./example, когда я пытаюсь запустить его - нужна ли мне сейчас другая программа для этого? - person Andrew; 29.07.2019
comment
Правильно, ваш Mac не может запустить двоичный файл 6502. Вам нужно будет использовать эмулятор (например, Apple II или C64) и использовать его для запуска выходного файла. Другой ответ, на который я ссылался, создает объект C64. Не забудьте выбрать правильную цель с помощью -t, и вам может потребоваться указать начальный адрес в коде с .org. - person Nick Westgate; 30.07.2019
comment
хорошо, я посмотрю на это, спасибо. Последнее, простите. Итак, моя программа добавит содержимое ADR1 и 2, а затем переместит его в ADR3. Есть ли тогда быстрый и простой способ запросить ADR3, чтобы увидеть его содержимое, чтобы убедиться, что он дал правильный ответ? Или это невозможно при сохранении простоты программ? - person Andrew; 30.07.2019
comment
Как это сделать зависит от платформы. Например, на Apple II вы можете добавить (сначала опционально LDA ADR3, хотя в вашем случае это не требуется, поскольку ADR3 уже находится в A, затем) JSR $FDDA в конце вашего кода. Это вызывает процедуру ПЗУ, которая печатает содержимое A в виде шестнадцатеричных цифр на текстовом экране. Или после запуска вашего кода в BASIC вы должны использовать PRINT PEEK (768) для печати ADR3 в десятичном формате. Для платформы C64 вам придется исследовать, как сделать что-то подобное. - person Nick Westgate; 31.07.2019
comment
это очень полезная информация, я обнаружил, что, хотя в Интернете есть много отличных ресурсов, чтобы объяснить, как написать 6502 asm, иногда не ясно, как запустить его и увидеть результаты, если вы начинаете как абсолютный новичок. Думаю, я установлю эмулятор Apple II и попробую то, что вы предложили, спасибо. Какая связь между ADR3 и (768)? - person Andrew; 31.07.2019
comment
Десятичное число 768 = $300 в шестнадцатеричном формате, адрес ADR3. Если я ответил на ваш вопрос, пожалуйста, примите его. - person Nick Westgate; 31.07.2019

Вот более полная программа, чтобы добавить к уже хорошим ответам. Я заметил, что автор не указал место для запуска программы. Различные типы ассемблеров имеют небольшие особенности в отношении того, как они обрабатывают синтаксис, например оператор ORG. Некоторые из них имеют ".Org", что означает запуск программы здесь и сборка пути в памяти. "*=" также может означать одно и то же (иногда работают оба). Эта программа должна работать на commodore 64. С несколькими настройками она может работать и на Apple ][ (измените charout на ffda и начальное местоположение). Я определенно рекомендую C64 для роста кодирования, поскольку у него гораздо больше интересных аппаратных возможностей. Он также имеет огромную глобальную сцену кодирования. Вот ссылка на большое количество дисковых журналов и руководств по машинному обучению, которые выходят за рамки основ. Кажется, ни одна книга не делает этого и, как правило, придерживается только синтаксических подходов. Что далеко не полезно, если вы хотите сделать что-то большое с такими вещами, как диспетчерские пункты и компоненты самолетов.

https://csdb.dk/release/?id=8717

.ORG = 080D ; 
CLC      ; CLEAR CARRY BIT
CLD      ; CLEAR DECIMAL BIT
LDA #$94 ; load accumulator with 94
STA ADR1 ; move 94 into adr1 (both combined is adr1 = 94)
LDA #$32 ; load accumulator with 32
STA ADR2 ; move 32(in Acc.) into adr1 (both lines is adr2 = Acc, or adr2 = 32)

LDA ADR1 ; LOAD CONTENTS OF ADR1 INTO ACCUMULATOR
ADC ADR2 ; ADD CONTENTS OF ADR2 INTO ACCUMULATOR 
STA ADR3 ; TRANSFER CONTENT OF ACC TO ADR3
JSR CHAROUT; print the result

RTS ; return from the program

; declarations can be in confusing places and still work.
; I just saw a program where the declarations were after the code
; and before the subroutines.
;-------------------------------------------
ADR1 = $100 ; WHERE IN MEMORY ARE THESE THINGS
ADR2 = $200
ADR3 = $300 
CHAROUT = $ffd2 ; character out routine commodore 64. (prints a byte to screen)
person forbidden64    schedule 14.04.2020