ctk-80col-asm.s

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

S
986
字号
;---------------------------------------------------------------------       	.importzp       ptr1, ptr2, ptr3, ptr4, sreg	.importzp	sp	.import		pushax	.import		incsp2	.import		_ctk_80col_screencolors	.import		_ctk_80col_screenpattern				.import		_ctk_80col_lefttab	.import		_ctk_80col_righttab		.import		_ctk_80col_cursx	.import		_ctk_80col_cursy	.import		_ctk_80col_color	.import		_ctk_80col_underline		.import		_ctk_80col_reversed	.import		_ctk_80col_yscreenaddr	.import		_ctk_80col_yhiresaddr	.import		_ctk_80col_windowparams		.import		_ctk_80col_bitmapptr	.import		_ctk_80col_versionstring	.import		_ctk_80col_versionstring_len			.import		_ctk_80col_theme				.export		_ctk_80col_cclear	.export		_ctk_80col_chline	.export		_ctk_80col_cputc	.export		_ctk_80col_cputsn		.export		_ctk_80col_clear_line	.export		_ctk_80col_draw_bitmapline		.export		_ctk_80col_draw_windowborders;---------------------------------------------------------------------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	titlecolor:  .res 1wptitlecolor = 6titlelen:    .res 1wptitlelen   = 7title:	.res 2wptitle      = 8	;---------------------------------------------------------------------.data;---------------------------------------------------------------------.codesetupptrs:		;; Find hires address.		lda _ctk_80col_cursy	asl	tax	lda _ctk_80col_yhiresaddr,x	sta ptr2	lda _ctk_80col_yhiresaddr+1,x	sta ptr2+1	;; Add X coordinate to the hires address. 	lda #0	sta ptr1+1	lda _ctk_80col_cursx	asl	rol ptr1+1; 	asl	; 	rol ptr1+1		asl	rol ptr1+1	clc	adc ptr2	and #$f8	sta ptr2	lda ptr2+1	adc ptr1+1	sta ptr2+1	;; Find screen address. 	lda _ctk_80col_cursy	asl	tax	lda _ctk_80col_cursx	lsr	clc	adc _ctk_80col_yscreenaddr,x	sta ptr1	lda _ctk_80col_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_80col_cclear:	sta tmpl	cmp #0	bne @norts	rts@norts:					jsr setupptrs			ldy tmpl	lda _ctk_80col_color:			sta (ptr1),y	dey	bpl :-		;; Store either $00 or $ff in hires memory, depending on the	;; reversed flag				ldx tmpl	lda _ctk_80col_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_80col_cursx	dex	bpl @loop1	jmp restore01;---------------------------------------------------------------------_ctk_80col_chline:	sta tmpl	cmp #0	bne @norts	rts@norts:					jsr setupptrs			;; 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_80col_cursx	dex	bne @loop1	jmp restore01;---------------------------------------------------------------------	_ctk_80col_cputc:	sta tmpc	jsr setupptrs		;; 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_80col_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	lda _ctk_80col_cursx	and #1	beq @left	;; 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_80col_underline	beq @rightnounderline	eor #$ff@rightnounderline:	tax	lda (ptr2),y	and #$f0	ora _ctk_80col_righttab,x	 	sta (ptr2),y	dey@rightloop:	lda (ptr1),y	tax	lda (ptr2),y	and #$f0	ora _ctk_80col_righttab,x	 	sta (ptr2),y	dey	bpl @rightloop			inc _ctk_80col_cursx			jmp restore01			@left:			;; 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_80col_underline	beq @nounderline	eor #$ff@nounderline:	tax	lda (ptr2),y	and #$0f	ora _ctk_80col_lefttab,x	 	sta (ptr2),y	dey@loop:	lda (ptr1),y	tax	lda (ptr2),y	and #$0f	ora _ctk_80col_lefttab,x	 	sta (ptr2),y	dey	bpl @loop			inc _ctk_80col_cursx			jmp restore01		;---------------------------------------------------------------------_ctk_80col_cputsn:	sta tmpl	cmp #0	bne :+        jmp incsp2	:			jsr setupptrs		;; 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	bne :+	jmp @end:					;; Convert from PETSCII to screen encoding	eor #$e0	clc	adc #$20	bpl @cont	adc #$40	bpl @cont	eor #$a0@cont:	ldx _ctk_80col_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	lda _ctk_80col_cursx	and #1	beq @left	;; 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_80col_underline	beq @rightnounderline	eor #$ff@rightnounderline:	tax	lda (ptr2),y	and #$f0	ora _ctk_80col_righttab,x	 	sta (ptr2),y	dey@rightloop:	lda (ptr1),y	tax	lda (ptr2),y	and #$f0	ora _ctk_80col_righttab,x	 	sta (ptr2),y	dey	bpl @rightloop		lda ptr2	clc	adc #8	sta ptr2	bcc :+	inc ptr2+1:			inc _ctk_80col_cursx			jmp @loopend	@left:			;; 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_80col_underline	beq @nounderline	eor #$ff@nounderline:	tax	lda (ptr2),y	and #$0f	ora _ctk_80col_lefttab,x	 	sta (ptr2),y	dey@loop:	lda (ptr1),y	tax	lda (ptr2),y	and #$0f	ora _ctk_80col_lefttab,x	 	sta (ptr2),y	dey	bpl @loop				inc _ctk_80col_cursx	@loopend:	inc tmpc	lda tmpc	cmp tmpl	beq :+	jmp @loop1:		@end:	jsr restore01	        jmp incsp2	;---------------------------------------------------------------------_ctk_80col_clear_line:	sta tmpl	asl	tax	lda _ctk_80col_yscreenaddr,x	sta ptr1	lda _ctk_80col_yscreenaddr+1,x	sta ptr1+1		lda _ctk_80col_yhiresaddr,x	sta ptr2	lda _ctk_80col_yhiresaddr+1,x	sta ptr2+1		sei	lda $01	sta tmp01	and #$f8	sta $01	ldy #39	ldx tmpl	lda _ctk_80col_screencolors,x:		sta (ptr1),y	dey	bpl :-	lda tmpl	asl	asl	asl	tax	ldy #0:	lda _ctk_80col_screenpattern,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+1,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+2,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+3,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+4,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+5,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+6,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+7,x	sta (ptr2),y	iny	bne :-	inc ptr2+1	:		lda _ctk_80col_screenpattern,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+1,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+2,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+3,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+4,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+5,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+6,x	sta (ptr2),y	iny	lda _ctk_80col_screenpattern+7,x	sta (ptr2),y	iny	cpy #$40	bne :-	lda tmpl	cmp #24	bne :+				sta _ctk_80col_cursy	lda #2	sta _ctk_80col_cursx	jsr restore01			lda #<_ctk_80col_versionstring	ldx #>_ctk_80col_versionstring 	jsr pushax			lda _ctk_80col_versionstring_len	jmp _ctk_80col_cputsn:			jmp restore01	;---------------------------------------------------------------------	_ctk_80col_draw_bitmapline:	sta tmpl	cmp #0	bne :+	rts:			jsr setupptrs		ldy #0		lda _ctk_80col_color:		sta (ptr1),y		iny	cpy tmpl	bne :-	lda _ctk_80col_bitmapptr	sta ptr1	lda _ctk_80col_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	;---------------------------------------------------------------------_ctk_80col_draw_windowborders:	jsr setupptrs	lda _ctk_80col_windowparams + wpclipy1	beq :+	jmp @nofirstline:				;; Draw first line of the border, including the window title	;; Start with filling color memory	lda _ctk_80col_windowparams + wpw	sta tmpw			ldy #0	lda _ctk_80col_windowparams + wptitlecolor	:		sta (ptr1),y	iny	cpy tmpw	bcc :-	dec tmpw	;; Set color for upper right corner	sta (ptr1),y		iny	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_80col_theme+ulcornerpattern,y	sta (ptr3),y	dey	bpl :-	lda ptr3	clc	adc #$8	sta ptr3	bcc :+	inc ptr3+1:		;; Draw window title bar pattern@titlebarloop:		ldy #7:	lda _ctk_80col_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	bpl @titlebarloop	;; Draw upper right corner piece	ldy #7:	lda _ctk_80col_theme+urcornerpattern,y	sta (ptr3),y	dey	bpl :-@nofirstline:	ldx _ctk_80col_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_80col_windowparams 	;; structure			lda #1	sta tmpy		ldx _ctk_80col_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_80col_windowparams + wpw	iny	sty tmpw@bordercloop:	cpx _ctk_80col_windowparams + wpclipy2	beq @bordercloopend		ldy tmpw	lda _ctk_80col_windowparams + wpcolor2	sta (ptr1),y	ldy #0	lda _ctk_80col_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_80col_windowparams + wpclipy2	beq @noclowerborder	lda ptr1	sec	sbc #$28	sta ptr1	bcs :+	dec ptr1+1:			ldy _ctk_80col_windowparams + wpw	lda _ctk_80col_windowparams + wpcolor2		@lbordercloop:		sta (ptr1),y	dey	bne @lbordercloop	@noclowerborder:				;; Draw right border	ldx tmpy@rborderloop:	cpx _ctk_80col_windowparams + wpclipy2	beq @rborderloopend	lda ptr3	clc	adc #$40	sta ptr3	lda ptr3+1	adc #1	sta ptr3+1	ldy #7:	lda _ctk_80col_theme+rborderpattern,y			sta (ptr3),y	dey	bpl :-	inx	cpx tmph	bne @rborderloop	@rborderloopend:	 	cpx _ctk_80col_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_80col_theme+lrcornerpattern,y	sta (ptr3),y	dey	bpl :-@norbordercorner:		stx tmpy			;; Draw lower border	ldx _ctk_80col_windowparams + wpw@lowerborderloop:	lda ptr3	sec	sbc #$8	sta ptr3	bcs :+	dec ptr3+1:		lda tmpy	cmp _ctk_80col_windowparams + wpclipy2	beq @nolowerborder		ldy #7:		lda _ctk_80col_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_80col_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_80col_windowparams + wpclipy1	bcc @lborderloopend		ldy #7:	lda _ctk_80col_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;---------------------------------------------------------------------		

⌨️ 快捷键说明

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