Общее описание проекта
Ошибки ZX-80 BIOS
В процессе изучения ZX-80 BIOS я обнаружил несколько мелких багов:
1) Ошибка команды REM. Адрес подпрограммы REM должен быть L0849, а не L084A. В результате этой ошибки выполнение REM без параметров (без текста) не приведет к выполнению следующей строки.
2) Ошибка в подпрограмме ED-EDIT – приведенные ниже инструкции должны идти в обратном порядке. Данная ошибка может привести к сбою системы, если выполнить команду при заполненной памяти:
JR NC,L03A7 ; если недостаточно места для заполнения ;строки редактирования, возвращение к ED-COPY POP HL ; восстановление позиции программы
3) еще одна ошибка, которую заметить сложнее, представляет риск при изменении компиляции. В начале подпрограммы L03CB ED-EDIT отсутствует инициализация регистра B на значение, представляющее количество строк для вывода (требуется значение 2 или больше). В этот момент регистр B содержит значение 3 (полученное из адреса L03CB), что вполне удовлетворительно, но переклмпиляция из другого адреса может привести к прекращению вывода программы. Хотя я допускаю, что автор намеренно опустил здесь эту инструкцию в качестве элемента оптимизации.
Электрическая схема
Сборка
Программирование и запуск
Установите FUSE-биты следующим образом:
ATmega8: нижний 0xEF (по умолчанию 0xE1), верхний 0xC7 (по умолчанию 0xD9); ATmega88: нижний 0xF7 (по умолчанию 0x62), верхний 0xD7 (по умолчанию 0xDF), расширенный 0xFF (по умолчанию 0xF9); ATmega168: нижний 0xF7 (по умолчанию 0x62), верхний 0xD7 (по умолчанию 0xDF), расширенный 0xFF (по умолчанию 0xF9); ATmega328: нижний 0xF7 (по умолчанию 0x62), верхний 0xD7 (по умолчанию 0xD9), расширенный 0xFF (по умолчанию 0xFF).
Это делается для отображения загрузчика в наименьший размер памяти (необходимый для записи во внутреннюю флэш-память), защиты внутренней EEPROM во время программирования и увеличения скорости внешнего тактового генератора.
Если вы подключите VGA-монитор после программирования процессора, то должны увидеть простой белый экран с курсором “K” в нижнем левом углу. Если этого не произойдет, то, возможно, режим VGA не выбран. Для переключения режима нужно будет включить питание, зажав одну из клавиш от 1 до 4:
1 + включение питания: старый VGA-монитор (использует сигнал VSYNC); 2 + включение питания: новый VGA-монитор (использует комбинированную синхронизацию CSYNC); 3 + включение питания: режим NTSC TV (вывод через коннектор Cinch); 4 + включение питания: режим PAL TV (вывод через коннектор Cinch).
Выбранная конфигурация сохраняется в последнем байте EEPROM для дальнейшего использования. Если режим видео переключить не получается, это может говорить о коротком замыкании одной из кнопок.
Имейте ввиду, что нельзя использовать описанный выше способ для установки видеорежима на процессоре с помощью утилиты копирования. Это приведет к незапланированной активации программирования внешней EEPROM.
Проверить работоспособность процессора можно без подключения дисплея. Для этого нужно вставить в разъем VGA светодиод между контактами 14 (плюс, длинный) и 10 (короткий минус, короткий). Если вы включаете режим видео 1 (для старого монитора), то светодиод загорится (сигнал VSYNC активен). На включение других режимов он не отреагирует. В качестве альтернативы можете вставить светодиод в Cinch-разъем (плюс в центральное отверстие, минус к экрану) – в процессе генерации изображения светодиод будет гореть.
Программирование EEPROM
Загрузка программ в EEPROM
Копирование программ между EEPROM
Тот же пакет утилит содержит средства для скачивания или копирования программ из внешней EEPROM. Чтобы выполнить копирование из одной EEPROM в другую, следуйте описанной ниже процедуре.
Загрузите из каталога ATX80_Copy соответствующую программу в процессор. Мигающий светодиод будет сигнализировать о режиме готовности процессора. Нажмите одну из клавиш от 1 до 3. Светодиод загорится постоянно, указывая на выполнение операции, в результате которой программы из EEPROM будут скачаны во внутреннюю флэш-память процессора. Выбранная клавиша определяет скачиваемые слоты: 1 выбирает слоты с 1 по 11, 2 выбирает слоты с 12 по 22, а 3 выбирает слоты с 23 по 32.
В теории ATmega8 не способен вместить 11 слотов – это бы означало 11Кб памяти при имеющихся у этой модели 8Кб. Если в некоторых случаях программы входить не будут, то вам потребуется использовать более вместительный процессор или скорректировать количество слотов в исходном коде программы копирования.
После загрузки программ в процессор выключите питание, замените модуль EEPROM и снова его включите. Нажмите 4 для сохранения загруженных программ из флэш-памяти в новую внешнюю EEPROM. Все находящиеся в памяти программы сохраняются в те же слоты, из которых копировались.
Скачивание программ из EEPROM
Вы также можете скачивать программы на ваш ПК с помощью утилит. Для начала, как и в прошлом случае, нужно загрузить подходящий набор программ во флэш-память процессора, используя клавиши 1-3. Далее подключите программатор ЦПУ и скачайте содержимое флэш-памяти в каталог ATX80_Copy в файлы 1.bin и 3.bin. В каталоге ATX80_Export запустите командный файл !.bat. Так вы экспортируете программы из скачанных образов флэш-памяти в текстовые файлы Programs_1.txt, Programs_2.txt и Programs_3.txt, находящиеся в базовом каталоге утилит.
Содержимое этих файлов можно отредактировать в текстовом виде. В начале кода каждой программы прописана метка Slot x, сообщающая, к какому слоту она принадлежит. Эта метка указывает начало программы для дальнейшей обработки. Все последующие строки, начинающиеся с числа, обрабатываются как строки программы. Эти строки могут сопровождаться инструкциями LET или DIM, содержащими заполнение для численных или текстовых переменных.
Если вы хотите загрузить программы в текстовом виде обратно в EEPROM, то запустите файл !.bat в каталоге ATX80_Import. Это обеспечит импорт всех текстовых форм программ обратно в образы программы копирования. Далее вам останется лишь загрузить эти программы в процессор и нажать 4, чтобы сохранить их во внешней EEPROM аналогично тому, как это описывалось в начале текущего раздела.
Описание ATX-80 BASIC
Basic на ATX-80 почти полностью идентичен Basic с ZX-80, за исключением нескольких небольших отличий.
Номер строки программы может простираться от 1 до 9999. После каждого изменения в строках программы во внутренней EEPROM автоматически создается ее резервная копия. Емкость этой EEPROM составляет всего 510 байт, поэтому целиком программы в нее вмещаются не всегда. При включении ATX-80 программа, сохраненная во внутренней памяти, восстанавливается.
Basic на ATX-80 работает с целыми числами в диапазоне от -32768 до +32767.
Типы переменных:
целочисленная переменная с произвольно длинным именем (начинается с буквы, которая может сопровождаться буквами или цифрами); целочисленная переменная со всего одной буквой может использоваться в качестве параметра цикла FOR; текстовая переменная – 1 буква, сопровождаемая $. Текст может иметь любую длину; массив представляется одной буквой и ограничен размером в 255 элементов.
Операции
+ — … сумма и разность; * /… умножение и деление (только для целых чисел); AND… побитовое логическое произведение; OR… побитовая логическая сумма; NOT… побитовое логическое «не»; **… степень =… проверка равенства чисел или текстов; <… сравнение чисел и текстов с меньшим; >… сравнение чисел и текстов с большим.
Команды
Могут идти только в начале строки или после THEN и вызываются нажатием соответствующей кнопки:
LIST … (A) вывод листинга программы с заданной строки. Если номер строки не указывать, выводится листинг всей программы; RETURN … (B) возвращение из процедуры; CLS ...(С) очистка экрана; DIM … (D) объявление массива. Массив должен начинаться с индекса 0 и может содержать до 255 элементов (например, при DIM A(255) в нем могут быть задействованы индексы от 0 до 255); SAVE … (E) сохранение программы и переменных в слот. Эта команда сопровождается номером слота внешней EEPROM от 1 до 32. Если число не указать или указать 0, программа и переменные сохранятся во внутренней флэш-памяти процессора. FOR … (F) цикл, сопровождаемый однобуквенной переменной с начальным значением, после которой идет TO с конечным значением; GO TO… (G) переход к указанной строке; POKE … (H) сохранение байта в RAM, сопровождаемое адресом содержимого этого байта. ATX-80 имитирует сохранение в адресах RAM идентично ZX-80; INPUT … (I) пользовательский ввод, сопровождаемый целевой численной или текстовой переменной; RANDOMISE … (J) инициализация генератора случайных чисел от указанного числа. Если ввести 0 или опустить параметр, инициализируется согласно счетчику фреймов; LET … (K) установка содержимого переменной; FAST … (L) установка ускоренного режима. Отображается только одна верхняя строка, и процессор ускоряется в 4 раза. Использовать можно только при выполнении программы; SLOW … (M) установка медленного режима. Отображается весь экран. Включается автоматически при выходе из программы. NEXT … (N) продолжение цикла для заданной переменной; PRINT … (O) вывод переменных или текста. Символ ; обеспечивает продолжение без пробела. Символ , выставляется после 8-символьных позиций табуляции; MEMORY … (P) вывод информации о памяти в байтах: размер программы, переменных, а также свободное пространство RAM; NEW … (Q) удаление программы и переменных; RUN ...® выполнение программы с заданной строки. Если номер строки не указать, программа выполняется с начала. В то же время происходит очистка переменных. STOP … (S) остановка программы. Для продолжения используется CONTINUE. CONTINUE … (T) возобновляет выполнение программы, остановленной командой STOP. IF … (U) условие. THEN сопровождается инструкцией, выполняемой при валидности условия или выражения (выражение считается валидным, если не является нулевым); GO SUB… (V) переход к процедуре. Из процедуры инструкция RETURN возвращает к строке, следующей за GO SUB. LOAD … (W) загрузка программы и переменных из слота. Эта команда сопровождается значением от 1 до 32 для внешней EEPROM. Если значение не ввести или ввести 0, программа и переменные будут загружены из внутренней флэш-памяти процессора; CLEAR … (X) очистка переменных; REM … (Y) комментарий.
Функции и прочие команды
функции необходимо прописывать, так как клавиатурных сокращений для них нет:
"… (Shift+Y) указывает начало и конец текста; THEN … (Shift+3) часть условия IF, указывающая команду, которая выполняется при валидности условия; TO … (Shift+4) часть цикла FOR, указывающая конечное значение переменной; ;… (Shift+Z) часть инструкции PRINT, продолжающая вывод с последней позиции; ,… (Shift+.) часть инструкции PRINT, продолжающая вывод из позиции в таблице; ( )… (Shift+I, Shift+O) скобки; PEEK … загружает содержимое памяти из адреса, указанного в скобках. ATX-80 имитирует адреса RAM идентично ZX-80, включая адрес шрифта в ROM. Содержимое указателей не имитируется, их необходимо вычислять повторно; CHR$… преобразует символьный код в текстовый символ; CODE … преобразует текстовый символ (первый символ текста) в численный код; RND … генератор случайных чисел. Генерирует число в диапазоне от 1 до заданного значения; TL$… возвращает текст без первого символа; USR … в ATX-80 не поддерживается; STR$… преобразует число в текст; ABS … абсолютное значение числа.
Примеры программ
Материалы для скачивания
Схема в Eagle Free ATX80_diagram.zip Графика ATX80_png.zip Исходный код (скомпилирован через WinAVR для ATmega8, ATmega88, ATmega168 и ATmega328) ATX80_src.zip Утилиты для загрузки и скачивания примеров программ в EEPROM, скомпилированы в MSVC 2005 ATX80_util.zip