all repos — taro @ b9267e51302689b71b4edad37282f9af26b3078b

mblaze frontend in uxn + crystal

generalized lisbox routines, fixed msg_read, can now switch mailboxes
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmQVZaoACgkQO3+8IhRO
Y5gntA/8CmC1WvLq3ZLKRH55Zrv+8oXZMvTYDa/F8VpTbWU/f7XM536EY0p5Y+Jt
iKrZ0LlMRw4s9rxh10R63TjBejUDONv6QZ3/8dqhpzV0rPJsHF50PPhj01+rIreG
VYyt+eZtzpavnTQxjedauUfbulH1D0lKOzYM2v6PhIIThrgrPywxfef2QX/MqG1m
V9wpg7MpZ5szIwwIu65keljQpZcYv+2MJ5lzt8VmULzAoKIXdvLRxJz1eFB6RlBF
TrjCnDR1b6su7VNb61QRKERZu0YTE4iqc8sNtfJJAs3Xzw+S8FqmrpQt72LTlHJ9
FMGn+gYZzYT5RNNikQYm0C/k0jdYe7RyK1RfOKOC0pvmNA9N7GGYUvo8rLdcOumb
DXow60/Zfgledn0lwkXQPBYOxehEZqoOKMX3dpIxfEM60OjPqt+nfx4TEkdCeZTy
bfleXp3m/qaL2RIGOZmtV/7Qj8J8rAnl6VbFib9KvsjmrKLCO/hvGRIbDV2lojBA
uuHKY9xk344TTjju7jsFriFwscoWklKjbD5bm9In0lw1yUPoN9iwz9FG+DiZR0Yf
aJKRA6ON4Dc7Y0vCt0rrDlXe2/w3AgI8df96Z2yaYqGWkPznYBs6OkSZikbw3Ovc
zLPfn7Xj9sP20jk0pMeY2z37CdnKELUkeeOjDxMU99HbXHFLvYA=
=JwvR
-----END PGP SIGNATURE-----
commit

b9267e51302689b71b4edad37282f9af26b3078b

parent

ad0d62741889e1e984c58c5f0a88246aacd62ed7

2 files changed, 262 insertions(+), 119 deletions(-)

jump to
M taro-ctl.crtaro-ctl.cr

@@ -33,6 +33,7 @@ @stdout_r : IO::FileDescriptor

@stdin_w : IO::FileDescriptor @stdin_r : IO::FileDescriptor @decoding : Bool = false + @sizing : Bool = false @szshort : UInt16 = 0 def initialize(w : WinType = WinType::LIST)

@@ -73,13 +74,19 @@

def write_msg(msgtype : UInt8, data : Slice) msgsz = UInt16.new(data.size > 16384 ? 16384 : data.size) msgtype.to_io(@stdin_w, IO::ByteFormat::BigEndian) - msgsz.to_io(@stdin_w, IO::ByteFormat::BigEndian) + if msgsz != 0 + msgsz.to_io(@stdin_w, IO::ByteFormat::BigEndian) + else + 8_u16.to_io(@stdin_w, IO::ByteFormat::BigEndian) + end if msgsz == 16384 @stdin_w.write(data[0..msgsz - 2]) 10_u8.to_io(@stdin_w, IO::ByteFormat::BigEndian) - else + elsif msgsz != 0 @stdin_w.write(data[0..msgsz - 1]) + else + @stdin_w.write("nothing\n".to_slice) end end

@@ -88,22 +95,28 @@ msgType : UInt8 = 0

data : Slice(UInt8) = Slice(UInt8).new(0) loop do if @stdout_r.closed? + @decoding = false + @sizing = false + @szshort = 0 break end if !@decoding msgType = @stdout_r.read_byte || 0_u8 @decoding = true - elsif @szshort == 0 + @sizing = true + elsif @sizing szslice = Slice(UInt8).new(2) @stdout_r.read_fully(szslice) szlow : UInt16 = UInt16.new(szslice[0])*256 szhigh : UInt16 = UInt16.new(szslice[1]) @szshort = szlow + szhigh + @sizing = false else slc = Slice(UInt8).new(@szshort) @stdout_r.read_fully(slc) @decoding = false data = slc + szshort = 0 break end end

