Quantcast
Channel: vinxru
Viewing all articles
Browse latest Browse all 319

[Электроника] Через порт магнитофона SD контроллер рабоатет.

$
0
0
Все работает и на удивление быстро.

Сразу после сброса контроллер выдает в порт магнитофона программу размером 98 байт (+33 байта заголовок). По расчетам это занимает 0,75 сек, хотя кажется, что быстрее.

Ну а дальше загрузка происходит через параллельный порт со скоростью 40 Кб/сек. (В теории, можно поднять до 150 Кб/сек, сделав аппаратное формирование тактового сигнала)

Я сделал включение-выключение эмулятора магнитофона в виде перемычки на печатной плате.



И еще интересный момент. Для загрузки через порт магнитофона, мне пришлось посчитать контрольную сумму программы. Если контрольная сумма не сойдется, то программа не запустится.

Казалось бы, контрольная сумма - это просто сумма всех чисел программа. Но эта сумма не сошлась с той, что выдавал компьютер. Я посмотрел на программу расчета суммы из ПЗУ (на машинный код) и сразу заметил ошибку. Забыли адрес увеличить. А потом забыли про переполнение.

; HL - откуда считать
; DE - до куда считать

ROM:CC89                 lxi     b, 0
ROM:CC8C loc_CC8C:       mov     a, m
ROM:CC8D                 add     c
ROM:CC8E                 mov     c, a
                                              ; xra  a; adc  b; mov  b, a
ROM:CC8F                 push    psw          ; -
ROM:CC90                 call    cmp_hl_de    ; call cmp_hl_de_inx_h
ROM:CC93                 jz      loc_CCAB     ; -
ROM:CC96                 pop     psw          ; -
ROM:CC97                 mov     a, b
ROM:CC98                 adc     m            ; add  m
ROM:CC99                 mov     b, a
ROM:CC9A                 call    cmp_hl_de_inx_h
ROM:CC9D                 jmp     loc_CC8C

-----------------------------------------------------

ROM:CCA0 cmp_hl_de_inx_h:call    cmp_hl_de
ROM:CCA3                 jnz     loc_CCA9

; Дальше код никогда не выполнится

ROM:CCA6                 inx     sp
ROM:CCA7                 inx     sp
ROM:CCA8                 ret

-----------------------------------------------------

ROM:CCA9 loc_CCA9:       inx     h
ROM:CCAA                 ret

-----------------------------------------------------

ROM:CCAB loc_CCAB:       pop     psw          ; -
ROM:CCAC                 ret                  ; -


Вот аналог на Си, если кто то не понял.
short calcCrc(unsigned char* buf, int len) {
  short crc = 0;

  // Все байты кроме последнего считаются так
  for(int i=0; i<len-1; i++)
    crc += data[i] + (data[i] << 8);

  // Последний байт так (crc += data[len-1], но без переноса переполнения в старший байт)
  crc = (crc & 0xFF00) | ((crc + data[len-1]) & 0x00FF);

  return crc;
} 


Да, боян.

Это кстати не самая страшная ошибка. Просто нестандартная контрольная сумма. В одном из советских компов вообще было:

short calcCrc(unsigned char* buf, int len) {
  return rand();
} 



Viewing all articles
Browse latest Browse all 319

Trending Articles