Все работает и на удивление быстро.
Сразу после сброса контроллер выдает в порт магнитофона программу размером 98 байт (+33 байта заголовок). По расчетам это занимает 0,75 сек, хотя кажется, что быстрее.
Ну а дальше загрузка происходит через параллельный порт со скоростью 40 Кб/сек. (В теории, можно поднять до 150 Кб/сек, сделав аппаратное формирование тактового сигнала)
Я сделал включение-выключение эмулятора магнитофона в виде перемычки на печатной плате.
![]()
И еще интересный момент. Для загрузки через порт магнитофона, мне пришлось посчитать контрольную сумму программы. Если контрольная сумма не сойдется, то программа не запустится.
Казалось бы, контрольная сумма - это просто сумма всех чисел программа. Но эта сумма не сошлась с той, что выдавал компьютер. Я посмотрел на программу расчета суммы из ПЗУ (на машинный код) и сразу заметил ошибку. Забыли адрес увеличить. А потом забыли про переполнение.
Вот аналог на Си, если кто то не понял.
Да, боян.
Это кстати не самая страшная ошибка. Просто нестандартная контрольная сумма. В одном из советских компов вообще было:
Сразу после сброса контроллер выдает в порт магнитофона программу размером 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(); }