summaryrefslogtreecommitdiff
path: root/sem2/lab5
diff options
context:
space:
mode:
Diffstat (limited to 'sem2/lab5')
-rw-r--r--sem2/lab5/DumpTSR.asm291
-rw-r--r--sem2/lab5/TD/TD.EXEbin0 -> 192448 bytes
-rw-r--r--sem2/lab5/TD/TD.OVLbin0 -> 108640 bytes
-rw-r--r--sem2/lab5/TD/TD386.EXEbin0 -> 23504 bytes
-rw-r--r--sem2/lab5/TD/TDCONFIG.TDbin0 -> 1059 bytes
-rw-r--r--sem2/lab5/TD/TDH386.SYSbin0 -> 6428 bytes
-rw-r--r--sem2/lab5/TD/TDHELP.TDHbin0 -> 114748 bytes
-rw-r--r--sem2/lab5/TD/TDINST.EXEbin0 -> 81692 bytes
-rw-r--r--sem2/lab5/TD/TDMAP.EXEbin0 -> 16240 bytes
-rw-r--r--sem2/lab5/TD/TDREMOTE.EXEbin0 -> 19932 bytes
-rw-r--r--sem2/lab5/TD/TDRF.EXEbin0 -> 16470 bytes
-rw-r--r--sem2/lab5/TD/TDSTRIP.EXEbin0 -> 11954 bytes
-rw-r--r--sem2/lab5/examp.asm54
-rw-r--r--sem2/lab5/gavno.asm26
-rw-r--r--sem2/lab5/jee.asm27
-rw-r--r--sem2/lab5/resident.asm30
-rw-r--r--sem2/lab5/run.bat3
-rw-r--r--sem2/lab5/task.asm114
-rw-r--r--sem2/lab5/test.asm105
19 files changed, 650 insertions, 0 deletions
diff --git a/sem2/lab5/DumpTSR.asm b/sem2/lab5/DumpTSR.asm
new file mode 100644
index 0000000..fd3fad9
--- /dev/null
+++ b/sem2/lab5/DumpTSR.asm
@@ -0,0 +1,291 @@
+.MODEL Tiny
+.286
+.CODE
+ORG 100h
+
+LOCALS ; , @@
+
+TSRKeyCode = 2000h ; Alt+D
+
+Start:
+
+ jmp SetIntVec ;
+
+; 9 ( )
+Handler9:
+ pushf ; ( )
+ call dword ptr cs:OldInt9 ; 9
+ ;
+ pusha ;
+ cmp byte ptr cs:BusyFlag,0 ; ( , - , Alt+D )
+ jne @@Exit9 ; ,
+ mov ah,11h ; ( )
+ int 16h ; - - ( )
+ jz @@Exit9 ; ,
+ cmp ax,TSRKeyCode ;
+ jne @@Exit9 ; ,
+ sti ; ( ... , )
+ mov ah,10h
+ int 16h ;
+ mov byte ptr cs:BusyFlag,1 ;
+ ; /
+ push ds
+ push es ; DS, ES
+ call MainTSRProc ;
+ pop es
+ pop ds ; ES, DS
+ mov byte ptr cs:BusyFlag,0 ; 0 ( , - , Alt+D )
+ @@Exit9:
+ popa ;
+ iret ;
+
+;
+MainTSRProc proc
+ ;
+ mov ah,0Fh
+ int 10h ; AL , BH
+ cmp al,3 ; 3 ( 8025)
+ je @@OkVideoMode ; ,
+ ;
+ mov al,7
+ int 29h ; ( )
+ ret ;
+ ; , ,
+ @@OkVideoMode:
+ mov cs:[VideoPage],bh ;
+ mov ah,3
+ int 10h ; CX
+ mov cs:[OldCurSize],cx ;
+ mov bp,sp
+ mov ax,[bp+2+4+16] ; (2 - , 4 - ds,es, 16 - pusha)
+ mov cs:[DumpAddr],ax
+ mov ax,[bp+2+4+16+2] ;
+ mov cs:[DumpAddr+2],ax
+ ;
+ xor ax,ax
+ mov ds,ax ; DS = 0
+ mov si,ds:[44Eh] ; SI = , ( )
+ mov cs:[VideoOffset],si ;
+ mov ax,0B800h
+ mov ds,ax ; DS =
+ push cs
+ pop es ; ES =
+ lea di,ScreenBuffer ; DI = ( )
+ mov cx,80*25
+ cld ;
+ rep movsw ; (CX DS:SI ES:DI)
+ ;
+ mov ah,1
+ mov ch,20h ;
+ int 10h ;
+ ;
+ push ds
+ pop es ;
+ push cs
+ pop ds ; DS =
+ mov di,[VideoOffset] ; DI =
+ mov ax,1BC9h ; (AH)
+ stosw ; (AX) (ES:DI, DI=DI+2)
+ mov al,205 ;
+ mov cx,78
+ rep stosw ; 78
+ mov al,187 ;
+ stosw
+ mov cx,23
+ @@Vert: mov al,186 ;
+ cmp cl,3
+ jne @@1
+ mov al,199 ; 3-
+ @@1: stosw
+ mov al,' ' ;
+ cmp cl,3
+ jne @@2
+ mov al,196 ; 3-
+ @@2: push cx
+ mov cx,78
+ rep stosw
+ pop cx
+ mov al,186 ;
+ cmp cl,3
+ jne @@3
+ mov al,182 ; 3-
+ @@3: stosw
+ loop @@Vert
+ mov al,200 ;
+ stosw
+ mov al,205 ;
+ mov cx,78
+ rep stosw ; 78
+ mov al,188 ;
+ stosw
+ ;
+ mov ah,1Eh ;
+ lea si,HelpText1
+ mov di,(22*80 + 6)*2
+ call ShowText ;
+ mov di,(23*80 + 3)*2
+ call ShowText ; (SI HelpText2, .. HelpText1)
+ ;
+ @@MainLoop:
+ call ShowDump ;
+ mov ah,10h
+ int 16h ;
+ cmp ax,4BE0h ;
+ jne @@R
+ dec [DumpAddr] ; 1
+ @@R: cmp ax,4DE0h ;
+ jne @@CL
+ inc [DumpAddr] ; 1
+ @@CL: cmp ax,73E0h ; Ctrl+
+ jne @@CR
+ sub [DumpAddr],100h ; 100h
+ @@CR: cmp ax,74E0h ; Ctrl+
+ jne @@U
+ add [DumpAddr],100h ; 100h
+ @@U: cmp ax,48E0h ;
+ jne @@D
+ dec [DumpAddr+2] ; 1
+ @@D: cmp ax,50E0h ;
+ jne @@PU
+ inc [DumpAddr+2] ; 1
+ @@PU: cmp ax,49E0h ; Page Up
+ jne @@PD
+ sub [DumpAddr+2],100h ; 100h
+ @@PD: cmp ax,51E0h ; Page Down
+ jne @@E
+ add [DumpAddr+2],100h ; 100h
+ @@E: cmp ax,11Bh ; Esc
+ jne @@MainLoop
+ ;
+ lea si,ScreenBuffer ; SI =
+ mov di,[VideoOffset] ; DI =
+ mov cx,80*25
+ rep movsw ; : (CX DS:SI ES:DI)
+ ;
+ mov ah,1
+ mov bh,[VideoPage] ;
+ mov cx,[OldCurSize] ;
+ int 10h ;
+ ret
+MainTSRProc endp
+
+; DS:SI AH ES:DI
+ShowText proc
+ @@Char: lodsb ;
+ test al,al ;
+ jz @@Ret ; ,
+ stosw ;
+ jmp @@Char ;
+ @@Ret: ret
+ShowText endp
+
+; AL AH 16- ES:DI
+ShowByte proc
+ push ax
+ shr al,4 ;
+ cmp al,9
+ jbe @@1
+ add al,'A'-('9'+1)
+ @@1: add al,'0' ; 16-
+ stosw ;
+ pop ax
+ and al,0Fh ;
+ cmp al,9
+ jbe @@2
+ add al,'A'-('9'+1)
+ @@2: add al,'0' ; 16-
+ stosw ;
+ ret
+ShowByte endp
+
+; DX AH 16- ES:DI
+ShowWord proc
+ mov al,dh
+ call ShowByte
+ mov al,dl
+ call ShowByte
+ ret
+ShowWord endp
+
+ShowDump proc
+ push ds
+ lds si,dword ptr [DumpAddr] ; DS:SI =
+ mov di, (1*80 + 2)*2 ;
+
+ mov cx,20 ; 20
+ @@1: push cx
+ mov ah,1Bh ; -
+ mov dx,ds
+ call ShowWord ;
+ mov al,':'
+ stosw ;
+ mov dx,si
+ call ShowWord ;
+
+ mov cx,16 ; 16
+ mov ax,1320h ; -
+ stosw ;
+ @@2: mov al,' '
+ stosw ;
+ lodsb ; DS:SI (SI=SI+1)
+ call ShowByte ; 16-
+ loop @@2
+
+ mov al,' '
+ stosw
+ stosw ; 2
+ mov cx,16 ; 16
+ sub si,cx ; 16
+ mov ah,12h ; -
+ @@3: lodsb ; DS:SI (SI=SI+1)
+ stosw ;
+ loop @@3
+
+ pop cx
+ add di,160-(9+1+3*16+2+16)*2 ;
+ loop @@1
+ pop ds
+ ret
+ShowDump endp
+
+BusyFlag db 0 ; (0 - , 1 - )
+HelpText1 db 27,'/',26,' - one byte offset scroll, Ctrl',27,'/Ctrl',26,' - 100h bytes offset scroll',0
+HelpText2 db 24,'/',25,' - one segment scroll, PageUp/PageDn - 100h segments scroll, Esc - exit',0
+
+TSRCodeEnd = $ ; ( )
+
+OldInt9 dw ?,? ; 9
+DumpAddr dw ?,? ;
+OldCurSize dw ? ;
+VideoOffset dw ? ; ( )
+VideoPage db ? ;
+ScreenBuffer dw 80*25 dup (?) ;
+
+TSREnd = $ ;
+ORG TSRCodeEnd ; ( , )
+
+;
+SetIntVec:
+ mov ax,3509h ; 9 ( )
+ int 21h ;
+ mov OldInt9[0],bx ;
+ mov OldInt9[2],es ;
+ mov ah,25h ; - (AL=9 35h)
+ lea dx,Handler9 ; DS:DX =
+ int 21h ;
+
+ mov ah,49h ;
+ mov es,ds:[2Ch] ;
+ int 21h ; ( )
+
+ mov ah,9 ; ( '$')
+ lea dx,MsgInstalled ;
+ int 21h ;
+
+ lea dx,TSREnd ;
+ int 27h ; ,
+
+MsgInstalled db 'DumpTSR is successfully installed!',13,10
+ db 'Press <Alt>+<D> to activate.',13,10,'$'
+
+END Start
diff --git a/sem2/lab5/TD/TD.EXE b/sem2/lab5/TD/TD.EXE
new file mode 100644
index 0000000..8b8ef4e
--- /dev/null
+++ b/sem2/lab5/TD/TD.EXE
Binary files differ
diff --git a/sem2/lab5/TD/TD.OVL b/sem2/lab5/TD/TD.OVL
new file mode 100644
index 0000000..91fdc3a
--- /dev/null
+++ b/sem2/lab5/TD/TD.OVL
Binary files differ
diff --git a/sem2/lab5/TD/TD386.EXE b/sem2/lab5/TD/TD386.EXE
new file mode 100644
index 0000000..ac749ac
--- /dev/null
+++ b/sem2/lab5/TD/TD386.EXE
Binary files differ
diff --git a/sem2/lab5/TD/TDCONFIG.TD b/sem2/lab5/TD/TDCONFIG.TD
new file mode 100644
index 0000000..bfdf827
--- /dev/null
+++ b/sem2/lab5/TD/TDCONFIG.TD
Binary files differ
diff --git a/sem2/lab5/TD/TDH386.SYS b/sem2/lab5/TD/TDH386.SYS
new file mode 100644
index 0000000..0bfe7bc
--- /dev/null
+++ b/sem2/lab5/TD/TDH386.SYS
Binary files differ
diff --git a/sem2/lab5/TD/TDHELP.TDH b/sem2/lab5/TD/TDHELP.TDH
new file mode 100644
index 0000000..3813e4e
--- /dev/null
+++ b/sem2/lab5/TD/TDHELP.TDH
Binary files differ
diff --git a/sem2/lab5/TD/TDINST.EXE b/sem2/lab5/TD/TDINST.EXE
new file mode 100644
index 0000000..07d427b
--- /dev/null
+++ b/sem2/lab5/TD/TDINST.EXE
Binary files differ
diff --git a/sem2/lab5/TD/TDMAP.EXE b/sem2/lab5/TD/TDMAP.EXE
new file mode 100644
index 0000000..e5bc453
--- /dev/null
+++ b/sem2/lab5/TD/TDMAP.EXE
Binary files differ
diff --git a/sem2/lab5/TD/TDREMOTE.EXE b/sem2/lab5/TD/TDREMOTE.EXE
new file mode 100644
index 0000000..d7d335a
--- /dev/null
+++ b/sem2/lab5/TD/TDREMOTE.EXE
Binary files differ
diff --git a/sem2/lab5/TD/TDRF.EXE b/sem2/lab5/TD/TDRF.EXE
new file mode 100644
index 0000000..a49d4d0
--- /dev/null
+++ b/sem2/lab5/TD/TDRF.EXE
Binary files differ
diff --git a/sem2/lab5/TD/TDSTRIP.EXE b/sem2/lab5/TD/TDSTRIP.EXE
new file mode 100644
index 0000000..6913771
--- /dev/null
+++ b/sem2/lab5/TD/TDSTRIP.EXE
Binary files differ
diff --git a/sem2/lab5/examp.asm b/sem2/lab5/examp.asm
new file mode 100644
index 0000000..4da04fa
--- /dev/null
+++ b/sem2/lab5/examp.asm
@@ -0,0 +1,54 @@
+new_65h proc
+ ;Процедура наложения на экран цветного окна для динамической
+ ;очистки экрана по ходу выполнения программы
+ mov АН, 06h ;Функция задания окна
+ mov AL,0 ;Режим создания окна
+ mov BH,1Bh ;Атрибут всех символов в окне: светло-бирюзовые символы, синий фон
+ mov СХ,0 ;Координаты верхнего левого угла 0,0
+ mov DH,24 ;Нижняя Х-координата
+ mov DL,79 ;Правая Х-координата
+ int 10h ;Прерывание BIOS
+ iret
+new_65h endp
+
+main proc
+ mov AX,data
+ mov DS,AX
+ ;Заполним вектор прерывания пользователя адресом нашего обработчика
+ mov АН,25h ;Функция заполнения вектора прерывания
+ mov AL,65h ;Номер вектора
+ mov DX,offset new_65h ;Смещение прикладного обработчика
+ push DS ;Сохранны DS
+ push CS ;Настроим DS на сегмент команд (в
+ pop DS ;котором находится наш обработчик)
+ int 21h ;Вызовем DOS
+ pop DS ;Восстановим DS
+ ;Будем в цикле выводить ил экран строки с предварительной очисткой экрана
+ gogo:
+ int 65h ;Вызов прикладного обработчика (очистка
+ ;экрана перед выводом текста)
+ ;Позиционируем курсор
+ mov АН,02h ;Функция позиционирования
+ mov BH,0 ;Видеостраница
+ mov DH,line ;Строка
+ mov DL,coloumn ;Столбец
+ int 10h ;Прерывание BIOS
+
+ ;Выведем на экран строку символов
+ mov АН,0Ah ;функция вывода символа без атрибута
+ mov AL,sym ;Символ
+ mov BH,0 ;Видеостраница
+ mov СХ,60 ;Коэффициент повторения
+ int 10h ;Прерывание BIOS
+ ;Изменим символ и позицию и зациклим программу с возможностью
+ ;завершения по нажатию клавиш /C
+ inc sym ;Следующий символ по таблице ASCII
+ inc line ;Следующая строка экрана
+ mov АН,08h ;Функция ввода баз эха, чувствует /C
+ int 21h
+ jmp gogo ;Бесконечный цикл
+main endp ;Поля данных
+
+line db 2 ;Строка
+coloumn db 10 ;Столбец
+sym db 0lh ;Выводимый символ \ No newline at end of file
diff --git a/sem2/lab5/gavno.asm b/sem2/lab5/gavno.asm
new file mode 100644
index 0000000..5748c72
--- /dev/null
+++ b/sem2/lab5/gavno.asm
@@ -0,0 +1,26 @@
+.model small
+.DATA
+Old_09h dw 0,0
+
+.code
+.386
+
+New09h:
+ mov ah, 02h
+ mov dl, 'A'
+ int 21h
+ jmp dword ptr cs:Old_09h
+
+Init:
+ mov ah, 09h
+ mov dx, offset Msg
+ int 21h
+ mov ax, 3509h
+ int 21h
+ mov Old_09h, bx
+ mov Old_09h+2, es
+ mov ax, 2509h
+ lea dx, New09h
+ int 21h
+
+end \ No newline at end of file
diff --git a/sem2/lab5/jee.asm b/sem2/lab5/jee.asm
new file mode 100644
index 0000000..233abc6
--- /dev/null
+++ b/sem2/lab5/jee.asm
@@ -0,0 +1,27 @@
+.model tiny
+.code
+.startup
+
+jmp Init
+
+Old_09h dw 0,0
+
+New09h:
+ mov ah, 02h
+ mov dl, 'A'
+ int 21h
+ jmp dword ptr cs:Old_09h
+
+Init:
+ mov ah, 09h
+ mov dx, offset Msg
+ int 21h
+ mov ax, 3509h
+ int 21h
+ mov Old_09h, bx
+ mov Old_09h+2, es
+ mov ax, 2509h
+ lea dx, New09h
+ int 21h
+
+end \ No newline at end of file
diff --git a/sem2/lab5/resident.asm b/sem2/lab5/resident.asm
new file mode 100644
index 0000000..4c7914c
--- /dev/null
+++ b/sem2/lab5/resident.asm
@@ -0,0 +1,30 @@
+.model tiny
+.code
+.startup
+
+jmp Init
+
+Msg db 'Resident module installed!',10,13,'$'
+Old_09h dw 0,0
+
+New09h:
+mov ah, 02h
+mov dl, 'A'
+int 21h
+jmp dword ptr cs:Old_09h
+
+Init:
+mov ah, 09h
+mov dx, offset Msg
+int 21h
+mov ax, 3509h
+int 21h
+mov Old_09h, bx
+mov Old_09h+2, es
+mov ax, 2509h
+lea dx, New09h
+int 21h
+lea dx, Init
+int 27h
+
+end \ No newline at end of file
diff --git a/sem2/lab5/run.bat b/sem2/lab5/run.bat
new file mode 100644
index 0000000..452833f
--- /dev/null
+++ b/sem2/lab5/run.bat
@@ -0,0 +1,3 @@
+C:\TASM.EXE %1
+C:\TLINK.EXE %1
+%1.EXE
diff --git a/sem2/lab5/task.asm b/sem2/lab5/task.asm
new file mode 100644
index 0000000..e99eb6d
--- /dev/null
+++ b/sem2/lab5/task.asm
@@ -0,0 +1,114 @@
+.model small
+.data
+old_9 dd 0
+mesg db "To exit press ESC! $"
+mes2 db "Pressed$"
+mess DB "GG$"
+B_UP equ 72 ; вверх
+B_DN equ 80 ; вниз
+B_BS equ 75 ; влево
+B_FWD equ 77 ; вправо
+minAdress DB 0
+step DB 1 ;КОЛИЧЕСТВО СЧИТЫВАЕМЫХ БАЙТ
+tmp DB 4 dup (0)
+
+.stack 100h
+.code
+
+pInitTmp PROC ;инициализация TMP из BX
+ MOV cx, 0004h ; счеткчик выполняем 4 раза
+ MOV si, 0000h ; индекс масcисва - i
+
+ mLoop:
+ PUSH cx
+
+ MOV cl, 04h
+ MOV tmp[si], bl
+ ; сдвиги итераций
+ SHL tmp[si], cl ;сдвиг вправа
+ SHR tmp[si], cl
+ SHR bx, cl
+
+ POP cx ;извлечение счётчика заносим в стек
+ INC si
+ LOOP mLoop
+
+ RET
+pInitTmp ENDP
+
+pPrintTmp PROC ;вывод TMP
+ MOV cx, 0004h; начинаем с 3 4 раза и до нуля выводим этот массив
+ MOV si, 0003h
+
+ mLoop0:
+ MOV dl, tmp[si]
+ DEC si
+ CALL pPrintNum
+ LOOP mLoop0
+
+ MOV dl, 20h
+ CALL pPrintCh
+
+ RET
+pPrintTmp ENDP
+
+pPrintNum PROC ;показывает 1 16-ричный разряд из DL ;
+ ADD dl, 30h ;
+ CMP dl, 3Ah ;
+
+ JL metka
+ ADD dl, 07h ;
+
+ metka:
+ MOV ah, 02h
+ INT 21h
+
+ RET
+pPrintNum ENDP
+
+pPrintCh PROC ;show CHAR
+ MOV ah, 02h
+ INT 21h
+
+ RET
+pPrintCh ENDP
+
+pPrintStr PROC ;показывает STRING
+ MOV ah, 09h
+ INT 21h
+ MOV dl, 0Ah
+ CALL pPrintCh
+
+ RET
+pPrintStr ENDP
+
+pDIByte PROC ;показывает BH
+ mov bx, [cs:di]
+ XCHG bl, bh ; xchg = swap
+ CALL pInitTmp
+ MOV cx, 0002h ;каждый из 4 элементов массива это одна из стрелочек
+ MOV si, 0003h
+
+ mLoop4:
+ MOV dl, tmp[si]
+ DEC si
+ CALL pPrintNum
+ LOOP mLoop4
+
+ INC di
+ MOV dl, 20h
+ CALL pPrintCh
+
+ RET
+pDIByte ENDP
+
+start:
+my9 proc far
+
+ push ax
+ push bx
+ push es
+ push si
+ in al,60h ;Проверяем не нажата ли клавиша UP
+ ADD al, 00h
+END start \ No newline at end of file
diff --git a/sem2/lab5/test.asm b/sem2/lab5/test.asm
new file mode 100644
index 0000000..4006e27
--- /dev/null
+++ b/sem2/lab5/test.asm
@@ -0,0 +1,105 @@
+.model small
+.data
+int09h dw 2 dup (0)
+msg db "To exit press ESC! $"
+tsr_end equ $
+; B_UP equ 1Ch ; вверх
+
+.stack 100h
+.486
+.code
+
+; pNewInterrupt PROC far
+; PUSHF
+
+; PUSH ax
+
+; in al, 60h ; Читаем сканкод
+; cmp al, B_UP
+; JE hotkey
+
+; ; ; Наш код
+; ; mov dx, offset mesg
+; ; MOV ah,09h
+; ; INT 21h
+
+; POP ax
+; POPF
+; PUSHF
+
+; CALL cs:[int09h]
+; jmp exit
+
+; hotkey:
+; ; Обработка аппаратного прерывания
+; in al,61h
+; mov ah,al
+; or al,80h
+; out 61h,al
+; xchg ah,al
+; out 61h,al
+; mov al,20h
+; out 20h,al
+
+; ; Наш код
+; mov dx, offset mesg
+; MOV ah,09h
+; INT 21h
+
+; exit:
+; POPF
+; IRET
+
+; pNewInterrupt ENDP
+
+
+start:
+ JMP program
+
+pNewInterrupt PROC far
+ PUSHF
+ CALL dword ptr cs:int09h
+ IRET
+pNewInterrupt ENDP
+
+program:
+
+ MOV ax, @DATA
+ MOV ds, ax
+
+ ; MOV ax,3509h ;Hook interrupt 09H
+ ; INT 21h
+ ; MOV word ptr int09h,bx
+ ; MOV word ptr int09h[2],es
+
+ ; ; MOV ax, 2509h
+ ; ; MOV dx, offset pNewInterrupt
+ ; ; INT 21h
+
+ ; ; Восстанавливаем прерывание
+ ; MOV ax, 2509h
+ ; MOV ds, word ptr int09h[2]
+ ; MOV dx, offset int09h
+ ; INT 21h
+ ; INT 09h
+
+ MOV ax, 3509h
+ INT 21h
+ MOV word ptr int09h, bx
+ MOV word ptr int09h[2], es
+
+ MOV ax, 2509h
+ MOV dx, offset pNewInterrupt
+ INT 21h
+
+ MOV ah,09h
+ MOV dx, offset msg
+ INT 21h
+
+ MOV dx, offset tsr_end
+ INT 27h
+
+ ; ; Выходим из программы
+ ; MOV ax, 4c00h
+ ; INT 21h
+END start \ No newline at end of file