ctk-hires-asm.s

来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· S 代码 · 共 934 行

S
934
字号
;---------------------------------------------------------------------       	.importzp       ptr1, ptr2, ptr3, ptr4, sreg	.importzp	sp	.import		incsp2		.import		_ctk_hires_cursx	.import		_ctk_hires_cursy	.import		_ctk_hires_color	.import		_ctk_hires_underline	.import		_ctk_hires_reversed	.import		_ctk_hires_yscreenaddr	.import		_ctk_hires_yhiresaddr	.import		_ctk_hires_windowparams		.import		_ctk_hires_bitmapptr	.import		_ctk_hires_theme				.export		_ctk_hires_cclear	.export		_ctk_hires_chline	.export		_ctk_hires_cputc	.export		_ctk_hires_cputsn	.export		_ctk_hires_draw_buttonleft	.export		_ctk_hires_draw_buttonright		.export		_ctk_hires_draw_windowborders	.export		_ctk_hires_draw_bitmapline;---------------------------------------------------------------------ptr5 = sreg	;; Offsets in the theme struct	ulcornerpattern =	8	titlebarpattern =	ulcornerpattern+8	urcornerpattern =	titlebarpattern+8	rborderpattern  =	urcornerpattern+8	lrcornerpattern =	rborderpattern+8	lowerborderpattern =	lrcornerpattern+8	llcornerpattern =	lowerborderpattern+8	lborderpattern =	llcornerpattern+8		buttonleftpattern =	lborderpattern+8	buttonrightpattern =	buttonleftpattern+8				.bsstmp01:	.res 1tmpl:	.res 1tmpf:	.res 1tmpc:	.res 1tmpw:	.res 1	tmpptr:	.res 2tmpy:	.res 1tmph:	.res 1	;; Window border parameters	w:	.res 1wpw          = 0h:	.res 1wph          = 1	clipy1:	.res 1wpclipy1     = 2clipy2:	.res 1wpclipy2     = 3	color1:	.res 1wpcolor1     = 4	color2:	.res 1wpcolor2     = 5	titlelen:	.res 1wptitlelen   = 6title:	.res 2wptitle      = 7		;---------------------------------------------------------------------.data;---------------------------------------------------------------------.codesetupptrs:		;; Find hires address.		lda _ctk_hires_cursy	asl	tax	lda _ctk_hires_yhiresaddr,x	sta ptr2	lda _ctk_hires_yhiresaddr+1,x	sta ptr2+1	;; Add X coordinate to the hires address. 	lda #0	sta ptr1+1	lda _ctk_hires_cursx	asl	rol ptr1+1	asl		rol ptr1+1	asl	rol ptr1+1	clc	adc ptr2	sta ptr2	lda ptr2+1	adc ptr1+1	sta ptr2+1	;; Find screen address. 	lda _ctk_hires_cursy	asl	tax		lda _ctk_hires_yscreenaddr,x	clc	adc _ctk_hires_cursx	sta ptr1	lda _ctk_hires_yscreenaddr+1,x	adc #0	sta ptr1+1	;; Turn off interrupts, prepare $01 to store color data in RAM	;; under I/O area.			sei	lda $01	sta tmp01	and #$f8	sta $01	rts;---------------------------------------------------------------------	restore01:		lda tmp01	sta $01	cli	rts		;---------------------------------------------------------------------_ctk_hires_cclear:	sta tmpl	cmp #0	bne @norts	rts@norts:					jsr setupptrs			;; Store color value in color memory	ldy tmpl	dey	lda _ctk_hires_color@loop0:	sta (ptr1),y	dey	bpl @loop0	;; Store either $00 or $ff in hires memory, depending on the	;; reversed flag				ldx tmpl	lda _ctk_hires_reversed	beq @noff	lda #$ff@noff:			sta tmpf	@loop1:	ldy #7	lda tmpf@loop2:	sta (ptr2),y	dey	bpl @loop2	lda ptr2	clc	adc #8	sta ptr2	bcc @noinc	inc ptr2+1@noinc:			inc _ctk_hires_cursx	dex	bne @loop1	jmp restore01;---------------------------------------------------------------------_ctk_hires_chline:	sta tmpl	cmp #0	bne @norts	rts@norts:					jsr setupptrs			;; Store color value in color memory	ldy tmpl	dey	lda _ctk_hires_color@loop0:	sta (ptr1),y	dey	bpl @loop0	;; Store horizontal line pattern in hires memory	ldx tmpl@loop1:	ldy #0	lda #$00	sta (ptr2),y	iny	lda #$00	sta (ptr2),y	iny	lda #$00	sta (ptr2),y	iny	lda #$ff	sta (ptr2),y	iny	lda #$ff	sta (ptr2),y	iny	lda #$00	sta (ptr2),y	iny	lda #$00	sta (ptr2),y	iny	lda #$00	sta (ptr2),y	lda ptr2	clc	adc #8	sta ptr2	bcc @noinc	inc ptr2+1@noinc:		inc _ctk_hires_cursx	dex	bne @loop1	jmp restore01;---------------------------------------------------------------------	_ctk_hires_cputc:	sta tmpc	jsr setupptrs	ldy #0	lda _ctk_hires_color	sta (ptr1),y		;; Turn on font ROM	lda tmp01	and #$f8	ora #$01	sta $01	lda #0	sta ptr1+1		  		;; Convert from PETSCII to screen encoding	lda tmpc	eor #$e0	clc	adc #$20	bpl @cont	adc #$40	bpl @cont	eor #$a0@cont:	ldx _ctk_hires_reversed	beq :+	eor #$80:			;; Convert to address in character ROM	asl	rol ptr1+1	asl	rol ptr1+1	asl	rol ptr1+1	sta ptr1	lda #$d8	adc ptr1+1	sta ptr1+1	;; Print on hires screen, bottom-up. If we should underline,	;; we do this by eor:ing the bottom line with #$ff	ldy #7	lda (ptr1),y	ldx _ctk_hires_underline	beq @nounderline	eor #$ff@nounderline:	sta (ptr2),y	dey@loop:	lda (ptr1),y	sta (ptr2),y	dey	bpl @loop		inc _ctk_hires_cursx			jmp restore01		;---------------------------------------------------------------------_ctk_hires_cputsn:	sta tmpl	cmp #0	bne :+	rts:				jsr setupptrs	ldy tmpl	dey	lda _ctk_hires_color@loop0:	sta (ptr1),y	dey	bpl @loop0				;; Turn on font ROM	lda tmp01	and #$f8	ora #$01	sta $01		;; Output each character from the string	lda #0	sta tmpc	ldy #0	lda (sp),y	sta ptr3	iny	lda (sp),y	sta ptr3+1		@loop1:			lda #0	sta ptr1+1		  			ldy tmpc	lda (ptr3),y	beq @end		;; Convert from PETSCII to screen encoding			eor #$e0	clc	adc #$20	bpl @cont	adc #$40	bpl @cont	eor #$a0@cont:	ldx _ctk_hires_reversed	beq :+	eor #$80:			;; Convert to address in character ROM	asl	rol ptr1+1	asl	rol ptr1+1	asl	rol ptr1+1	sta ptr1	lda #$d8	adc ptr1+1	sta ptr1+1	;; Print on hires screen, bottom-up. If we should underline,	;; we do this by eor:ing the bottom line with #$ff	ldy #7	lda (ptr1),y	ldx _ctk_hires_underline	beq @nounderline	eor #$ff@nounderline:	sta (ptr2),y	dey@loop:	lda (ptr1),y	sta (ptr2),y	dey	bpl @loop		inc _ctk_hires_cursx	lda ptr2	clc	adc #8	sta ptr2	bcc :+	inc ptr2+1:	inc tmpc	lda tmpc	cmp tmpl	bne @loop1	@end:			jsr restore01	        jmp incsp2	;---------------------------------------------------------------------_ctk_hires_draw_windowborders:	jsr setupptrs	lda _ctk_hires_windowparams + wpclipy1	beq :+	jmp @nofirstline:				;; Draw first line of the border, including the window title	;; Start with filling color memory	ldy _ctk_hires_windowparams + wpw	iny	lda _ctk_hires_windowparams + wpcolor1	sta (ptr1),y		dey	dey	dey	sty tmpw		ldy _ctk_hires_windowparams + wptitlelen	iny	iny	iny:		sta (ptr1),y	iny	cpy tmpw	bcc :-	inc tmpw	;; Set color for upper left corner	ldy #0	lda _ctk_hires_windowparams + wpcolor1	sta (ptr1),y				;; Turn on font ROM for drawing the title	lda tmp01	and #$f8	ora #$01	sta $01	;; Use a temporary pointer (ptr3) rather than ptr2 so we can	;; reuse it later.	lda ptr2	sta ptr3	lda ptr2+1	sta ptr3+1			;; Draw upper left corner	ldy #7:		lda _ctk_hires_theme+ulcornerpattern,y	sta (ptr3),y	dey	bpl :-	;; Draw first empty char left of the title	ldy #8	lda #0:		; 	sta (ptr3),y			iny	cpy #$10	bne :-	lda ptr3	clc	adc #$10	sta ptr3	bcc :+	inc ptr3+1:	dec tmpw	;;  Draw the title	lda _ctk_hires_windowparams + wptitle	sta ptr4	lda _ctk_hires_windowparams + wptitle+1	sta ptr4+1		lda #0	sta tmpc@titleloop:	lda #0	sta ptr5+1	ldy tmpc	lda (ptr4),y		;; Convert from PETSCII to screen encoding			eor #$e0	clc	adc #$20	bpl @cont	adc #$40	bpl @cont	eor #$a0@cont:	;; Convert to address in character ROM	asl	rol ptr5+1	asl	rol ptr5+1	asl	rol ptr5+1	sta ptr5	lda #$d8	adc ptr5+1	sta ptr5+1	;; Print on hires screen, character by character, bottom-up.	ldy #7:	lda (ptr5),y; 	sta (ptr3),y			dey	bpl :-		lda ptr3	clc	adc #8	sta ptr3	bcc :+	inc ptr3+1:	dec tmpw		inc tmpc	lda tmpc	cmp _ctk_hires_windowparams + wptitlelen	bne @titleloop	;; Draw empty char after the title	ldy #7	lda #0:		; 	sta (ptr3),y	dey		bpl :-	lda ptr3	clc	adc #$8	sta ptr3	bcc :+	inc ptr3+1:	dec tmpw	;; Draw window title bar pattern@titlebarloop:		ldy #7:	lda _ctk_hires_theme+titlebarpattern,y	sta (ptr3),y	dey	bpl :-	lda ptr3	clc	adc #$8	sta ptr3	bcc :+	inc ptr3+1:	;; Loop until we are three characters away from right border	;; to avoid flickering since we would be overwriting the close	;; button.	dec tmpw	lda tmpw	cmp #3	bcs @titlebarloop	lda ptr3	clc	adc #$18	sta ptr3	bcc :+	inc ptr3+1:			;; Draw upper right corner piece	ldy #7:	lda _ctk_hires_theme+urcornerpattern,y	sta (ptr3),y	dey	bpl :-@nofirstline:	ldx _ctk_hires_windowparams + wph	inx	stx tmph	;; Draw left and right borders	;; Fill color memory (pointer in ptr1, setup by setupptrs)	;; First check how much we actually should draw by inspecting	;; the clipy1 and clipy2 fields in the _ctk_hires_windowparams 	;; structure			lda #1	sta tmpy		ldx _ctk_hires_windowparams + wpclipy1@clipy1loop:	cpx #0	beq @clipy1loopend	lda ptr1	clc	adc #$28	sta ptr1	bcc :+	inc ptr1+1:	lda ptr3	clc	adc #$40	sta ptr3	lda ptr3+1	adc #1	sta ptr3+1	inc tmpy		dex	jmp @clipy1loop@clipy1loopend:		lda ptr1	clc	adc #$28	sta ptr1	bcc :+	inc ptr1+1:			ldx tmpy	ldy _ctk_hires_windowparams + wpw	iny	sty tmpw@bordercloop:	cpx _ctk_hires_windowparams + wpclipy2	beq @bordercloopend		ldy tmpw	lda _ctk_hires_windowparams + wpcolor2	sta (ptr1),y	ldy #0	lda _ctk_hires_windowparams + wpcolor1	sta (ptr1),y	lda ptr1	clc	adc #$28	sta ptr1	bcc :+	inc ptr1+1:		inx	cpx tmph	bcc @bordercloop	beq @bordercloop	@bordercloopend:		;; Fill color memory for lower border, if clipy2 allows	cpx _ctk_hires_windowparams + wpclipy2	beq @noclowerborder	lda ptr1	sec	sbc #$28	sta ptr1	bcs :+	dec ptr1+1:			ldy _ctk_hires_windowparams + wpw	lda _ctk_hires_windowparams + wpcolor2		@lbordercloop:		sta (ptr1),y	dey	bne @lbordercloop	@noclowerborder:				;; Draw right border	ldx tmpy@rborderloop:	cpx _ctk_hires_windowparams + wpclipy2	beq @rborderloopend	lda ptr3	clc	adc #$40	sta ptr3	lda ptr3+1	adc #1	sta ptr3+1	ldy #7:	lda _ctk_hires_theme+rborderpattern,y			sta (ptr3),y	dey	bpl :-	inx	cpx tmph	bne @rborderloop	@rborderloopend:	 	cpx _ctk_hires_windowparams + wpclipy2  	beq @norbordercorner		lda ptr3	clc	adc #$40	sta ptr3	lda ptr3+1	adc #1	sta ptr3+1		;; Draw lower right corner, if clipy2 allows it	ldy #7:			lda _ctk_hires_theme+lrcornerpattern,y	sta (ptr3),y	dey	bpl :-@norbordercorner:		stx tmpy			;; Draw lower border	ldx _ctk_hires_windowparams + wpw@lowerborderloop:	lda ptr3	sec	sbc #$8	sta ptr3	bcs :+	dec ptr3+1:		lda tmpy	cmp _ctk_hires_windowparams + wpclipy2	beq @nolowerborder		ldy #7:		lda _ctk_hires_theme+lowerborderpattern,y	sta (ptr3),y	dey	bpl :-@nolowerborder:				dex	bne @lowerborderloop	lda ptr3	sec	sbc #$8	sta ptr3	bcs :+	dec ptr3+1:		ldx tmpy 	cpx tmph 	bne @nolbordercorner		;; Draw lower left corner, if clipy2 allows it	ldy #7:			lda _ctk_hires_theme+llcornerpattern,y	sta (ptr3),y	dey	bpl :-	lda ptr3	sec	sbc #$40	sta ptr3	lda ptr3+1	sbc #1	sta ptr3+1@nolbordercorner:						;; Draw left border			@lborderloop:	cpx #1	beq @lborderloopend	cpx _ctk_hires_windowparams + wpclipy1	bcc @lborderloopend		ldy #7:	lda _ctk_hires_theme+lborderpattern,y		sta (ptr3),y	dey	bpl :-	lda ptr3	sec	sbc #$40	sta ptr3	lda ptr3+1	sbc #1	sta ptr3+1		dex	jmp @lborderloop	@lborderloopend:				jmp restore01;---------------------------------------------------------------------	_ctk_hires_draw_buttonleft:	jsr setupptrs	ldy #0	lda _ctk_hires_color	sta (ptr1),y:			lda _ctk_hires_theme+buttonleftpattern,y	sta (ptr2),y	iny	cpy #8	bne :-		jmp restore01;---------------------------------------------------------------------	_ctk_hires_draw_buttonright:	jsr setupptrs	ldy #0	lda _ctk_hires_color	sta (ptr1),y:			lda _ctk_hires_theme+buttonrightpattern,y	sta (ptr2),y	iny	cpy #8	bne :-		jmp restore01	;---------------------------------------------------------------------_ctk_hires_draw_bitmapline:	sta tmpl	cmp #0	bne :+	rts:			jsr setupptrs		ldy #0		lda _ctk_hires_color:	 	sta (ptr1),y	iny	cpy tmpl	bne :-	lda _ctk_hires_bitmapptr	sta ptr1	lda _ctk_hires_bitmapptr+1	sta ptr1+1		ldy #0	ldx #0:			lda (ptr1),y 	sta (ptr2),y			iny	inx	cpx #8	bne :-	ldx #0		dec tmpl	bne :-		jmp restore01	;---------------------------------------------------------------------	

⌨️ 快捷键说明

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