У меня получилось так:
Исходный Оберон:
Скомпилировалось в:Код:MODULE ASCII; (*$MAIN*) IMPORT Console; VAR n: SHORTINT; BEGIN FOR n := 32 TO 127 DO Console.WriteCh(CHR(n)) END; END ASCII.
Немножечко "догнал" опцией --oldralloc, немножечко можно попробовать реализацией FOR от Saferoll (впрочем, прироста именно в этом случае не даёт). Немножечко отказом от OUTPUT_COMPACT в пользу OUTPUT_ROM. Итоговая TAP'ка весит 198 байт.Код:_main_start:: _main: push ix ;ASCII.c:20: ASCII_n = 32; ld hl,#_ASCII_n + 0 ld (hl), #0x20 ;ASCII.c:22: ASCII__for__1 = (ASCII__for__1 - ASCII_n) + 1; ld hl,#_ASCII__for__1 + 0 ld (hl), #0x60 ;ASCII.c:23: do { 00101$: ;ASCII.c:24: Console_WriteCh((CHAR)ASCII_n); ld a,(#_ASCII_n + 0) push af inc sp call _Console_WriteCh_ROM inc sp ;ASCII.c:25: ASCII_n += 1; ld hl, #_ASCII_n+0 inc (hl) ;ASCII.c:26: ASCII__for__1 -= 1; ld hl, #_ASCII__for__1+0 dec (hl) ;ASCII.c:27: } while (!(ASCII__for__1 == 0)); ld a,(#_ASCII__for__1 + 0) or a, a jr NZ,00101$ ;ASCII.c:28: __FINI; ld hl,#0x0000 pop ix ret _main_end::
Директива секции кода, встроенная в SDCC-асм.
Сделай лучше. Потихоньку.
Чем планируем транслировать Модулу в код Z80?
Как мне избавиться от индексного регистра iy и скомпилировать, как у тебя, с регистром hl
---------- Post added at 13:55 ---------- Previous post was at 13:54 ----------
и чтобы бредятина типа .area сама выкидывалась
Жосткая оптимизация - 192 байта.
Можно и ещё меньше конечно.Код:MODULE ASCII; (*$MAIN*) IMPORT Console; VAR n: SHORTINT; BEGIN n := 3*32; REPEAT Console.WriteCh(CHR(3*32-n+32)); DEC(n) UNTIL n = 0; END ASCII.
---------- Post added at 13:02 ---------- Previous post was at 12:57 ----------
Сам не пойму, то с hl компилит, то с iy. Попробуй поиграться с опцией --reserve-regs-iy
--reserve-regs-iy This option tells the compiler that it is not allowed to use register pair iy.The option can be useful for systems where iy is reserved for the OS.
However in general, the use of ix may depend on --reserve-regs-iy: sdcc should try to generate good code. And sdcc might decide whether using ix is a good idea depending on whether iy is available: When there are few accesses to the stack, sdcc might decide to not use ix, and instead access the stack using hl and iy only. But if iy is not available, sdcc will be more likely to decide to use ix for accessing the stack. The option for forbidding the use of ix is --fomit-frame-pointer (which in your case might be a usable workaround for the issue).
Да не надо её выкидывать, она не мешает. Это асм такой. Разве только прикрутить к SDCC другой асм, но смысл?
а .Mod файлы в архиве это не модула?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Нет, это тоже Оберон. Придумаем как транслировать Модулу - будет поддержана и Модула.
чухня полная. лучше я сам напишу, чем этот код причесывать.
denpopov, его не надо причесывать, его надо использовать.
тут сам принцип - не писать на асме а программировать на ЯВУ.
но конечно для начала надо настройки выставить чтобы SDCC создавало что-то приемлемое. раз уж автор за этим не следил.
С уважением,
Jerri / Red Triangle.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)