📄 ctk-conio_arch-asm.cs
字号:
;;; ;;; ;;; 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 + -