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

User Tag List

Страница 4 из 12 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 111

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

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

    По умолчанию

    Переписал арифметику с нуля. Вместо временных переменных используется стек.

    Код:
      ; dest = (uchar*)(0xE1D5 + x + y*78);
      ld hl, (print_x)
      ld h, 0
      ld de, 57813
      add hl, de
      push hl
      ld d, 78
      ld a, (print_y)
      call mul_uchar
      pop de
      add hl, de
      ld (print_dest), hl
    Основной код пока выглядит еще не очень. Нужно сделать хранение заначений в регистре BC и доделать сравнение (команда CP вместо вызова call e_uchar). И for парсить нелинейно, что бы код был линейным

    Код:
    main_i ds 1
    main_x ds 1
    main_buf ds 32
    
    main:
      ; clrscr();
      call clrscr
      ; print(0, 0, "HELLO");
      xor a
      ld (print_x), a
      ld (print_y), a
      ld hl, string0
      call print
      ; itoa(buf, 123);
      ld hl, main_buf
      ld (itoa_str), hl
      ld hl, 123
      call itoa
      ; print(1, 1, buf);
      ld a, 1
      ld (print_x), a
      ld (print_y), a
      ld hl, main_buf
      call print
      ; i = 5;
      ld a, 5
      ld (main_i), a
      ; for(x=0; x<64; x+=16) {
      xor a
      ld (main_x), a
    l10:
      ld d, 64
      ld a, (main_x)
      call l_uchar
      or a
      jp z, l11
      jp l12
    l13:
      ld a, (main_x)
      add 16
      ld (main_x), a
      jp l10
    l12:
      ; print(x, i, "12345678.123");
      ld a, (main_x)
      ld (print_x), a
      ld a, (main_i)
      ld (print_y), a
      ld hl, string1
      call print
      ; }
      jp l13
    l11:
      ; while(1) {
    l14:
      ; if(getch() == '1') clrscr();
      call getch
      ld d, 49
      call e_uchar
      or a
      jp z, l16
      call clrscr
    l16:
      jp l14
    l15:
    l9:
      ret
    ;----------------------------------
    string1 db "12345678.123",0
    string0 db "HELLO",0


    ---------- Post added at 23:56 ---------- Previous post was at 22:47 ----------

    1500 строк, 45 Кб
    Последний раз редактировалось vinxru; 13.09.2012 в 11:44.

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

  3. #32
    Moderator
    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    61
    Спасибо Благодарностей получено 
    107
    Поблагодарили
    92 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Как-то совсем непродуманно выглядит передача параметров в функцию.
    Лучше сделать и жалеть, чем не сделать и жалеть.

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

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

    По умолчанию

    Всмысле?

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

    Только я сделал небольшую оптимизацию, что последний параметр записывается не в память, а в регистры A или HL. А первой командой в вызываемой функции параметр записывается в память.

    ---------- Post added at 10:22 ---------- Previous post was at 10:17 ----------

    Сделал хранение переменных в регистрах BC, B, C. Ключевое слово register. Операцию >>.
    Последний раз редактировалось vinxru; 13.09.2012 в 11:40.

  5. #34
    Moderator
    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    61
    Спасибо Благодарностей получено 
    107
    Поблагодарили
    92 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    Всмысле?
    Считаю было бы стратегически правильным сразу делать шедевр.
    Т.е. фукнциональность (набор операторов) - бог с ней, потом допишется, кодогенератор аналогично пока можно не оптимизировать. А вот базовые механизмы надо бы внедрить изначально. Позже это делать будет сложнее и приведет к размножению костылей и как следствие багов. Соответственно надо запланировать все нужные типы, арифметику, передачу параметров на стеке (от которых и до локальных переменных функций - полшага).
    Последний раз редактировалось Error404; 13.09.2012 в 12:00.
    Лучше сделать и жалеть, чем не сделать и жалеть.

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

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

    По умолчанию

    Если делать через стек, то программа будет работать еще в 3 раза дольше.

    Для стека

    LD HL, ADDR16
    ADD HL, SP
    LD A, (HL)

    или

    LXI H, ADDR16
    DAD SP
    MOV A, M

    Глобальные переменные.

    LD A, (ADDR16)

    или

    LDA ADDR16

    ---------- Post added at 11:10 ---------- Previous post was at 11:04 ----------

    Может мне кто нибудь подкинет функции умножения, деления, вычисления остатка от деления для 8, 16 бит, знаковых и без знаковых типов?
    Последний раз редактировалось vinxru; 13.09.2012 в 12:07.

  7. #36
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,852
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    235
    Поблагодарили
    171 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот умножение, умножает DE на HL, результат в HL:
    Код:
    _IMUL:	MOV B,H
    	MOV C,L
    	LXI H,0
    	MVI A,17
    _IMUL1:	DCR A
    	RZ
    	DAD H
    	XCHG
    	DAD H
    	XCHG
    	JNC _IMUL1
    	DAD B
    	JMP _IMUL1
    Несложно доделать, чтобы результат был 32-битным в DEHL:
    Код:
    _IMUL:	MOV B,H
    	MOV C,L
    	LXI H,0
    	MVI A,17
    _IMUL1:	DCR A
    	RZ
    	DAD H
    	XCHG
    	JC _IMUL2
    	DAD H
    	XCHG
    	JNC _IMUL1
    	DAD B
    	JMP _IMUL1
    _IMUL2:	DAD H
    	INX H
    	XCHG
    	JNC _IMUL1
    	DAD B
    	JMP _IMUL1


    ---------- Post added at 13:36 ---------- Previous post was at 13:32 ----------

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

    ---------- Post added at 13:53 ---------- Previous post was at 13:36 ----------

    Беззнаковое деление/остаток:
    Код:
    _DIV:	MOV A,H
    	ORA L
    	RZ
    	LXI B,0000
    	PUSH B
    _DIV1:	MOV A,E
    	SUB L
    	MOV A,D
    	SBB H
    	JC _DIV2
    	PUSH H
    	DAD H
    	JNC _DIV1
    _DIV2:	LXI H,0000
    _DIV3:	POP B
    	MOV A,B
    	ORA C
    	RZ
    	DAD H
    	PUSH D
    	MOV A,E
    	SUB C
    	MOV E,A
    	MOV A,D
    	SBB B
    	MOV D,A
    	JC _DIV4
    	INX H
    	POP B
    	JMP _DIV3
    _DIV4:	POP D
    	JMP _DIV3
    DE делится на HL, результат в HL, остаток в DE

    ---------- Post added at 14:00 ---------- Previous post was at 13:53 ----------

    Цитата Сообщение от b2m Посмотреть сообщение
    Для знаковых, перед умножением надо проверить, если оба числа отрицательные, то сделать оба положительными. Отрицательное на положительное можно и так умножать.
    Если использовать только 16-битный результат, то можно даже не проверять на знак

    ---------- Post added at 14:09 ---------- Previous post was at 14:00 ----------

    А если использовать 32-битный результат, то надо классически проверить знаки, привести к положительным значениям, и потом, если надо, инвертировать знак результата

  8. #37
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,865
    Спасибо Благодарностей отдано 
    658
    Спасибо Благодарностей получено 
    1,855
    Поблагодарили
    1,060 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    чтобы результат был 32-битным в DEHL
    Приведенный вариант не совсем правильный. Попробуйте умножить 7FFF*7FFF. Можно после dad b (оба раза) вставить
    jnc _IMUL1
    inx d
    а потом уже JMP _IMUL1

  9. #38
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,852
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    235
    Поблагодарили
    171 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Приведенный вариант не совсем правильный. Попробуйте умножить 7FFF*7FFF. Можно после dad b (оба раза) вставить
    jnc _IMUL1
    inx d
    а потом уже JMP _IMUL1
    Согласен. Я просто не проверял этот вариант, упустил из виду, что DAD B тоже может перенос вызвать.

    ---------- Post added at 17:08 ---------- Previous post was at 17:05 ----------

    Вот, поправил:
    Код:
    _IMUL:	MOV B,H
    	MOV C,L
    	LXI H,0
    	MVI A,17
    _IMUL1:	DCR A
    	RZ
    	DAD H
    	XCHG
    	JNC _IMUL2
    	DAD H
    	INX H
    	JMP _IMUL3
    _IMUL2:	DAD H
    _IMUL3:	XCHG
    	JNC _IMUL1
    	DAD B
    	JNC IMUL1
    	INX D
    	JMP _IMUL1

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

    По умолчанию

    Команда DEX B не изменяет флагов вообще, и я думал, что и DAD то же не изменяет.

    Значит её можно в циклах применять

    ADD HL, DE
    JP NC, LOOP

    вместо

    DEC HL
    LD A, H
    OR L
    JP NZ, LOOP

  11. #40
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,852
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    235
    Поблагодарили
    171 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    Значит её можно в циклах применять
    Но при этом тебе надо будет в DE еденицу грузить. 4 байта против трёх.

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

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

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

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

Ваши права

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