Subversion Repositories Kolibri OS

Rev

Rev 837 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 837 Rev 2971
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 834 $
8
$Revision: 2971 $
9
 
9
 
10
struc VBE_VGAInfo {
10
struc VBE_VGAInfo {
11
  .VESASignature          dd ?    ; char
11
  .VESASignature          dd ?    ; char
12
  .VESAVersion            dw ?    ; short
12
  .VESAVersion            dw ?    ; short
13
  .OemStringPtr           dd ?    ; char *
13
  .OemStringPtr           dd ?    ; char *
14
  .Capabilities           dd ?    ; ulong
14
  .Capabilities           dd ?    ; ulong
15
  .VideoModePtr           dd ?    ; ulong
15
  .VideoModePtr           dd ?    ; ulong
16
  .TotalMemory            dw ?    ; short
16
  .TotalMemory            dw ?    ; short
17
  ; VBE 2.0+
17
  ; VBE 2.0+
18
  .OemSoftwareRev         db ?    ; short
18
  .OemSoftwareRev         db ?    ; short
19
  .OemVendorNamePtr       dw ?    ; char *
19
  .OemVendorNamePtr       dw ?    ; char *
20
  .OemProductNamePtr      dw ?    ; char *
20
  .OemProductNamePtr      dw ?    ; char *
21
  .OemProductRevPtr       dw ?    ; char *
21
  .OemProductRevPtr       dw ?    ; char *
22
  .reserved               rb 222  ; char
22
  .reserved               rb 222  ; char
23
  .OemData                rb 256  ; char
23
  .OemData                rb 256  ; char
24
}
24
}
25
 
25
 
26
struc VBE_ModeInfo {
26
struc VBE_ModeInfo {
27
  .ModeAttributes         dw ?    ; short
27
  .ModeAttributes         dw ?    ; short
28
  .WinAAttributes         db ?    ; char
28
  .WinAAttributes         db ?    ; char
29
  .WinBAttributes         db ?    ; char
29
  .WinBAttributes         db ?    ; char
30
  .WinGranularity         dw ?    ; short
30
  .WinGranularity         dw ?    ; short
31
  .WinSize                dw ?    ; short
31
  .WinSize                dw ?    ; short
32
  .WinASegment            dw ?    ; ushort
32
  .WinASegment            dw ?    ; ushort
33
  .WinBSegment            dw ?    ; ushort
33
  .WinBSegment            dw ?    ; ushort
34
  .WinFuncPtr             dd ?    ; void *
34
  .WinFuncPtr             dd ?    ; void *
35
  .BytesPerScanLine       dw ?    ; short
35
  .BytesPerScanLine       dw ?    ; short
36
  .XRes                   dw ?    ; short
36
  .XRes                   dw ?    ; short
37
  .YRes                   dw ?    ; short
37
  .YRes                   dw ?    ; short
38
  .XCharSize              db ?    ; char
38
  .XCharSize              db ?    ; char
39
  .YCharSize              db ?    ; char
39
  .YCharSize              db ?    ; char
40
  .NumberOfPlanes         db ?    ; char
40
  .NumberOfPlanes         db ?    ; char
41
  .BitsPerPixel           db ?    ; char
41
  .BitsPerPixel           db ?    ; char
42
  .NumberOfBanks          db ?    ; char
42
  .NumberOfBanks          db ?    ; char
43
  .MemoryModel            db ?    ; char
43
  .MemoryModel            db ?    ; char
44
  .BankSize               db ?    ; char
44
  .BankSize               db ?    ; char
45
  .NumberOfImagePages     db ?    ; char
45
  .NumberOfImagePages     db ?    ; char
46
  .res1                   db ?    ; char
46
  .res1                   db ?    ; char
47
  .RedMaskSize            db ?    ; char
47
  .RedMaskSize            db ?    ; char
48
  .RedFieldPosition       db ?    ; char
48
  .RedFieldPosition       db ?    ; char
49
  .GreenMaskSize          db ?    ; char
49
  .GreenMaskSize          db ?    ; char
50
  .GreenFieldPosition     db ?    ; char
50
  .GreenFieldPosition     db ?    ; char
51
  .BlueMaskSize           db ?    ; char
51
  .BlueMaskSize           db ?    ; char
52
  .BlueFieldPosition      db ?    ; char
52
  .BlueFieldPosition      db ?    ; char
53
  .RsvedMaskSize          db ?    ; char
53
  .RsvedMaskSize          db ?    ; char
54
  .RsvedFieldPosition     db ?    ; char
54
  .RsvedFieldPosition     db ?    ; char
55
  .DirectColorModeInfo    db ?    ; char ; MISSED IN THIS TUTORIAL!! SEE ABOVE
55
  .DirectColorModeInfo    db ?    ; char ; MISSED IN THIS TUTORIAL!! SEE ABOVE
56
  ; VBE 2.0+
56
  ; VBE 2.0+
57
  .PhysBasePtr            dd ?    ; ulong
57
  .PhysBasePtr            dd ?    ; ulong
58
  .OffScreenMemOffset     dd ?    ; ulong
58
  .OffScreenMemOffset     dd ?    ; ulong
59
  .OffScreenMemSize       dw ?    ; short
59
  .OffScreenMemSize       dw ?    ; short
60
  ; VBE 3.0+
60
  ; VBE 3.0+
61
  .LinbytesPerScanLine    dw ?    ; short
61
  .LinbytesPerScanLine    dw ?    ; short
62
  .BankNumberOfImagePages db ?    ; char
62
  .BankNumberOfImagePages db ?    ; char
63
  .LinNumberOfImagePages  db ?    ; char
63
  .LinNumberOfImagePages  db ?    ; char
64
  .LinRedMaskSize         db ?    ; char
64
  .LinRedMaskSize         db ?    ; char
65
  .LinRedFieldPosition    db ?    ; char
65
  .LinRedFieldPosition    db ?    ; char
66
  .LingreenMaskSize       db ?    ; char
66
  .LingreenMaskSize       db ?    ; char
67
  .LinGreenFieldPosition  db ?    ; char
67
  .LinGreenFieldPosition  db ?    ; char
68
  .LinBlueMaskSize        db ?    ; char
68
  .LinBlueMaskSize        db ?    ; char
69
  .LinBlueFieldPosition   db ?    ; char
69
  .LinBlueFieldPosition   db ?    ; char
70
  .LinRsvdMaskSize        db ?    ; char
70
  .LinRsvdMaskSize        db ?    ; char
71
  .LinRsvdFieldPosition   db ?    ; char
71
  .LinRsvdFieldPosition   db ?    ; char
72
  .MaxPixelClock          dd ?    ; ulong
72
  .MaxPixelClock          dd ?    ; ulong
73
  .res2                   rb 190  ; char
73
  .res2                   rb 190  ; char
74
}
74
}
75
 
