У меня нет никакого желания общаться с господами, засравшими мою тему по игрушке для БК своими обширными простынями с облизываниями IAR, уже не говоря про то, что облизывать IAR было бы несколько более уместно в более тематических разделах. Как можно доказать что-то людям, которые не понимают разницу между мёртвым закрытым и живым открытым компилятором? "Поместите Minix в свободный доступ, и одна из моих главных претензий к ней отпадёт" (c) Линус Торвальдс

И уже не говоря про то, что разрабатывать драйвер FAT для Z80 на Си это уродство. Моё мнение в этом не поменяется. Драйвер - критичная часть системы, он должен быть максимально компактным и работать максимально быстро. Идёте по шаткому пути била гейца, господа.

- - - Добавлено - - -

У меня практический вопрос к кодерам БК. Я разработал процедуры горизонтального циклического скроллинга прямоугольного окна влево на 4 и 8 пикселей. Теперь нужно сделать на 1 пиксель, надо юзать два битовых сдвига. Подскажите, плз, как это сделать наиболее оптимально? Может есть готовые какие-то подпрограммы?

Код:
void _Laser2_XYtoScr (int dummy, int r2, int r3,
  int x, int y, int len, int hgt)
{ /* R0 - screen address */
  asm("\
        MOV   %4, R0  // y      \n\
        MOV   R0, R1            \n\
        ASL   R0                \n\
        ASL   R0                \n\
        ADD   R1, R0            \n\
        SWAB  R0      // * 640  \n\
        ROR   R0                \n\
        ADD   $041000, R0       \n\
        ADD   %3, R0            \n\
        ADD   %3, R0  // + 2*x  \n\
        MOVB  %5, R2  // len    \n\
        MOVB  %6, R3  // hgt    \n"
      ::"g"(dummy), "g"(r2), "g"(r3),
        "g"(x), "g"(y), "g"(len), "g"(hgt)
  );
} // _Laser2_XYtoScr

void Laser2_WL4V (int x, int y, int len, int hgt)
{
  asm("\
        JSR   PC, __Laser2_XYtoScr  \n\
        ASL   R2         // 2*x     \n\
        MOV   R4, -(SP)             \n\
        MOV   R5, -(SP)             \n\
OUTLN4: MOV   R0, R1                \n\
        MOV   R2, R4                \n\
        MOVB  @R1, R5               \n\
OUTWR4: MOVB  1(R1), (R1)+          \n\
        SOB   R4, OUTWR4            \n\
        MOVB  R5, @R1               \n\
        ADD   $0100, R0             \n\
        SOB   R3, OUTLN4            \n\
        MOV   (SP)+, R5             \n\
        MOV   (SP)+, R4             \n"
      :::"r2", "r3"
  );
} // Laser2_WL4V

void Laser2_WL8V (int x, int y, int len, int hgt)
{
  asm("\
        JSR   PC, __Laser2_XYtoScr  \n\
        MOV   R4, -(SP)             \n\
        MOV   R5, -(SP)             \n\
OUTLN5: MOV   R0, R1                \n\
        MOV   R2, R4                \n\
        MOV   @R1, R5               \n\
OUTWR5: MOV   2(R1), (R1)+          \n\
        SOB   R4, OUTWR5            \n\
        MOV   R5, @R1               \n\
        ADD   $0100, R0             \n\
        SOB   R3, OUTLN5            \n\
        MOV   (SP)+, R5             \n\
        MOV   (SP)+, R4             \n"
      :::"r2", "r3"
  );
} // Laser2_WL8V