gigatron/rom/Contrib/xopr/NetTerm/SYS_VDrawWord.patch
2025-01-28 19:17:01 +03:00

250 lines
9.9 KiB
Diff

From c3a397c28c4c0f2502e038b58bc4d282242f22a9 Mon Sep 17 00:00:00 2001
From: xopr <xopr@ackspace.nl>
Date: Mon, 20 Jan 2020 13:30:17 +0100
Subject: [PATCH] Added SYS_VDrawWord function
---
Core/dev.py | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 216 insertions(+), 3 deletions(-)
diff --git a/Core/dev.py b/Core/dev.py
index 76a18881..4c3ef583 100755
--- a/Core/dev.py
+++ b/Core/dev.py
@@ -815,9 +815,23 @@ ld(hi('REENTER'),Y) #15 slot 0xc8
jmp(Y,'REENTER') #16
ld(-20/2) #17
-ld(hi('REENTER'),Y) #15 slot 0xcb
-jmp(Y,'REENTER') #16
-ld(-20/2) #17
+#-----------------------------------------------------------------------
+# Extension SYS_VDrawWord_134
+#-----------------------------------------------------------------------
+
+# Draw 3x5 glyph from word
+# sysArgs[0] Color 0 (background)
+# sysArgs[1] Color 1 (pen)
+# sysArgs[2:3] 16 bits (word) (destructive), bit (14, 9, 4),(13, 8, 3),(12, 7, 2),(11, 6, 1),(10, 5, 0)
+# they are grouped in chunks of 5 bits from top left to bottom right (with special case: MSB=offset)
+# for example: bit 14 is column 1 row 1, ..., bit 10 is column 1 row 5
+# bit 9 is column 2 row 1, ..., bit 0 is column 3 row 5
+# sysArgs[4:5] Position on screen
+
+label('SYS_VDrawWord_134')
+ld(hi('sys_VDrawWord'),Y);C('Draw a 3x5 glyph') #15 slot 0xcb
+jmp(Y,'sys_VDrawWord') #16
+ld([sysArgs+4], X) #17
ld(hi('REENTER'),Y) #15 slot 0xce
jmp(Y,'REENTER') #16
@@ -5349,6 +5363,205 @@ ld([sysArgs+2]) # Decrement byte count and loop
bne('.slb1') #
suba(1) #
+# SYS_VDrawWord_134 implementation
+label('sys_VDrawWord')
+
+# Line 1
+ld([sysArgs+5], Y) #18 store arg5 in Y
+
+#TODO: MSB set means empty line (bmi)
+ld([sysArgs+3]) #19 load (high) byte
+anda(0x40) #20 mask bit (r1c1)
+bne('.fgc1') #21 branch if bit set (AC not equal 0)
+bra('.drawpxl1') #22 jump to "draw pixel"
+ld([sysArgs+0]) #23a select BG color
+label('.fgc1')
+ld([sysArgs+1]) #23b select FG color
+label('.drawpxl1')
+st([Y,Xpp]) #24 Draw pixel, increase X
+
+ld([sysArgs+3]) #25 load (high) byte
+anda(0x02) #26 mask bit (r1c2)
+bne('.fgc2') #27 branch if bit set (AC not equal 0)
+bra('.drawpxl2') #28 jump to "draw pixel"
+ld([sysArgs+0]) #29a select BG color
+label('.fgc2')
+ld([sysArgs+1]) #29b select FG color
+label('.drawpxl2')
+st([Y,Xpp]) #30 Draw pixel, increase X
+
+ld([sysArgs+2]) #31 load (low) byte
+anda(0x10) #32 mask bit (r1c3)
+bne('.fgc3') #33 branch if bit set (AC not equal 0)
+bra('.drawpxl3') #34 jump to "draw pixel"
+ld([sysArgs+0]) #35a select BG color
+label('.fgc3')
+ld([sysArgs+1]) #35b select FG color
+label('.drawpxl3')
+st([Y,Xpp]) #36 Draw pixel, increase X
+
+
+ld([sysArgs+5]) #37 load arg5 (vert)
+adda(1) #38 increase by one
+st([sysArgs+5]) #39 store result (destructive)
+
+
+# Line 2
+ld(AC, Y) #40 load (new) Y position
+ld([sysArgs+4], X) #41 store arg4 in X (reset X)
+
+ld([sysArgs+3]) #42 load (high) byte
+anda(0x20) #43 mask bit (r1c1)
+bne('.fgc4') #44 branch if bit set (AC not equal 0)
+bra('.drawpxl4') #45 jump to "draw pixel"
+ld([sysArgs+0]) #46a select BG color
+label('.fgc4')
+ld([sysArgs+1]) #46b select FG color
+label('.drawpxl4')
+st([Y,Xpp]) #47 Draw pixel, increase X
+
+ld([sysArgs+3]) #48 load (high) byte
+anda(0x01) #49 mask bit (r1c2)
+bne('.fgc5') #50 branch if bit set (AC not equal 0)
+bra('.drawpxl5') #51 jump to "draw pixel"
+ld([sysArgs+0]) #52a select BG color
+label('.fgc5')
+ld([sysArgs+1]) #52b select FG color
+label('.drawpxl5')
+st([Y,Xpp]) #53 Draw pixel, increase X
+
+ld([sysArgs+2]) #54 load (low) byte
+anda(0x08) #55 mask bit (r1c3)
+bne('.fgc6') #56 branch if bit set (AC not equal 0)
+bra('.drawpxl6') #57 jump to "draw pixel"
+ld([sysArgs+0]) #58a select BG color
+label('.fgc6')
+ld([sysArgs+1]) #58b select FG color
+label('.drawpxl6')
+st([Y,Xpp]) #59 Draw pixel, increase X
+
+ld([sysArgs+5]) #60 load arg5 (vert)
+adda(1) #61 increase by one
+st([sysArgs+5]) #62 store result (destructive)
+
+
+# Line 3
+ld(AC, Y) #63 load (new) Y position
+ld([sysArgs+4], X) #64 store arg4 in X (reset X)
+
+ld([sysArgs+3]) #65 load (high) byte
+anda(0x10) #66 mask bit (r1c1)
+bne('.fgc7') #67 branch if bit set (AC not equal 0)
+bra('.drawpxl7') #68 jump to "draw pixel"
+ld([sysArgs+0]) #69a select BG color
+label('.fgc7')
+ld([sysArgs+1]) #69b select FG color
+label('.drawpxl7')
+st([Y,Xpp]) #70 Draw pixel, increase X
+
+ld([sysArgs+2]) #71 load (low) byte
+anda(0x80) #72 mask bit (r1c2)
+bne('.fgc8') #73 branch if bit set (AC not equal 0)
+bra('.drawpxl8') #74 jump to "draw pixel"
+ld([sysArgs+0]) #75a select BG color
+label('.fgc8')
+ld([sysArgs+1]) #75b select FG color
+label('.drawpxl8')
+st([Y,Xpp]) #76 Draw pixel, increase X
+
+ld([sysArgs+2]) #77 load (low) byte
+anda(0x04) #78 mask bit (r1c3)
+bne('.fgc9') #79 branch if bit set (AC not equal 0)
+bra('.drawpxl9') #80 jump to "draw pixel"
+ld([sysArgs+0]) #81 select BG color
+label('.fgc9')
+ld([sysArgs+1]) #82a select FG color
+label('.drawpxl9')
+st([Y,Xpp]) #82b Draw pixel, increase X
+
+ld([sysArgs+5]) #83 load arg5 (vert)
+adda(1) #84 increase by one
+st([sysArgs+5]) #85 store result (destructive)
+
+
+# Line 4
+ld(AC, Y) #86 load (new) Y position
+ld([sysArgs+4], X) #87 store arg4 in X (reset X)
+
+ld([sysArgs+3]) #88 load (high) byte
+anda(0x08) #89 mask bit (r1c1)
+bne('.fgc10') #90 branch if bit set (AC not equal 0)
+bra('.drawpxl10') #91 jump to "draw pixel"
+ld([sysArgs+0]) #92a select BG color
+label('.fgc10')
+ld([sysArgs+1]) #92b select FG color
+label('.drawpxl10')
+st([Y,Xpp]) #93 Draw pixel, increase X
+
+ld([sysArgs+2]) #94 load (low) byte
+anda(0x40) #95 mask bit (r1c2)
+bne('.fgc11') #96 branch if bit set (AC not equal 0)
+bra('.drawpxl11') #97 jump to "draw pixel"
+ld([sysArgs+0]) #98a select BG color
+label('.fgc11')
+ld([sysArgs+1]) #98b select FG color
+label('.drawpxl11')
+st([Y,Xpp]) #99 Draw pixel, increase X
+
+ld([sysArgs+2]) #100 load (low) byte
+anda(0x02) #101 mask bit (r1c3)
+bne('.fgc12') #102 branch if bit set (AC not equal 0)
+bra('.drawpxl12') #103 jump to "draw pixel"
+ld([sysArgs+0]) #104a select BG color
+label('.fgc12')
+ld([sysArgs+1]) #104b select FG color
+label('.drawpxl12')
+st([Y,Xpp]) #105 Draw pixel, increase X
+
+ld([sysArgs+5]) #106 load arg5 (vert)
+adda(1) #107 increase by one
+st([sysArgs+5]) #108 store result (destructive)
+
+
+# Line 5
+ld(AC, Y) #109 load (new) Y position
+ld([sysArgs+4], X) #110 store arg4 in X (reset X)
+
+ld([sysArgs+3]) #111 load (high) byte
+anda(0x04) #112 mask bit (r1c1)
+bne('.fgc13') #113 branch if bit set (AC not equal 0)
+bra('.drawpxl13') #114 jump to "draw pixel"
+ld([sysArgs+0]) #115a select BG color
+label('.fgc13')
+ld([sysArgs+1]) #115b select FG color
+label('.drawpxl13')
+st([Y,Xpp]) #116 Draw pixel, increase X
+
+ld([sysArgs+2]) #117 load (low) byte
+anda(0x20) #118 mask bit (r1c2)
+bne('.fgc14') #119 branch if bit set (AC not equal 0)
+bra('.drawpxl14') #120 jump to "draw pixel"
+ld([sysArgs+0]) #121a select BG color
+label('.fgc14')
+ld([sysArgs+1]) #121b select FG color
+label('.drawpxl14')
+st([Y,Xpp]) #122 Draw pixel, increase X
+
+ld([sysArgs+2]) #123 load (low) byte
+anda(0x01) #124 mask bit (r1c3)
+bne('.fgc15') #125 branch if bit set (AC not equal 0)
+bra('.drawpxl15') #126 jump to "draw pixel"
+ld([sysArgs+0]) #127a select BG color
+label('.fgc15')
+ld([sysArgs+1]) #127b select FG color
+label('.drawpxl15')
+st([Y,Xpp]) #128 Draw pixel, increase X
+
+# Return to interpreter
+ld(hi('REENTER'), Y) #129
+jmp(Y,'REENTER') #130
+ld(-134/2) #131
+
# XXX Unfinished
#-----------------------------------------------------------------------
--
2.17.1