From ec7ab0da0dc1a1d171ea2c4fe3988ca8771e8358 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Mon, 18 Sep 2023 22:10:50 -0400 Subject: [PATCH] Dirty Rectangles logo app --- asm.jrt | 2 +- assemble.com | Bin 12756 -> 12752 bytes dirtrect.com | Bin 0 -> 2315 bytes dirtrect.jrt | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ text.jrt | 35 +++++++++++------------- zipoff.com | Bin 15336 -> 15332 bytes 6 files changed, 92 insertions(+), 20 deletions(-) create mode 100755 dirtrect.com create mode 100755 dirtrect.jrt diff --git a/asm.jrt b/asm.jrt index 7525b7e..72df354 100755 --- a/asm.jrt +++ b/asm.jrt @@ -36,7 +36,7 @@ array oparg2 3 cells allot : byteop? ( -- f ) oparg-breg? swap-args oparg-breg? or swap-args byteptr? or ; -: byteval? ( v -- f ) 0xff00 & dup 0xff00 = swap 0 = or ; +: byteval? ( v -- f ) dup 0x7f <= swap -0x80 >= and ; : oparg-bwreg? ( -- f ) byteop? if oparg-breg? else oparg-wreg? then ; : operror ( err -- ) lastop @ type s" near " type lastlabel @ type s" : " type type cr ; diff --git a/assemble.com b/assemble.com index cbfb0cec176e17bf05eee2d2a3000d645b156593..4d851c17da3a4f3ed9be2e4cfb68bfcc4af22ea8 100755 GIT binary patch delta 5657 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 Py}8@rac#9Yf^+-_ck0VA literal 0 HcmV?d00001 diff --git a/dirtrect.jrt b/dirtrect.jrt new file mode 100755 index 0000000..e626e52 --- /dev/null +++ b/dirtrect.jrt @@ -0,0 +1,75 @@ +import text.jrt + +1 boxstyle! +array shoutout-text t", DIRTY RECTANGLES" +array colors yellow b, lcyan b, lmagenta b, lgreen b, brown b, +array xborders 17 b, 32 b, 47 b, 62 b, 81 b, + +: xregion 0 begin dup xborders + b@ textx <= while 1+ repeat ; +: xborder xborders + b@ ; +: choosecolor xregion colors + b@ fg! ; + +: hline-to ( x -- ) textx - hline ; +: line-to-region xregion xborder hline-to ; + +3 const logo-top +1 const logo-edge +13 const rect-height +2 const vgap +3 const hgap + +: left-corner + textpos @ tl line-to-region textpos ! + texty 1+ texty! rect-height vline ; +: bl-corner bl line-to-region ; + +: left-region + choosecolor + logo-edge logo-top textxy! left-corner bl-corner + logo-edge hgap + logo-top vgap + textxy! left-corner bl-corner + logo-edge hgap 2* + logo-top vgap 2* + textxy! left-corner ; + +: texty++ texty vgap + texty! ; +: bot-rect logo-top rect-height 1+ + ; +: midline textx line-to-region textx! texty++ ; +: mid-region ( i -- ) + xborder logo-top textxy! choosecolor + midline midline midline + bot-rect texty! + midline midline ; + +: right-edge pagew 1- logo-edge - ; +: rlineedge ( gapcount -- ) hgap * right-edge swap - 1- ; +: rline ( gapcount -- ) rlineedge textx swap hline-to textx! texty++ ; +: redge textx tr textx! texty 1+ texty! rect-height vgap - vline br ; + +: right-region + 3 xborder logo-top textxy! choosecolor + 2 rline 1 rline 0 rline bot-rect texty! + 1 rline 0 rline + 1 rlineedge logo-top vgap + textxy! redge + 0 rlineedge logo-top vgap 2* + textxy! redge ; + +: emptych? ( ch -- f ) dup 32 = swap 0 = or ; +: drawdot? ( st -- f ) dup b@ emptych? swap 1+ b@ emptych? or not ; + +: .c choosecolor draw-char ; +: dot 7 .c ; +: sp 32 .c ; +: spacer ( st -- ) sp drawdot? if dot else sp then sp ; + +: shoutout shoutout-text + begin dup b@ dup while .c dup spacer 1+ repeat + drop drop ; + +: logo + textmode + left-region + 0 mid-region 1 mid-region 2 mid-region + right-region + 12 20 textxy! shoutout ; + +' logo ' main redefine + +{ s" dirtrect.com" writecom } + diff --git a/text.jrt b/text.jrt index a7c2df9..0a79f19 100755 --- a/text.jrt +++ b/text.jrt @@ -43,15 +43,14 @@ 80 const pagew 25 const pageh -0xb800 const TEXTMEM +0xb800 const SCREENSEG { : PREP-TEXTCOPY - MOV ES t& TEXTMEM @+ + MOV ES t& SCREENSEG @+ MOV AH textpen @+ MOV DI textpage @+ ; } :asm fill-page ( char -- ) - INT 3 # POP AX PREP-TEXTCOPY MOV CX pagew pageh * # @@ -109,13 +108,14 @@ NEXT :asm draw-vrepeat ( count char -- ) + INT 3 # POP AX POP CX JCXZ 1 @> PREP-TEXTCOPY-XY 0 :> STOSW - ADD DI pagew 1- 1 << # + ADD DI pagew 1- 2* # DEC CX JNZ 0 <@ CORRECT-TEXTPOS @@ -126,8 +126,8 @@ var boxstyle : hstyle boxstyle @ 0x01 & ; : hstyle! 1 & boxstyle @ 0xfe & | boxstyle ! ; -: vstyle boxstyle @ 0x02 & 1 >> ; -: vstyle! 1 & 1 << boxstyle @ 0xfd & | boxstyle ! ; +: vstyle boxstyle @ 0x02 & 2/ ; +: vstyle! 1 & 2* boxstyle @ 0xfd & | boxstyle ! ; : boxstyle! dup hstyle! vstyle! ; : filled? boxstyle @ 0x04 & ; : filled boxstyle @ 0x04 | boxstyle ! ; @@ -135,36 +135,33 @@ var boxstyle : hchar hstyle if 0xcd else 0xc4 then ; : vchar vstyle if 0xba else 0xb3 then ; -: hline ( count -- ) hchar draw-char ; -: vline ( count -- ) vchar draw-char ; +: hline ( count -- ) hchar draw-hrepeat ; +: vline ( count -- ) vchar draw-vrepeat ; -dictionary .hex { : :corner CREATE >t >t >t >t DOES} boxstyle @ 0x03 & + b@ draw-char ; -dictionary .hex -0xda 0xd6 0xd5 0xc9 :corner tl -dictionary .hex -0xbf 0xb7 0xb8 0xbb :corner tr -0xc0 0xd4 0xd3 0xc8 :corner bl -0xd9 0xbe 0xbd 0xbc :corner br +0xc9 0xd6 0xd5 0xda :corner tl +0xbb 0xb7 0xb8 0xbf :corner tr +0xc8 0xd3 0xd4 0xc0 :corner bl +0xbc 0xbd 0xbe 0xd9 :corner br : boxtop ( w -- ) textx swap tl 2 - hline tr nextline textx! ; : boxbottom ( w -- ) bl 2 - hline br ; : hollow-boxmiddle ( h w -- ) textpos @ >r - textx + textx! dup vline + textx + 1- textx! dup vline r 2 - swap begin dup while 1- - vchar draw-char over 2 - 32 swap draw-hrepeat vchar draw-char + vchar draw-char over [ key lit ] draw-hrepeat vchar draw-char nextline r@ textx! - repeat 2drop rdrop ; + repeat drop drop rdrop ; : boxmiddle filled? if filled-boxmiddle else hollow-boxmiddle then ; : draw-box ( w h -- ) swap dup boxtop ( h w ) - swap over boxmiddle + swap 2 - over boxmiddle boxbottom ; diff --git a/zipoff.com b/zipoff.com index a95a09c74047d7515d70303b8efd23163307a46c..1dedef6e7afe22dd7b366b559a3eee175a9df584 100755 GIT binary patch delta 8188 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 NjBgvLgpbGMe*xzoM!En1 delta 7977 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 JGI*6G{}23%93KDx