2014-02-20 2 views
1

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

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

Благодарим за сотрудничество!

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

Machine Code: 

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

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

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 
+0

Комментарии играют важную роль в ассемблере. Каковы аргументы этого кода - какие данные предоставляются в том, какие регистры/местоположения и где возвращается результат? Guessing: Кажется, что A должно быть числом байтов (причем оба значения имеют одинаковую длину); B1 и B2 являются начальными адресами двух значений (сначала обозначается LSB), а z - выходной блок с одинаковой длиной. Правда? Если да, я не уверен, что понимаю жалобу. – keshlam

+0

Я не включил всю мою документацию; тупой ошибка. Ред. Пожалуйста, проверьте еще раз. – Surz

+0

По-прежнему пытаюсь понять жалобу - это было слишком долго, так как мой C64. Вы убедились, что бит переноса правильно передается из add to add? (И это ясно, прежде чем вы начнете процесс?) – keshlam

ответ

3

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

Вместо того, чтобы получить Commodore 64 из чердака и попробовать его, я использовал online virtual 6502 simulator. На этом сайте мы можем установить адрес памяти и загрузить значения байтов. Они даже ссылаются на страницу для сборки кодов операций. Поэтому, устанавливая ячейки памяти 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 
+0

Так извините, забыл принять ваш ответ! :) – Surz