Vazeny pane inzenyre, zasilam Vam slibene priklady jako doplnky k Architekture PC. Jsou psany pro Turbo Assembler, nevyuzivaji zadne speciality novych verzi, atd. Je k nim dodan kratky DEMO program pro jejich vyuziti v PASCALU. Tykaji se: - obsluhy LED na klavesnici PC - prevodu HEX-DEC - prace se stavovymi promennymi klavesnice v BIOSu Jsou to jenom malickosti, ale treba nekomu pomohou... Tomas Pitner tomp@informatics.muni.cz PRIKL.ASM ; ; Priklady prace s promennymi BIOSu, s klavesnici,... ; V prostredi Borland Pascalu mozno prekladat pomoci Tools, Turbo Assembler ; nebo primo: ; TASM .MODEL MEDIUM, PASCAL ; pro linkovani s Pascalem LOCALS ; pouziva lokalni navesti - @@ .CODE ; zacatek kodoveho segmentu ;----------------------------------------------------------------------------- ; Prevod 16 bitoveho slova na retezec HEXA cifer ; Deklarace v Pascalu: HEX2ASC ( Cislo: word, var Retezec: string ); ;----------------------------------------------------------------------------- HEX2ASC PROC FAR Source: WORD, Dest: DWORD USES AX,BX,CX,DX,DS PUBLIC HEX2ASC mov cx,Source mov dx,cx ror dx,4 and cx,0F0Fh and dx,0F0Fh add cx,'00' add dx,'00' mov ah,'9' mov al,'A'-'0'-10 cmp dh,ah jb @1 add dh,al @1: cmp dl,ah jb @2 add dl,al @2: cmp ch,ah jb @3 add ch,al @3: cmp cl,ah jb @4 add cl,al @4: lds BX,Dest mov byte ptr [bx],4 mov [bx+1],dh mov [bx+2],ch mov [bx+3],dl mov [bx+4],cl ret HEX2ASC ENDP ;----------------------------------------------------------------------------- ; Prevede momentalni stav kontrolniho slova klavesnice v BIOSu na retezec ; ve formatu Pascalu, tj.: ; 0. byte delka ; 1.- delka. byte - vlastni retezec ; Deklarace: FLG2ASC ( var Cil: string ); ; mala pismena = 0, velka pismena = 1 ; RS - Right Shift LC - Left Control ; LS - Left Shift LA - Left Alt ; CT - Control RQ - System Request ; AL - Alt PA - Pause ; SS - Stav Scroll Locku PS - Pressed Scroll Lock ; SN - Stav Num Locku PN - Pressed Num Lock ; SC - Stav Caps Locku PC - Pressed Caps Lock ; SI - Stav Insert/Overwrite PI - Pressed Insert ;----------------------------------------------------------------------------- FLG2ASC PROC FAR Dest: DWORD PUBLIC FLG2ASC push ds xor ax,ax mov ds,ax ASSUME DS:BIOS mov dx,word ptr ds:[417h] pop ds ASSUME DS:@DATA les di, Dest mov al, 48 stosb mov si, offset KEY mov cx,16 @@0: lodsw ror dx,1 jc @@1 add ax,2020h @@1: xchg al,ah stosw mov al,' ' stosb loop @@0 ret FLG2ASC ENDP .DATA KEY DW 'RS','LS','CT','AL','SS','SN','SC','SI' DW 'LC','LA','RQ','PA','PS','PN','PC','PI' ;----------------------------------------------------------------------------- ; Priklad obsluhy LED indikatoru na klavesnici ; 1. Zapamatuje si stav LED ; 2. Vytvori "svetelneho hada" ; 3. Po stisku SHIFT, ALT nebo CTRL obnovi puv. stav LED a skonci ; Volani: LED_CNT ;----------------------------------------------------------------------------- Keybrd equ 60h .CODE OldLock DW ? LED_CNT PROC FAR PUBLIC LED_CNT USES DS xor ax,ax mov ds,ax ASSUME DS:BIOS,CS:@CODE mov dx,[BIOS:417h] mov OldLock,dx hlt @@0: mov bl,1 mov cx,3 @@1: mov al,0EDh out Keybrd,al hlt mov al,bl out Keybrd,al rol bl,1 hlt hlt hlt hlt hlt hlt hlt hlt hlt test byte ptr [BIOS:417h],0Fh jne Hotovo loop @@1 jmp @@0 Hotovo: mov dx,OldLock mov [BIOS:417h],dx mov al,0EDh out Keybrd,al hlt mov al,dl ror al,4 and al,7 out Keybrd,al ret LED_CNT ENDP BIOS SEGMENT AT 0 BIOS ENDS END PRIKL.PAS { Zdrojovy text kratkeho DEMA v Pascalu } program Priklady; uses crt; procedure HEX2ASC ( W: WORD; VAR S: STRING ); far; external; procedure FLG2ASC ( VAR S : STRING ); far; external; procedure LED_CNT; far; external; {$L PRIKL} VAR S: STRING; c: char; begin repeat clrscr; writeln ('Demo pouziti assemblerovskych rutin v Pascalu'); writeln ('

riznaky klavesnice, ED na klavesnici, EX to ASCII string, onec'); c:=UpCase(readkey); case c of 'P': begin writeln('Pro ukonceni stiskni klavesu'); repeat flg2asc(s); gotoxy(15,10); write(s); until keypressed; end; 'L': begin writeln('Pro ukonceni stiskni SHIFT, ALT nebo CTRL'); LED_CNT; end; 'H': begin clrscr; HEX2ASC ( $ABCD, S ); writeln ( 'Priklad: $ABCD se prevede na: ',S ); writeln('Pro ukonceni stiskni klavesu'); c:=readkey; end; end; until c='K'; end.