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 + -
显示快捷键?