75
 
76
virtual at $A000
76
virtual at $A000
77
  vi VBE_VGAInfo
77
  vi VBE_VGAInfo
78
  mi VBE_ModeInfo
78
  mi VBE_ModeInfo
79
modes_table:
79
modes_table:
80
end virtual
80
end virtual
81
cursor_pos  dw 0         ;âðåìåííîå õðàíåíèå êóðñîðà.
81
cursor_pos  dw 0         ;âðåìåííîå õðàíåíèå êóðñîðà.
82
home_cursor dw 0    ;current shows rows a table
82
home_cursor dw 0    ;current shows rows a table
83
end_cursor  dw 0     ;end of position current shows rows a table
83
end_cursor  dw 0     ;end of position current shows rows a table
84
scroll_start dw 0    ;start position of scroll bar
84
scroll_start dw 0    ;start position of scroll bar
85
scroll_end  dw 0     ;end position of scroll bar
85
scroll_end  dw 0     ;end position of scroll bar
86
long_v_table equ 9   ;long of visible video table
86
long_v_table equ 9   ;long of visible video table
87
size_of_step equ 10
87
size_of_step equ 10
88
scroll_area_size equ (long_v_table-2)
88
scroll_area_size equ (long_v_table-2)
89
int2str:
89
int2str:
90
        dec     bl
90
        dec     bl
91
        jz      @f
91
        jz      @f
92
        xor     edx,edx
92
        xor     edx,edx
93
        div     ecx
93
        div     ecx
94
        push    edx
94
        push    edx
95
        call    int2str
95
        call    int2str
96
        pop     eax
96
        pop     eax
97
    @@: or      al,0x30
97
    @@: or      al,0x30
98
        mov     [ds:di],al
98
        mov     [ds:di],al
99
        inc     di
99
        inc     di
100
        ret
100
        ret
101
 
101
 
102
int2strnz:
102
int2strnz:
103
        cmp     eax,ecx
103
        cmp     eax,ecx
104
        jb      @f
104
        jb      @f
105
        xor     edx,edx
105
        xor     edx,edx
106
        div     ecx
106
        div     ecx
107
        push    edx
107
        push    edx
108
        call    int2strnz
108
        call    int2strnz
109
        pop     eax
109
        pop     eax
110
    @@: or      al,0x30
110
    @@: or      al,0x30
111
        mov     [es:di],al
111
        mov     [es:di],al
112
        inc     di
112
        inc     di
113
        ret
113
        ret
114
;-------------------------------------------------------
114
;-------------------------------------------------------
115
;Write message about incorrect v_mode and write message about jmp on swith v_mode
115
;Write message about incorrect v_mode and write message about jmp on swith v_mode
116
v_mode_error:
116
v_mode_error:
117
        _setcursor 19,2
117
        _setcursor 19,2
118
        mov     si, fatalsel
118
        mov     si, fatalsel
119
        call    printplain
119
        call    printplain
120
        _setcursor 20,2
120
        _setcursor 20,2
121
        mov     si,pres_key
121
        mov     si,pres_key
122
        call    printplain
122
        call    printplain
123
        xor     eax,eax
123
        xor     eax,eax
124
        int     16h
124
        int     16h
125
        jmp     cfgmanager.d
125
        jmp     cfgmanager.d
126
;-------------------------------------------------------
126
;-------------------------------------------------------
127
;
127
;
128
 
128
 
129
 
129
 
130
 
130
 
131
;-------------------------------------------------------
131
;-------------------------------------------------------
132
print_vesa_info:
132
print_vesa_info:
133
        _setcursor 5,2
133
        _setcursor 5,2
134
 
134
 
135
        mov     [es:vi.VESASignature],'VBE2'
135
        mov     [es:vi.VESASignature],'VBE2'
136
        mov     ax,0x4F00
136
        mov     ax,0x4F00
137
        mov     di,vi      ;0xa000
137
        mov     di,vi      ;0xa000
138
        int     0x10
138
        int     0x10
139
        or      ah,ah
139
        or      ah,ah
140
        jz      @f
140
        jz      @f
141
        mov     [es:vi.VESASignature],'VESA'
141
        mov     [es:vi.VESASignature],'VESA'
142
        mov     ax,$4F00
142
        mov     ax,$4F00
143
        mov     di,vi
143
        mov     di,vi
144
        int     0x10
144
        int     0x10
145
        or      ah,ah
145
        or      ah,ah
146
        jnz     .exit
146
        jnz     .exit
147
  @@:
147
  @@:
148
        cmp     [es:vi.VESASignature],'VESA'
148
        cmp     [es:vi.VESASignature],'VESA'
149
        jne     .exit
149
        jne     .exit
150
        cmp     [es:vi.VESAVersion],0x0100
150
        cmp     [es:vi.VESAVersion],0x0100
151
        jb      .exit
151
        jb      .exit
152
        jmp     .vesaok2
152
        jmp     .vesaok2
153
 
153
 
154
  .exit:
154
  .exit:
155
        mov     si,novesa
155
        mov     si,novesa
156
        call    printplain
156
        call    printplain
157
        ret
157
        ret
158
 
158
 
159
  .vesaok2:
159
  .vesaok2:
160
        mov     ax,[es:vi.VESAVersion]
160
        mov     ax,[es:vi.VESAVersion]
161
        add     ax,'00'
161
        add     ax,'00'
162
 
162
 
163
        mov     [s_vesa.ver], ah
163
        mov     [s_vesa.ver], ah
164
        mov     [s_vesa.ver+2], al
164
        mov     [s_vesa.ver+2], al
165
        mov     si,s_vesa
165
        mov     si,s_vesa
166
        call    printplain
166
        call    printplain
167
 
167
 
168
        _setcursor 4,2
168
        _setcursor 4,2
169
        mov     si,word[es:vi.OemStringPtr]
169
        mov     si,word[es:vi.OemStringPtr]
170
        mov     di,si
170
        mov     di,si
171
 
171
 
172
        push    ds
172
        push    ds
173
        mov     ds,word[es:vi.OemStringPtr+2]
173
        mov     ds,word[es:vi.OemStringPtr+2]
174
        call    printplain
174
        call    printplain
175
        pop     ds
175
        pop     ds
176
 
176
 
177
        ret
177
        ret
178
;-----------------------------------------------------------------------------
178
;-----------------------------------------------------------------------------
179
 
179
 
180
calc_vmodes_table:
180
calc_vmodes_table:
181
        pushad
181
        pushad
182
 
182
 
183
;        push    0
183
;        push    0
184
;        pop     es
184
;        pop     es
185
 
185
 
186
        lfs     si, [es:vi.VideoModePtr]
186
        lfs     si, [es:vi.VideoModePtr]
187
 
187
 
188
        mov     bx,modes_table
188
        mov     bx,modes_table
189
;save no vesa mode of work 320x200, EGA/CGA 256 梥⮢ and 640x480, VGA 16 梥⮢
189
;save no vesa mode of work 320x200, EGA/CGA 256 梥⮢ and 640x480, VGA 16 梥⮢
190
        mov     word [es:bx],640
190
        mov     word [es:bx],640
191
        mov     word [es:bx+2],480
191
        mov     word [es:bx+2],480
192
        mov     word [es:bx+6],0x13
192
        mov     word [es:bx+6],0x13
193
        
193
        
194
        mov     word [es:bx+10],640
194
        mov     word [es:bx+10],640
195
        mov     word [es:bx+12],480
195
        mov     word [es:bx+12],480
196
        mov     word [es:bx+16],0x12
196
        mov     word [es:bx+16],0x12
197
        add     bx,20
197
        add     bx,20
198
  .next_mode:
198
  .next_mode:
199
        mov     cx,word [fs:si] ; mode number
199
        mov     cx,word [fs:si] ; mode number
200
        cmp     cx,-1
200
        cmp     cx,-1
201
        je      .modes_ok.2
201
        je      .modes_ok.2
202
 
202
 
203
        mov     ax,0x4F01
203
        mov     ax,0x4F01
204
        mov     di,mi
204
        mov     di,mi
205
        int     0x10
205
        int     0x10
206
 
206
 
207
        or      ah,ah
207
        or      ah,ah
208
        jnz     .modes_ok.2;vesa_info.exit
208
        jnz     .modes_ok.2;vesa_info.exit
209
 
209
 
210
        test    [es:mi.ModeAttributes],00000001b   ;videomode support ?
210
        test    [es:mi.ModeAttributes],00000001b   ;videomode support ?
211
        jz      @f
211
        jz      @f
212
        test    [es:mi.ModeAttributes],00010000b   ;picture ?
212
        test    [es:mi.ModeAttributes],00010000b   ;picture ?
213
        jz      @f
213
        jz      @f
214
        test    [es:mi.ModeAttributes],10000000b   ;LFB ?
214
        test    [es:mi.ModeAttributes],10000000b   ;LFB ?
215
        jz      @f
215
        jz      @f
216
 
216
 
217
;        cmp     [es:mi.BitsPerPixel], 24
217
;        cmp     [es:mi.BitsPerPixel], 24
218
;        jb      @f
218
;        jb      @f
219
 
219
 
220
        cmp     [es:mi.BitsPerPixel],16
220
;        cmp     [es:mi.BitsPerPixel],16
221
        jne     .l0
221
;        jne     .l0
222
        cmp     [es:mi.GreenMaskSize],5
222
;        cmp     [es:mi.GreenMaskSize],5
223
        jne     .l0
223
;        jne     .l0
224
        mov     [es:mi.BitsPerPixel],15
224
;        mov     [es:mi.BitsPerPixel],15
225
 
225
 
226
 
226
 
227
  .l0:
227
.l0:
228
        cmp     [es:mi.XRes],640
228
        cmp     [es:mi.XRes],640
229
        jb      @f
229
        jb      @f
230
        cmp     [es:mi.YRes],480
230
        cmp     [es:mi.YRes],480
231
        jb      @f
231
        jb      @f
232
;        cmp     [es:mi.BitsPerPixel],8
232
;        cmp     [es:mi.BitsPerPixel],8
233
;        jb      @f
233
;        jb      @f
234
 
234
 
235
        mov     ax,[es:mi.XRes]
235
        mov     ax,[es:mi.XRes]
236
        mov     [es:bx+0],ax               ; +0[2] : resolution X
236
        mov     [es:bx+0],ax               ; +0[2] : resolution X
237
        mov     ax,[es:mi.YRes]
237
        mov     ax,[es:mi.YRes]
238
        mov     [es:bx+2],ax               ; +2[2] : resolution Y
238
        mov     [es:bx+2],ax               ; +2[2] : resolution Y
239
        mov     ax,[es:mi.ModeAttributes]
239
        mov     ax,[es:mi.ModeAttributes]
240
        mov     [es:bx+4],ax               ; +4[2] : attributes
240
        mov     [es:bx+4],ax               ; +4[2] : attributes
241
 
241
 
242
        cmp     [s_vesa.ver],'2'
242
        cmp     [s_vesa.ver],'2'
243
        jb      .lp1
243
        jb      .lp1
244
 
244
 
245
        or      cx,0x4000  ; use LFB
245
        or      cx,0x4000  ; use LFB
246
  .lp1: mov     [es:bx+6],cx               ; +6 : mode number
246
.lp1:	mov     [es:bx+6],cx               ; +6 : mode number
247
        movzx   ax,byte [es:mi.BitsPerPixel]
247
        movzx   ax,byte [es:mi.BitsPerPixel]
248
        mov     word [es:bx+8],ax               ; +8 : bits per pixel
