[PATCH 2/5] wmdots: Add version 0.2beta to repository.

Doug Torrance <[email protected]>
Newsgroups gmane.compw.window-managers.windowmaker.devel
Message-ID <[email protected]>
From:
http://gentoo.osuosl.org/distfiles/wmdots-0.2beta.tar.gz
---
 wmdots/wmdots/Makefile              |  23 +
 wmdots/wmdots/master.xpm            |  87 ++++
 wmdots/wmdots/old_dos_demo/dow.a    | 860 ++++++++++++++++++++++++++++++++++++
 wmdots/wmdots/old_dos_demo/dow.com  | Bin 0 -> 12874 bytes
 wmdots/wmdots/old_dos_demo/sintab.s | 528 ++++++++++++++++++++++
 wmdots/wmdots/old_dos_demo/trig.s   |  29 ++
 wmdots/wmdots/sintab.c              |  75 ++++
 wmdots/wmdots/wmdots                | Bin 0 -> 62534 bytes
 wmdots/wmdots/wmdots.c              | 667 ++++++++++++++++++++++++++++
 wmdots/wmdots/wmdots.o              | Bin 0 -> 53132 bytes
 wmdots/wmgeneral/list.c             | 169 +++++++
 wmdots/wmgeneral/list.h             |  59 +++
 wmdots/wmgeneral/list.o             | Bin 0 -> 1436 bytes
 wmdots/wmgeneral/misc.c             | 164 +++++++
 wmdots/wmgeneral/misc.h             |   9 +
 wmdots/wmgeneral/misc.o             | Bin 0 -> 2036 bytes
 wmdots/wmgeneral/wmgeneral.c        | 479 ++++++++++++++++++++
 wmdots/wmgeneral/wmgeneral.h        |  61 +++
 wmdots/wmgeneral/wmgeneral.o        | Bin 0 -> 7992 bytes
 19 files changed, 3210 insertions(+)
 create mode 100755 wmdots/wmdots/Makefile
 create mode 100644 wmdots/wmdots/master.xpm
 create mode 100644 wmdots/wmdots/old_dos_demo/dow.a
 create mode 100644 wmdots/wmdots/old_dos_demo/dow.com
 create mode 100644 wmdots/wmdots/old_dos_demo/sintab.s
 create mode 100644 wmdots/wmdots/old_dos_demo/trig.s
 create mode 100644 wmdots/wmdots/sintab.c
 create mode 100755 wmdots/wmdots/wmdots
 create mode 100644 wmdots/wmdots/wmdots.c
 create mode 100644 wmdots/wmdots/wmdots.o
 create mode 100644 wmdots/wmgeneral/list.c
 create mode 100644 wmdots/wmgeneral/list.h
 create mode 100644 wmdots/wmgeneral/list.o
 create mode 100644 wmdots/wmgeneral/misc.c
 create mode 100644 wmdots/wmgeneral/misc.h
 create mode 100644 wmdots/wmgeneral/misc.o
 create mode 100644 wmdots/wmgeneral/wmgeneral.c
 create mode 100644 wmdots/wmgeneral/wmgeneral.h
 create mode 100644 wmdots/wmgeneral/wmgeneral.o

