Код:
#include "minifont.c"
#define LAT 0
#define RUS 1
char text[16];
void i2s(char*, int num);
unsigned int iBCD2int(unsigned int num);
unsigned int rd_cmos_minsec(void);
unsigned char atX,atY;
const unsigned char* ScreenTable[24] = {
0x4000,0x4020,0x4040,0x4060,0x4080,0x40A0,0x40C0,0x40e0,
0x4800,0x4820,0x4840,0x4860,0x4880,0x48A0,0x48C0,0x48e0,
0x5000,0x5020,0x5040,0x5060,0x5080,0x50A0,0x50C0,0x50e0
};
unsigned int iBCD2int(unsigned int num) __naked
{ num;
__asm
pop af
pop de
push de
push af
ld hl,#0
ld a,d
rrca
rrca
rrca
rrca
and a,#0x0f
ld l,a
call 2$ ; x10
ld a,d
and a,#0x0f
ld b,h
ld c,a
add hl,bc
call 2$ ; x10
add hl,hl
ld c,l
ld b,h
add hl,hl
add hl,bc ; x6
ld a,e
rrca
rrca
rrca
rrca
and a,#0x0f
add a,a
ld c,a
add a,a
add a,a
add a,c
ld c,a ; x10
ld a,e
and a,#0x0f
add a,c
ld c,a
ld b,#0
add hl,bc
ret
2$: add hl,hl
ld c,l
ld b,h
add hl,hl
add hl,hl
add hl,bc
ret
__endasm;
}
unsigned int rd_cmos_minsec(void) __naked
{
__asm
ld bc,#0xeff7
ld a,#0x80
out (c),a
ld b,#0xdf
xor a
out (c),a
ld b,#0xbf
in l,(c)
ld b,#0xdf
ld a,#2
out (c),a
ld b,#0xbf
in h,(c)
ld b,#0xef
xor a
out (c),a
ret
__endasm;
}
void i2s(char* d, int num) __naked
{ d, num;
__asm
pop af
pop bc
ex (sp),hl
push bc
push af
xor a,a
ld de,#10000
call 2$
xor a,a
ld de,#1000
call 2$
xor a,a
ld de,#100
call 2$
xor a,a
ld de,#10
call 2$
ld a,#0x30
add a,l
ld (bc),a
inc bc
xor a,a
ld (bc),a
ret
2$: or a,a
sbc hl,de
jp c,1$
inc a
jp 2$
1$: add hl,de
; or a,a
; ret z
add a,#0x30
ld (bc),a
inc bc
ret
__endasm;
}
void put__ch(char sym)
{
unsigned char* dest;
unsigned char* src;
unsigned char lang,q,i;
unsigned int index;
dest = (unsigned char*)(ScreenTable[atY]+atX/2);
lang = LAT;
if(sym&0x80) lang = RUS;
sym = sym&0x7f;
index = sym*8;
src = (unsigned char*)(minifont + index);
if(lang==0) {
if(atX&0x01) {
for(i=0;i<8;i++)
{
q = (*dest)&0xf0;
*dest = q | ((*src++)/16&0x0f);
dest+=256;
}
}
else {
for(i=0;i<8;i++)
{
q = (*dest)&0x0f;
*dest = q | ((*src++)&0xf0);
dest+=256;
}
}
}
else {
if(atX&0x01) {
for(i=0;i<8;i++)
{
q = (*dest)&0xf0;
*dest = q | ((*src++)&0x0f);
dest+=256;
}
}
else {
for(i=0;i<8;i++)
{
q = (*dest)&0x0f;
*dest = q | ((*src++)*16)&0xf0;
dest+=256;
}
}
}
}
void print(char* str)
{
while(*str) {
put__ch(*str++);
atX++;
if(atX>63) {atX=0; atY++;};
}
}
void main(void)
{
unsigned int begin, end;
unsigned int i = 2560;
begin = rd_cmos_minsec();
while(i) {
atX=atY=0;
print("Привет, В форуме проскальзовали идеи о том, что дескать неплохо было бы с реального спектрума выходить в какой-никакой интернет. И даже якобы за рубежом изобрели какую-то хреновину, которая является чем-то типа модема для спектрума и вставляется в стандартный системный разъем фирменного спека. Только вот что было дальше я не понял.");
--i;
};
end = rd_cmos_minsec();
begin = iBCD2int(begin);
end = iBCD2int(end);
end = end - begin;
i2s(text,end);
atX =0;
atY +=2;
print("Печать вышерасположенного текста 2560 раз заняла ");
print(text);
print(" секунд");
}
Кстати, сишный исходник, наверняка, можно оптимизировать. Если знатоки, решат его поправить, - добавлю в таблицу соответствующие данные. Это тоже интересно, сколько может дать оптимизация на высоком уровне. Пока в глаза бросается, что можно было обойтись без вычисления промежуточной переменной index и return(dest).