248
        mov     word [es:bx+8],ax               ; +8 : bits per pixel
249
        add     bx,size_of_step
249
        add     bx,size_of_step                 ; size of record 
250
 
250
 
251
    @@:
251
    @@:
252
        add     si,2
252
        add     si,2
253
        jmp     .next_mode
253
        jmp     .next_mode
254
 
254
 
255
  .modes_ok.2:
255
  .modes_ok.2:
256
 
256
 
257
        mov     word[es:bx],-1  ;end video table
257
        mov     word[es:bx],-1  ;end video table
258
        mov     word[end_cursor],bx     ;save end cursor position
258
        mov     word[end_cursor],bx     ;save end cursor position
259
;;;;;;;;;;;;;;;;;;
259
;;;;;;;;;;;;;;;;;;
260
;Sort array
260
;Sort array
261
;        mov     si,modes_table
261
;        mov     si,modes_table
262
;.new_mode:
262
;.new_mode:
263
;        mov     ax,word [es:si]
263
;        mov     ax,word [es:si]
264
;        cmp     ax,-1
264
;        cmp     ax,-1
265
;        je      .exxit
265
;        je      .exxit
266
;        add     ax,word [es:si+2]
266
;        add     ax,word [es:si+2]
267
;        add     ax,word [es:si+8]
267
;        add     ax,word [es:si+8]
268
;        mov     bp,si
268
;        mov     bp,si
269
;.again:
269
;.again:
270
;        add     bp,12
270
;        add     bp,12
271
;        mov     bx,word [es:bp]
271
;        mov     bx,word [es:bp]
272
;        cmp     bx,-1
272
;        cmp     bx,-1
273
;        je      .exit
273
;        je      .exit
274
;        add     bx,word [es:bp+2]
274
;        add     bx,word [es:bp+2]
275
;        add     bx,word [es:bp+8]
275
;        add     bx,word [es:bp+8]
276
;        
276
;        
277
;        cmp     ax,bx
277
;        cmp     ax,bx
278
;        ja      .loops
278
;        ja      .loops
279
;        jmp     .again
279
;        jmp     .again
280
;.loops: 
280
;.loops: 
281
;        push    dword [es:si]
281
;        push    dword [es:si]
282
;        push    dword [es:si+4]
282
;        push    dword [es:si+4]
283
;        push    dword [es:si+8]
283
;        push    dword [es:si+8]
284
;        push    dword [es:bp]
284
;        push    dword [es:bp]
285
;        push    dword [es:bp+4]
285
;        push    dword [es:bp+4]
286
;        push    dword [es:bp+8]
286
;        push    dword [es:bp+8]
287
;
287
;
288
;        pop     dword [es:si+8]
288
;        pop     dword [es:si+8]
289
;        pop     dword [es:si+4]
289
;        pop     dword [es:si+4]
290
;        pop     dword [es:si]
290
;        pop     dword [es:si]
291
;        pop     dword [es:bp+8]
291
;        pop     dword [es:bp+8]
292
;        pop     dword [es:bp+4]
292
;        pop     dword [es:bp+4]
293
;        pop     dword [es:bp]
293
;        pop     dword [es:bp]
294
;        jmp     .new_mode
294
;        jmp     .new_mode
295
;
295
;
296
;.exit:  add     si,12
296
;.exit:  add     si,12
297
;        jmp     .new_mode
297
;        jmp     .new_mode
298
;.exxit:
298
;.exxit:
299
        popad
299
        popad
300
        ret
300
        ret
301
 
301
 
302
;-----------------------------------------------------------------------------
302
;-----------------------------------------------------------------------------
303
 
303
 
304
draw_current_vmode:
304
draw_current_vmode:
305
        push    0
305
        push    0
306
        pop     es
306
        pop     es
307
 
307
 
308
        mov     si,word [cursor_pos]
308
        mov     si,word [cursor_pos]
309
 
309
 
310
        cmp     word [es:si+6],0x12
310
        cmp     word [es:si+6],0x12
311
        je      .no_vesa_0x12
311
        je      .no_vesa_0x12
312
 
312
 
313
        cmp     word [es:si+6],0x13
313
        cmp     word [es:si+6],0x13
314
        je      .no_vesa_0x13
314
        je      .no_vesa_0x13
315
 
315
 
316
        mov     di,loader_block_error
316
        mov     di,loader_block_error
317
        movzx   eax,word[es:si+0]
317
        movzx   eax,word[es:si+0]
318
        mov     ecx,10
318
        mov     ecx,10
319
        call    int2strnz
319
        call    int2strnz
320
        mov     byte[es:di],'x'
320
        mov     byte[es:di],'x'
321
        inc     di
321
        inc     di
322
        movzx   eax,word[es:si+2]
322
        movzx   eax,word[es:si+2]
323
        call    int2strnz
323
        call    int2strnz
324
        mov     byte[es:di],'x'
324
        mov     byte[es:di],'x'
325
        inc     di
325
        inc     di
326
        movzx   eax,word[es:si+8]
326
        movzx   eax,word[es:si+8]
327
        call    int2strnz
327
        call    int2strnz
328
        mov     dword[es:di],0x00000d0a
328
        mov     dword[es:di],0x00000d0a
329
        mov     si,loader_block_error
329
        mov     si,loader_block_error
330
        push    ds
330
        push    ds
331
        push    es
331
        push    es
332
        pop     ds
332
        pop     ds
333
        call    printplain
333
        call    printplain
334
        pop     ds
334
        pop     ds
335
        ret
335
        ret
336
.no_vesa_0x13:
336
.no_vesa_0x13:
337
        mov     si,mode0
337
        mov     si,mode0
338
        jmp     .print
338
        jmp     .print
339
.no_vesa_0x12:
339
.no_vesa_0x12:
340
        mov     si,mode9
340
        mov     si,mode9
341
.print:
341
.print:
342
        call    printplain
342
        call    printplain
343
        ret        
343
        ret        
344
;-----------------------------------------------------------------------------
344
;-----------------------------------------------------------------------------
345
check_first_parm:
345
check_first_parm:
346
        mov     si,word [preboot_graph]
346
        mov     si,word [preboot_graph]
347
        test    si,si
347
        test    si,si