@@ -118,25 +131,28 @@

def initialize @mailbox = "INBOX" end + + private def run_cmd(cmdtxt : String) : String + puts cmdtxt + io = IO::Memory.new + Process.run(cmdtxt, shell: true, output: io) + return io.to_s + end - def list_mail(box : String = "INBOX") + def list_mail mailCmd = " - mbox=${MBOX_ROOT}/#{box} + mbox=${MBOX_ROOT}/#{@mailbox} mdirs ${mbox} | xargs minc > /dev/null mlist ${mbox} | msort -dr | mseq -S | mscan" - io = IO::Memory.new - Process.run(mailCmd, shell: true, output: io) - return io.to_s + return run_cmd(mailCmd) end def list_mboxes - mailCmd ="for x in $(mdirs ${MBOX_ROOT}); do echo ${x#$MBOX_ROOT/}; done" + mailCmd ="echo 'INBOX' ; for x in $(mdirs -a ${MBOX_ROOT} | sort | grep -v INBOX); do echo ${x#$MBOX_ROOT/}; done" - io = IO::Memory.new - Process.run(mailCmd, shell: true, output: io) - return io.to_s + return run_cmd(mailCmd) end def set_mbox(box : String)

@@ -158,7 +174,8 @@ @composeWins = Array(ChildWindow).new

@mblaze = MblazeProxy.new list = @mblaze.list_mail - + mboxes = @mblaze.list_mboxes + @lsWin.write_msg(0_u8, mboxes.to_slice) @lsWin.write_msg(2_u8, list.to_slice) end

@@ -189,7 +206,9 @@ when taro.mainWindow.lifetime.receive?

exit when m = taro.mainWindow.msg.receive case m.type - when 1 then taro.mblaze.set_mbox(m.data.to_s) + when 1 then + taro.mblaze.set_mbox(String.new(m.data)) + taro.mainWindow.write_msg(2_u8, taro.mblaze.list_mail.to_slice) end end end
M taro-ls.taltaro-ls.tal

