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

📄 ctk-conio_arch-asm.cs

📁 Contiki是一个开源
💻 CS
📖 第 1 页 / 共 2 页
字号:
;;; ;;; ;;; ctk-conio_arch-asm.hS;;; ;;; Architecture depend ctk-conio implementation.;;; This assembler source contributes saving speed and memory.;;; ;;; @author Takahide Matsutsuka <markn@markn.org>;;; ;;; $Id: ctk-conio_arch-asm.cS,v 1.2 2007/09/29 04:10:00 matsutsuka Exp $;;;	;; uses preprocessor to enable definitions#include "ctk_arch-def.h"	;; export symbols	.globl	_ctk_draw_init	.globl	_ctk_draw_clear	.globl	_ctk_draw_clear_window	.globl	_ctk_draw_window	.globl	_ctk_draw_dialog	.globl	_ctk_draw_widget	.globl	_ctk_draw_windowtitle_height.if CTK_CONF_MENUS	.globl	_ctk_draw_menus.endif	.globl	_ctk_draw_width	.globl	_ctk_draw_height	;; import symbols	.globl	_wherex_arch	.globl	_wherey_arch		.globl	_cputc_arch_asm	.globl	_cputs_arch_asm	.globl	_cputsn_arch_asm	.globl	_clip_arch_asm	.globl	_clearto_arch_asm	.globl	_revers_arch_asm	.globl	_chline_arch_asm	.globl	_cvline_arch_asm	.globl	_gotoxy_arch_asm			;; offsets	.globl	_off_window_x	.globl	_off_window_y	.globl	_off_window_h	.globl	_off_window_w	.globl	_off_window_inactive	.globl	_off_window_active	.globl	_off_window_next	.globl	_off_window_focused	.globl	_off_widget_x	.globl	_off_widget_y	.globl	_off_widget_w	.globl	_off_widget_h	.globl	_off_widget_type	.globl	_off_widget_window	.globl	_off_widget_label_text	.globl	_off_widget_button_text	.globl	_off_widget_textentry_text	.globl	_off_widget_textentry_xpos	.globl	_off_widget_textentry_ypos	.globl	_off_widget_textentry_state.if CTK_CONF_HYPERLINK	.globl	_off_widget_hyperlink_text.endif.if CTK_CONF_ICONS	.globl	_off_widget_icon_title	.globl	_off_widget_icon_textmap.endif.if CTK_CONF_MENUS	.globl	_off_menu_title	.globl	_off_menu_active	.globl	_off_menu_nitems	.globl	_off_menu_items	.globl	_off_menu_next	.globl	_off_menuitem_title	.globl	_size_menuitem	.globl	_off_menus_open	.globl	_off_menus_menus	.globl	_off_menus_desktopmenu.endif	.area	_DATA	.area	_CODE_ctk_draw_windowtitle_height:	.db	1	_ctk_conio_arch_asm_start::	;; ---------------------------------	;; void ctk_draw_init(void)	;; Stack; retl reth	;; _F____HL____ AFBCDEHL____	;; return void	;; ---------------------------------_ctk_draw_init:	xor	a	call	_revers_arch_asm	ld	h, #SCREEN_HEIGHT	ld	l, #0	jr	_ctk_draw_clear_asm	;; ---------------------------------	;; ctk_draw_clear(unsigned char clipy1, unsigned char clipy2); 	;; Stack; retl reth clipy1 clipy2	;; AFBCDEHL____	;; return void	;; ---------------------------------_ctk_draw_clear:	ld	hl, #2	add	hl, sp	ld	e, (hl)		; clipy1	inc	hl	ld	d, (hl)		; clipy2	;; E = clip1, D = clip2	ex	de, hl_ctk_draw_clear_asm:	call	_clip_arch_asm	ld	a, h	sub	l			; A = clipy2 - clipy1	ld	b, a			; height	ld	c, #SCREEN_WIDTH	; width	ld	d, l		; y	ld	e, #0		; x	call	_clearbox_arch_asm	ret_get_offset:	;; BC = offset address	;; HL = base address	;; return DE = data	;; ___DE______	push	af	push	hl	ld	a, (bc)	add	a, l	ld	l, a	ld	a, h	adc	#0	ld	h, a	ld	e, (hl)	inc	hl	ld	d, (hl)	pop	hl	pop	af	ret	;; ---------------------------------	;; ctk_draw_clear_window(struct ctk_window *window,	;; 		      unsigned char focus,	;; 		      unsigned char clipy1,	;; 		      unsigned char clipy2) 	;; Stack; retl reth winl winh focus clipy1 clipy2	;; AFBCDEHL____	;; return void	;; ---------------------------------_ctk_draw_clear_window:	;;   clip_arch(clipy1, clipy2);	ld	hl, #5	add	hl, sp	ld	e, (hl)	inc	hl	ld	d, (hl)	ex	de, hl	call	_clip_arch_asm	;;   clearbox_arch(window->x + 1, window->y + 2, window->w, window->h);	ld	hl, #2	add	hl, sp	ld	e, (hl)	inc	hl	ld	d, (hl)	ld	h, d	ld	l, e		; HL = window	ld	bc, #_off_window_h	call	_get_offset	ld	d, e		; D = window->h	ld	bc, #_off_window_w	call	_get_offset	; E = window->w	push	de	ld	bc, #_off_window_y	call	_get_offset	; E = window->y	ld	a, e	inc	a	inc	a	ld	bc, #_off_window_x	call	_get_offset	; E = window->x	inc	e	ld	d, a		; D = window->y + 2, E = window->x + 1	pop	bc		; B = h, C = w	call	_clearbox_arch_asm	ret		;; ---------------------------------	;; void ctk_draw_dialog(struct ctk_window *dialog) 	;; Stack; retl reth dialogl dialogh	;; AFBCDEHL____	;; return void	;; ---------------------------------_ctk_draw_dialog:	;;   ctk_draw_clear_window(dialog, 0, 0, SCREEN_HEIGHT)	ld	hl, #2	add	hl, sp	ld	e, (hl)	inc	hl	ld	d, (hl)	ld	h, #SCREEN_HEIGHT	ld	l, #0	push	hl	xor	a	push	af	inc	sp	push	de	call	_ctk_draw_clear_window	pop	de	inc	sp	pop	hl	;;   draw_window_asm(dialog, CTK_FOCUS_DIALOG)	ld	a, #_CTK_FOCUS_DIALOG	call	_draw_window_asm	ret		;; ---------------------------------	;; void ctk_draw_window(struct ctk_window *window, unsigned char focus,	;; 		     unsigned char clipy1, unsigned char clipy2,	;; 		     unsigned char draw_borders) 	;; Stack; retl reth winl winh focus cy1 cy2 borders	;; AFBCDEHL____	;; return void	;; ---------------------------------_ctk_draw_window:	;; clip_arch(clipy1, clipy2);	ld	hl, #5	add	hl, sp	ld	e, (hl)	inc	hl	ld	d, (hl)	ex	de, hl	call	_clip_arch_asm		;;   DE = window	;;   A = focus = focus & CTK_FOCUS_WINDOW	;;   draw_window_asm(window, focus);	ld	hl, #2	add	hl, sp	ld	e, (hl)	inc	hl	ld	d, (hl)	inc	hl	ld	a, (hl)	and	a, #_CTK_FOCUS_WINDOW	call	_draw_window_asm	ret	;; ---------------------------------	;; void draw_window_asm	;;	(struct ctk_window *window, unsigned char focus)	;; DE = window, A = focus 	;; Stack; retl reth	;; AFBCDEHL____	;; return void	;; ---------------------------------_draw_window_asm:	;;  drawbox_asm(window->x, window->y + 1, window->w, window->h);	push	af		; focus	ld	h, d	ld	l, e		; HL = window	ld	bc, #_off_window_h	call	_get_offset	ld	a, e	ld	bc, #_off_window_w	call	_get_offset	ld	d, a 	push	de		; D = window->h, E = window->w	ld	bc, #_off_window_y	call	_get_offset	ld	a, e	inc	a	ld	bc, #_off_window_x	call	_get_offset	ld	d, a		; D = window->y + 1, E = window->x	pop	bc		; B = h, C = w, HL = window	call	_drawbox_asm	inc	d		; D = y = window->y + 2	inc	e		; E = x = window->x + 1	push	de		; Stack; yx focus		;; for(w = window->inactive; w != NULL; w = w->next) {	ld	bc, #_off_window_inactive	call	_get_offset	; DE = w = window->inactive	pop	bc		; yx	pop	af		; focus	push	hl	;; de = widget, bc = yx, a = focus, hl = window; Stack; window_ctk_draw_window_asm_loop1:	; draw inactive widgets	;; HL = e4cd	push	af		; Stack; focus window	ld	a, d	or	e	jr	z, _draw_window_asm_next1 ; if (DE == NULL)	pop	af		; A = focus, Stack; window	;; bc = yx, de = w, a = focus	;; draw_widget(w, x, y, focus);	call	_draw_widget_asm	push	bc		; Stack; BC=xy HL=window	ld	h, d	ld	l, e		; HL = w	ld	bc, #_off_window_next	call	_get_offset	; DE = window->next	pop	bc		; bc = yx, Stack; window	jr	_ctk_draw_window_asm_loop1	;; for(w = window->active; w != NULL; w = w->next)	;; HL = window, BC = xy, A = focus; Stack; focus_draw_window_asm_next1:		; Stack; focus window	pop	af		; A = focus	pop	hl		; HL = window; Stack null	push	bc		; Stack yx	;; calc window->focused	ld	bc, #_off_window_focused		call	_get_offset	; DE = window->focused	push	de		; Stack focused yx	ld	bc, #_off_window_active	call	_get_offset	; DE = window->active	pop	hl		; HL = window->focused, Stack; yx	pop	bc		; BC = yx, Stack; null	push	af		; Stack; focus	push	hl		; Stack; focused focus	;; BC = yx, DE = widget, Stack; focused focus_ctk_draw_window_asm_loop2:	; draw active widgets	ld	a, d		; DE = w	or	e	jr	z, _draw_window_asm_next2	;; if (w == window->focused) focus |= CTK_FOCUS_WIDGET;	pop	hl		; HL = window->focused; Stack focus	ld	a, h	cp	d	jr	nz, _draw_window_asm_nofocus	ld	a, l	cp	e	jr	nz, _draw_window_asm_nofocus	pop	af	push	af	or	a, #_CTK_FOCUS_WIDGET	jr	_draw_window_asm_draw_draw_window_asm_nofocus:	pop	af	push	af	;; A = wfocus, BC = yx de = widget hl = focused_draw_window_asm_draw:		; Stack; focus	;; draw_widget(w, posx, posy, wfocus);	call	_draw_widget_asm		push	hl		; Stack; focused focus	push	bc		; Stack; yx focused focus	ld	h, d	ld	l, e		ld	bc, #_off_window_next	call	_get_offset	; DE = w->next	pop	bc		; BC = yx, Stack; focused focus	jr	_ctk_draw_window_asm_loop2_draw_window_asm_next2:		; Stack; focused focus	pop	hl	pop	af	ret	;; ---------------------------------	;; ctk_draw_widget(struct ctk_widget *w,	;; 		unsigned char focus,	;; 		unsigned char clipy1,	;; 		unsigned char clipy2);	;; Stack; retl reth wl wh focus clipy1 clipy2	;; AFBCDEHL____	;; return void	;; ---------------------------------_ctk_draw_widget:	ld	hl, #2	add	hl, sp	ld	e, (hl)	inc	hl	ld	d, (hl)		; DE = widget	inc	hl	ld	a, (hl)		; A = focus	inc	hl	ld	c, (hl)		; clipy1	inc	hl	ld	b, (hl)		; clipy2	push	af		; focus	ld	h, b	ld	l, c		call	_clip_arch_asm	push	de		; Stack; widget focus	ex	de, hl		; HL = widget	ld	bc, #_off_widget_window	call	_get_offset	ex	de, hl		; HL = window	ld	bc, #_off_window_focused	call	_get_offset	; DE = focused	pop	bc		; pop widget, Stack focus	ld	a, b		; compare DE(fucosed) and BC(widget)	sub	d	jr	nz, _ctk_draw_widget_nofocus	ld	a, c	sub	e	jr	nz, _ctk_draw_widget_nofocus	pop	af	or	a, #_CTK_FOCUS_WIDGET	push	af_ctk_draw_widget_nofocus:	push	bc		; widget, Stack widget focus	ld	bc, #_off_window_x	call	_get_offset	inc	e	ld	c, e	push	bc	ld	bc, #_off_window_y	call	_get_offset	inc	e	inc	e	pop	bc	ld	b, e		; yx	pop	de		; widget	pop	af		; focus	;; FALL THROUGH	;; ---------------------------------	;; static void draw_widget_asm(struct ctk_widget *w,	;; 			unsigned char x, unsigned char y,	;; 			unsigned char focus) 	;; Stack; retl reth	;; in; A = focus, BC = yx, DE = widget	;; ____________	;; return void	;; ---------------------------------_draw_widget_asm:	push	hl	push	de	push	bc	push	af		push	de		; Stack; w	ld	h, d	ld	l, e	push	af	push	bc		; Stack; xy, focus, w	ld	bc, #_off_widget_x	call	_get_offset	ld	a, e	pop	bc		; Stack; focus w	add	c	ld	c, a	push	bc	ld	bc, #_off_widget_y	call	_get_offset	ld	a, e	pop	bc		; Stack; focus, w	add	b	ld	b, a		; B = ypos, C = xpos	pop	af	and	a, #_CTK_FOCUS_WIDGET	call	_revers_arch_asm	ld	h, b	ld	l, c	call	_gotoxy_arch_asm	pop	hl		; Stack; null, HL = w	push	hl	push	bc		ld	bc, #_off_widget_type	call	_get_offset	ld	a, e		; A = type	ld	bc, #_off_widget_w	call	_get_offset	; E = w->w;	pop	bc		; B = ypos, C = xpos	pop	hl		; HL = w	cp	a, #_CTK_WIDGET_SEPARATOR	jp	z, _draw_widget_separator	cp	a, #_CTK_WIDGET_LABEL	jp	z, _draw_widget_label	cp	a, #_CTK_WIDGET_BUTTON	jp	z, _draw_widget_button.if CTK_CONF_HYPERLINK	cp	a, #_CTK_WIDGET_HYPERLINK	jp	z, _draw_widget_hyperlink.endif	cp	a, #_CTK_WIDGET_TEXTENTRY	jp	z, _draw_widget_textentry.if CTK_CONF_ICONS	cp	a, #_CTK_WIDGET_ICON	jp	z, _draw_widget_icon.endif_draw_widget_ret:	xor	a	call	_revers_arch_asm	pop	af	pop	bc	pop	de	pop	hl	ret	;; BC = ypos, xpos, HL = w, E = w->w, Stack; null_draw_widget_separator:	ld	b, e	call	_chline_arch_asm	jr	_draw_widget_ret	;; BC = ypos, xpos, HL = w, E = w->w, Stack; null_draw_widget_label:	ld	a, e	push	bc	push	hl	ld	bc, #_off_widget_h	call	_get_offset	; E = h	ld	h, e	ld	l, a		; H = h, L = w->w	ex	(sp), hl	; Stack; H = h, L = w->w; HL = w	ld	bc, #_off_widget_label_text	call	_get_offset	; DE =  text	pop	hl		; Stack; yx; H = h, L = w->w	pop	bc		; BC = yx_draw_widget_label_loop:	ld	a, h	or	a	jr	z, _draw_widget_ret	;; BC = ypos, xpos, H = h, L = w->w, DE = text	push	hl		; Stack; hw	ld	h, b	ld	l, c	call	_gotoxy_arch_asm	pop	hl	;;       cputsn_arch(text, w->w);	push	hl	push	bc	push	de		; Stack; text yx hw	ld	b, l	call	_cputsn_arch_asm ; DE = text	pop	de	pop	bc	pop	hl		; Stack; null	;;       clearto_arch(xpos + w->w);	ld	a, c	add	a, l	push	hl	push	de	push	bc	call	_clearto_arch_asm	pop	bc	pop	de	pop	hl	;;       ++ypos;	inc	b	;;       text += w->w;	ld	a, e	add	a, l	ld	e, a	ld	a, d	adc	a, #0	ld	d, a		dec	h	jr	_draw_widget_label_loop		;; BC = ypos, xpos, HL = w, E = w->w, Stack; null_draw_widget_button:	push	hl		; w	push	de		; w->w	ld	a, #0x5b	; '['	call	_cputc_arch_asm	pop	de	pop	hl	ld	a, e	ld	bc, #_off_widget_button_text	call	_get_offset	ld	b, a	call	_cputsn_arch_asm	ld	a, #0x5d	; ']'	call	_cputc_arch_asm	jp	_draw_widget_ret.if CTK_CONF_HYPERLINK	;; BC = ypos, xpos, HL = w, E = w->w, Stack; null_draw_widget_hyperlink:	ld	a, e	ld	bc, #_off_widget_hyperlink_text	call	_get_offset

⌨️ 快捷键说明

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