Важная информация

User Tag List

Страница 2 из 11 ПерваяПервая 123456 ... ПоследняяПоследняя
Показано с 11 по 20 из 109

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

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

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    Даладно. Можно же только глобальные переменные использовать
    Да. Я решил проверить, могу ли написать базовую часть компилятора за час. Без структур, препроцессора, указателей на функции, оптимизатора. Написал.

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

    ushort a,b,c;
    a = b+c;

    ; push16 B
    LD HL, 4
    ADD HL, SP
    LD B, (HL)
    INC HL
    LD C, (HL)
    ; push16 c
    LD HL, 6
    ADD HL, SP
    LD E, (HL)
    INC HL
    LD D, (HL)
    ; add16
    EX HL, DE
    ADD HL, BC
    EX HL, DE
    ; pop16 a
    LD HL, 2
    ADD HL, SP
    LD (HL), E
    INC HL
    LD (HL), D

    Надо писать си, где все переменные глобальные, если нет рекурсии.

  2. #12
    Member
    Регистрация
    08.01.2012
    Адрес
    г.Винница, Украина
    Сообщений
    65
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    Да. Я решил проверить, могу ли написать базовую часть компилятора за час. Без структур, препроцессора, указателей на функции, оптимизатора. Написал.

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

    ushort a,b,c;
    a = b+c;

    ; push16 B
    LD HL, 4
    ADD HL, SP
    LD B, (HL)
    INC HL
    LD C, (HL)
    ; push16 c
    LD HL, 6
    ADD HL, SP
    LD E, (HL)
    INC HL
    LD D, (HL)
    ; add16
    EX HL, DE
    ADD HL, BC
    EX HL, DE
    ; pop16 a
    LD HL, 2
    ADD HL, SP
    LD (HL), E
    INC HL
    LD (HL), D

    Надо писать си, где все переменные глобальные, если нет рекурсии.
    Как вариант - помнить, на какую ячейку стека ссылался HL в прошлый раз. И просто прибавлять/вычитать значение, а не лопатить постоянно LD HL, 6 ADD HL, SP

  3. #13
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,116
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    657
    Поблагодарили
    403 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Гений, который проектировал 8080, забыл сделать все нужные для человеческой жизни виды адресаций, зато не забыл XTHL. По-моему XTHL предположительно должен как-то помогать извлечению барахла из стека, но я так и не смог сообразить, как.

    vinxru, не бросай. Если бы был компилятор Си для 8080, который бы без эмуляторных оберток работал на современной системе, это было бы уже очень хорошо. Даже просто как обертка для ассемблерных вставок он бы уже был полезен. Только структуры поддержи ;)
    Больше игр нет

  4. #14
    Guru Аватар для Vladimir_S
    Регистрация
    12.12.2011
    Адрес
    г. Иркутск
    Сообщений
    2,507
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    19 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    vinxru, прочитал название темы и аж сердце екнуло.А оказывается все только начинается.

  5. #15
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,116
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    657
    Поблагодарили
    403 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от predatoralpha Посмотреть сообщение
    Как вариант - помнить, на какую ячейку стека ссылался HL в прошлый раз. И просто прибавлять/вычитать значение, а не лопатить постоянно LD HL, 6 ADD HL, SP
    lxi h, 6 dad sp -- это и есть просто прибавить значение.
    Больше игр нет

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

    По умолчанию

    Надо сначала ром диск закончить, а потом будем делать компилятор. Тем более, что меня далеко не раз просили. Например фанаты компьютера Львов ПК-01.

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

    Я так подумал. Можно быстро сделать, если исключить две фишки

    1) Рекурсию
    2) Указатели на функции.

    Тогда адреса стека (и глубину стека) можно легко рассчитать. Приведенный выше код будет выглядеть как

    LD DE, A
    LD HL, B
    ADD HL, DE
    LD C, HL

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

  8. #17
    Member
    Регистрация
    08.01.2012
    Адрес
    г.Винница, Украина
    Сообщений
    65
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от svofski Посмотреть сообщение
    lxi h, 6 dad sp -- это и есть просто прибавить значение.
    Я имел ввиду не прибавлять к sp, а модифицировать только HL - ADD HL, nnn. Первый раз надо сделать так, как есть. Потом - просто менять HL на некоторое значение.
    Вместо двух lxi h, 6 dad sp остаётся один add

    ПС. Извиняюсь, пересмотрел систему команд, прибавления к регистровой паре значения нету. Вопрос снят.
    Последний раз редактировалось predatoralpha; 11.09.2012 в 18:12.

  9. #18
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,842
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,814
    Поблагодарили
    1,043 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    Приведенный выше код будет выглядеть как
    LD DE, A
    LD HL, B
    Наверно я туплю, но A и B разве константы? Если это глобальные переменные, то д.б. что-то вроде
    lhld usA
    xchg
    lhld usB

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

    По умолчанию

    Блин. Есть у меня проблема с постепенным расширением ТЗ.

    В общем эта программа

    Код:
    void print(uchar x, uchar y, uchar* text) {
      uchar* d;
      d = (uchar*)(0xA000 + ((ushort)x) + ((ushort)y) * 78); // Автопреобразования пока нет.
      while(*text) { *d = *text; d++; text++; }
    }
    
    void main() {
      print(5, 5, "HELLO");
      print(5, 7, "WORLD");
    }
    
    на выходе
    
    print_text dw 0 ; Переменные разных функций будут занимать одну память.
    print_d dw 0
    print_x db 0
    print_y db 0
    
    print:
      ld de, 78
      ld hl, (print_y)
      ld h, 0
      call mul_ushort
    
      ex de, hl
      ld hl, (print_x)
      ld h, 0
      add hl, de
    
      ld de, 40960
      add hl, de
    
      ld (print_d), hl
    
    l0:
      ld hl, (print_text)
      ld a, (hl)
      or a
      jp z, l1
    
      ld hl, (print_d)
      ld (hl), a
    
      inc hl
      ld (print_d), hl
    
      ld hl, (print_text)
      inc hl
      ld (print_text), hl
    
      jp l0
    l1:
      ret
    
    
    main:
      ld a, 5
      ld (print_x), a
    
      ld (print_y), a
    
      ld hl, text1 ; "HELLO"
      ld (print_text), hl
    
      call print
    
      ld a, 5
      ld (print_x), a
    
      ld a, 7
      ld (print_y), a
    
      ld hl, text2 ; "WORLD"
      ld (print_text), hl
    
      call print
    
      ret


    ---------- Post added at 17:58 ---------- Previous post was at 17:56 ----------

    Регистровая пара BC не используется. Её можно будет использовать для хранения какого то значения.

    ---------- Post added at 18:00 ---------- Previous post was at 17:58 ----------

    А вот такая конструкция
    Код:
    while(*text) *d++ = *text++;
    
    раскрывается в 
    
    l0:
      ld hl, (print_text)
      ld a, (hl)
      or a
      jp z, l1
    
      ld hl, (print_d)
      ld (tmp3), hl
      inc hl
      ld (print_d), hl
    
      ld hl, (print_text)
      ld (tmp4), hl
      inc hl
      ld (print_text), hl
    
      ld hl, (tmp4)
      ld a, (hl)
      ld hl, (tmp3)
      ld (hl), a
    
      jp l0
    l1:
    Последний раз редактировалось vinxru; 11.09.2012 в 19:05.

  11. #20
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,116
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    657
    Поблагодарили
    403 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Для 8080 было бы здорово генерить мнемоники 8080. Тут я не могу даже оценить насколько хорош код -- хоть я смысл мнемоник и знаю, в глазах одно сплошное LD.

    Операции копирования строк в 8080 -- самая больная тема. Есть еще ldax rp/stax rp, может быть BC пригодится? Хотя по-моему гнаться за этим не стоит, можно написать memmove сколь угодно оптимальный на ассемблере.
    Больше игр нет

Страница 2 из 11 ПерваяПервая 123456 ... ПоследняяПоследняя

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

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

Эту тему просматривают: 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

Ваши права

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