model small
.stack 100h
.data
NAPIS1 db 0ah,0dh,'Linia komend:$'
NAPIS2 db 'Linia komend jest pusta. $'
NAPIS3 db 0ah,0dh,'(P)rogram (S)egment (P)refix:$'
seg1 db 0ah,0dh,'Kod rozkazu:......................... $'
seg2 db 0ah,0dh,'Pamiec niedostepna dla komutera:..... $'
seg3 db 0ah,0dh,'Zarezerwowane:....................... $'
seg4 db 0ah,0dh,'Adres zakonczenia programu:.......... $'
seg5 db 0ah,0dh,'Adres programu obslugi:.............. $'
seg6 db 0ah,0dh,'Adres obslugi bledu krytycznego:..... $'
seg7 db 0ah,0dh,'Adres otoczenia programu:............ $'
.code
mov ax,@data
mov ds,ax
;--------------------------- 1) LINIA KOMEND ---------------------------------
mov ax,0600h ;czyszczenie ekranu
mov bh,07h
mov cx,0000h
mov dx,184Fh
int 10h
lea dx, NAPIS1 ;wyswatlenie napisu
mov ah, 09h
int 21h
xor si,si ;wyzerowanie si
LiniaKomend: ;wysiwtlanie linii komend
mov dl,[es:81h+si] ;w es jest PSP, si w 1 kroku = 0, przenosi do dl
mov ah, 02h ;wyswietlanie znaku z dl
int 21h
inc si
cmp dl,0dh ; porównuje czy to co odczytane w dl to koniec linii poleceń
jnz LiniaKomend
cmp si, 1 ;porównanie licznika si z '1'
je empty ;jeśli si=1 to linia komend jest pusta
jne blok_psp
empty:
mov ah,02h ;ustawienie kursora na współrzędne 1,13
mov bh,00
mov dh,1
mov dl,13
int 10h
lea dx,NAPIS2 ; wyswietlenie napisu gdy lista pusta
mov ah,09h
int 21h
;------------------------ 2) BLOK PSP Z PODZIAŁEM NA SEGMENTY --------------------
blok_psp:
jmp etykieta
proc etykieta1
cmp ah,57
ja skok1
skok1_out:
ret
etykieta1 endp
proc etykieta2
cmp al,57
ja skok2
skok2_out:
ret
etykieta2 endp
skok1:
add ah,7
jmp skok1_out
skok2:
add al,7
jmp skok2_out
etykieta:
mov ah,7 ;pobieranie znaku z klawiatury bez wyświetlania
int 21h
lea dx, NAPIS3 ;wyswatlenie napisu
mov ah, 09h
int 21h
lea dx, seg1 ;wyswatlenie napisu
mov ah, 09h
int 21h
mov al,[es:00h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:01h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
lea dx, seg2 ;wyswatlenie napisu
mov ah, 09h
int 21h
mov al,[es:02h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
xor si,si
mov al,[es:03h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwi literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
lea dx, seg3 ;wyswatlenie napisu
mov ah, 09h
int 21h
mov al,[es:04h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
xor si,si
lea dx, seg4 ;wyswatlenie napisu
mov ah, 09h
int 21h
mov al,[es:0ah]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:0bh]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:0ch]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:0dh]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
lea dx, seg5 ;wyswatlenie napisu
mov ah, 09h
int 21h
mov al,[es:0eh]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:0fh]
xor ah,ah
mov cl,16
div cl
add ah,48;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:10h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:11h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
lea dx, seg6 ;wyswatlenie napisu
mov ah, 09h
int 21h
mov al,[es:12h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:13h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:14h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:15h]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
lea dx, seg7 ;wyswatlenie napisu
mov ah, 09h
int 21h
mov al,[es:2ch]
xor ah,ah
mov cl,16
div cl
add ah,48
;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
mov al,[es:2dh]
xor ah,ah
mov cl,16
div cl
add ah,48 ;trzeba sprawdzac czy wrejestrze jest liczba wiekasze od 10 czyli powinno wyslwietlic literke a jak mniejsza to musimy dodac 48
add al,48
call etykieta1
call etykieta2
mov bx,ax
mov dl,al
mov ah,02h
int 21h
mov dl,bh
int 21h
lea dx, NAPIS3 ;wyswatlenie napisu
mov ah, 09h
int 21h
xor si,si
mov si,01h
mov ax, 4c00h ;zakonczenie programu
int 21h
;-------------------- 3) OTOCZENIE PROGRAMU -----------------------------------
otoczenie:
mov ah,7
int 21h
mov ah,02h ;ustawienie kursora na współrzędne 0,0
mov bh,00
mov dh,0
mov dl,0
int 10h
mov ax,0600H
mov bh,07h
mov cx,0000h
mov dx,184fh
int 10h
mov dh,0
mov dx,[es:2Ch]
mov es,dx
mov si,0
czytaj:
mov dl,[es:si]
cmp dl,00
je sprawdz
inc si
mov ah,02h
int 21h
jmp skok
sprawdz:
inc si
mov dl,[es:si]
cmp dl,00
je koniec
mov dl,10
mov ah,02h
int 21h
skok:
loop czytaj
koniec:
mov ah,4ch
int 21h
end