Ассемблер для Intel 8080 на TypeScript

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Называется asm8 - https://github.com/begoon/asm8.

Причина написание: сборка Монитора Радио-86РК и игр, но без компиляции всякого раритета из 80-х на C, и чтобы прямо налету подкручивать функционал ассемблера.

Еще одна причина: чтоб работало в браузере и можно было встраивать, например, в эмулятор. Я это сделал в терминальной версии, что эмулятор налету загружет .asm файлы.

API для встраивания тривильный.

Макросов и локальных меток нет, но синтаксис выражений полноценный: операции, скобки, HIGH/LOW и многострочный формат типа:

Code: Select all

"push h / mvi c, 'a' / pop h
Тому, что придумал этот синтаксис для нескольких команд в одной строке -- уважение :-). Место экономит нереально.

Также есть именованные секции org и сборка сразу из нескольких файлов. Генерирует .lst и .map файлы, если надо.

npm:

Code: Select all

npm install asm8080
или

Code: Select all

npx asm8080 <source.asm> [more.asm ...]
bunx asm8080 <source.asm> [more.asm ...]
На оригинальность не претендую, но лично сам перепер все работы по РК, чтобы там ни было, на этот ассемблер.
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Добавил в asm8 локальные метки:

Code: Select all

label1:
...
@1:
  ...
@abc:
  ...
label2:
  ...
@1:
   ...
, что транслируется в

Code: Select all

label1:
...
label1@1:
  ...
label1@abc:
  ...
label2:
  ...
label2@1:
   ...
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Еще добавил спецзнак "$" в выражения - текущий адрес.

Я каким-то образом забыл про столь базовую вещь.
b2m
Devil
Posts: 948
Joined: 26 May 2003 06:57

Re: Ассемблер для Intel 8080 на TypeScript

Post by b2m »

begoon wrote: 18 Apr 2026 02:42 Добавил в asm8 локальные метки
А почему @, а не точка?
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Чтобы не путать с .org, .dw и пр. В asm8 можно писать dw или .dw, org или .org и т.д.

Можно и точку поддержать, хотя ассемблеры, что я встречал с локальными метками, использовали "@". Я поэтому так и сделал, по интуиции.
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Добавил поддержку точки для локальных меток, то есть можно и "@abc" и ".abc".

Code: Select all

## 2026-04-18

- Добавлены локальные метки: @name: привязывается к ближайшей
  предшествующей нелокальной метке (например, foo: ... @loop:
  определяет foo@loop; @loop внутри foo разрешается в неё).
  Двоеточие при определении обязательно.
- Добавлены локальные метки: @name: и .name: привязываются к
  ближайшей предшествующей нелокальной метке (например,
  foo: ... @loop: определяет foo@loop; foo: ... .loop: определяет
  foo.loop). Двоеточие при определении обязательно — это также
  отличает .loop: от директив вроде .org / .db.
- Добавлен символ $: вычисляется как текущий адрес в любом
  выражении.
- Исправлено: метки equ больше не сбрасывают область видимости
  локальных меток, поэтому len equ $ - .start корректно ссылается
  на .start в охватывающей области.
Last edited by begoon on 19 Apr 2026 02:55, edited 1 time in total.
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Добавил поддержку if/else по флагам.

Добавлены директивы .if / .else / .endif. .if <флаг> пропускает тело, когда флаг равен false, где <флаг> — один из Z NZ C NC PO PE P M или псевдонимы == (Z) и <> (NZ).

Блоки можно вкладывать друг в друга. Препроцессор разворачивает их в переходы i8080 и локальные метки (@_if_<N>_else / @_if_<N>_exit) до первого прохода, сохраняя исходные номера строк в сообщениях об ошибках. Блок должен оставаться в пределах одной нелокальной области видимости.

Code: Select all

      cpi 11h
      .if ==
        mov a, b
      .else
        mov a, c
      .endif
Вложенный пример — выбрать A из <10 / 10-19 / >=20:

Code: Select all

classify:
      cpi 20
      .if NC                ; A >= 20
        mvi b, 2
      .else
        cpi 10
        .if NC              ; 10 <= A < 20
          mvi b, 1
        .else               ; A < 10
          mvi b, 0
        .endif
      .endif
      ret
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Добавил .proc, чтобы можно было регистры сохранять, early exit ".return" и писать, например, так:

Code: Select all

  strlen .proc b, h
      mvi b, 0
  loop:
      mov a, m
      cpi 0
      .if Z
        .return
      .endif
      inr b
      inx h
      jmp loop
Mondx
Doomed
Posts: 652
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Ассемблер для Intel 8080 на TypeScript

Post by Mondx »

del
Last edited by Mondx on 24 Apr 2026 10:35, edited 1 time in total.
Всегда!
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Да, это чисто для условных переходов. В этом суть.
Mondx
Doomed
Posts: 652
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Ассемблер для Intel 8080 на TypeScript

Post by Mondx »

begoon wrote: 19 Apr 2026 06:58 Да, это чисто для условных переходов. В этом суть.
Конечно, я давно отстал от жизни, но можно ли слегка направить?). Суть в чём именно?)
ОК. Увидел (. Всё класс!
Last edited by Mondx on 24 Apr 2026 10:38, edited 1 time in total.
Всегда!
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Если кому интересно -- онлайновый playground для asm8.

Все примеры рабочие, код можно сходу запускать в эмуляторе.
User avatar
Lavr
Supreme God
Posts: 16986
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Ассемблер для Intel 8080 на TypeScript

Post by Lavr »

begoon wrote: 18 Apr 2026 10:09Чтобы не путать с .org, .dw и пр. В asm8 можно писать dw или .dw, org или .org и т.д.
А как этот Ассемблер для Intel 8080 на TypeScript скомпилирует вот такой код?

Code: Select all

    ORG  0000H

    LXI  SP,7FFFH ;
    LXI  H, 55AAH
    PUSH H        ; ПО СБРОСУ INTE="0"
;   EI            ;    ТЕПЕРЬ INTE="1"

MZ1:
    MVI  A,50H
    STA  0FFE0h

    LDA  0FFE0h
    ANI  01H
    CZ   MZ3 ;    ПРОВЕРЯЕТСЯ РЕАКЦИЯ
;    STA  0FFE0h  НА КОМАНДЫ  EI/DI
    JMP  MZ2
MZ2:
    MVI  A,0A0H
    STA  0FFE0h

    LDA  0FFE0h
    ANI  02H
    CZ   MZ4 ;    ПРОВЕРЯЕТСЯ РЕАКЦИЯ
;    STA  0FFE0h  НА КОМАНДЫ  EI/DI
    JMP  MZ1
    JMP  MZ1
MZ3:
    EI
    RET

MZ4:
    DI
    RET

 
    ORG  0038H;  - RST7
MZ38:
    MVI  A,0F0H
    STA  0FFE0h
    LDA  0FFE0h
    ANI  02H
    JZ   MZ42
    JMP  MZ39
...
Суть кода не важна, хотя он реальный, интересует как раз реакция на ORG ...
iLavr
begoon
Maniac
Posts: 204
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Re: Ассемблер для Intel 8080 на TypeScript

Post by begoon »

Так вы попробуйте в плейграунде.

Ну а в теории так: org позиционирует на адрес. Дырки между секциями зануляются.

Перекрываться секции не могут.
User avatar
Lavr
Supreme God
Posts: 16986
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Ассемблер для Intel 8080 на TypeScript

Post by Lavr »

begoon wrote: 19 Apr 2026 13:36Ну а в теории так: org позиционирует на адрес. Дырки между секциями зануляются.
Относительно org вычисляются адреса переходов. И какой из org берётся за точку отсчёта теперь?
Если у меня на один и тот же адрес jmp после первого org а потом после второго org? (ну или call...)
iLavr