diff --git a/wmdots/wmdots/Makefile b/wmdots/wmdots/Makefile
new file mode 100755
index 0000000..a1a23a0
--- /dev/null
+++ b/wmdots/wmdots/Makefile
@@ -0,0 +1,23 @@
+LIBDIR = -L/usr/X11R6/lib
+LIBS   = -lXpm -lXext -lX11
+OBJS =	wmdots.o ../wmgeneral/wmgeneral.o 
+
+.c.o:
+	cc -c -g -O2 -Wall $< -o $*.o
+
+wmifs: $(OBJS)
+	cc -o wmdots $^ -lXext $(LIBDIR) $(LIBS)
+
+all:: wmdots
+
+clean::
+	for i in $(OBJS) ; do \
+		rm $$i ; \
+	done
+	rm wmdots
+
+install::
+	cp -f wmdots /usr/local/bin/ 
+	chmod 755 /usr/local/bin/wmdots 
+	chown root:root /usr/local/bin/wmdots 
+
diff --git a/wmdots/wmdots/master.xpm b/wmdots/wmdots/master.xpm
new file mode 100644
index 0000000..e1514ad
--- /dev/null
+++ b/wmdots/wmdots/master.xpm
@@ -0,0 +1,87 @@
+/* XPM */
+static char * master_xpm[] = {
+"64 66 18 1",
+" 	c None",
+".	c #000000",
+"+	c #C300FF",
+"@	c #B500F2",
+"#	c #A800E5",
+"$	c #9E00D8",
+"%	c #9200CC",
+"&	c #8500BF",
+"*	c #7900B2",
+"=	c #6E00A5",
+"-	c #660099",
+";	c #5D008C",
+">	c #52007F",
+",	c #480072",
+"'	c #3E0066",
+")	c #37005B",
+"!	c #2D004C",
+"~	c #25003F",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"    ......................................................      ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"++@@##$$%%&&**==--;;>>,,''))!!~~                                ",
+"++@@##$$%%&&**==--;;>>,,''))!!~~                                "};
diff --git a/wmdots/wmdots/old_dos_demo/dow.a b/wmdots/wmdots/old_dos_demo/dow.a
new file mode 100644
index 0000000..85bc6d9
--- /dev/null
+++ b/wmdots/wmdots/old_dos_demo/dow.a
@@ -0,0 +1,860 @@
+;Dogs of war demo by OnlyMe (now called I440r :)
+;-------------------------------------------------------------------------
+
+        ;Assembles with A386.COM (Registered A86).
+
+;-------------------------------------------------------------------------
+;Equates
+
+MaxPoints       equ 125         ;Maximum number of points in an object
+BumpMap         equ Bumps+320   ;Pointer to second scan line of bump map
+SpotX           equ 160         ;Position of static bump map spotlight
+SpotY           equ 80
+
+;-------------------------------------------------------------------------
+;A based structure (See A86 documentation for explanation)
+
+ struc [bx]             ;Structure does NOT need a name
+Counter         dw ?    ;Countdown to change
+Reset           dw ?    ;Counter reset value
+Position        dw ?    ;Points to item being modified
+Delta           dw ?    ;Speed of change (also direction)
+Upper           dw ?    ;Upper limit for position
+Lower           dw ?    ;Lower limit for position
+ ends
+
+;-------------------------------------------------------------------------
+;Un-Initialised data
+
+ data segment
+
+XAngle          dw ?    ;Angles of rotation for each axis
+YAngle          dw ?    ;  higher numbers rotate faster
+ZAngle          dw ?
+
+X               dw ?    ;Coordinates of point being calculated
+Y               dw ?
+Z               dw ?
+
+XSin            dw ?    ;Sin and Cos for each axis angle of rotation
+YSin            dw ?
+ZSin            dw ?
+XCos            dw ?
+YCos            dw ?
+ZCos            dw ?
+
+NumPoints       dw ?    ;Number of points in current object
+
+;           V---MaxPoints
+Trail1: dw 125 dup ?    ;Display address of previous 8 positions for
+Trail2: dw 125 dup ?    ; each point being rotated.  We only erase a
+Trail3: dw 125 dup ?    ; points 8'th previous position.  This makes
+Trail4: dw 125 dup ?    ; the points leave a trail 7 pixles long
+Trail5: dw 125 dup ?
+Trail6: dw 125 dup ?
+Trail7: dw 125 dup ?
+Trail8: dw 125 dup ?
+
+CharP           dw ?    ;Pointer to font def for scrollie char
+BumpX           dw ?    ;Bump map coordinates being calculated
+BumpY           dw ?
+
+;-------------------------------------------------------------------------
+;A copy of the ROM font moved here so we can reference it using DS
+
+Font:           db 256*8 dup ?
+
+;-------------------------------------------------------------------------
+;Note:
+;
+; The following buffer is the whole of the bump map.  There is 1 scan
+;line of ZERO data above and below the area that will contain the bumps.
+;
+;Therefore the bumpmap is at Bumps+320 (See Equates Above)
+
+Bumps:          db 320*18 dup ?
+
+;-------------------------------------------------------------------------
+;Da Beeph (moo)
+
+ code segment
+
+Start:
+ jmp Main               ;Do it...
+
+;-------------------------------------------------------------------------
+;Pre initialised data...
+
+Shape           dw Cube ;Pointer to current object
+
+HalfH           dw 160  ;Screen coordinates for centre of object
+HalfV           dw 100
+
+XOff            dw 150  ;Position of object in world space
+YOff            dw 150
+ZOff            dw 800
+
+DeltaX          dw 5    ;Rotational speeds on each axis
+DeltaY          dw 4
+DeltaZ          dw 7
+
+;-------------------------------------------------------------------------
+;Modifiers: Tables follows this format:  (as per above based structure)
+;
+; Counter          Count down to next speed/position change
+; Retet            Value to reset counter to
+; Position         Pointer to data item to modify
+; Delta            Ammount to change item (also direction)
+; Upper            Upper limit fot item
+; Lower            Lower limit for item
+
+W1:     dw 30,30,offset DeltaX,2,15,2   ;Modifies X Rotational speed
+W2:     dw 20,20,offset DeltaY,-2,12,4  ;Modifies Y Rotational speed
+W3:     dw 40,40,offset DeltaZ,2,10,7   ;Modifies Z Rotational speed
+W4:     dw 02,02,offset ZOff,-3,800,180 ;Zooms object in and out of screen
+
+;-------------------------------------------------------------------------
+;Bump mapped scrollie banner text stuffz
+
+Bannerp         dw Banner       ;Points to next character
+CharColumn      db 080          ;Mask for next colunn of font def
+
+Banner:
+ db ' *** The Dogs Of WAR demo by OnlyMe! ***          '
+ db 'Begin!                 '
+
+Begin:
+ db 'Oh the dogs they had a meeting     '
+ db 'They came from near and far     '
+ db 'And some dogs came by motor bus     '
+ db 'And some by motor car          '
+
+ db 0
+ dw Flies,Hall
+
+Hall:
+ db 'On entering the meeting hall     '
+ db 'Each dog could take a look     '
+ db 'Where he had to hang his asshole     '
+ db 'Up high upon a hook          '
+
+ db 0
+ dw Cross,Fire
+
+Fire:
+ db 'And when they were assembled     '
+ db 'Each canine son and sire     '
+ db 'Some dirty bulldog son of a bitch     '
+ db 'Jumped up and hollared FIRE          '
+
+ db 0
+ dw Square,Panic
+
+Panic:
+ db 'All was in a panic     '
+ db 'Twas hell upon to look     '
+ db 'Each doggie grabbed at random     '
+ db 'An asshole from a hook          '
+
+ db 0
+ dw Cube,Sore
+
+Sore:
+ db 'Now the assholes were all mixed up     '
+ db 'Which made each doggie sore     '
+ db 'To have to wear another dogs ass     '
+ db 'He''d never worn before          '
+
+ db 0
+ dw Star,Bone
+
+Bone:
+ db 'And that is why until this day     '
+ db 'A dog will drop a bone     '
+ db 'To go and smell another dogs ass     '
+ db 'To see if it''s his OWN!            '
+
+ db '*** THE END ***                       ???          '
+ db 'Now what have i forgotz ????                 '
+ db 'ERM.....                Oh Yea....         '
+
+ db 'Greetings *** ROTATE *** Out To ~~~~~~         '
+
+ db 0
+ dw Heart,Catgirl
+
+Catgirl:
+ db 'Catgirl - Jeg Elsker DEG - Purrrrrrrrrrrrr :)     '
+ db 'Myriaam - Cute Sexy BABE Princess DOLL :) - heheheheheh - '
+ db 'okokokokokokokokokokokokokokokokokokokokokokokokokok     '
+ db 'LuvrsCrs - Manager''ess and savior''ess of UnderNUT #CODERS     '
+ db '-->     '
+
+ db 0
+ dw Square,Unf
+
+Unf:
+ db 'Unf - Fatar - Debonaire - Isomer - Hexsane & MrsHex - '
+ db 'nop - mole - oreo - RatKing - \hatred\ - KBerg - '
+ db 'RyanT - Mafia - Yosha - Jungle - Fid - Binary - '
+ db 'PRIM8 - IiTM - Topanga - Tig2 - deRanged - RuneStar - '
+ db '_RyAn_ - DaParasit - Spansh - CodeX - Wicked - '
+ db 'Likwid - KingTroll - tpanther - ED_Lead - Reptile - '
+
+ db 0
+ dw Cross,NoIdea
+
+NoIdea:
+ db 'Noidea - ^Para^ - Wh0is - Chiew - [QWORD] - LoneWolf - '
+ db 'DaveDavis - PsYkOtIk - ^Ion^ - Weathros - LittleLoc - '
+ db 'MissMilla - Centmo - Entlin - CreepGuy - eom - Xico - '
+ db '^Axe^ & Sturnella - Almighty - o - Zyklon - hammr - '
+ db '|Geo| - '
+ db 'MarkIII (Hi Dad) - Diamond1 & Mermaid1 (Hi Sis1 and Sis2 :) - '
+
+ db 0
+ dw Flies,Snoo
+
+Snoo:
+ db 'Snoo - Queen1 & Truely - Shama - Pink^Rose - Divebum - '
+ db 'DEWDROP - KaDaM2 - Freakmama - mr007 - SIOK - Alih - '
+ db 'Asterix - MoKie - Rats - RoadRoach - masdale - mystie - '
+
+ db 'e|ectricTom - Techa^ - TX-Cowboy - buch - luth - '
+
+ db 0
+ dw Cross,Eche
+
+Eche:
+ db 'BaBs - Ratty - Lexzy - PJ - Blondii - dew - Kittie - '
+ db '^Kristi - strawbery - grlafraid - Krystal1 - ortho - '
+ db 'Danni_ - Anne^ - brokngrl - keldog - AnGelDevo - '
+ db '^DE^ - Avantyful & Niece babe :) - mauddib - lil_miss - '
+ db 'Eche & Godis^ hehehehe - lowlife - X & W -                 '
+ db '******** And Everyone else OnlyMe! dun MISSED            '
+ db '*** THE END IS NOT NEIGH ***                    '
+ db '---====*** Begin Again --->                               ',0
+
+ dw Cube,Begin
+
+;-------------------------------------------------------------------------
+;Do IT!
+
+Main:
+ mov ax,013             ;VGA GFX mode = 320 x 200 x 256
+ int 010
+
+ mov cx,(320*18)/2      ;Erase bump map buffer
+ mov di,Bumps
+ xor ax,ax
+ rep stosw
+
+ call GetPalette        ;Create shaded palette
+ call GetFont           ;Read font data out of ROM into current DS
+ call InitScroll        ;Point to font data for first char of banner
+
+ mov ax,0a000           ;Point ES at video segment
+ mov es,ax
+
+L0:
+ call ChangeAngles      ;Get next angle of rotation for all axis
+ call GetSinCos         ;Calculate Sin and Cos for all rotation angles
+ call DoFrame           ;Rotate all points of shape and display
+ call DoScroll          ;Scroll text through bump map buffer
+ call DoBump            ;Bump map scrolly text and display it
+ call Retrace           ;Wait for next raster frame
+ call ErasePoints       ;Erase all pixles that are 8 frames old
+ call DoDeltas          ;Modify rotational speeds etc
+
+ in al,060              ;Read keyboard port
+ cmp al,081             ;Escape key released?
+ jne L0
+
+;-------------------------------------------------------------------------
+;Exit nicely
+
+ mov ax,3               ;Back to textmode
+ int 010
+ mov ah,2               ;Place cursor at bottom left of display
+ mov dx,01700
+ xor bx,bx
+ int 010
+ mov dx,AuRevoir
+ mov ah,9
+ int 021
+ mov ah,04c             ;Return control to dos
+ int 021
+
+;-------------------------------------------------------------------------
+;Do one frame of rotating object. Calculate and plot all points
+
+;DI points to first trail buffer.  We store the address of every pixle
+;we write into this buffer.  When it comes time to erase these pixles we
+;do not need to recalculat them.  We just collect the address!
+
+DoFrame:
+ xor ch,ch              ;Clear hi byte of loop counter
+ xor di,di              ;Point to start of trail buffer
+ mov si,[Shape]         ;Point to object to be rotated
+ mov cl,[si]            ;Get number of points
+ mov NumPoints,cx       ;We need this count later too...
+ inc si
+L0:
+ movsx ax,[si]          ;Get X coordinate of point
+ mov [X],ax
+ movsx ax,[si+1]        ;Get Y coordinate
+ mov [Y],ax
+ movsx ax,[si+2]        ;Get Z coordinate
+ mov [Z],ax
+ call Rotate            ;Rotate point in 3d
+ call Draw              ;Draw this point
+ add si,3               ;Point to next point
+ add di,2               ;point to next slot of trail buffer
+ dec cx
+ jne L0
+ ret
+
+;-------------------------------------------------------------------------
+;Project a single XYZ point into 2D space on screen
+
+Draw:
+ mov ax,[YOff]          ;YOff * Y / Z+ZOff = Screen Y
+ imul [Y]
+ mov bx,[Z]
+ add bx,[ZOff]
+ idiv bx
+ add ax,[HalfV]         ;Centre object on screen
+
+ cmp dx,0               ;Clip this pixle if outside display area
+ jb short ret
+ cmp ax,200
+ ja short ret
+
+ mov bx,320             ;Calculate 320 * Y...
+ imul bx
+
+ mov bx,ax
+
+ mov ax,[XOff]          ;XOff * X / Z+ ZOff = Screen X
+ mov bp,[X]
+ imul bp
+ mov bp,[Z]
+ add bp,[ZOff]          ;Distance
+ idiv bp
+ add ax,[HalfH]
+
+ cmp dx,0               ;Clip pixle if outside display area
+ jb short ret
+ cmp ax,320
+ ja short ret
+
+ add bx,ax
+
+ mov ax,-1              ;Generate colour for point based on X Y and Z axis
+ sub ax,[Z]             ; of dot
+ xor ax,[X]             ;Divides cube into 8 smaller cubes and alternates
+ or ax,[Y]              ; light/dark (opposite corners same shade)
+ shr ax,4
+ add ax,[X]             ;This addition makes the cube stripey man :)
+ add ax,[Y]
+
+ es mov [bx],al         ;Place a dot with color al
+ mov Trail8[di],bx      ;Save address for erase
+ ret
+
+;-------------------------------------------------------------------------
+;Erase pixles that are 8 frames old.
+
+;Every time a pixles is drawn to the display we remember its video
+;offset (address).  This saves time when we want to erase that dot
+;because we dont need to recalculate the address given an XYZ
+
+ErasePoints:
+ xor di,di
+ mov cx,MaxPoints
+L0:
+ mov bx,Trail8[di]      ;Pixles added to display on THIS frame
+; es dec b[bx]           ; Make them less bright
+ xchg bx,Trail7[di]     ;Pixles one frame old
+; es dec b[bx]           ; Make them less bright
+ xchg bx,Trail6[di]     ;Etc...
+; es dec b[bx]
+ xchg bx,Trail5[di]
+; es dec b[bx]
+ xchg bx,Trail4[di]
+; es dec b[bx]
+ xchg bx,Trail3[di]
+; es dec b[bx]
+ xchg bx,Trail2[di]
+; es dec b[bx]
+ xchg bx,Trail1[di]     ;Pixles 8 frames old
+ es mov b[bx],0         ;Erase them
+ inc di,2
+ dec cx
+ jne L0
+ ret
+
+;-------------------------------------------------------------------------
+;Rotate a single point in 3D space
+
+Rotate:
+ push cx                        ;Need to keep this....
+
+;Rotate object about X axis  (changes Y and Z)
+;
+;Y' = Y * Cos(Xang) - Z. Sin(Xang)
+;Z' = Y * Sin(Xang) + Z. Cos(Xang)
+
+ movsx eax,[Z]          ;Get Z * Sin(X)
+ movsx ebx,[XSin]
+ mul ebx
+ mov ecx,eax            ;Save in cx...
+ movsx eax,[Y]          ;Get Y * Cos(x)
+ movsx ebx,[XCos]
+ imul ebx
+ sub eax,ecx            ;Get Y * Cos(X) - Z * Sin(X)
+ sar eax,14             ;Sin and Cos Table values are scaled up
+ mov bp,ax              ; by 16384.  SHR scales results back down
+
+;We just calculated our new Y coordinate.  We cant yet overwrite the old
+;Y because we still need it to calculated the new Z
+
+ movsx eax,[Z]          ;Get Z * Cos(X)  Exact opposite of above!
+ movsx ebx,[XCos]
+ imul ebx
+ mov ecx,eax            ;Save value...
+ movsx eax,[Y]          ;Get Y * Sin(X)
+ movsx ebx,[XSin]
+ imul ebx
+ add eax,ecx            ;Get Y * Sin(X) + Z * Cos(X)
+ sar eax,14             ;Scale results down by 16384
+
+ mov [Y],bp             ;Set newly calculated Y and Z coordinates
+ mov [Z],ax
+
+;Rotate point in Y axis
+;
+;X' = X * Cos(Yang) - Z * Sin(Yang)
+;Z' = X * Sin(Yang) + Z * Cos(Yang)
+
+ movsx eax,[Z]          ;Following code is very similar to above.
+ movsx ebx,[YSin]       ;It rotates the point in the Y axis
+ imul ebx               ;I.E. It calculates new X and Z
+ mov ecx,eax
+ movsx eax,[X]
+ movsx ebx,[YCos]
+ imul ebx
+ sub eax,ecx
+ sar eax,14
+ mov bp,ax              ;Save new X coord
+
+ movsx eax,[Z]          ;Calculate Z
+ movsx ebx,[YCos]
+ imul ebx
+ mov ecx,eax
+ movsx eax,[X]
+ movsx ebx,[YSin]
+ imul ebx
+ add eax,ecx
+ sar eax,14
+
+ mov [X],bp             ;Set new X and Z for point
+ mov [Z],ax
+
+;Rotate objecct along Z axis
+;
+;X' = X * Cos(Zang) - Y * Sin(Zang)
+;Y' = X * Sin(Zang) + Y * Cos(Zang)
+
+ movsx eax,[Y]          ;Hmmm isnt this... the same, arent we just
+ movsx ebx,[ZSin]       ;doing the same, calculations on in exactly
+ imul ebx               ;The same, way but using different
+ mov ecx,eax            ;Variables?  Couldnt we optimise here ???
+ movsx eax,[X]
+ movsx ebx,[ZCos]       ;Answer...
+ imul ebx               ;
+ sub eax,ecx            ;Yes!  But that is a space optimisation
+ sar eax,14             ;Not a speed optimisation.  The INLINE
+ mov bp,ax              ;method is faster
+
+ movsx eax,[Y]          ;There is also a much better way to do this
+ movsx ebx,[ZCos]       ;that is both smaller and faster.
+ imul ebx
+ mov ecx,eax            ;I.E. Use a Matrix to rotates points
+ movsx eax,[X]          ;This however is much easier to follow
+ movsx ebx,[ZSin]       ;and MAFFZ wuzz never my strong suit :)
+ imul ebx
+ add eax,ecx            ;Maybe if this gets too.. slow ill use
+ sar eax,14             ;matricies tho :)
+
+ mov [X],bp
+ mov [Y],ax
+ pop cx
+ ret
+
+;-------------------------------------------------------------------------
+;calculate new angles of rotation for all points (to angles)
+
+;We do NOT rotate a point by 1 degree on one frame and then rotate that
+;rotated point by 1 degree in the next.  We rotate by 1 degree in the
+;first frame,  by 2 in the next, by 3 in the next etc.
+
+;Every time a point is rotated there is a slight ammount of error in our
+;calculation.  If we rotated previously rotated points we would accumulate
+;errors on each rotation of the point and our object would distort.
+
+;By rotating the SAME points (i.e the original shape) on every frame but
+;by different ammounts each time, we never distort our shape by more
+;than ONE rotations worth of error (which u cant see :)
+
+ChangeAngles:
+ mov ax,[DeltaX]        ;Adjust X angles of rotation
+ add [XAngle],ax
+ mov ax,[DeltaY]        ;And Y
+ add [YAngle],ax
+ mov ax,[DeltaZ]        ;And Z
+ add [ZAngle],ax
+ ret
+
+;-------------------------------------------------------------------------
+;Get Sin and Cos of all 3 angles of rotation.
+
+GetSinCos:
+ mov ax,[XAngle]        ;Get angle
+ call SinCos            ;Get Sin and Cos
+ mov [XSin],ax          ;Save em!
+ mov [XCos],bx
+
+ mov ax,[YAngle]        ;Same but different :)
+ call SinCos
+ mov [YSin],ax
+ mov [YCos],bx
+
+ mov ax,[ZAngle]        ;Same but different :)
+ call SinCos
+ mov [ZSin],ax
+ mov [ZCos],bx
+ ret
+
+;-------------------------------------------------------------------------
+;This moves a value between two limits at a specific rate.
+
+;This code uses the structure defined at the top of the source file.
+
+;The structure is defined as...
+;
+; struc [bx]
+;
+;This makes the address in BX the base of the structure.  A86 now allows
+;us to just name the structure element without reference to BX,  This makes
+;the code easier to read if you understand the mechanism but impossible to
+;follow if you dont :)
+
+;Where you see a something like
+;
+; dec Counter
+;
+;read....
+;
+; dec Counter[bx]
+;
+
+DoDeltas:
+ mov bx,W1              ;Modify X rotation
+ call >L0
+ mov bx,W2              ;Modify Y rotation
+ call >L0
+ mov bx,W3              ;Modify Z rotation
+ call >L0
+ mov bx,W4              ;Zoom in and out
+
+L0:
+ dec Counter            ;Count down to next change
+ jne ret
+ mov ax,Reset           ;Counter hit ZERO.  Reset it
+ mov Counter,ax
+ mov ax,Delta           ;Get rate. of change (also direction)
+ mov si,Position        ;Get pointer to variable to modify
+ add ax,[si]            ;Add delta to variable
+ mov [si],ax            ;Store back
+ cmp ax,Upper           ;Did variable reach upper limit?
+ jl >L2
+L1:
+ neg Delta              ;Change direction!
+ ret
+L2:
+ cmp ax,Lower           ;Did variable reach lower limit?
+ jl L1
+ ret
+
+;-------------------------------------------------------------------------
+;MOA's bump mapping routine. (Yea im uzing this again hehe I like it :)
+;-------------------------------------------------------------------------
+
+DoBump:
+ mov ax,0a000           ;Point to video
+ mov es,ax
+
+ mov si,BumpMap+320*16  ;Point to end of last line of bumpmap
+
+ mov di,16              ;16 scan lines
+ mov ax,di
+ sub ax,SpotY
+ mov BumpY,ax
+
+;-------------------------------------------------------------------------
+
+L0:
+ mov ax,320-2           ;320 Pels per scan
+ mov cx,ax
+ sub ax,SpotX
+ mov BumpX,ax
+
+L1:
+ mov ax,-1[si]          ;Look... No spotlight :) (Addition by OnlyMe)
+ or al,1[si]
+ or ax,-321[si]
+ or al,321[si]
+ test ax
+ jz >L9
+
+ xor ah,ah              ;Clear scratch registers
+ xor bh,bh
+ mov al,[si+1]          ;Read bump heights to left and right of this bump
+ mov bl,[si-1]
+ sub ax,bx              ;Compute differenct
+ sub ax,BumpX           ;I think this gets a 2D normal (erm)
+ cwd
+ xor ax,dx
+ sub ax,dx              ;But Maff izznt my strong suit
+ mov bx,07f
+ sub bx,ax
+ mov ax,bx
+ cwd
+ not dx
+ and bx,dx
+ push bx
+
+ xor ah,ah              ;When i understand how this code actually
+ xor bh,bh              ; works ill add propper comments.  Maybe someone
+ mov al,[si+0141]       ; can fill me in eh
+ mov bl,[si-0140]
+ sub ax,bx
+ sub ax,BumpY
+ cwd
+ xor ax,dx
+ sub ax,dx
+ mov bx,07F
+ sub bx,ax
+ mov ax,bx
+ cwd
+ not dx
+ and bx,dx
+
+ pop ax
+ mul bl
+ shr ax,6+2
+
+L9:
+; shr ax,2
+; add ax,5
+ es mov 0e600-BumpMap[si],al
+
+ dec BumpX
+ dec si
+ loop L1
+
+ dec BumpY
+ sub si,2
+ dec di
+ jnz L0
+ ret
+
+;-------------------------------------------------------------------------
+
+DoScroll:
+ xor si,si              ;First pixle row in current column
+
+ mov bx,BumpMap         ;Erm... Actually.... This is wrong... hehehe
+ mov bp,[CharP]         ;Point to characters font data
+ mov dh,b[CharColumn]   ;Get column mask
+L0:
+ xor cx,cx              ;Assume no bumps (0 pixle)
+ mov al,[bp+si]         ;Get character row from font
+ and al,dh              ;Mask out all but current column
+ if nz mov cx,03030     ;Raise bumps
+ mov [bx],cx            ;Write double width pixle
+ mov 320[bx],cx         ;Double height too!
+ add bx,2*320
+ inc si                 ;Add 1 to row
+ cmp si,8               ;Font is 8 by 8
+ jne L0
+
+ mov ax,ds
+ mov es,ax
+
+ mov si,BumpMap         ;Scroll bumpmap 2 pixles left
+ mov di,si              ;pixles at far left move to far right hehehe
+ add si,2
+ mov cx,320*16/2
+ rep movsw
+
+ ror CharColumn,1       ;Shift row mask 1
+ jnc short ret          ;Wrap round and compute next char
+
+InitScroll:
+ mov si,[BannerP]       ;Get pointer to next char in banner
+ test b[si]             ;End of text?
+ jnz >L0
+
+ inc si
+ lodsw
+ mov [Shape],ax
+ lodsw
+ mov si,ax
+
+L0:
+ xor ah,ah
+ lodsb                  ;Get text character
+ mov [BannerP],si
+ shl ax,3               ;Compute chars ROM offset
+ add ax,Font
+ mov CharP,ax           ;Points to font data for character
+ ret
+
+;-------------------------------------------------------------------------
+;Get a copy of the font data out of ROM into default DS
+
+GetFont:
+ mov ax,0f000           ;Point to ROM
+ mov ds,ax
+ mov si,0fa6e           ;Offset to font data in ROM
+ mov di,Font
+ mov cx,256*2
+ rep movsw
+ mov ax,cs
+ mov ds,ax
+ ret
+
+;-------------------------------------------------------------------------
+;Write a KEWL purple palette (Shut Up! I like PuRplE :P)
+
+GetPalette:
+ mov dx,03C8            ;Write new palette
+ xor cx,cx
+ xor ax,ax
+ out dx,al
+ inc dx
+L0:
+ mov al,cl              ;Select colour number to updata
+ out dx,al              ;Write Red
+ xchg ah,al
+ out dx,al              ;Write Green (Zero)
+ xchg ah,al
+ out dx,al              ;Write Blue
+ inc cl
+ jnz L0
+ ret
+
+;-------------------------------------------------------------------------
+;Shape structure defined as....
+;
+; db number-of-points
+; db x,y,z      of first point
+; db x,y,z ...  of rest
+
+Cube:
+ db 125
+ db -35,-35,-35,-35,-35,-15,-35,-35, 05,-35,-35, 25,-35,-35, 45
+ db -35,-15,-35,-35,-15,-15,-35,-15, 05,-35,-15, 25,-35,-15, 45
+ db -35, 05,-35,-35, 05,-15,-35, 05, 05,-35, 05, 25,-35, 05, 45
+ db -35, 25,-35,-35, 25,-15,-35, 25, 05,-35, 25, 25,-35, 25, 45
+ db -35, 45,-35,-35, 45,-15,-35, 45, 05,-35, 45, 25,-35, 45, 45
+ db -15,-35,-35,-15,-35,-15,-15,-35, 05,-15,-35, 25,-15,-35, 45
+ db -15,-15,-35,-15,-15,-15,-15,-15, 05,-15,-15, 25,-15,-15, 45
+ db -15, 05,-35,-15, 05,-15,-15, 05, 05,-15, 05, 25,-15, 05, 45
+ db -15, 25,-35,-15, 25,-15,-15, 25, 05,-15, 25, 25,-15, 25, 45
+ db -15, 45,-35,-15, 45,-15,-15, 45, 05,-15, 45, 25,-15, 45, 45
+ db  05,-35,-35, 05,-35,-15, 05,-35, 05, 05,-35, 25, 05,-35, 45
+ db  05,-15,-35, 05,-15,-15, 05,-15, 05, 05,-15, 25, 05,-15, 45
+ db  05, 05,-35, 05, 05,-15, 05, 05, 05, 05, 05, 25, 05, 05, 45
+ db  05, 25,-35, 05, 25,-15, 05, 25, 05, 05, 25, 25, 05, 25, 45
+ db  05, 45,-35, 05, 45,-15, 05, 45, 05, 05, 45, 25, 05, 45, 45
+ db  25,-35,-35, 25,-35,-15, 25,-35, 05, 25,-35, 25, 25,-35, 45
+ db  25,-15,-35, 25,-15,-15, 25,-15, 05, 25,-15, 25, 25,-15, 45
+ db  25, 05,-35, 25, 05,-15, 25, 05, 05, 25, 05, 25, 25, 05, 45
+ db  25, 25,-35, 25, 25,-15, 25, 25, 05, 25, 25, 25, 25, 25, 45
+ db  25, 45,-35, 25, 45,-15, 25, 45, 05, 25, 45, 25, 25, 45, 45
+ db  45,-35,-35, 45,-35,-15, 45,-35, 05, 45,-35, 25, 45,-35, 45
+ db  45,-15,-35, 45,-15,-15, 45,-15, 05, 45,-15, 25, 45,-15, 45
+ db  45, 05,-35, 45, 05,-15, 45, 05, 05, 45, 05, 25, 45, 05, 45
+ db  45, 25,-35, 45, 25,-15, 45, 25, 05, 45, 25, 25, 45, 25, 45
+ db  45, 45,-35, 45, 45,-15, 45, 45, 05, 45, 45, 25, 45, 45, 45
+
+Star:
+ db 65
+ db -35,-35, 05,-35,-15, 05,-35, 05, 05,-35, 25, 05,-35, 45, 05
+ db -15,-35, 05,-15,-15, 05,-15, 05, 05,-15, 25, 05,-15, 45, 05
+ db  05,-35, 05, 05,-15, 05, 05, 05, 05, 05, 25, 05, 05, 45, 05
+ db  25,-35, 05, 25,-15, 05, 25, 05, 05, 25, 25, 05, 25, 45, 05
+ db  45,-35, 05, 45,-15, 05, 45, 05, 05, 45, 25, 05, 45, 45, 05
+ db  05,-35,-35, 05,-35,-15, 05,-35, 25, 05,-35, 45,-35, 05,-35
+ db  05,-15,-35, 05,-15,-15, 05,-15, 25, 05,-15, 45,-15, 05,-35
+ db  05, 05,-35, 05, 05,-15, 05, 05, 25, 05, 05, 45, 05, 05,-35
+ db  05, 25,-35, 05, 25,-15, 05, 25, 25, 05, 25, 45, 25, 05,-35
+ db  05, 45,-35, 05, 45,-15, 05, 45, 25, 05, 45, 45, 45, 05,-35
+ db -35, 05,-15,-35, 05, 25,-35, 05, 45,-15, 05,-15,-15, 05, 25
+ db -15, 05, 45, 05, 05,-15, 05, 05, 25, 05, 05, 45, 25, 05,-15
+ db  25, 05, 25, 25, 05, 45, 45, 05,-15, 45, 05, 25, 45, 05, 45
+
+Flies:
+ db 6
+ db -35,-35,-35,-35,-35, 45, 45, 45,-35, 45, 45, 45,  5,-35,  5
+ db   5, 45,  5
+
+Square:
+ db 25
+ db -35,-35,-35,-35,-15,-35,-35, 05,-35,-35, 25,-35,-35, 45,-35
+ db -15,-35,-35,-15,-15,-35,-15, 05,-35,-15, 25,-35,-15, 45,-35
+ db  05,-35,-35, 05,-15,-35, 05, 05,-35, 05, 25,-35, 05, 45,-35
+ db  25,-35,-35, 25,-15,-35, 25, 05,-35, 25, 25,-35, 25, 45,-35
+ db  45,-35,-35, 45,-15,-35, 45, 05,-35, 45, 25,-35, 45, 45,-35
+
+Heart:
+ db 32
+ db -35,-15,-35,-35, 25,-35,-15,-35,-35,-15,-15,-35,-15, 05,-35
+ db -15, 25,-35,-15, 45,-35, 05,-35,-35, 05,-15,-35, 05, 05,-35
+ db  05, 25,-35, 05, 45,-35, 25,-15,-35, 25, 05,-35, 25, 25,-35
+ db  45, 05,-35
+ db -30,-10,-30,-30, 20,-30,-10,-30,-30,-10,-10,-30,-10, 00,-30
+ db -10, 20,-30,-10, 40,-30, 00,-30,-30, 00,-10,-30, 00, 00,-30
+ db  00, 20,-30, 00, 40,-30, 20,-10,-30, 20, 00,-30, 20, 20,-30
+ db  40, 00,-30
+
+;-------------------------------------------------------------------------
+;I discovered this one completely by accident.  I moved a table from the
+;end of this file to somewhere up there... but forgot to move the label
+;(hehehe).  I was therfor referencing a table that is INCLUDED here by my
+;assembler.  It had lotsa junk in with it at first but i cleaned that out
+;and this was the result.  I love this object :) its KEWKL hehehe!
+
+Cross:
+ db 75
+ db 000,000,019,000,005,019,000,014,001,000,032,000,000,07D,000
+ db 000,0C9,000,001,05F,001,001,0AB,001,001,0F6,001,002,041,002
+ db 002,08D,002,002,0D8,002,003,023,003,003,005,004,003,06F,003
+ db 003,0BA,003,004,051,004,004,09C,004,004,0E7,004,005,013,006
+ db 005,032,005,005,07D,005,005,0C8,005,006,05E,006,006,0A9,006
+ db 006,0F4,006,007,03F,007,007,08A,007,007,0D5,007,008,000,009
+ db 008,020,008,008,06B,008,008,0B5,008,009,04B,009,009,095,009
+ db 009,0E0,009,00A,009,00B,00A,02A,00A,00A,075,00A,00A,0BF,00A
+ db 00B,054,00B,00D,007,026,00F,002,028,019,009,032,01E,004,037
+ db 022,00B,03B,02C,006,045,02D,001,046,039,008,052,03D,003,056
+ db 043,00A,05C,04B,000,064,04B,005,064,058,007,071,05B,002,074
+ db 064,009,07C,084,008,09C,088,003,0A1,08D,00A,0A6,096,000,0AF
+ db 096,005,0AF,0A3,007,0BC,0A6,002,0BF,0AE,009,0C7,0B5,004,0CE
+ db 0C2,006,0DB,0C4,001,0DD,0CE,008,0E7,0D3,003,0EC,0D8,00A,0F1
+ db 0E1,005,0FA,0E2,000,0FB,0EE,007,007,0F1,002,00A,0F9,009,011
+
+;=========================================================================
+
diff --git a/wmdots/wmdots/old_dos_demo/dow.com b/wmdots/wmdots/old_dos_demo/dow.com
new file mode 100644
index 0000000000000000000000000000000000000000..056de4cd198af25a1dbdb2405351bff413f68aa3
GIT binary patch
literal 12874
zcmb_=30M>7+IB(+`wj|mfk6=v2wT`gGDSf}R1mR>YXb=o*))Jii`}5d1(%*`ZEdlq
z)T*bgwY9C)s?`Z$-**u~0T)1I2_PT{{P%>~)AOJIJJ<DJ*Eds{H#6`0EcbKY?TOHt
zXZR&U%s7RcV6hqM3{8e5ZbPOT!;qoIFvD%koSxCc7kk{Mc&~##YPj{8Q!@nX7se{)
zyM%*-0}&A?Ap(<QQ;5(QVpBjkA(kX26HysNXi`GPT8Xu)5Ao_+CW)0MS-<-A=QA{p
zNX0Z_dKxq`h&Yj$5D|$INvbp{R@Dv5WDwD!L<tciOHL$`BqA9hN)i(>c+yt@+9}ES
zteQmC5t~R%PED2(QE4gv-sjIR(SM9qeP+CFyg)59iI60vN@Vo9^qyYrAx@N#pz0MQ
zijJcfA)=Gh62wHRC|-iCCL|}vt3GdvlgK0l2GU1JO~wNg#Ys~LQA$c&a)LzFY2$9Z
zij5=Eb|)ucaNMiGv)h<!a#oE#PI{aqY1SO+^qiPLk{FdB5&vr&(V`@2k_6|*EcE%M
z=tf@~REChsQZsP&gamrGbf4rHEEXkA#R2GRbz0(X%$BxWH5i*q5Xta+MR0hK>bvR>
zLu%~C3c%UZMJa@o-tBHI8m;;kLBETW;G^mwIPITicx9znsf37?iK3z~u_%?0VVm$C
zeFb2yKTM+X=zo}Dp5eEwb;;=}FZ|Ing_yMjR!o%co83D-*QPir&Xgz;O9;sy?x7b>
zN&dqg5wsunN@#zi&jwC1d@Gxc70gY~L9CM4i4j+O@jg9SmPABJVqT3`eP?`R#8;>N
zk{XATz@zDL8AMuAsx$#_@KY?xQ1uH?MMt_6n-t5EVO%0A8BU@v>?1aL)>VnL*+fbI
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

literal 0
HcmV?d00001

diff --git a/wmdots/wmdots/old_dos_demo/sintab.s b/wmdots/wmdots/old_dos_demo/sintab.s
new file mode 100644
index 0000000..35a0519
--- /dev/null
+++ b/wmdots/wmdots/old_dos_demo/sintab.s
@@ -0,0 +1,528 @@
+;Sin and Cos tables based on 4096 degree circle.
+;-------------------------------------------------------------------------
+
+;Does not extend table by a right angle to account for COS...
+; Code takes care of this!
+
+;-------------------------------------------------------------------------
+
+ even 2
+
+SinTab:
+ dw 00000,00019,00032,0004b,00064,0007d,00096,000af     ;000
+ dw 000c9,000e2,000fb,00114,0012d,00146,0015f,00178     ;008
+ dw 00192,001ab,001c4,001dd,001f6,0020f,00228,00241     ;010
+ dw 0025b,00274,0028d,002a6,002bf,002d8,002f1,0030a     ;018
+ dw 00323,0033d,00356,0036f,00388,003a1,003ba,003d3     ;020
+ dw 003ec,00405,0041e,00437,00451,0046a,00483,0049c     ;028
+ dw 004b5,004ce,004e7,00500,00519,00532,0054b,00564     ;030
+ dw 0057d,00596,005af,005c8,005e1,005fa,00613,0062c     ;038
+ dw 00645,0065e,00677,00690,006a9,006c2,006db,006f4     ;040
+ dw 0070d,00726,0073f,00758,00771,0078a,007a3,007bc     ;048
+ dw 007d5,007ee,00807,00820,00839,00852,0086b,00884     ;050
+ dw 0089c,008b5,008ce,008e7,00900,00919,00932,0094b     ;058
+ dw 00964,0097c,00995,009ae,009c7,009e0,009f9,00a11     ;060
+ dw 00a2a,00a43,00a5c,00a75,00a8d,00aa6,00abf,00ad8     ;068
+ dw 00af1,00b09,00b22,00b3b,00b54,00b6c,00b85,00b9e     ;070
+ dw 00bb6,00bcf,00be8,00c01,00c19,00c32,00c4b,00c63     ;078
+ dw 00c7c,00c95,00cad,00cc6,00cde,00cf7,00d10,00d08     ;080
+ dw 00d41,00d59,00d72,00d8b,00da3,00dbc,00dd4,00ded     ;088
+ dw 00e05,00e1e,00e36,00e4f,00e67,00e80,00e98,00eb1     ;090
+ dw 00ec9,00ee2,00efa,00f12,00f2b,00f43,00f5c,00f74     ;098
+ dw 00f8c,00fa5,00fbd,00fd6,00fee,01006,0101f,01037     ;0a0
+ dw 0104f,01068,01080,01098,010b0,010c9,010e1,010f9     ;0a8
+ dw 01111,0112a,01142,0115a,01172,0118a,011a2,011bb     ;0b0
+ dw 011d3,011eb,01203,0121b,01233,0124b,01263,0127b     ;0b8
+ dw 01294,012ac,012c4,012dc,012f4,0130c,01324,0133c     ;0c0
+ dw 01354,0136c,01383,0139b,013b3,013cb,013e3,013fb     ;0c8
+ dw 01413,0142b,01443,0145a,01472,0148a,014a2,014ba     ;0d0
+ dw 014d1,014e9,01501,01519,01530,01548,01560,01577     ;0d8
+ dw 0158f,015a7,015be,015d6,015ee,01605,0161d,01634     ;0e0
+ dw 0164c,01664,0167b,01693,016aa,016c2,016d9,016f1     ;0e8
+ dw 01708,0171f,01737,0174e,01766,0177d,01794,017ac     ;0f0
+ dw 017c3,017da,017f2,01809,01820,01838,0184f,01866     ;0f8
+ dw 0187d,01895,018ac,018c3,018da,018f1,01908,01920     ;100
+ dw 01937,0194e,01965,0197c,01993,019aa,019c1,019d8     ;108
+ dw 019ef,01a06,01a1d,01a34,01a4b,01a62,01a79,01a8f     ;110
+ dw 01aa6,01abd,01ad4,01aeb,01b02,01b18,01b2f,01b46     ;118
+ dw 01b5d,01b73,01b8a,01ba1,01bb7,01bce,01be5,01bfb     ;120
+ dw 01c12,01c28,01c3f,01c55,01c6c,01c83,01c99,01caf     ;128
+ dw 01cc6,01cdc,01cf3,01d09,01d20,01d36,01d4c,01d63     ;130
+ dw 01d79,01d8f,01da6,01dbc,01dd2,01de8,01dfe,01e15     ;138
+ dw 01e2b,01e41,01e57,01e6d,01e83,01e99,01eb0,01ec6     ;140
+ dw 01edc,01ef2,01f08,01f1e,01f34,01f49,01f5f,01f75     ;148
+ dw 01f8b,01fa1,01fb7,01fcd,01fe2,01ff8,0200e,02024     ;150
+ dw 02039,0204f,02065,0207b,02090,020a6,020bb,020d1     ;158
+ dw 020e7,020fc,02112,02127,0213d,02152,02168,0217d     ;160
+ dw 02192,021a8,021bd,021d2,021e8,021fd,02212,02228     ;168
+ dw 0223d,02252,02267,0227d,02292,022a7,022bc,022d1     ;170
+ dw 022e6,022fb,02310,02325,0233a,0234f,02364,02379     ;178
+ dw 0238e,023a3,023b8,023cd,023e1,023f6,0240b,02420     ;180
+ dw 02434,02449,0245e,02473,02487,0249c,024b0,024c5     ;188
+ dw 024da,024ee,02503,02517,0252c,02540,02554,02569     ;190
+ dw 0257d,02592,025a6,025ba,025cf,025e3,025f7,0260b     ;198
+ dw 0261f,02634,02648,0265c,02670,02684,02698,026ac     ;1a0
+ dw 026c0,026d4,026e8,026fc,02710,02724,02738,0274c     ;1a8
+ dw 0275f,02773,02787,0279b,027af,027c2,027d6,027ea     ;1b0
+ dw 027fd,02811,02824,02838,0284b,0285f,02872,02886     ;1b8
+ dw 02899,028ad,028c0,028d4,028e7,028fa,0290e,02921     ;1c0
+ dw 02934,02947,0295a,0296e,02981,02994,029a7,029ba     ;1c8
+ dw 029cd,029e0,029f3,02a06,02a19,02a2c,02a3f,02a52     ;1d0
+ dw 02a65,02a77,02a8a,02a9d,02ab0,02ac2,02ad5,02ae8     ;1d8
+ dw 02afa,02b0d,02b20,02b32,02b45,02b57,02b6a,02b7c     ;1e0
+ dw 02b8e,02ba1,02bb3,02bc6,02bd8,02bea,02bfc,02c0f     ;1e8
+ dw 02c21,02c33,02c45,02c57,02c6a,02c7c,02c8e,02ca0     ;1f0
+ dw 02cb2,02cc4,02cd6,02ce8,02cf9,02d0b,02d1d,02d2f     ;1f8
+ dw 02d41,02d52,02d64,02d76,02d88,02d99,02dab,02dbc     ;200
+ dw 02dce,02de0,02df1,02e03,02e14,02e25,02e37,02e48     ;208
+ dw 02e5a,02e6b,02e7c,02e8d,02e9f,02eb0,02ec1,02ed2     ;210
+ dw 02ee3,02ef4,02f05,02f16,02f28,02f38,02f49,02f5a     ;218
+ dw 02f6b,02f7c,02f8d,02f9e,02faf,02fbf,02fd0,02fe1     ;220
+ dw 02ff1,03002,03013,03023,03034,03044,03055,03065     ;228
+ dw 03076,03086,03096,030a7,030b7,030c7,030d8,030e8     ;230
+ dw 030f8,03108,03118,03128,03138,03149,03159,03169     ;238
+ dw 03179,03188,03198,031a8,031b8,031c8,031d8,031e7     ;240
+ dw 031f7,03207,03216,03226,03236,03245,03255,03264     ;248
+ dw 03274,03283,03293,032a2,032b1,032c1,032d0,032df     ;250
+ dw 032ee,032fe,0330d,0331c,0332b,0333a,03349,03358     ;258
+ dw 03367,03376,03385,03394,033a3,033b2,033c1,033cf     ;260
+ dw 033de,033ed,033fb,0340a,03419,03427,03436,03444     ;268
+ dw 03453,03461,03470,0347e,0348c,0349b,034a9,034b7     ;270
+ dw 034c6,034d4,034e2,034f0,034fe,0350c,0351a,03528     ;278
+ dw 03536,03544,03552,03560,0356e,0357c,03589,03597     ;280
+ dw 035a5,035b3,035c0,035ce,035dc,035e9,035f7,03604     ;288
+ dw 03612,0361f,0362c,0363a,03647,03654,03662,0366f     ;290
+ dw 0367c,03689,03696,036a4,036b1,036be,036cb,036d8     ;298
+ dw 036e5,036f1,036fe,0370b,03718,03725,03731,0373e     ;2a0
+ dw 0374b,03757,03764,03771,0377d,0378a,03796,037a3     ;2a8
+ dw 037af,037bb,037c8,037d4,037e0,037ed,037f9,03805     ;2b0
+ dw 03811,0381d,03829,03835,03841,0384d,03859,03865     ;2b8
+ dw 03871,0387d,03889,03894,038a0,038ac,038b7,038c3     ;2c0
+ dw 038cf,038da,038e6,038f1,038fd,03908,03913,0391f     ;2c8
+ dw 0392a,03935,03941,0394c,03957,03962,0396d,03978     ;2d0
+ dw 03983,0398e,03999,039a4,039af,039ba,039c5,039d0     ;2d8
+ dw 039da,039e5,039f0,039fb,03a05,03a10,03a1a,03a25     ;2e0
+ dw 03a2f,03a3a,03a44,03a4f,03a59,03a63,03a6d,03a78     ;2e0
+ dw 03a82,03a8c,03a96,03aa0,03aaa,03ab4,03abe,03ac8     ;2f0
+ dw 03ad2,03adc,03ae6,03af0,03afa,03b03,03b0d,03b17     ;2f8
+ dw 03b20,03b2a,03b34,03b3d,03b47,03b50,03b59,03b63     ;300
+ dw 03b6c,03b75,03b7f,03b88,03b91,03b9a,03ba3,03bad     ;308
+ dw 03bb6,03bbf,03bc8,03bd1,03bda,03be2,03beb,03bf4     ;310
+ dw 03bfd,03c06,03c0e,03c17,03c20,03c28,03c31,03c39     ;318
+ dw 03c42,03c4a,03c53,03c5b,03c63,03c6c,03c74,03c7c     ;320
+ dw 03c84,03c8c,03c95,03c9d,03ca5,03cad,03cb5,03cbd     ;328
+ dw 03cc5,03ccc,03cd4,03cdc,03ce4,03cec,03cf3,03cfb     ;320
+ dw 03d02,03d0a,03d12,03d19,03d21,03d28,03d2f,03d37     ;338
+ dw 03d3e,03d45,03d4d,03d54,03d5b,03d62,03d69,03d70     ;340
+ dw 03d77,03d7e,03d85,03d8c,03d93,03d9a,03da1,03da7     ;348
+ dw 03dae,03db5,03dbb,03dc2,03dc9,03dcf,03dd6,03ddc     ;350
+ dw 03de2,03de9,03def,03df5,03dfc,03e02,03e08,03e0e     ;358
+ dw 03e14,03e1b,03e21,03e27,03e2d,03e33,03e38,03e3e     ;360
+ dw 03e44,03e4a,03e50,03e55,03e5b,03e61,03e66,03e6c     ;368
+ dw 03e71,03e77,03e7c,03e82,03e87,03e8c,03e92,03e97     ;370
+ dw 03e9c,03ea1,03ea7,03eac,03eb1,03eb6,03ebb,03ec0     ;378
+ dw 03ec5,03eca,03ece,03ed3,03ed8,03edd,03ee1,03ee6     ;380
+ dw 03eeb,03eef,03ef4,03ef8,03efd,03f01,03f06,03f0a     ;388
+ dw 03f0e,03f13,03f17,03f1b,03f1f,03f23,03f27,03f2b     ;390
+ dw 03f2f,03f33,03f37,03f3b,03f3f,03f43,03f47,03f4a     ;398
+ dw 03f4e,03f52,03f55,03f59,03f5d,03f60,03f64,03f67     ;3a0
+ dw 03f6a,03f6e,03f71,03f74,03f78,03f7b,03f7e,03f81     ;3a8
+ dw 03f84,03f87,03f8a,03f8d,03f90,03f93,03f96,03f99     ;3b0
+ dw 03f9c,03f9e,03fa1,03fa4,03fa6,03fa9,03fac,03fae     ;3b8
+ dw 03fb1,03fb3,03fb5,03fb8,03fba,03fbc,03fbf,03fc1     ;3c0
+ dw 03fc3,03fc5,03fc7,03fc9,03fcb,03fcd,03fcf,03fd1     ;3c8
+ dw 03fd3,03fd5,03fd7,03fd8,03fda,03fdc,03fde,03fdf     ;3d0
+ dw 03fe1,03fe2,03fe4,03fe5,03fe7,03fe8,03fe9,03feb     ;3d8
+ dw 03fec,03fed,03fee,03fef,03ff0,03ff1,03ff2,03ff3     ;3e0
+ dw 03ff4,03ff5,03ff6,03ff7,03ff8,03ff9,03ff9,03ffa     ;3e8
+ dw 03ffb,03ffb,03ffc,03ffc,03ffd,03ffd,03ffe,03ffe     ;3f0
+ dw 03ffe,03fff,03fff,03fff,03fff,03fff,03fff,03fff     ;3f8
+
+ dw 03fff,03fff,03fff,03fff,03fff,03fff,03fff,03fff     ;400
+ dw 03ffe,03ffe,03ffe,03ffd,03ffd,03ffc,03ffc,03ffb     ;408
+ dw 03ffb,03ffa,03ff9,03ff9,03ff8,03ff7,03ff6,03ff5     ;410
+ dw 03ff4,03ff3,03ff2,03ff1,03ff0,03fef,03fee,03fed     ;418
+ dw 03fec,03feb,03fe9,03fe8,03fe7,03fe5,03fe4,03fe2     ;420
+ dw 03fe1,03fdf,03fde,03fdc,03fda,03fd8,03fd7,03fd5     ;428
+ dw 03fd3,03fd1,03fcf,03fcd,03fcb,03fc9,03fc7,03fc5     ;430
+ dw 03fc3,03fc1,03fbf,03fbc,03fba,03fb8,03fb5,03fb3     ;438
+ dw 03fb1,03fae,03fac,03fa9,03fa6,03fa4,03fa1,03f9e     ;440
+ dw 03f9c,03f99,03f96,03f93,03f90,03f8d,03f8a,03f87     ;448
+ dw 03f84,03f81,03f7e,03f7b,03f78,03f74,03f71,03f6e     ;450
+ dw 03f6a,03f67,03f64,03f60,03f5d,03f59,03f55,03f52     ;458
+ dw 03f4e,03f4a,03f47,03f43,03f3f,03f3b,03f37,03f33     ;460
+ dw 03f2f,03f2b,03f27,03f23,03f1f,03f1b,03f17,03f13     ;468
+ dw 03f0e,03f0a,03f06,03f01,03efd,03ef8,03ef4,03eef     ;470
+ dw 03eeb,03ee6,03ee1,03edd,03ed8,03ed3,03ece,03eca     ;478
+ dw 03ec5,03ec0,03ebb,03eb6,03eb1,03eac,03ea7,03ea1     ;480
+ dw 03e9c,03e97,03e92,03e8c,03e87,03e82,03e7c,03e77     ;488
+ dw 03e71,03e6c,03e66,03e61,03e5b,03e55,03e50,03e4a     ;490
+ dw 03e44,03e3e,03e38,03e33,03e2d,03e27,03e21,03e1b     ;498
+ dw 03e14,03e0e,03e08,03e02,03dfc,03df5,03def,03de9     ;4a0
+ dw 03de2,03ddc,03dd6,03dcf,03dc9,03dc2,03dbb,03db5     ;4a8
+ dw 03dae,03da7,03da1,03d9a,03d93,03d8c,03d85,03d7e     ;4b0
+ dw 03d77,03d70,03d69,03d62,03d5b,03d54,03d4d,03d45     ;4b8
+ dw 03d3e,03d37,03d2f,03d28,03d21,03d19,03d12,03d0a     ;4c0
+ dw 03d02,03cfb,03cf3,03cec,03ce4,03cdc,03cd4,03ccc     ;4c8
+ dw 03cc5,03cbd,03cb5,03cad,03ca5,03c9d,03c95,03c8c     ;4d0
+ dw 03c84,03c7c,03c74,03c6c,03c63,03c5b,03c53,03c4a     ;4d8
+ dw 03c42,03c39,03c31,03c28,03c20,03c17,03c0e,03c06     ;4e0
+ dw 03bfd,03bf4,03beb,03be2,03bda,03bd1,03bc8,03bbf     ;4e8
+ dw 03bb6,03bad,03ba3,03b9a,03b91,03b88,03b7f,03b75     ;4f0
+ dw 03b6c,03b63,03b59,03b50,03b47,03b3d,03b34,03b2a     ;4f8
+ dw 03b20,03b17,03b0d,03b03,03afa,03af0,03ae6,03adc     ;500
+ dw 03ad2,03ac8,03abe,03ab4,03aaa,03aa0,03a96,03a8c     ;508
+ dw 03a82,03a78,03a6d,03a63,03a59,03a4f,03a44,03a3a     ;510
+ dw 03a2f,03a25,03a1a,03a10,03a05,039fb,039f0,039e5     ;518
+ dw 039da,039d0,039c5,039ba,039af,039a4,03999,0398e     ;520
+ dw 03983,03978,0396d,03962,03957,0394c,03941,03935     ;528
+ dw 0392a,0391f,03913,03908,038fd,038f1,038e6,038da     ;530
+ dw 038cf,038c3,038b7,038ac,038a0,03894,03889,0387d     ;538
+ dw 03871,03865,03859,0384d,03841,03835,03829,0381d     ;540
+ dw 03811,03805,037f9,037ed,037e0,037d4,037c8,037bb     ;548
+ dw 037af,037a3,03796,0378a,0377d,03771,03764,03757     ;550
+ dw 0374b,0373e,03731,03725,03718,0370b,036fe,036f1     ;558
+ dw 036e5,036d8,036cb,036be,036b1,036a4,03696,03689     ;560
+ dw 0367c,0366f,03662,03654,03647,0363a,0362c,0361f     ;568
+ dw 03612,03604,035f7,035e9,035dc,035ce,035c0,035b3     ;570
+ dw 035a5,03597,03589,0357c,0356e,03560,03552,03544     ;578
+ dw 03536,03528,0351a,0350c,034fe,034f0,034e2,034d4     ;580
+ dw 034c6,034b7,034a9,0349b,0348c,0347e,03470,03461     ;588
+ dw 03453,03444,03436,03427,03419,0340a,033fb,033ed     ;590
+ dw 033de,033cf,033c1,033b2,033a3,03394,03385,03376     ;598
+ dw 03367,03358,03349,0333a,0332b,0331c,0330d,032fe     ;5a0
+ dw 032ee,032df,032d0,032c1,032b1,032a2,03293,03283     ;5a8
+ dw 03274,03264,03255,03245,03236,03226,03216,03207     ;5b0
+ dw 031f7,031e7,031d8,031c8,031b8,031a8,03198,03188     ;5b8
+ dw 03179,03169,03159,03149,03138,03128,03118,03108     ;5c0
+ dw 030f8,030e8,030d8,030c7,030b7,030a7,03096,03086     ;5c8
+ dw 03076,03065,03055,03044,03034,03023,03013,03002     ;5d0
+ dw 02ff1,02fe1,02fd0,02fbf,02faf,02f9e,02f8d,02f7c     ;5d8
+ dw 02f6b,02f5a,02f49,02f38,02f27,02f16,02f05,02ef4     ;5e0
+ dw 02ee3,02ed2,02ec1,02eb0,02e9f,02e8d,02e7c,02e6b     ;5e8
+ dw 02e5a,02e48,02e37,02e25,02e14,02e03,02df1,02de0     ;5f0
+ dw 02dce,02dbc,02dab,02d99,02d88,02d76,02d64,02d52     ;5f8
+ dw 02d41,02d2f,02d1d,02d0b,02cf9,02ce8,02cd6,02cc4     ;600
+ dw 02cb2,02ca0,02c8e,02c7c,02c6a,02c57,02c45,02c33     ;608
+ dw 02c21,02c0f,02bfc,02bea,02bd8,02bc6,02bb3,02ba1     ;610
+ dw 02b8e,02b7c,02b6a,02b57,02b45,02b32,02b20,02b0d     ;618
+ dw 02afa,02ae8,02ad5,02ac2,02ab0,02a9d,02a8a,02a77     ;620
+ dw 02a65,02a52,02a3f,02a2c,02a19,02a06,029f3,029e0     ;628
+ dw 029cd,029ba,029a7,02994,02981,0296e,0295a,02947     ;630
+ dw 02934,02921,0290e,028fa,028e7,028d4,028c0,028ad     ;638
+ dw 02899,02886,02872,0285f,0284b,02838,02824,02811     ;640
+ dw 027fd,027ea,027d6,027c2,027af,0279b,02787,02773     ;648
+ dw 0275f,0274c,02738,02724,02710,026fc,026e8,026d4     ;650
+ dw 026c0,026ac,02698,02684,02670,0265c,02648,02634     ;658
+ dw 0261f,0260b,025f7,025e3,025cf,025ba,025a6,02592     ;660
+ dw 0257d,02569,02554,02540,0252c,02517,02503,024ee     ;668
+ dw 024da,024c5,024b0,0249c,02487,02473,0245e,02449     ;670
+ dw 02434,02420,0240b,023f6,023e1,023cd,023b8,023a3     ;678
+ dw 0238e,02379,02364,0234f,0233a,02325,02310,022fb     ;680
+ dw 022e6,022d1,022bc,022a7,02292,0227d,02267,02252     ;688
+ dw 0223d,02228,02212,021fd,021e8,021d2,021bd,021a8     ;690
+ dw 02192,0217d,02168,02152,0213d,02127,02112,020fc     ;698
+ dw 020e7,020d1,020bb,020a6,02090,0207b,02065,0204f     ;6a0
+ dw 02039,02024,0200e,01ff8,01fe2,01fcd,01fb7,01fa1     ;6a8
+ dw 01f8b,01f75,01f5f,01f49,01f34,01f1e,01f08,01ef2     ;6b0
+ dw 01edc,01ec6,01eb0,01e99,01e83,01e6d,01e57,01e41     ;6b8
+ dw 01e2b,01e15,01dfe,01de8,01dd2,01dbc,01da6,01d8f     ;6c0
+ dw 01d79,01d63,01d4c,01d36,01d20,01d09,01cf3,01cdc     ;6c8
+ dw 01cc6,01caf,01c99,01c83,01c6c,01c55,01c3f,01c28     ;6d0
+ dw 01c12,01bfb,01be5,01bce,01bb7,01ba1,01b8a,01b73     ;6d8
+ dw 01b5d,01b46,01b2f,01b18,01b02,01aeb,01ad4,01abd     ;6e0
+ dw 01aa6,01a8f,01a79,01a62,01a4b,01a34,01a1d,01a06     ;6e8
+ dw 019ef,019d8,019c1,019aa,01993,0197c,01965,0194e     ;6f0
+ dw 01937,01920,01908,018f1,018da,018c3,018ac,01895     ;6f8
+ dw 0187d,01866,0184f,01838,01820,01809,017f2,017da     ;700
+ dw 017c3,017ac,01794,0177d,01766,0174e,01737,0171f     ;708
+ dw 01708,016f1,016d9,016c2,016aa,01693,0167b,01664     ;710
+ dw 0164c,01634,0161d,01605,015ee,015d6,015be,015a7     ;718
+ dw 0158f,01577,01560,01548,01530,01519,01501,014e9     ;720
+ dw 014d1,014ba,014a2,0148a,01472,0145a,01443,0142b     ;728
+ dw 01413,013fb,013e3,013cb,013b3,0139b,01383,0136c     ;730
+ dw 01354,0133c,01324,0130c,012f4,012dc,012c4,012ac     ;738
+ dw 01294,0127b,01263,0124b,01233,0121b,01203,011eb     ;740
+ dw 011d3,011bb,011a2,0118a,01172,0115a,01142,0112a     ;748
+ dw 01111,010f9,010e1,010c9,010b0,01098,01080,01068     ;750
+ dw 0104f,01037,0101f,01006,00fee,00fd6,00fbd,00fa5     ;758
+ dw 00f8c,00f74,00f5c,00f43,00f2b,00f12,00efa,00ee2     ;760
+ dw 00ec9,00eb1,00e98,00e80,00e67,00e4f,00e36,00e1e     ;768
+ dw 00e05,00ded,00dd4,00dbc,00da3,00d8b,00d72,00d59     ;770
+ dw 00d41,00d28,00d10,00cf7,00cde,00cc6,00cad,00c94     ;778
+ dw 00c7c,00c63,00c4b,00c32,00c19,00c01,00be8,00bcf     ;780
+ dw 00bb6,00b9e,00b85,00b6c,00b54,00b3b,00b22,00b09     ;788
+ dw 00af1,00ad8,00abf,00aa6,00a8d,00a75,00a5c,00a43     ;790
+ dw 00a2a,00a11,009f9,009e0,009c7,009ae,00995,0097c     ;798
+ dw 00964,0094b,00932,00919,00900,008e7,008ce,008b5     ;7a0
+ dw 0089c,00884,0086b,00852,00839,00820,00807,007ee     ;7a8
+ dw 007d5,007bc,007a3,0078a,00771,00758,0073f,00726     ;7b0
+ dw 0070d,006f4,006db,006c2,006a9,00690,00677,0065e     ;7b8
+ dw 00645,0062c,00613,005fa,005e1,005c8,005af,00596     ;7c0
+ dw 0057d,00564,0054b,00532,00519,00500,004e7,004ce     ;7c8
+ dw 004b5,0049c,00483,0046a,00450,00437,0041e,00405     ;7d0
+ dw 003ec,003d3,003ba,003a1,00388,0036f,00356,0033d     ;7d8
+ dw 00323,0030a,002f1,002d8,002bf,002a6,0028d,00274     ;7e0
+ dw 0025b,00241,00228,0020f,001f6,001dd,001c4,001ab     ;7e8
+ dw 00192,00178,0015f,00146,0012d,00114,000fb,000e2     ;7f0
+ dw 000c9,000af,00096,0007d,00064,0004b,00032,00019     ;7f8
+
+ dw 00000,0ffe7,0ffce,0ffb5,0ff9c,0ff83,0ff6a,0ff51     ;800
+ dw 0ff37,0ff1e,0ff05,0feec,0fed3,0feba,0fea1,0fe88     ;808
+ dw 0fe6e,0fe55,0fe3c,0fe23,0fe0a,0fdf1,0fdd8,0fdbf     ;810
+ dw 0fda5,0fd8c,0fd73,0fd5a,0fd41,0fd28,0fd0f,0fcf6     ;818
+ dw 0fcdd,0fcc3,0fcaa,0fc91,0fc78,0fc5f,0fc46,0fc2d     ;820
+ dw 0fc14,0fbfb,0fbe2,0fbc9,0fbaf,0fb96,0fb7d,0fb64     ;828
+ dw 0fb4b,0fb32,0fb19,0fb00,0fae7,0face,0fab5,0fa9c     ;830
+ dw 0fa83,0fa6a,0fa51,0fa38,0fa1f,0fa06,0f9ed,0f9d4     ;838
+ dw 0f9bb,0f9a2,0f989,0f970,0f957,0f93e,0f925,0f90c     ;840
+ dw 0f8f3,0f8da,0f8c1,0f8a8,0f88f,0f876,0f85d,0f844     ;848
+ dw 0f82b,0f812,0f7f9,0f7e0,0f7c7,0f7ae,0f795,0f77c     ;850
+ dw 0f764,0f74b,0f732,0f719,0f700,0f6e7,0f6ce,0f6b5     ;858
+ dw 0f69c,0f684,0f66b,0f652,0f639,0f620,0f607,0f5ef     ;860
+ dw 0f5d6,0f5bd,0f5a4,0f58b,0f573,0f55a,0f541,0f528     ;868
+ dw 0f50f,0f4f7,0f4de,0f4c5,0f4ac,0f494,0f47b,0f462     ;870
+ dw 0f44a,0f431,0f418,0f3ff,0f3e7,0f3ce,0f3b5,0f39d     ;878
+ dw 0f384,0f36b,0f353,0f33a,0f322,0f309,0f2f0,0f2d8     ;880
+ dw 0f2bf,0f2a7,0f28e,0f275,0f25d,0f244,0f22c,0f213     ;888
+ dw 0f1fb,0f1e2,0f1ca,0f1b1,0f199,0f180,0f168,0f14f     ;890
+ dw 0f137,0f11e,0f106,0f0ee,0f0d5,0f0bd,0f0a4,0f08c     ;898
+ dw 0f074,0f05b,0f043,0f02a,0f012,0effa,0efe1,0efc9     ;8a0
+ dw 0efb1,0ef98,0ef80,0ef68,0ef50,0ef37,0ef1f,0ef07     ;8a8
+ dw 0eeef,0eed6,0eebe,0eea6,0ee8e,0ee76,0ee5e,0ee45     ;8b0
+ dw 0ee2d,0ee15,0edfd,0ede5,0edcd,0edb5,0ed9d,0ed85     ;8b8
+ dw 0ed6c,0ed54,0ed3c,0ed24,0ed0c,0ecf4,0ecdc,0ecc4     ;8c0
+ dw 0ecac,0ec94,0ec7d,0ec65,0ec4d,0ec35,0ec1d,0ec05     ;8c8
+ dw 0ebed,0ebd5,0ebbd,0eba6,0eb8e,0eb76,0eb5e,0eb46     ;8d0
+ dw 0eb2f,0eb17,0eaff,0eae7,0ead0,0eab8,0eaa0,0ea89     ;8d8
+ dw 0ea71,0ea59,0ea42,0ea2a,0ea12,0e9fb,0e9e3,0e9cc     ;8e0
+ dw 0e9b4,0e99c,0e985,0e96d,0e956,0e93e,0e927,0e90f     ;8e8
+ dw 0e8f8,0e8e1,0e8c9,0e8b2,0e89a,0e883,0e86c,0e854     ;8f0
+ dw 0e83d,0e826,0e80e,0e7f7,0e7e0,0e7c8,0e7b1,0e79a     ;8f8
+ dw 0e783,0e76b,0e754,0e73d,0e726,0e70f,0e6f8,0e6e0     ;900
+ dw 0e6c9,0e6b2,0e69b,0e684,0e66d,0e656,0e63f,0e628     ;908
+ dw 0e611,0e5fa,0e5e3,0e5cc,0e5b5,0e59e,0e587,0e571     ;910
+ dw 0e55a,0e543,0e52c,0e515,0e4fe,0e4e8,0e4d1,0e4ba     ;918
+ dw 0e4a3,0e48d,0e476,0e45f,0e449,0e432,0e41b,0e405     ;920
+ dw 0e3ee,0e3d8,0e3c1,0e3ab,0e394,0e37d,0e367,0e351     ;928
+ dw 0e33a,0e324,0e30d,0e2f7,0e2e0,0e2ca,0e2b4,0e29d     ;930
+ dw 0e287,0e271,0e25a,0e244,0e22e,0e218,0e201,0e1eb     ;938
+ dw 0e1d5,0e1bf,0e1a9,0e193,0e17d,0e167,0e150,0e13a     ;940
+ dw 0e124,0e10e,0e0f8,0e0e2,0e0cc,0e0b7,0e0a1,0e08b     ;948
+ dw 0e075,0e05f,0e049,0e033,0e01e,0e008,0dff2,0dfdc     ;950
+ dw 0dfc7,0dfb1,0df9b,0df85,0df70,0df5a,0df45,0df2f     ;958
+ dw 0df19,0df04,0deee,0ded9,0dec3,0deae,0de98,0de83     ;960
+ dw 0de6e,0de58,0de43,0de2e,0de18,0de03,0ddee,0ddd8     ;968
+ dw 0ddc3,0ddae,0dd99,0dd83,0dd6e,0dd59,0dd44,0dd2f     ;970
+ dw 0dd1a,0dd05,0dcf0,0dcdb,0dcc6,0dcb1,0dc9c,0dc87     ;978
+ dw 0dc72,0dc5d,0dc48,0dc33,0dc1f,0dc0a,0dbf5,0dbe0     ;980
+ dw 0dbcc,0dbb7,0dba2,0db8d,0db79,0db64,0db50,0db3b     ;988
+ dw 0db26,0db12,0dafd,0dae9,0dad4,0dac0,0daac,0da97     ;990
+ dw 0da83,0da6e,0da5a,0da46,0da31,0da1d,0da09,0d9f5     ;998
+ dw 0d9e1,0d9cc,0d9b8,0d9a4,0d990,0d97c,0d968,0d954     ;9a0
+ dw 0d940,0d92c,0d918,0d904,0d8f0,0d8dc,0d8c8,0d8b4     ;9a8
+ dw 0d8a1,0d88d,0d879,0d865,0d851,0d83e,0d82a,0d816     ;9b0
+ dw 0d803,0d7ef,0d7dc,0d7c8,0d7b5,0d7a1,0d78d,0d77a     ;9b8
+ dw 0d767,0d753,0d740,0d72c,0d719,0d706,0d6f2,0d6df     ;9c0
+ dw 0d6cc,0d6b9,0d6a6,0d692,0d67f,0d66c,0d659,0d646     ;9c8
+ dw 0d633,0d620,0d60d,0d5fa,0d5e7,0d5d4,0d5c1,0d5ae     ;9d0
+ dw 0d59b,0d589,0d576,0d563,0d550,0d53e,0d52b,0d518     ;9d8
+ dw 0d506,0d4f3,0d4e0,0d4ce,0d4bb,0d4a9,0d496,0d484     ;9e0
+ dw 0d472,0d45f,0d44d,0d43a,0d428,0d416,0d404,0d3f1     ;9e8
+ dw 0d3df,0d3cd,0d3bb,0d3a9,0d396,0d384,0d372,0d360     ;9f0
+ dw 0d34e,0d33c,0d32a,0d318,0d307,0d2f5,0d2e3,0d2d1     ;9f8
+ dw 0d2bf,0d2ad,0d29c,0d28a,0d278,0d267,0d255,0d244     ;a00
+ dw 0d232,0d220,0d20f,0d1fd,0d1ec,0d1db,0d1c9,0d1b8     ;a08
+ dw 0d1a6,0d195,0d184,0d173,0d161,0d150,0d13f,0d12e     ;a10
+ dw 0d11d,0d10c,0d0fb,0d0e9,0d0d8,0d0c8,0d0b7,0d0a6     ;a18
+ dw 0d095,0d084,0d073,0d062,0d051,0d041,0d030,0d01f     ;a20
+ dw 0d00f,0cffe,0cfed,0cfdd,0cfcc,0cfbc,0cfab,0cf9b     ;a28
+ dw 0cf8a,0cf7a,0cf6a,0cf59,0cf49,0cf39,0cf28,0cf18     ;a30
+ dw 0cf08,0cef8,0cee8,0ced8,0cec8,0ceb7,0cea7,0ce97     ;a38
+ dw 0ce87,0ce78,0ce68,0ce58,0ce48,0ce38,0ce28,0ce19     ;a40
+ dw 0ce09,0cdf9,0cdea,0cdda,0cdca,0cdbb,0cdab,0cd9c     ;a48
+ dw 0cd8c,0cd7d,0cd6d,0cd5e,0cd4f,0cd3f,0cd30,0cd21     ;a50
+ dw 0cd12,0cd02,0ccf3,0cce4,0ccd5,0ccc6,0ccb7,0cca8     ;a58
+ dw 0cc99,0cc8a,0cc7b,0cc6c,0cc5d,0cc4e,0cc3f,0cc31     ;a60
+ dw 0cc22,0cc13,0cc05,0cbf6,0cbe7,0cbd9,0cbca,0cbbc     ;a68
+ dw 0cbad,0cb9f,0cb90,0cb82,0cb74,0cb65,0cb57,0cb49     ;a70
+ dw 0cb3a,0cb2c,0cb1e,0cb10,0cb02,0caf4,0cae6,0cad8     ;a78
+ dw 0caca,0cabc,0caae,0caa0,0ca92,0ca84,0ca76,0ca69     ;a80
+ dw 0ca5b,0ca4d,0ca40,0ca32,0ca24,0ca17,0ca09,0c9fc     ;a88
+ dw 0c9ee,0c9e1,0c9d4,0c9c6,0c9b9,0c9ac,0c99e,0c991     ;a90
+ dw 0c984,0c977,0c96a,0c95c,0c94f,0c942,0c935,0c928     ;a98
+ dw 0c91b,0c90f,0c902,0c8f5,0c8e8,0c8db,0c8cf,0c8c2     ;aa0
+ dw 0c8b5,0c8a9,0c89c,0c88f,0c883,0c876,0c86a,0c85d     ;aa8
+ dw 0c851,0c845,0c838,0c82c,0c820,0c813,0c807,0c7fb     ;ab0
+ dw 0c7ef,0c7e3,0c7d7,0c7cb,0c7bf,0c7b3,0c7a7,0c79b     ;ab8
+ dw 0c78f,0c783,0c777,0c76c,0c760,0c754,0c749,0c73d     ;ac0
+ dw 0c731,0c726,0c71a,0c70f,0c703,0c6f8,0c6ed,0c6e1     ;ac8
+ dw 0c6d6,0c6cb,0c6bf,0c6b4,0c6a9,0c69e,0c693,0c688     ;ad0
+ dw 0c67d,0c672,0c667,0c65c,0c651,0c646,0c63b,0c630     ;ad8
+ dw 0c626,0c61b,0c610,0c605,0c5fb,0c5f0,0c5e6,0c5db     ;ae0
+ dw 0c5d1,0c5c6,0c5bc,0c5b1,0c5a7,0c59d,0c593,0c588     ;ae8
+ dw 0c57e,0c574,0c56a,0c560,0c556,0c54c,0c542,0c538     ;af0
+ dw 0c52e,0c524,0c51a,0c510,0c506,0c4fd,0c4f3,0c4e9     ;af8
+ dw 0c4e0,0c4d6,0c4cc,0c4c3,0c4b9,0c4b0,0c4a7,0c49d     ;b00
+ dw 0c494,0c48b,0c481,0c478,0c46f,0c466,0c45d,0c453     ;b08
+ dw 0c44a,0c441,0c438,0c42f,0c426,0c41e,0c415,0c40c     ;b10
+ dw 0c403,0c3fa,0c3f2,0c3e9,0c3e0,0c3d8,0c3cf,0c3c7     ;b18
+ dw 0c3be,0c3b6,0c3ad,0c3a5,0c39d,0c394,0c38c,0c384     ;b20
+ dw 0c37c,0c374,0c36b,0c363,0c35b,0c353,0c34b,0c343     ;b28
+ dw 0c33b,0c334,0c32c,0c324,0c31c,0c314,0c30d,0c305     ;b30
+ dw 0c2fe,0c2f6,0c2ee,0c2e7,0c2df,0c2d8,0c2d1,0c2c9     ;b38
+ dw 0c2c2,0c2bb,0c2b3,0c2ac,0c2a5,0c29e,0c297,0c290     ;b40
+ dw 0c289,0c282,0c27b,0c274,0c26d,0c266,0c25f,0c259     ;b48
+ dw 0c252,0c24b,0c245,0c23e,0c237,0c231,0c22a,0c224     ;b50
+ dw 0c21e,0c217,0c211,0c20b,0c204,0c1fe,0c1f8,0c1f2     ;b58
+ dw 0c1ec,0c1e5,0c1df,0c1d9,0c1d3,0c1cd,0c1c8,0c1c2     ;b60
+ dw 0c1bc,0c1b6,0c1b0,0c1ab,0c1a5,0c19f,0c19a,0c194     ;b68
+ dw 0c18f,0c189,0c184,0c17e,0c179,0c174,0c16e,0c169     ;b70
+ dw 0c164,0c15f,0c159,0c154,0c14f,0c14a,0c145,0c140     ;b78
+ dw 0c13b,0c136,0c132,0c12d,0c128,0c123,0c11f,0c11a     ;b80
+ dw 0c115,0c111,0c10c,0c108,0c103,0c0ff,0c0fa,0c0f6     ;b88
+ dw 0c0f2,0c0ed,0c0e9,0c0e5,0c0e1,0c0dd,0c0d9,0c0d5     ;b90
+ dw 0c0d1,0c0cd,0c0c9,0c0c5,0c0c1,0c0bd,0c0b9,0c0b6     ;b98
+ dw 0c0b2,0c0ae,0c0ab,0c0a7,0c0a3,0c0a0,0c09c,0c099     ;ba0
+ dw 0c096,0c092,0c08f,0c08c,0c088,0c085,0c082,0c07f     ;ba8
+ dw 0c07c,0c079,0c076,0c073,0c070,0c06d,0c06a,0c067     ;bb0
+ dw 0c064,0c062,0c05f,0c05c,0c05a,0c057,0c054,0c052     ;bb8
+ dw 0c04f,0c04d,0c04b,0c048,0c046,0c044,0c041,0c03f     ;bc0
+ dw 0c03d,0c03b,0c039,0c037,0c035,0c033,0c031,0c02f     ;bc8
+ dw 0c02d,0c02b,0c029,0c028,0c026,0c024,0c022,0c021     ;bd0
+ dw 0c01f,0c01e,0c01c,0c01b,0c019,0c018,0c017,0c015     ;bd8
+ dw 0c014,0c013,0c012,0c011,0c010,0c00f,0c00e,0c00d     ;be0
+ dw 0c00c,0c00b,0c00a,0c009,0c008,0c007,0c007,0c006     ;be8
+ dw 0c005,0c005,0c004,0c004,0c003,0c003,0c002,0c002     ;bf0
+ dw 0c002,0c001,0c001,0c001,0c001,0c001,0c001,0c001     ;bf8
+
+ dw 0c001,0c001,0c001,0c001,0c001,0c001,0c001,0c001     ;c00
+ dw 0c002,0c002,0c002,0c003,0c003,0c004,0c004,0c005     ;c08
+ dw 0c005,0c006,0c007,0c007,0c008,0c009,0c00a,0c00b     ;c10
+ dw 0c00c,0c00d,0c00e,0c00f,0c010,0c011,0c012,0c013     ;c18
+ dw 0c014,0c015,0c017,0c018,0c019,0c01b,0c01c,0c01e     ;c20
+ dw 0c01f,0c021,0c022,0c024,0c026,0c028,0c029,0c02b     ;c28
+ dw 0c02d,0c02f,0c031,0c033,0c035,0c037,0c039,0c03b     ;c30
+ dw 0c03d,0c03f,0c041,0c044,0c046,0c048,0c04b,0c04d     ;c38
+ dw 0c04f,0c052,0c054,0c057,0c05a,0c05c,0c05f,0c062     ;c40
+ dw 0c064,0c067,0c06a,0c06d,0c070,0c073,0c076,0c079     ;c48
+ dw 0c07c,0c07f,0c082,0c085,0c088,0c08c,0c08f,0c092     ;c50
+ dw 0c096,0c099,0c09c,0c0a0,0c0a3,0c0a7,0c0ab,0c0ae     ;c58
+ dw 0c0b2,0c0b6,0c0b9,0c0bd,0c0c1,0c0c5,0c0c9,0c0cd     ;c60
+ dw 0c0d1,0c0d5,0c0d9,0c0dd,0c0e1,0c0e5,0c0e9,0c0ed     ;c68
+ dw 0c0f2,0c0f6,0c0fa,0c0ff,0c103,0c108,0c10c,0c111     ;c70
+ dw 0c115,0c11a,0c11f,0c123,0c128,0c12d,0c132,0c136     ;c78
+ dw 0c13b,0c140,0c145,0c14a,0c14f,0c154,0c159,0c15f     ;c80
+ dw 0c164,0c169,0c16e,0c174,0c179,0c17e,0c184,0c189     ;c88
+ dw 0c18f,0c194,0c19a,0c19f,0c1a5,0c1ab,0c1b0,0c1b6     ;c90
+ dw 0c1bc,0c1c2,0c1c8,0c1cd,0c1d3,0c1d9,0c1df,0c1e5     ;c98
+ dw 0c1ec,0c1f2,0c1f8,0c1fe,0c204,0c20b,0c211,0c217     ;ca0
+ dw 0c21e,0c224,0c22a,0c231,0c237,0c23e,0c245,0c24b     ;ca8
+ dw 0c252,0c259,0c25f,0c266,0c26d,0c274,0c27b,0c282     ;cb0
+ dw 0c289,0c290,0c297,0c29e,0c2a5,0c2ac,0c2b3,0c2bb     ;cb8
+ dw 0c2c2,0c2c9,0c2d1,0c2d8,0c2df,0c2e7,0c2ee,0c2f6     ;cc0
+ dw 0c2fe,0c305,0c30d,0c314,0c31c,0c324,0c32c,0c334     ;cc8
+ dw 0c33b,0c343,0c34b,0c353,0c35b,0c363,0c36b,0c374     ;cd0
+ dw 0c37c,0c384,0c38c,0c394,0c39d,0c3a5,0c3ad,0c3b6     ;cd8
+ dw 0c3be,0c3c7,0c3cf,0c3d8,0c3e0,0c3e9,0c3f2,0c3fa     ;ce0
+ dw 0c403,0c40c,0c415,0c41e,0c426,0c42f,0c438,0c441     ;ce8
+ dw 0c44a,0c453,0c45d,0c466,0c46f,0c478,0c481,0c48b     ;cf0
+ dw 0c494,0c49d,0c4a7,0c4b0,0c4b9,0c4c3,0c4cc,0c4d6     ;cf8
+ dw 0c4e0,0c4e9,0c4f3,0c4fd,0c506,0c510,0c51a,0c524     ;d00
+ dw 0c52e,0c538,0c542,0c54c,0c556,0c560,0c56a,0c574     ;d08
+ dw 0c57e,0c588,0c593,0c59d,0c5a7,0c5b1,0c5bc,0c5c6     ;d10
+ dw 0c5d1,0c5db,0c5e6,0c5f0,0c5fb,0c605,0c610,0c61b     ;d18
+ dw 0c626,0c630,0c63b,0c646,0c651,0c65c,0c667,0c672     ;d20
+ dw 0c67d,0c688,0c693,0c69e,0c6a9,0c6b4,0c6bf,0c6cb     ;d28
+ dw 0c6d6,0c6e1,0c6ed,0c6f8,0c703,0c70f,0c71a,0c726     ;d30
+ dw 0c731,0c73d,0c749,0c754,0c760,0c76c,0c777,0c783     ;d38
+ dw 0c78f,0c79b,0c7a7,0c7b3,0c7bf,0c7cb,0c7d7,0c7e3     ;d40
+ dw 0c7ef,0c7fb,0c807,0c813,0c820,0c82c,0c838,0c845     ;d48
+ dw 0c851,0c85d,0c86a,0c876,0c883,0c88f,0c89c,0c8a9     ;d50
+ dw 0c8b5,0c8c2,0c8cf,0c8db,0c8e8,0c8f5,0c902,0c90f     ;d58
+ dw 0c91b,0c928,0c935,0c942,0c94f,0c95c,0c96a,0c977     ;d60
+ dw 0c984,0c991,0c99e,0c9ac,0c9b9,0c9c6,0c9d4,0c9e1     ;d68
+ dw 0c9ee,0c9fc,0ca09,0ca17,0ca24,0ca32,0ca40,0ca4d     ;d70
+ dw 0ca5b,0ca69,0ca77,0ca84,0ca92,0caa0,0caae,0cabc     ;d78
+ dw 0caca,0cad8,0cae6,0caf4,0cb02,0cb10,0cb1e,0cb2c     ;d80
+ dw 0cb3a,0cb49,0cb57,0cb65,0cb74,0cb82,0cb90,0cb9f     ;d88
+ dw 0cbad,0cbbc,0cbca,0cbd9,0cbe7,0cbf6,0cc05,0cc13     ;d90
+ dw 0cc22,0cc31,0cc3f,0cc4e,0cc5d,0cc6c,0cc7b,0cc8a     ;d98
+ dw 0cc99,0cca8,0ccb7,0ccc6,0ccd5,0cce4,0ccf3,0cd02     ;da0
+ dw 0cd12,0cd21,0cd30,0cd3f,0cd4f,0cd5e,0cd6d,0cd7d     ;da8
+ dw 0cd8c,0cd9c,0cdab,0cdbb,0cdca,0cdda,0cdea,0cdf9     ;db0
+ dw 0ce09,0ce19,0ce28,0ce38,0ce48,0ce58,0ce68,0ce78     ;db8
+ dw 0ce88,0ce97,0cea7,0ceb7,0cec8,0ced8,0cee8,0cef8     ;dc0
+ dw 0cf08,0cf18,0cf28,0cf39,0cf49,0cf59,0cf6a,0cf7a     ;dc8
+ dw 0cf8a,0cf9b,0cfab,0cfbc,0cfcc,0cfdd,0cfed,0cffe     ;dd0
+ dw 0d00f,0d01f,0d030,0d041,0d051,0d062,0d073,0d084     ;dd8
+ dw 0d095,0d0a6,0d0b7,0d0c8,0d0d9,0d0ea,0d0fb,0d10c     ;de0
+ dw 0d11d,0d12e,0d13f,0d150,0d161,0d173,0d184,0d195     ;de8
+ dw 0d1a6,0d1b8,0d1c9,0d1db,0d1ec,0d1fd,0d20f,0d220     ;df0
+ dw 0d232,0d244,0d255,0d267,0d278,0d28a,0d29c,0d2ae     ;df8
+ dw 0d2bf,0d2d1,0d2e3,0d2f5,0d307,0d318,0d32a,0d33c     ;e00
+ dw 0d34e,0d360,0d372,0d384,0d396,0d3a9,0d3bb,0d3cd     ;e08
+ dw 0d3df,0d3f1,0d404,0d416,0d428,0d43a,0d44d,0d45f     ;e10
+ dw 0d472,0d484,0d496,0d4a9,0d4bb,0d4ce,0d4e0,0d4f3     ;e18
+ dw 0d506,0d518,0d52b,0d53e,0d550,0d563,0d576,0d589     ;e20
+ dw 0d59b,0d5ae,0d5c1,0d5d4,0d5e7,0d5fa,0d60d,0d620     ;e28
+ dw 0d633,0d646,0d659,0d66c,0d67f,0d692,0d6a6,0d6b9     ;e30
+ dw 0d6cc,0d6df,0d6f2,0d706,0d719,0d72c,0d740,0d753     ;e38
+ dw 0d767,0d77a,0d78e,0d7a1,0d7b5,0d7c8,0d7dc,0d7ef     ;e40
+ dw 0d803,0d816,0d82a,0d83e,0d851,0d865,0d879,0d88d     ;e48
+ dw 0d8a1,0d8b4,0d8c8,0d8dc,0d8f0,0d904,0d918,0d92c     ;e50
+ dw 0d940,0d954,0d968,0d97c,0d990,0d9a4,0d9b8,0d9cc     ;e58
+ dw 0d9e1,0d9f5,0da09,0da1d,0da32,0da46,0da5a,0da6e     ;e60
+ dw 0da83,0da97,0daac,0dac0,0dad4,0dae9,0dafd,0db12     ;e68
+ dw 0db26,0db3b,0db50,0db64,0db79,0db8d,0dba2,0dbb7     ;e70
+ dw 0dbcc,0dbe0,0dbf5,0dc0a,0dc1f,0dc33,0dc48,0dc5d     ;e78
+ dw 0dc72,0dc87,0dc9c,0dcb1,0dcc6,0dcdb,0dcf0,0dd05     ;e80
+ dw 0dd1a,0dd2f,0dd44,0dd59,0dd6e,0dd84,0dd99,0ddae     ;e88
+ dw 0ddc3,0ddd8,0ddee,0de03,0de18,0de2e,0de43,0de58     ;e90
+ dw 0de6e,0de83,0de98,0deae,0dec3,0ded9,0deee,0df04     ;e98
+ dw 0df19,0df2f,0df45,0df5a,0df70,0df85,0df9b,0dfb1     ;ea0
+ dw 0dfc7,0dfdc,0dff2,0e008,0e01e,0e033,0e049,0e05f     ;ea8
+ dw 0e075,0e08b,0e0a1,0e0b7,0e0cc,0e0e2,0e0f8,0e10e     ;eb0
+ dw 0e124,0e13a,0e150,0e167,0e17d,0e193,0e1a9,0e1bf     ;eb8
+ dw 0e1d5,0e1eb,0e202,0e218,0e22e,0e244,0e25a,0e271     ;ec0
+ dw 0e287,0e29d,0e2b4,0e2ca,0e2e0,0e2f7,0e30d,0e324     ;ec8
+ dw 0e33a,0e351,0e367,0e37e,0e394,0e3ab,0e3c1,0e3d8     ;ed0
+ dw 0e3ee,0e405,0e41b,0e432,0e449,0e45f,0e476,0e48d     ;ed8
+ dw 0e4a3,0e4ba,0e4d1,0e4e8,0e4fe,0e515,0e52c,0e543     ;ee0
+ dw 0e55a,0e571,0e587,0e59e,0e5b5,0e5cc,0e5e3,0e5fa     ;ee8
+ dw 0e611,0e628,0e63f,0e656,0e66d,0e684,0e69b,0e6b2     ;ef0
+ dw 0e6c9,0e6e0,0e6f8,0e70f,0e726,0e73d,0e754,0e76b     ;ef8
+ dw 0e783,0e79a,0e7b1,0e7c8,0e7e0,0e7f7,0e80e,0e826     ;f00
+ dw 0e83d,0e854,0e86c,0e883,0e89a,0e8b2,0e8c9,0e8e1     ;f08
+ dw 0e8f8,0e90f,0e927,0e93e,0e956,0e96d,0e985,0e99c     ;f10
+ dw 0e9b4,0e9cc,0e9e3,0e9fb,0ea12,0ea2a,0ea42,0ea59     ;f18
+ dw 0ea71,0ea89,0eaa0,0eab8,0ead0,0eae7,0eaff,0eb17     ;f20
+ dw 0eb2f,0eb46,0eb5e,0eb76,0eb8e,0eba6,0ebbd,0ebd5     ;f28
+ dw 0ebed,0ec05,0ec1d,0ec35,0ec4d,0ec65,0ec7d,0ec94     ;f30
+ dw 0ecac,0ecc4,0ecdc,0ecf4,0ed0c,0ed24,0ed3c,0ed54     ;f38
+ dw 0ed6c,0ed85,0ed9d,0edb5,0edcd,0ede5,0edfd,0ee15     ;f40
+ dw 0ee2d,0ee45,0ee5e,0ee76,0ee8e,0eea6,0eebe,0eed6     ;f48
+ dw 0eeef,0ef07,0ef1f,0ef37,0ef50,0ef68,0ef80,0ef98     ;f50
+ dw 0efb1,0efc9,0efe1,0effa,0f012,0f02a,0f043,0f05b     ;f58
+ dw 0f074,0f08c,0f0a4,0f0bd,0f0d5,0f0ee,0f106,0f11e     ;f60
+ dw 0f137,0f14f,0f168,0f180,0f199,0f1b1,0f1ca,0f1e2     ;f68
+ dw 0f1fb,0f213,0f22c,0f244,0f25d,0f275,0f28e,0f2a7     ;f70
+ dw 0f2bf,0f2d8,0f2f0,0f309,0f322,0f33a,0f353,0f36c     ;f78
+ dw 0f384,0f39d,0f3b5,0f3ce,0f3e7,0f3ff,0f418,0f431     ;f80
+ dw 0f44a,0f462,0f47b,0f494,0f4ac,0f4c5,0f4de,0f4f7     ;f88
+ dw 0f50f,0f528,0f541,0f55a,0f573,0f58b,0f5a4,0f5bd     ;f90
+ dw 0f5d6,0f5ef,0f607,0f620,0f639,0f652,0f66b,0f684     ;f98
+ dw 0f69c,0f6b5,0f6ce,0f6e7,0f700,0f719,0f732,0f74b     ;fa0
+ dw 0f764,0f77c,0f795,0f7ae,0f7c7,0f7e0,0f7f9,0f812     ;fa8
+ dw 0f82b,0f844,0f85d,0f876,0f88f,0f8a8,0f8c1,0f8da     ;fb0
+ dw 0f8f3,0f90c,0f925,0f93e,0f957,0f970,0f989,0f9a2     ;fb8
+ dw 0f9bb,0f9d4,0f9ed,0fa06,0fa1f,0fa38,0fa51,0fa6a     ;fc0
+ dw 0fa83,0fa9c,0fab5,0face,0fae7,0fb00,0fb19,0fb32     ;fc8
+ dw 0fb4b,0fb64,0fb7d,0fb96,0fbb0,0fbc9,0fbe2,0fbfb     ;fd0
+ dw 0fc14,0fc2d,0fc46,0fc5f,0fc78,0fc91,0fcaa,0fcc3     ;fd8
+ dw 0fcdd,0fcf6,0fd0f,0fd28,0fd41,0fd5a,0fd73,0fd8c     ;fe0
+ dw 0fda5,0fdbf,0fdd8,0fdf1,0fe0a,0fe23,0fe3c,0fe55     ;fe8
+ dw 0fe6e,0fe88,0fea1,0feba,0fed3,0feec,0ff05,0ff1e     ;ff0
+ dw 0ff37,0ff51,0ff6a,0ff83,0ff9c,0ffb5,0ffce,0ffe7     ;ff8
+
+;=========================================================================
diff --git a/wmdots/wmdots/old_dos_demo/trig.s b/wmdots/wmdots/old_dos_demo/trig.s
new file mode 100644
index 0000000..25108df
--- /dev/null
+++ b/wmdots/wmdots/old_dos_demo/trig.s
@@ -0,0 +1,29 @@
+;=========================================================================
+;Trig functions for GFX routines   Copyright (c) 1995 by Mark I Manning IV
+;=========================================================================
+
+CosTab          equ SinTab+0800 ;A Right angle foreward in table!
+
+;-------------------------------------------------------------------------
+
+;Return Sin and Cos of angle AX in variables of same name
+
+SinCos:
+ and ax,0fff            ;4096 degrees = 0 degrees
+ mov bx,ax              ;Put into an indexing reg
+ add bx,bx
+ mov ax,SinTab[bx]      ;Get Sin(N)
+ mov Sin,ax             ;Bah no MOV Sin,[BX]... Crap processor!
+
+;Note.
+; Can NOT use mov ax,SinTab[2*ebx] because in following code BX may go
+;  negative and 2* a negative number = DOUBLY NEGATIVE!
+
+ cmp bx,01800           ;Was Sin(N) in last quadrant of circle?
+ if nl sub bx,02000     ;Cos(N) must be in first quadrant then
+ mov bx,CosTab[bx]      ;Get Cos(n)
+ mov Cos,bx             ;Exits with Sin in AX and Cos in BX too!
+ ret
+
+;=========================================================================
+
diff --git a/wmdots/wmdots/sintab.c b/wmdots/wmdots/sintab.c
new file mode 100644
index 0000000..99d0f40
--- /dev/null
+++ b/wmdots/wmdots/sintab.c
@@ -0,0 +1,75 @@
+// Sin and Cos tables based on 512 degree circle.
+// -----------------------------------------------------------------------
+
+short sin_tab[]=
+{
+  0x0000, 0x00c9, 0x0192, 0x025b, 0x0323, 0x03ec, 0x04b5, 0x057d,
+  0x0645, 0x070d, 0x07d5, 0x089c, 0x0964, 0x0a2a, 0x0af1, 0x0bb6,
+  0x0c7c, 0x0d41, 0x0e05, 0x0ec9, 0x0f8c, 0x104f, 0x1111, 0x11d3,
+  0x1294, 0x1354, 0x1413, 0x14d1, 0x158f, 0x164c, 0x1708, 0x17c3,
+  0x187d, 0x1937, 0x19ef, 0x1aa6, 0x1b5d, 0x1c12, 0x1cc6, 0x1d79,
+  0x1e2b, 0x1edc, 0x1f8b, 0x2039, 0x20e7, 0x2192, 0x223d, 0x22e6,
+  0x238e, 0x2434, 0x24da, 0x257d, 0x261f, 0x26c0, 0x275f, 0x27fd,
+  0x2899, 0x2934, 0x29cd, 0x2a65, 0x2afa, 0x2b8e, 0x2c21, 0x2cb2,
+  0x2d41, 0x2dce, 0x2e5a, 0x2ee3, 0x2f6b, 0x2ff1, 0x3076, 0x30f8,
+  0x3179, 0x31f7, 0x3274, 0x32ee, 0x3367, 0x33de, 0x3453, 0x34c6,
+  0x3536, 0x35a5, 0x3612, 0x367c, 0x36e5, 0x374b, 0x37af, 0x3811,
+  0x3871, 0x38cf, 0x392a, 0x3983, 0x39da, 0x3a2f, 0x3a82, 0x3ad2,
+  0x3b20, 0x3b6c, 0x3bb6, 0x3bfd, 0x3c42, 0x3c84, 0x3cc5, 0x3d02,
+  0x3d3e, 0x3d77, 0x3dae, 0x3de2, 0x3e14, 0x3e44, 0x3e71, 0x3e9c,
+  0x3ec5, 0x3eeb, 0x3f0e, 0x3f2f, 0x3f4e, 0x3f6a, 0x3f84, 0x3f9c,
+  0x3fb1, 0x3fc3, 0x3fd3, 0x3fe1, 0x3fec, 0x3ff4, 0x3ffb, 0x3ffe,
+
+  0x3fff, 0x3ffe, 0x3ffb, 0x3ff4, 0x3fec, 0x3fe1, 0x3fd3, 0x3fc3,
+  0x3fb1, 0x3f9c, 0x3f84, 0x3f6a, 0x3f4e, 0x3f2f, 0x3f0e, 0x3eeb, 
+  0x3ec5, 0x3e9c, 0x3e71, 0x3e44, 0x3e14, 0x3de2, 0x3dae, 0x3d77, 
+  0x3d3e, 0x3d02, 0x3cc5, 0x3c84, 0x3c42, 0x3bfd, 0x3bb6, 0x3b6c, 
+  0x3b20, 0x3ad2, 0x3a82, 0x3a2f, 0x39da, 0x3983, 0x392a, 0x38cf,
+  0x3871, 0x3811, 0x37af, 0x374b, 0x36e5, 0x367c, 0x3612, 0x35a5,
+  0x3536, 0x34c6, 0x3453, 0x33de, 0x3367, 0x32ee, 0x3274, 0x31f7,
+  0x3179, 0x30f8, 0x3076, 0x2ff1, 0x2f6b, 0x2ee3, 0x2e5a, 0x2dce,
+  0x2d41, 0x2cb2, 0x2c21, 0x2b8e, 0x2afa, 0x2a65, 0x29cd, 0x2934,
+  0x2899, 0x27fd, 0x275f, 0x26c0, 0x261f, 0x257d, 0x24da, 0x2434,
+  0x238e, 0x22e6, 0x223d, 0x2192, 0x20e7, 0x2039, 0x1f8b, 0x1edc,
+  0x1e2b, 0x1d79, 0x1cc6, 0x1c12, 0x1b5d, 0x1aa6, 0x19ef, 0x1937,
+  0x187d, 0x17c3, 0x1708, 0x164c, 0x158f, 0x14d1, 0x1413, 0x1354,
+  0x1294, 0x11d3, 0x1111, 0x104f, 0x0f8c, 0x0ec9, 0x0e05, 0x0d41,
+  0x0c7c, 0x0bb6, 0x0af1, 0x0a2a, 0x0964, 0x089c, 0x07d5, 0x070d,
+  0x0645, 0x057d, 0x04b5, 0x03ec, 0x0323, 0x025b, 0x0192, 0x00c9,
+
+  0x0000, 0xff37, 0xfe6e, 0xfda5, 0xfcdd, 0xfc14, 0xfb4b, 0xfa83,
+  0xf9bb, 0xf8f3, 0xf82b, 0xf764, 0xf69c, 0xf5d6, 0xf50f, 0xf44a,
+  0xf384, 0xf2bf, 0xf1fb, 0xf137, 0xf074, 0xefb1, 0xeeef, 0xee2d,
+  0xed6c, 0xecac, 0xebed, 0xeb2f, 0xea71, 0xe9b4, 0xe8f8, 0xe83d,
+  0xe783, 0xe6c9, 0xe611, 0xe55a, 0xe4a3, 0xe3ee, 0xe33a, 0xe287,
+  0xe1d5, 0xe124, 0xe075, 0xdfc7, 0xdf19, 0xde6e, 0xddc3, 0xdd1a,
+  0xdc72, 0xdbcc, 0xdb26, 0xda83, 0xd9e1, 0xd940, 0xd8a1, 0xd803,
+  0xd767, 0xd6cc, 0xd633, 0xd59b, 0xd506, 0xd472, 0xd3df, 0xd34e,
+  0xd2bf, 0xd232, 0xd1a6, 0xd11d, 0xd095, 0xd00f, 0xcf8a, 0xcf08,
+  0xce87, 0xce09, 0xcd8c, 0xcd12, 0xcc99, 0xcc22, 0xcbad, 0xcb3a,
+  0xcaca, 0xca5b, 0xc9ee, 0xc984, 0xc91b, 0xc8b5, 0xc851, 0xc7ef,
+  0xc78f, 0xc731, 0xc6d6, 0xc67d, 0xc626, 0xc5d1, 0xc57e, 0xc52e,
+  0xc4e0, 0xc494, 0xc44a, 0xc403, 0xc3be, 0xc37c, 0xc33b, 0xc2fe,
+  0xc2c2, 0xc289, 0xc252, 0xc21e, 0xc1ec, 0xc1bc, 0xc18f, 0xc164,
+  0xc13b, 0xc115, 0xc0f2, 0xc0d1, 0xc0b2, 0xc096, 0xc07c, 0xc064,
+  0xc04f, 0xc03d, 0xc02d, 0xc01f, 0xc014, 0xc00c, 0xc005, 0xc002,
+
+  0xc001, 0xc002, 0xc005, 0xc00c, 0xc014, 0xc01f, 0xc02d, 0xc03d,
+  0xc04f, 0xc064, 0xc07c, 0xc096, 0xc0b2, 0xc0d1, 0xc0f2, 0xc115,
+  0xc13b, 0xc164, 0xc18f, 0xc1bc, 0xc1ec, 0xc21e, 0xc252, 0xc289,
+  0xc2c2, 0xc2fe, 0xc33b, 0xc37c, 0xc3be, 0xc403, 0xc44a, 0xc494,
+  0xc4e0, 0xc52e, 0xc57e, 0xc5d1, 0xc626, 0xc67d, 0xc6d6, 0xc731,
+  0xc78f, 0xc7ef, 0xc851, 0xc8b5, 0xc91b, 0xc984, 0xc9ee, 0xca5b,
+  0xcaca, 0xcb3a, 0xcbad, 0xcc22, 0xcc99, 0xcd12, 0xcd8c, 0xce09,
+  0xce88, 0xcf08, 0xcf8a, 0xd00f, 0xd095, 0xd11d, 0xd1a6, 0xd232,
+  0xd2bf, 0xd34e, 0xd3df, 0xd472, 0xd506, 0xd59b, 0xd633, 0xd6cc,
+  0xd767, 0xd803, 0xd8a1, 0xd940, 0xd9e1, 0xda83, 0xdb26, 0xdbcc,
+  0xdc72, 0xdd1a, 0xddc3, 0xde6e, 0xdf19, 0xdfc7, 0xe075, 0xe124,
+  0xe1d5, 0xe287, 0xe33a, 0xe3ee, 0xe4a3, 0xe55a, 0xe611, 0xe6c9,
+  0xe783, 0xe83d, 0xe8f8, 0xe9b4, 0xea71, 0xeb2f, 0xebed, 0xecac,
+  0xed6c, 0xee2d, 0xeeef, 0xefb1, 0xf074, 0xf137, 0xf1fb, 0xf2bf,
+  0xf384, 0xf44a, 0xf50f, 0xf5d6, 0xf69c, 0xf764, 0xf82b, 0xf8f3,
+  0xf9bb, 0xfa83, 0xfb4b, 0xfc14, 0xfcdd, 0xfda5, 0xfe6e, 0xff37
+};
+
+// =======================================================================
diff --git a/wmdots/wmdots/wmdots b/wmdots/wmdots/wmdots
new file mode 100755
index 0000000000000000000000000000000000000000..a4515093ddf0c45f7b48e75f7ac3a4f77deaef0c
GIT binary patch
literal 62534
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
Q<tW;lXMejL2Hc5$00VL;jQ{`u

literal 0
HcmV?d00001

diff --git a/wmdots/wmdots/wmdots.c b/wmdots/wmdots/wmdots.c
new file mode 100644
index 0000000..9de33d1
--- /dev/null
+++ b/wmdots/wmdots/wmdots.c
@@ -0,0 +1,667 @@
+// WM-Dots the Window Maker 3d Rotating Dots Demo by Mark I Manning IV
+// =======================================================================
+
+// This demo is based on an old DOS demo I did a number of years ago.  The
+// trick was to get it to work in an 64 x 64 window instead of the
+// 320 x 200 of the original. (and in 16 instead of 256 colours :)
+
+// Much of these sources are based on other dockable application sources.
+// For this reason, and because it is the right thing to do, this file is
+// distributed under the GPL.  Use it and abuse it as you will.
+
+// Flames, critisizm and general nukings can be sent to....
+
+//  [email protected]
+
+// I have included the sources (in 100% pure ASM) to the afore mentioned
+// original demo.  These you can also consider covered by the GPL.
+
+// Maybe someone can help me convert the bump mapping in the original to
+// use only 16 colours :)  (actually, I have space in the master.xpm for
+// 32 colours if I retain a 2 x 2 pixle size.  If i go to 1 x 1 i can
+// fit 64 colours in there :)
+
+// Yea... I know... Im supposed to be sparing of system resources like
+// colour allocations but come on guys... this IS a demo after all :)
+// Demos are supposed to be abusive of system resources eh??? :)
+
+//  This source file is 100% TAB FREE. Use any editor/viewer you want
+//  to view it with and set ANY size tabs and it will STILL look right.
+//  TABS ARE EVIL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+// Also Linus T is wrong. Indentations of 8 are an abomination and so is
+// k&r source formatting.  So There!
+
+// Apart from that... Linus for president :)
+//                    or George W. Bush!!!
+
+// -----------------------------------------------------------------------
+// blah :)
+
+// Version 0.1 beta     Released Saturday October 9 1999
+//
+//    To do...  Fix bug that causes core dump when the "cross" object
+//               rotates outside window (its not a clipping problem).
+//              Find out why the "cross" object is not cross shaped in
+//               this demo when it is in the dos version.
+//              Change pixle sizes to 1 x 1 for objects that are in
+//               the distance.
+//              Move all object definitions out of this file and into
+//               some kind of rc file and allow user defined objects
+//              Add greets to the credits display :)
+//              Impliment better light shading (in object space?)
+//              Prevent dark pixles overwriting light ones
+//
+//    Done...   Scrapped idea about different pixle sizez, it didn't look
+//               as good as i thunked it would :)
+//              Fixed adjust_angle() to be angle +128 not angle +127
+//              Fixed cross by defining xyz as char instead of int
+//              Fixed core dump problem with cross:  Oopts it was a
+//               clipping problem, z clipping points behind camera! :)
+//              Added size macro (prolly a bad name for it tho :)
+//              Implimented better light shading but its still not
+//               quite right yet...
+//              Removed math.h from includes as im not using any
+//               functions therein.  Saved a whopping 4 bytes :)
+//              Added code to draw_point() to prevent dark pels from
+//               being drawn over lighter pels.  Dark pels are further
+//               away and should be BEHIND the lighter ones.  There is
+//               almost no cpu bash here and I dont need to z sort pels
+//
+//
+// Version 0.2 beta     Released Saturday October 9 1999
+//
+//    To do..   Still gotta move objects to rc file....
+//
+//
+//
+//    Done...
+
+// -----------------------------------------------------------------------
+// includes
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <X11/xpm.h>
+#include "../wmgeneral/wmgeneral.h"
+#include "master.xpm"
+#include "sintab.c"             // sin() and cos() are crap!
+
+// -----------------------------------------------------------------------
+// defines
+
+#define PEL_SIZE 2              // 1 or 2 only
+
+#define MAX_POINTS 125          // max # pels in an object
+
+#define MASK_WIDTH 64           // window bitmap mask dimentions
+#define MASK_HEIGHT 64
+#define MASK_SIZE MASK_WIDTH * MASK_HEIGHT
+
+// adjust angle for cos table lookup.  cos = right angle further
+// on in sin table, circle = 512 degrees...
+
+#define adjust(angle) ((angle + 128) & 0x1ff)
+#define size(array) ((sizeof(array) / sizeof(array[0])))
+
+// -----------------------------------------------------------------------
+// typedefs...
+
+typedef struct                  // a point in 3d space
+{
+  char x, y, z;
+}xyz;
+
+typedef struct                  // a point in 2d space
+{
+  int x, y;
+}xy;
+
+typedef struct
+{
+  int counter;                  // count down to next speed/shape change
+  int reset;                    // initial value of counter
+  int *ptr;                     // pointer to item to modify
+  int delta;                    // ammount to change item by
+  int upper;                    // upper limit for item
+  int lower;                    // lower limit for item
+}modifier;
+
+// -----------------------------------------------------------------------
+// object structures...
+
+xyz cube[]=
+{
+  {-35,-35,-35},{-35,-35,-15},{-35,-35, 05},{-35,-35, 25},{-35,-35, 45},
+  {-35,-15,-35},{-35,-15,-15},{-35,-15, 05},{-35,-15, 25},{-35,-15, 45},
+  {-35, 05,-35},{-35, 05,-15},{-35, 05, 05},{-35, 05, 25},{-35, 05, 45},
+  {-35, 25,-35},{-35, 25,-15},{-35, 25, 05},{-35, 25, 25},{-35, 25, 45},
+  {-35, 45,-35},{-35, 45,-15},{-35, 45, 05},{-35, 45, 25},{-35, 45, 45},
+  {-15,-35,-35},{-15,-35,-15},{-15,-35, 05},{-15,-35, 25},{-15,-35, 45},
+  {-15,-15,-35},{-15,-15,-15},{-15,-15, 05},{-15,-15, 25},{-15,-15, 45},
+  {-15, 05,-35},{-15, 05,-15},{-15, 05, 05},{-15, 05, 25},{-15, 05, 45},
+  {-15, 25,-35},{-15, 25,-15},{-15, 25, 05},{-15, 25, 25},{-15, 25, 45},
+  {-15, 45,-35},{-15, 45,-15},{-15, 45, 05},{-15, 45, 25},{-15, 45, 45},
+  { 05,-35,-35},{ 05,-35,-15},{ 05,-35, 05},{ 05,-35, 25},{ 05,-35, 45},
+  { 05,-15,-35},{ 05,-15,-15},{ 05,-15, 05},{ 05,-15, 25},{ 05,-15, 45},
+  { 05, 05,-35},{ 05, 05,-15},{ 05, 05, 05},{ 05, 05, 25},{ 05, 05, 45},
+  { 05, 25,-35},{ 05, 25,-15},{ 05, 25, 05},{ 05, 25, 25},{ 05, 25, 45},
+  { 05, 45,-35},{ 05, 45,-15},{ 05, 45, 05},{ 05, 45, 25},{ 05, 45, 45},
+  { 25,-35,-35},{ 25,-35,-15},{ 25,-35, 05},{ 25,-35, 25},{ 25,-35, 45},
+  { 25,-15,-35},{ 25,-15,-15},{ 25,-15, 05},{ 25,-15, 25},{ 25,-15, 45},
+  { 25, 05,-35},{ 25, 05,-15},{ 25, 05, 05},{ 25, 05, 25},{ 25, 05, 45},
+  { 25, 25,-35},{ 25, 25,-15},{ 25, 25, 05},{ 25, 25, 25},{ 25, 25, 45},
+  { 25, 45,-35},{ 25, 45,-15},{ 25, 45, 05},{ 25, 45, 25},{ 25, 45, 45},
+  { 45,-35,-35},{ 45,-35,-15},{ 45,-35, 05},{ 45,-35, 25},{ 45,-35, 45},
+  { 45,-15,-35},{ 45,-15,-15},{ 45,-15, 05},{ 45,-15, 25},{ 45,-15, 45},
+  { 45, 05,-35},{ 45, 05,-15},{ 45, 05, 05},{ 45, 05, 25},{ 45, 05, 45},
+  { 45, 25,-35},{ 45, 25,-15},{ 45, 25, 05},{ 45, 25, 25},{ 45, 25, 45},
+  { 45, 45,-35},{ 45, 45,-15},{ 45, 45, 05},{ 45, 45, 25},{ 45, 45, 45}
+};
+
+xyz star[]=
+{
+  {-35,-35, 05},{-35,-15, 05},{-35, 05, 05},{-35, 25, 05},{-35, 45, 05},
+  {-15,-35, 05},{-15,-15, 05},{-15, 05, 05},{-15, 25, 05},{-15, 45, 05},
+  { 05,-35, 05},{ 05,-15, 05},{ 05, 05, 05},{ 05, 25, 05},{ 05, 45, 05},
+  { 25,-35, 05},{ 25,-15, 05},{ 25, 05, 05},{ 25, 25, 05},{ 25, 45, 05},
+  { 45,-35, 05},{ 45,-15, 05},{ 45, 05, 05},{ 45, 25, 05},{ 45, 45, 05},
+  { 05,-35,-35},{ 05,-35,-15},{ 05,-35, 25},{ 05,-35, 45},{-35, 05,-35},
+  { 05,-15,-35},{ 05,-15,-15},{ 05,-15, 25},{ 05,-15, 45},{-15, 05,-35},
+  { 05, 05,-35},{ 05, 05,-15},{ 05, 05, 25},{ 05, 05, 45},{ 05, 05,-35},
+  { 05, 25,-35},{ 05, 25,-15},{ 05, 25, 25},{ 05, 25, 45},{ 25, 05,-35},
+  { 05, 45,-35},{ 05, 45,-15},{ 05, 45, 25},{ 05, 45, 45},{ 45, 05,-35},
+  {-35, 05,-15},{-35, 05, 25},{-35, 05, 45},{-15, 05,-15},{-15, 05, 25},
+  {-15, 05, 45},{ 05, 05,-15},{ 05, 05, 25},{ 05, 05, 45},{ 25, 05,-15},
+  { 25, 05, 25},{ 25, 05, 45},{ 45, 05,-15},{ 45, 05, 25},{ 45, 05, 45}
+};
+
+xyz dots[]=
+{
+  {-35,-35,-35},{-35,-35, 45},{ 45, 45,-35},{ 45, 45, 45},{ 5,-35, 5},
+  {  5, 45,  5}
+};
+
+xyz square[]=
+{
+  {-35,-35,-35},{-35,-15,-35},{-35, 05,-35},{-35, 25,-35},{-35, 45,-35},
+  {-15,-35,-35},{-15,-15,-35},{-15, 05,-35},{-15, 25,-35},{-15, 45,-35},
+  { 05,-35,-35},{ 05,-15,-35},{ 05, 05,-35},{ 05, 25,-35},{ 05, 45,-35},
+  { 25,-35,-35},{ 25,-15,-35},{ 25, 05,-35},{ 25, 25,-35},{ 25, 45,-35},
+  { 45,-35,-35},{ 45,-15,-35},{ 45, 05,-35},{ 45, 25,-35},{ 45, 45,-35}
+};
+
+xyz cross[]=
+{
+  {0x00,0x00,0x19}, {0x00,0x05,0x19}, {0x00,0x14,0x01}, {0x00,0x32,0x00}, 
+  {0x00,0x7D,0x00}, {0x00,0xC9,0x00}, {0x01,0x5F,0x01}, {0x01,0xAB,0x01}, 
+  {0x01,0xF6,0x01}, {0x02,0x41,0x02}, {0x02,0x8D,0x02}, {0x02,0xD8,0x02}, 
+  {0x03,0x23,0x03}, {0x03,0x05,0x04}, {0x03,0x6F,0x03}, {0x03,0xBA,0x03}, 
+  {0x04,0x51,0x04}, {0x04,0x9C,0x04}, {0x04,0xE7,0x04}, {0x05,0x13,0x06},
+  {0x05,0x32,0x05}, {0x05,0x7D,0x05}, {0x05,0xC8,0x05}, {0x06,0x5E,0x06}, 
+  {0x06,0xA9,0x06}, {0x06,0xF4,0x06}, {0x07,0x3F,0x07}, {0x07,0x8A,0x07}, 
+  {0x07,0xD5,0x07}, {0x08,0x00,0x09}, {0x08,0x20,0x08}, {0x08,0x6B,0x08}, 
+  {0x08,0xB5,0x08}, {0x09,0x4B,0x09}, {0x09,0x95,0x09}, {0x09,0xE0,0x09}, 
+  {0x0A,0x09,0x0B}, {0x0A,0x2A,0x0A}, {0x0A,0x75,0x0A}, {0x0A,0xBF,0x0A},
+  {0x0B,0x54,0x0B}, {0x0D,0x07,0x26}, {0x0F,0x02,0x28}, {0x19,0x09,0x32}, 
+  {0x1E,0x04,0x37}, {0x22,0x0B,0x3B}, {0x2C,0x06,0x45}, {0x2D,0x01,0x46}, 
+  {0x39,0x08,0x52}, {0x3D,0x03,0x56}, {0x43,0x0A,0x5C}, {0x4B,0x00,0x64}, 
+  {0x4B,0x05,0x64}, {0x58,0x07,0x71}, {0x5B,0x02,0x74}, {0x64,0x09,0x7C}, 
+  {0x84,0x08,0x9C}, {0x88,0x03,0xA1}, {0x8D,0x0A,0xA6}, {0x96,0x00,0xAF},
+  {0x96,0x05,0xAF}, {0xA3,0x07,0xBC}, {0xA6,0x02,0xBF}, {0xAE,0x09,0xC7}, 
+  {0xB5,0x04,0xCE}, {0xC2,0x06,0xDB}, {0xC4,0x01,0xDD}, {0xCE,0x08,0xE7}, 
+  {0xD3,0x03,0xEC}, {0xD8,0x0A,0xF1}, {0xE1,0x05,0xFA}, {0xE2,0x00,0xFB}, 
+  {0xEE,0x07,0x07}, {0xF1,0x02,0x0A}, {0xF9,0x09,0x11}
+};
+
+// -----------------------------------------------------------------------
+// object lists...
+
+xyz *obj_list[]=                // pointers to each object
+{
+  (xyz *) &cube,
+  (xyz *) &dots,
+  (xyz *) &star,
+  (xyz *) &square,
+  (xyz *) &cross
+};
+
+int point_counts[]=             // number of points in each object
+{
+  size(cube),
+  size(dots),
+  size(star),
+  size(square),
+  size(cross)
+};
+
+#define NUM_OBJECTS size(obj_list)
+
+// -----------------------------------------------------------------------
+// i love global variables :)
+
+// I hate 40 page functions with 50 levels if,and and but loop nesting
+
+char *ProgName = NULL;
+char *Version = "0.2 Beta";
+
+int x_angle = 0;                // angles of rotation in each axis
+int y_angle = 0;
+int z_angle = 0;
+
+short cos_x = 0;                // trig stuff
+short cos_y = 0;
+short cos_z = 0;
+short sin_x = 0;
+short sin_y = 0;
+short sin_z = 0;
+
+int x_off = 30;                 // world space position of object
+int y_off = 30;
+int z_off = 150;
+
+int delta_x = 1;                // rotational speed of object
+int delta_y = 1;
+int delta_z = 1;
+
+int itters = 1;                 // number of frames till shape change
+int num_points = 0;             // number of points in object
+int obj_number = 0;
+xyz *object = NULL;             // pointer to current object
+
+xy trail_1[125];                // frame histories
+xy trail_2[125];
+xy trail_3[125];
+
+char *p_buff;                   // addr of pel buffer ( see draw_point() )
+
+// -----------------------------------------------------------------------
+//
+
+modifier w1 =                   // changes x rotation speed
+{
+   30,                          // count down counter
+   34,                          // reset value for countdown counter
+   &delta_x,                    // item to modify on count = 0
+   2,                           // ammount to add to item
+   8,                           // upper limit for item
+   0,                           // lower limit for item
+};
+
+modifier w2 =                   // changes y rotation speed
+{
+  20, 20, &delta_y, -1, 6, 0
+};
+
+modifier w3 =                   // changes z rotation speed
+{
+  30, 30, &delta_z, 1, 7, 0
+};
+
+modifier w4 =                   // zooms object in / out of window
+{
+  4, 4, &z_off, -2, 200, 90
+};
+
+// modifier w5 =                // these two do some funky things with
+// {                            // object space but they tend to make
+//   10,10,&x_off,-3,30,10      // the objects small and look further
+// };                           // away so im not using them
+//
+// modifier w6 =                // but go ahead and take a look at what
+// {                            // they do :)
+//   10,30,&y_off,-5,30,10
+// };
+
+// -----------------------------------------------------------------------
+// draw a point at x/y in specified colour
+
+void draw_point(int x, int y, int c)
+{
+  char *p;
+
+  if(x != -1)                   // is point clipped ?
+  {
+    c <<= 1;                    // adjust c for xpm lookup of colour
+    p = p_buff + (x + (MASK_WIDTH * y));
+
+    if (*p > c)                 // if pel at *p is higher its darker so
+    {                           // its ok to overwrite it
+      *p = c;                   // remember pel colour at this position
+      copyXPMArea(c, 65, PEL_SIZE, PEL_SIZE, x, y);
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+// Erase previously drawn point (draw again in BLACK!!!)
+
+void erase_point(int x, int y)
+{
+  if(x != -1)                   // is point clipped?
+  {
+    copyXPMArea(34, 65, PEL_SIZE, PEL_SIZE, x, y);
+  }
+}
+
+// -----------------------------------------------------------------------
+// Process pending X events
+
+void do_pending(void)
+{
+  XEvent Event;
+
+  while (XPending(display))             // for all pending events do...
+  {
+    XNextEvent(display, &Event);        // get event type
+
+    switch (Event.type)                 // we are only interested in...
+    {
+      case Expose:                      // expose events and...
+        RedrawWindow();
+      break;
+
+      case DestroyNotify:               // our own "pending" demise :)
+        XCloseDisplay(display);
+        exit(0);
+      break;
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+// clear frame history buffers
+
+void clear_histories(void)
+{
+  int i = MAX_POINTS;
+
+  while (i--)                           // for loops suck
+  {
+    trail_1[i].x = trail_1[i].y = -1;   // -1 = invalid coordinate
+    trail_2[i].x = trail_2[i].y = -1;   // draw_point() ignores -1
+    trail_3[i].x = trail_3[i].y = -1;
+  }
+}
+
+// -----------------------------------------------------------------------
+// erase points that are 3 frames old. shift frame histories
+
+void do_trails(void)
+{
+  int i = MAX_POINTS;
+
+  while (i--)
+  {
+    erase_point(trail_3[i].x, trail_3[i].y);
+
+    trail_3[i].x = trail_2[i].x;        // shift points within history
+    trail_2[i].x = trail_1[i].x;        //  buffers
+    trail_1[i].x = -1;
+
+    trail_3[i].y = trail_2[i].y;
+    trail_2[i].y = trail_1[i].y;
+    trail_1[i].y = -1;
+  }
+}
+
+// -----------------------------------------------------------------------
+// pre calculate sin and cosine values for x y and z angles of rotation
+
+void sincos(void)
+{
+  sin_x = sin_tab[x_angle];
+  sin_y = sin_tab[y_angle];
+  sin_z = sin_tab[z_angle];
+
+  cos_x = sin_tab[adjust(x_angle)];
+  cos_y = sin_tab[adjust(y_angle)];
+  cos_z = sin_tab[adjust(z_angle)];
+}
+
+// -----------------------------------------------------------------------
+// roatate object about x y and z axis (in object space)
+
+void rotate(int *px, int *py, int *pz)
+{
+  int tx, ty, tz;                       // temp store
+
+  if (x_angle)                          // rotate point about x axis...
+  {
+    ty = (*py * cos_x) - (*pz * sin_x);
+    tz = (*py * sin_x) + (*pz * cos_x);
+
+    *py = (ty >> 14);                   // sin table is scaled up so we
+    *pz = (tz >> 14);                   // must re scale all results down
+  }
+
+  if (y_angle)                          // rotate point about y axis
+  {
+    tx = (*px * cos_y) - (*pz * sin_y);
+    tz = (*px * sin_y) + (*pz * cos_y);
+
+    *px = (tx >> 14);
+    *pz = (tz >> 14);
+  }
+
+  if (z_angle)                          // rotate point about z axis
+  {
+    tx = (*px * cos_z) - (*py * sin_z);
+    ty = (*px * sin_z) + (*py * cos_z);
+
+    *px = (tx >> 14);
+    *py = (ty >> 14);
+  }
+}
+
+// -----------------------------------------------------------------------
+// project point in 3d space onto plane in 2d space
+
+void project(int px, int py, int pz, int *x, int *y)
+{
+  int tx, ty;                   // temp store...
+
+  *x = *y = -1;                 // assume point is clipped
+
+  if ((z_off + pz - 5) < 0)
+  {
+    return;
+  }
+
+  ty = ((y_off * py) / (z_off + pz)) + 30;
+
+  if ((ty > 5) && (ty < 59))
+  {
+    tx = ((x_off * px) / (z_off + pz)) + 30;
+
+    if ((tx > 5) && (tx < 59))
+    {
+      *x = tx;
+      *y = ty;
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+// draw one frame of object...
+
+void do_frame(void)
+{
+  int px, py, pz;               // 3d coordinates to rotate
+  int x, y, c;                  // 2d coordiantes of point and colour
+  int i = num_points;           // loop counter
+  int j = MASK_SIZE;
+  char pel_buff[MASK_SIZE];     // frame buffer ( see draw_point() )
+  p_buff = &pel_buff[0];
+
+  while (j--)                   // erase pel buffer
+  {
+    pel_buff[j] = 32;
+  }
+
+  do_trails();                  // clear pels that are 3 frames old
+  sincos();                     // calculate all sin/cos values
+
+  while(i--)
+  {
+    px = object[i].x;           // collect point from object
+    py = object[i].y;
+    pz = object[i].z;
+
+    rotate(&px, &py, &pz);      // rotate this point about x/y and z axis
+    project(px, py, pz, &x, &y); // projection = convert xyz to xy
+
+    trail_1[i].x = x;           // store frame history for all pels
+    trail_1[i].y = y;           //  of this frame
+
+    c = (((z_off - 90) / 14) & 15) < 1;
+    c -= ((-pz / 5) - 10);
+
+    draw_point(x, y, c);
+  }
+}
+
+// -----------------------------------------------------------------------
+// adjust rotational speeds / distance between min and max for each
+
+void modify(modifier *mod)
+{
+  mod->counter--;
+
+  if (!mod->counter)
+  {
+    mod->counter = mod->reset;
+
+    *mod->ptr += mod->delta;
+
+    if (*mod->ptr >= mod->upper || *mod->ptr <= mod->lower)
+    {
+      mod->delta = -(mod->delta);
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+// do the above on each of the 4 modifiers
+
+void do_deltas(void)
+{
+  modify(&w1);                  // modify x rotational speed
+  modify(&w2);                  // modify y rotational speed
+  modify(&w3);                  // modify z rotational speed
+  modify(&w4);                  // zoom object in and out
+//  modify(&w5);		  // not used because they make objects
+//  modify(&w6);		  // stay in the distance
+}
+
+// -----------------------------------------------------------------------
+// adjust x y and z angles of ritation for next frame
+
+void change_angles(void)
+{
+  x_angle += delta_x;
+  y_angle += delta_y;
+  z_angle += delta_z;
+
+  x_angle &= 0x1ff;
+  y_angle &= 0x1ff;
+  z_angle &= 0x1ff;
+}
+
+// -----------------------------------------------------------------------
+
+void do_demo(void)
+{
+  while (1)                     // only way out is to die
+  {
+    while(--itters)             // countdown to next shape change...
+    {                           //   shape change FORCED on entry
+      change_angles();          // adjust angles of rotation
+      do_frame();               // draw object
+      do_deltas();              // modify rotation speeds etc
+
+      RedrawWindow();           // lets see what weve drawn...
+      do_pending();             // quit / expose
+      usleep(50000);            // erm... coders never sleep :)
+    }
+
+    itters = 2500;              // should randomise this
+
+    object = obj_list[obj_number];
+    num_points = point_counts[obj_number++];
+
+    if (obj_number == NUM_OBJECTS)
+    {
+      obj_number = 0;
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+// display version info and credits
+
+void credits(void)
+{
+  printf("\n");
+  printf("WM-Dots DEMO? version %s\n",Version);
+  printf("    by Mark I Manning IV\n\n");
+  printf("greets to follow soon....\n\n");
+}
+
+// sgore for helping me get star office :)
+
+// -----------------------------------------------------------------------
+// scan command line args
+
+void scan_args(int argc,char **argv)
+{
+  int i;
+
+  for (i = 0; i < argc; i++)
+  {
+    char *arg = argv[i];
+
+    if (*arg == '-')
+    {
+      switch (arg[1])
+      {
+        case 'v':
+          credits();
+          exit(0);
+        break;
+
+        default:
+          ;
+        break;
+      }
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+// main at BOTTOM of source so we have no EVIL forward refs!!
+
+int main(int argc, char *argv[])
+{
+  char mask[MASK_SIZE];
+
+  ProgName = argv[0];
+  if (strlen(ProgName) >= 5)
+  {
+     ProgName += (strlen(ProgName) - 5);
+  }
+
+  scan_args(argc, argv);
+
+  createXBMfromXPM(mask, master_xpm, MASK_WIDTH, MASK_HEIGHT);
+  openXwindow(argc, argv, master_xpm, mask, MASK_WIDTH, MASK_HEIGHT);
+
+  clear_histories();            // clear frame history buffers
+  do_demo();                    // main = short and sweet :)
+
+  return(0);                    // never gets executed but lets get rid
+}                               //  of that stupid warning :)
+
+// =======================================================================
diff --git a/wmdots/wmdots/wmdots.o b/wmdots/wmdots/wmdots.o
new file mode 100644
index 0000000000000000000000000000000000000000..dac6233effbd6d742c89c69a9171015e368735fb
GIT binary patch
literal 53132
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%0AB{l
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

literal 0
HcmV?d00001

diff --git a/wmdots/wmgeneral/list.c b/wmdots/wmgeneral/list.c
new file mode 100644
index 0000000..f804b2c
--- /dev/null
+++ b/wmdots/wmgeneral/list.c
@@ -0,0 +1,169 @@
+/* Generic single linked list to keep various information 
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+
+
+Author: Kresten Krab Thorup
+
+Many modifications by Alfredo K. Kojima
+ 
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, if you link this library with files compiled with
+   GCC to produce an executable, this does not cause the resulting executable
+   to be covered by the GNU General Public License. This exception does not
+   however invalidate any other reasons why the executable file might be
+   covered by the GNU General Public License.  */
+
+#include "list.h"
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <stdlib.h>
+
+/* Return a cons cell produced from (head . tail) */
+
+INLINE LinkedList* 
+list_cons(void* head, LinkedList* tail)
+{
+  LinkedList* cell;
+
+  cell = (LinkedList*)malloc(sizeof(LinkedList));
+  cell->head = head;
+  cell->tail = tail;
+  return cell;
+}
+
+/* Return the length of a list, list_length(NULL) returns zero */
+
+INLINE int
+list_length(LinkedList* list)
+{
+  int i = 0;
+  while(list)
+    {
+      i += 1;
+      list = list->tail;
+    }
+  return i;
+}
+
+/* Return the Nth element of LIST, where N count from zero.  If N 
+   larger than the list length, NULL is returned  */
+
+INLINE void*
+list_nth(int index, LinkedList* list)
+{
+  while(index-- != 0)
+    {
+      if(list->tail)
+	list = list->tail;
+      else
+	return 0;
+    }
+  return list->head;
+}
+
+/* Remove the element at the head by replacing it by its successor */
+
+INLINE void
+list_remove_head(LinkedList** list)
+{
+  if (!*list) return;  
+  if ((*list)->tail)
+    {
+      LinkedList* tail = (*list)->tail; /* fetch next */
+      *(*list) = *tail;		/* copy next to list head */
+      free(tail);			/* free next */
+    }
+  else				/* only one element in list */
+    {
+      free(*list);
+      (*list) = 0;
+    }
+}
+
+
+/* Remove the element with `car' set to ELEMENT */
+/*
+INLINE void
+list_remove_elem(LinkedList** list, void* elem)
+{
+  while (*list)
+    {
+      if ((*list)->head == elem)
+        list_remove_head(list);
+      *list = (*list ? (*list)->tail : NULL);
+    }
+}*/
+
+INLINE LinkedList *
+list_remove_elem(LinkedList* list, void* elem)
+{
+    LinkedList *tmp;
+    
+    if (list) {
+	if (list->head == elem) {
+	    tmp = list->tail;
+	    free(list);
+	    return tmp;
+	}
+	list->tail = list_remove_elem(list->tail, elem);
+	return list;
+    }
+    return NULL;
+}
+
+
+/* Return element that has ELEM as car */
+
+INLINE LinkedList*
+list_find(LinkedList* list, void* elem)
+{
+  while(list)
+    {
+    if (list->head == elem)
+      return list;
+    list = list->tail;
+    }
+  return NULL;
+}
+
+/* Free list (backwards recursive) */
+
+INLINE void
+list_free(LinkedList* list)
+{
+  if(list)
+    {
+      list_free(list->tail);
+      free(list);
+    }
+}
+
+/* Map FUNCTION over all elements in LIST */
+
+INLINE void
+list_mapcar(LinkedList* list, void(*function)(void*))
+{
+  while(list)
+    {
+      (*function)(list->head);
+      list = list->tail;
+    }
+}
diff --git a/wmdots/wmgeneral/list.h b/wmdots/wmgeneral/list.h
new file mode 100644
index 0000000..af0f22c
--- /dev/null
+++ b/wmdots/wmgeneral/list.h
@@ -0,0 +1,59 @@
+/* Generic single linked list to keep various information 
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+
+Author: Kresten Krab Thorup
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, if you link this library with files compiled with
+   GCC to produce an executable, this does not cause the resulting executable
+   to be covered by the GNU General Public License. This exception does not
+   however invalidate any other reasons why the executable file might be
+   covered by the GNU General Public License.  */
+
+#ifndef __LIST_H_
+#define __LIST_H_
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+# define INLINE inline
+#else
+# define INLINE
+#endif
+
+typedef struct LinkedList {
+  void *head;
+  struct LinkedList *tail;
+} LinkedList;
+
+INLINE LinkedList* list_cons(void* head, LinkedList* tail);
+
+INLINE int list_length(LinkedList* list);
+
+INLINE void* list_nth(int index, LinkedList* list);
+
+INLINE void list_remove_head(LinkedList** list);
+
+INLINE LinkedList *list_remove_elem(LinkedList* list, void* elem);
+
+INLINE void list_mapcar(LinkedList* list, void(*function)(void*));
+
+INLINE LinkedList*list_find(LinkedList* list, void* elem);
+
+INLINE void list_free(LinkedList* list);
+
+#endif
diff --git a/wmdots/wmgeneral/list.o b/wmdots/wmgeneral/list.o
new file mode 100644
index 0000000000000000000000000000000000000000..c973d732f852deccc98db9864d7fdba788ae03b3
GIT binary patch
literal 1436
zcma)6&1(}u6rUukrWz&I(ux*IL28P+BvFei3WYWnsuXL8Af=XVGX2nek)0Iv;vw!~
z83KZTgEx;JJT9alx%N<mUc3m=6jW$Sk;3}k?o6_t^uf#T{oZ@?-prfXyh`7{8wdo5
zlmH2l9wQ_X^di??h?C>wm`rssYkjTnL?31NLYUVg^^M)9;r5~9IM!LKqBLlG{z<C|
zIXoLq+U6z;Pw<C|xmi1CHLZR0ry~%WssDD^xi<|qO8A6g+O@u<-HEuo{ykuHIB7K-
z>!jPO7UmbsZI<Hq6tl&Kd4SI;R>;aI(0|Tt-x+Lt7{v{OC*yiP9Yrd3<o53FI~{>y
zV_K-z&kZc$EwFxehOGVi#=!%}P`oouD%R&tFlqPB)vZy(8fP$n*SY3w@p&i|HMeU&
zdbvCu=Glm8vlCjB^?3)~OWN*y>N^8CLZ~r-6-2}CUid=0)g)m&0SMktBB>^lNTw$z
zZ^h!%v)Qp&O4V+tsaR6ew1k!zkHsrhTBQZ58+42i)p${4`Vt_kdblbrMxQgHLaORn
zd7bG*T`~-!mdcD0HCHYcX^COK|CIBPhx>G=4mbh&%=fUOz)?m(`&`TW$sZx)CYX3u
zOjm?`S?~}b%6nfe<d}zoGr_h0${U9q|4YVt1K^V)%ijivv@vD_fnjz<#!iDr_Qc>f
z2&B7Ny&9M=J}Eb9!=e~CaR#_=JO|DOxxd~Q2)qWL6xmmDiGIIAemT;Q`1hBM+}{DY
z(tTszI)62c!{zuS1h+dR_(i~enAC_bj^~JjVr&o;<M=;<GrcPK9l!$UjNr3?QgD3+
z^dsmLD6Y=~9)eyGyaE`9Z4L|m5^xImCBaEy&0uPdtmJa3MR>-QwF1qnt`}&@AVs}U
zDCay!ftFU-s%Mv^QKiN5I$d0)dY&v-DfPm_3tv~!a}@PTPOp0Q@>(e`EL?!^DhL<)
b7V#t@?*wiMY$Ki`<T30!2oGrq5%T^3o4hEt

literal 0
HcmV?d00001

diff --git a/wmdots/wmgeneral/misc.c b/wmdots/wmgeneral/misc.c
new file mode 100644
index 0000000..34281e2
--- /dev/null
+++ b/wmdots/wmgeneral/misc.c
@@ -0,0 +1,164 @@
+/* dock.c- built-in Dock module for WindowMaker
+ * 
+ *  WindowMaker window manager
+ * 
+ *  Copyright (c) 1997 Alfredo K. Kojima
+ * 
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "list.h"
+#include "misc.h"
+
+/*
+ *----------------------------------------------------------------------
+ * parse_command--
+ * 	Divides a command line into a argv/argc pair.
+ *---------------------------------------------------------------------- 
+ */
+#define PRC_ALPHA	0
+#define PRC_BLANK	1
+#define PRC_ESCAPE	2
+#define PRC_DQUOTE	3
+#define PRC_EOS		4
+#define PRC_SQUOTE	5
+
+typedef struct {
+    short nstate;
+    short output;
+} DFA;
+
+
+static DFA mtable[9][6] = {
+    {{3,1},{0,0},{4,0},{1,0},{8,0},{6,0}},
+    {{1,1},{1,1},{2,0},{3,0},{5,0},{1,1}},
+    {{1,1},{1,1},{1,1},{1,1},{5,0},{1,1}},
+    {{3,1},{5,0},{4,0},{1,0},{5,0},{6,0}},
+    {{3,1},{3,1},{3,1},{3,1},{5,0},{3,1}},
+    {{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */
+    {{6,1},{6,1},{7,0},{6,1},{5,0},{3,0}},
+    {{6,1},{6,1},{6,1},{6,1},{5,0},{6,1}},
+    {{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */
+};
+
+char*
+next_token(char *word, char **next)
+{
+    char *ptr;
+    char *ret, *t;
+    int state, ctype;
+
+    t = ret = malloc(strlen(word)+1);
+    ptr = word;
+    
+    state = 0;
+    *t = 0;
+    while (1) {
+	if (*ptr==0) 
+	    ctype = PRC_EOS;
+	else if (*ptr=='\\')
+	    ctype = PRC_ESCAPE;
+	else if (*ptr=='"')
+	    ctype = PRC_DQUOTE;
+	else if (*ptr=='\'')
+	    ctype = PRC_SQUOTE;
+	else if (*ptr==' ' || *ptr=='\t')
+	    ctype = PRC_BLANK;
+	else
+	    ctype = PRC_ALPHA;
+
+	if (mtable[state][ctype].output) {
+	    *t = *ptr; t++;
+	    *t = 0;
+	}
+	state = mtable[state][ctype].nstate;
+	ptr++;
+	if (mtable[state][0].output<0) {
+	    break;
+	}
+    }
+
+    if (*ret==0)
+	t = NULL;
+    else
+	t = strdup(ret);
+
+    free(ret);
+    
+    if (ctype==PRC_EOS)
+	*next = NULL;
+    else
+	*next = ptr;
+    
+    return t;
+}
+
+
+extern void
+parse_command(char *command, char ***argv, int *argc)
+{
+    LinkedList *list = NULL;
+    char *token, *line;
+    int count, i;
+
+    line = command;
+    do {
+	token = next_token(line, &line);
+	if (token) {	    
+	    list = list_cons(token, list);
+	}
+    } while (token!=NULL && line!=NULL);
+
+    count = list_length(list);
+    *argv = malloc(sizeof(char*)*count);
+    i = count;
+    while (list!=NULL) {
+	(*argv)[--i] = list->head;
+	list_remove_head(&list);
+    }
+    *argc = count;
+}
+
+extern pid_t
+execCommand(char *command)
+{
+    pid_t pid;
+    char **argv;
+    int argc;
+
+    parse_command(command, &argv, &argc);
+    
+    if (argv==NULL) {
+        return 0;
+    }
+    
+    if ((pid=fork())==0) {
+        char **args;
+        int i;
+        
+        args = malloc(sizeof(char*)*(argc+1));
+        if (!args)
+          exit(10);
+        for (i=0; i<argc; i++) {
+            args[i] = argv[i];
+        }
+        args[argc] = NULL;
+        execvp(argv[0], args);
+        exit(10);
+    }
+    return pid;
+}
diff --git a/wmdots/wmgeneral/misc.h b/wmdots/wmgeneral/misc.h
new file mode 100644
index 0000000..602e1b7
--- /dev/null
+++ b/wmdots/wmgeneral/misc.h
@@ -0,0 +1,9 @@
+#ifndef __MISC_H
+#define __MISC_H
+
+#include <unistd.h>
+
+extern void parse_command(char *, char ***, int *);
+
+extern pid_t execCommand(char *);
+#endif /* __MISC_H */
diff --git a/wmdots/wmgeneral/misc.o b/wmdots/wmgeneral/misc.o
new file mode 100644
index 0000000000000000000000000000000000000000..be0d111acfc9684b249fc14e6f77d486b212fd2b
GIT binary patch
literal 2036
zcma)6U1(c%6hBGs+N`Tx?S>T;jXrD{!X+s>jT<tocV#%GTG~Bm4QcZ4+ASX?xwlj>
ztZ-M@_3mO|AoEGzMcIP`r4Md2F4l*^2Et^beGvu`{GOM3A)ep;SUyznz(42w&iDV^
z^UoRO_|Z@(L;-~;LTyCkL_EurE{oFu^#`slpEiEbe;hn9GiA<3_4@C|_m{}|ti|-}
z$A8{<<&MLW(J-ox@m+HBT0iOa;kO?+dsB<9OB~*Op|-mHy0&XQ4Dht2?xWT1#~Gt&
zbH9i8Gu{C_>fxBWV|9C{*1wK6o8jbbOFDLSD`H6(=k-sKh}6DwqZ3?g_vhyTkFvwO
ze)tR5R$Vm}XZ0D<`jV~Y9^)?e%!*03QEtv?bSeIlv>{U&Y#<Faqt-GpG7^Sui94^o
zk>1>>x%Yn<_gA6~#fG1uIM%FVeX<WguiH~C%?a|aT~QxoRZFwIl7?b)RlVwv_BB^#
zy*ILJ3@qs~GI);W^q>(oe$(qQy=s#hx2kpx^LUXBX4ssz%@JeoMUFZVl!BkOWh%o)
z!V<UKZn=NA-{F}lz3y0iZ%eT!TUxX$MoM03p7PsRyQ|H56FG8qEA02Y!7Z=d)&|&c
zYQS|&-ZWowQrD|Pre>ScyM}b(`P5f${lSxMNO~{^Q?XkKzfurbGk$hQxw!$af1zL-
zu`c-FQ9gaH9AX?Id{k@;HpJ6({|0*GfgI$4j6BeH9_WFw!YuxS`q+kpR{-w$dvah4
z^x*%M2loKsPKl(PNCHfZk3SoWPrN*RAT}nao|4C6$y6$pNF@%&;!9;w7I~4Whyz4&
z<;{YcnPaY&J-!e~s#sA;W>?vhav3#4@?51ta<QZelCz~kK@?Tg`=9g>`=L+F3v`6f
zG50kA5e<8c9%H`Km%;KpB)mY}74euo<R^TL?*{sSbKUYp_c!Ltm<jv?zm-7n?Z^i@
z$fxsP34VKBi}!=tpu>Cu8TdT=@i6aEV7s3+ouw`_Q0{rPbHKl240N8CVUm@Y0S@}Z
zY#?{$`<4e;V_iT&-2ex?Q!mjkUHga~?W9Oo1=N$=*|mK_H0lG)8e88<5qFc@nh1aG
zM|_CFBOK8=E8Hv5c6aZY>cP(ebDJMAL;Ud``%Dj>>%kSqmpJ}C=7>MjV?W!2jUG&e
z#Y$Gr(#dRgEX`}bw3rt;necM*f{Of5(rW3nC{iJl&zG{4PV*zmX-hO;7J`;C<%&R9
zAydpzezBr5C{{cvFN!DC1y3%ELTOo~7eppUVnt-f{gC-m`7|pQRad*bM2~WR;Q^v|
zn1^`$@B92ipMMGaE~0P12Z`c*_b@NdA@CuhSHX7^<-j@51#tcl4e<Lo4t#{@C*L0C
Q<qYp3N`mu)IOOBM0Y5XY1poj5

literal 0
HcmV?d00001

diff --git a/wmdots/wmgeneral/wmgeneral.c b/wmdots/wmgeneral/wmgeneral.c
new file mode 100644
index 0000000..c7d69ed
--- /dev/null
+++ b/wmdots/wmgeneral/wmgeneral.c
@@ -0,0 +1,479 @@
+/*
+	Best viewed with vim5, using ts=4
+
+	wmgeneral was taken from wmppp.
+
+	It has a lot of routines which most of the wm* programs use.
+
+	------------------------------------------------------------
+
+	Author: Martijn Pieterse ([email protected])
+
+	---
+	CHANGES:
+    ---
+    14/09/1998 (Dave Clark, [email protected])
+        * Updated createXBMfromXPM routine
+        * Now supports >256 colors
+	11/09/1998 (Martijn Pieterse, [email protected])
+		* Removed a bug from parse_rcfile. You could
+		  not use "start" in a command if a label was 
+		  also start.
+		* Changed the needed geometry string.
+		  We don't use window size, and don't support
+		  negative positions.
+	03/09/1998 (Martijn Pieterse, [email protected])
+		* Added parse_rcfile2
+	02/09/1998 (Martijn Pieterse, [email protected])
+		* Added -geometry support (untested)
+	28/08/1998 (Martijn Pieterse, [email protected])
+		* Added createXBMfromXPM routine
+		* Saves a lot of work with changing xpm's.
+	02/05/1998 (Martijn Pieterse, [email protected])
+		* changed the read_rc_file to parse_rcfile, as suggested by Marcelo E. Magallon
+		* debugged the parse_rc file.
+	30/04/1998 (Martijn Pieterse, [email protected])
+		* Ripped similar code from all the wm* programs,
+		  and put them in a single file.
+
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#include <X11/Xlib.h>
+#include <X11/xpm.h>
+#include <X11/extensions/shape.h>
+
+#include "wmgeneral.h"
+
+  /*****************/
+ /* X11 Variables */
+/*****************/
+
+int			screen;
+int			x_fd;
+int			d_depth;
+XSizeHints	mysizehints;
+XWMHints	mywmhints;
+Pixel		back_pix, fore_pix;
+char		*Geometry = "";
+GC			NormalGC;
+XpmIcon		wmgen;
+Pixmap		pixmask;
+
+  /*****************/
+ /* Mouse Regions */
+/*****************/
+
+typedef struct {
+	int		enable;
+	int		top;
+	int		bottom;
+	int		left;
+	int		right;
+} MOUSE_REGION;
+
+MOUSE_REGION	mouse_region[MAX_MOUSE_REGION];
+
+  /***********************/
+ /* Function Prototypes */
+/***********************/
+
+static void GetXPM(XpmIcon *, char **);
+static Pixel GetColor(char *);
+void RedrawWindow(void);
+void AddMouseRegion(int, int, int, int, int);
+int CheckMouseRegion(int, int);
+
+/*******************************************************************************\
+|* parse_rcfile																   *|
+\*******************************************************************************/
+
+void parse_rcfile(const char *filename, rckeys *keys) {
+
+	char	*p,*q;
+	char	temp[128];
+	char	*tokens = " :\t\n";
+	FILE	*fp;
+	int		i,key;
+
+	fp = fopen(filename, "r");
+	if (fp) {
+		while (fgets(temp, 128, fp)) {
+			key = 0;
+			q = strdup(temp);
+			q = strtok(q, tokens);
+			while (key >= 0 && keys[key].label) {
+				if ((!strcmp(q, keys[key].label))) {
+					p = strstr(temp, keys[key].label);
+					p += strlen(keys[key].label);
+					p += strspn(p, tokens);
+					if ((i = strcspn(p, "#\n"))) p[i] = 0;
+					free(*keys[key].var);
+					*keys[key].var = strdup(p);
+					key = -1;
+				} else key++;
+			}
+			free(q);
+		}
+		fclose(fp);
+	}
+}
+
+/*******************************************************************************\
+|* parse_rcfile2															   *|
+\*******************************************************************************/
+
+void parse_rcfile2(const char *filename, rckeys2 *keys) {
+
+	char	*p;
+	char	temp[128];
+	char	*tokens = " :\t\n";
+	FILE	*fp;
+	int		i,key;
+	char	*family = NULL;
+
+	fp = fopen(filename, "r");
+	if (fp) {
+		while (fgets(temp, 128, fp)) {
+			key = 0;
+			while (key >= 0 && keys[key].label) {
+				if ((p = strstr(temp, keys[key].label))) {
+					p += strlen(keys[key].label);
+					p += strspn(p, tokens);
+					if ((i = strcspn(p, "#\n"))) p[i] = 0;
+					free(*keys[key].var);
+					*keys[key].var = strdup(p);
+					key = -1;
+				} else key++;
+			}
+		}
+		fclose(fp);
+	}
+	free(family);
+}
+
+
+/*******************************************************************************\
+|* GetXPM																	   *|
+\*******************************************************************************/
+
+static void GetXPM(XpmIcon *wmgen, char *pixmap_bytes[]) {
+
+	XWindowAttributes	attributes;
+	int					err;
+
+	/* For the colormap */
+	XGetWindowAttributes(display, Root, &attributes);
+
+	wmgen->attributes.valuemask |= (XpmReturnPixels | XpmReturnExtensions);
+
+	err = XpmCreatePixmapFromData(display, Root, pixmap_bytes, &(wmgen->pixmap),
+					&(wmgen->mask), &(wmgen->attributes));
+	
+	if (err != XpmSuccess) {
+		fprintf(stderr, "Not enough free colorcells.\n");
+		exit(1);
+	}
+}
+
+/*******************************************************************************\
+|* GetColor																	   *|
+\*******************************************************************************/
+
+static Pixel GetColor(char *name) {
+
+	XColor				color;
+	XWindowAttributes	attributes;
+
+	XGetWindowAttributes(display, Root, &attributes);
+
+	color.pixel = 0;
+	if (!XParseColor(display, attributes.colormap, name, &color)) {
+		fprintf(stderr, "wm.app: can't parse %s.\n", name);
+	} else if (!XAllocColor(display, attributes.colormap, &color)) {
+		fprintf(stderr, "wm.app: can't allocate %s.\n", name);
+	}
+	return color.pixel;
+}
+
+/*******************************************************************************\
+|* flush_expose																   *|
+\*******************************************************************************/
+
+static int flush_expose(Window w) {
+
+	XEvent 		dummy;
+	int			i=0;
+
+	while (XCheckTypedWindowEvent(display, w, Expose, &dummy))
+		i++;
+
+	return i;
+}
+
+/*******************************************************************************\
+|* RedrawWindow																   *|
+\*******************************************************************************/
+
+void RedrawWindow(void) {
+	
+	flush_expose(iconwin);
+	XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, 
+				0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0);
+	flush_expose(win);
+	XCopyArea(display, wmgen.pixmap, win, NormalGC,
+				0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0);
+}
+
+/*******************************************************************************\
+|* RedrawWindowXY															   *|
+\*******************************************************************************/
+
+void RedrawWindowXY(int x, int y) {
+	
+	flush_expose(iconwin);
+	XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, 
+				x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0);
+	flush_expose(win);
+	XCopyArea(display, wmgen.pixmap, win, NormalGC,
+				x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0);
+}
+
+/*******************************************************************************\
+|* AddMouseRegion															   *|
+\*******************************************************************************/
+
+void AddMouseRegion(int index, int left, int top, int right, int bottom) {
+
+	if (index < MAX_MOUSE_REGION) {
+		mouse_region[index].enable = 1;
+		mouse_region[index].top = top;
+		mouse_region[index].left = left;
+		mouse_region[index].bottom = bottom;
+		mouse_region[index].right = right;
+	}
+}
+
+/*******************************************************************************\
+|* CheckMouseRegion															   *|
+\*******************************************************************************/
+
+int CheckMouseRegion(int x, int y) {
+
+	int		i;
+	int		found;
+
+	found = 0;
+
+	for (i=0; i<MAX_MOUSE_REGION && !found; i++) {
+		if (mouse_region[i].enable &&
+			x <= mouse_region[i].right &&
+			x >= mouse_region[i].left &&
+			y <= mouse_region[i].bottom &&
+			y >= mouse_region[i].top)
+			found = 1;
+	}
+	if (!found) return -1;
+	return (i-1);
+}
+
+/*******************************************************************************\
+|* createXBMfromXPM															   *|
+\*******************************************************************************/
+void createXBMfromXPM(char *xbm, char **xpm, int sx, int sy) {
+
+	int		i,j,k;
+	int		width, height, numcol, depth;
+    int 	zero=0;
+	unsigned char	bwrite;
+    int		bcount;
+    int     curpixel;
+	
+	sscanf(*xpm, "%d %d %d %d", &width, &height, &numcol, &depth);
+
+
+    for (k=0; k!=depth; k++)
+    {
+        zero <<=8;
+        zero |= xpm[1][k];
+    }
+        
+	for (i=numcol+1; i < numcol+sy+1; i++) {
+		bcount = 0;
+		bwrite = 0;
+		for (j=0; j<sx*depth; j+=depth) {
+            bwrite >>= 1;
+
+            curpixel=0;
+            for (k=0; k!=depth; k++)
+            {
+                curpixel <<=8;
+                curpixel |= xpm[i][j+k];
+            }
+                
+            if ( curpixel != zero ) {
+				bwrite += 128;
+			}
+			bcount++;
+			if (bcount == 8) {
+				*xbm = bwrite;
+				xbm++;
+				bcount = 0;
+				bwrite = 0;
+			}
+		}
+	}
+}
+
+/*******************************************************************************\
+|* copyXPMArea																   *|
+\*******************************************************************************/
+
+void copyXPMArea(int x, int y, int sx, int sy, int dx, int dy) {
+
+	XCopyArea(display, wmgen.pixmap, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy);
+
+}
+
+/*******************************************************************************\
+|* copyXBMArea																   *|
+\*******************************************************************************/
+
+void copyXBMArea(int x, int y, int sx, int sy, int dx, int dy) {
+
+	XCopyArea(display, wmgen.mask, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy);
+}
+
+
+/*******************************************************************************\
+|* setMaskXY																   *|
+\*******************************************************************************/
+
+void setMaskXY(int x, int y) {
+
+	 XShapeCombineMask(display, win, ShapeBounding, x, y, pixmask, ShapeSet);
+	 XShapeCombineMask(display, iconwin, ShapeBounding, x, y, pixmask, ShapeSet);
+}
+
+/*******************************************************************************\
+|* openXwindow																   *|
+\*******************************************************************************/
+void openXwindow(int argc, char *argv[], char *pixmap_bytes[], char *pixmask_bits, int pixmask_width, int pixmask_height) {
+
+	unsigned int	borderwidth = 1;
+	XClassHint		classHint;
+	char			*display_name = NULL;
+	char			*wname = argv[0];
+	XTextProperty	name;
+
+	XGCValues		gcv;
+	unsigned long	gcm;
+
+	char			*geometry = NULL;
+
+	int				dummy=0;
+	int				i, wx, wy;
+
+	for (i=1; argv[i]; i++) {
+		if (!strcmp(argv[i], "-display")) {
+			display_name = argv[i+1];
+			i++;
+		}
+		if (!strcmp(argv[i], "-geometry")) {
+			geometry = argv[i+1];
+			i++;
+		}
+	}
+
+	if (!(display = XOpenDisplay(display_name))) {
+		fprintf(stderr, "%s: can't open display %s\n", 
+						wname, XDisplayName(display_name));
+		exit(1);
+	}
+	screen  = DefaultScreen(display);
+	Root    = RootWindow(display, screen);
+	d_depth = DefaultDepth(display, screen);
+	x_fd    = XConnectionNumber(display);
+
+	/* Convert XPM to XImage */
+	GetXPM(&wmgen, pixmap_bytes);
+
+	/* Create a window to hold the stuff */
+	mysizehints.flags = USSize | USPosition;
+	mysizehints.x = 0;
+	mysizehints.y = 0;
+
+	back_pix = GetColor("white");
+	fore_pix = GetColor("black");
+
+	XWMGeometry(display, screen, Geometry, NULL, borderwidth, &mysizehints,
+				&mysizehints.x, &mysizehints.y,&mysizehints.width,&mysizehints.height, &dummy);
+
+	mysizehints.width = 64;
+	mysizehints.height = 64;
+		
+	win = XCreateSimpleWindow(display, Root, mysizehints.x, mysizehints.y,
+				mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix);
+	
+	iconwin = XCreateSimpleWindow(display, win, mysizehints.x, mysizehints.y,
+				mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix);
+
+	/* Activate hints */
+	XSetWMNormalHints(display, win, &mysizehints);
+	classHint.res_name = wname;
+	classHint.res_class = wname;
+	XSetClassHint(display, win, &classHint);
+
+	XSelectInput(display, win, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask);
+	XSelectInput(display, iconwin, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask);
+
+	if (XStringListToTextProperty(&wname, 1, &name) == 0) {
+		fprintf(stderr, "%s: can't allocate window name\n", wname);
+		exit(1);
+	}
+
+	XSetWMName(display, win, &name);
+
+	/* Create GC for drawing */
+	
+	gcm = GCForeground | GCBackground | GCGraphicsExposures;
+	gcv.foreground = fore_pix;
+	gcv.background = back_pix;
+	gcv.graphics_exposures = 0;
+	NormalGC = XCreateGC(display, Root, gcm, &gcv);
+
+	/* ONLYSHAPE ON */
+
+	pixmask = XCreateBitmapFromData(display, win, pixmask_bits, pixmask_width, pixmask_height);
+
+	XShapeCombineMask(display, win, ShapeBounding, 0, 0, pixmask, ShapeSet);
+	XShapeCombineMask(display, iconwin, ShapeBounding, 0, 0, pixmask, ShapeSet);
+
+	/* ONLYSHAPE OFF */
+
+	mywmhints.initial_state = WithdrawnState;
+	mywmhints.icon_window = iconwin;
+	mywmhints.icon_x = mysizehints.x;
+	mywmhints.icon_y = mysizehints.y;
+	mywmhints.window_group = win;
+	mywmhints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
+
+	XSetWMHints(display, win, &mywmhints);
+
+	XSetCommand(display, win, argv, argc);
+	XMapWindow(display, win);
+
+	if (geometry) {
+		if (sscanf(geometry, "+%d+%d", &wx, &wy) != 2) {
+			fprintf(stderr, "Bad geometry string.\n");
+			exit(1);
+		}
+		XMoveWindow(display, win, wx, wy);
+	}
+}
diff --git a/wmdots/wmgeneral/wmgeneral.h b/wmdots/wmgeneral/wmgeneral.h
new file mode 100644
index 0000000..37e5411
--- /dev/null
+++ b/wmdots/wmgeneral/wmgeneral.h
@@ -0,0 +1,61 @@
+#ifndef WMGENERAL_H_INCLUDED
+#define WMGENERAL_H_INCLUDED
+
+  /***********/
+ /* Defines */
+/***********/
+
+#define MAX_MOUSE_REGION (16)
+
+  /************/
+ /* Typedefs */
+/************/
+
+typedef struct _rckeys rckeys;
+
+struct _rckeys {
+	const char	*label;
+	char		**var;
+};
+
+typedef struct _rckeys2 rckeys2;
+
+struct _rckeys2 {
+	const char	*family;
+	const char	*label;
+	char		**var;
+};
+
+typedef struct {
+	Pixmap			pixmap;
+	Pixmap			mask;
+	XpmAttributes	attributes;
+} XpmIcon;
+
+  /*******************/
+ /* Global variable */
+/*******************/
+
+Display		*display;
+Window          Root, iconwin, win;
+
+
+  /***********************/
+ /* Function Prototypes */
+/***********************/
+
+void AddMouseRegion(int index, int left, int top, int right, int bottom);
+int CheckMouseRegion(int x, int y);
+
+void openXwindow(int argc, char *argv[], char **, char *, int, int);
+void RedrawWindow(void);
+void RedrawWindowXY(int x, int y);
+
+void createXBMfromXPM(char *, char **, int, int);
+void copyXPMArea(int, int, int, int, int, int);
+void copyXBMArea(int, int, int, int, int, int);
+void setMaskXY(int, int);
+
+void parse_rcfile(const char *, rckeys *);
+
+#endif
diff --git a/wmdots/wmgeneral/wmgeneral.o b/wmdots/wmgeneral/wmgeneral.o
new file mode 100644
index 0000000000000000000000000000000000000000..c13bfc4fdf95231ad0e944e02c2fbcc14380f6fa
GIT binary patch
literal 7992
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

literal 0
HcmV?d00001

-- 
2.7.4


-- 
To unsubscribe, send mail to [email protected].
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.