@@ -8,8 +8,20 @@ %MAIL_LIST { #02 }

( UI constants ) -%TOP_SECTION { #0020 } +%TOP_SECTION { #0040 } +%MID_SEPARATOR { #0008 } %BOTTOM_SECTION { #0040 } + +%LB_DATA { #02 ADD } +%LB_LEN { #04 ADD } +%LB_OFFSET { #06 ADD } +%LB_ELEM_OFFSET { #08 ADD } +%LB_TOP { #09 ADD } +%LB_HEIGHT { #0b ADD } +%LB_SELECT_IDX { #0c ADD } +%SB_LEN { #0e ADD } +%SB_POS { #0f ADD } +%SB_STEP { #11 ADD } |00 @System &vector $2 &wst $1 &rst $1 &eaddr $2 &ecode $1 &pad $1 &r $2 &g $2 &b $2 &debug $1 &halt $1 |10 @Console &vector $2 &read $1 &pad $5 &write $1 &error $1

@@ -31,9 +43,12 @@

@refresh [ &mboxes $1 &list $1 &fg $1 ] @resizing [ $1 &x $2 &y $2 &dx $2 &dy $2 ] @decoding [ $1 &msg_type $1 &counting $1 &count $2 &processed $2 ] -@mboxes [ &bytes $2 &len $1 &offset $2 &elem_offset $1 &top $2 &height $1 &select_index $2 &sb_len $1 &sb_pos $2 &sb_step $2 ] -@list [ &bytes $2 &len $1 &offset $2 &elem_offset $1 &top $2 &height $1 &select_index $2 &sb_len $1 &sb_pos $2 &sb_step $2 ] -@sb [ &len $1 &pos $2 &step $2 ] +@mboxes [ &bytes $2 &data $2 &len $2 &offset $2 &elem_offset $1 + &top $2 &height $1 &select_index $2 + &sb_len $1 &sb_pos $2 &sb_step $2 ] +@list [ &bytes $2 &data $2 &len $2 &offset $2 &elem_offset $1 + &top $2 &height $1 &select_index $2 + &sb_len $1 &sb_pos $2 &sb_step $2 ] ( program )

@@ -44,10 +59,14 @@ #028d .System/r DEO2

#0a8d .System/g DEO2 #098d .System/b DEO2 - #0180 .Screen/width DEO2 + #0300 .Screen/width DEO2 #0200 .Screen/height DEO2 - .Screen/height DEI2 TOP_SECTION BOTTOM_SECTION ADD2 SUB2 #03 SFT2 NIP .list/height STZ + ;list_data .list/data STZ2 + ;mbox_data .mboxes/data STZ2 + + .Screen/height DEI2 TOP_SECTION BOTTOM_SECTION ADD2 MID_SEPARATOR ADD2 SUB2 #03 SFT2 NIP .list/height STZ + TOP_SECTION #03 SFT2 NIP .mboxes/height STZ #01 .refresh/fg STZ ;on_screen .Screen/vector DEO2

@@ -71,25 +90,31 @@

( decode data ) .Console/read DEI .decoding/msg_type LDZ + DUP MBOX_LIST NEQ ,&no_mbox_list JCN + POP ;mbox_data .decoding/processed LDZ2 ADD2 STA + decode_inc_count .mboxes/bytes STZ2 + ,&count JMP + &no_mbox_list DUP MAIL_LIST NEQ ,&no_mail_list JCN - POP ;list_data .decoding/processed LDZ2 ADD2 STA + + POP ;list_data .decoding/processed LDZ2 ADD2 STA decode_inc_count .list/bytes STZ2 ,&count JMP - #01 .refresh/list STZ &no_mail_list POP - + &count decode_is_done ,&done JCN BRK &done #0000 DUP2 .decoding/count STZ2 .decoding/processed STZ2 #00 .decoding STZ - BRK + &count_1 .Console/read DEI .decoding/count STZ #02 .decoding/counting STZ BRK + &count_2 .Console/read DEI .decoding/count INC STZ #00 .decoding/counting STZ

@@ -101,13 +126,21 @@ .decoding/processed LDZ2 INC2 DUP2 .decoding/processed STZ2

JMP2r @decode_is_done ( -- bit ) + .decoding/processed LDZ2 .decoding/count LDZ2 EQU2 DUP ,&refresh_ui JCN + JMP2r + &refresh_ui + .list/bytes LDZ2 .decoding/count LDZ2 NEQ2 ,&no_list JCN #01 .refresh/list STZ - .decoding/processed LDZ2 .decoding/count LDZ2 EQU2 + &no_list + .mboxes/bytes LDZ2 .decoding/count LDZ2 NEQ2 ,&no_mbox JCN + #01 .refresh/mboxes STZ + &no_mbox JMP2r @on_mouse ( -> ) - #01 .refresh/fg STZ - get_select_idx_by_mouse + + ;mbox_select_handler .mboxes .refresh/mboxes #0000 mouse_event_list + ;noop_list_click .list .refresh/list TOP_SECTION MID_SEPARATOR ADD2 mouse_event_list .resizing LDZ #00 EQU ,&resz_check JCN ( resizing )

@@ -129,6 +162,7 @@ #01 .resizing STZ

.Mouse/x DEI2 .resizing/x STZ2 .Mouse/y DEI2 .resizing/y STZ2 &done + #01 .refresh/fg STZ BRK @handle_rsz ( -- mousestate )

@@ -159,19 +193,28 @@ ,&chk_release JMP

&chk_release #01 .refresh/list STZ - .Screen/height DEI2 TOP_SECTION BOTTOM_SECTION ADD2 SUB2 #03 SFT2 NIP .list/height STZ + #01 .refresh/mboxes STZ + .Screen/height DEI2 TOP_SECTION BOTTOM_SECTION ADD2 MID_SEPARATOR ADD2 SUB2 #03 SFT2 NIP .list/height STZ .Mouse/state DEI JMP2r @on_screen ( -> ) + .refresh/mboxes LDZ #00 EQU ,&no_mboxes JCN + #0000 .mboxes/height LDZ clear_listbox + .mboxes #0000 draw_listbox + .mboxes #0000 draw_scrollbar + #00 .refresh/mboxes STZ + &no_mboxes .refresh/list LDZ #00 EQU ,&no_list JCN - draw_mail_list - draw_scrollbar + [ TOP_SECTION MID_SEPARATOR ADD2 ] .list/height LDZ clear_listbox + .list [ TOP_SECTION MID_SEPARATOR ADD2 ] draw_listbox + .list [ TOP_SECTION MID_SEPARATOR ADD2 ] draw_scrollbar #00 .refresh/list STZ &no_list + .refresh/fg LDZ #00 EQU ,&no_fg JCN clear_fg draw_resize_handle

@@ -183,20 +226,37 @@ BRK

@clear_fg ( -> ) + ;blank .Screen/addr DEO2 .Screen/width DEI2 #0000 &whilex EQU2k ,&endx JCN DUP2 ,&x STR2 .Screen/height DEI2 #0000 &whiley EQU2k ,&endy JCN - DUP2 ,&y STR2 + DUP2 .Screen/y DEO2 ,&x LDR2 .Screen/x DEO2 - ,&y LDR2 .Screen/y DEO2 - ;blank .Screen/addr DEO2 #41 .Screen/sprite DEO #0008 ADD2 ,&whiley JMP &endy POP2 POP2 #0008 ADD2 ,&whilex JMP &endx POP2 POP2 JMP2r &x $2 -&y $2 + +@clear_listbox ( top* height -- ) + #00 SWP #30 SFT2 + ,&height STR2 + ,&top STR2 + ;blank .Screen/addr DEO2 + .Screen/width DEI2 #0008 SUB2 #0000 &whilex EQU2k ,&endx JCN + DUP2 ,&x STR2 + ,&top LDR2 ,&height LDR2 ADD2 ,&top LDR2 &whiley EQU2k ,&endy JCN + DUP2 .Screen/y DEO2 + ,&x LDR2 .Screen/x DEO2 + #00 .Screen/sprite DEO + #0008 ADD2 ,&whiley JMP &endy POP2 POP2 + #0008 ADD2 ,&whilex JMP &endx POP2 POP2 + +JMP2r +&x $2 +&top $2 +&height $2 @draw_resize_handle ( -> )

@@ -207,7 +267,7 @@ #02 .Screen/sprite DEO

JMP2r -@strlen ( addr -- len ) +@strlen ( addr* -- len* ) DUP2 &loop

@@ -216,40 +276,41 @@ SWP2 SUB2

JMP2r -@store_char ( char -- char ) +@store_char ( char list_e_offset -- char ) - #00 .list/elem_offset LDZ ;word ADD2 STA - .list/elem_offset LDZ INC .list/elem_offset STZ + SWP OVR LDZ #00 SWP ;word ADD2 STA + LDZk INC SWP STZ JMP2r -@shouldnt_draw_word ( -- flag ) +@shouldnt_draw_word ( list -- flag ) - .list/offset LDZ2 .list/top LDZ2 LTH2 ,&no JCN - .list/offset LDZ2 .list/top LDZ2 #00 .list/height LDZ ADD2 #0001 SUB2 GTH2 ,&no JCN + DUP LB_OFFSET LDZ2 DUP2 + STH2 ROT STHk LB_TOP LDZ2 LTH2 ,&clear_rtn JCN + STHr DUP LB_TOP LDZ2 ROT LB_HEIGHT LDZ #00 SWP ADD2 #0001 SUB2 STH2r SWP2 GTH2 ,&no_draw JCN #00 JMP2r - &no + &clear_rtn + POP2r POPr + &no_draw #01 JMP2r -@draw_list_elem ( -> ) - - ( ;get_entry_color JSR2 #0c NEQ ,&no_store_cart JCN - ;store_cart JSR2 ) - &no_store_cart +@draw_list_elem ( list -- ) + STHk + get_entry_color STH [ ;word .Screen/x DEI2 .Screen/y DEI2 - get_entry_color ] draw_str - finish_line + STHr ] draw_str + STHr finish_line JMP2r -@get_entry_color ( -- colorByte ) +@get_entry_color ( list -- colorByte ) - .list/offset LDZ2 - .list/select_index LDZ2 + DUP LB_OFFSET LDZ2 + ROT LB_SELECT_IDX LDZ2 NEQ2 ,&normal JCN

@@ -259,55 +320,50 @@ &normal

#03 JMP2r -@finish_line ( -> ) +@finish_line ( list -- ) + STH ;blank .Screen/addr DEO2 &while .Screen/x DEI2 .Screen/width DEI2 #0010 SUB2 GTH2 ,&end JCN - get_entry_color .Screen/sprite DEO + STHkr get_entry_color .Screen/sprite DEO .Screen/x DEI2 #0008 ADD2 .Screen/x DEO2 ,&while JMP &end - + POPr JMP2r -@draw_mail_list ( -> ) +@draw_listbox ( .list ypos* -- ) #0000 .Screen/x DEO2 -TOP_SECTION .Screen/y DEO2 +( ypos ) .Screen/y DEO2 -.decoding LDZ #01 NEQ ,&proceed JCN - ;loading .Screen/x DEI2 .Screen/y DEI2 #03 draw_str -JMP2r -&proceed - -#0000 .list/offset STZ2 -.list/bytes LDZ2 #0000 &while EQU2k ,&end JCN - DUP2 ;list_data ADD2 LDA +( .list ) STH +&begin +#0000 STHkr LB_OFFSET STZ2 +STHkr LDZ2 #0000 &while EQU2k ,&end JCN + DUP2 STHkr LB_DATA LDZ2 ADD2 LDA DUP #00 EQU ,&end JCN ( if not newline, store the character and increment the offsets ) DUP #0a EQU ,&inc_line JCN - ;store_char JSR2 + STHkr LB_ELEM_OFFSET store_char ,&continue JMP ( continue looping ) &inc_line - POP #0000 .list/elem_offset LDZ ;word ADD2 STA - shouldnt_draw_word ,&no_draw JCN - draw_list_elem + POP #0000 STHkr LB_ELEM_OFFSET LDZ ;word ADD2 STA + STHkr shouldnt_draw_word ,&no_draw JCN + STHkr draw_list_elem #0000 .Screen/x DEO2 .Screen/y DEI2 #0008 ADD2 .Screen/y DEO2 &no_draw - .list/offset LDZ2 INC2 .list/offset STZ2 + STHkr LB_OFFSET LDZ2 INC2 STHkr LB_OFFSET STZ2 - #ff #00 &word_clr EQUk ,&end_clr JCN - #00 OVR SWP DUP ROT ;word ADD2 STA - INC ,&word_clr JMP &end_clr POP2 - #00 .list/elem_offset STZ + #00 STHkr LB_ELEM_OFFSET STZ &continue INC2 ,&while JMP &end - .list/offset LDZ2 #0001 SUB2 .list/len STZ2 POP2 POP2 + STHkr LB_OFFSET LDZ2 #0001 SUB2 STHr LB_LEN STZ2 POP2 POP2 JMP2r

@@ -324,107 +380,172 @@ @print ( short* -- )

SWP ,&byte JSR &byte ( byte -- ) DUP #04 SFT ,&char JSR - &char ( char -- ) #0f AND DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO + &char ( char -- ) #0f AND DUP #09 GTH #27 MUL ADD #30 ADD .Console/error DEO JMP2r @print_str ( str* -- ) &while - LDAk #18 DEO + LDAk .Console/write DEO INC2 LDAk ,&while JCN POP2 JMP2r -@get_select_idx_by_mouse ( -> ) +@debug ( str* -- ) + &while + LDAk .Console/error DEO + INC2 LDAk ,&while JCN + POP2 + +JMP2r + + +@mouse_event_list ( clickhandler* list refresh ypos* -- ) + + ,&y STR2 + ,&r STR + STH + + ( check bounds ) + .Mouse/x DEI2 .Screen/width DEI2 #0008 SUB2 GTH2 ,&done JCN + .Mouse/y DEI2 ,&y LDR2 LTH2 ,&done JCN + .Mouse/y DEI2 ,&y LDR2 [ STHkr LB_HEIGHT LDZ #00 SWP #30 SFT2 ] ADD2 GTH2 ,&done JCN + + ( check scrollwheel ) .Mouse/scrolly DEI2 #0000 EQU2 ,&no_scroll JCN .Mouse/scrolly DEI2 #0001 EQU2 ,&scroll_down JCN + ( scroll_up ) - ;try_scroll_up_mouse JSR2 + STHkr try_scroll_up_mouse ,&no_scroll JMP &scroll_down - ;try_scroll_down_mouse JSR2 + STHkr try_scroll_down_mouse - &no_scroll - .Mouse/x DEI2 #0008 LTH2 ,&done JCN - .Mouse/x DEI2 .Screen/width DEI2 #0008 SUB2 GTH2 ,&done JCN + &no_scroll + ( select entry ) + - .Mouse/y DEI2 TOP_SECTION LTH2 ,&done JCN - .Mouse/y DEI2 .Screen/height DEI2 BOTTOM_SECTION SUB2 GTH2 ,&done JCN + ( click handler here ) + .Mouse/state DEI #01 AND #00 EQU ,&done JCN + .Mouse/y DEI2 ,&y LDR2 SUB2 #03 SFT2 STHkr LB_TOP LDZ2 ADD2 STHkr LB_SELECT_IDX STZ2 + STHr ROT ROT JSR2 + #01 ,&r LDR STZ + JMP2r + &y $2 + &r $1 + &done + #01 ,&r LDR STZ + POPr + POP2 +JMP2r + +@mbox_select_handler ( list -- ) + + #0000 ,&idx STR2 + #00 ,&chr STR + STHk - .Mouse/y DEI2 TOP_SECTION SUB2 #03 SFT2 .list/top LDZ2 ADD2 .list/select_index STZ2 + #ff #00 &clear_mbox EQUk ,&ready JCN + #00 #00 ROTk ;selected_mbox ADD2 #0000 SWP2 STA + INC ,&clear_mbox JMP &ready POP2 - #01 .refresh/list STZ - .Mouse/state DEI #00 EQU ,&no_click JCN - .list/select_index LDZ2 .list/len LDZ2 GTH2 ,&no_click JCN - &no_click - JMP2r - ( click handler here ) - &done + ( bytes ) LDZ2 #0000 &while EQU2k ,&end JCN + STHkr LB_SELECT_IDX LDZ2 ,&idx LDR2 EQU2 ,&write_str JCN + ;debug_mbox_search debug + DUP2 print + DUP2 STHkr LB_DATA LDZ2 ADD2 LDA #0a EQU ,&inc JCN + INC2 ,&while JMP + &inc ,&idx LDR2 INC2 ,&idx STR2 INC2 ,&while JMP + + &idx $2 + &chr $1 + + &write_str STHkr LB_DATA LDZ2 ADD2 + &loop LDAk #0a EQU ,&end JCN + LDAk [ ;selected_mbox #00 ,&chr LDR ADD2 ] STA + ,&chr LDR INC ,&chr STR INC2 ,&loop JMP + &end + ;selected_mbox debug + POP2 POP2 + POPr + #01 .Console/write DEO + ;selected_mbox strlen SWP .Console/write DEO .Console/write DEO + ;selected_mbox print_str JMP2r -@try_scroll_up_mouse ( -> ) - .list/len LDZ2 #00 .list/height LDZ LTH2 ,&no_scroll_up JCN - .list/top LDZ2 #0000 EQU2 ,&no_scroll_up JCN - .list/top LDZ2 #0001 SUB2 .list/top STZ2 - ;update_sb_pos JSR2 - #01 .refresh/list STZ +@noop_list_click ( list -- ) + POP +JMP2r + +@try_scroll_up_mouse ( list -- ) + STH + STHkr LB_LEN LDZ2 #00 STHkr LB_HEIGHT LDZ LTH2 ,&no_scroll_up JCN + STHkr LB_TOP LDZ2 #0000 EQU2 ,&no_scroll_up JCN + STHkr LB_TOP LDZ2 #0001 SUB2 STHkr LB_TOP STZ2 + STHkr update_sb_pos &no_scroll_up + POPr JMP2r -@try_scroll_down_mouse ( -> ) - .list/len LDZ2 #00 .list/height LDZ LTH2 ,&no_scroll_down JCN - .list/top LDZ2 #00 .list/height LDZ ADD2 .list/len LDZ2 EQU2 ,&no_scroll_down JCN - .list/top LDZ2 INC2 .list/top STZ2 - ;update_sb_pos JSR2 - #01 .refresh/list STZ +@try_scroll_down_mouse ( list -- ) + STH + STHkr LB_LEN LDZ2 #00 STHkr LB_HEIGHT LDZ LTH2 ,&no_scroll_down JCN + STHkr LB_TOP LDZ2 #00 STHkr LB_HEIGHT LDZ ADD2 STHkr LB_LEN LDZ2 EQU2 ,&no_scroll_down JCN + STHkr LB_TOP LDZ2k INC2 ROT STZ2 + STHkr update_sb_pos &no_scroll_down + POPr JMP2r -@draw_scrollbar ( -> ) - +@draw_scrollbar ( list ypos -- ) + ,&y STR2 + STH + .Screen/width DEI2 #0008 SUB2 .Screen/x DEO2 - TOP_SECTION .Screen/y DEO2 + ,&y LDR2 .Screen/y DEO2 ( draw the trough no matter what ) ;blank .Screen/addr DEO2 - .list/height LDZ #00 + STHkr LB_HEIGHT LDZ #00 &while_trough EQUk ,&end_trough JCN #00 .Screen/sprite DEO .Screen/y DEI2 #0008 ADD2 .Screen/y DEO2 INC ,&while_trough JMP &end_trough POP2 ( stop here if there is no overflow ) - .list/len LDZ2 #00 .list/height LDZ LTH2 ,&no_handle JCN + STHkr LB_LEN LDZ2 #00 STHkr LB_HEIGHT LDZ LTH2 ,&no_handle JCN ,&draw_handle JMP &no_handle + POPr JMP2r - + &y $2 ( if there are more entries than will fit in the view area, draw the handle ) &draw_handle ( store the number of entries per tile of the scrollbar ) - .list/len LDZ2 #00 .list/height LDZ DIV2 .sb/step STZ2 + STHkr LB_LEN LDZ2 #00 STHkr LB_HEIGHT LDZ DIV2 STHkr SB_STEP STZ2 ( set the length of the scrollbar ) - .list/height LDZ .list/len LDZ2 #00 .list/height LDZ SUB2 .sb/step LDZ2 DIV2 NIP SUB .sb/len STZ + STHkr LB_HEIGHT LDZ STHkr LB_LEN LDZ2 #00 STHkr LB_HEIGHT LDZ SUB2 STHkr SB_STEP LDZ2 DIV2 NIP SUB STHkr SB_LEN STZ ;scrollbar .Screen/addr DEO2 - TOP_SECTION .sb/pos LDZ2 #30 SFT2 ADD2 .Screen/y DEO2 - .sb/len LDZ #00 &while_handle EQUk ,&end_handle JCN + ,&y LDR2 STHkr SB_POS LDZ2 #30 SFT2 ADD2 .Screen/y DEO2 + STHkr SB_LEN LDZ #00 &while_handle EQUk ,&end_handle JCN .Screen/y DEI2 .Screen/height DEI2 #0040 SUB2 EQU2 ,&end_handle JCN #01 .Screen/sprite DEO INC .Screen/y DEI2 #0008 ADD2 .Screen/y DEO2 ,&while_handle JMP &end_handle POP2 - + POPr JMP2r -@update_sb_pos ( -> ) +@update_sb_pos ( list -- ) - .list/top LDZ2 .sb/step LDZ2 DIV2 .sb/pos STZ2 + DUP DUP + LB_TOP LDZ2 ROT SB_STEP LDZ2 DIV2 ROT SB_POS STZ2 JMP2r

@@ -454,6 +575,8 @@ @cursor [ f8e0 e090 8804 0000 ]

@scrollbar [ 0707 0707 0707 0707 ] @blank [ 0000 0000 0000 0000 ] @loading "Loading... 00 +@debug_mbox_search "Finding 20 "selected 20 "mbox 00 +@debug_mbox_copy "Copying 20 "mbox 20 "name 00 @font [ 00 00 00 00 00 00 00 00 00 18 18 18 08 00 08 00 00 14 14 00 00 00 00 00 00 24 7e 24 24 7e 24 00

@@ -484,5 +607,6 @@ ]

@word $ff +@selected_mbox $ff @list_data $4000 -@input_buf $4000+@mbox_data $4000