diff options
| author | Andrew <saintruler@gmail.com> | 2020-10-22 21:03:24 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2020-10-22 21:03:24 +0400 |
| commit | 143f34d941f32e0808fc9344d4c4126ff530d64a (patch) | |
| tree | c79fcf309ad00e52100c0da544d96d3cc6ab6617 /sem2/lab5 | |
Добавил решения второго семестра
Diffstat (limited to 'sem2/lab5')
| -rw-r--r-- | sem2/lab5/DumpTSR.asm | 291 | ||||
| -rw-r--r-- | sem2/lab5/TD/TD.EXE | bin | 0 -> 192448 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TD.OVL | bin | 0 -> 108640 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TD386.EXE | bin | 0 -> 23504 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDCONFIG.TD | bin | 0 -> 1059 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDH386.SYS | bin | 0 -> 6428 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDHELP.TDH | bin | 0 -> 114748 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDINST.EXE | bin | 0 -> 81692 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDMAP.EXE | bin | 0 -> 16240 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDREMOTE.EXE | bin | 0 -> 19932 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDRF.EXE | bin | 0 -> 16470 bytes | |||
| -rw-r--r-- | sem2/lab5/TD/TDSTRIP.EXE | bin | 0 -> 11954 bytes | |||
| -rw-r--r-- | sem2/lab5/examp.asm | 54 | ||||
| -rw-r--r-- | sem2/lab5/gavno.asm | 26 | ||||
| -rw-r--r-- | sem2/lab5/jee.asm | 27 | ||||
| -rw-r--r-- | sem2/lab5/resident.asm | 30 | ||||
| -rw-r--r-- | sem2/lab5/run.bat | 3 | ||||
| -rw-r--r-- | sem2/lab5/task.asm | 114 | ||||
| -rw-r--r-- | sem2/lab5/test.asm | 105 |
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 Binary files differnew file mode 100644 index 0000000..8b8ef4e --- /dev/null +++ b/sem2/lab5/TD/TD.EXE diff --git a/sem2/lab5/TD/TD.OVL b/sem2/lab5/TD/TD.OVL Binary files differnew file mode 100644 index 0000000..91fdc3a --- /dev/null +++ b/sem2/lab5/TD/TD.OVL diff --git a/sem2/lab5/TD/TD386.EXE b/sem2/lab5/TD/TD386.EXE Binary files differnew file mode 100644 index 0000000..ac749ac --- /dev/null +++ b/sem2/lab5/TD/TD386.EXE diff --git a/sem2/lab5/TD/TDCONFIG.TD b/sem2/lab5/TD/TDCONFIG.TD Binary files differnew file mode 100644 index 0000000..bfdf827 --- /dev/null +++ b/sem2/lab5/TD/TDCONFIG.TD diff --git a/sem2/lab5/TD/TDH386.SYS b/sem2/lab5/TD/TDH386.SYS Binary files differnew file mode 100644 index 0000000..0bfe7bc --- /dev/null +++ b/sem2/lab5/TD/TDH386.SYS diff --git a/sem2/lab5/TD/TDHELP.TDH b/sem2/lab5/TD/TDHELP.TDH Binary files differnew file mode 100644 index 0000000..3813e4e --- /dev/null +++ b/sem2/lab5/TD/TDHELP.TDH diff --git a/sem2/lab5/TD/TDINST.EXE b/sem2/lab5/TD/TDINST.EXE Binary files differnew file mode 100644 index 0000000..07d427b --- /dev/null +++ b/sem2/lab5/TD/TDINST.EXE diff --git a/sem2/lab5/TD/TDMAP.EXE b/sem2/lab5/TD/TDMAP.EXE Binary files differnew file mode 100644 index 0000000..e5bc453 --- /dev/null +++ b/sem2/lab5/TD/TDMAP.EXE diff --git a/sem2/lab5/TD/TDREMOTE.EXE b/sem2/lab5/TD/TDREMOTE.EXE Binary files differnew file mode 100644 index 0000000..d7d335a --- /dev/null +++ b/sem2/lab5/TD/TDREMOTE.EXE diff --git a/sem2/lab5/TD/TDRF.EXE b/sem2/lab5/TD/TDRF.EXE Binary files differnew file mode 100644 index 0000000..a49d4d0 --- /dev/null +++ b/sem2/lab5/TD/TDRF.EXE diff --git a/sem2/lab5/TD/TDSTRIP.EXE b/sem2/lab5/TD/TDSTRIP.EXE Binary files differnew file mode 100644 index 0000000..6913771 --- /dev/null +++ b/sem2/lab5/TD/TDSTRIP.EXE 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 |