264
10. Przykłady programów
znaków, wówczas kolejny znak jest ignorowany, przerwanie zerowane i jest generowany krótki sygnał dźwiękowy. Bufor klawiatury jest zorganizowany w sposób cykliczny. Dwa wskaźniki obejmują nie przeczytane jeszcze przez program znaki. Wskaźnik BUFFERHEAD zwiększa się o 2, każdorazowo po zapamiętaniu kolejnego znaku (po obsłużeniu przerwania 09H). Wskaźnik BUFFER TAIŁ zwiększa się z kolei o 2, po odczytaniu przez program kolejnego znaku w buforze. Jeżeli oba wskaźniki mają laką samą wartość, to bufor jest pusty. Oba wskaźniki zmieniają swój stan podobnie jak licznik modulo 16. Według opisanej reguły (jeżeli aktywny = 1) procedura duszek wpisuje znaki do bufora klawiatury pobierając je z tablicy.
Czytelnik może wprowadzić w programie szereg zmian, a w szczególności
- Wypełnić tablicę właściwymi kodami zgodnie z tym, jakie ma być działanie programu. W zamieszczonym listingu program odszukuje w kartotekach właściwy program demonstracyjny i po wyświetleniu ładnego obrazka wyłącza się. (Czytelnicy mający dostęp do komputera z pakietem EGA zorientują się zapewne szybko, co ukryte jest pod firmową nazwą "cheryl"...).
- Usunąć linię 263 (mov aktywny,0), co spowoduje, że program będzie realizowany cyklicznie.
- Włączyć do procedury duszek kontroli bieżącego czasu i uaktywnianie programu o ściśle określonej godzinie (np. koledze pracusiowi włącza się o godz. 00.00 coś bardzo dziwnego).
- Dorobić fragment programu umożliwiający wypełnianie tablicy wprost z klawiatury.
"duch"
1
9
a*
3
4
5
6
7
8
9 = 0060
10 = 0061
11 = 0040
12 = 0021
13 = 001A
14 = 001C
15 = 003E
16 = 001E
17 = 004A
18 = 004E
Pagc 1-1
page 60,130 title "duch"
%out Program "duch"
deklaracje adresów i kodów w BIOS ROM dla IBM XT116,17 ]
KB IN |
equ 60H |
; keyboard scan codę port |
KBCTL |
cqu 6111 |
; control bits for KB sense data |
DOSDS |
equ 4011 |
; DOS data segment |
CALL DOS |
equ 21H | |
BUFFERHEAD |
equ 1AH | |
BUFFERJTAIL |
cqu ICH | |
END OF BUFFER |
equ 3EH | |
KBBUFI^ER |
equ 1EH | |
SCANCODEJ |
equ 4AH |
; kod znaku "-" na prawym polu klawiatury |
SCAN CODE 2 |
equ 4EH |
; kod znaku " + " na prawym polu klawiatury |
19
20 21
22
23
24
25
26 0000 ????
definicja struktury dla adresów logicznych (wektorów przerwań)
wektor struć
rejestrip dw ?
; stan rejestru IP
27 0002 ???? 28 0004 29 30 |
rcjestrcs dw ? wektor cnds |
; stan rejestru CS |
31 |
; segment programu - program typu |
.COM |
32 33 34 |
; (wraz z deklaracją PSP) | |
35 0000 |
program segment | |
36 37 |
assume cs:program.ds:program,es:program,ss:program | |
38 0000 CD 20 |
int 20H |
; program segment prefix (zob. tabl. 8.2) |
39 0002 ???? |
top mem dw? |
; wskaźnik pierwszego wolnego segmentu |
40 0004?? |
db? |
4 |
41 0005 0005[ 42 ?? |
db 5 dup (?) |
; międzysegmentowe wywołanie funkcji 00H2411 |
43 44 |
i | |
45 000A ???? 46 OOOC ???? 47 |
terminate wektor < > |
; adres kontynuacji |
48 OOOE ???? 49 0010???? 50 |
break wektor < > |
; adres obsługi Ctrl-Break |
51 0012???? 52 0014 ???? 53 |
error wektor < > |
; adres obsługi błędu |
54 0016???? |
dw ? | |
55 0018 0014[ 56?? |
db 20 dup (?) |
; "otoczenie programowe" |
duch" |
Page 1-2 | |
57 58 |
i | |
59 002C ???? |
cnvironmcnt dw? | |
60 002E 0007[ 61 ???? 62 ] 63 |
dw 7 dup (?) | |
64 003C 0014[ 65 ?? 66 ) • 67 68 |
db 20 dup (?) | |
69 0050 |
dosycali proc far | |
70 0050 CD 21 |
int CALL_DOS |
; "int 21H" oraz "ret" międzysegmentowy |
71 0052 CB 72 |
ret | |
73 |
doscall endp | |
74 0053 0009[ 75 ?? 76 ] 77 |
db 9 dup (?) | |
78 005C 0010[ 79 ?? |
fcbl db 16 dup (?) |
; bloki sterujące dla plików |