348
        jnz      .no_zero        ;if no zero
348
        jnz      .no_zero        ;if no zero
349
.zerro:
349
.zerro:
350
;        mov     ax,modes_table
350
;        mov     ax,modes_table
351
;        mov     word [cursor_pos],ax
351
;        mov     word [cursor_pos],ax
352
;        mov     word [home_cursor],ax
352
;        mov     word [home_cursor],ax
353
;        mov     word [preboot_graph],ax
353
;        mov     word [preboot_graph],ax
354
;SET default video of mode first probe will fined a move of work 1024x768@32
354
;SET default video of mode first probe will fined a move of work 1024x768@32
355
 
355
 
356
        mov     ax,1024
356
        mov     ax,1024
357
        mov     bx,768
357
        mov     bx,768
358
        mov     si,modes_table
358
        mov     si,modes_table
359
        call    .loops
359
        call    .loops
360
        test    ax,ax
360
        test    ax,ax
361
        jz     .ok_found_mode
361
        jz     .ok_found_mode
362
        mov     ax,800
362
        mov     ax,800
363
        mov     bx,600
363
        mov     bx,600
364
        mov     si,modes_table
364
        mov     si,modes_table
365
        call    .loops
365
        call    .loops
366
        test    ax,ax
366
        test    ax,ax
367
        jz     .ok_found_mode
367
        jz     .ok_found_mode
368
        mov     ax,640
368
        mov     ax,640
369
        mov     bx,480
369
        mov     bx,480
370
        mov     si,modes_table
370
        mov     si,modes_table
371
        call    .loops
371
        call    .loops
372
        test    ax,ax
372
        test    ax,ax
373
        jz     .ok_found_mode
373
        jz     .ok_found_mode
374
 
374
 
375
        mov     si,modes_table
375
        mov     si,modes_table
376
        jmp     .ok_found_mode
376
        jmp     .ok_found_mode
377
 
377
 
378
 
378
 
379
 
379
 
380
.no_zero:
380
.no_zero:
381
	mov	bp,word [number_vm]
381
	mov	bp,word [number_vm]
382
        cmp     bp,word [es:si+6]
382
        cmp     bp,word [es:si+6]
383
        jz      .ok_found_mode
383
        jz      .ok_found_mode
384
        mov     ax,word [x_save]
384
        mov     ax,word [x_save]
385
        mov     bx,word [y_save]
385
        mov     bx,word [y_save]
386
        mov     si,modes_table
386
        mov     si,modes_table
387
        call    .loops
387
        call    .loops
388
        test    ax,ax
388
        test    ax,ax
389
        jz     .ok_found_mode
389
        jz     .ok_found_mode
390
 
390
 
391
	mov    si,modes_table
391
	mov    si,modes_table
392
;        cmp     ax,modes_table
392
;        cmp     ax,modes_table
393
;        jb      .zerro           ;check on correct if bellow
393
;        jb      .zerro           ;check on correct if bellow
394
;        cmp     ax,word [end_cursor]
394
;        cmp     ax,word [end_cursor]
395
;        ja      .zerro           ;check on correct if anymore
395
;        ja      .zerro           ;check on correct if anymore
396
 
396
 
397
.ok_found_mode:
397
.ok_found_mode:
398
        mov     word [home_cursor],si
398
        mov     word [home_cursor],si
399
;        mov     word [cursor_pos],si
399
;        mov     word [cursor_pos],si
400
        mov     word [preboot_graph],si
400
        mov     word [preboot_graph],si
401
        mov     ax,si
401
        mov     ax,si
402
 
402
 
403
        mov     ecx,long_v_table
403
        mov     ecx,long_v_table
404
 
404
 
405
.loop:  add     ax,size_of_step
405
.loop:  add     ax,size_of_step
406
        cmp     ax,word [end_cursor]
406
        cmp     ax,word [end_cursor]
407
        jae     .next_step
407
        jae     .next_step
408
        loop    .loop
408
        loop    .loop
409
.next_step:
409
.next_step:
410
        sub     ax,size_of_step*long_v_table
410
        sub     ax,size_of_step*long_v_table
411
        cmp     ax,modes_table
411
        cmp     ax,modes_table
412
        jae     @f
412
        jae     @f
413
        mov     ax,modes_table
413
        mov     ax,modes_table
414
@@:
414
@@:
415
 
415
 
416
        mov     word[home_cursor],ax
416
        mov     word [home_cursor],ax
417
        push    word [preboot_graph]
417
        mov	si,[preboot_graph]
418
        pop     word [cursor_pos]
418
        mov     word [cursor_pos],si
-
 
419
 
-
 
420
        push    word [es:si]
-
 
421
        pop     word [x_save]
-
 
422
        push    word [es:si+2]
-
 
423
        pop     word [y_save]
-
 
424
        push    word [es:si+6]
-
 
425
        pop     word [number_vm]
-
 
426
 
419
        ret
427
        ret
420
;;;;;;;;;;;;;;;;;;;;;;;;;;;
428
;;;;;;;;;;;;;;;;;;;;;;;;;;;
421
.loops:
429
.loops:
422
        cmp     ax,word [es:si]
430
        cmp     ax,word [es:si]
423
        jne     .next
431
        jne     .next
424
        cmp     bx,word [es:si+2]
432
        cmp     bx,word [es:si+2]
425
        jne     .next
433
        jne     .next
426
        cmp     word [es:si+8],32
434
        cmp     word [es:si+8],32
427
        je      .ok
435
        je      .ok
428
        cmp     word [es:si+8],24
436
        cmp     word [es:si+8],24
429
        je      .ok
437
        je      .ok
430
.next:  add     si,size_of_step
438
.next:  add     si,size_of_step
431
        cmp     word [es:si],-1
439
        cmp     word [es:si],-1
432
        je      .exit
440
        je      .exit
433
        jmp     .loops
441
        jmp     .loops
434
.ok:    xor     ax,ax        
442
.ok:    xor     ax,ax        
-
 
443
	ret
435
.exit:  ret
444
.exit:  or	ax,-1
-
 
445
	ret
436
 
446
 
437
 
447
 
438
;-----------------------------------------------------------------------------
448
;-----------------------------------------------------------------------------
439
 
449
 
440
;default_vmode:
450
;default_vmode:
441
        
451
        
442
;-----------------------------------------------------------------------------
452
;-----------------------------------------------------------------------------
443
draw_vmodes_table:
453
draw_vmodes_table:
444
        _setcursor 9, 2
454
        _setcursor 9, 2
445
        mov     si,gr_mode
455
        mov     si,gr_mode
446
        call    printplain
456
        call    printplain
447
 
457
 
448
        mov     si,_st
458
        mov     si,_st
449
        call    printplain
459
        call    printplain
450
 
460
 
451
        push    word [cursor_pos]
461
        push    word [cursor_pos]
452
        pop     ax
462
        pop     ax
453
        push    word [home_cursor]
463
        push    word [home_cursor]
454
        pop     si
464
        pop     si
455
        mov     cx,si
465
        mov     cx,si
456
 
466
 
457
        cmp     ax,si
467
        cmp     ax,si
458
        je      .ok
468
        je      .ok
459
        jb      .low
469
        jb      .low
460
 
470
 
461
 
471
 
462
        add     cx,size_of_step*long_v_table
472
        add     cx,size_of_step*long_v_table
463
        
473
        
464
        cmp     ax,cx
474
        cmp     ax,cx
465
        jb      .ok
475
        jb      .ok
466
        
476
        
467
        sub     cx,size_of_step*long_v_table
477
        sub     cx,size_of_step*long_v_table
468
        add     cx,size_of_step
478
        add     cx,size_of_step
469
        cmp     cx,word[end_cursor]
479
        cmp     cx,word[end_cursor]
470
        jae     .ok
480
        jae     .ok
471
        add     si,size_of_step
481
        add     si,size_of_step
472
        push    si
482
        push    si
473
        pop     word [home_cursor]
483
        pop     word [home_cursor]
474
        jmp     .ok
484
        jmp     .ok
475
 
485
 
476
 
486
 
477
.low:   sub     cx,size_of_step
487
.low:   sub     cx,size_of_step
478
        cmp     cx,modes_table
488
        cmp     cx,modes_table
479
        jb      .ok
489
        jb      .ok
480
        push    cx
490
        push    cx
481
        push    cx
491
        push    cx
482
        pop     word [home_cursor]
492
        pop     word [home_cursor]
483
        pop     si
493
        pop     si
484
 
494
 
485
 
495
 
486
.ok:
496
.ok:
487
; calculate scroll position
497
; calculate scroll position
488
        push    si
498
        push    si
489
        mov     ax, [end_cursor]
499
        mov     ax, [end_cursor]
490
        sub     ax, modes_table
500
        sub     ax, modes_table
491
        mov     bx, size_of_step
501
        mov     bx, size_of_step
492
        cwd
502
        cwd
493
        div     bx
503
        div     bx
494
        mov     si, ax          ; si = size of list
504
        mov     si, ax          ; si = size of list
495
        mov     ax, [home_cursor]
505
        mov     ax, [home_cursor]
496
        sub     ax, modes_table
506
        sub     ax, modes_table
497
        cwd
507
        cwd
498
        div     bx
508
        div     bx
499
        mov     di, ax
509
        mov     di, ax
500
        mov     ax, scroll_area_size*long_v_table
510
        mov     ax, scroll_area_size*long_v_table
501
        cwd
511
        cwd
502
        div     si
512
        div     si
503
        test    ax, ax
513
        test    ax, ax
504
        jnz     @f
514
        jnz     @f
505
        inc     ax
515
        inc     ax
506
@@:
516
@@:
507
        cmp     al, scroll_area_size
517
        cmp     al, scroll_area_size
508
        jb      @f
518
        jb      @f
509
        mov     al, scroll_area_size
519
        mov     al, scroll_area_size
510
@@:
520
@@:
511
        mov     cx, ax
521
        mov     cx, ax
512
; cx = scroll height
522
; cx = scroll height
513
; calculate scroll pos
523
; calculate scroll pos
514
        xor     bx, bx          ; initialize scroll pos
524
        xor     bx, bx          ; initialize scroll pos
515
        sub     al, scroll_area_size+1
525
        sub     al, scroll_area_size+1
516
        neg     al
526
        neg     al
517
        sub     si, long_v_table-1
527
        sub     si, long_v_table-1
518
        jbe     @f
528
        jbe     @f
519
        mul     di
529
        mul     di
520
        div     si
530
        div     si
521
        mov     bx, ax
531
        mov     bx, ax
522
@@:
532
@@:
523
        inc     bx
533
        inc     bx
524
        imul    ax, bx, size_of_step
534
        imul    ax, bx, size_of_step
525
        add     ax, [home_cursor]
535
        add     ax, [home_cursor]
526
        mov     [scroll_start], ax
536
        mov     [scroll_start], ax
527
        imul    cx, size_of_step
537
        imul    cx, size_of_step
528
        add     ax, cx
538
        add     ax, cx
529
        mov     [scroll_end], ax
539
        mov     [scroll_end], ax
530
        pop     si
540
        pop     si
531
        mov     bp,long_v_table               ;show rows
541
        mov     bp,long_v_table               ;show rows
532
.@@_next_bit:
542
.@@_next_bit:
533
;clear cursor
543
;clear cursor
-
 
544
	mov	ax,'  '
534
        mov     word[ds:_r1+21],'  '
545
        mov     word[ds:_r1+21],ax
535
        mov     word[ds:_r1+50],'  '
546
        mov     word[ds:_r1+50],ax
536
 
547
 
537
        mov     word[ds:_r2+21],'  '
548
        mov     word[ds:_r2+21],ax
538
        mov     word[ds:_r2+45],'  '
549
        mov     word[ds:_r2+45],ax
539
 
550
 
540
        mov     word[ds:_rs+21],'  '
551
        mov     word[ds:_rs+21],ax
541
        mov     word[ds:_rs+46],'  '
552
        mov     word[ds:_rs+46],ax
542
; draw string
553
; draw string
543
        cmp     word [es:si+6],0x12
554
        cmp     word [es:si+6],0x12
544
        je      .show_0x12
555
        je      .show_0x12
