⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display4.s

📁 linux 的引导程序源码The Microsoft&reg Windows&reg Software Development Kit (SDK) provides the documentation
💻 S
字号:
;  display4.S is;;  Copyright 2001 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	.even		; 8_bmp:   dd      0_tp:    dd      0_state: dw    -1_Mode:  dw      0_ypitch: 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#ifdef LCF_M386	imul	ax,cx           ;leave DX alone; 386 form of instruction#else	push	dx	imul	cx		;8086 form of instruction	pop	dx#endif	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        call	d4_char10	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;	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;_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	cmp	cx,#4	;bits	jne	d4_I576	seg	es	  cmp	WORD (bx+4),#640	;0280H	jne	d4_I576	seg	es	  cmp	WORD (bx+6),#480	;01e0H	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	cmp	cx,#4	;bits	jne	d4_I576	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_I576d4_I575a:	mov	WORD [_Mode],#18	;0012H;;	mov	cx,#8;;	cwd	;;	idiv	cx;;	mov	WORD [_ypitch],ax; Line 318	jmp	d4_I577d4_I576:; Line 319        mov     ax,#3        stc	br	_display4_ret; Line 321d4_I577:; Line 322; Line 323	mov     bx,#0	mov     ax,#6656	;1a00H        int     0x10	cmp	al,#26	;001aH	jne	d4_I578	cmp	bl,#7	je	d4_I579	cmp	bl,#8	je	d4_I579d4_I578:        mov     ax,#2        stc	br	_display4_ret; Line 324d4_I579:	mov     bx,#49	;0031H	mov     ax,#4609	;1201H        int     0x10; Line 325	mov	WORD (bp-10),#128	;0080H	;disable; Line 326	mov	ax,WORD [_Mode]	or	al,#128	;0080H        int     0x10; Line 327        mov     dx,#480/16        mov     bx,#0        mov     ax,#0x1124               ;set for 8x16 characters        int     0x10; Line 331	cmp	WORD (bp-10),#0	;disable	je	d4_I580	mov     bx,#54	;0036H	mov     ax,#4609	;1201H        int     0x10; Line 333d4_I580:	les	bx,(bp-22)	;bmh	seg	es	  mov	si,WORD (bx)	add	si,WORD [_tp]	push	ds	mov	ds,WORD [_tp+2]; Line 334	xor	bx,bx		;id4_FC582:; Line 335	push	bx	mov	bh,bl        mov     ax,#0x1000        int     0x10	mov	bx,#0x3fff	;00ffH	lodsb	mul	bh	div	bl	mov	cl,al	lodsb	mul	bh	div	bl	mov	ch,al	lodsb	mul	bh	div	bl	mov	dh,al	xor	dl,dl	pop	bx		;color = i        mov     ax,#0x1010        int     0x10; Line 336	mov	di,(bp-22)	;bmh	  cmp	BYTE (di),#12	je	d4_F580	inc	sid4_F580:; Line 337	inc	bx	;WORD (bp-8)	;id4_F581:	cmp	WORD (bp-6),bx	;colors	jg	d4_FC582	pop	ds; Line 339	les	bx,(bp-18)	;bmfh	seg	es	  mov	ax,WORD (bx+10)	seg	es	  mov	dx,WORD (bx+12)	add	ax,WORD [_bmp]	adc	dx,#0	shl	dx,#12	add	dx,WORD [_bmp+2]	mov	WORD [_tp],ax	mov	WORD [_tp+2],dx; Line 340        xor     ax,ax	call	d4_setstate; Line 341        mov     ax,#1	call	d4_setstate; Line 342	les	bx,(bp-22)	;bmh;;	seg	es;;	  mov	ax,WORD (bx+8)		; 480	mov	ax,#480			; Windows or OS2;;	seg	es;;	  mov	dx,WORD (bx+4)		; 640	mov	dx,#640			; Windows or OS2	seg	es	  cmp	BYTE (bx),#13		; OS2	sbb	cx,cx			; OS2 = -1, Win = 0	not	cx	seg	es	  and	cx,WORD (bx+16)		; compression	mov	bx,cx			; compression to BXd4_FC586:	dec	ax        js      d4_FC587; Line 343        xchg    ax,bx	call	d4_getrow4; Line 344        xchg    ax,bx	call	d4_putrow4; Line 345	jmp	d4_FC586d4_FC587:; Line 346	xor	ax,ax			; restore state	call	d4_setstate; Line 348	mov     bx,#54	;0036H          ;enable refresh	mov     ax,#4608	;1200H        int     0x10        xor     ax,ax           ;clears the carry_display4_ret:	pop	di	pop	si	leave		ret	        .even		;   4_done4:	xor	ax,ax	call	d4_setstate	;restore state; Line 356; enable default palette loading	mov     bx,#49	;0031H	mov     ax,#4608	;1200H        int     0x10; Line 357	mov     ax,#0x0003       ; set video mode        int     0x10; Line 359	ret	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -