|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Дек 6, 2002 23:24:46 · Поправил: Bart Simpson Привет опять :( Все никак не могу домучить этот бредовый DPMI :( Вроде всего пара функций и три сосны... но он меня просто доканал :( Решив на этот раз заделать все комом (по совету друзей :) (несмотря на пьяный бред боряландовского компилера про префиксы 66h ) все стало еще хуже :( Ну нехочет пахать и все :( Вы уж окиньте плиз свежим взглядом сие творение, и скажите мне наконец Waaaaasaaabiiiiii ? ;8<---cut here------------------------------------------------- .model tiny .386 .code locals org 100h begin: ;check dpmi mov ax,1687h int 2fh test ax,ax jz @@dpmi_present mov dx,offset msg_error_dpmi_notpresent call dos_string_write retn @@dpmi_present: test bl,1 jnz @@dpmi_32bsupported mov dx,offset msg_error_dpmi_32bunsupported call dos_string_write retn @@dpmi_32bsupported: ;save dpmi mode switch procedure's address mov word ptr dpmi_modeswitch,di mov word ptr dpmi_modeswitch+2,es ;resize program memory mov ah,4ah push cs pop es mov bx,(offset stack_bottom-offset begin) shr 4 int 21h jnc @@memory_resized mov dx,offset msg_error_dos_memoryunresizeble call dos_string_write retn @@memory_resized: ;set new stack bottom mov sp,offset stack_bottom push 0 ;get memory for dpmi mode switch mov ah,48h mov bx,si int 21h jnc @@memory_allocated mov dx,offset msg_error_dos_memoryunallocateble call dos_string_write retn @@memory_allocated: mov es,ax ;switch to protected mode xor ax,ax db 09ah dpmi_modeswitch dd ? jnc @@dpmi_modeswitched mov dx,offset msg_error_dpmi_generalfalure call dos_string_write retn @@dpmi_modeswitched: ;create buffer call dpmi_descriptor_create mov selector_buffer,ax mov ecx,max_x*max_y*bpp call dpmi_memory_get mov bx,selector_buffer mov ecx,eax call dpmi_descriptor_base_change mov ecx,max_x*max_y*bpp-1 call dpmi_descriptor_limit_change ;get memory for VESA info block mov bx,10h call dpmi_base_memory_get mov selector_vesa_info,dx ;get VESA info xor ecx,ecx mov word ptr v86regs.r_eax,4f01h mov word ptr v86regs.r_ecx,video_mode mov v86regs.r_es,ax mov v86regs.r_edi,ecx mov bl,10h call dpmi_v86int cmp word ptr v86regs.r_eax,4fh jz @@vesa_info_got mov dx,offset msg_error_vesa_get_mode_info_falure call dos_string_write call dos_exit @@vesa_info_got: ;set video mode mov word ptr v86regs.r_eax,4f02h mov word ptr v86regs.r_ebx,video_mode call dpmi_v86int cmp word ptr v86regs.r_eax,4fh jz @@vesa_mode_set mov dx,offset msg_error_vesa_set_mode_falure call dos_string_write call dos_exit @@vesa_mode_set: ;get lfb descriptor call dpmi_descriptor_create mov selector_lfb,ax ;get lfb linear addres mov es,selector_vesa_info mov ebx,dword ptr es:[28h] mov cx,bx shr ebx,16 mov esi,max_x*max_y*bpp mov di,si shr esi,16 mov ax,0800h int 31h jnc @@shadow_ok mov dx,offset msg_error_dpmi_shadow_falure call dos_string_write call dos_exit @@shadow_ok: ;change lfb base push cx mov cx,bx shl ecx,16 pop cx mov bx,selector_lfb call dpmi_descriptor_base_change ;change lfb limit mov bx,selector_lfb mov ecx,max_x*max_y*bpp-1 call dpmi_descriptor_limit_change ;move buffer->lfb mov ds,selector_buffer mov es,selector_lfb xor edi,edi xor esi,esi mov ecx,max_x*max_y*bpp/4 rep movsd ;wait for esc press @@wait: in al,60h dec al jnz @@wait ;procedures dos_exit proc near;al<-exit code. mov ah,4ch int 21h dos_exit endp dos_string_write proc near;dx<-offset. mov ah,09h int 21h retn dos_string_write endp dpmi_v86int proc near;bl<-interrupt,cx<-stack words to copy. mov ax,0300h mov edi,offset v86regs push cs pop es int 31h jnc @@v86int_ok mov edx,offset msg_error_dpmi_interrupt_call_falure call dos_string_write call dos_exit @@v86int_ok: retn dpmi_v86int endp dpmi_descriptor_create proc near;ax->selector. xor eax,eax xor ecx,ecx inc ecx int 31h jnc @@descriptor_created mov edx,offset msg_error_dpmi_descriptor_create call dos_string_write call dos_exit @@descriptor_created: retn dpmi_descriptor_create endp dpmi_descriptor_base_change proc near;bx<-selector,ecx<-base. mov dx,cx shr ecx,16 mov ax,7 int 31h jnc @@descriptor_base_changed mov edx,offset msg_error_dpmi_descriptor_base_change call dos_string_write call dos_exit @@descriptor_base_changed: retn dpmi_descriptor_base_change endp dpmi_descriptor_limit_change proc near;bx<-selector,ecx<-limit. mov dx,cx shr ecx,16 mov ax,8 int 31h jnc @@descriptor_limit_changed mov edx,offset msg_error_dpmi_descriptor_limit_change call dos_string_write call dos_exit @@descriptor_limit_changed: retn dpmi_descriptor_limit_change endp dpmi_memory_get proc near;ecx<-memory size;eax->linear addres. mov ebx,ecx shr ebx,16 mov ax,0501h int 31h jnc @@memory_allocated mov edx,offset msg_error_dpmi_memory_get call dos_string_write call dos_exit @@memory_allocated: mov ax,bx shl eax,16 mov ax,cx retn dpmi_memory_get endp dpmi_base_memory_get proc near;bx<-memory size in 16b;ax->segment,dx->selector. mov ax,0100h int 31h jnc @@base_memory_allocated mov edx,offset msg_error_dpmi_base_memory_get call dos_string_write call dos_exit @@base_memory_allocated: retn dpmi_base_memory_get endp ;constants video_mode equ 4101h max_x equ 640 max_y equ 480 bpp equ 1 ;structures rec_v86regs struc r_edi dd ? r_esi dd ? r_ebp dd ? dd ? r_ebx dd ? r_edx dd ? r_ecx dd ? r_eax dd ? r_flags dw ? r_es dw ? r_ds dw ? r_fs dw ? r_gs dw ? r_ip dw ? r_cs dw ? r_sp dw ? r_ss dw ? rec_v86regs ends ;data msg_error_dpmi_notpresent db 'Error: DPMI not present',0ah,0dh,'$' msg_error_dpmi_32bunsupported db 'Error: 32b DPMI not supported',0ah,0dh,'$' msg_error_dpmi_generalfalure db 'Error: General DPMI falure',0ah,0dh,'$' msg_error_dpmi_descriptor_create db 'Error: Descriptor creatrion failure',0ah,0dh,'$' msg_error_dpmi_descriptor_base_change db 'Error: Descriptor''s base changing failure',0ah,0dh,'$' msg_error_dpmi_descriptor_limit_change db 'Error: Descriptor''s limit changing failure',0ah,0dh,'$' msg_error_dpmi_memory_get db 'Error: Memory allocation failure',0ah,0dh,'$' msg_error_dpmi_base_memory_get db 'Error: Base memory allocation failure',0ah,0dh,'$' msg_error_dpmi_interrupt_call_falure db 'Error: Interrupt execution failure',0ah,0dh,'$' msg_error_dpmi_shadow_falure db 'Error: Phisical address shadow failure',0ah,0dh,'$' msg_error_dos_memoryunresizeble db 'Error: Can''t resize memory block',0ah,0dh,'$' msg_error_dos_memoryunallocateble db 'Error: Can''t allocate memory block',0ah,0dh,'$' msg_error_vesa_get_mode_info_falure db 'Error: Can''t get vesa mode info',0ah,0dh,'$' msg_error_vesa_set_mode_falure db 'Error: Can''t set video mode',0ah,0dh,'$' selector_buffer dw ? selector_lfb dw ? selector_vesa_info dw ? v86regs rec_v86regs <> ;stack db 200h dup (?) stack_bottom: end begin |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.081 |