Повторная попытка сложения N-байтовых целых чисел BASIC 6502?

Я сначала (попросил о помощи) и написал программу BASIC в эмуляторе домашних животных 6502, которая добавила два n-байтовых целых числа. Однако мой отзыв заключался в том, что он просто добавлял два 16-битных целых числа (не добавляя n-байтовые целые числа).

Может ли кто-нибудь помочь мне понять эту обратную связь, посмотрев на мой код, и указать мне правильное направление, чтобы сделать программу, которая складывает два целых числа n байт?

Спасибо за сотрудничество!

Документация: Складывает два n-байтовых целых числа, используя абсолютную индексированную адресацию. Сложения начинаются с ячеек памяти $0600, $0700, а ответ — $0800. Длина целых чисел в байтах составляет $0600 (¢ -> 256).

Machine Code:

18  a2  00  ac  00  06  bd  00
07  7d  00  08  9d  00  09  e8
00  88  00      d0

Коды операций, документация, переменные:

A1 = $0600
B1 = $0700
B2 = $0800
Z1 = $0900

[START] = $0500

            CLC                 18             // loads x with 0
            LDX                 A2  00     // loads length on Y                     
            LDY         A1      AC  00  06     // load first operand                    
loop:       LDA         B1, x   BD  00  07     // adds second operand       
            ADC         B2, x   7D  00  08     // store result  
            STA         Z1, x   9D  00  09     // go to next byte       
            INX                 E8  00     // count how many are left       
            DEY                 88  00         // do more if needed         
            BNE    loop         D0

person Surz    schedule 20.02.2014    source источник
comment
Комментарии необходимы в ассемблере. Каковы аргументы этого кода - какие данные предоставляются в каких регистрах/местоположениях и где возвращается результат? Угадывание: похоже, что A должно быть количеством байтов (оба значения имеют одинаковую длину); B1 и B2 — это начальные адреса двух значений (сначала выражен младший бит), а z — это выходной блок, имеющий одинаковую длину. Истинный? Если да, то я не уверен, что понимаю жалобу.   -  person keshlam    schedule 21.02.2014
comment
Я не включил всю свою документацию; глупая ошибка. Отредактировано. Пожалуйста, проверьте еще раз.   -  person Surz    schedule 21.02.2014
comment
Все еще пытаясь понять жалобу - прошло слишком много времени с моего C64 - Вы убедились, что бит переноса правильно распространяется от добавления к дополнению? (И что это понятно до начала процесса?)   -  person keshlam    schedule 21.02.2014
comment
Я так думаю, потому что думал, что АЦП правильно размещен в контуре.   -  person Surz    schedule 21.02.2014


Ответы (1)


Мне показалось, что ваш код делает то, что вы утверждаете - добавляет два N-байтовых операнда в порядке байтов с прямым порядком байтов. Я смутно помнил различные режимы адресации 6502 из моей бездарно потраченной юности, и код кажется хорошим. X используется для индексации текущего байта из двух чисел, Y является счетчиком длины операндов в байтах, и вы перебираете эти байты, хранящиеся по адресам 0x0700 и 0x0800, и записываете результат по адресу 0x0900.

Вместо того, чтобы достать Commodore 64 с чердака и попробовать его, я использовал онлайн-симулятор виртуального 6502. На этом сайте мы можем установить адрес памяти и загрузить значения байтов. Они даже ссылаются на страницу для сборки кодов операций. Таким образом, установив ячейки памяти 0x0600 на «04» и 0x0700 и 0x0800 на «04 03 02 01», мы должны увидеть, что этот код добавляет эти два 32-битных значения (0x01020304 + 0x01020304 == 0x02040608).

Пройдя код, щелкнув регистр ПК и установив его на 0x0500, а затем пройдя один шаг, мы видим, что в вашем машинном коде есть ошибка. После INX, который компилируется в E8, мы сталкиваемся с ложным значением 0x00 (BRK), которое завершается. Исправленный код, как показано ниже, выполняется до завершения, и ожидаемое значение видно при чтении памяти по адресу 0x0900.

0000        CLC             18
0001        LDX #$00        A2 00
0003        LDY $0600       AC 00 06
0006 LOOP:  LDA $0700,X     BD 00 07
0009        ADC $0800,X     7D 00 08
000C        STA $0900,X     9D 00 09
000F        INX             E8
0010        DEY             88
0011        BNE LOOP:       D0 F3

Дамп памяти:

:0900  08 06 04 02 00 00 00 00
:0908  00 00 00 00 00 00 00 00
person patthoyts    schedule 21.02.2014