1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
;************************************************
; vgac.asm
; PC VGA graphics control in assembly language
; uses BIOS for keyboard read and setting graphics
; modes, and procedure for setting a VGA pixel
; version for C calling convention :-
; LARGE model
; no MAIN entry point
; assemble only (no link)
; underscore for C-callable functions
; don't pop arguments off stack (caller does this)
;
; J Leis
; 24 May 1994
;************************************************
TITLE vgac.asm - vga assembler program, callable from C
.MODEL LARGE
.286
.DOSSEG
; stack segment directive
.STACK
; data segment directive
.DATA
; code segment directive
.CODE
_VgaMode PROC
pusha
mov ah, 0 ; function 0 = set video mode
mov al, 12h ; mode 12 = vga graphics
int 10h
popa
ret
_VgaMode ENDP
_TextMode PROC
pusha
mov ah, 0 ; function 0 = set video
mov al, 03h ; mode 3 = text
int 10h
popa
ret
_TextMode ENDP
_ShowMessage PROC
pusha ; save registers if necessary
; call DOS interrupt to display a message
mov bx, 01h
lea dx, mesg ; equivalent to mov dx, OFFSET mesg
mov cx, l_mesg
mov ah, 040h
int 021h
popa
ret
_ShowMessage ENDP
_ReadKey PROC
pusha ; save registers if necessary
mov ah, 00h ; function 0 - wait for key & read it
int 16h ; int 16h = keyboard services
; al now equals ascii code of key
popa
ret
_ReadKey ENDP
; setpixel( xc, yc, color )
; stacking order:
; memory near call far call
; color highest [bp+8] [bp+10]
; y-coord [bp+6] [bp+8]
; x-coord lowest [bp+4] [bp+6]
;
_SetPixel PROC
push bp
mov bp, sp
pusha ; save registers if necessary
mov dx, 03CEh ; graphics controller register
mov ax, 0205h ; write mode 2
out dx, ax
mov ax, 0003h ; function
out dx, ax
mov ax, 0A000h ; graphics screen segment
mov es, ax
mov ax, [bp+8] ; get y co-ord
mov bx, 640/8 ; 80 bytes/line
mul bx
mov bx, [bp+6] ; get x-coord
mov cl, 3 ; divide by 8 bits/byte
shr bx, cl
add bx, ax
mov al, es:[bx] ; dummy write to latch data in screen RAM
mov cx, [bp+6] ; get x-coord
and cx, 0007h ; get bit mask
mov al, 07h
sub al, cl
mov ah, 80h
shr ah, cl ; shift to bit position
mov al, 08h ; set mask register
mov dx, 03CEh ; dx destroyed by mul
out dx, ax ; write bit mask
mov cx, [bp+10]; color ; write the color value
mov es:[bx], cl
popa
pop bp
ret ; don't pop args off stack - C does this
_SetPixel ENDP
;no main procedure (main in C)
; end of file
END
|