[T.Pascal7/TASM]"Smeti" na obrazovke

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod inflater 12. 9. 2006 16:24

Nazdar,
prave som dokoncil programovanie diakritiky v TASM - v spojeni s Borland Pascal 7.0 (kompilacia cez TASM - a do BP deklarovanie ako externa funkcia).

Cize funkcia je v BP zapisana takto:

function LoadFont: integer; external; {$L CHFONT.OBJ}

V napovede som cital , ze pri takomto assembly sa nesmiem hrat s registrami DS,SP,SS a BP. Kedze tato funkcia vyzaduje register BP tak som na zaciatok Code segmentu napisal

PUSH BP

a na koniec Code segmentu

POP BP

Problem je to, ze kod fungoval, ked som to skusal s TASM (do seg Code som pridal volanie funkcie LOADFONT a korektne ukoncenie programu), len co som to chcel vyskusat v Pascali, tak sice zmenilo font, ale na totalne necitatelne data - nieco ako "rozsypany caj". Zaujimave ze toto nemalo ziadny ucinok v okne (Windows XP), iba v celoobrazovkovom rezime (obr. 1,2; obidva obrazky fotene mobilom):

Obrázek
obr.1 - "Prostredie" OS

Obrázek
obr.2 - Borland Pascal 7?! :D

Zdrojak som bral z jedneho mikrojadra i8086 (CZ tutorial),
takze tabulka fontu v datovom segmentu nema preklep.

Zdrojak:
http://inflater.ic.cz/CHFONT.ASM

Pomozete mi?
Dakujem
inflater
inflater
Junior
Uživatelský avatar

Odeslat příspěvekod zdeneks 12. 9. 2006 16:37

Bohuzel v Pascalu nedelam, ale podle dokumentace je ukazatel na bitovou mapu jako FAR ES:BP.

takze namisto
lea bp,czfont
bych zkusil
les bp,far ptr czfont

nebo mozna
lea bp,czfont
push ds
pop es
+ na zacatku push es, na konci pop es

ale je to jen odhad... Namistoho toho 'lea' by urcite melo jit 'mov ptr' nebo neco takovyho, je to myslim o 1 byte kratsi.
zdeneks
Junior

Odeslat příspěvekod inflater 12. 9. 2006 17:37

Ta procedura fungovala v tom mikrojadre (z toho tutorialu) uplne v pohode, nic sa nemuselo menit a fachcilo to v pohode.

Vyskusal som kobinacie tychto zapisov:

1.Bud mi assembler vypisal OPERAND TYPES DO NOT MATCH,
2.alebo vypisalo ciernu obrazovku a potom nasledny pad Pascalu,
3.alebo vypisalo ciernu obrazovku a program sa dal ukoncit iba CTRL+ALT+DELETE.

Dakujem za tvoju trpezlivost a ochotnost, ale tento kod nefunguje.
:(

inflater
inflater
Junior
Uživatelský avatar

Odeslat příspěvekod zdeneks 13. 9. 2006 17:17

Je mi to lito, vic nevim. Asi neni inicializovany ES na spravnou hodnotu - ale jak tam tu spravnou dostat, to nevim.

Mozna pres
mov ax, segment Data
mov es, ax

takze cele to pak bude
push es
push bp
lea bp,czfont

mov ax, segment Data
mov es, ax

mov ax,1100h
mov cx,100h
mov bx,1000h
xor dx,dx
int 10h
pop bp
pop es
ret

Rado se stalo :-) Snad to pujde... Ze se to zasekne je ale divny.
zdeneks
Junior

Odeslat příspěvekod inflater 13. 9. 2006 17:51

Ani tento kod nefunguje, ale uz by mohol byt spravny:

Na obrazovke po zavolani kodu "smeti" nie su, ale ta rutina KOMPLETNE vymaze z obrazovky cely text a necha iba grafiku (cize vymaze uplne vsetky ASCII znaky, napr. A,B,C, ramce, znaky...).
Myslim si ze jedna malicka uprava kodu by funkcnost mala zaistit, pretoze teraz je tam aspon ta textova grafika, ked uz nie text...

jj aj ja sa tomu divim ci tomu ASM, Pascal, external funkcie, ... sibe ci ee...

inflater
inflater
Junior
Uživatelský avatar

Odeslat příspěvekod inflater 14. 9. 2006 17:26

Tak to teda nefachci...... :(

Posledna otazka ohladom tejto temy:
Ako to vsetko z toho ASM suboru vtrepem do bloku ASM-END? Predsa "CZFONT DB XYZ DUP(0)" mi nezoberie....
Diky za odpoved :(

inflater
inflater
Junior
Uživatelský avatar

Odeslat příspěvekod AraxoN 14. 9. 2006 20:23

Je to už dávno, čo som v DOS-e nastvavol fonty, a ešte dávnejšie čo som mixoval Turbo Pascal a Assembler. Zbežne som na to mrkol, a zradu by som v tomto prípade videl v tom, že Pascal má nastavený ES nejakým spôsobom, a pred volaním tej assemblerovskej funkcie sa vonkoncom nesnaží ho zmeniť tak ako ho tá funkcia očakáva. Buď na začiatok tej fcie musí príjsť nastavenie ES, alebo tie dáta musia byť osobitne a ukazateľ na nich musí príjsť ako parameter tej asm funkcie.
V čistokrvnom Assembleri som ale robil len minimálne, takže ani s jedným ani s druhým nepomôžem. Vždy keď som potreboval Assembler, tak som použil slovo asm priamo v zdrojáku Pascalu - Turbo Pascal s tým nemal problém. Nejak takto: (neotestované!)
Kód: Vybrat vše
provedure set_font(font:byte[4096]);
begin
  asm
    push bp
    mov ax,ds
    mov es,ax
    lea bp,font
    mov ax,1100h
    mov cx,100h
    mov bx,1000h
    xor dx,dx
    int 10h
    pop bp
  end;
end;
Podporujte baktérie - pre veľa ľudí je to jediná kultúra, ktorú majú.
AraxoN
Junior
Uživatelský avatar

Odeslat příspěvekod inflater 15. 9. 2006 08:21

Stiahol som si BIN2PAS,ibaze nemam binarku toho fontu, iba DB vypisy... Subor sa vola CZLAT_16.FNT a nikde ho nemozem najst (iba pre Hercules kartu a to spravi tiez podobnu blbost)

inflater
inflater
Junior
Uživatelský avatar

Odeslat příspěvekod JM 15. 9. 2006 14:42

Asi bude lepší dělat to ve vestavěném asm než v externím, protože umí vše co teď potřebuješ, je s ním méně práce a hlavně daleko lépe se ladí.

Kód: Vybrat vše
procedure Font1; assembler;
asm
  db NN,NN,NN,...
  db NN,NN,NN,...
...
end;

procedure set_font(const font);  assembler;
asm
  push bp
  les bp,font          {les bp protoze (const font) je pointer}
  mov ax,1100h
  mov cx,100h
  mov bx,1000h
  xor dx,dx
  int 10h
  pop bp
end;

begin
  set_font(@Font1^);
end;


Tak by to mohlo jít.

Můžeš si taky vytáhnout font z biosu přes Int10 do pole, vypsat pole do souboru v tomhle formátu a ručně upravit české znaky.

Kód: Vybrat vše
procedure Font_8x8; assembler;
asm
@@00:
  db ...
@@01h:
  db ...
...
@@61h: {a}
  db 00000000b
  db 00000000b
  db 01111000b
  db 00001100b
  db 01111100b
  db 11001100b
  db 01110110b
  db 00000000b
@@62h:  { b }
  db ...
end;
{Tohle je font 8x8, proto 8 byte na 1 znak}


Anebo udělat ručně jen české znaky a odeslat do karty každý zvlášť.
JM
Junior
Uživatelský avatar

Odeslat příspěvekod inflater 15. 9. 2006 15:01

Toto by mohlo fungovat super,
ibaze Inline assembly Borland Pascal 7micky nedovoluje pouzitie keywordu DUP, cize ma asi caka prerobenie...

//EDIT: Tak som stiahol nejaky subor LAT2-16.FNT, pouzil nan BIN2PAS, skonsolidoval unitu a tato ASM procedura fungovala, vynechal som vsak

procedure Font1; assembler;

//EDIT2: Ten stiahnuty font bol zo hrozne starej grafickej karty Hercules (roky 1982) alebo Unixu/FreeBSD tak vyskusam najst dajake ine (klasika DOS) alebo pouzijem tieto (mali male problemy s ramcami ale to nevadi, diakritiku zobrazovali spravne).

Diky!!!

inflater

P.S.: JM, posli mi prosim tvoj email/ICQ cislo na moje PM (personal message) aby som ta mohol kontaktovat keby som mal nejake nejasnosti. Totiz s ASM si si uzil toho dost :D
inflater
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků