display4.s
来自「LINUX lilo-22.7 源代码。」· S 代码 · 共 1,346 行 · 第 1/2 页
S
1,346 行
/* display4.S is Copyright 2001-2003 John Coffman. All rights reserved. Licensed under the terms contained in the file 'COPYING' in the source directory.*/;; Static Name Aliases;;; segment _TEXT PARA class=CODE .text/* the following is set to 1 to test the fallback to TEXT mode */#define FAIL 0 .even ; 8_bmp: dd 0_tp: dd 0_state: dw -1_Mode: dw 0_ypitch: dw 0_shift: dw 0_mask: dd 0_himask: dd 0_VesaWindow: dw -1_seg: dw 0;; get a single byte in AX (zero extended); and increment the HUGE pointer _tp;; c = *tp++;;; .even ; 8getbyte: lodsb push ax cmp si,#1 sbb ax,ax and ax,#0x1000 add bp,ax mov ds,bp pop ax sub ah,ah ret .even ; 4d4_getrow4: pusha push ds; rpt = -8 ; bh; repeat = -10 ; bl; skip = -12 ; dh; lp = -4 ; es:di; c = -6; npix = DX ; cx; compr = AX; tp was _tp ; ds:si -- HUGE ptr [bp:si] mov di,#_line ;lp push cs pop es seg cs lds si,[_tp] ; mov cx,dx ;npix cmp ax,#1 ;compr mov bp,ds ; ja d4_I600 je d4_I601d4_FC581: call getbyte push ax sar ax,#4 stosb ;*lp++ pop ax dec cx ;npix and al,#15 ;000fH stosb ;*lp++ loop d4_FC581 jmp d4_I601;; compr == 2; d4_FC590: cmp cx,#0 ;npix jle d4_FB591 call getbyte mov bh,al ;rpt mov bl,al ;repeat or ax,ax je d4_L676 sub cx,ax ;npix call getbyte jmp d4_L675d4_FC594: push ax sar ax,#4 stosb ;*lp++ pop ax dec bh ; 2001/06/23 jz d4_L676 ; 2001/06/23 push ax and al,#15 ;000fH stosb ;*lp++ pop ax dec bh ;rpt 2001/06/23d4_L675: or bh,bh ;rpt jne d4_FC594d4_L676: or bl,bl ;repeat jne d4_FC590d4_FB591: jcxz d4_I600 ;npix call getbyte mov bh,al ;rpt sub cx,ax ;npix mov dh,al inc dh ; 2001/06/23 and dh,#2 ;skip jmp d4_L677d4_FC598: call getbyte push ax sar ax,#4 stosb ;*lp++ pop ax dec bh ;rpt 2001/06/23 jz d4_L678 ; 2001/06/23 and al,#15 ;000fH stosb ;*lp++ dec bh ;rpt 2001/06/23d4_L677: cmp bh,#0 ;rpt jne d4_FC598d4_L678: or dh,dh ;skip je d4_I600 call getbyted4_I600: mov bl,#1 ;repeat cmp cx,#0 ;npix jg d4_L676 call getbyte call getbyte;;; jmp d4_I601d4_I601: seg cs mov [_tp],si ; seg cs mov [_tp+2],ds ; pop ds popa ret .even ; 4d4_char10: enter #6,#0 pusha push ds; buf = 0xA000:DI; cgen = ES:SI; bits = ax on top of stack; points (bp-2); shadow (bp-4); mask (bp-6); sch (bp+4) (arg); DS:BX; y = BX (arg); x = DX (arg); c = AX (arg) push WORD #0 pop ds mov cx,WORD [0x485] ;points xor ah,ah ;AL is char to put out mov WORD (bp-2),cx ;points imul ax,cx ;leave DX alone; 386 form of instruction mov si,#268 ;010cH ; int 0x43 -> character bitmaps add ax,WORD (si) mov es,WORD (si+2) ;cgen xchg si,ax ;cgen; call pixadr ----------------------------------- mov cx,dx ;x and cx,#7 ;mask for shift sar dx,#3 ;x mov ax,#0x00FF ;mask imul di,bx,#640/8 ; DI = y * _ypitch ror ax,cl ;AL is mask, AH is hi-mask add di,dx ; + x mov WORD (bp-6),ax ;save mask;------------------------------------------------- mov WORD (bp-4),#0 ;shadow mov dx,#0x03CE ; lds bx,(bp+4) ;schd4_FC527: seg es lodsb ;cgen -> bits push es sub ah,ah push WORD #0xA000 ror ax,cl ;rotated bits in AX pop es push ax ;save AX rotated bits not ax and ax,WORD (bp-6) ;mask complement push ax mov ah,BYTE (bx+2) ;sch->bg cmp BYTE (bx),ah ;sch->fg pop ax ; inserted **** je d4_I529 push ax ;AH = bits high; AL = bits low mov ah,al ;AH = bits low mov al,#08 out dx,ax mov ah,BYTE (bx+2) ;sch->bg seg es and BYTE (di),ah ;buf pop ax ; get complemented bits back jcxz d4_I529 mov al,#08 ;AH = ~bits hi, AL = 8 out dx,ax mov al,BYTE (bx+2) ;sch->bg seg es and BYTE (di+1),al ;buf d4_I529: ; rotated bits in the stack mov al,BYTE (bx+4) ;sch->sh cmp BYTE (bx),al ;sch->fg je d4_I530 mov ax,WORD (bp-4) ;get shadow rol ax,#7 ; push ax mov al,#8 out dx,ax mov ah,BYTE (bx+4) ;sch->sh seg es and BYTE (di),ah pop ax jcxz d4_I530 xchg ah,al mov al,#8 out dx,ax mov ah,BYTE (bx+4) ;sch->sh seg es and BYTE (di+1),ah d4_I530: pop ax ;rotated bits mov WORD (bp-4),ax ; save shadow push ax mov ah,al mov al,#8 out dx,ax mov al,BYTE (bx) ;sch->fg seg es and BYTE (di),al pop ax jcxz d4_I531 mov al,#8 out dx,ax mov al,BYTE (bx) ;sch->fg seg es and BYTE (di+1),ald4_I531: add di,#640/8 ;buf pop es dec WORD (bp-2) jne d4_FC527d4_EX519: pop ds popa leave ret .even ; 4_text: push bp mov bp,sp push ds; sch = 14; len = 12; cp = 8; ypos = 6; xpos = 4 mov ax,#2 call d4_setstate mov cx,WORD (bp+12) ;len mov bx,WORD (bp+6) ;ypos mov dx,WORD (bp+4) ;xpos#ifndef PIXADDRESS shl bx,#4 ;ypos shl dx,#3 ;xpos#endif lds si,(bp+8) ;cp jcxz d4_L672 push WORD (bp+16) push WORD (bp+14) ;schd4_FC544: lodsb ;*cp seg cs cmp WORD [_Mode],#0x12 jbe d4_tVga call d4_char256 jmp d4_tContd4_tVga: call d4_char10d4_tCont: add dx,#8 ;xpos loop d4_FC544 add sp,#4d4_L672: xor ax,ax call d4_setstate pop ds leave ret #if 0 .even ; 4_setpalette: push bp mov bp,sp; blue = 10; green = 8; red = 6; color = 4 push bx mov bh,bl mov ax,#0x1000 int 0x10 mov bx,#0x3fff ;00ffH mov al,dh mul bh div bl mov dh,al xor dl,dl mov al,ch mul bh div bl mov ch,al mov al,cl mul bh div bl mov cl,al pop bx ;color mov ax,#0x1010 int 0x10 leave ret #endif .even ; 4d4_putrow4: pusha push ds; mask = -2; lp = -6; tp = -10; vp = -14; vvp = -18; i = -20; nn = -22; x2 = 8; x1 = 6 ; DX; y = 4 ; AX push ax ;y push dx ;x2-x1+1;begin pack4 push ds pop es mov si,#_line mov di,si ;op = lp mov ah,#640/8 ; npix/8d4_FC185: mov cx,#8d4_F187: seg es lodsb shr al,#1 rcl bl,#1 ;a shr al,#1 rcl bh,#1 ;b shr al,#1 rcl dl,#1 ;c shr al,#1 rcl dh,#1 ;d loop d4_F187 mov al,bl ;a stosb mov al,bh ;b stosb mov al,dl ;c stosb mov al,dh ;d stosb dec ah jne d4_FC185d4_EX175:; end pack4 pop bx sar bx,#3 ;nn pop di ;y;; imul WORD [_ypitch] imul di,#640/8 push WORD #0xA000 pop es mov si,#_line ;lp mov ax,#0x0102 ;maskd4_FC563: mov dx,#964 ;03c4H out dx,ax push di push si mov cx,bx ;nn push ax ;maskd4_FC566: lodsb seg es and BYTE (di),al add si,#3 ;tp inc di ;vp loop d4_FC566 pop ax ;mask pop si pop di shl ah,#1 inc si ;lp test ah,#15 ;000fH jne d4_FC563 pop ds popa ret .even ; 4d4_setstate: push ds push cs pop ds#if 0 pusha call wout call ss1 .ascii " = AX; setstate entered" .byte 10,0ss1: pop bx call say;; call pause popa#endif cmp WORD [_Mode],#0x12 ja d4_SB497 ;setstate is a NOP if VESA; new = 4 mov dx,#974 ;03ceH cmp ax,WORD [_state] je d4_SB497 mov WORD [_state],ax dec ax je d4_SC502 dec ax je d4_SC503; state 0 push dx mov ax,#3842 ;0f02H mov dx,#964 ;03c4H out dx,ax pop dx mov ax,#5 ;0005H out dx,ax mov ax,#3847 ;0f07H jmp d4_L669; state 1d4_SC502: mov ax,#2053 ;0805H jmp d4_L670; state 2d4_SC503: mov ax,#2565 ;0a05Hd4_L670: out dx,ax mov ax,#7d4_L669: out dx,ax mov ax,#3 out dx,ax mov ax,#-248 ;ff08H out dx,axd4_SB497:#if 0 pusha call ss2 .ascii "setstate exit" .byte 10,0ss2: pop bx call say;; call pause popa#endif pop ds ret .even ; 4;; _display4: display the BITMAP;; Enter with: ES:BX points to the possible bitmap image; DS==CS;; Exit with:; Carry Clear - bitmap was displayed; AX = 0;; Carry Set - error occurred; AX = 1 "BM" signature not found; AX = 2 not VGA adapter or display; AX = 3 not 640x480x16 bitmap; AX = 4 no VESA support;_display4:; Line 286 enter #22,#0 push si push di; bits = -2; colors = -6; i = -8; disable = -10; color = -14; bmfh = -18; bmh = -22; name = 4; Line 296 mov WORD [_bmp],bx ;store for later mov WORD [_bmp+2],es;;; les bx,[_bmp] mov WORD (bp-18),bx ;bmfh mov WORD (bp-16),es seg es cmp WORD (bx),#19778 ;4d42H jne d4_I573 seg es cmp WORD (bx+14+2),#0 ; hi-order part of DWORD jne d4_I573 seg es cmp WORD (bx+14),#40 ; Windows/OS2 bitmap header je d4_I574 seg es cmp WORD (bx+14),#12 ; OS2 bitmap header je d4_I574; Line 297d4_I573: mov ax,#1 stc br _display4_retd4_I574: mov ax,WORD [_bmp] mov dx,WORD [_bmp+2] add ax,#14 ;000eH;; sbb cx,cx;; and cx,#0x1000;; add dx,cx mov WORD [_tp],ax mov WORD [_tp+2],dx mov WORD (bp-22),ax ;bmh mov WORD (bp-20),dx; Line 302 mov es,dx mov bx,ax seg es cmp BYTE (bx),#40 ; Windows je d4_I575; OS2 bitmaps seg es mov ax,WORD (bx+8) seg es mul WORD (bx+10) mov WORD (bp-2),ax ;bits; Line 305 mov cx,ax mov ax,#1 shl ax,cl cwd mov WORD (bp-6),ax ;colors; Line 317 seg es cmp WORD (bx+4),#640 ;0280H jne d4_I576 seg es cmp WORD (bx+6),#480 ;01e0H jne d4_I576 cmp cx,#8 ;bits je d4_Vesa_Setup cmp cx,#4 ;bits jne d4_I576 jmp d4_I575a; Windows/OS2 bitmapsd4_I575: seg es mov ax,WORD (bx+12) seg es mul WORD (bx+14) mov WORD (bp-2),ax ;bits; Line 305 mov cx,ax mov ax,#1 shl ax,cl cwd mov WORD (bp-6),ax ;colors; Line 317 seg es;;; cmp DWORD (bx+4),#640 ;0280H cmp WORD (bx+4),#640 ;0280H jne d4_I576 seg es;;; cmp DWORD (bx+8),#480 ;01e0H cmp WORD (bx+8),#480 ;01e0H jne d4_I576 cmp cx,#8 ;bits je d4_Vesa_Setup cmp cx,#4 ;bits jne d4_I576
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?