Dieses ist für QBX (PDS 7.1)
Mode X in Basic.
So habe ich es auch in Turbo Pascal umgesetzt.
Drücke erst die Taste "Q"
Dann "A" bzw "S" , dazwischen mit "Q" zurücksetzen.
Mit "Q" werden 3 Screens mit Linien gesetzt.
- "A" 3x Flip in einer For-Schleife
- "Q" zurücksetzen
- "S" 3x kopiert nach Page 0 in eine For-Schleife
Da ich in Turbo Pascal und auch Basic Grafiken (Sprite) in ASM realisieren muss ist der gesamte Ablauf
für die Bewegung mit den Tasten oder Joy in QBX und Turbo Pascal gleich schnell.
Code
DECLARE SUB ySCREEN()
declare SUB yPSET (x AS INTEGER, y AS INTEGER, c AS INTEGER)
declare SUB yCLS (c AS INTEGER)
declare FUNCTION yPOINT% (x AS INTEGER, y AS INTEGER)
declare SUB yPAGEWORK (pageNum AS INTEGER)
declare SUB yPAGEFLIP (pageNum AS INTEGER)
declare SUB yPAGECOPY (dstPage AS INTEGER, srcPage AS INTEGER)
CONST scINDEX = &H3C4
CONST scMapMask = 2
CONST scDATA = &H3C5
CONST scSequencerMemoryMode = 4
CONST gcINDEX = &H3CE
CONST gcDATA = &H3CF
CONST gcBitMask = 8
CONST gcReadMapSelect = 4
CONST gcGraphicsMode = 5
CONST gcMiscellaneous = 6
CONST crtcStartAddressHigh = 12
CONST crtcStartAddressLow = 13
CONST crtcUnderlineLocation = 20
CONST crtcModeControl = 23
CONST crtcINDEX2 = &H3D4
CONST crtcDATA2 = &H3D5
DIM SHARED yPageSeg AS INTEGER
dim shared wert as string
yPageSeg = &HA000
call yscreen
do
wert$=input$(1)
if wert="q" then
screen 0
call yscreen
call ypagework(1)
for g%=0 to 180
call ypset(g%,g%,12)
next g%
call ypagework(2)
for g%=0 to 300
call ypset(g%,45,14)
next g%
call ypagework(3)
for g%=0 to 300
call ypset(g%,120,13)
next g%
end if
if wert="a" then
for z%=0 to 30
call ypageflip(1)
call ypageflip(2)
call ypageflip(3)
next z%
end if
if wert="s" then
for z1%=0 to 30
call yPAGECOPY(0,1)
call yPAGECOPY(0,2)
call yPAGECOPY(0,3)
next z1%
end if
loop
SUB yPAGECOPY (dstPage AS INTEGER, srcPage AS INTEGER)
DIM ofs AS LONG
OUT scINDEX, scMapMask
OUT scDATA, &HF
OUT gcINDEX, gcBitMask
OUT gcDATA, &H0
IF (dstPage < srcPage) THEN
ofs = CLNG(srcPage - dstPage) * 16000
DEF SEG = &HA000 + dstPage * 1000
FOR i% = 0 TO 15999
POKE i%, PEEK(ofs + i%)
NEXT i%
ELSE
ofs = CLNG(dstPage - srcPage) * 16000
DEF SEG = &HA000 + srcPage * 1000
FOR i% = 0 TO 15999
POKE (ofs + i%), PEEK(i%)
NEXT i%
END IF
OUT gcDATA, &HFF
DEF SEG
END SUB
SUB yPAGEFLIP (pageNum AS INTEGER)
DIM adr AS STRING
adr = LEFT$(MKL$(CLNG(pageNum) * 16000), 2)
DO: LOOP WHILE (INP(&H3DA) AND 1)
OUT crtcINDEX2, crtcStartAddressHigh
OUT crtcDATA2, ASC(RIGHT$(adr, 1))
OUT crtcINDEX2, crtcStartAddressLow
OUT crtcDATA2, ASC(LEFT$(adr, 1))
DO: LOOP UNTIL (INP(&H3DA) AND 8)
END SUB
SUB yPAGEWORK (pageNum AS INTEGER)
yPageSeg = &HA000 + pageNum * 1000
END SUB
FUNCTION yPOINT% (x AS INTEGER, y AS INTEGER)
OUT gcINDEX, gcReadMapSelect
OUT gcDATA, x AND 3
DEF SEG = yPageSeg
yPOINT% = PEEK(x \ 4 + y * 80)
DEF SEG
END FUNCTION
SUB yCLS (c AS INTEGER)
OUT scINDEX, scMapMask
OUT scDATA, &HF
DEF SEG = yPageSeg
FOR i% = 0 TO 15999
POKE i%, c
NEXT i%
DEF SEG
END SUB
SUB yPSET (x AS INTEGER, y AS INTEGER, c AS INTEGER)
OUT scINDEX, scMapMask
OUT scDATA, 2 ^ (x AND 3)
DEF SEG = yPageSeg
POKE (x \ 4 + y * 80), c
DEF SEG
END SUB
SUB ySCREEN
SCREEN 13
' Disable chain-4 mode
OUT scINDEX, scSequencerMemoryMode
OUT scDATA, &h06
' Turn off odd/even and set write mode 0
OUT gcINDEX, gcGraphicsMode
OUT gcDATA,&h40
' Disable chain
OUT gcINDEX, gcMiscellaneous
OUT gcDATA, &h05
' Disable long mode
OUT crtcINDEX2, crtcUnderlineLocation
OUT crtcDATA2, &h00
' Enable byte mode
OUT crtcINDEX2, crtcModeControl
OUT crtcDATA2, &he3
END SUB
Alles anzeigen