Перейти к содержанию

Быстрый старт

Соберём простую программу, которая выводит «Hello, World!» в терминал, и запустим её в эмуляторе.

1. Написать исходник

Создай файл hello.asm:

.ORG 0x00060000
.TEXT
main:
sign: .dw 0xB007AB1E                ; загрузочная сигнатура
stub: .dw 0x00000000                ; подпись диска

        LDI.DW SP, 0x00080000       ; указатель стека
        LDI.DW IX, msg              ; адрес строки
        CALL print_string
        HALT

print_string:
        LOD.B XL1, [IX]             ; читаем байт
        CMP.B XL1, 0                ; конец строки?
        JMP.EQ ps_done
        STR.B XL1, [0x00020018]     ; TERM_OUT
        INC IX
        JMA print_string
ps_done:
        RET

.DATA
msg:    .db "Hello, World!", 0

2. Собрать

Простейший вариант - сразу в плоский бинарник:

python CASM148.py hello.asm -o hello.bin

На выходе появятся два файла:

  • hello.bin - сырой бинарник (загружается в эмулятор или Logisim).
  • hello.hex - Logisim hex формата v2.0 raw.

Ассемблер выведет что-то вроде:

68 bytes collected

======================
 Labels
======================
MAIN         : 0x60000
SIGN         : 0x60000
STUB         : 0x60002
PRINT_STRING : 0x60018
PS_DONE      : 0x60035
MSG          : 0x60036

Sections: Text = 54; Data = 14; BSS = 0
Output: hello.bin and hello.hex

3. Запустить в эмуляторе

Эмулятор находится в emulator\dist\emulator.exe (Сборках пока что только под Windows), запустите его, в вкладке FILE выбираем пункт Open Disk Image... и выбираем наш hello.bin.

В окне эмулятора должен появиться терминал с надписью:

Hello, World!

4. Что произошло под капотом

  1. Программа загружена по адресу 0x00060000 - это начало региона USER RAM.
  2. main установил указатель стека, загрузил адрес строки в IX и вызвал print_string.
  3. print_string в цикле читает байт из памяти, проверяет на ноль и пишет в регистр TERM_OUT (0x00020018).
  4. Видеокарта по этому адресу выводит символ в терминал.
  5. Когда встречается \0, программа завершается через HALT.

5. Собрать по-взрослому (опционально)

Ту же программу можно собрать в объектный файл и слинковать:

python CASM148.py -c hello.asm -o hello.o
python LINK148.py hello.o -o hello.bin --entry main

Этот способ нужен, когда программа состоит из нескольких модулей и статических библиотек.

6. Выбор BIOS

BIOS-образы лежат в i80148\PC48\BIOS. В эмуляторе открой вкладку BIOS:

  • файлы группируются по моделям процессоров (имя подпапки: i80148, i8046, i148, i248, ...);
  • Rescan - перечитать папку после добавления файлов;
  • Current CPU only - показать только образы текущего процессора;
  • двойной клик по образу или кнопка Load selected BIOS - загрузить и запустить BIOS.

Поддерживаются только .bin-файлы. Структура папки описана в i80148\PC48\BIOS\README.md.

7. Сохранение последней конфигурации

При выходе эмулятор записывает последнюю конфигурацию в emulator.cfg рядом с emulator.exe:

  • модель процессора;
  • видеокарта;
  • последний BIOS;
  • объём RAM и VRAM;
  • образы дисков для каждого привода;
  • разрешение, масштаб и цветовая глубина;
  • режим скорости CPU.

При следующем запуске всё это восстанавливается автоматически. Параметры командной строки (--cpu, --vc, --bios, --ram, --vram) имеют приоритет над сохранёнными значениями.