545
        cmp     word [es:si+6],0x13
556
        cmp     word [es:si+6],0x13
546
        je      .show_0x13
557
        je      .show_0x13
547
 
558
 
548
        movzx   eax,word[es:si]
559
        movzx   eax,word[es:si]
549
        cmp     ax,-1
560
        cmp     ax,-1
550
        je      .@@_end
561
        je      .@@_end
551
        mov     di,_rs+23          
562
        mov     di,_rs+23          
552
        mov     ecx,10
563
        mov     ecx,10
553
        mov     bl,4
564
        mov     bl,4
554
        call    int2str
565
        call    int2str
555
        movzx   eax,word[es:si+2]
566
        movzx   eax,word[es:si+2]
556
        inc     di
567
        inc     di
557
        mov     bl,4
568
        mov     bl,4
558
        call    int2str
569
        call    int2str
559
 
570
 
560
        movzx   eax,word[es:si+8]
571
        movzx   eax,word[es:si+8]
561
        inc     di
572
        inc     di
562
        mov     bl,2
573
        mov     bl,2
563
        call    int2str
574
        call    int2str
564
 
575
 
565
        cmp     si, word [cursor_pos]
576
        cmp     si, word [cursor_pos]
566
        jne     .next
577
        jne     .next
567
;draw   cursor
578
;draw   cursor
568
        mov     word[ds:_rs+21],'>>'
579
        mov     word[ds:_rs+21],'>>'
569
        mov     word[ds:_rs+46],'<<'
580
        mov     word[ds:_rs+46],'<<'
570
        
581
        
571
 
582
 
572
 
583
 
573
.next:
584
.next:
574
        push    si
585
        push    si
575
        mov     si,_rs
586
        mov     si,_rs
576
.@@_sh:
587
.@@_sh:
577
; add to the string pseudographics for scrollbar
588
; add to the string pseudographics for scrollbar
578
        pop     bx
589
        pop     bx
579
        push    bx
590
        push    bx
580
        mov     byte [si+53], ' '
591
        mov     byte [si+53], ' '
581
        cmp     bx, [scroll_start]
592
        cmp     bx, [scroll_start]
582
        jb      @f
593
        jb      @f
583
        cmp     bx, [scroll_end]
594
        cmp     bx, [scroll_end]
584
        jae     @f
595
        jae     @f
585
        mov     byte [si+53], 0xDB ; filled bar
596
        mov     byte [si+53], 0xDB ; filled bar
586
@@:
597
@@:
587
        push    bx
598
        push    bx
588
        add     bx, size_of_step
599
        add     bx, size_of_step
589
        cmp     bx, [end_cursor]
600
        cmp     bx, [end_cursor]
590
        jnz     @f
601
        jnz     @f
591
        mov     byte [si+53], 31 ; 'down arrow' symbol
602
        mov     byte [si+53], 31 ; 'down arrow' symbol
592
@@:
603
@@:
593
        sub     bx, [home_cursor]
604
        sub     bx, [home_cursor]
594
        cmp     bx, size_of_step*long_v_table
605
        cmp     bx, size_of_step*long_v_table
595
        jnz     @f
606
        jnz     @f
596
        mov     byte [si+53], 31 ; 'down arrow' symbol
607
        mov     byte [si+53], 31 ; 'down arrow' symbol
597
@@:
608
@@:
598
        pop     bx
609
        pop     bx
599
        cmp     bx, [home_cursor]
610
        cmp     bx, [home_cursor]
600
        jnz     @f
611
        jnz     @f
601
        mov     byte [si+53], 30 ; 'up arrow' symbol
612
        mov     byte [si+53], 30 ; 'up arrow' symbol
602
@@:
613
@@:
603
        call    printplain
614
        call    printplain
604
        pop     si
615
        pop     si
605
        add     si,size_of_step
616
        add     si,size_of_step
606
 
617
 
607
        dec     bp
618
        dec     bp
608
        jnz     .@@_next_bit
619
        jnz     .@@_next_bit
609
 
620
 
610
.@@_end:
621
.@@_end:
611
        mov     si,_bt
622
        mov     si,_bt
612
        call    printplain
623
        call    printplain
613
        ret
624
        ret
614
.show_0x13:
625
.show_0x13:
615
        push    si
626
        push    si
616
 
627
 
617
        cmp     si, word [cursor_pos]
628
        cmp     si, word [cursor_pos]
618
        jne     @f
629
        jne     @f
619
        mov     word[ds:_r1+21],'>>'
630
        mov     word[ds:_r1+21],'>>'
620
        mov     word[ds:_r1+50],'<<'        
631
        mov     word[ds:_r1+50],'<<'        
621
@@:
632
@@:
622
        mov     si,_r1
633
        mov     si,_r1
623
        jmp     .@@_sh
634
        jmp     .@@_sh
624
.show_0x12:
635
.show_0x12:
625
        push    si
636
        push    si
626
        cmp     si, word [cursor_pos]
637
        cmp     si, word [cursor_pos]
627
        jne     @f
638
        jne     @f
628
 
639
 
629
        mov     word[ds:_r2+21],'>>'
640
        mov     word[ds:_r2+21],'>>'
630
        mov     word[ds:_r2+45],'<<'
641
        mov     word[ds:_r2+45],'<<'
631
@@:
642
@@:
632
        mov     si,_r2
643
        mov     si,_r2
633
        jmp     .@@_sh
644
        jmp     .@@_sh
634
 
645
 
635
;-----------------------------------------------------------------------------
646
;-----------------------------------------------------------------------------
636
;Clear arrea of current video page (0xb800)
647
;Clear arrea of current video page (0xb800)
637
clear_vmodes_table:
648
clear_vmodes_table:
638
        pusha
649
        pusha
639
       ; draw frames
650
       ; draw frames
640
        push    es
651
        push    es
641
        push    0xb800
652
        push    0xb800
642
        pop     es
653
        pop     es
643
        mov     di,1444
654
        mov     di,1444
644
        xor     ax,ax
655
        xor     ax,ax
645
        mov     ah, 1*16+15
656
        mov     ah, 1*16+15
646
        mov     cx,70
657
        mov     cx,70
647
        mov     bp,12
658
        mov     bp,12
