
|
Blinkmode scherm 0 Arsoft, 01-09-94
SCREEN 0 - Blink mode
U heeft ze vast wel eens gezien: van die menu's waarbij je d.m.v. het bewegen
van een gekleurde balk de gewenste filenaam moest kiezen. Dit is natuurlijk
stukken beter dan het intypen van een filenaam. De routines die voor
zo'n menu gebruikt worden zal ik in dit artikel proberen uit te leggen.
In SCREEN 0 is het mogelijk om bij iedere positie op het scherm op te geven
of het de normale schermkleuren of de alternatieve kleuren krijgt. Hieruit
volgt dat alleen de waarden 0 (normale kleur) en 1 (alternatieve kleur)
opgeslagen hoeven te worden (binair). Aangezien een byte uit 8 bits bestaat
kunnen dus in 1 byte de toestand van 8 posities tegelijk opgeslagen worden.
De tabel waarin deze toestanden worden bijgehouden is de KLEUR-tabel. Deze
tabel staat in het videoRAM en begint meestal op adres 2048 (dit adres staat
in BASE(1)). Het aantal posities op het scherm is (normaal gesproken)
80*24=1920 posities, dus de tabel is 1920 / 8 = 240 bytes lang. Voordat we
met de alternatieve kleuren kunnen gaan spelen moeten we eerst wat dingen
instellen. met VDP(13) kunnen we de alternatieve kleuren instellen. Dit gaat
als volgt:
VDP(13)=16 x voorgrondkleur + achtergrondkleur.
Willen we dus zwarte letters op een witte achtergrond dan zeggen we
VDP(13)=31 of nog eenvoudiger VDP(13)=&H1F de het eerste getal is dan de
voorgrondkleur (1) en het tweede getal de achtergrondkleur (&HF = 15). Met
VDP(14)=&HF0 kunnen we dan de alternatieve kleuren zichtbaar maken. Het getal
&HF0 wil zeggen dat de alternatieve kleuren altijd aan (&HF.) en nooit uit
(&H.0) staan. Je kan de alternatieve kleuren namelijk ook laten knipperen.
Voordat we deze VDP-registers in gaan stellen moeten we nog wat doen,
namelijk het scherm schoonmaken. Er staat nu nog allemaal rotzooi (type maar
eens VDP(14)=&HF0 in). Dit schoonmaken doen we met:
FOR T=BASE(1) TO BASE(1)+239: VPOKE T,0: NEXT T
Nu kunnen we eindelijk gaan VPOKEn. Dit VPOKEn gaat zoals gezegd met 8
posities tegelijk. type nu maar eens VPOKE BASE(1),255 (VERGEET DE VDP NIET
IN TE STELLEN!). U ziet dan een balk van 8 posities in de linkerbovenhoek van
het scherm verschijnen. Dit komt doordat het binaire patroon van 255 11111111
is (te vinden door: PRINT BIN$(255) ). Willen we een ander patroon hebben dan
maken we eerst het binaire patroon, bv.: 00101000 en dan zoeken we er de
decimale waarde bij (of we laten het in binair, net wat u wilt). Het VPOKEn
gaat dan volgens: VPOKE BASE(1)+10*REGEL+KOLOM,WAARDE. Een voorbeeld: We
willen in kolom 3 van regel 5 het patroon 00011110 zetten. Dat wordt dan:
VPOKE BASE(1)+10*5+3,&B00011110
Wat algemenere formules om een enkele positie op het scherm te zetten zijn
de volgende: KOLOM=X\8, WAARDE=2^(7-(X MOD 8)). In een voorbeeldprogramma:
10 SCREEN 0: COLOR 15,4,4: KEYOFF: CLS
20 COLOR=(4,1,2,3): COLOR=(3,7,7,0): COLOR=(2,5,0,0)
30 FOR I=BASE(1) TO BASE(1)+239: VPOKE I,0: NEXT I
40 VDP(14)=&HF0: VDP(13)=&H32
50 ' -- hoofdprogramma --
60 X=10: Y=2: GOSUB 100: END
70 ' -- zet blokje --
80 XX=X\8: WA=X MOD 8: WA=2^(7-WA)
90 VPOKE BASE(1)+10*Y+XX,WA: RETURN
Op deze manier is het dus mogelijk om in SCREEN 0 toch nog 4 kleuren te
gebruiken. Ik wens u veel succes met programmeren en ik hoop nu nooit
meer een INPUT-statement te zien om een file te kiezen. Tenslotte nog een
handig diskmenu waarvan u het scherm zelf mag maken. Succes!
Arjan Steenbergen
10 ' -- DISKMENU -- (C)1992 BY ARSOFT
20 SCREEN 0: WIDTH 80: KEY OFF: CLS: DIM X(5,2)
30 COLOR 15,4,4: COLOR=(4,1,2,3): COLOR=(2,4,0,0): COLOR=(3,7,7,0)
40 PRINT STRING$(79,"=")
50 TT$="D I S K M E N U": LOCATE 40-LEN(TT$)/2,1: PRINT TT$
60 PRINT STRING$(79,"=")
70 EX$="*": Y=3: GOSUB 130 ' kies file
80 E$=RIGHT$(FI$,3)
90 IF E$="BAS" OR E$="LDR" THEN RUN FI$
100 IF E$="BIN" THEN BLOAD FI$,R
110 IF E$="COM" OR E$="BAT" THEN LOCATE 0,MY+2:PRINT"Deze file moet vanuit
MSX-DOS opgestart worden!": END
120 LOCATE 0,MY+2: PRINT"Dit soort files kan ik niet laden...<toets>";:A$=
INPUT$(1): CLS: GOTO 40
130 ' -- file kiezen
140 FOR I=BASE(1) TO BASE(1)+239: VPOKE I,0: NEXT I
150 VDP(14)=&HF0: VDP(13)=&H32: XX=0: YY=Y: YO=YY: XO=XX
160 FOR I=0 TO 5: READ S(I): FOR J=0 TO 2: READ X(I,J): NEXT J,I
170 DATA 0,127,248,0, 1,3,255,192, 3,31,254,0
180 DATA 5,255,240,0, 6,7,255,128, 8,63,252,0
190 POKE &HF3B0,78: LOCATE 0,Y: FILES "*."+EX$: MY=CSRLIN: POKE &HF3B0,80
200 FOR I=0 TO 2: VPOKE BASE(1)+10*YY+S(XX)+I,X(XX,I): NEXT I
210 ST=STICK(0): IF ST=0 THEN GOTO 260
220 IF ST=1 THEN YY=YY-1: GOSUB 270
230 IF ST=3 THEN XX=XX+1: GOSUB 270
240 IF ST=5 THEN YY=YY+1: GOSUB 270
250 IF ST=7 THEN XX=XX-1: GOSUB 270
260 IF STRIG(0)=0 THEN GOTO 210 ELSE VDP(14)=0: GOSUB 330: RETURN
270 IF YY<Y THEN YY=Y: RETURN ELSE IF YY>MY THEN YY=MY: RETURN
280 IF XX<0 THEN XX=0: RETURN ELSE IF XX>5 THEN XX=5 : RETURN
290 IF VPEEK(80*YY+(XX*13+1))=32 THEN YY=YO: XX=XO: RETURN
300 FOR I=0 TO 2: VPOKE BASE(1)+10*YO+S(XO)+I,0: NEXT I
310 FOR I=0 TO 2: VPOKE BASE(1)+10*YY+S(XX)+I,X(XX,I): NEXT I
320 YO=YY: XO=XX: RETURN
330 ' -- filenaam inlezen
340 AD=80*YY+(XX*13+1): FI$=""
350 FOR I=0 TO 11: FI$=FI$+CHR$(VPEEK(AD+I)): NEXT I
360 RETURN
=============================================
Dit artikel is afkomstig
uit het clubblad van MSX Club Drechtsteden
tegenwoordig genaamd: MCD Magazine
=============================================
|