From 143f34d941f32e0808fc9344d4c4126ff530d64a Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 22 Oct 2020 21:03:24 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B5=D0=BC=D0=B5=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sem2/lab5/DumpTSR.asm | 291 ++++++++++++++++++++++++++++++++++++++++++++++ sem2/lab5/TD/TD.EXE | Bin 0 -> 192448 bytes sem2/lab5/TD/TD.OVL | Bin 0 -> 108640 bytes sem2/lab5/TD/TD386.EXE | Bin 0 -> 23504 bytes sem2/lab5/TD/TDCONFIG.TD | Bin 0 -> 1059 bytes sem2/lab5/TD/TDH386.SYS | Bin 0 -> 6428 bytes sem2/lab5/TD/TDHELP.TDH | Bin 0 -> 114748 bytes sem2/lab5/TD/TDINST.EXE | Bin 0 -> 81692 bytes sem2/lab5/TD/TDMAP.EXE | Bin 0 -> 16240 bytes sem2/lab5/TD/TDREMOTE.EXE | Bin 0 -> 19932 bytes sem2/lab5/TD/TDRF.EXE | Bin 0 -> 16470 bytes sem2/lab5/TD/TDSTRIP.EXE | Bin 0 -> 11954 bytes sem2/lab5/examp.asm | 54 +++++++++ sem2/lab5/gavno.asm | 26 +++++ sem2/lab5/jee.asm | 27 +++++ sem2/lab5/resident.asm | 30 +++++ sem2/lab5/run.bat | 3 + sem2/lab5/task.asm | 114 ++++++++++++++++++ sem2/lab5/test.asm | 105 +++++++++++++++++ 19 files changed, 650 insertions(+) create mode 100644 sem2/lab5/DumpTSR.asm create mode 100644 sem2/lab5/TD/TD.EXE create mode 100644 sem2/lab5/TD/TD.OVL create mode 100644 sem2/lab5/TD/TD386.EXE create mode 100644 sem2/lab5/TD/TDCONFIG.TD create mode 100644 sem2/lab5/TD/TDH386.SYS create mode 100644 sem2/lab5/TD/TDHELP.TDH create mode 100644 sem2/lab5/TD/TDINST.EXE create mode 100644 sem2/lab5/TD/TDMAP.EXE create mode 100644 sem2/lab5/TD/TDREMOTE.EXE create mode 100644 sem2/lab5/TD/TDRF.EXE create mode 100644 sem2/lab5/TD/TDSTRIP.EXE create mode 100644 sem2/lab5/examp.asm create mode 100644 sem2/lab5/gavno.asm create mode 100644 sem2/lab5/jee.asm create mode 100644 sem2/lab5/resident.asm create mode 100644 sem2/lab5/run.bat create mode 100644 sem2/lab5/task.asm create mode 100644 sem2/lab5/test.asm (limited to 'sem2/lab5') 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 + 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 Binary files /dev/null and b/sem2/lab5/TD/TD.EXE differ diff --git a/sem2/lab5/TD/TD.OVL b/sem2/lab5/TD/TD.OVL new file mode 100644 index 0000000..91fdc3a Binary files /dev/null and b/sem2/lab5/TD/TD.OVL differ diff --git a/sem2/lab5/TD/TD386.EXE b/sem2/lab5/TD/TD386.EXE new file mode 100644 index 0000000..ac749ac Binary files /dev/null and b/sem2/lab5/TD/TD386.EXE differ diff --git a/sem2/lab5/TD/TDCONFIG.TD b/sem2/lab5/TD/TDCONFIG.TD new file mode 100644 index 0000000..bfdf827 Binary files /dev/null and b/sem2/lab5/TD/TDCONFIG.TD differ diff --git a/sem2/lab5/TD/TDH386.SYS b/sem2/lab5/TD/TDH386.SYS new file mode 100644 index 0000000..0bfe7bc Binary files /dev/null and b/sem2/lab5/TD/TDH386.SYS differ diff --git a/sem2/lab5/TD/TDHELP.TDH b/sem2/lab5/TD/TDHELP.TDH new file mode 100644 index 0000000..3813e4e Binary files /dev/null and b/sem2/lab5/TD/TDHELP.TDH differ diff --git a/sem2/lab5/TD/TDINST.EXE b/sem2/lab5/TD/TDINST.EXE new file mode 100644 index 0000000..07d427b Binary files /dev/null and b/sem2/lab5/TD/TDINST.EXE differ diff --git a/sem2/lab5/TD/TDMAP.EXE b/sem2/lab5/TD/TDMAP.EXE new file mode 100644 index 0000000..e5bc453 Binary files /dev/null and b/sem2/lab5/TD/TDMAP.EXE differ diff --git a/sem2/lab5/TD/TDREMOTE.EXE b/sem2/lab5/TD/TDREMOTE.EXE new file mode 100644 index 0000000..d7d335a Binary files /dev/null and b/sem2/lab5/TD/TDREMOTE.EXE differ diff --git a/sem2/lab5/TD/TDRF.EXE b/sem2/lab5/TD/TDRF.EXE new file mode 100644 index 0000000..a49d4d0 Binary files /dev/null and b/sem2/lab5/TD/TDRF.EXE differ diff --git a/sem2/lab5/TD/TDSTRIP.EXE b/sem2/lab5/TD/TDSTRIP.EXE new file mode 100644 index 0000000..6913771 Binary files /dev/null and b/sem2/lab5/TD/TDSTRIP.EXE 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 -- cgit v1.2.3