MILC logo

IndexVorigeVolgendeLeeg

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
                 =============================================


    

Index

Vorige

Volgende