This commit is contained in:
Mark Zheleznyakov
2024-09-07 08:49:36 +03:00
commit be2b9502d1
54 changed files with 3980 additions and 0 deletions

446
Protect/PM_INT8.9/PM.ASM Executable file
View File

@ -0,0 +1,446 @@
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E3A4A5><EFBFBD> <20><><EFBFBD> 2084/3
; <20><><EFBFBD><EFBFBD><EFBFBD><E0A5AD> <20><><EFBFBD>
; <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
; <20>ணࠬ<E0AEA3><E0A0AC>, <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20> Protrcted Mode,
; <20><>९ணࠬ<E0AEA3><E0A0AC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEAB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> <20> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E0A0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᬥ饭<E1ACA5><E9A5AD> <20><> 32-<2D> <20><><EFBFBD><E2ADAE><><E1A5A3><EFBFBD><EFBFBD><EFBFBD> <20> 16-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD>
so equ small offset
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. <20><> <20><EFBFBD> - <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD>).
delay macro time
local ext,iter
push ecx
mov ecx,time
ext: push ecx
mov cx,5000 ;<3B><><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD>⥫쭮<E2A5AB><ECADAE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
iter: loop iter
pop ecx
loop ext
pop ecx
endm
.386p
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Real Mode, 16 <20><><EFBFBD>
RM_seg segment para public "CODE" use16
assume cs: RM_seg, ds: PM_seg, ss: Stack_seg
start:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
mov ax, 3
int 10h
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2AEA2><EFBFBD><><E1A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>
push PM_seg
pop ds
; <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <><E0A5A6> (PM <20><><EFBFBD> <20><><EFBFBD>)
mov eax, cr0
test al, 1
jz no_V86
; <20>᫨ 㦥 <20> PM - ᮮ<><E1AEAE><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD><E8A8A1> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
mov dx, so v86_msg
err_exit:
mov ah, 9
int 21h
mov ah, 4Ch
int 21h
; <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Windows
no_V86:
mov ax, 1600h
int 2Fh
test al, al
jz no_Windows
; <20><20><><EFBFBD> Wondows - ᮮ<><E1AEAE><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
mov dx, so win_msg
jmp short err_exit
; *****************************************
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC>
no_Windows:
; <20><><EFBFBD><EFBFBD><EFBFBD><E1ABA8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><E0A8AF>஢ ᥣ<><E1A5A3><EFBFBD>
xor eax, eax
mov ax, RM_seg ; <20><><EFBFBD><EFBFBD><EFBFBD> 16bitCS <20><EFBFBD> RM_seg
shl eax, 4
mov word ptr GDT_16bitCS+2, ax ; <20><><EFBFBD><EFBFBD> 15-0
shr eax, 16
mov byte ptr GDT_16bitCS+4, al ; <20><><EFBFBD><EFBFBD> 23-16
mov ax, PM_seg
shl eax, 4
mov word ptr GDT_32bitCS+2, ax ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 32bit* <20><EFBFBD>
mov word ptr GDT_32bitSS+2, ax ; PM_seg
mov word ptr GDT_32bitDS+2, ax
shr eax, 16
mov byte ptr GDT_32bitCS+4, al
mov byte ptr GDT_32bitSS+4, al
mov byte ptr GDT_32bitDS+4, al
; <20><><EFBFBD><EFBFBD><EFBFBD><E1ABA8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> GDT
xor eax, eax
mov ax, PM_seg
shl eax, 4
push eax
add eax, offset GDT
mov dword ptr gdtr+2, eax
; <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8> GDT
lgdt fword ptr gdtr
; <20><><EFBFBD><EFBFBD><EFBFBD><E1ABA8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> IDT
pop eax
add eax, offset IDT
mov dword ptr idtr+2, eax
; <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8> IDT
lidt fword ptr idtr
; <20>.<2E>. ᮡ<><EFBFBD><E0A0A5><EFBFBD><><E0A0A1><EFBFBD><EFBFBD><EFBFBD> <20> 32-<2D> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> A20
in al, 70h
or al, 2
out 92h, al
; <20><EFBFBD><E2AAAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>
cli
; <20><EFBFBD><E2AAAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> (NMI)
in al, 70h
or al, 80h
out 70h, al
; <20><><EFBFBD><E0A5A9> <20> <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD><EFBFBD> <><E0A5A6>
mov eax, cr0
or al, 1
mov cr0, eax
; <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8> SEL_32bitCS <20> CS
db 66h ; <20><><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E0A0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><EFA4AD><EFBFBD><EFBFBD>
db 0EAh ; <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
dd offset PM_entry
dw Sel_32bitCS
RM_return:
; <20><><EFBFBD><E0A5A9> <20> Real Mode
mov eax, cr0
and al, 0FEh
mov cr0, eax
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8> CS ॠ<><E0A5A0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
db 0EAh
dw $+4
dw RM_seg
; <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><><E0A0A1><EFBFBD> <20><><EFBFBD> <><E0A5A6><EFBFBD>
mov ax, PM_seg
mov ds, ax
mov es, ax
mov ax, Stack_seg
mov bx, stack_l
mov ss, ax
mov sp, bx
; <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8> IDTR <20><><EFBFBD> RM
mov ax, PM_seg
mov ds, ax
lidt fword ptr idtr_real
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NMI
in al, 70h
and al, 07Fh
out 70h, al
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>
sti
; <20> <20><><EFBFBD><EFBFBD><EFBFBD>
mov ah, 4Ch
int 21h
RM_seg ends
; 32-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5A3><EFBFBD><EFBFBD>
PM_seg segment para "CODE" use32
assume cs: PM_seg
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GDT <20> IDT <20>.<2E>. <20><><EFBFBD><E0AEA2><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><><E0A0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><><E1A5A3><EFBFBD><EFBFBD><EFBFBD>
GDT label byte
db 8 dup(0)
; 32-x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4-<2D> <20><><><E1A5A3><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> =0
GTD_flatDS db 0FFh,0FFh,0,0,0,10010010b,11001111b,0
; 16-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 64-<2D> <20><><><E1A5A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> RM_seg
GDT_16bitCS db 0FFh,0FFh,0,0,0,10011010b,0,0
; 32-x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4-<2D> <20><><><E1A5A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> PM_seg
GDT_32bitCS db 0FFh,0FFh,0,0,0,10011010b,11001111b,0
; 32-x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4-<2D> <20><><><E1A5A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> PM_seg
GDT_32bitDS db 0FFh,0FFh,0,0,0,10010010b,11001111b,0
; 32-x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4-<2D> <20><><><E1A5A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> Stack_seg
GDT_32bitSS db 0FFh,0FFh,0,0,0,10010010b,11001111b,0
gdt_size = $-GDT
gdtr dw gdt_size-1 ; <20><EFBFBD><E0A5A4> GDT
dd ? ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> GDT
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5AB><EFBFBD><EFBFBD>
SEL_flatDS equ 001000b
SEL_16bitCS equ 010000b
SEL_32bitCS equ 011000b
SEL_32bitDS equ 100000b
SEL_32bitSS equ 101000b
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A8AF><20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> IDT
IDT label byte
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A8AF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 0Eh - 32-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>
; INT 00-07
dw 8 dup(so int_handler, SEL_32bitCS, 8E00h,0)
; INT 08(irq0)
; dw so irq0_7_handler,SEL_32bitCS,8E00h,0
dw so timer_handler,SEL_32bitCS,8E00h,0
; INT 09(irq1)
dw so irq1_handler,SEL_32bitCS,8E00h,0
; INT 0Ah-0Fh (IRQ2-IRQ8)
dw 6 dup(so irq0_7_handler,SEL_32bitCS,8E00h,0)
; INT 10h-6Fh
dw 97 dup(so int_handler,SEL_32bitCS,8E00h,0)
; INT 70h-78h (IRQ8-IRQ15)
dw 8 dup(so irq8_15_handler,SEL_32bitCS,8E00h,0)
; INT 79h-FFh
dw 135 dup(so int_handler,SEL_32bitCS,8E00h,0)
idt_size = $-IDT
idtr dw idt_size-1 ; <20><EFBFBD><E0A5A4> IDT
dd ? ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> IDT
; <20><><EFBFBD><EFBFBD><EFBFBD><E0A6A8><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> IDTR <20><><EFBFBD> <><E0A5A6><EFBFBD>
idtr_real dw 3FFh,0,0
; <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD> <20><> <20><EFBFBD><E8A8A1><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
v86_msg db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <><E0A5A6><EFBFBD> v86 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> PM$"
win_msg db "<22>ணࠬ<E0AEA3><E0A0AC> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> Windows$"
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><E0A5A2><EFBFBD> OE ᪠<>-<2D><><EFBFBD><EFBFBD><EFBFBD> <20> ASCII
scan2ascii db 0,1Bh,'1','2','3','4','5','6','7','8','9','0','-','=',8
db 0,'Q','W','E','R','T','Y','U','I','O','P','[',']',0
DB 0,'A','S','D','F','G','H','J','K','L',';',27h,'`',0 ; LShift
db '\','Z','X','C','V','B','N','M',',','.','/',0 ; RShift
db '0','0',' ' ; SP
screen_addr dd 0 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>
N dd 64 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> MUS
NM dd 1 ; <20><><EFBFBD><EFBFBD><20><><EFBFBD>⥫쭮<E2A5AB><ECADAE><EFBFBD>
; <20><><EFBFBD><20><><EFBFBD> <20><><EFBFBD><EFBFBD><E7A0AD>: 1-<2D> <20><>᫮ - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 2-<2D> - <20><><EFBFBD>⥫쭮<E2A5AB><ECADAE><EFBFBD>
MUS dw 1218,10, 767,10, 813,10, 912,10, 966,10, 912,30
dw 1218,10, 609,10, 678,10, 767,10, 813,10, 767,30
dw 912,10, 574,15, 609,5, 678,15, 767,5, 813,5
dw 767,5, 678,20, 574,10, 609,10, 678,10, 767,10
dw 678,10, 813,30, 1218,10, 767,10, 813,10, 912,10
dw 966,10, 912,30, 1218,10, 609,10, 678,10, 767,10
dw 813,10, 767,30, 912,10, 574,15, 609,5, 678,15
dw 767,5, 813,5, 767,5, 678,20, 574,10, 609,10
dw 678,10, 767,10, 678,10, 813,30, 0,2, 609,10
dw 609,10, 912,10, 724,10, 609,10, 609,5, 678,5
dw 724,5, 678,5, 574,15, 678,5, 678,10, 1024,10
dw 813,10, 678,10, 678,5, 767,5, 813,5, 724,5
dw 609,20, 678,5, 609,5, 574,5, 456,5, 342,5
dw 384,5, 406,5, 456,5, 456,20, 483,20, 678,5
dw 609,5, 574,5, 456,5, 342,5, 384,5, 406,5
dw 456,5, 456,10, 483,10, 456,20, 0,2, 456,5
dw 456,10, 483,10, 456,20, 0,30
;MC = ($-MUS)/4; Music Count - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD>
MC = 100
; <20><><20><EFBFBD> <20> 32-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD><EFBFBD> <><E0A5A6>
PM_entry:
; <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD> 32-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20> <20><><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>
mov ax, SEL_flatDS
mov ds, ax
mov es, ax
mov ax, SEL_32bitSS
mov ebx, stack_l
mov ss, ax
mov esp, ebx
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>
sti
; <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>
jmp short $
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;! <20><><EFBFBD><E0A0A1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> !
;! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><E0A5AA><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1AAA0> <20><EFBFBD><E8A8A1> !
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; <20><><EFBFBD><E0A0A1><20><><EFBFBD><EFBFBD><E7ADAE> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>
int_handler:
iretd
; <20><><EFBFBD><E0A0A1><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2ADAE> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> IRQ0-IRQ7
irq0_7_handler:
push eax
mov al, 20h
out 20h, al
pop eax
iretd
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; <20><><EFBFBD><E0A0A1><20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> <20><><><E2A0A9><EFBFBD><EFBFBD> (int8) !
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
timer_handler:
; <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>
push eax
push ebx
push es
push ds
mov bx, SEL_32bitDS ; <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8><><E1A5A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov ds, bx
dec NM ; <20><><EFBFBD><EFBFBD><20><EFBFBD> <20><><EFBFBD><EFBFBD><E7A0AD>
mov eax, NM ; <20><20><> <20><><EFBFBD><E2A5AA>,
cmp eax, 0
jnz contin_mus ; <20><> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>
; <20><EFBFBD><EBAAAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
in al, 61h
and al, 0FCh
out 61h, al
delay 1 ; <20><>
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
inc N ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>.
mov eax, N ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov ebx, 4 ; ! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mul ebx ; <20><><EFBFBD><EFBFBD><E9A5AD> <20><><EFBFBD><EFBFBD>, <20><EFBFBD><E2ADAE>⥫쭮 <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
add eax, offset MUS ; <20><><EFBFBD><EFBFBD><EFBFBD>
push eax ; <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD>
; xor eax, eax
mov ax, [eax] ; <20> AX - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A0AD>
mov ebx, eax ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2AEA2>
shr ebx, 8 ; <20><><EFBFBD><E0A0AC><20><><EFBFBD>
and ax, 00FFh ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
push eax
mov ax, 0B6h ; \
out 43h, ax ; _\outportb(0x43, 0xB6)
pop eax ; EAX = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> & 0x00FF
out 42h, ax
xchg ax, bx ; ax = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >> 8
out 42h, ax
in al, 61h
or al, 03h
out 61h, al
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⥫쭮<E2A5AB><ECADAE><EFBFBD>
pop ebx ; EBX = <20><><EFBFBD><EFBFBD><EFBFBD><><20><><EFBFBD><EFBFBD>
xor eax, eax
mov ax, word ptr [ebx+2] ; EAX = <20><><EFBFBD>⥫쭮<E2A5AB><ECADAE><EFBFBD>
mov NM, eax
cmp N, MC ; <20><20><> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
jb contin_mus ; <20><> <20><><EFBFBD>,
mov N, 0 ; <20><><EFBFBD><EFBFBD><EFBFBD> - <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
contin_mus:
; mov NM, eax ; <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><><20><EFBFBD> <20><><EFBFBD><EFBFBD><E7A0AD>
; <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEAB><EFBFBD><EFBFBD>
mov al, 20h
out 20h, al
; <20><><EFBFBD><EFBFBD><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>
pop ds
pop es
pop ebx
pop eax
iretd
; <20><><EFBFBD><E0A0A1><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2ADAE> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> IRQ8-IRQ15
irq8_15_handler:
push eax
mov al, 20h
out 0A1h, al
pop eax
iretd
; <20><><EFBFBD><E0A0A1>稪 IRQ1 - <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq1_handler:
push eax ; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD> -
push ebx ; <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>
push edx
push es
push ds
in al, 60h ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>-<2D><><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; cmp al, 0Eh ; <20><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 祬 <20><><EFBFBD><EFBFBD><EFBFBD><E3A6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cmp al, 39h ; <20><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 祬 <20><><EFBFBD><EFBFBD><EFBFBD><E3A6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ja skip_translate ; <20><><EFBFBD><EFBFBD>, - <20><> <20><><EFBFBD><E0A0A1><EFBFBD><EBA2A0>
cmp al, 1 ; <20><20><><EFBFBD> ESC,
je esc_pressed ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A0><EFBFBD><EFBFBD><EFBFBD> <><E0A5A6>
mov bx, SEL_32bitDS ; <20><><EFBFBD><EFBFBD><EFBFBD>:
mov ds, bx ; DS:EBX - ⠡<><E2A0A1><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><E0A5A2><EFBFBD>
mov ebx, offset scan2ascii ; ᪠<>-<2D><><EFBFBD><EFBFBD> <20> ASCII
xlatb ; <20><EFBFBD><EFBFBD><E0A0A7><EFBFBD><EFBFBD><EFBFBD>
mov bx, SEL_flatDS
mov es, bx ; ES:EBX - <20><><EFBFBD><EFBFBD><EFBFBD><>
mov ebx, screen_addr ; <20><><EFBFBD><EFBFBD><20><> <20><><EFBFBD>
cmp al, 8 ; <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BkSpace
je bs_pressed ; <20><> ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><E0A0A1>
cmp al, 0 ;
je skip_translate ;
mov es:[ebx+0B8000h], al ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1ABA0><><E1A8AC><EFBFBD> <20><> <20><>
add dword ptr screen_addr, 2; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><> 2
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov ebx, screen_addr
shr ebx, 1
;! mov eax, ebx
;! mov ebx, 2
;!!! div ebx
; mov ebx, eax
; mov ebx, screen_addr
; inc ebx
xor edx, edx
xor eax, eax
mov dx, 03D4h ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEAB><EFBFBD><EFBFBD> CRT
mov al, 0Fh ; <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD> <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
mov ah, bl
out dx, ax
mov al, 0Eh ; <20> ॣ. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
mov ah, bh
out dx, ax
jmp short skip_translate
bs_pressed: ; <20><><EFBFBD><EFBFBD><EFBFBD> BkSpace:
mov al,' ' ; <20><EFBFBD><EBA2A5><EFBFBD> <20><EFBFBD><E0AEA1>
sub ebx, 2 ; <20> <20><><EFBFBD><EFBFBD><20><EFBFBD><E0A5A4><EFBFBD><EFBFBD><><E1A8AC><EFBFBD><EFBFBD>
mov es:[ebx+0B8000h], al
mov screen_addr, ebx ; <20> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5A4><><E1A8AC><EFBFBD><EFBFBD>,
; <20><><EFBFBD><>
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
shr ebx, 1
;! mov eax, ebx
;! mov ebx, 2
;!!! div ebx
; mov ebx, eax
; mov ebx, screen_addr
; inc ebx
xor edx, edx
xor eax, eax
mov dx, 03D4h ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEAB><EFBFBD><EFBFBD> CRT
mov al, 0Fh ; <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD> <20><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
mov ah, bl
out dx, ax
mov al, 0Eh ; <20> ॣ. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
mov ah, bh
out dx, ax
skip_translate:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
in al, 61h
or al, 80h
out 61h, al
; <20><><EFBFBD><E1ABA0> EOI <20><><EFBFBD><EFBFBD><EFBFBD><E0AEAB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD>
mov al, 20h
out 20h, al
; <20><><EFBFBD><EFBFBD><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
pop ds
pop es
pop edx
pop ebx
pop eax
iretd
; *******************
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ESC
esc_pressed:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A0A1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><E1ABA0> EOI <20> <20><><EFBFBD><EFBFBD><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD>
in al, 61h
or al, 80h
out 61h, al
mov al, 20h
out 20h, al
cli
; <20><EFBFBD><E2AAAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
in al, 61h
and al, 0FCh
out 61h, al
pop ds
pop es
pop edx
pop ebx
pop eax
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E0A5A0><EFBFBD><EFBFBD><EFBFBD> <><E0A5A6>
db 0EAh
dd offset RM_return
dw SEL_16bitCS
PM_seg ends
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>, <20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 16-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 16-<2D><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>ணࠬ<E0AEA3><E0A0AC> <20> <20><><EFBFBD>
; 32-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>१ ᥫ<><E1A5AB><EFBFBD><EFBFBD><EFBFBD> SEL_32bitSS) <20> 32-<2D> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
Stack_seg segment para stack "STACK"
stack_start db 100h dup(?)
stack_l = $-stack_start ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E6A8A0><EFBFBD><EFBFBD>樨 ESP
Stack_seg ends
end start