I have also made modex routines, but they may not work on all systems. It works for me in dosbox
Code: Select all
DEFINT A-Z
DECLARE SUB modex ()
DECLARE SUB page (active, visual)
DECLARE SUB pixel (x, y, c)
modex
page 0, 0
COLOR 12
OUT &H3C4, &H2
OUT &H3C5, &HFF
FOR i! = 0 TO 2 * 3.1415926# STEP .01
pixel 160 + COS(i!) * 100, 120 + SIN(i!) * 100, 50 + INT(i!)
NEXT
SLEEP
SYSTEM
SUB modex
SCREEN 13
OUT &H3C4, &H4: OUT &H3C5, &H6: OUT &H3C4, &H0
OUT &H3C5, &H1: OUT &H3C2, &HE3: OUT &H3C4, &H0
OUT &H3C5, &H3: OUT &H3D4, &H11: x = INP(&H3D5) AND &H7F
OUT &H3D5, x: OUT &H3D4, &H6: OUT &H3D5, &HD
OUT &H3D4, &H7: OUT &H3D5, &H3E: OUT &H3D4, &H9
OUT &H3D5, &H41: OUT &H3D4, &H10: OUT &H3D5, &HEA
OUT &H3D4, &H11: OUT &H3D5, &HAC: OUT &H3D4, &H12
OUT &H3D5, &HDF: OUT &H3D4, &H14: OUT &H3D5, &H0
OUT &H3D4, &H15: OUT &H3D5, &HE7: OUT &H3D4, &H16
OUT &H3D5, &H6: OUT &H3D4, &H17: OUT &H3D5, &HE3
END SUB
SUB page (active, visual)
OUT &H3D4, &HC
OUT &H3D5, &H4B * visual
OUT &H3D4, &HD
OUT &H3D5, 0
DEF SEG = &HA000 + &H4B0 * active
END SUB
SUB pixel (x, y, c)
OUT &H3C4, &H2
OUT &H3C5, 2 ^ (x AND 3)
POKE x \ 4 + y * 80, c
END SUB
This is my demo using the hardware scrolling capabilities of modex
Code: Select all
DEFINT A-Z
DECLARE SUB modex ()
modex
OUT &H3C4, &H2
OUT &H3C5, &HFF
FOR i = 383 TO 550
k& = (i - 383) * 320&
DEF SEG = &HFFA6
x = PEEK(14 + i)
DEF SEG = &HA000
FOR j = 0 TO 16
d = ((x AND (2 ^ (16 - j))) <> 0) * -14
POKE k& + j, d
POKE k& + j + 79.99999999999998, d
POKE k& + j + 160&, d
POKE k& + j + 240&, d
NEXT
NEXT
j = 1
i = 0
DO
i = i + 80 * j
j = j XOR 2 * ((i = 32000) XOR (i = 0))
OUT &H3D4, &HC
OUT &H3D5, i \ 256
OUT &H3D4, &HD
OUT &H3D5, i
WAIT &H3DA, 8
WAIT &H3DA, 8, 8
LOOP UNTIL INP(&H60) = 1
SYSTEM
DEFSNG A-Z
SUB modex
SCREEN 13
OUT &H3C4, &H4: OUT &H3C5, &H6: OUT &H3C4, &H0
OUT &H3C5, &H1: OUT &H3C2, &HE3: OUT &H3C4, &H0
OUT &H3C5, &H3: OUT &H3D4, &H11: x = INP(&H3D5) AND &H7F
OUT &H3D5, x: OUT &H3D4, &H6: OUT &H3D5, &HD
OUT &H3D4, &H7: OUT &H3D5, &H3E: OUT &H3D4, &H9
OUT &H3D5, &H41: OUT &H3D4, &H10: OUT &H3D5, &HEA
OUT &H3D4, &H11: OUT &H3D5, &HAC: OUT &H3D4, &H12
OUT &H3D5, &HDF: OUT &H3D4, &H14: OUT &H3D5, &H0
OUT &H3D4, &H15: OUT &H3D5, &HE7: OUT &H3D4, &H16
OUT &H3D5, &H6: OUT &H3D4, &H17: OUT &H3D5, &HE3
END SUB
I have also made a MODEX bitmap loarder that utilises VGA hardware to quickly and smoothly pan the image on mouse click & drag.
Code: Select all
DEFINT A-Z
DECLARE SUB modex ()
DIM yy AS LONG
DIM a(10) AS LONG
a(0) = &H8BE58955
a(1) = &H33CD0C46
a(2) = &H890A768B
a(3) = &H8768B1C
a(4) = &H768B0C89
a(5) = &H5D148906
a(6) = &H8CA
DIM r AS STRING * 1, g AS STRING * 1, b AS STRING * 1
DIM s AS LONG
SCREEN 0
'PRINT "Enter filename of 8bit bmp less then 512x495 in size"
'LINE INPUT f$
modex
OUT &H3D4, &H13
OUT &H3D5, 64
DEF SEG = &HA000
f$ = "city7.bmp"
k = 1
OPEN f$ FOR BINARY AS #1
GET #1, 1, x
GET #1, 29, y
IF x <> &H4D42 AND y <> 8 THEN SYSTEM
GET #1, 19, x
GET #1, 23, y
'GET #1, 35, size
GET #1, 54, b
OUT &H3C8, 0
FOR i = 0 TO 255
GET #1, , b
GET #1, , g
GET #1, , r
OUT &H3C9, ASC(r) \ 4
OUT &H3C9, ASC(g) \ 4
OUT &H3C9, ASC(b) \ 4
GET #1, , b
NEXT
IF x MOD 4 THEN z$ = SPACE$(4 - (x MOD 4))
OUT &H3C4, &H2
FOR i = 0 TO y - 1
yy = (y - i - 1) * 128&
FOR j = 0 TO x - 1
GET #1, , b
k = k * 2 MOD 15
OUT &H3C5, k
POKE j \ 4 + yy, ASC(b)
NEXT
GET #1, , z$
NEXT
CLOSE
x = 0
y = 0
DEF SEG = VARSEG(a(0))
CALL absolute(BYVAL 0, mb, mx, my, VARPTR(a(0)))
DO
CALL absolute(BYVAL 3, mb, mx, my, VARPTR(a(0)))
IF mb = 1 THEN
ox = mx + x
oy = my + y
DO
CALL absolute(BYVAL 3, mb, mx, my, VARPTR(a(0)))
x = ox - mx
y = oy - my
IF x < 1 THEN x = 0
IF y < 1 THEN y = 0
IF x > 384 THEN x = 384
IF y > 250 THEN y = 250
s = y * 128& + x \ 8
OUT &H3D4, &HC
OUT &H3D5, s \ 256
OUT &H3D4, &HD
OUT &H3D5, s
i = INP(&H3DA)
OUT &H3C0, &H33
OUT &H3C0, (x AND &HFFFE) MOD 8
LOOP WHILE mb = 1
END IF
LOOP UNTIL INP(&H60) = 1
OUT &H3D4, &H13
OUT &H3D5, 40
SCREEN 0
SYSTEM
SUB modex
SCREEN 13
OUT &H3C4, &H4: OUT &H3C5, &H6: OUT &H3C4, &H0
OUT &H3C5, &H1: OUT &H3C2, &HE3: OUT &H3C4, &H0
OUT &H3C5, &H3: OUT &H3D4, &H11: x = INP(&H3D5) AND &H7F
OUT &H3D5, x: OUT &H3D4, &H6: OUT &H3D5, &HD
OUT &H3D4, &H7: OUT &H3D5, &H3E: OUT &H3D4, &H9
OUT &H3D5, &H41: OUT &H3D4, &H10: OUT &H3D5, &HEA
OUT &H3D4, &H11: OUT &H3D5, &HAC: OUT &H3D4, &H12
OUT &H3D5, &HDF: OUT &H3D4, &H14: OUT &H3D5, &H0
OUT &H3D4, &H15: OUT &H3D5, &HE7: OUT &H3D4, &H16
OUT &H3D5, &H6: OUT &H3D4, &H17: OUT &H3D5, &HE3
END SUB
you can use any image that is of size, but this demo uses this sample image:
http://qbasic.orgfree.com/city7.bmp