07-11-2004, 12:51 PM
Enjoy!!!
Code:
'Mode7 demo for Af.Lib
'Uses AF.GammaBlock to simulate lighting
'I saw this effect on FF6(intro) on the Snes
'I remember someone asking for this so...
'Http://Rel.betterwebber.com
'Controls...
' Arrows = move
' A/Z = Scale z/height
' S/X = scale x
' D/C = scale y
' F/V = Horizon/Eyeview
DECLARE SUB AF.Smooth (Layer%, x1%, y1%, x2%, y2%)
DECLARE SUB AF.Mode7 (Layer%, x1%, y1%, x2%, y2%, Angle%, Scalex%, Scaley%, Scalez%, Horz%, camx!, camy!, Texture%(), TextureOffset%)
DECLARE SUB AF.Print (Segment%, Xpos%, Ypos%, Text$, col%)
DECLARE SUB AF.Pcopy (DestSeg%, SRCSEG%)
DECLARE SUB AF.Cls (DestSeg%, C%)
DECLARE FUNCTION MULTIKEY% (T%)
DECLARE SUB AF.Pset (DestSeg%, X%, Y%, C%)
DECLARE SUB AF.SpriteFlip (DestSeg%, X%, Y%, SPRITESEGMENT%, SPRITEOFFSET%, FlipMode%)
DECLARE SUB AF.Get (Layer%, x1%, y1%, x2%, y2%, SprSeg%, SprOff%)
DECLARE SUB AF.GammaBLock (DestSeg%, x1%, y1%, x2%, y2%, gammaval%)
DECLARE SUB AF.GradColor (col1%, r1%, g1%, b1%, col2%, r2%, g2%, b2%)
DEFINT A-Z
RANDOMIZE TIMER
TYPE KartType 'our camera
X AS SINGLE
Y AS SINGLE
dx AS SINGLE
dy AS SINGLE
Angle AS INTEGER
speed AS SINGLE
accel AS SINGLE
END TYPE
'KEY CONSTANTS
CONST KEYESC = 1, KEYENTER = 28, KEYSPACE = 57, KEYTAB = &HF
CONST KEYUP = 72, KEYDOWN = 80, KEYLEFT = 75, KEYRIGHT = 77
'Of course!!!!! :)
CONST FALSE = 0, TRUE = NOT FALSE
CONST VIDEO = &HA000
'FlipMode(for use with RelSpriteFlip)
CONST FLIPNONE = 0, FLIPH = 1, FLIPV = 2, FLIPVH = 3
'not needed but used for easy reference
CONST PI = 3.141593
CONST FRICTION = .016 'for pseudo physics
CONST TSIZE = 64 'tilesize try to change this...
CONST TSIZESQUARED = TSIZE * TSIZE
CONST MAPTILEXMAX = 128
CONST MAPMAXPIXELX = MAPTILEXMAX * TSIZE
CONST MAPTILEYMAX = 64
CONST MAPMAXPIXELY = MAPTILEYMAX * TSIZE
'$DYNAMIC
DIM SHARED Vpage%(0 TO 31999) 'our buffer
DIM SHARED Layer%
'$STATIC
DIM SHARED Lcos!(359) 'fast Lookups
DIM SHARED Lsin!(359)
DIM SHARED Texture%((((TSIZESQUARED%) + 4) \ 2)) 'calc array size for
'GET array
Layer% = VARSEG(Vpage%(0)) 'set layer address
'for reference
DIM SHARED Mario AS KartType 'needs a better name
Mario.X = MAPMAXPIXELX \ 2 'center our camera
Mario.Y = MAPMAXPIXELY \ 2
Mario.dx = 0
Mario.dy = 0
Mario.Angle = 0
Mario.accel = .1 'acceleration
Mario.speed = 0
'calc lookup tables
FOR I% = 0 TO 359
RA! = I% * (3.141593 / 180)
Lcos!(I%) = COS(RA!)
Lsin!(I%) = SIN(RA!)
NEXT I%
CLS
SCREEN 13
'Display color grad
FOR I = 0 TO 15
FOR j = 0 TO 15
LINE (j * 5, I * 5)-STEP(5, 5), (I * 16) + j, BF
NEXT j
NEXT I
'Read ending grad colors and set gradient pal
RESTORE RGB
FOR I = 0 TO 15
READ R%, G%, B%
AF.GradColor I * 16, 0, 0, 0, (I * 16) + 15, R%, G%, B%
NEXT I
C$ = INPUT$(1)
'do some nice texture
FOR Y% = 0 TO TSIZE - 1
FOR X% = 0 TO TSIZE - 1
PSET (X%, Y%), 16 + (X% XOR Y%)
NEXT X%
NEXT Y%
'duh!
GET (0, 0)-STEP(TSIZE - 1, TSIZE - 1), Texture%(0)
x1 = 0 'window dimensions for Mode7
y1 = 100
x2 = 319
y2 = 199
'GammaDDA
gi& = 16 * 256& \ ((y2 - y1) + 1)
Bright% = 1
Ceilsize% = ((100 * 320) + 4) \ 2
DIM SHARED Ceil%(Ceilsize%) 'our buffer
'mode 7 parameters
Angle = 0 'Look forward
Scalex = 200 '200 looks good
Scaley = 200
Scalez = 15 'height
Horz = 10 'eyeview
camx! = 0
camy! = 0
Dummy = MULTIKEY(-1) 'activate keyboard handler
Finished = FALSE
T# = TIMER
DO
f& = (f& + 1) AND &H7FFFFFFF
IF MULTIKEY(KEYLEFT) THEN 'rotate angle
Mario.Angle = (Mario.Angle - 1)
IF Mario.Angle < 0 THEN Mario.Angle = 360 + Mario.Angle
KoopaFrame% = 2
END IF
IF MULTIKEY(KEYRIGHT) THEN 'rotate angle
Mario.Angle = (Mario.Angle + 1)
IF Mario.Angle > 359 THEN Mario.Angle = 360 - Mario.Angle
KoopaFrame% = 3
END IF
IF MULTIKEY(KEYDOWN) THEN 'move backwards
Mario.speed = Mario.speed - Mario.accel
END IF
IF MULTIKEY(KEYUP) THEN 'move forvard
Mario.speed = Mario.speed + Mario.accel
END IF
IF MULTIKEY(&H1E) THEN 'A 'increase height
Scalez = Scalez + 1
END IF
IF MULTIKEY(&H2C) THEN 'z decrease height
Scalez = Scalez - 1
END IF
IF MULTIKEY(&H1F) THEN 's
Scalex = Scalex + 1
END IF
IF MULTIKEY(&H2D) THEN 'x
Scalex = Scalex - 1
END IF
IF MULTIKEY(&H20) THEN 'd
Scaley = Scaley + 1
END IF
IF MULTIKEY(&H2E) THEN 'c
Scaley = Scaley - 1
END IF
IF MULTIKEY(&H21) THEN 'F 'decrease eyeview
Horz = Horz + 1
y1 = y1 - 1
IF y1 < 0 THEN y1 = 0
END IF
IF MULTIKEY(&H2F) THEN 'v increase eyeview
Horz = Horz - 1
y1 = y1 + 1
IF y1 > 199 THEN y1 = 199
END IF
IF MULTIKEY(KEYENTER) THEN
Finished = TRUE
END IF
IF MULTIKEY(KEYESC) THEN
Finished = TRUE
END IF
'calc physics
Mario.speed = Mario.speed - Mario.speed * FRICTION
dx! = (Lcos!(Mario.Angle)) * Mario.speed
dy! = (Lsin!(Mario.Angle)) * Mario.speed
Mario.X = Mario.X + dx!
IF Mario.X < 0 THEN
Mario.X = 0
ELSEIF Mario.X >= MAPMAXPIXELX THEN
Mario.X = MAPMAXPIXELX
END IF
Mario.Y = Mario.Y + dy!
IF Mario.Y < 0 THEN
Mario.Y = 0
ELSEIF Mario.Y >= MAPMAXPIXELY THEN
Mario.Y = MAPMAXPIXELY
END IF
Angle% = Mario.Angle
px! = Mario.X
py! = Mario.Y
AF.Cls Layer, 0
AF.Mode7 Layer%, x1, y1, x2, y2, Angle%, Scalex, Scaley, Scalez, Horz, px!, py!, Texture%(), 0
gvs& = (-16 + Bright%) * 256
FOR I = 0 TO 99
yy = I + 100
gv% = gvs& \ 256
AF.GammaBLock Layer, 0, yy, 319, yy, gv%
gvs& = gvs& + gi&
NEXT I
AF.Get Layer, x1, y1, x2, y2, VARSEG(Ceil%(0)), VARPTR(Ceil%(0))
AF.SpriteFlip Layer, 0, 0, VARSEG(Ceil%(0)), VARPTR(Ceil%(0)), FLIPV
''WAIT &H3DA, 8
AF.Pcopy VIDEO, Layer
LOOP UNTIL Finished
Dummy = MULTIKEY(-2)
Fps% = f& / (TIMER - T#)
CLS
SCREEN 0
WIDTH 80
PRINT "FPS:"; Fps%
C$ = INPUT$(1)
'RGB colors for our Grad
RGB:
DATA 63,63,63 : 'WHITE
DATA 63,0,0 : 'RED
DATA 0,63,0 : 'GREEN
DATA 0,0,63 : 'BLUE
DATA 0,63,63 : 'BLUE/GREEN
DATA 63,63,0 : 'RED/GREEN
DATA 63,0,63 : 'RED/BLUE
DATA 32,25,63 : '
DATA 63,0,45 : '
DATA 16,63,20 : '
DATA 45,45,63 : '
DATA 63,45,20 : '
DATA 25,63,45 : '
DATA 56,63,34 : '
DATA 45,25,50 : '
DATA 63,25,11 : '
SUB AF.Cls (DestSeg%, C%)
'Clears the Layer to a specified color
'Parameters:
'Destseg=Layer or page to clear(use VARSEG or VIDEO/&HA000)
STATIC Asm.Cls%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = Asm$ + "5589E58B46088CDA8EC031FF8A460688C489C166C1E01089C8B9803EF366AB8EDA5DCA0400"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.Cls%(Size%)
DEF SEG = VARSEG(Asm.Cls%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.Cls%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
DEF SEG = VARSEG(Asm.Cls%(0))
CALL ABSOLUTE(BYVAL DestSeg%, BYVAL C%, VARPTR(Asm.Cls%(0)))
DEF SEG
Asm$ = ""
END SUB
SUB AF.GammaBLock (DestSeg%, x1%, y1%, x2%, y2%, gammaval%)
STATIC Asm.GammaBlock%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = "1E558BEC8E46126633D26652528B46108B4E0C3BC17E039090918B5E0E8B"
Asm$ = Asm$ + "560A3BDA7E04909087DA3D3F010F8FA30081FBC7000F8F9B003D00"
Asm$ = Asm$ + "007D04909033C083FB007D04909033DB83F9000F8C820083FA007C"
Asm$ = Asm$ + "7D909081F93F017E059090B93F0181FAC7007E059090BAC7002BC8"
Asm$ = Asm$ + "41894EFE2BD3428956FC86FB8BFBC1EF0203FB03F88A76FCBB4001"
Asm$ = Asm$ + "2B5EFE895EFA8A66088B4EFE268A053C00742790908AD8240F2AD8"
Asm$ = Asm$ + "02C402C33AC37708909026881DEB139080C30F3AC3720890902688"
Asm$ = Asm$ + "1DEB0490268805474975CB037EFAFECE75C183C4065D1FCA0C00"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.GammaBlock%(Size%)
DEF SEG = VARSEG(Asm.GammaBlock%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.GammaBlock%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
DEF SEG = VARSEG(Asm.GammaBlock%(0))
CALL ABSOLUTE(BYVAL DestSeg%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, BYVAL gammaval%, VARPTR(Asm.GammaBlock%(0)))
DEF SEG
Asm$ = ""
END SUB
SUB AF.Get (Layer%, x1%, y1%, x2%, y2%, SprSeg%, SprOff%)
'Same a QB's GET statement
'Paramenters:
'Layer: the Page to GET the bounding box(VARSEG/VIDEO/&HA000)
'X1.Y1,X2,Y2:Coords of the box to get the image from
'SprSeg=Segment of the array(VARSEG)
'Sproff=offset of the array (VARPTR)
STATIC Asm.Get%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = "1E558BEC8E5E148E460A8B7E086633D266528B46128B4E0E3BC17E039090"
Asm$ = Asm$ + "918B5E108B560C3BDA7E04909087DA3D3F010F8F800081FBC7007F"
Asm$ = Asm$ + "7A90903D00007D04909033C083FB007D04909033DB83F9007C6190"
Asm$ = Asm$ + "9083FA007C5A909081F93F017E059090B93F0181FAC7007E059090"
Asm$ = Asm$ + "BAC7002BC841894EFEC1E10326890D2BD3428956FC83C702268915"
Asm$ = Asm$ + "86FB8BF3C1EE0203F303F0BB40012B5EFE83C7028B4EFEC1E902F3"
Asm$ = Asm$ + "66A58B4EFE83E103F3A403F34A75EA83C4045D1FCA0E00"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.Get%(Size%)
DEF SEG = VARSEG(Asm.Get%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.Get%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
DEF SEG = VARSEG(Asm.Get%(0))
CALL ABSOLUTE(BYVAL Layer%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, BYVAL SprSeg%, BYVAL SprOff%, VARPTR(Asm.Get%(0)))
DEF SEG
Asm$ = ""
END SUB
SUB AF.GradColor (col1, r1, g1, b1, col2, r2, g2, b2)
'Makes a gradient color by interpolating the RGB values of the first
'color index (col1) and col2 by the number of cols.
'Only use this in screen 13
R! = r1
G! = g1
B! = b1
cols = (col2 - col1 + 1)
Rstep! = (r2 - r1 + 1) / cols
Gstep! = (g2 - g1 + 1) / cols
Bstep! = (b2 - b1 + 1) / cols
FOR col = col1 TO col2
R! = R! + Rstep!
G! = G! + Gstep!
B! = B! + Bstep!
IF R! > 63 THEN R! = 63
IF R! < 0 THEN R! = 0
IF G! > 63 THEN G! = 63
IF G! < 0 THEN G! = 0
IF B! > 63 THEN B! = 63
IF B! < 0 THEN B! = 0
OUT &H3C8, col
OUT &H3C9, FIX(R!)
OUT &H3C9, FIX(G!)
OUT &H3C9, FIX(B!)
NEXT col
END SUB
SUB AF.Mode7 (Layer%, x1%, y1%, x2%, y2%, Angle%, Scalex%, Scaley%, Scalez%, Horz%, camx!, camy!, Texture%(), TextureOffset%)
'Just converted my mode7 render usin List2op by Plasma
'Relsoft
STATIC Asm.Mode7%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = "C834000006571E568B4E228B561E3BCA0F8F0302"
Asm$ = Asm$ + "81F9C7000F8FF30183F9000F8CF90183FA"
Asm$ = Asm$ + "000F8CE50181FAC7000F8FFD012BD1420F"
Asm$ = Asm$ + "84D60186E98BF9C1EF0203F98B46248B5E"
Asm$ = Asm$ + "203BC30F8FE7013D3F010F8FBA013D0000"
Asm$ = Asm$ + "0F8CDD0183FB000F8CAC0181FB3F010F8F"
Asm$ = Asm$ + "DE012BD84303F8B940012BCB894ED6895E"
Asm$ = Asm$ + "D4D1EB8BC36698668946CE8956D28B4614"
Asm$ = Asm$ + "6698668946FC8B46126698668946F86633"
Asm$ = Asm$ + "C08B46188B5E1A0FAFC366C1E008668946"
Asm$ = Asm$ + "E4C746E200008E46268E5E088B76068B04"
Asm$ = Asm$ + "C1E8038946DE488946DA8B44028946DC48"
Asm$ = Asm$ + "8946D88B46DE3D020075099090C646CC01"
Asm$ = Asm$ + "EB60903D040075099090C646CC02EB5290"
Asm$ = Asm$ + "3D080075099090C646CC03EB44903D1000"
Asm$ = Asm$ + "75099090C646CC04EB36903D2000750990"
Asm$ = Asm$ + "90C646CC05EB28903D400075099090C646"
Asm$ = Asm$ + "CC06EB1A903D800075099090C646CC07EB"
Asm$ = Asm$ + "0C903D00010F85D100C646CC088B46E203"
Asm$ = Asm$ + "46166698668BD8668B46E46633D266F7FB"
Asm$ = Asm$ + "668BD8668BC86633D28B461C6698669166"
Asm$ = Asm$ + "F7F9668BC8668BD166F7DA660FAF56F866"
Asm$ = Asm$ + "8956F4660FAF4EFC66894EF0668BC3660F"
Asm$ = Asm$ + "AF5EFC660FAF56CE662BDA66895EEC668B"
Asm$ = Asm$ + "560E660156EC660FAF46F8660FAF4ECE66"
Asm$ = Asm$ + "2BC1668946E8668B4E0A66014EE88A4ECC"
Asm$ = Asm$ + "8B5ED4895EE0668B46EC66C1F8102346DA"
Asm$ = Asm$ + "668B5EE866C1FB10235ED8D3E38BF303F0"
Asm$ = Asm$ + "0376068A4404268805668B56F4668B46F0"
Asm$ = Asm$ + "660156EC660146E847FF4EE075C5037ED6"
Asm$ = Asm$ + "8B46D28346E2013946E20F8C33FF5E1F5F"
Asm$ = Asm$ + "07C9CA220087CAE9F8FD8BC22BC103C883"
Asm$ = Asm$ + "F9007CE833C9E9F7FDE9F4FDBAC700E9FD"
Asm$ = Asm$ + "FD93E915FE8BCB2BC803C13D00007CCB33"
Asm$ = Asm$ + "C0E913FEBB3F01E91CFE"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.Mode7%(Size%)
DEF SEG = VARSEG(Asm.Mode7%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.Mode7%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
'This Draws ;*)
'xRelMode7 Proc Uses es di ds si,\
' Layer:word,scalex:word, scaley:word, scalez:word, horz:word,\
' cosa: word, sina: word, camx: word, camy: word, TextSeg: word, TextOff: word
a! = (Angle% * 3.141593) / 180
cosa% = COS(a!) * 256
sina% = SIN(a!) * 256
camx& = camx! * 65536
camy& = camy! * 65536
IF Horz% < 1 THEN Horz% = 1
DEF SEG = VARSEG(Asm.Mode7%(0))
CALL ABSOLUTE(BYVAL Layer%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, BYVAL Scalex%, BYVAL Scaley%, BYVAL Scalez%, BYVAL Horz%, BYVAL cosa%, BYVAL sina%, BYVAL camx&, BYVAL camy&, BYVAL VARSEG(Texture%(TextureOffset%)), BYVAL VARPTR(Texture%( _
TextureOffset%)), VARPTR(Asm.Mode7%(0)))
DEF SEG
END SUB
SUB AF.Mode7Map (Layer%, x1%, y1%, x2%, y2%, Angle%, Scalex%, Scaley%, Scalez%, Horz%, camx!, camy!, Texture%(), TextureOffset%, Map%())
STATIC Asm.Mode7Map%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = "C834000006571E568B4E228B561E3BCA0F8F0302"
Asm$ = Asm$ + "81F9C7000F8FF30183F9000F8CF90183FA"
Asm$ = Asm$ + "000F8CE50181FAC7000F8FFD012BD1420F"
Asm$ = Asm$ + "84D60186E98BF9C1EF0203F98B46248B5E"
Asm$ = Asm$ + "203BC30F8FE7013D3F010F8FBA013D0000"
Asm$ = Asm$ + "0F8CDD0183FB000F8CAC0181FB3F010F8F"
Asm$ = Asm$ + "DE012BD84303F8B940012BCB894ED6895E"
Asm$ = Asm$ + "D4D1EB8BC36698668946CE8956D28B4614"
Asm$ = Asm$ + "6698668946FC8B46126698668946F86633"
Asm$ = Asm$ + "C08B46188B5E1A0FAFC366C1E008668946"
Asm$ = Asm$ + "E4C746E200008E46268E5E088B76068B04"
Asm$ = Asm$ + "C1E8038946DE488946DA8B44028946DC48"
Asm$ = Asm$ + "8946D88B46DE3D020075099090C646CC01"
Asm$ = Asm$ + "EB60903D040075099090C646CC02EB5290"
Asm$ = Asm$ + "3D080075099090C646CC03EB44903D1000"
Asm$ = Asm$ + "75099090C646CC04EB36903D2000750990"
Asm$ = Asm$ + "90C646CC05EB28903D400075099090C646"
Asm$ = Asm$ + "CC06EB1A903D800075099090C646CC07EB"
Asm$ = Asm$ + "0C903D00010F85D100C646CC088B46E203"
Asm$ = Asm$ + "46166698668BD8668B46E46633D266F7FB"
Asm$ = Asm$ + "668BD8668BC86633D28B461C6698669166"
Asm$ = Asm$ + "F7F9668BC8668BD166F7DA660FAF56F866"
Asm$ = Asm$ + "8956F4660FAF4EFC66894EF0668BC3660F"
Asm$ = Asm$ + "AF5EFC660FAF56CE662BDA66895EEC668B"
Asm$ = Asm$ + "560E660156EC660FAF46F8660FAF4ECE66"
Asm$ = Asm$ + "2BC1668946E8668B4E0A66014EE88A4ECC"
Asm$ = Asm$ + "8B5ED4895EE0668B46EC66C1F8102346DA"
Asm$ = Asm$ + "668B5EE866C1FB10235ED8D3E38BF303F0"
Asm$ = Asm$ + "0376068A4404268805668B56F4668B46F0"
Asm$ = Asm$ + "660156EC660146E847FF4EE075C5037ED6"
Asm$ = Asm$ + "8B46D28346E2013946E20F8C33FF5E1F5F"
Asm$ = Asm$ + "07C9CA220087CAE9F8FD8BC22BC103C883"
Asm$ = Asm$ + "F9007CE833C9E9F7FDE9F4FDBAC700E9FD"
Asm$ = Asm$ + "FD93E915FE8BCB2BC803C13D00007CCB33"
Asm$ = Asm$ + "C0E913FEBB3F01E91CFE"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.Mode7Map%(Size%)
DEF SEG = VARSEG(Asm.Mode7Map%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.Mode7Map%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
'xRelMode7map Proc Uses es di ds si,\
' Layer:word, x1:word, y1:word, x2:word, y2:word, scalex:word, scaley:word, scalez:word, horz:word,\
' cosa: word, sina: word, camx: Dword, camy: Dword, TextSeg: word, TextOff: word, Mapseg:Word, MapOff: word, xMapsize:word,yMapsize: word
a! = (Angle% * 3.141593) / 180
cosa% = COS(a!) * 256
sina% = SIN(a!) * 256
camx& = camx! * 65536
camy& = camy! * 65536
Mx% = UBOUND(Map%, 1) + 1
My% = UBOUND(Map%, 2) + 1
IF Horz% < 1 THEN Horz% = 1
DEF SEG = VARSEG(Asm.Mode7Map%(0))
CALL ABSOLUTE(BYVAL Layer%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, BYVAL Scalex%, BYVAL Scaley%, BYVAL Scalez%, BYVAL Horz%, BYVAL cosa%, BYVAL sina%, BYVAL camx&, BYVAL camy&, BYVAL VARSEG(Texture%(TextureOffset%)), BYVAL VARPTR(Texture%( _
TextureOffset%)), BYVAL VARSEG(Map%(0, 0)), BYVAL VARPTR(Map%(0, 0)), BYVAL Mx%, BYVAL My%, VARPTR(Asm.Mode7Map%(0)))
DEF SEG
END SUB
SUB AF.Pcopy (DestSeg%, SRCSEG%)
'copies the sourceseg to destseg
'this acheives double buffering to eliminate flicker
'same as QB's PCOPY command
'Parameters:
'Destseg=Layer or page to copy to(usually VIDEO)
'srcseg=the source layer to copy from
STATIC Asm.Pcopy%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = Asm$ + "5589E58CD88B4E088B56068EC18EDA31FF31F6B9803EF366A58ED85DCA0400"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.Pcopy%(Size%)
DEF SEG = VARSEG(Asm.Pcopy%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.Pcopy%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
DEF SEG = VARSEG(Asm.Pcopy%(0))
CALL ABSOLUTE(BYVAL DestSeg%, BYVAL SRCSEG%, VARPTR(Asm.Pcopy%(0)))
DEF SEG
Asm$ = ""
END SUB
SUB AF.Print (Segment%, Xpos%, Ypos%, Text$, col%)
'Prints the standard 8*8 CGA font
'Paramenters:
'Segment=the Layer to print to
'Xpos,Ypos=the coordinates of the text
'Text$=the string to print
'col= is the color to print(gradient)
X% = Xpos%
Y% = Ypos%
Spacing% = 8
FOR I% = 0 TO LEN(Text$) - 1
X% = X% + Spacing%
Offset% = 8 * ASC(MID$(Text$, I% + 1, 1)) + 14
FOR j% = 0 TO 7
DEF SEG = &HFFA6
Bit% = PEEK(Offset% + j%)
IF Bit% AND 1 THEN CALL AF.Pset(Segment%, X%, Y% + j%, col% + j%)
IF Bit% AND 2 THEN CALL AF.Pset(Segment%, X% - 1, Y% + j%, col% + j%)
IF Bit% AND 4 THEN CALL AF.Pset(Segment%, X% - 2, Y% + j%, col% + j%)
IF Bit% AND 8 THEN CALL AF.Pset(Segment%, X% - 3, Y% + j%, col% + j%)
IF Bit% AND 16 THEN CALL AF.Pset(Segment%, X% - 4, Y% + j%, col% + j%)
IF Bit% AND 32 THEN CALL AF.Pset(Segment%, X% - 5, Y% + j%, col% + j%)
IF Bit% AND 64 THEN CALL AF.Pset(Segment%, X% - 6, Y% + j%, col% + j%)
IF Bit% AND 128 THEN CALL AF.Pset(Segment%, X% - 7, Y% + j%, col% + j%)
NEXT j%
NEXT I%
DEF SEG
END SUB
SUB AF.Pset (DestSeg%, X%, Y%, C%)
'Same as QB's PSET command
'Paramenters:
'Dest seg=See AF.Box
'X,Y:coordinates of the pixel
'C:color of the pixel to draw
STATIC Asm.Pset%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = "8BC58BEC8E460A8B560683FA007C2E909081FAC7007F2690908B5E0883FB"
Asm$ = Asm$ + "007C1C909081FB3F017F14909066678D1492C1E2068BFA03FB8A4E"
Asm$ = Asm$ + "0426880D8BE8CA0800"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.Pset%(Size%)
DEF SEG = VARSEG(Asm.Pset%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.Pset%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
DEF SEG = VARSEG(Asm.Pset%(0))
CALL ABSOLUTE(BYVAL DestSeg%, BYVAL X%, BYVAL Y%, BYVAL C%, VARPTR(Asm.Pset%(0)))
DEF SEG
Asm$ = ""
END SUB
SUB AF.Smooth (Layer%, x1%, y1%, x2%, y2%)
STATIC Asm.Smooth%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = "C806000006578B4E0A8B56063BCA0F8FD30081F9C7000F8FC50083F9000F"
Asm$ = Asm$ + "8CC90083FA000F8CB70081FAC7000F8FCA002BD1420F84A80086E9"
Asm$ = Asm$ + "8BF9C1EF0203F98B460C8B5E083BC30F8FB4003D3F010F8F8C003D"
Asm$ = Asm$ + "00000F8CAA0083FB000F8C7E0081FB3F010F8FAB002BD84303F8B9"
Asm$ = Asm$ + "40012BCB894EFA8956FE895EFC8E460E8B4EFC33C033DB268A85BF"
Asm$ = Asm$ + "FE268A9D410103C3268A9DC1FE03C3268A9D3F0103C3C1E8048BD0"
Asm$ = Asm$ + "33C033DB268A85C0FE268A9D400103C3268A5DFF03C3268A5D0103"
Asm$ = Asm$ + "C3C1E80303D033C0268A05C1E80202C2268805474975AB037EFAFF"
Asm$ = Asm$ + "4EFE75A05F07C9CA0A0087CAE928FF8BC22BC103C883F9007CEA33"
Asm$ = Asm$ + "C9E927FFBAC700E930FF93E948FF8BCB2BC803C13D00007CD033C0"
Asm$ = Asm$ + "E946FFBB3F01E94FFF"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.Smooth%(Size%)
DEF SEG = VARSEG(Asm.Smooth%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.Smooth%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
DEF SEG = VARSEG(Asm.Smooth%(0))
CALL ABSOLUTE(BYVAL Layer%, BYVAL x1%, BYVAL y1%, BYVAL x2%, BYVAL y2%, VARPTR(Asm.Smooth%(0)))
DEF SEG
Asm$ = ""
END SUB
SUB AF.SpriteFlip (DestSeg%, X%, Y%, SPRITESEGMENT%, SPRITEOFFSET%, FlipMode%)
STATIC Asm.SpriteFlip%(), InitDone%
IF InitDone% = 0 THEN
Asm$ = ""
Asm$ = "C81400001E0656578E5E0A8E46108B76088B1CC1EB03895EFC895EF68B54"
Asm$ = Asm$ + "028956FA8956F4C746FE0000C746F80000C746F20000C746F00000"
Asm$ = Asm$ + "C746EC0000C746EE000083C6048B460E3D3F010F8F7E003D00000F"
Asm$ = Asm$ + "8C7F008B4E0C81F9C7007F6E909083F9000F8C800003D881FB3F01"
Asm$ = Asm$ + "0F8F88002BD803D181FAC7000F8F8E002BD1895EFC86E9BB40018B"
Asm$ = Asm$ + "F92B5EFCC1EF0203F9895EF803F8837E06010F848400837E06020F"
Asm$ = Asm$ + "84A300837E06030F84DF008B5EFC8BCB8A04460AC0740590902688"
Asm$ = Asm$ + "05474975F0037EF80376FE4A75E55F5E071FC9CA0C00F7D82BD87E"
Asm$ = Asm$ + "F203F08946FE8946EE33C0E96EFFF7D92BD17EDF894EF20376FC49"
Asm$ = Asm$ + "75FAE96EFF81EB4001015EFE895EF0BB40012BD8E968FF03CA81E9"
Asm$ = Asm$ + "C8002BD18B4EF4894EEC2956EC8B4E0CE95DFF0376F08B4EFC8BD9"
Asm$ = Asm$ + "4B2B5EEE8A000AC074059090268805474B4975F0037EF80376F64A"
Asm$ = Asm$ + "75DEEB83B940018BDA4B0FAFCB03F98B4EF68B5EF20FAFCB2BF18B"
Asm$ = Asm$ + "46F68B5EEC0FAFC303F08B4EFC8A04460AC0740590902688054749"
Asm$ = Asm$ + "75F02B7EFC81EF40010376FE4A75E0E93FFF8B4EF68BDA0FAFCB03"
Asm$ = Asm$ + "F14E8B4EF68B5EF20FAFCB2BF18B46F68B5EEC0FAFC303F02B76EE"
Asm$ = Asm$ + "8B4EFC2B76EE8A044E0AC074059090268805474975F0037EF82B76"
Asm$ = Asm$ + "F04A75E1E9F9FE"
CodeLen% = LEN(Asm$)
IF (CodeLen% MOD 2) <> 0 THEN CodeLen% = CodeLen% + 1
Size% = CodeLen% \ 4
REDIM Asm.SpriteFlip%(Size%)
DEF SEG = VARSEG(Asm.SpriteFlip%(0))
FOR I% = 0 TO CodeLen% \ 2
Byte% = VAL("&H" + MID$(Asm$, (I% * 2) + 1, 2))
POKE VARPTR(Asm.SpriteFlip%(0)) + I%, Byte%
NEXT I%
DEF SEG
InitDone% = 1
END IF
'This Draws ;*)
DEF SEG = VARSEG(Asm.SpriteFlip%(0))
CALL ABSOLUTE(BYVAL DestSeg%, BYVAL X%, BYVAL Y%, BYVAL SPRITESEGMENT%, BYVAL SPRITEOFFSET%, BYVAL FlipMode%, VARPTR(Asm.SpriteFlip%(0)))
DEF SEG
Asm$ = ""
END SUB
FUNCTION MULTIKEY (T)
'Milo Sedlacek's multikey
STATIC kbcontrol%(), kbmatrix%(), Firsttime, StatusFlag
IF Firsttime = 0 THEN 'Initalize
DIM kbcontrol%(128)
DIM kbmatrix%(128)
code$ = ""
code$ = code$ + "E91D00E93C00000000000000000000000000000000000000000000000000"
code$ = code$ + "00001E31C08ED8BE24000E07BF1400FCA5A58CC38EC0BF2400B85600FAAB"
code$ = code$ + "89D8ABFB1FCB1E31C08EC0BF2400BE14000E1FFCFAA5A5FB1FCBFB9C5053"
code$ = code$ + "51521E560657E460B401A8807404B400247FD0E088C3B700B0002E031E12"
code$ = code$ + "002E8E1E100086E08907E4610C82E661247FE661B020E6205F075E1F5A59"
code$ = code$ + "5B589DCF"
DEF SEG = VARSEG(kbcontrol%(0))
FOR I% = 0 TO 155 ' Load ASM
d% = VAL("&h" + MID$(code$, (I% * 2) + 1, 2))
POKE VARPTR(kbcontrol%(0)) + I%, d%
NEXT I%
I& = 16 ' I think this stuff connects the interrupt with kbmatrix%()
n& = VARSEG(kbmatrix%(0)): l& = n& AND 255: h& = ((n& AND &HFF00) \ 256): POKE I&, l&: POKE I& + 1, h&: I& = I& + 2
n& = VARPTR(kbmatrix%(0)): l& = n& AND 255: h& = ((n& AND &HFF00) \ 256): POKE I&, l&: POKE I& + 1, h&: I& = I& + 2
DEF SEG
Firsttime = 1
END IF
SELECT CASE T
CASE -1
IF StatusFlag = 0 THEN
DEF SEG = VARSEG(kbcontrol%(0))
CALL ABSOLUTE(0) ' Run interrupt
DEF SEG
StatusFlag = 1
END IF
CASE -2
IF StatusFlag = 1 THEN
DEF SEG = VARSEG(kbcontrol%(0)) ' Turn off interrupt
CALL ABSOLUTE(3)
DEF SEG
StatusFlag = 0
END IF
CASE 1 TO 128
MULTIKEY = kbmatrix%(T) ' Return status
CASE ELSE
MULTIKEY = 0 ' User Supidity Error
END SELECT
code$ = ""
END FUNCTION