Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
05 labda
1. Fealadat3: labda.asm
Feladat meghatározása Implementálás Implementálás
A program célja az assembly rutinok Code Segment cmp di, 20
assume CS:Code, jnc Ido4
időzítési lehetőségeinek bemutatása. DS:Data, SS:Stack mov al, 2
Az időzítés az AH00, INT1Ah funkció Start: jmp Beallit
segítségével történik. A program egy mov ax, Code Ido4:
mov DS, ax mov al, 1
„labda” leesését szimulálja. A labdát Beallit:
egy „O” karakter szimbolizálja, amely xor di, di xor ah, ah
fokozatosan gyorsulva esik le, majd mov si, 1 cmp dx, ax
visszapattan. A visszapattanás xor dx, dx pop ax
veszteségmentes, így a labda push dx
fokozatosan lassulva eléri a kiindulási Torles: jc Kesleltet
mov ax, 03h
pozíciót. int 10h pop cx
push ax
Program bemutatása: mov dx, di
mov dh, dl cmp di, 0
jz Lefele
·A programot először a mov dl, 40
késleltető rutinok nélkül kell xor bh, bh cmp di, 24
mov ah, 02h jz Felfele
megírni. A billentyű figyelés int 10h Mozgas:
helyett az AH00, INT16h add di, si
funkcióval megvalósítható mov dx, offset Labda jmp Torles
mov ah, 09h Lefele:
billentyű leütésre történő int 21h mov si, 1
várakozást kell megírni. Így a Kesleltet: jmp Mozgas
program csak akkor lép a mov ah, 01h Felfele:
int 16h mov si, -1
következő iterációra, ha ;jnz Program_Vege jmp Mozgas
lenyomunk egy billentyűt.
Ellenőrizni kell, hogy a „labda” jz nincsbill Program_Vege:
mov ah, 00h pop cx
nem megy ki a képből. A int 16h mov ax, 4c00h
legalsó pozíciót elérve felfelé cmp al, 27 int 21h
mozog tovább, a legfelső jz Program_Vege
nincsbill: Labda:
pozíció elérését követően xor ah, ah db "O$"
lefele halad. int 1ah
Code Ends
pop cx
·A letesztelt programban push cx Data Segment
módosítani kell a billentyű mov ax, dx Data Ends
leütésre váró részt az AH01, sub dx, cx
push ax Stack Segment
INT16h funkcióra. Ez a Stack Ends
funkció nem állítja meg a cmp di, 5
program futását, mindössze a jnc Ido1 End Start
mov al, 16
FLAG-ek állapotát, illetve az jmp Beallit
AL értékét módosítja, ha volt Ido1:
billentyű leütés. Be kell fejezni cmp di, 10
jnc Ido2
a késleltető programrészt. A mov al, 8
késleltetés alapeleme az jmp Beallit
AH00, INT1Ah funkció, mely Ido2:
cmp di, 15
a rendszeróra CX:DX jnc Ido3
regiszterpárba. Egy számláló- mov al, 4
változás kb. 1/18 sec. jmp Beallit
Ido3:
2. Start
Inicializálás
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
3. Start
Implementálás
Inicializálás Verem
xor di, di ; labda helye (sor)
Inicializálás mov si, 1 ; lefelé indul a labda (irány vektor)
xor dx, dx
régi idő (0)
push dx ; verembe a régi idő (most 0)
;program vége után, még a Code szegmensbe
Labda: db ”o$”
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
4. Start
Implementálás
Képernyő törlés Verem
Torles:
Inicializálás mov ax, 03h
int 10h
régi idő (0)
Torles
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
5. Start
Implementálás
Kurzor pozicionálás Verem
mov dx, di ;(16 bites regisztert használunk)
Inicializálás mov dh, dl ;pozíció DI sor (8 bites)
régi idő (0)
mov dl, 40 ;pozíció 40. oszlop
xor bh, bh
mov ah, 02h
int 10h
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
6. Start
Implementálás
Labda kirakása Verem
mov dx, offset Labda
Inicializálás mov ah, 09h
int 21h
régi idő (0)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
7. Start
Implementálás
Billentyű figyelés (1) Billentyű figyelés (2) Verem
Kesleltet: mov ah, 01h
Inicializálás mov ah, 00h int 16h
int 16h
régi idő (0)
;ha van leütött billentyű, tehát
;időzítő nélküli eset nem üres a billentyűzet puffer,
akkor Z flag értéke 0
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Kesleltet
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
8. Start
Implementálás
Időzítő nélküli eset (1) Időzítős eset (2) Verem
cmp al, 27 jz nincsbill
Inicializálás jz Program_Vege mov ah, 00h
int 16h
régi idő (0)
cmp al, 27
jz Program_Vege
nincsbill:
Képernyő
törlés
Hogyan oldható
Poz < 5 ? Igen ΔT := 16 meg optimálisan,
hogy minden
Kurzor billentyű
pozícionálás Nem lenyomásra
kilépjen?
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
9. Start
Implementálás
Óra beolvasása Verem
xor ah, ah
Inicializálás int 1ah ;óra beolvasása CX:DX -be
régi idő (0)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
10. Start
Implementálás
Eltelt idő kiszámítása (Teltelt) Verem
pop cx ;régi idő kivétele
Inicializálás push cx ;régi idő visszatétele
mov ax, dx ;aktuális idő mentése ax-be aktuális idő
sub dx, cx ;dx-ben a Teltelt = Taktuális - Trégi régi idő (0)
push ax ;aktuális idő mentése a verembe
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
11. Start
Implementálás
Poz < 5 ? Verem
cmp di, 5
Inicializálás jnc Ido1
mov al, 16 aktuális idő
jmp Beallit régi idő (0)
Ido1:
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Ido1
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása Beállít
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
12. Start
Implementálás
Poz < 10 ? Verem
cmp di, 10
Inicializálás jnc Ido2
mov al, 8 aktuális idő
jmp Beallit régi idő (0)
Ido2:
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Ido2
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása Beállít
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
13. Start
Implementálás
Poz < 15 ? Verem
cmp di, 15
Inicializálás jnc Ido3
mov al, 4 aktuális idő
jmp Beallit régi idő (0)
Ido3:
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Ido3
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása Beállít
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
14. Start
Implementálás
Poz < 20 ? Verem
cmp di, 20
Inicializálás jnc Ido4
mov al, 2 aktuális idő
jmp Beallit régi idő (0)
Ido4:
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Ido4 Nem
Nem
ΔT := 1
Óra
beolvasása Beállít
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
15. Start
Implementálás
ΔT := 1 Verem
mov al, 1 ;Egyébként (21-24)
Inicializálás
aktuális idő
régi idő (0)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
16. Start
Implementálás
Teltelt > ΔT ? Verem
Beallit:
Inicializálás xor ah, ah
cmp dx, ax
régi idő (0)
pop ax ;előző idő aktualizálásához kell
jc Kesleltet
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Kesleltet
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása Beállít
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
17. Start
Implementálás
Előző idő aktualizálása Verem
pop cx ;régi idő kivétele a veremből
Inicializálás push ax ;aktuális idő elmentése
régi idő (x)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
18. Start
Implementálás
Poz = 0 ? Verem
cmp di, 0
Inicializálás jz Lefele
régi idő (x)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Lefele
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
19. Start
Implementálás
Poz = 24 ? Verem
cmp di, 24
Inicializálás jz Felfele
régi idő (x)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Felfele Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása
20. Start
Implementálás
Új pozíció kiszámítása Verem
Mozgas:
Inicializálás add di, si ;a labda új pozíciója
jmp Torles
régi idő (x)
Torles
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Mozgas Nem
Új pozíció
kiszámítása
21. Start
Implementálás
Irány beállítása (LE) Verem
Lefele:
Inicializálás mov si, 1
jmp Mozgas
régi idő (x)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Lefele
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Mozgas Nem
Új pozíció
kiszámítása
22. Start
Implementálás
Irány beállítása (FEL) Verem
Felfele:
Inicializálás mov si, -1
jmp Mozgas
régi idő (x)
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Felfele Irány
Poz = 24 ? Igen beállítása
(FEL)
Mozgas Nem
Új pozíció
kiszámítása
23. Start
Implementálás
Program Vége Verem
pop cx ;vermet úgy adjuk vissza, ahogy
Inicializálás kaptuk! A verembe maradt értéket egy „szemét”-regiszterbe
kitesszük!
Képernyő
törlés
Poz < 5 ? Igen ΔT := 16
Kurzor
pozícionálás Nem
Poz < 10 ? Igen ΔT := 8
Labda
kirakása Nem
Poz < 15 ? Igen ΔT := 4
Billentyű
figyelés Nem
Poz < 20 ? Igen ΔT := 2
ESC ? Igen Program Vége
Nem
Nem
ΔT := 1
Óra
beolvasása
Előző idő
Teltelt > ΔT Igen
aktualizálása
Eltelt idő ?
(Teltelt)
kiszámítása
Nem
Irány
Poz = 0 ? Igen
beállítása (LE)
Nem
Irány
Poz = 24 ? Igen beállítása
(FEL)
Nem
Új pozíció
kiszámítása