Subversion Repositories Kolibri OS

Rev

Rev 837 | Details | Compare with Previous | Last modification | View Log | RSS feed

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