[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].