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

[Электроника] Эмулятор магнитофона

$
0
0
Эмулятор магнитофона заработал. (Теперь еще софт надо отладить.)

Долго думал, почему в Мониторе файл загружается, а сразу после включения компьютера (надпись ПРОГРАММА?) нет!?

Оказалось, я не сделал паузы между первым и вторым блоком данных.

...

Запись состоит из двух блоков: название программы и тело программы. Название программы содержит в начале байты D9,D9,D9. А тело программы в начале содержит адрес первого байта, адрес последнего байта. Потом идут данные и в конце 2 байта CRC.

Монитор сначала ждет название программы, а потом грузит тело. Всё как надо.

А начальный загрузчик ничего не знает о названии и сразу пытается грузить тело. Т.е. сначала грузит название как тело. Обычно это не страшно, загрузка происходит с адреса D9D9 (первые байты в названии), а это адрес ПЗУ (или вообще там ничего нет).

Потом, из за паузы в конце первого блока, загрузка программы обрывается и грузится настоящий блок данных. У меня паузы не было, второй блок воспринимался, как продолжение первого.

Я тут прикинул, если название будет D9, 82, 82, 00, то такая программа повиснет при загрузке сразу после старта. Поскольку такое название будет еще и корректным телом.

D9, D9, D9, D9, 82, 82, 00. Начало загрузки D9D9, конец загрузки D9D9, данные 82, контрольная сумма 0082. Если по адресу D9D9 не будет подключено устройств, то процессор прочитает оттуда 82. Контрольная сумма сойдется и программа запустится. И повиснет.

Раз такое дело, я убрал название программы совсем. Теперь с помощью команды I из Монитора эту программу не загрузить. Но зато в начальном загрузчике грузится будет быстрее.

Еще я уменьшил плот-тон до 32 байт, что бы загрузка происходил быстрее. Работает нормально. Я заметил только один глюк, и то в Мониторе. Если курсор стоит на последней строке экрана, то после вывода имени загружаемой программы, экран скроллится вверх. Это происходит дольше, чем длится мой пилот-тон и компьютер не успевает к загрузке программы. (Но этой проблемы нет, так как в мониторе теперь загрузить программу нельзя :)

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

#define TAPE               (PORTC.1)
#define TAPE_DELAY         (500000/1400) // 1400 бит/сек
#define TAPE_PILOT_SIZE    32

void tape(BYTE data) {
  BYTE i = 8;
  do {
    if(data & 0x80) {
      TAPE = 1; delay_us(TAPE_DELAY); // TAPE = const - это одна команда ассемблера,
      TAPE = 0; delay_us(TAPE_DELAY); // поэтому оптимальнее расписать программу.
    } else {
      TAPE = 0; delay_us(TAPE_DELAY);
      TAPE = 1; delay_us(TAPE_DELAY);    
    }
    data <<= 1;
  } while(--i);
}

BYTE tapeEmulator() {
  WORD i;
  BYTE* p;

  strcpyf(buf, "boot/boot.rks");
  if(fs_open()) return 1;

  if(fs_file.size < 7 || fs_file.size > BUF_SIZE) return 1;

  if(fs_read0(buf, (WORD)fs_file.size)) return 1;
  
  i = TAPE_PILOT_SIZE;
  do {
    tape(0);
  } while(--i);
        
  tape(0xE6);

  p = buf, i = (WORD)fs_file.size;
  do {
    tape(*p++);
  } while(--i);
    
  return 0;
}


Viewing all articles
Browse latest Browse all 319

Latest Images

Trending Articles