Переписал с применением подпрограммы ПЗУ PRINT-FP. Скорость будет ниже, зато код компактнее. Всё равно печать с помощью RST 16 сама по себе довольно медленная.
Приветствуются любые замечания по сокращению кода.Код:/*--------------------------------- Cut here ---------------------------------*/ void Basic_PRCHAR_ROM (unsigned char ch) __z88dk_fastcall { __asm LD A,L LD IY,#0x5C3A EX AF,AF LD A,#2 CALL 0x1601 EX AF,AF RST 16 __endasm; } //Basic_PRCHAR_ROM /*--------------------------------- Cut here ---------------------------------*/ void Basic_PRWORD_ROM (unsigned int n) __naked __z88dk_fastcall { __asm LD C,L LD B,H CALL 0x2D2B // BC-TO-FP LD A,#2 CALL 0x1601 JP 0x2DE3 // PRINT-FP __endasm; } //Basic_PRWORD_ROM /*--------------------------------- Cut here ---------------------------------*/ void Basic_PRINT_ROM (int n) __naked __z88dk_fastcall { __asm BIT 7,H JP Z,_Basic_PRWORD_ROM ; HL := -HL EX DE,HL ; 4 XOR A ; 4 LD L,A ; 4 LD H,A ; 4 SBC HL,DE ; 15 => 31t PUSH HL LD A,#0x2D CALL _Basic_PRCHAR_ROM+1 POP BC JP _Basic_PRWORD_ROM+2 __endasm; } //Basic_PRINT_ROM
P.S. Можно ускорить смену знака на один такт. Вместо:
использовать:Код:; HL := -HL EX DE,HL ; 4 XOR A ; 4 LD L,A ; 4 LD H,A ; 4 SBC HL,DE ; 15 => 31t
Но это не даст никакого ощутимого выигрыша, всё равно PRINT-FP использует медленный калькулятор. Но менее компактно (7 байт против 6).Код:LD A,L ; 4 CPL ; 4 LD L,A ; 4 LD A,H ; 4 CPL ; 4 LD H,A ; 4 INC HL ; 6 => 30t




Ответить с цитированием