648
.loop_start:
659
.loop_start:
649
        rep     stosw
660
        rep     stosw
650
        mov     cx,70
661
        mov     cx,70
651
        add     di,20
662
        add     di,20
652
        dec     bp               ; 㬥­ìè¨âì DX,
663
        dec     bp
653
        jns        .loop_start       
664
        jns        .loop_start       
654
        pop     es
665
        pop     es
655
        popa
666
        popa
656
        ret
667
        ret
657
 
668
 
658
;-----------------------------------------------------------------------------
669
;-----------------------------------------------------------------------------
659
 
670
 
660
set_vmode:
671
set_vmode:
661
        push    0 ;0;x1000
672
        push    0 ;0;x1000
662
        pop     es
673
        pop     es
663
 
674
 
664
        mov     si,word [preboot_graph]            ;[preboot_graph]
675
        mov     si,word [preboot_graph]            ;[preboot_graph]
665
        mov     cx,word [es:si+6]            ; number of mode
676
        mov     cx,word [es:si+6]            ; number of mode
666
        
677
        
667
 
678
 
668
        mov     ax,word [es:si+0]            ; resolution X
679
        mov     ax,word [es:si+0]            ; resolution X
669
        mov     bx,word [es:si+2]            ; resolution Y
680
        mov     bx,word [es:si+2]            ; resolution Y
670
 
681
 
671
 
682
 
672
        mov     word [es:0x900A],ax              ; resolution X
683
        mov     word [es:0x900A],ax              ; resolution X
673
        mov     word [es:0x900C],bx              ; resolution Y
684
        mov     word [es:0x900C],bx              ; resolution Y
674
        mov     word [es:0x9008],cx              ; number of mode
685
        mov     word [es:0x9008],cx              ; number of mode
675
 
686
 
676
        cmp     cx,0x12
687
        cmp     cx,0x12
677
        je      .mode0x12_0x13
688
        je      .mode0x12_0x13
678
        cmp     cx,0x13
689
        cmp     cx,0x13
679
        je      .mode0x12_0x13
690
        je      .mode0x12_0x13
680
 
691
 
681
 
692
 
682
        cmp     byte [s_vesa.ver],'2'
693
        cmp     byte [s_vesa.ver],'2'
683
        jb      .vesa12
694
        jb      .vesa12
684
 
695
 
685
;  VESA 2 and Vesa 3
696
;  VESA 2 and Vesa 3
686
 
697
 
687
        mov     ax,0x4f01
698
        mov     ax,0x4f01
688
        and     cx,0xfff
699
        and     cx,0xfff
689
        mov     di,mi;0xa000
700
        mov     di,mi;0xa000
690
        int     0x10
701
        int     0x10
691
        ; LFB
702
        ; LFB
692
        mov     eax,[es:mi.PhysBasePtr];di+0x28]
703
        mov     eax,[es:mi.PhysBasePtr];di+0x28]
693
        mov     [es:0x9018],eax
704
        mov     [es:0x9018],eax
694
        ; ---- vbe voodoo
705
        ; ---- vbe voodoo
695
        BytesPerLine equ 0x10
706
        BytesPerLine equ 0x10
696
        mov     ax, [es:di+BytesPerLine]
707
        mov     ax, [es:di+BytesPerLine]
697
        mov     [es:0x9001], ax
708
        mov     [es:0x9001], ax
698
        ; BPP
709
        ; BPP
699
        cmp     [es:mi.BitsPerPixel],16
710
        cmp     [es:mi.BitsPerPixel],16
700
        jne     .l0
711
        jne     .l0
701
        cmp     [es:mi.GreenMaskSize],5
712
        cmp     [es:mi.GreenMaskSize],5
702
        jne     .l0
713
        jne     .l0
703
        mov     [es:mi.BitsPerPixel],15
714
        mov     [es:mi.BitsPerPixel],15
704
.l0:
715
.l0:
705
        mov     al, byte [es:di+0x19]
716
        mov     al, byte [es:di+0x19]
706
        mov     [es:0x9000], al
717
        mov     [es:0x9000], al
707
        jmp     .exit
718
        jmp     .exit
708
 
719
 
709
.mode0x12_0x13:
720
.mode0x12_0x13:
710
        mov     byte [es:0x9000], 32
721
        mov     byte [es:0x9000], 32
711
        or      dword [es:0x9018], 0xFFFFFFFF; 0x800000
722
        or      dword [es:0x9018], 0xFFFFFFFF; 0x800000
712
 
723
 
713
 
724
 
714
;  VESA 1.2 PM BANK SWITCH ADDRESS
725
;  VESA 1.2 PM BANK SWITCH ADDRESS
715
 
726
 
716
.vesa12:
727
.vesa12:
717
 
728
 
718
 
729
 
719
        mov     ax,0x4f0A
730
        mov     ax,0x4f0A
720
        xor     bx,bx
731
        xor     bx,bx
721
        int     0x10
732
        int     0x10
722
        xor     eax,eax
733
        xor     eax,eax
723
        xor     ebx,ebx
734
        xor     ebx,ebx
724
        mov     ax,es
735
        mov     ax,es
725
        shl     eax,4
736
        shl     eax,4
726
        mov     bx,di
737
        mov     bx,di
727
        add     eax,ebx
738
        add     eax,ebx
728
        movzx   ebx,word[es:di]
739
        movzx   ebx,word[es:di]
729
        add     eax,ebx
740
        add     eax,ebx
730
        push    0x0000
741
        push    0x0000
731
        pop     es
742
        pop     es
732
        mov     [es:0x9014],eax
743
        mov     [es:0x9014],eax
733
  .exit:
744
  .exit:
734
        ret
745
        ret
735
 
746
 
736
 
747
 
737
;        mov     dword[es:0x9018],0x000A0000
748
;        mov     dword[es:0x9018],0x000A0000
738
;        ret
749
;        ret
739
 
750
 
740
;=============================================================================
751
;=============================================================================
741
;=============================================================================
752
;=============================================================================
742
;=============================================================================
753
;=============================================================================
743
@@:
754
@@:
744
>
755
>
745
@@:
756
@@:
746
>
757
>
747
>
758
>
748
>
759
>