'$DYNAMIC '$INCLUDE: 'c:\qb45\qb.bi' DIM SHARED inregs AS RegType, outregs AS RegType DIM font%(385) DIM winbck%(11500) DIM pics%(32000) DIM cpic%(400) wincnt% = 3 DEF SEG = VARSEG(font%(0)) BLOAD "1.fnt", 0 SCREEN 12 GOSUB s16msetup txtr% = 255: txtg% = 255: txtb% = 255 a$ = "File": GOSUB text RESTORE windows FOR a% = 1 TO wincnt% READ winx1%(a%), winy1%(a%), winx2%(a%), winy2%(a%) winp%(a%) = 1 NEXT FOR n% = 1 TO wincnt% GOSUB drawwin NEXT DO GOSUB cwindw GOSUB mouseget a$ = INKEY$ IF a$ = "q" THEN cur% = cur% - 1 IF a$ = "w" THEN cur% = cur% + 1 IF a$ = "a" THEN cug% = cug% - 1 IF a$ = "s" THEN cug% = cug% + 1 IF a$ = "z" THEN cub% = cub% - 1 IF a$ = "x" THEN cub% = cub% + 1 IF msk = 1 THEN FOR a% = 1 TO wincnt% IF msx >= winx1%(a%) AND msy >= winy1%(a%) + 8 AND msx <= winx2%(a%) AND msy <= winy2%(a%) THEN ON a% GOSUB colorbars IF msx >= winx1%(a%) AND msy >= winy1%(a%) AND msx <= winx2%(a%) AND msy <= winy1%(a%) + 8 THEN WHILE msk = 1: GOSUB mouseget: WEND n% = a%: GOSUB erasewin winx2%(a%) = msx + (winx2%(a%) - winx1%(a%)) winy2%(a%) = msy + (winy2%(a%) - winy1%(a%)) winx1%(a%) = msx winy1%(a%) = msy GOSUB drawwin END IF NEXT win% = 2 x% = FIX(msx / 8) + winx1%(2) + 2: y% = FIX(msy / 8) + winy1%(2) + 10 IF x% - winx1%(2) <= 17 AND y% - winy1%(2) <= 25 THEN r% = cur%: g% = cug%: b% = cub% GOSUB ps16m win% = 0 FOR xx% = 0 TO 6 FOR yy% = 0 TO 6 x% = xx% + (FIX(msx / 8) * 8) y% = yy% + (FIX(msy / 8) * 8) GOSUB ps16m NEXT: NEXT DEF SEG = VARSEG(cpic%(0)) POKE (FIX(msy / 8) * 48) + (FIX(msx / 8) * 3), r% POKE (FIX(msy / 8) * 48) + (FIX(msx / 8) * 3) + 1, g% POKE (FIX(msy / 8) * 48) + (FIX(msx / 8) * 3) + 2, b% END IF END IF LOOP colorbars: IF msx >= winx1%(a%) + 2 AND msx <= winx1%(a%) + 64 AND msy >= winy1%(a%) + 10 AND msy <= winy1%(a%) + 13 THEN cur% = (msx - (winx1%(a%) + 2)) * 4 IF msx >= winx1%(a%) + 2 AND msx <= winx1%(a%) + 64 AND msy >= winy1%(a%) + 15 AND msy <= winy1%(a%) + 19 THEN cug% = (msx - (winx1%(a%) + 2)) * 4 IF msx >= winx1%(a%) + 2 AND msx <= winx1%(a%) + 64 AND msy >= winy1%(a%) + 21 AND msy <= winy1%(a%) + 25 THEN cub% = (msx - (winx1%(a%) + 2)) * 4 RETURN cwindw: clrx% = clrx% + 1: IF clrx% > 63 THEN clrx% = 0: clry% = clry% + 1 IF clry% > 3 THEN clry% = 0 x% = clrx% + 2 + winx1%(1): y% = clry% + 10 + winy1%(1): r% = clrx% * 4: g% = cug%: b% = cub% IF clrx% = FIX(cur% / 4) THEN r% = 255: g% = 255: b% = 255 GOSUB ps16m x% = clrx% + 2 + winx1%(1): y% = clry% + 15 + winy1%(1): r% = cur%: g% = clrx% * 4: b% = cub% IF clrx% = FIX(cug% / 4) THEN r% = 255: g% = 255: b% = 255 GOSUB ps16m x% = clrx% + 2 + winx1%(1): y% = clry% + 20 + winy1%(1): r% = cur%: g% = cug%: b% = clrx% * 4 IF clrx% = FIX(cub% / 4) THEN r% = 255: g% = 255: b% = 255 GOSUB ps16m RETURN drawwin: rpos% = 0 FOR x% = winx1%(n%) TO winx2%(n%) FOR y% = winy1%(n%) TO winy2%(n%) wt# = SIN((x% - winx1%(n%)) / ((winx2%(n%) - winx1%(n%)) / 3.14)) * 2 wt# = wt# + SIN((y% - winy1%(n%)) / ((winy2%(n%) - winy1%(n%)) / 3.14)) * 2 GOSUB gt16m DEF SEG = VARSEG(winbck%(0)) POKE rpos%, r%: rpos% = rpos% + 1 POKE rpos%, g%: rpos% = rpos% + 1 POKE rpos%, b%: rpos% = rpos% + 1 r% = 255: g% = 255: b% = 255 IF x% = winx1%(n%) OR y% = winy1%(n%) OR x% = winx2%(n%) OR y% = winy2%(n%) OR y% = winy1%(n%) + 8 THEN r% = 0: g% = 0: b% = 0 GOSUB pst16m NEXT: NEXT ON n% GOSUB null, picwindr RETURN picwindr: FOR xx% = 0 TO 15 FOR yy% = 0 TO 15 x% = xx% + winx1%(n%) + 2 y% = yy% + winy1%(n%) + 10 DEF SEG = VARSEG(cpic%(0)) r% = PEEK((yy% * 48) + (xx% * 3)) g% = PEEK((yy% * 48) + (xx% * 3) + 1) b% = PEEK((yy% * 48) + (xx% * 3) + 2) GOSUB ps16m NEXT: NEXT RETURN null: RETURN erasewin: rpos% = 0 win% = 1 FOR x% = winx1%(n%) TO winx2%(n%) FOR y% = winy1%(n%) TO winy2%(n%) DEF SEG = VARSEG(winbck%(0)) r% = PEEK(rpos%): rpos% = rpos% + 1 g% = PEEK(rpos%): rpos% = rpos% + 1 b% = PEEK(rpos%): rpos% = rpos% + 1 GOSUB ps16m NEXT: NEXT RETURN text: DEF SEG = VARSEG(font%(0)) r% = txtr%: g% = txtg%: b% = txtb% FOR a% = 1 TO LEN(a$) c% = ASC(MID$(a$, a%, 1)) - 32 GOSUB dchar txtx% = txtx% + 8 IF txtx% > 639 THEN txtx% = 0: txty% = txty% + 8 NEXT RETURN dchar: FOR yy% = 0 TO 7 FOR xx% = 0 TO 7 DEF SEG = VARSEG(font%(0)) IF (PEEK(c% * 8 + yy%) AND (2 ^ (7 - xx%))) <> 0 THEN x% = txtx% + xx%: y% = txty% + yy%: GOSUB ps16m NEXT: NEXT RETURN ps16m: FOR bb% = 1 TO wincnt% IF winp%(bb%) > win% THEN IF x% >= winx1%(bb%) AND y% >= winy1%(bb%) AND y% <= winy2%(bb%) AND x% <= winx2%(bb%) THEN RETURN END IF NEXT inregs.ax = &H4F05 inregs.bx = 0 inregs.dx = FIX(y% / 32) * 16 CALL INTERRUPT(&H10, inregs, outregs) gy% = (y% AND 31) * 2 DEF SEG = &HA000 POKE (gy% * 1024&) + (x% * 3), b% POKE (gy% * 1024&) + (x% * 3) + 1, g% POKE (gy% * 1024&) + (x% * 3) + 2, r% RETURN pst16m: IF wt# = 0 THEN wt# = 1 FOR bb% = 1 TO wincnt% IF winp%(bb%) > win% THEN IF x% >= winx1%(bb%) AND y% >= winy1%(bb%) AND y% <= winy2%(bb%) AND x% <= winx2%(bb%) THEN RETURN END IF NEXT inregs.ax = &H4F05 inregs.bx = 0 inregs.dx = FIX(y% / 32) * 16 CALL INTERRUPT(&H10, inregs, outregs) gy% = (y% AND 31) * 2 DEF SEG = &HA000 b% = ((b% * wt#) + PEEK((gy% * 1024&) + (x% * 3))) / (wt# + 1) g% = ((g% * wt#) + PEEK((gy% * 1024&) + (x% * 3) + 1)) / (wt# + 1) r% = ((r% * wt#) + PEEK((gy% * 1024&) + (x% * 3) + 2)) / (wt# + 1) POKE (gy% * 1024&) + (x% * 3), b% POKE (gy% * 1024&) + (x% * 3) + 1, g% POKE (gy% * 1024&) + (x% * 3) + 2, r% RETURN gt16m: inregs.ax = &H4F05 inregs.bx = 0 inregs.dx = FIX(y% / 32) * 16 CALL INTERRUPT(&H10, inregs, outregs) gy% = (y% AND 31) * 2 DEF SEG = &HA000 b% = PEEK((gy% * 1024&) + (x% * 3)) g% = PEEK((gy% * 1024&) + (x% * 3) + 1) r% = PEEK((gy% * 1024&) + (x% * 3) + 2) RETURN s16msetup: inregs.ax = &H4F02 inregs.bx = 271 CALL INTERRUPT(&H10, inregs, outregs) RETURN mouseget: win% = 2 RESTORE crossh FOR bbb% = 1 TO 8 READ crx%, cry% x% = msx + crx%: y% = msy + cry%: r% = olr%(bbb%): g% = olg%(bbb%): b% = olb%(bbb%): GOSUB ps16m NEXT inregs.ax = 3 CALL INTERRUPT(&H33, inregs, outregs) msx = outregs.cx / 2 msy = outregs.dx msk = outregs.bx RESTORE crossh FOR bbb% = 1 TO 8 READ crx%, cry% x% = msx + crx%: y% = msy + cry%: GOSUB gt16m: olr%(bbb%) = r%: olg%(bbb%) = g%: olb%(bbb%) = b% r% = 255: g% = 255: b% = 255: GOSUB ps16m NEXT RETURN showmouse: inregs.ax = 1 CALL INTERRUPT(&H33, inregs, outregs) RETURN hidemouse: inregs.ax = 2 CALL INTERRUPT(&H33, inregs, outregs) RETURN crossh: DATA -1,0,-2,0,0,-1,0,-2,1,0,2,0,0,1,0,2 windows: DATA 0,0,67,26 DATA 0,20,19,47 DATA 0,40,83,80