User Tag List

Страница 10 из 12 ПерваяПервая ... 6789101112 ПоследняяПоследняя
Показано с 91 по 100 из 111

Тема: Кросскомпилятор Си под 8080

  1. #91

    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Замена for(a;b;c) на a; do ... c; while(b); ? Я не думал об этом, так как это может сделать программист, но сделаем.

    ---------- Post added at 01:15 ---------- Previous post was at 01:10 ----------

    Цитата Сообщение от predatoralpha Посмотреть сообщение
    И боюсь, ещё не раз придётся всё переписать...
    Слово переписывтаь не совсем корректное. Я сейчас подключаю новые блоки поверх простых конструкций. Расширяем

    Можно было бы давно оставить в покое кодогенератор, добить синтаксис Си, добавить оптимизатор. Но хочется, что бы потом пальцем не показывали, что бы компилятор работал на уровне или даже лучше компиляторов для Z80.

    ---------- Post added at 01:31 ---------- Previous post was at 01:15 ----------

    Цитата Сообщение от predatoralpha Посмотреть сообщение
    Нужно на каждую переменную вести её последнее значение, на этапе компиляции анализировать условия (y<8 в данном случае).
    Это будет отдельный блок компилятора. Сначала программа сваливается в буфер. Я для этого удобный способ офомил: w.ld_hl_ref(b).ld_d_HL().ld_a_c();

    А уже потом, несколько алгоритмов оптимизации будут сверху-вниз и снизу-верх обрабатывать программу.

    ---------- Post added at 03:18 ---------- Previous post was at 01:31 ----------

    Добавил замену команды LD A на INC A, DEC A в зависимости от состояния A. Вам очень этого хотелось Еще добавлю CPL туда же и для всех регистров сделаю. Сделал нормальную поддержку операторов && || !

    Надо еще расписать все варианты для 16-битной арифметики.

    Код:
    startGame:
      push bc
      ; 375 enemyCount     = 0;
      xor a
      ld (enemyCount), a
      ; 376 playerX        = SPRITE_WIDTH;
      ld a, 4
      ld (playerX), a
      ; 377 playerY        = SPRITE_HEIGHT;
      ;o a=4
      ld (playerY), a
      ; 378 gameOver       = 0;
      xor a
      ld (gameOver), a
      ; 379 fireSize       = 2;
      ld a, 2
      ld (fireSize), a
      ; 380 fireMax        = 2;
      ;o a=2
      ld (fireMax), a
      ; 381 bombCount      = 0;
      xor a
      ld (bombCount), a
      ; 382 prevFire       = 1;
      inc a ;o a=1
      ld (prevFire), a
      ; 383 gameOver       = 0;
      xor a
      ld (gameOver), a
      ; 385 memset(map1, 0xFF, MAP_WIDTH*MAP_HEIGHT);
      ld hl, map1
      ld (memset_dest), hl
      dec a ;o a=255
      ld (memset_v), a
      ld hl, 208
      call memset
      ; 386 memcpy(map, lvd, MAP_WIDTH*MAP_HEIGHT);
      ld hl, map
      ld (memcpy_dest), hl
      ld hl, lvd
      ld (memcpy_src), hl
      ld hl, 208
      call memcpy
      ; 387 memset(times, 0, MAP_WIDTH*MAP_HEIGHT);
      ld hl, times
      ld (memset_dest), hl
      xor a
      ld (memset_v), a
      ld hl, 208
      call memset
      ; 389 p = map;
    Последний раз редактировалось vinxru; 22.09.2012 в 03:21.

  2. #91
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #92

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В op_shr надо CP A перенести после op_shr_2.
    Возможно в memcpy и memset стоит сделать две ветки - одна для счетчика >255 (как сейчас), вторая для <=255?
    Сделал оба пункта, printKeyb раскомментил - бомберман не сломался.
    Процедуры/функции, которые никто не "трогает", наверно лучше не компилировать и не включать в .asm?
    Последний раз редактировалось ivagor; 22.09.2012 в 13:50.

  4. #93

    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    В op_shr надо CP A перенести после op_shr_2.
    Ага, я уже заметил.

    Цитата Сообщение от ivagor Посмотреть сообщение
    Возможно в memcpy и memset стоит сделать две ветки - одна для счетчика >255 (как сейчас), вторая для <=255?
    Ага. И наверное еще сделать копирование стековыми командами. Я такое недавно видел в исходниках CP/M BIOS-а Корвета. И вообще не редкость.

    Цитата Сообщение от ivagor Посмотреть сообщение
    Сделал оба пункта, printKeyb раскомментил - бомберман не сломался.
    printKeyb - это я сделал, что бы подсмотреть сканкоды клавиш.

    Цитата Сообщение от ivagor Посмотреть сообщение
    Процедуры/функции, которые никто не "трогает", наверно лучше не компилировать и не включать в .asm?
    Да, конечно. Я построю дерево вызовов и по этому дереву станет ясно, какая функция нужна, а какая нет. И по ней же я рассчитаю и размещу в общей памяти переменные функций, которые одновременно не вызываются.

    Более того, надо продумать более грамотное подключение библиотек функций. Что бы не компилировать весь код. Что то типа:

    uchar getch() = stdlib.c;
    uchar setPixel(uchar x, uchar y, uchar c) = apogey/graph.c;

  5. #94

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    И наверное еще сделать копирование стековыми командами.
    Как вариант - mem.zip. Можно еще для size>=2 memset с push сделать, но не уверен, стоит ли. Со стеком надо аккуратно. Для машин с прерываниями надо (наверно на условной компиляции) di до и ei после поставить (или использовать пару типовых mem.h для машин с прерываниями/без).
    В качестве оффтопа - сделал тупой немигающий вариант бомбера. Просто копирую (pop shld, почти 80000 тактов ) из бэкбуффера в ВОЗУ, хотя на апогее надо конечно менять базовый адрес отрисовки и переключать адреса ВОЗУ.

    Цитата Сообщение от vinxru Посмотреть сообщение
    printKeyb - это я сделал, что бы подсмотреть сканкоды клавиш.
    Мне понравилось, как показывает printKeyb. Про него я упомянул в связи с тем, что в бомбере вроде только в этой процедуре используется shr.
    Последний раз редактировалось ivagor; 22.09.2012 в 18:45. Причина: Исправил вложение, в первый раз ошибся и выложил другой вариант.

  6. #95

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Восьмибитное умножение можно немного оптимизировать
    Код:
    ; Умножение A на D, результат в HL. BC не трогаем
    op_mul:
      ex hl, de
      ld l, 0
      ld e, a
      ld d, l
      ld a, 8
    op_mul1:
      add hl, hl
      jp nc, op_mul2
        add hl, de
    op_mul2:
      dec a
      jp nz, op_mul1
      ret
    Если памяти не жалко, то еще быстрее
    Код:
    op_mul:
      ex hl, de
      ld l, 0
      ld e, a
      ld d, l
      DUP 7
      add hl, hl
      jp nc, $+4
      add hl, de
      EDUP
      add hl, hl
      ret nc
      add hl, de
      ret
    Кажется такой или подобный вариант был в "Микропроцессорных средствах и системах", только номер не помню.

    В прошлом посте я сначала случайно выложил mem.h без pop, потом исправился.
    Последний раз редактировалось ivagor; 22.09.2012 в 21:01.

  7. #96

    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Начал писать оптимизатор.

    1) Выбрасываются бессмысленные команды MOV; MVI; LDA; LDAX.

    2) LDA, STA заменяется на MOV A, M, MOV M, A, LDAX, STAX если HL, BC, DE содержит соответствующее значение.

    3) LHLD + MVI H, 0 заменяется на MOV L, R, MVI H, 0 если R содержит соответствующее значение.

    4) MVI заменяется на INC, DEC в зависимости от значения регистра.

    5) MVI A заменяется на XOR A, ADD A, CMA в зависимости от значения регистра A.

    6) OR A уничтожается в последовательности команд типа: ANI 16; OR A; JZ

    7) Два подряд идущих ANI, ORI, XRI, ADI, SBI... объединяются.

    8) Конструкции JC $+4 + RET; JC $+6 + CALL; JC $+6 + JP заменяются на одну команду типа RNC, CNC, JNC.

    9) Бесполезные переходы JP $+3 убираются.

    Помимо этого в самом кодогенераторе

    1) Условные операторы, типа X = A<B, теперь рассчитываются используя команду SBC вместо перехода: LDA 1; CP 2; SBC A

    2) Из за недоработки компилятор выдавал последовательность команд XOR A, MOV M, A в некоторых случаях. Теперь всегда будет MVI M, 0.

    3) Для 16 битного сравнения и вычитания, если один из аргументов константа, используется команда ADD HL, DE. Исключение составляют 4 оператора для знакового типа SHORT: <, >, <=, =>, для которых вызывается подпрограмма.

    ---------- Post added at 13:42 ---------- Previous post was at 12:40 ----------

    В ближайшее время займусь доработкой синтаксиса Си. Какие нибудь программы Си покомпилирую. Например Трубо-Кальк из примеров к Трубо-Си. А то как в первый день я сделал наброски, так больше и не трогал.

    ---------- Post added at 14:14 ---------- Previous post was at 13:42 ----------

    Прикинул, какие команды я не использую:
    EI, DI, DAA, CMC, STC, DCX D, HLT, SPHL, PUSH D, IN, OUT, RST, LXI SP, NOP
    JP, JPO, JPE, JM
    CP, CPO, CPE, CM
    RP, RPO, RPE, RM,
    RLC, RRC, RAL

    Еще некоторые комбинации регистров в MOV, ADD, ADC, SBC, OR, AND, XOR, CP не используются.
    Последний раз редактировалось vinxru; 26.09.2012 в 11:05.

  8. #97

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    Ага. И наверное еще сделать копирование стековыми командами. Я такое недавно видел в исходниках CP/M BIOS-а Корвета.
    ни в коем случае! При выполенини таких процедур придется гасить прерывания, а это суксь. Нужна скорость - гоните процессор (а лучше поменять его на Z80).


    Цитата Сообщение от vinxru Посмотреть сообщение
    Более того, надо продумать более грамотное подключение библиотек функций. Что бы не компилировать весь код. Что то типа:

    uchar getch() = stdlib.c;
    uchar setPixel(uchar x, uchar y, uchar c) = apogey/graph.c;
    Надо делать обычные extern объявления (чтобы компилер мог только проверить синтаксис вызываемых внешних процедур), а связыванием должен заниматься линкер (компилеру знать про то, что где лежит, не надо): ассеблерный выхлоп компилятора будет помодульно компилироваться в объектник и далее линковаться либо включаться в библиотеки. Улилиты для этого уже есть: М80/L80/LIB80. Кстати, понимают оба типа мненмоник - и вменяемые, и от i8080.

    ---------- Post added at 15:25 ---------- Previous post was at 15:20 ----------

    Цитата Сообщение от vinxru Посмотреть сообщение
    3) Для 16 битного сравнения и вычитания,
    Будут ли 32-битные арифметические операции ?
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  9. #98

    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    Надо делать обычные extern объявления (чтобы компилер мог только проверить синтаксис вызываемых внешних процедур), а связыванием должен заниматься линкер (компилеру знать про то, что где лежит, не надо): ассеблерный выхлоп компилятора будет помодульно компилироваться в объектник и далее линковаться либо включаться в библиотеки. Улилиты для этого уже есть: М80/L80/LIB80. Кстати, понимают оба типа мненмоник - и вменяемые, и от i8080.
    extern уже есть. Но вроде бы компилятор SJASM не позволяет создавать OBJ файлы.

    А посоветуйте компилятор ассемблера для 8080, я бы сразу его прикрутил.

    ---------- Post added at 14:35 ---------- Previous post was at 14:33 ----------

    Цитата Сообщение от Error404 Посмотреть сообщение
    Будут ли 32-битные арифметические операции ?
    Будут. Я большинство из них вынесу во внешние функции, только параметры будут передаваться как адреса.

    Так же будут работать float, double, long double и т.д. Все операторы внешние.

    ---------- Post added at 14:36 ---------- Previous post was at 14:35 ----------

    Цитата Сообщение от Error404 Посмотреть сообщение
    ни в коем случае! При выполенини таких процедур придется гасить прерывания, а это суксь.
    На РК-86 нет прерываний.

    ---------- Post added at 14:41 ---------- Previous post was at 14:36 ----------

    Цитата Сообщение от vinxru Посмотреть сообщение
    Цитата:
    Сообщение от Error404 Посмотреть сообщение
    Надо делать обычные extern объявления (чтобы компилер мог только проверить синтаксис вызываемых внешних процедур), а связыванием должен заниматься линкер (компилеру знать про то, что где лежит, не надо): ассеблерный выхлоп компилятора будет помодульно компилироваться в объектник и далее линковаться либо включаться в библиотеки. Улилиты для этого уже есть: М80/L80/LIB80. Кстати, понимают оба типа мненмоник - и вменяемые, и от i8080.
    extern уже есть. Но вроде бы компилятор SJASM не позволяет создавать OBJ файлы.

    А посоветуйте компилятор ассемблера для 8080, я бы сразу его прикрутил.
    При использовании OBJ файлов нельзя разместить аргументы функций в общей памяти. Нельзя рассчитать дерево вызовов и вывести предупреждения при возникновении рекурсии.
    Последний раз редактировалось vinxru; 24.09.2012 в 15:38.

  10. #99

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    291
    Поблагодарили
    217 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    А посоветуйте компилятор ассемблера для 8080, я бы сразу его прикрутил.
    Есть, например, такой ассемблер TASM.
    Могу ещё предложить консольный эмулятор CP/M для i8080, недавно тестировал в нём работу C80,M80,L80. Вроде всё работает.
    Ещё я использовал FASM У него мощный препроцессор, я сделал файл с макросами, так он и i8080 компилировал, хотя и не поддерживает этот процессор.

  11. #100

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    extern уже есть. Но вроде бы компилятор SJASM не позволяет создавать OBJ файлы.

    А посоветуйте компилятор ассемблера для 8080, я бы сразу его прикрутил
    Если для МС-ДОС, то я пользовался таким (во вложении - MA80/MLINK) - оно совместимо с олдскульным микрософтовским M80 по входному синтаксису асссемблера. Объектники между L80 и MLINK не совместимы, но это и не особенно нужно - главное что общая идеология раздельной компиляции.

    Цитата Сообщение от vinxru Посмотреть сообщение
    На РК-86 нет прерываний.
    Значит, по-хорошему - надо сделать 2 набора либ: со стековыми функциями (ни в одном компиляторе не видел таких реализаций, к примеру, memset, хотя не думаю что авторы не знали про такие способы заполнения памяти) и с обычными циклами. Все же универсальность куда полезнее съэкономленного такта.

    Цитата Сообщение от vinxru Посмотреть сообщение
    При использовании OBJ файлов нельзя разместить аргументы функций в общей памяти. Нельзя рассчитать дерево вызовов и вывести предупреждения при возникновении рекурсии.
    С чего это? Пременную в любом ассемблере можно как явно положить в память по абсолютному адресу при помощи EQU, так и отдать на откуп линкеру на этапе сборки. В обоих случаях в исходнике обращение к ней идет по символическому имени. Или общая память это нечто отличающееся от обычной оперативной? Не понимаю.
    Вложения Вложения
    • Тип файла: zip MA80.ZIP (163.8 Кб, Просмотров: 137)
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

Страница 10 из 12 ПерваяПервая ... 6789101112 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ассемблер 8080
    от Kakos_nonos в разделе Утилиты
    Ответов: 0
    Последнее: 21.09.2011, 23:35
  2. Продам пару платок с процами 8080
    от RedLine в разделе Барахолка (архив)
    Ответов: 15
    Последнее: 23.12.2010, 18:39
  3. схема АОН на 8080/z80
    от sergey2b в разделе Разный софт
    Ответов: 7
    Последнее: 07.02.2010, 22:43
  4. An 8080/Z80 C Compiler
    от breeze в разделе Программирование
    Ответов: 1
    Последнее: 18.08.2005, 06:54

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •