-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathega_palette_2.asm
158 lines (125 loc) · 5.11 KB
/
ega_palette_2.asm
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
146
147
148
149
150
151
152
153
154
155
156
157
158
; Graficky rezim karty EGA s rozlisenim 640x350 pixelu.
; Zmena barvovych rovin, do kterych se zapisuje.
; Konfigurace barvove palety.
;
;
; Tento demonstracni priklad je pouzity v serialu o programovani
; grafickych dem a her na PC v DOSu:
; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/
;
; Clanek, kde je tento demonstracni priklad pouzit:
; Grafická karta EGA: pouze mírný pokrok v mezích zákona (2. část)
; https://www.root.cz/clanky/graficka-karta-ega-pouze-mirny-pokrok-v-mezich-zakona-2-cast/
;
;
; preklad pomoci:
; nasm -f bin -o ega.com ega_palette_2.asm
;
; nebo pouze:
; nasm -o ega.com ega_palette_2.asm
;-----------------------------------------------------------------------------
BITS 16 ; 16bitovy vystup pro DOS
CPU 8086 ; specifikace pouziteho instrukcniho souboru
;-----------------------------------------------------------------------------
; registry karty EGA/VGA
EGA_CONTROLLER equ 0x3c4
BITPLANE_SELECTOR equ 0x02
; ukonceni procesu a navrat do DOSu
%macro exit 0
mov ah, 0x4c
int 0x21
%endmacro
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
xor ax, ax
int 0x16
%endmacro
; nastaveni grafickeho rezimu
%macro gfx_mode 1
mov ah, 0
mov al, %1
int 0x10
%endmacro
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
gfx_mode 0x10 ; nastaveni rezimu 640x350 se sestnacti barvami
mov ax, 0xa000 ; video RAM v textovem rezimu
mov es, ax
xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
xor al, al ; maska bitovych rovin
mov cl, 16 ; pocitadlo barevnych pruhu
opak:
call draw_block_into_bitplanes
loop opak
wait_key ; cekani na klavesu
mov ax, 0x1000 ; cislo sluzby a podsluzby BIOSu
mov bl, 1 ; index barvy
mov bh, 0b111000 ; tmave seda
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 2 ; index barvy
mov bh, 0b000111 ; svetle seda
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 3 ; index barvy
mov bh, 0b111111 ; bila
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 4 ; index barvy
mov bh, 0b010000 ; tmave zelena
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 5 ; index barvy
mov bh, 0b000010 ; stredne zelena
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 6 ; index barvy
mov bh, 0b010010 ; svetle zelena
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 7 ; index barvy
mov bh, 0b100000 ; tmave cervena
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 8 ; index barvy
mov bh, 0b000100 ; stredne cervena
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 9 ; index barvy
mov bh, 0b100100 ; svetle cervena
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 10 ; index barvy
mov bh, 0b001000 ; tmave modra
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 11 ; index barvy
mov bh, 0b000001 ; stredne modra
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 12 ; index barvy
mov bh, 0b001001 ; svetle modra
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 13 ; index barvy
mov bh, 0b110000 ; tmave hneda
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 14 ; index barvy
mov bh, 0b000110 ; svetle hneda
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
mov bl, 15 ; index barvy
mov bh, 0b110110 ; zluta
int 0x10 ; volani sluzby BIOSu pro zmenu jedne barvy
wait_key ; cekani na klavesu
exit ; navrat do DOSu
select_bitplane:
mov dx, EGA_CONTROLLER
mov ah, BITPLANE_SELECTOR
xchg ah, al
out dx, ax ; vyber registru sekvenceru
; a zapis masky bitovych rovin
ret ; hotovo
draw_block_into_bitplanes:
push ax
push cx
call select_bitplane; maska bitovych rovin
call draw_block
add di, 640*3/8 ; posun o nekolik radku nize
pop cx
pop ax
inc al ; zmena masky
ret ; hotovo
draw_block:
mov cx, 640*9/4 ; pocet zapisovanych pixelu (ovsem pocitano v bajtech)
mov al, 0xff ; kod pixelu
rep stosb
ret