📄 ctk-conio_arch-asm.cs
字号:
ld b, a call _cputsn_arch_asm jp _draw_widget_ret.endif ;; BC = ypos, xpos, HL = w, E = w->w, Stack; null_draw_widget_textentry: ; 0xc5dc sp=0xf97e ;widget=e3be ;; e3cd;textentry.xpos<-b224 ;; stable variables; ;; w->w, w->h, w->widget.textentry.{state,ypos,xpos), xscroll push ix ld ix, #-6 add ix, sp ld sp, ix push bc ; yx ld 0(ix), e ; w->w ld bc, #_off_widget_h call _get_offset ld 1(ix), e ; w->h ld bc, #_off_widget_textentry_state call _get_offset ld a, e sub a, #_CTK_TEXTENTRY_EDIT ld 2(ix), a ; w->widget.textentry.state ld bc, #_off_widget_textentry_ypos call _get_offset ld 3(ix), e ; w->widget.textentry.ypos ld bc, #_off_widget_textentry_xpos call _get_offset ld 4(ix), e ; w->widget.textentry.xpos ;; xscroll = 0; ;; if(w->widget.textentry.xpos >= w->w - 1) { ;; xscroll = w->widget.textentry.xpos - w->w + 1; ;; } ld a, e inc a sub 0(ix) ; xscroll = w->widget.textentry.xpos - w->w + 1 jr nc, _draw_widget_textentry_next xor a ; if (xscroll < 0) xscroll = 0_draw_widget_textentry_next: ; A = xscroll, Stack; yx - IX ld 5(ix), a ; xscroll ld bc, #_off_widget_textentry_text call _get_offset ; DE = text ld l, #0 ; loop counter pop bc ;; L = counter, IX = sp, DE = text, BC = yx, Stack; null_draw_widget_textentry_loop1: ; 0xc629 ;; gotoxy_arch(xpos, ypos); push hl ; Stack; text ld h, b ld l, c call _gotoxy_arch_asm ;; if(w->widget.textentry.state == CTK_TEXTENTRY_EDIT && ;; w->widget.textentry.ypos == j) pop hl ; Stack; null, BC = yx, DE = text, L = count push bc ; Stack; yx ld a, l cp a, 1(ix) ; j - w->h jp nc, _draw_widget_textentry_ret ld a, 2(ix) ; state or a ; state == EDIT? jr nz, _draw_widget_textentry_else ld a, 3(ix) ; ypos cp a, l ; ypos == j? jr nz, _draw_widget_textentry_else ;; revers_arch(0); push hl ; Stack count yx push de ; Stack text count yx xor a call _revers_arch_asm ;; cputc_arch('>'); ld a, #0x3e ; '>' call _cputc_arch_asm pop de ; Stack count yx push de ; Stack text count yx ld a, 5(ix) ; xscroll add a, e ld e, a ld a, d adc a, #0 ld d, a ; DE = text[xscroll] ld h, #0 ; loop counter ;; for(i = 0; i < w->w; ++i)_draw_widget_textentry_loop2: ; 0xc39d Stack text count yx ;; H = count2, DE = text[xscroll + i] ld a, h cp a, 0(ix) ; i - w->w jr nc, _draw_widget_textentry_loop2exit ;; revers_arch(i == w->widget.textentry.xpos - xscroll); push hl ; Stack count2 text count1 yx ld a, 4(ix) ; w->w.widget.textentry.xpos sub 5(ix) ; xscroll sub h ; textentry.xpos - xscroll- i ld a, #00 ; flags don't change jr nz, _draw_widget_textentry_revers ld a, #01_draw_widget_textentry_revers: call _revers_arch_asm ;; DE = text, Stack; count2 text count1 yx ;; cputc((c == 0) ? CH_SPACE : c); ld a, (de) ; ch or a jr nz, _draw_widget_textentry_nospace ld a, #CH_SPACE_draw_widget_textentry_nospace: push de call _cputc_arch_asm pop de pop hl ; Stack text count1 yx, H = count2 inc h inc de jr _draw_widget_textentry_loop2_draw_widget_textentry_loop2exit: ; Stack text count yx xor a call _revers_arch_asm ld a, #0x3c ; '<' call _cputc_arch_asm jr _draw_widget_textentry_endif_draw_widget_textentry_else: ; 0xc68a DE = text, L = count1, Stack yx ;; cputc_arch(CH_VERTLINE); ld a, #CH_VERTLINE push hl push de call _cputc_arch_asm pop de ;; cputsn_arch(text, w->w); ld b, 0(ix) ; w->w push de call _cputsn_arch_asm pop de ; Stack count1 yx ;; clearto_arch(xpos + w->w + 1); pop hl pop bc push bc push hl push de ; Stack text count yx ld a, 0(ix) ; w->w add a, c inc a ; xpos + w->w + 1 call _clearto_arch_asm ;; cputc_arch(CH_VERTLINE); ld a, #CH_VERTLINE call _cputc_arch_asm_draw_widget_textentry_endif: ; Stack text count yx ;; text += w->w pop de ld a, e add a, 0(ix) ld e, a ld a, d adc a, #0 ld d, a pop hl ;; i++ inc l pop bc ;; ++ypos; inc b jp _draw_widget_textentry_loop1_draw_widget_textentry_ret: pop bc ld hl, #6 add hl, sp ld sp, hl pop ix jp _draw_widget_ret .if CTK_CONF_ICONS ;; BC = ypos, xpos, HL = w, E = w->w, Stack; null_draw_widget_icon: push bc ; Stack; yx ld bc, #_off_widget_icon_title call _get_offset push de ; Stack; title yx ld bc, #_off_widget_icon_textmap call _get_offset pop hl ; HL = title, DE = textmap pop bc ; BC = yx ;; BC = yx, DE = textmap, HL = title push hl ; Stack; title ld h, b ld l, c ; HL = yx ld a, e or d jr z, _draw_widget_icon_title ;; push hl ;; call _wherex_arch ;; ld c, l ;; call _wherey_arch ;; ld b, l ;; pop hl ld a, #3 ; loop counter_draw_widget_icon_loop: ; HL = yx, DE = textmap, Stack; title call _gotoxy_arch_asm push af ; Stack; loop title push hl ; DE = textmap, Stack; yx loop title ld b, #3 call _cputsn_arch_asm ; DE = DE + 3 pop hl pop af ; HL = yx, A = count, Stack; title inc h ; y++ dec a jr nz, _draw_widget_icon_loop ;; Stack; title, HL = yx_draw_widget_icon_title: pop de ; Stack; null, HL = yx, DE = title push de ; Stack; title, HL = yx, DE = title ld b, h ld c, l ; BC = yx ex de, hl ; BC = yx, HL = title ld d, #0_draw_widget_icon_title_strlen: ld a, (hl) or a jr z, _draw_widget_icon_title_setpos inc hl inc d jr _draw_widget_icon_title_strlen ;; D = len, BC = yx, Stack; title_draw_widget_icon_title_setpos: ld h, d ; H = len ld a, d add a, c ; x + len cp a, #SCREEN_WIDTH ; x + len - SCREEN_WIDTH jr c, _draw_widget_icon_title_show ld a, #SCREEN_WIDTH sub h ld c, a ;; B = y, C = x; H = len, Stack; title_draw_widget_icon_title_show: ld a, h ; A = len ld h, b ld l, c call _gotoxy_arch_asm pop de ; DE = title ld b, a ; B = len call _cputsn_arch_asm jp _draw_widget_ret.endif .if CTK_CONF_MENUS ;; --------------------------------- ;; static void draw_menu(struct ctk_menu *m, struct ctk_menu *open) ;; in; HL = menu, BC = open ;; AFBCDEHL____ ;; return void ;; ---------------------------------_draw_menu_asm: ;; x = wherex_arch(); push hl call _wherex_arch ; A = x pop hl push af ;; cputs_arch(m->title); push bc ld bc, #_off_menu_title call _get_offset ; DE = m->title push hl ; Stack; menu open x call _cputs_arch_asm ;; cputc_arch(CH_SPACE); ld a, #CH_SPACE call _cputc_arch_asm pop hl ; menu pop bc ; open, Stack; x ld a, h sub b jp nz, _draw_menu_ret2 ld a, l sub c jp nz, _draw_menu_ret2 ;; x2 = wherex_arch(); ;; 0xc473 push hl call _wherex_arch ; A = x2 ld c, l ; C = x2 pop hl ; Stack; x ;; HL = menu push bc ld bc, #_off_menu_active call _get_offset pop bc ; E = m->active ld d, #0 ; D = y pop af ; A = x, Stack; null ld b, a add a, #CTK_CONF_MENUWIDTH sub #SCREEN_WIDTH jr c, _draw_menu_loop1 jr z, _draw_menu_loop1 ld a, #SCREEN_WIDTH sub #CTK_CONF_MENUWIDTH ld b, a ;; B = x, C = x2, D = y, E = m->active, HL = menu_draw_menu_loop1: ;; if (y == m->nitems) _draw_menu_ret ld a, d push de push hl push bc ld bc, #_off_menu_nitems call _get_offset cp e pop bc pop hl jr z, _draw_menu_ret ; leave 2byte to pop while return pop de ;; if (y == m->active) revers_arch(0); cp e jr nz, _draw_menu_next1 xor a push hl call _revers_arch_asm pop hl ;; B = x, C = x2, D = y, HL = menu_draw_menu_next1: ; c4ae ;; gotoxy_arch(x, y + 1); push hl ld h, d ld l, b inc h call _gotoxy_arch_asm pop hl ; HL = menu, Stack; null ;; if(m->items[y].title[0] == '-') push de push hl ; e7ca push bc ; Stack; x2x menu y ld bc, #_off_menu_items ld a, (bc) add a, l ld l, a ld a, h adc #0 ld h, a ; HL = m->items[0] ld bc, #_size_menuitem ld a, (bc) ld c, a ld b, #0 ; BC = sizeof(struct menuitem) ld a, d ; A = y_draw_menu_loop2: or a jr z, _draw_menu_next2 add hl, bc dec a jr _draw_menu_loop2_draw_menu_next2: ld bc, #_off_menuitem_title call _get_offset ld a, (de) cp a, #0x2d ; '-' jr nz, _draw_menu_else ;; chline_arch(CTK_CONF_MENUWIDTH); ld b, #CTK_CONF_MENUWIDTH call _chline_arch_asm jr _draw_menu_next3_draw_menu_else: ;; cputs_arch(m->items[y].title); call _cputs_arch_asm_draw_menu_next3: ;; clearto_arch(x + CTK_CONF_MENUWIDTH); pop bc ; B = x, C = x2, Stack; menu y push bc ld a, b add a, #CTK_CONF_MENUWIDTH call _clearto_arch_asm ;; revers_arch(1); ld a, #1 call _revers_arch_asm pop bc pop hl pop de inc d jr _draw_menu_loop1_draw_menu_ret: ; C = x2 ld h, #0 ld l, c call _gotoxy_arch_asm_draw_menu_ret2: pop af ret _ctk_draw_menus: ;; --------------------------------- ;; void ctk_draw_menus(struct ctk_menus *menus); ;; Stack; retl reth menusl menush ;; AFBCDEHL____ ;; return void ;; --------------------------------- ;; clip_arch(0, SCREEN_HEIGHT); ld h, #SCREEN_HEIGHT ld l, #0 call _clip_arch_asm ;; gotoxy_arch(0, 0); ld h, #0 call _gotoxy_arch_asm ;; revers_arch(1); ld a, #1 call _revers_arch_asm ld hl, #2 add hl, sp ld e, (hl) inc hl ld d, (hl) ld h, d ld l, e ; HL = menus ld bc, #_off_menus_desktopmenu call _get_offset push de ; Stack; menus->desktopmenu ld bc, #_off_menus_open call _get_offset push de ; Stack; menus->open menus->desktopmenu ld bc, #_off_menus_menus call _get_offset ld h, d ld l, e ; HL = menu_ctk_draw_menus_loop1: ld bc, #_off_menu_next call _get_offset ;; if (menu == NULL) _ctk_draw_menus_next1 ld a, d or e jr z, _ctk_draw_menus_next1 ;; draw_menu_asm(m, menus->open); ld h, d ld l, e ; HL = menu->next pop bc push bc ; Stack; menus->open menus->desktopmenu push hl ; Stack; menu menus->open menus->desktopmenu call _draw_menu_asm pop hl ; Stack; menus->open menus->desktopmenu jr _ctk_draw_menus_loop1_ctk_draw_menus_next1: pop de ; menus->open pop hl ; menus->desktopmenu push de ; Stack; menus->open ;; clearto_arch(SCREEN_WIDTH - strlen(menus->desktopmenu->title) - 1); ld bc, #_off_menu_title call _get_offset ld b ,#0_ctk_draw_menus_loop2: ld a, (de) or a jr z, _ctk_draw_menus_next2 inc b inc de jr _ctk_draw_menus_loop2_ctk_draw_menus_next2: ld a, #SCREEN_WIDTH sub b ; strlen(menus->desktopmenu->title) dec a ; SCREEN_WIDTH - strlen(menus->desktopmenu->title) - 1 push hl call _clearto_arch_asm pop hl ; desktopmenu pop bc ; open, Stack; null call _draw_menu_asm xor a call _revers_arch_asm ret.endif ;; --------------------------------- ;; unsigned char ctk_draw_width(void); ;; Stack; retl reth ;; _______L____ ;; return width ;; ---------------------------------_ctk_draw_width: ld l, #SCREEN_WIDTH ret ;; --------------------------------- ;; unsigned char ctk_draw_height(void); ;; Stack; retl reth ;; _______L____ ;; return width ;; ---------------------------------_ctk_draw_height: ld l, #SCREEN_HEIGHT ret ;; --------------------------------- ;; internal functions ;; --------------------------------- ;; --------------------------------- ;; static void clearbox_arch_asm(unsigned char x, y, w, h) ;; Stack; retl reth ;; AFBCDEHL____ ;; return void ;; --------------------------------- ;; DE = yx, B = h, C = w_clearbox_arch_asm: ld a, e add a, c ld c, a ; to_x = x + w ld h, d ld l, e_clearbox_arch_loop:: call _gotoxy_arch_asm ; (x, y) push hl push bc ; B = h, HL = yx ld a, c call _clearto_arch_asm pop bc pop hl inc h ; y++ djnz _clearbox_arch_loop ret ;; --------------------------------- ;; void drawbox_asm(unsigned char x, y, w, h) ;; Stack; retl reth ;; B = h, C = w, D = y, E = x ;; AF__________ ;; return void ;; ---------------------------------_drawbox_asm: push bc push de push hl ld h, d ld l, e inc h call _gotoxy_arch_asm ; (x, y + 1) dec h push hl push bc ; Stack; hw, yx, B = h call _cvline_arch_asm ld a, #CH_LLCORNER call _cputc_arch_asm pop bc push bc ; Stack; hw yx ld b, c ; w call _chline_arch_asm ld a, #CH_LRCORNER call _cputc_arch_asm pop bc pop hl call _gotoxy_arch_asm ; (x, y) push hl push bc ; Stack; hw yx ld a, #CH_ULCORNER call _cputc_arch_asm pop bc push bc ; Stack; hw yx ld b, c ; B = w call _chline_arch_asm ld a, #CH_URCORNER call _cputc_arch_asm pop bc ; B = h pop hl ld a, l inc a add a, c ld l, a ; L = x + 1 + w inc h ; H = y + 1 call _gotoxy_arch_asm call _cvline_arch_asm pop hl pop de pop bc ret_ctk_conio_arch_asm_end::
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -