Нужна помощь в поиске литературы

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Jane
Сообщения: 2
Зарегистрирован: 17 дек 2005, 20:57
Контактная информация:

Уважаемые программисты!
Помогите, пожалуйста, найти литературу по написанию простых графических программ на ассемблере. К примеру, нарисовать квадрат!
(GiG)*fh
Сообщения: 48
Зарегистрирован: 05 ноя 2004, 14:08
Откуда: Russia
Контактная информация:

Нашел пример для DirectDraw:

Код: Выделить всё

.486
.MODEL FLAT, STDCALL
option casemap :none
INCLUDE D:\masm32\include\windows.inc ;эти файлы стандартные
INCLUDE D:\masm32\include\gdi32.inc ;
INCLUDE D:\masm32\include\kernel32.inc ;
INCLUDE D:\masm32\include\user32.inc ;
INCLUDE ddraw.inc 
INCLUDELIB D:\masm32\lib\gdi32.lib 
INCLUDELIB D:\masm32\lib\kernel32.lib
INCLUDELIB D:\masm32\lib\user32.lib
INCLUDELIB ddraw.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
next PROTO
init PROTO
;------------------------------------определяем макросы
RETURN MACRO arg 
IFNB <arg>
mov eax, arg
ENDIF
ret
ENDM
;------------------------------------
LRETURN MACRO arg 
IFNB <arg>
mov eax, arg
ENDIF
leave
ret
ENDM
;------------------------------------выход из программы с сообщением об ошибке
FATAL MACRO msg 
LOCAL @@msg
.DATA
@@msg db msg, 0
.CODE
INVOKE MessageBox, hWnd, ADDR @@msg, ADDR szDisplayName, MB_OK
INVOKE ExitProcess, 0
ENDM
;--------------------------------------------------------------------
.DATA?
hWnd HWND ? ; surface window
lpDD LPDIRECTDRAW ? ; DDraw object
lpDDSPrimary LPDIRECTDRAWSURFACE ? ; DDraw primary surface
ddsd DDSURFACEDESC <?> ; DDraw surface descriptor
ddscaps DDSCAPS <?> ; DDraw capabilities 

palette dd 256 dup (?)
table dd 512 dup (?)
lpDDPalette dd ?

;-------------------------------------------------------------------
.DATA
ddwidth EQU 640 ; display mode width
ddheight EQU 480 ; display mode height
ddbpp EQU 16 ; display mode color depth

szClassName db "DDRAW Plasma Demo", 0 ; class name
szDisplayName EQU <szClassName> ; window name

wc WNDCLASSEX < sizeof WNDCLASSEX, CS_HREDRAW or CS_VREDRAW, offset WndProc, 0, 0, , 0, 0, , 0, offset szClassName, 0 >
;---------------------------------------------------------------------------------
.CODE
start:
INVOKE GetModuleHandle, NULL
INVOKE WinMain, eax, NULL, NULL, SW_SHOWDEFAULT
INVOKE ExitProcess, eax
;---------------------------------------------------------------------------------
next PROC
mov edi, [ddsd.lpSurface] 

ret
next ENDP
;---------------------------------------------------------------------------------
init PROC

ret
init ENDP
;---------------------------------------------------------------------------------
WinMain PROC hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

LOCAL msg :MSG

; Fill WNDCLASSEX structure with required variables

mov eax, [hInst]
mov [wc.hInstance], eax
INVOKE GetStockObject, BLACK_BRUSH
mov [wc.hbrBackground], eax

INVOKE RegisterClassEx, ADDR wc

; Create window at following size

INVOKE CreateWindowEx, 0, ADDR szClassName, ADDR szDisplayName, WS_POPUP, 0, 0, ddwidth, ddheight, NULL, NULL, hInst, NULL
mov [hWnd], eax

INVOKE SetFocus, hWnd
INVOKE ShowCursor, 0

; Initialize display

INVOKE DirectDrawCreate, NULL, ADDR lpDD, NULL
.IF eax != DD_OK
FATAL "Couldn't init DirectDraw"
.ENDIF

DDINVOKE SetCooperativeLevel, lpDD, hWnd, DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN
.IF eax != DD_OK
FATAL "Couldn't set DirectDraw cooperative level"
.ENDIF

DDINVOKE SetDisplayMode, lpDD, ddwidth, ddheight, ddbpp
.IF eax != DD_OK
FATAL "Couldn't set display mode"
.ENDIF

mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_CAPS
mov [ddsd.ddsCaps.dwCaps], DDSCAPS_PRIMARYSURFACE
DDINVOKE CreateSurface, lpDD, ADDR ddsd, ADDR lpDDSPrimary, NULL
.IF eax != DD_OK
FATAL "Couldn't create primary surface"
.ENDIF

INVOKE ShowWindow, hWnd, CmdShow

call init ;----------------------------------------вызов процедуры инициализации

; Loop until PostQuitMessage is sent

.WHILE 1

INVOKE PeekMessage, ADDR msg, NULL, 0, 0, PM_REMOVE

.IF eax != 0
.IF msg.message == WM_QUIT
INVOKE PostQuitMessage, msg.wParam
.BREAK
.ELSE
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.ENDIF
.ELSE
INVOKE GetFocus

.IF eax == hWnd

mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_PITCH

.WHILE 1
DDSINVOKE mLock, lpDDSPrimary, NULL, ADDR ddsd, DDLOCK_WAIT, NULL

.BREAK .IF eax == DD_OK

.IF eax == DDERR_SURFACELOST
DDSINVOKE Restore, lpDDSPrimary
.ELSE
FATAL "Couldn't lock surface"
.ENDIF
.ENDW

DDINVOKE WaitForVerticalBlank, lpDD, DDWAITVB_BLOCKBEGIN, NULL

call next 

DDSINVOKE Unlock, lpDDSPrimary, ddsd.lpSurface

.ENDIF
.ENDIF
.ENDW

DDINVOKE RestoreDisplayMode, lpDD
.IF eax != DD_OK
FATAL "Couldn't restore displaymode"
.ENDIF

INVOKE DestroyWindow, hWnd
.IF eax == NULL
FATAL "Couldn't destroy window"
.ENDIF

.IF lpDD != NULL
.IF lpDDSPrimary != NULL
DDSINVOKE Release, lpDDSPrimary
mov [lpDDSPrimary], NULL
.ENDIF

DDINVOKE Release, lpDD
mov [lpDD], NULL

.ENDIF

LRETURN msg.wParam
WinMain ENDP
;-----------------------------------------------------------------------------------
WndProc PROC hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD

.IF uMsg == WM_KEYDOWN
.IF wParam == VK_ESCAPE
INVOKE PostQuitMessage, NULL
RETURN 0 
.ENDIF
.ELSEIF uMsg == WM_DESTROY
INVOKE PostQuitMessage, NULL
RETURN 0 
.ENDIF

INVOKE DefWindowProc, hWin, uMsg, wParam, lParam

ret
WndProc ENDP

END start
А вообще поищи на яндексе, например по стокам "opengl" или "программирование видео адаптеров"
И пусть удача повернется к тебе нужным местом :)
Jane
Сообщения: 2
Зарегистрирован: 17 дек 2005, 20:57
Контактная информация:

Спасибо :)

Но в идеале всё намного проще :)
может кому-нибудь это и пригодится...

PutPixel macro x,y,color
pusha
mov ah,0ch
mov al,color
mov bh,0h
mov cx,x
mov dx,y
int 10h
popa
endm

.model small

.code
.486
org 100h
beg: jmp start

start:

pusha
mov ah,0fh
int 10h
push ax
mov ax,12h
int 10h
mov ah,0bh
mov bx,0006h
int 10h

mov cx,200
mov dx,200
met:
Putpixel cx,dx,0ch
inc dx
cmp dx,220
jbe met



mov dx,200
inc cx
cmp cx,220
jbe met




met2:
mov ah,10h
int 16h
cmp al,1bh
jne met2

pop ax
mov ah,00h
int 10h

popa
mov ax,4c00h
int 21h
end beg
zimer
Сообщения: 3
Зарегистрирован: 08 окт 2009, 17:01

А что поменять в этой программе чтобы у мене рисовалj квадрат символом "0" ??
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Всё поменять, так как данный код рисует в видео-режиме, а ты хочешь рисовать в текстовом режиме.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить