· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› DPMI: The same shit but diferent way :(

Посл.отвђт Сообщен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.034