home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Stars of Shareware: Programmierung
/
SOURCE.mdf
/
programm
/
msdos
/
c
/
playfli
/
menulib.bas
next >
Wrap
BASIC Source File
|
1994-06-28
|
7KB
|
386 lines
DECLARE SUB Writedot (x%, y%, c%)
DECLARE SUB Setvesa (Mode%)
DECLARE SUB Delay (Times!)
DECLARE FUNCTION Mouseinit% ()
DECLARE FUNCTION Getvect& (Interrup%)
DECLARE FUNCTION Findnext% (Buf AS ANY)
DECLARE FUNCTION Findfirst% (Filename$, Attr%, Buf AS ANY)
DECLARE FUNCTION Offp% (Pntr&)
DECLARE FUNCTION Segp% (Pntr&)
DECLARE FUNCTION Ptr& (Array%())
DECLARE FUNCTION Long2int% (Number&)
DECLARE FUNCTION Sbinit% (Port%, Irq%, Dmach%, Version%)
DECLARE FUNCTION Dmastat% (Dmach%)
DECLARE FUNCTION Int2Long& (Integ%)
DECLARE FUNCTION Dosread% (Pnt&, Size%, Handle%)
DECLARE FUNCTION Doswrite% (Pnt&, Size%, Handle%)
'$INCLUDE: 'qb.bi'
'$INCLUDE: 'modex.bi'
DEFINT A-Z
CONST Vesa640x400 = &H100
CONST Vesa640x480 = &H101
CONST Vesa800x600 = &H103
CONST Vesa1024x768 = &H105
CONST True = -1
CONST False = 0
TYPE Filefind
Internal AS STRING * 21
Attr AS STRING * 1
Ftime AS INTEGER
Fdate AS INTEGER
Size AS LONG
Namext AS STRING * 13
END TYPE
DIM SHARED Inregs AS RegTypeX
DIM SHARED Outregs AS RegTypeX
DIM SHARED Curpage AS INTEGER
DIM SHARED Memloc AS INTEGER
DIM SHARED Ytable(0 TO 767) AS INTEGER
DIM SHARED Ptable(0 TO 767) AS INTEGER
DEFINT A-Z
SUB Delay (Times!)
Start! = TIMER
DO WHILE TIMER - Start! < Times!: LOOP
END SUB
FUNCTION Dmastat (Dmach)
Addr = Dmach * 2
tmp = 0
DEF SEG = VARSEG(tmp)
d = VARPTR(tmp)
POKE (d), INP(Addr)
POKE (d + 1), INP(Addr)
Dmastat = tmp
END FUNCTION
FUNCTION Dosread% (Pnt&, Size%, Handle%)
Dseg = Segp(Pnt&)
Doff = Offp(Pnt&)
Inregs.ax = &H3F00
Inregs.bx = Handle
Inregs.cx = Size
Inregs.ds = Dseg
Inregs.dx = Doff
CALL INTERRUPTX(&H21, Inregs, Outregs)
Dosread = Outregs.ax
END FUNCTION
FUNCTION Doswrite% (Pnt&, Size%, Handle%)
Dseg = Segp(Pnt&)
Doff = Offp(Pnt&)
Inregs.ax = &H4000
Inregs.bx = Handle
Inregs.cx = Size
Inregs.ds = Dseg
Inregs.dx = Doff
CALL INTERRUPTX(&H21, Inregs, Outregs)
Doswrite = Outregs.ax
END FUNCTION
FUNCTION Findfirst (Filename$, Attr%, Buf AS Filefind)
Asciiz$ = Filename$ + CHR$(0)
Inregs.ax = &H1A00
Inregs.ds = VARSEG(Buf)
Inregs.dx = VARPTR(Buf)
CALL INTERRUPTX(&H21, Inregs, Outregs)
Inregs.ax = &H4E00
Inregs.cx = Attr%
Inregs.ds = VARSEG(Asciiz$)
Inregs.dx = SADD(Asciiz$)
CALL INTERRUPTX(&H21, Inregs, Outregs)
IF (Outregs.flags AND &H1) = &H1 THEN
Findfirst = 0
ELSE
Buf.Namext = LEFT$(Buf.Namext, INSTR(Buf.Namext, CHR$(0)))
Findfirst = -1
END IF
END FUNCTION
FUNCTION Findnext (Buf AS Filefind)
Asciiz$ = Filename$ + CHR$(0)
Inregs.ax = &H1A00
Inregs.ds = VARSEG(Buf)
Inregs.dx = VARPTR(Buf)
CALL INTERRUPTX(&H21, Inregs, Outregs)
Inregs.ax = &H4F00
CALL INTERRUPTX(&H21, Inregs, Outregs)
IF (Outregs.flags AND &H1) = &H1 THEN
Findnext = 0
ELSE
Buf.Namext = LEFT$(Buf.Namext, INSTR(Buf.Namext, CHR$(0)))
Findnext = -1
END IF
END FUNCTION
FUNCTION Getvect& (Interrup%)
Inregs.ax = &H3500 OR Interrup
CALL INTERRUPTX(&H21, Inregs, Outregs)
Vseg = Outregs.es
Voff = Outregs.bx
tmp& = 0
DEF SEG = VARSEG(Vseg)
v = VARPTR(Vseg)
a = PEEK(v)
b = PEEK(v + 1)
DEF SEG = VARSEG(Voff)
v = VARPTR(Voff)
c = PEEK(v)
d = PEEK(v + 1)
DEF SEG = VARSEG(tmp&)
v = VARPTR(tmp&)
POKE (v), c
POKE (v + 1), d
POKE (v + 2), a
POKE (v + 3), b
Getvect& = tmp&
END FUNCTION
SUB Hidemouse
Inregs.ax = &H2
CALL INTERRUPTX(&H33, Inregs, Outregs)
END SUB
FUNCTION Int2Long& (Integ%)
DEF SEG = VARSEG(Integ)
v = VARPTR(Integ)
a = PEEK(v)
b = PEEK(v + 1)
DEF SEG = VARSEG(Int2Long&)
v = VARPTR(Int2Long&)
POKE (v), a
POKE (v + 1), b
END FUNCTION
FUNCTION Long2int (Number&)
Long2int = VAL("&H" + HEX$(Number& AND &HFFFF&))
END FUNCTION
SUB MaxMousex (Minx, Maxx)
Inregs.ax = &H7
Inregs.cx = Minx
Inregs.dx = Maxx
CALL INTERRUPTX(&H33, Inregs, Outregs)
END SUB
SUB MaxMousey (Miny, Maxy)
Inregs.ax = &H8
Inregs.cx = Miny
Inregs.dx = Maxy
CALL INTERRUPTX(&H33, Inregs, Outregs)
END SUB
FUNCTION Mouseinit%
IF Getvect(&H33) = 0 THEN
Mouseinit = 0
EXIT FUNCTION
END IF
Inregs.ax = &H0
CALL INTERRUPTX(&H33, Inregs, Outregs)
IF NOT Outregs.ax THEN
Mouseinit = 0
ELSE
Mouseinit = -1
END IF
END FUNCTION
SUB Mousestat (x, y, b)
Inregs.ax = &H3
CALL INTERRUPTX(&H33, Inregs, Outregs)
x = Outregs.cx
y = Outregs.dx
b = Outregs.bx
END SUB
FUNCTION Offp (Pntr&)
tmp = 0
DEF SEG = VARSEG(Pntr&)
v = VARPTR(Pntr&)
a = PEEK(v)
b = PEEK(v + 1)
DEF SEG = VARSEG(tmp)
v = VARPTR(tmp)
POKE (v), a
POKE (v + 1), b
Offp = tmp
END FUNCTION
SUB Outsb (Baseport, Writeval)
WHILE (INP(Baseport + &HC) AND &H80) <> 0: WEND
OUT (Baseport + &HC), Writeval
END SUB
FUNCTION Ptr& (Array())
tmp& = 0
Vseg = VARSEG(Array(1))
v = VARPTR(Array(1))
DEF SEG = VARSEG(Vseg)
r = VARPTR(Vseg)
a = PEEK(r)
b = PEEK(r + 1)
DEF SEG = VARSEG(tmp&)
r = VARPTR(tmp&)
POKE (r + 2), a
POKE (r + 3), b
DEF SEG = VARSEG(v)
r = VARPTR(v)
a = PEEK(r)
b = PEEK(r + 1)
DEF SEG = VARSEG(tmp&)
r = VARPTR(tmp&)
POKE (r), a
POKE (r + 1), b
Ptr& = tmp&
END FUNCTION
SUB ResetSb (Baseport)
OUT Baseport + &H6, &H1
Delay .1
OUT Baseport + &H6, &H0
WHILE (INP(Baseport + &HC) AND &H80) = 0: WEND
END SUB
FUNCTION Sbinit% (Port, Irq, Dmach, Version)
Evrstr$ = ENVIRON$("BLASTER")
Port = 0
IF LEN(Evrstr$) = 0 THEN
FOR i = &H210 TO &H270 STEP &H10
OUT i + &H6, &H1
OUT i + &H6, &H0
IF INP(i + &HC) = &HAA THEN
Port = &H220
Irq = 7
Dmach = 1
Version = 1
END IF
NEXT i
IF Port = 0 THEN
Sbinit% = 0
ELSE
Sbinit% = -1
END IF
EXIT FUNCTION
END IF
Aloc = INSTR(Evrstr$, "A")
Iloc = INSTR(Evrstr$, "I")
Dloc = INSTR(Evrstr$, "D")
Tloc = INSTR(Evrstr$, "T")
IF Aloc <> 0 THEN Port = VAL("&H" + MID$(Evrstr$, Aloc + 1, 3))
IF Iloc <> 0 THEN Irq = VAL(MID$(Evrstr$, Iloc + 1, 1))
IF Dloc <> 0 THEN Dmach = VAL(MID$(Evrstr$, Dloc + 1, 1))
IF Tloc <> 0 THEN Version = VAL(MID$(Evrstr$, Tloc + 1, 1))
Sbinit% = -1
END FUNCTION
FUNCTION Segp% (Pntr&)
tmp = 0
DEF SEG = VARSEG(Pntr&)
v = VARPTR(Pntr&)
a = PEEK(v + 2)
b = PEEK(v + 3)
DEF SEG = VARSEG(tmp)
v = VARPTR(tmp)
POKE (v), a
POKE (v + 1), b
Segp = tmp
END FUNCTION
SUB Setvesa (Mode)
SELECT CASE Mode
CASE &H100
Mult& = 640
y = 400
CASE &H101
Mult& = 640
y = 480
CASE &H103
Mult& = 800
y = 600
CASE &H105
Mult& = 1024
y = 768
END SELECT
Memloc2& = 0
Curpage = 0
FOR yt = 0 TO y
Ytable(yt) = VAL("&H" + HEX$(Memloc2&))
Ptable(yt) = Curpage
Memloc2& = Memloc2& + Mult&
IF Memloc2& > 65535 THEN
Curpage = Curpage + 1
Memloc2& = Memloc2& - 65536
END IF
NEXT yt
Curpage = 0
Inregs.ax = &H4F02
Inregs.bx = Mode
CALL INTERRUPTX(&H10, Inregs, Outregs)
END SUB
SUB Showmouse
Inregs.ax = &H1
CALL INTERRUPTX(&H33, Inregs, Outregs)
END SUB
SUB Writedot (x%, y%, c%)
Memloc = Ytable(y) + x
Npage = Ptable(y)
IF Npage <> Curpage THEN
Inregs.ax = &H4F05
Inregs.bx = 0
Inregs.dx = Npage
CALL INTERRUPTX(&H10, Inregs, Outregs)
Curpage = Npage
END IF
IF (Ytable(y) < 0) AND (Memloc >= 0) THEN
Curpage = Curpage + 1
Inregs.ax = &H4F05
Inregs.bx = 0
Inregs.dx = Curpage
CALL INTERRUPTX(&H10, Inregs, Outregs)
END IF
POKE (Memloc), c
END SUB