;debug when read FDD code segment 'code' assume cs:code alt equ 038h tab equ 0fh int_num equ 0d0h int_vec equ int_num*4h magic_key proc far org 100h start:jmp begin newirq0 db int_num int0e_begin proc near push ds push es push ax push bx mov ax,0 mov es,ax mov ax,cs mov es:[102h],ax lea ax,cs:int13_begin mov es:[100h],ax pop bx pop ax pop es pop ds ret int0e_begin endp int13_begin: cmp ax,0201h jnz zz cmp dl,0 jz to_debug zz: jmp dword ptr cs:old_int13 to_debug: mov al,0 out 21h,al push es mov ax,0 mov es,ax mov ax,es:[4] mov es:[204h],ax mov ax,es:[6] mov es:[206h],ax mov ax,es:[200h] mov es:[4h],ax mov ax,es:[202h] mov es:[6h],ax pop es pushf pop ax or ax,300h push ax popf nop nop nop nop nop nop nop nop jmp aaa ;iret old_int13 dw ? a dw ? newirqvec dw int_vec irq0:int 08h iret irq1:int 09h iret irq2:int 0ah iret irq3:int 0bh iret irq4:int 0ch iret irq5:int 0dh iret irq6: ;call int0e_begin jmp to_debug aaa: int 0eh push ax push cx push si push di push es push ds mov ax,0b800h mov es,ax mov si,0 mov di,0 mov cx,100h rep movsb mov ax,0 mov ds,ax mov ax,8000h mov es,ax mov cx,400h mov di,0 mov si,0 rep movsb pop ds pop es pop di pop si pop cx pop ax iret irq7:int 0fh iret set_irq proc mov si,cs:newirqvec mov ax,0 mov es,ax lea ax,irq0 mov es:[si],ax mov es:[si+2h],cs lea ax,irq1 mov es:[si+4h],ax mov es:[si+6h],cs lea ax,irq2 mov es:[si+8h],ax mov es:[si+0ah],cs lea ax,irq3 mov es:[si+0ch],ax mov es:[si+0eh],cs lea ax,irq4 mov es:[si+10h],ax mov es:[si+12h],cs lea ax,irq5 mov es:[si+14h],ax mov es:[si+16h],cs lea ax,irq6 mov es:[si+18h],ax mov es:[si+1ah],cs lea ax,irq7 mov es:[si+1ch],ax mov es:[si+1eh],cs cli mov al,11h out 20h,al jmp de1 de1: mov al,cs:newirq0 out 21h,al jmp de2 de2: mov al,4 out 21h,al jmp de3 de3: mov al,1 out 21h,al jmp de4 de4: mov al,0 out 21h,al sti ret set_irq endp begin: push es push cs pop ds call set_irq pop es mov ax,cs mov ds,ax mov ah,35h mov al,40h int 21h mov ax,es mov old_int13,bx mov old_int13+2,ax lea dx,end_add add dx,101h int 27h end_add: magic_key endp code ends end start