HANGMAN thread continues in GAMES.
Forum rules
This section is for testing Commander X16 programs and programs related to the CX16 for other platforms (compilers, data conversion tools, etc.)
Feel free to post works in progress, test builds, prototypes, and tech demos.
Finished works go in the Downloads category. Don't forget to add a hashtag (#) and the version number your program was meant to run on. (ie: #R41).
This section is for testing Commander X16 programs and programs related to the CX16 for other platforms (compilers, data conversion tools, etc.)
Feel free to post works in progress, test builds, prototypes, and tech demos.
Finished works go in the Downloads category. Don't forget to add a hashtag (#) and the version number your program was meant to run on. (ie: #R41).
- ahenry3068
- Posts: 1138
- Joined: Tue Apr 04, 2023 9:57 pm
Re: NEW GAME IN BASIC... HANGMAN EARLY DAYS.
Ok... Merging Intro Screen and Main Program right now.
I made the mistake of drinking Rum tonight before coding so might not be posted until tomorrow.
IT DEPENDS...........
I'm having to futz around with line numbers to do the merge. And simultaneously trying to give myself some
line # space to write the GAME logic ............ I'm thinking I'm kind of on the Home stretch with the
exception that I need to figure out a good and Efficient way to do file I/O.
I wish I was posting some code here. and It could still happen in the next couple hours. I'm only 3 cocktails in
and that just means I have to take my time. I'll definetly have the merge posted by Sometime tomorrow if I don't
finish tonight. I have set a goal of a playable version by 08/31/2023.
I made the mistake of drinking Rum tonight before coding so might not be posted until tomorrow.
IT DEPENDS...........
I'm having to futz around with line numbers to do the merge. And simultaneously trying to give myself some
line # space to write the GAME logic ............ I'm thinking I'm kind of on the Home stretch with the
exception that I need to figure out a good and Efficient way to do file I/O.
I wish I was posting some code here. and It could still happen in the next couple hours. I'm only 3 cocktails in
and that just means I have to take my time. I'll definetly have the merge posted by Sometime tomorrow if I don't
finish tonight. I have set a goal of a playable version by 08/31/2023.
-
- Posts: 34
- Joined: Sat Feb 19, 2022 4:44 pm
Re: NEW GAME IN BASIC... HANGMAN EARLY DAYS.
ahenry3068 had requested some title screen music, here's a short example loop. Because FMPLAY doesn't allow interruptions except with the STOP key, I used FMCHORD which starts notes playing and then returns immediately. I put the note delays in a FOR loop so it can be interrupted at any time.
Code: Select all
10000 FMINIT
10010 RESTORE 10500
10020 READ PS$,DL
10030 IF DL=0 GOTO 10010
10040 FMCHORD 0,PS$
10050 FOR I=1 TO DL
10060 GET A$
10070 IF ASC(A$)<>0 THEN 11000
10080 SLEEP
10090 NEXT
10100 GOTO 10020
10500 DATA "O4V63I0CO3V50I18CV50I18E-V50I18G",60,"O4CO3E-G-B-",45,"O4C",15
10510 DATA "O4CO3CE-G",60,"RE-G-B-",60,"O4CO3CE-G",60,"O4CO3E-G-B-",45
10520 DATA "O4C",15,"O4CO3CE-G",60,"RE-G-B-",60,"O4CO3CE-G",60
10530 DATA "O4CO3E-G-B-",45,"O4C",15,"O4CO3CE-G",60,"O4E-O3E-G-B-",45,"O4D",12
10540 DATA "E-",3,"O4DO3CE-G",45,"O4C",15,"O4CO3E-G-B-",45,"O4C",15
10550 DATA "O4CO3CE-G",60,"RE-G-B-",60,"",0
11000 FMINIT:REM STOP SOUND, CONTINUE
- ahenry3068
- Posts: 1138
- Joined: Tue Apr 04, 2023 9:57 pm
Re: NEW GAME IN BASIC... HANGMAN EARLY DAYS.
That Music is going on the Splash Screen.
Thanks to MooingLemur....... I can kind of code.. But music isn't something my brain does well
I'm alway happy for help.
Thanks to MooingLemur....... I can kind of code.. But music isn't something my brain does well
I'm alway happy for help.
- ahenry3068
- Posts: 1138
- Joined: Tue Apr 04, 2023 9:57 pm
INTRO MERGED
Ok. I finished merging the Intro into the Main Code Base.
Next time I start a large BASIC project I'm going with BASLOAD.
My major bugs keep end up being typo's on line numbers... (SUCH IS BASIC !!)
Anyway. I added a credit for MooingLemur on the Splash screen. I'm next making his music code play
on the Splash screen. Depending on how it goes could even post later tonight. I've got a little
coding time left. Then ON TO GAME LOGIC !
CURRENT HANGMAN CODE
Next time I start a large BASIC project I'm going with BASLOAD.
My major bugs keep end up being typo's on line numbers... (SUCH IS BASIC !!)
Anyway. I added a credit for MooingLemur on the Splash screen. I'm next making his music code play
on the Splash screen. Depending on how it goes could even post later tonight. I've got a little
coding time left. Then ON TO GAME LOGIC !
CURRENT HANGMAN CODE
Code: Select all
10 SCREEN $80
15 DIM EC%(15):DIM TC(2,8)
20 GOSUB 45000 : REM INITIALIZE DEFAULT PALLETTE
25 GOSUB 59000 : REM INITIALIZE ALL VARIABLES
40 RECT 0,0,319,239,$3B
45 RECT 3,3,316,236,$10:GOSUB 1000
50 DC$=CHR$(228):GOSUB 150
55 DC$=CHR$(162):GOSUB 150
60 REM GOSUB TO MAKE 166 TO SOLID BLOCK CHAR
65 DC$=CHR$(113):GOSUB 150
70 CHAR 75,165,$A9,CHR$($0C)+"THE CLASSIC WORD GAME"
75 CHAR 62,180,$AB,CHR$($0C)+"NOW ON THE COMMANDER X16"
80 CHAR 4,222,1,"CODED IN BASIC"
85 CHAR 4,232,1,"2023.. ANTHONY HENRY"
86 CHAR 185,222,1,"MUSIC CONTRIBUTED BY"
87 CHAR 205,232,1,"MOOINGLEMUR"
90 GOSUB 270:GOSUB 300
100 GET X$:IF X$<>"" THEN 100 : REM FLUSH KEYBOARD BUFFER
110 GET X$
115 GOSUB 275:IF X$="" THEN 110
120 FOR X = 1 TO 30
125 LOCATE 1,1:PRINT CHR$(145)
130 GOSUB 275:SLEEP 10
135 NEXT X
140 GOTO 2640
150 X = 5:Y=2:UC=1:WD$="Hang"
155 GOSUB 39600
160 X=8:Y=11:WD$="Man"
165 GOSUB 39600
170 RETURN
REM PALLETTE ANIMATION FOR TITLE SCREEN
270 P1=13
275 IF P1=2 THEN P2=13:GOTO 285
280 P2 = P1 - 1
285 SLEEP 0:GOSUB 40500
290 P1 = P1 - 1:IF P1<2 THEN P1=13
295 RETURN
300 LINE 180,210,300,210,$53
311 LINE 180,209,299,209,$53
320 LINE 300,210,300,17,$53
321 LINE 299,209,299,18,$53
325 LINE 300,17,100,17,$53
326 LINE 299,18,100,18,$53
400 LINE 102,19,102,38,$57
405 Q1=1:Q2=1:Q3=1:Q4=1:FILL=0:CC=$57:YS=.4:XS=0:RA=13:CX=102:CY=45
410 GOSUB 3000
425 YS=0:XS=.8:CY=35:RA=9:CC=$25:FILL=1:GOSUB 3000
426 CX=CX-3:RA=2:CY=CY-2:CC=2:GOSUB 3000:CX=CX+6:GOSUB 3000
430 LINE 102,44,102,49,$25
435 LINE 102,51,102,78,$25
440 LINE 102,53,88,64,$25
445 LINE 102,53,116,64,$25
450 LINE 102,78,87,99,$25
455 LINE 102,78,117,99,$25
500 RETURN
1000 R%=15:G%=0:B%=2
1005 P1=$3B:P2=10:GOSUB 41000
1006 P1=1:P2=11:GOSUB 41000
1007 P1=$C7:P2=12:GOSUB 41000
1008 P1=$A0:P2=13:GOSUB 41000
1010 FOR I= 2 TO 9
1015 TC(2,I-1) = 0
1020 TC(1,I-1) = I
1025 P1 = I:GOSUB 40000:R%=R%-1
1030 IF I/3 = INT(I/3) THEN R%=R%-1:G%=G%+1
1050 NEXT I
1090 RETURN
2640 GOSUB 45000:GOSUB 59300
REM THE BACKGROUND
2650 GOSUB 5000
REM GALLOWS
2655 GOSUB 7000
REM ROPE
2660 GOSUB 8000
REM THE HEAD AND FACE
2665 GOSUB 9500
REM TORSO
2670 GOSUB 10000
REM LEFT ARM
2675 GOSUB 11000
REM RIGHT ARM
2680 GOSUB 12000
REM RIGHT LEG
2685 GOSUB 12500
REM LEFT LEG
2690 GOSUB 12620
2695 DM$="AWAITING KEY":GOSUB 20000:GOSUB 63000
2700 GOSUB 20100
REM DEADFACE
2705 GOSUB 4000
REM PULSING EYES
2710 GOSUB 4200
REM RESTORE DRAWING PALLETTE
2715 GOSUB 59300
2720 COLOR 1,6
2725 LOCATE 6,14:PRINT " ";
2730 LOCATE 7,14:PRINT " WORKING WORD HERE ";
2735 LOCATE 8,14:PRINT " ";
2740 DM$=" CLUE GOES HERE : ANY KEY TO END DEMO":GOSUB 20000
2745 GOSUB 63000:REM AWAIT KEY
2746 GOSUB 45000:REM RESTORE VERA DEFAULT PALLETTE
2750 SCREEN 0:END
2998 REM CIRCLE,ELLIPSE AND ARC SUBROUTINE
2999 REM SINE/COSINE ALGORITHM
3000 Q = 1 / RA
3010 IF FILL = 1 THEN Q = .2/RA
3030 FOR I = 0 TO PI / 2 STEP Q
3040 DY = SIN(I) * RA
3050 IF YS > 0 AND YS < 1 THEN DY = DY*YS
3060 DX = COS(I) * RA
3070 IF XS > 0 AND XS < 1 THEN DX = DX*XS
3080 ZX = INT(CX - DX)
3090 ZY = INT(CY - DY)
3100 AX = INT(CX + DX)
3110 AY = INT(CY + DY)
3115 IF FILL = 1 THEN 3220
3120 IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT OR Q4 = 0 THEN 3140
3130 PSET AX, AY, CC
3140 IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT OR Q3 = 0 THEN 3160
3150 PSET ZX, AY, CC
3160 IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q2 = 0 THEN 3180
3170 PSET AX, ZY, CC
3180 IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q1 = 0 THEN 3300
3190 PSET ZX, ZY, CC
3200 GOTO 3300
3220 IF Q4<> 0 THEN LINE CX,CY,AX,AY,CC
3225 IF Q3<> 0 THEN LINE CX,CY,ZX,AY,CC
3230 IF Q2<> 0 THEN LINE CX,CY,AX,ZY,CC
3235 IF Q1<> 0 THEN LINE CX,CY,ZX,ZY,CC
3300 NEXT I
3310 RETURN
REM DEADFACE
4000 P1=$24:P2=$FF:J=4:GOSUB 40200
4010 P1=$3B:P2=$FE:J=4:GOSUB 40200
4011 P1=$01:J=5:GOSUB 40200
4012 P1=$3A:J=3:GOSUB 40200
4013 P1=$15:J=5:GOSUB 40200
4014 P1=$3B:J=7:GOSUB 40200
4015 P1=$23:P2=$FF:J=8:GOSUB 40200
4016 P1=$B8:J=7:GOSUB 40200
4020 P1=$BF:GOSUB 40200
4030 P1=$C0:GOSUB 40200
4100 RETURN
REM EYE PULSING WHILE WAIT FOR KEY
4200 P2=$FE
4205 GET X$:IF X$<>"" THEN 4205
4210 GET X$
4215 IF X$<>"" THEN RETURN
4220 I=INT(RND(1)*15)+1
4225 P1 = EC%(I):J=INT(RND(1)*3)+2
4230 GOSUB 40200
4235 GOTO 4210
REM IY LOCATE Y LOCATION
REM IX LOCATE X LOCATION
REM ML MAX LENGTH OF STRING TO GET (1 TO 80)
REM IT TYPE OF INPUT 1=ALPHA ONLY, 2=NUMERIC(INCLUDE 1 AND ONLY 1 DECIMAL
REM POINT)
REM 3=ALPHANUMERIC, 4=LINE INPUT(CAN INCLUDE SPACE AND
REM TAB AND PUNCTUATION MARKS)
REM IS$ THE STRING TO RETURN
REM AC ADD CHAR 1=YES
REM ID DECIMAL DONE 1=YES
REM SPECIALIZED INPUT ROUTINE
4800 GET X$:IF X$<>"" THEN 4800 : REM FLUSH KEYBOARD BUFFER
4801 IS$="":ID=0: REM BEFORE INPUT BEGINS
4805 GOSUB 4920 : REM CLEAR THE INPUT AREA.
4810 GET X$:IF X$="" THEN 4810
4811 C=ASC(X$)
4815 IF WL=ML THEN
4820 AC=0
4830 IF (IT<>2 OR IT=3) AND C>=65 AND C<=90 THEN AC=1
4835 IF (IT=2 OR IT=4 OR IT=3) AND C>=48 AND C<=57 THEN AC=1
4840 IF (IT=2) AND C=46 AND ID=0 THEN AC=1:ID=1
4845 IF (IT=4) AND C=32 THEN AC = 1: REM ALLOW SPACES WHEN INPUTTING A LINE
4846 IF (IT=4) AND (C>=35 AND C<=47) THEN AC=1
4847 IF (IT=4) AND (C>=58 AND C<=63) THEN AC=1 : REM ALLOW PUNCS IN STRING.
4850 IF C=13 THEN RETURN
4855 IF AC=1 AND LEN(IS$)<ML THEN PRINT CHR$(C);:IS$=IS$+CHR$(C):GOTO 4810
4860 IF C<>20 THEN 4895
4861 IF LEN(IS$) = 0 THEN PRINT CHR$(7);
4865 IF LEN(IS$)=1 OR LEN(IS$)=0 THEN IS$="":GOSUB 4920:GOTO 4810
4870 I = LEN(IS$)-1
4871 IF RIGHT$(IS$,1)="." AND IT=2 THEN ID=0
4875 IS$=LEFT$(IS$,I)
4890 GOSUB 4920:PRINT IS$;:GOTO 4810
4895 PRINT CHR$(7);:GOTO 4810
4920 LOCATE IY,IX:FOR I = 1 TO ML+1:PRINT " ";:NEXT I
4921 LOCATE IY,IX
4925 RETURN
5000 DM$="DRAWING: THE SKY":GOSUB 20000
5001 RECT 0,0, XLIMIT, YLIMIT, 14 : REM THE SKY
5010 CX = 5:CY=4:CC = $10:FILL = 0:XS=0:YS=0:RA = 33
5020 GOSUB 3000:RA=RA-.5:GOSUB 3000:RA=RA-.6:GOSUB 3000:RA = RA+1.2:GOSUB 3000
5029 DM$="DRAWING: THE SUN":GOSUB 20000
5030 CC = $07
5035 RECT 0,0,27,25,CC:RECT 0,26,22,29,CC
5036 RECT 0,30,19,31,CC:RECT 0,32,14,33,CC
5037 RECT 28,0,34,14,CC:RECT 28,14,31,20,CC
5045 FOR RA = 31 TO 29 STEP -.75:GOSUB 3000:NEXT RA:PSET CX,CY,$07
5046 REM BRUTE FORCE, RAYS FROM THE SUN...
5050 LINE 2,36,2,42,$07:LINE 6,36,6,43,$07
5051 LINE 9,36,10,42,$07:LINE 13,36,15,41,$07
5052 LINE 15,33,18,40,$07:LINE 18,33,21,39,$07
5053 LINE 20,31,24,38,$07:LINE 22,29,27,37,$07
5054 LINE 24,27,29,35,$07:LINE 27,25,32,32,$07
5055 LINE 30,23,35,29,$07:LINE 32,21,37,26,$07
5056 LINE 33,19,39,23,$07:LINE 35,17,41,20,$07
5057 LINE 36,15,42,17,$07:LINE 36,13,43,14,$07
5058 LINE 37,11,44,11,$07:LINE 37,8,44,8,$07
5060 LINE 37,5,45,5,$07:LINE 37,2,44,2,$07
5095 GOSUB 6500:GOSUB 6500:GOSUB 6500:GOSUB 6500 REM DRAW CLOUDS
5100 DM$="DRAWING GRASS":GOSUB 20000
5110 RECT 0, 180, XLIMIT, YLIMIT, $85 : REM THE GRASS
5120 FOR Y = 161 TO 179
5130 LINE 0, Y, 40, 179, 105
5140 NEXT Y
5150 FOR Y = 180 TO 150 STEP -1
5160 LINE 288,179, XLIMIT, Y, 105
5170 NEXT Y
5171 COLOR 1
5180 GOSUB 6000:REM DRAW GRASS STUFF
5190 GOSUB 6000
5200 GOSUB 6000
5210 RETURN
6000 FOR I = 1 TO 35:REM RANDOM GRASS
6110 X1 = INT(RND(1)*310) + 5
6120 Y1 = INT(RND(1)*60) + 180:IF Y1 > YLIMIT THEN GOTO 6120
6130 X2 = INT(RND(1)*310) + 5:IF X2 = X1 THEN GOTO 6130
6140 Y2 = INT(RND(1)*60) + 180:IF Y2 = Y1 OR Y2 > YLIMIT THEN GOTO 6140
6145 IF X2 - X1 > 55 OR X1 - X2 > 55 THEN GOTO 6110
6146 IF Y2 - Y1 > 12 OR Y1 - Y2 > 15 THEN GOTO 6110
6150 REM GOSUB 6400:LINE X1,Y1,X2,Y2, GC
6155 PSET X1, Y1 - 1, 133:PSET X1 , Y1-1, 104:PSET X2, Y1 - 3,107
6160 GOSUB 6200:X1=X2:Y1=Y2:GOSUB 6200
6180 NEXT I
6185 FOR I = 1 TO 10:X1=INT(RND(1)*310)+5:Y1=INT(RND(1)*4)+180
6186 GOSUB 6200:NEXT I
6190 RETURN
6200 GOSUB 6400
6210 LINE X1,Y1,X1-4,Y1-5,GC:GOSUB 6400
6215 LINE X1,Y1,X1-3,Y1-3,GC:GOSUB 6400
6220 LINE X1,Y1,X1,Y1-5,GC:GOSUB 6400
6225 LINE X1,Y1,X1+3,Y1-3,GC:GOSUB 6400
6230 LINE X1,Y1,X1+4,Y1-5,GC
6235 RETURN
6400 GC=INT(RND(1)*24)+$60:RETURN
6500 REM SUPPOSED TO BE A CLOUD HERE
6501 Q1=1:Q2=1:Q3=1:Q4=1:FILL=1
6502 DM$="DRAWING CLOUDS":GOSUB 20000
6540 H = INT(RND(1)*(165))+ 45
6541 HL = INT(RND(1)*30)+25
6545 V = INT(RND(1)*30) + 6
6550 VB = INT(RND(1)*11) + 7
6555 FOR Y = V TO V+VB STEP 3
6560 FOR X = H TO H + HL STEP 4
6580 RA = INT(RND(1)*5)+3
6585 CC = INT(RND(1)*4)+ $1C
6590 CX=X
6592 CY= INT(RND(1)*4) + (Y-4):IF (CY - RA) < 0 THEN 6580
6600 GOSUB 6800
6605 NEXT X
6610 NEXT Y
6615 RETURN
6800 REM MIDPOINT CIRCLE ALGORITHM
6801 REM FILLED
6805 T1=RA/16:XA=RA:YA=0
6810 LINE CX+(XA),CY+(YA),CX-(XA),CY+(YA),CC
6815 LINE CX+(YA),CY+(XA),CX-(YA),CY+(XA),CC
6820 LINE CX+(XA),CY-(YA),CX-(XA),CY-(YA),CC
6825 LINE CX+(YA),CY-(XA),CX-(YA),CY-(XA),CC
6830 YA=YA+1
6835 T1=T1+YA
6840 T2=T1-XA
6845 IF T2 >= 0 THEN T1=T2:XA=XA-1
6850 IF XA>=YA THEN 6810
6855 RETURN
7000 REM THE GALLOWS
7001 DM$="THE GALLOWS":GOSUB 20000
7010 FRAME 189,195,285,208,$10
7020 FRAME 188,194,285,211,$10
7021 LINE 189,210,285,210,$10
7022 PSET 189,209,$10
7023 PSET 284,206,$10
7024 PSET 284,209,$10
7030 FRAME 275,21,285,207,$10
7040 FRAME 276,22,284,205,$10
7050 FRAME 67,20,285,30,$10
7060 FRAME 68,21,284,29,$10
7070 RECT 71,30,79,33,$10
7080 RECT 190,196,283,209,$53
7090 RECT 277,23,283,209,$53
7100 RECT 69,22,283,28,83
7150 RETURN
REM THE ROPE
8000 DM$="DRAWING: THE NOOSE":GOSUB 20000
8005 FILL = 0
8010 LINE 73,33,73,53,16
8020 LINE 77,33,77,53,16
8030 RECT 74,34,76,53,87
8040 FOR Y = 38 TO 53 STEP 3
8050 LINE 73, Y, 77, Y - 3, $10
8060 NEXT Y
8070 FRAME 71,53,80, 68, 16
8080 RECT 72,54,79,68,87
8090 FOR Y = 56 TO 68 STEP 4
8100 LINE 72,Y,79, Y-4, $10
8110 NEXT Y
8120 REM THE NOOSE
8130 RA = 24
8140 YS = .38
8150 CX = 75:CY = 79:CC = 16
8160 GOSUB 3000:RA=25:GOSUB 3000
8165 RA = 24:GOSUB 3000
8170 RA = 19:GOSUB 3000
8175 RA = 18:GOSUB 3000
8180 CC = 87
8190 FOR X = 20 TO 23 STEP .4
8200 RA = X:GOSUB 3000
8210 NEXT X
9000 YS=0:RETURN
REM END ROPE
REM THE FACE
9500 DM$="DRAWING: A TROUBLED FACE":GOSUB 20000
9501 CX = 59:CY = 60:RA = 6:XS = .4:CC = $10
9505 Q1=1:Q2=0:Q3=1:Q4=0
9510 GOSUB 3000:RA = RA - 1:GOSUB 3000
9520 RA = RA - 1:FILL = 1:CC = $25:GOSUB 3000
9530 FILL=0:CX = 89:RA = 6:CC=$10
9531 Q1=0:Q2=1:Q3=0:Q4=1
9540 GOSUB 3000:RA = RA - 1:GOSUB 3000
9550 RA = RA - 1:FILL = 1:CC = $25:GOSUB 3000
9555 Q1=1:Q2=Q1:Q3=Q1:Q4=Q1
REM DRAW HIS NECK
9560 LINE 67,76,67,84,$10
9570 LINE 66,76,66,84,$10
9580 LINE 67,87,67,90,$10:LINE 66,87,66,90,$10
9590 LINE 82,76,82,84,$10
9600 LINE 83,76,83,84,$10
9605 LINE 82,87,82,90,$10:LINE 83,87,83,90,$10
9610 RECT 68,76,81,84,$25
9620 RECT 68,89,81,90,$25
9621 REM END NECK
9630 RA = 20:XS = .8:FILL = 0
9640 CC = $10:CX = 74:CY = 63
9650 GOSUB 3000:RA = RA -1:GOSUB 3000
9660 RA = RA -1:GOSUB 3000:RA = RA -1:GOSUB 3000
9665 CY = CY - 1:GOSUB 3000:CY = CY -1:GOSUB 3000:CY=CY + 2
9670 RA = RA :CC = $FF:FILL=1:CY = CY + 1:GOSUB 3000
9672 RECT 62,54,85,73,CC
9680 XS = 1:YS = XS
9690 CY = CY - 6:CX = CX - 6:RA=4:CC = $FE:GOSUB 3000
9700 PSET CX+4,CY,$FF:GOSUB 9950:REM THE PUPILS OF HIS EYES
9710 CX = CX + 12:GOSUB 3000
9720 PSET CX+4,CY,$FF:GOSUB 9950:CX = 74:CY = 63
9730 LINE CX-1,CY, CX - 2, CY + 6, $10
9740 LINE CX+1,CY, CX + 2, CY + 6, $10
9750 LINE CX,CY,CX -1, CY + 6, $23
9760 LINE CX,CY,CX + 1, CY + 6, $23
9770 LINE CX,CY+3,CX,CY+6,$22
9780 Q3=0:Q4=0:CC=$10:CY = CY + 13:YS=.35:RA=6:FILL=0
9790 GOSUB 3000
9800 CY = CY + 1:CC=$31:GOSUB 3000
9805 CY = CY + 1:CC=$10:GOSUB 3000
9806 Q3=1:Q4=1:YS=0: REM REMEMBER TO TURN CIRCLE FULLY ON !!!
9810 RETURN
9949 REM THE PUPILS
9950 PSET CX,CY, $10:PSET CX -1,CY,$10
9955 PSET CX,CY -1,$10:PSET CX - 1, CY -1 ,$10
9960 RETURN
REM END FACE
REM THE TORSO
10000 DM$="DRAWING: TORSO":GOSUB 20000
10001 LINE 82,90,105,93,$10
10005 LINE 83,91,105,94,$10
10010 LINE 68,90,42,93, $10
10015 LINE 69,91,42,94, $10
10020 LINE 67,90,74,105,$10
10025 LINE 83,90,74,105,$10
10026 REM THIS FOR LOOP FILLS IN THE NECKLINE
10030 FOR X = 81 TO 68 STEP -1
10035 LINE 75,103,X, 90, $25
10040 NEXT X
10053 LINE 74,105,72,110,$10
10054 LINE 72,110,72,141,$10
10055 LINE 72,141,53,144,$10
10060 LINE 53,144,53,108,$10
10065 RECT 71,140,54,103,$08
10066 LINE 54,141,68,141,$08
10067 LINE 54,142,62,142,$08
10068 LINE 54,143,56,143,$08
10069 PSET 65,91,$10
10070 LINE 72,102,72,108,$08
10071 LINE 73,104,73,106,$08
10072 PSET 74,109,$08
10073 RECT 47,107,68,94,$08
10074 RECT 69,96,69,99,$08
10076 RECT 42,107,48,95,$08
10077 LINE 56,93,67,93, $08:PSET 55,92,$10:PSET 64,91,$10
10078 LINE 65,92,67,92, $08
10079 RECT 68,100,71,102,$08
10080 LINE 70,98,70,100, $08
10090 RECT 73,110,91,140,$08
10095 RECT 75,105,91,109,$08
10120 RECT 88, 94, 101, 106, $08
10125 RECT 81, 95, 105, 106, $08
10130 LINE 80, 96, 80, 105, $08
10135 LINE 79,98,79,105, $08
10140 LINE 78,100,78,105,$08
10145 LINE 77,101,77,105,$08
10150 LINE 76,103,76,105,$08
10155 LINE 74,103,75,103, $10
10160 PSET 76,101,$10:PSET 73,101,$10:PSET 72,99,$10:PSET 71,97,$10
10165 PSET 70,95,$10:PSET 69,93,$10:PSET 81,92,$10:PSET 80,94,$10
10166 PSET 80,96,$10:PSET 78,97,$10:PSET 77,99,$10
10167 LINE 76,100,76,103,$10
10175 RECT 82, 94, 93, 93, $08
10180 LINE 83, 92, 86, 92, $08
10185 LINE 74, 107,74, 108,$08
10190 PSET 73,109,$10
10195 PSET 73,141,$10
10200 LINE 76,141,91,141,$08
10205 LINE 81,142,91,142,$08
10210 LINE 89,143,91,143,$08
10360 LINE 74,141,92,144,$10
10365 LINE 92,144,92,107,$10
12366 PSET 73,141,$10 : REM STRAY PIXEL AT WAISTLINE
REM SHIRT BUTTONS
10370 CC = 16:RA = 1
10375 CX = 76:FILL = 1
10385 FOR CY = 112 TO 142 STEP 8
10390 GOSUB 3000
10400 NEXT CY
REM POCKET AND PRISONER NUMBER
10410 LINE 58,108,68,108,$10
10415 LINE 58,108,58,116,$10
10420 LINE 68,108,68,116,$10
10425 Q1=0:Q2=0:Q3=1:Q4=1:RA=4.5:XS=0:YS=.6
10430 CX = 63:CY=116:CC=$10:FILL=0
10435 GOSUB 3000
10436 PN$="P-1"
10440 CHAR 57,106,$10,PN$
10600 RETURN
10999 REM ARM ON THE RIGHT (LEFT ARM)
11000 Q1=0:Q2=1:Q3=0:Q4=0:FILL = 0
11005 DM$="DRAWING: LEFT ARM":GOSUB 20000
11010 XSQUISH = .52
11020 RA = 16:CC=$10
11030 CY = 116:CX = 92
11035 GOSUB 3000:RA=RA+.6
11040 GOSUB 3000
11060 RA=RA-1:GOSUB 3000
11090 XSQUISH=.28:CX = 106:CY = 105:FILL=0
11095 GOSUB 3000
11096 FOR L = 1 TO 3:RA=RA+.5:GOSUB 3000:NEXT L
11100 CC = $08:Q1=0:Q2=1:Q3=0:Q4=0
11105 FOR RA = 14 TO 12 STEP -.7
11110 GOSUB 3000:IF RA =12 THEN Q1=1
11115 NEXT RA
11116 RECT CX-1,CY-3,CX+1,CY-7,$08
11120 LINE 99,115,99,133,$10
11130 LINE 111,102,111,133,$10
11135 RECT 100,102,110,133,$08
11140 LINE 99,107,99,109,$08
11145 LINE 98,108,101,108,$08
11150 LINE 97,107,100,107,$08 :PSET 94,107,$0E
11155 LINE 99,134,111,134,$10
REM (THE LEFT HAND)
11160 LINE 101,134,101,143,$10
11165 LINE 101,143,103,143,$10
11166 LINE 102,142,102,139,$25
11170 LINE 103,144,103,140,$10
11175 LINE 103,145,105,145,$10
11176 LINE 104,144,104,139,$25
11180 LINE 105,146,105,140,$10
11185 LINE 105,146,107,146,$10
11186 LINE 106,145,106,139,$25
11190 LINE 107,146,107,140,$10
11195 LINE 107,145,109,145,$10
11196 LINE 108,144,108,139,$25
11200 LINE 109,145,109,134,$10
11205 RECT 102,139,108,135,$25
11210 RETURN
REM ARM ON THE LEFT (RIGHT ARM)
12000 Q1=1:Q2=0:Q3=0:Q4=0:FILL = 0
12010 XSQUISH = .52
12020 RA = 16:CC=$10
12030 CY = 118:CX = 54
12031 DM$="DRAWING: RIGHT ARM":GOSUB 20000
12035 GOSUB 3000:RA=RA+.6
12040 GOSUB 3000
12060 RA=RA-1:GOSUB 3000
12090 XSQUISH=.43:CX = 42:CY = 105:FILL=0
12095 GOSUB 3000
12096 FOR L = 1 TO 3:RA=RA+.3:GOSUB 3000:NEXT L
12100 CC = $08:Q1=1:Q2=0:Q3=0:Q4=0
12105 FOR RA = 14 TO 12 STEP -.7
12110 GOSUB 3000:IF RA =12 THEN Q1=1
12115 NEXT RA
12116 RECT CX-4,CY-8,CX+3,CY+6,$08
12117 RECT CX-4,CY-4,CX,CY+6,$08
12120 LINE 34,102,34,133,$10
12130 LINE 46,115,46,133,$10
12135 RECT 35,102,45,133,$08
12136 LINE 34,134,46,134,$10
12140 LINE 46,CY,46,CY+6,$08
12142 LINE 47,CY,47,CY+5,$08
12145 RECT 47,CY,49,CY+3,$08
12150 LINE 51,CY+4,52,CY+4,$0E
12155 PSET 48,CY+4, $08
REM (THE LEFT HAND)
12160 LINE 44,134,44,143,$10
12165 LINE 44,143,42,143,$10
12166 LINE 43,142,43,139,$25
12170 LINE 42,140,42,145,$10
12175 LINE 42,145,40,145,$10
12176 LINE 41,144,41,139,$25
12180 LINE 40,146,40,140,$10
12185 LINE 40,146,38,146,$10
12186 LINE 39,145,39,139,$25
12190 LINE 38,146,38,140,$10
12195 LINE 38,145,36,145,$10
12196 LINE 37,144,37,139,$25
12200 LINE 36,145,36,134,$10
12205 RECT 43,139,37,135,$25
12210 RETURN
REM RIGHT LEG
12500 Q1=1:Q2=0:Q3=0:Q4=0
12505 CC=$10:CX=74:CY=159:RA=8:XQUISH=.10
12506 DM$="DRAWING: RIGHT LEG":GOSUB 20000
12510 GOSUB 3000
12515 LINE 70,159,70,192,$10
12520 LINE 55,145,53,192,$10
12525 LINE 53,193,70,193,$10
12530 RECT 56,145,69,192,$46
12535 LINE 55,157,55,192,$46
12540 LINE 54,181,54,192,$46
12555 LINE 57,144,71,144,$46
12560 RECT 69,142,71,154,$46
12565 RECT 72,142,73,153,$46
12570 LINE 63,143,68,143,$46
12575 PSET 70,155,$46
REM THE FOOT
12580 Q1=1:Q2=1:Q3=1:Q4=1:RA=20:XS=.35:CC=$10:FILL=1:CX=62:CY=208
12585 GOSUB 3000:RA=RA+1:FILL=0:CC=$12:GOSUB 3000:FILL=1
12590 XS=.38:CY=204:CC=$1C:RA=11:GOSUB 3000
12591 RA = RA + 1:CC=$12:FILL=0:GOSUB 3000
12595 LINE 57,193,57,202,$10
12600 LINE 66,193,66,202,$10
12605 RECT 58,194,65,200,$1C
12610 RETURN
REM LEFT LEG
12620 Q1=0:Q2=1:Q3=0:Q4=0
12625 CC=$10:CX=74:CY=159:RA=8:XQUISH=.10
12626 DM$="DRAWING: LEFT LEG":GOSUB 20000
12630 GOSUB 3000
12635 LINE 77,157,77,192,$10
12640 LINE 90,145,92,192,$10
12645 LINE 77,193,92,193,$10
12650 RECT 78,145,89,192,$46
12655 LINE 90,157,90,192,$46
12660 LINE 91,181,91,192,$46
12665 LINE 74,144,88,144,$46
12670 RECT 76,143,79,154,$46
12675 RECT 74,142,76,153,$46
12680 LINE 74,143,82,143,$46
12685 LINE 77,154,77,156,$46
REM THE FOOT
12690 Q1=1:Q2=1:Q3=1:Q4=1:RA=20:XS=.35:CC=$10:FILL=1
12695 CX=85:CY=208
12700 GOSUB 3000
12705 RA=RA+1:FILL=0:CC=$12:GOSUB 3000:FILL=1
12710 XS=.38:CY=204:CC=$1C:RA=11:GOSUB 3000
12715 RA = RA + 1:CC=$12:FILL=0:GOSUB 3000
12720 LINE 80,193,80,202,$10
12725 LINE 89,193,89,202,$10
12730 RECT 81,194,88,200,$1C
12740 RETURN
REM THIS ROUTINE SAVES THE SCREEN TO "BG.DAT" FOR
REM SUBSEQUENT BVLOAD. TESTED AND WORKS
REM NOT CURRENTLY USED. VERY SLOW
15000 OPEN 8,8,8,"BG.DAT,S,W"
15010 FOR P = 0 TO 65535
15020 PRINT#8,CHR$(VPEEK(0,P));
15021 PRINT ST,P
15030 NEXT P
15040 FOR P = 0 TO 11264
15050 PRINT#8,CHR$(VPEEK(1,P));
15051 PRINT ST,P,
15060 NEXT P
15070 CLOSE 8
15080 RETURN
REM PLACE A MESSAGE ON THE BOTTOM OF THE SCREEN
20000 COLOR 1,0
20005 GOSUB 20100
20010 LOCATE 30,2:PRINT DM$;
20020 RETURN
20100 LOCATE 30,2:PRINT " ";
20101 RETURN
REM BIGWORD ROUTINE.. READS ROM FONT AND BLOWS IT UP
39600 L = LEN(WD$)
39660 SX = X
39665 OB=PEEK(1)
39670 BANK PEEK(0),6
39675 FOR K = 1 TO L
39680 CC=ASC(MID$(WD$,K,1))
REM READ IN A CHARACTER MAP CC
REM AND PRINT IT OUT AT Y,X
39685 IF (CC>=64 AND CC<=90) OR (CC>=193 AND CC<=218) THEN AA=64:GOTO 39695
39690 AA = 0
39695 CA = $C000 + 8*(CC-AA)
39700 FOR I = 1 TO 8
39710 CM(I) = PEEK(CA+(I-1)):CM$(I)=""
39715 NEXT I
39720 IF DC$="" THEN DC$=CHR$(CC)
39725 FOR J = 1 TO 8
39730 RESTORE 50200
39735 FOR CT = 1 TO 8
39740 READ CP
39745 IF (CP AND CM(J)) THEN CM$(J)=CM$(J)+DC$:GOTO 39755
39750 CM$(J)=CM$(J)+CHR$(32)
39755 NEXT CT
39760 LOCATE Y+(J-1),X:IF UC=1 THEN COLOR TC(1,J),TC(2,J)
39765 PRINT CM$(J);
39770 NEXT J
39775 IF DC$=CHR$(CC) THEN DC$=""
39780 X=X+8
39785 NEXT K
39790 X=SX
39795 BANK PEEK(0),OB
39800 RETURN
REM SET PALLETTE ENTRY P1 TO R%,G%,B%
40000 VPOKE 1,$FA00+(P1*2),(G%*16) + B%
40010 VPOKE 1,$FA00+((P1*2)+1),R%
40020 RETURN
REM READ PALLETTE ENTRY AT P1
REM RETURNED IN %R,%G,%B
40100 A1 = $FA00+(P1*2)
40105 R% = VPEEK(1,A1+1)
40110 GB%= VPEEK(1,A1)
40115 G% = GB%/16
40120 B% = GB% AND $0F
40125 RETURN
REM FADE P2 FROM CURRENT COLOR TO P1 COLOR, J IS JIFFY DELAY
40200 GOSUB 40100
40205 P3=P1
40210 P1=P2
40215 GOSUB 40300
40220 P1=P3
40225 RETURN
REM FADE P1 TO R%,G%,B%, J IS JIFFY DELAY
40300 DR%=R%:DG%=G%:DB%=B%
40305 GOSUB 40100
40310 RI=1:IF DR%<R% THEN RI=-1
40315 GI=1:IF DG%<G% THEN GI=-1
40320 BI=1:IF DB%<B% THEN BI=-1
40325 IF DR%<>R% THEN R%=R%+RI
40330 IF DG%<>G% THEN G%=G%+GI
40335 IF DB%<>B% THEN B%=B%+BI
40340 GOSUB 40000
40345 SLEEP J
40350 IF DR%=R% AND DG%=G% AND DB%=B% THEN 40360
40355 GOTO 40325
40360 RETURN
REM SWAP PALLETTE COLORS AT P1 & P2
40500 A1 = $FA00+(P1*2)
40505 A2 = $FA00+(P2*2)
40510 B1 = VPEEK (1,A1)
40515 B2 = VPEEK (1,A1+1)
40520 B3 = VPEEK (1,A2)
40525 B4 = VPEEK (1,A2+1)
40530 VPOKE 1, A1, B3
40535 VPOKE 1, A1+1, B4
40450 VPOKE 1, A2, B1
40455 VPOKE 1, A2+1, B2
40560 RETURN
REM COPY P1 PALLETTE ENTRY TO P2.. P1 IS LEFT UNCHANGED.
41000 VPOKE 1,$FA00+(P2*2), VPEEK(1, $FA00+(P1*2))
41010 VPOKE 1,$FA00+(P2*2)+1, VPEEK(1, $FA00+(P1*2)+1)
41020 RETURN
REM LOOP THROUGH THE PALLETTE ADDRESS SPACE
REM AND POKE THE VERA DEFAULT PALLETTE
45000 RESTORE 50000
45020 FOR PE = $FA00 TO $FBFE STEP 2
45025 READ R:READ GB
45030 VPOKE 1,PE,GB
45035 VPOKE 1,PE+1, R
45040 NEXT PE
45050 RETURN
REM DEFAULT VERA PALLETTE AS DATA. FROM 0 TO 255 (2 BYTES EACH ENTRY)RGB
50000 DATA $00,$00,$0F,$FF,$08,$00,$0A,$FE,$0C,$4C,$00,$C5,$00,$0A,$0E,$E7,$0D
50005 DATA $85,$06,$40,$0F,$77,$03,$33,$07,$77,$0A,$F6,$00,$8F,$0B,$BB,$00,$00
50010 DATA $01,$11,$02,$22,$03,$33,$04,$44,$05,$55,$06,$66,$07,$77,$08,$88,$09
50015 DATA $99,$0A,$AA,$0B,$BB,$0C,$CC,$0D,$DD,$0E,$EE,$0F,$FF,$02,$11,$04,$33
50020 DATA $06,$44,$08,$66,$0A,$88,$0C,$99,$0F,$BB,$02,$11,$04,$22,$06,$33,$08
50025 DATA $44,$0A,$55,$0C,$66,$0F,$77,$02,$00,$04,$11,$06,$11,$08,$22,$0A,$22
50030 DATA $0C,$33,$0F,$33,$02,$00,$04,$00,$06,$00,$08,$00,$0A,$00,$0C,$00,$0F
50035 DATA $00,$02,$21,$04,$43,$06,$64,$08,$86,$0A,$A8,$0C,$C9,$0F,$EB,$02,$11
50040 DATA $04,$32,$06,$53,$08,$74,$0A,$95,$0C,$B6,$0F,$D7,$02,$10,$04,$31,$06
50045 DATA $51,$08,$62,$0A,$82,$0C,$A3,$0F,$C3,$02,$10,$04,$30,$06,$40,$08,$60
50050 DATA $0A,$80,$0C,$90,$0F,$B0,$01,$21,$03,$43,$05,$64,$07,$86,$09,$A8,$0B
50055 DATA $C9,$0D,$FB,$01,$21,$03,$42,$04,$63,$06,$84,$08,$A5,$09,$C6,$0B,$F7
50060 DATA $01,$20,$02,$41,$04,$61,$05,$82,$06,$A2,$08,$C3,$09,$F3,$01,$20,$02
50065 DATA $40,$03,$60,$04,$80,$05,$A0,$06,$C0,$07,$F0,$01,$21,$03,$43,$04,$65
50070 DATA $06,$86,$08,$A8,$09,$CA,$0B,$FC,$01,$21,$02,$42,$03,$64,$04,$85,$05
50075 DATA $A6,$06,$C8,$07,$F9,$00,$20,$01,$41,$01,$62,$02,$83,$02,$A4,$03,$C5
50080 DATA $03,$F6,$00,$20,$00,$41,$00,$61,$00,$82,$00,$A2,$00,$C3,$00,$F3,$01
50085 DATA $22,$03,$44,$04,$66,$06,$88,$08,$AA,$09,$CC,$0B,$FF,$01,$22,$02,$44
50090 DATA $03,$66,$04,$88,$05,$AA,$06,$CC,$07,$FF,$00,$22,$01,$44,$01,$66,$02
50095 DATA $88,$02,$AA,$03,$CC,$03,$FF,$00,$22,$00,$44,$00,$66,$00,$88,$00,$AA
50100 DATA $00,$CC,$00,$FF,$01,$12,$03,$34,$04,$56,$06,$68,$08,$8A,$09,$AC,$0B
50105 DATA $CF,$01,$12,$02,$24,$03,$46,$04,$58,$05,$6A,$06,$8C,$07,$9F,$00,$02
50110 DATA $01,$14,$01,$26,$02,$38,$02,$4A,$03,$5C,$03,$6F,$00,$02,$00,$14,$00
50115 DATA $16,$00,$28,$00,$2A,$00,$3C,$00,$3F,$01,$12,$03,$34,$05,$46,$07,$68
50120 DATA $09,$8A,$0B,$9C,$0D,$BF,$01,$12,$03,$24,$04,$36,$06,$48,$08,$5A,$09
50125 DATA $6C,$0B,$7F,$01,$02,$02,$14,$04,$16,$05,$28,$06,$2A,$08,$3C,$09,$3F
50130 DATA $01,$02,$02,$04,$03,$06,$04,$08,$05,$0A,$06,$0C,$07,$0F,$02,$12,$04
50135 DATA $34,$06,$46,$08,$68,$0A,$8A,$0C,$9C,$0F,$BE,$02,$11,$04,$23,$06,$35
50140 DATA $08,$47,$0A,$59,$0C,$6B,$0F,$7D,$02,$01,$04,$13,$06,$15,$08,$26,$0A
50145 DATA $28,$0C,$3A,$0F,$3C,$02,$01,$04,$03,$06,$04,$08,$06,$0A,$08,$0C,$09
50150 DATA $0F,$0B
REM BITMAP VALUES FOR READING FONTS.
50200 DATA %10000000,%01000000,%00100000,%00010000,%00001000,%00000100
50205 DATA %00000010,%00000001,%00000000
REM SETUP INITIAL VARIABLES
59000 XLIMIT=319:YLIMIT=239:PI=3.1416:X=RND(-TI)
59005 GOSUB 45000:REM LOAD DEFAULT PALLETTE INIT VERA
59007 POKE$30C,4:SYS$FF62: REM SET PRETTY FONT
59020 Q1=1:Q2=1:Q3=1:Q4=1: REM DRAW ALL CIRCLE QUARTERS TO START
59021 REM NECESSARY FOR CIRCLE ROUTINE AT GOSUB 3000
59030 MW = 15
59035 MC = 35 : REM MAX LENGTH OF WORD AND CLUE.
59040 EC%(1)=$2D
59045 FOR I = 2 TO 7:EC%(I)=$27+I:NEXT I
59046 EC%(8)=$F8
59050 FOR I = 8 TO 14:EC%(I)=$35+I:NEXT I
59055 EC%(15)=$14
59200 RETURN
REM SET MY PALLETTE COLORS I AM GOING TO ANIMATE LATER
59300 P1=$25:P2=$FF:GOSUB 41000 :REM COPY FLESH COLOR ALSO TO $FF
59305 P1=1:P2=$FE:GOSUB 41000 :REM COPY PURE WHITE ALSO TO $FE
59310 P1=$3B:P2=$FD:GOSUB 41000 :REM RED TO $FD
59400 RETURN
REM FLUSH KEYBOARD BUFFER AND WAIT FOR KEYPRESS
63000 GET X$:IF X$<>"" THEN 63000
63010 GET X$:IF X$="" THEN 63010
63020 RETURN
- ahenry3068
- Posts: 1138
- Joined: Tue Apr 04, 2023 9:57 pm
CLEANING UP CODE.
Ok. You won't see anything new in this compared to the previous Post if you just Run it.
If you are going through the code though you will see several things I did.
I went through the entire code base today and cleaned up things that were costing Memory unnecessarily.
I got back about 1.5k overall. Which is significant. I was under 19k now I'm back to almost 21k still free.
I still have some more code to add.
I changed the VERA Pallette DATA to Decimal Representation instead of HEX. This was over 1/3 of the memory saved.
$09 takes 3 bytes 9 only takes 1 byte. When it comes to Values Over 99 its a wash but might as well have it all
1 format.
Similiarly Moved the DATA Values I'm using to read Font Bitmaps from Binary to Decimal
DATA 128,64,32,16,8,4,2,1,0
As Opposed to
DATA %10000000,%01000000,%00100000,%00010000,%00001000,%00000100
DATA %00000010,%00000001,%00000000
BASIC Doesn't care. and the Binary Representation takes more code space. I did it initially in Binary because it made what I
was doing in code a little clearer.
Last thing I did is make sure None of my REMS had any line numbers. So they just aren't stored when I cut and paste
to the Emulator. They are still there in my Text Source file, but they are gone when I actually run it. That
was most of the rest of my RAM Savings.
I know I could probably save a bit more by Combining code on single lines where possible. But I'm avoiding that unless
its absolutely necessary. To much of that can really obfuscate code readability, and I like my code to be easily Readable
at least to myself ...
So unless your actually reading over the code you might want to pass this one by.. I expect to have some Music next update though:)
HERES THE CODE
If you are going through the code though you will see several things I did.
I went through the entire code base today and cleaned up things that were costing Memory unnecessarily.
I got back about 1.5k overall. Which is significant. I was under 19k now I'm back to almost 21k still free.
I still have some more code to add.
I changed the VERA Pallette DATA to Decimal Representation instead of HEX. This was over 1/3 of the memory saved.
$09 takes 3 bytes 9 only takes 1 byte. When it comes to Values Over 99 its a wash but might as well have it all
1 format.
Similiarly Moved the DATA Values I'm using to read Font Bitmaps from Binary to Decimal
DATA 128,64,32,16,8,4,2,1,0
As Opposed to
DATA %10000000,%01000000,%00100000,%00010000,%00001000,%00000100
DATA %00000010,%00000001,%00000000
BASIC Doesn't care. and the Binary Representation takes more code space. I did it initially in Binary because it made what I
was doing in code a little clearer.
Last thing I did is make sure None of my REMS had any line numbers. So they just aren't stored when I cut and paste
to the Emulator. They are still there in my Text Source file, but they are gone when I actually run it. That
was most of the rest of my RAM Savings.
I know I could probably save a bit more by Combining code on single lines where possible. But I'm avoiding that unless
its absolutely necessary. To much of that can really obfuscate code readability, and I like my code to be easily Readable
at least to myself ...
So unless your actually reading over the code you might want to pass this one by.. I expect to have some Music next update though:)
HERES THE CODE
Code: Select all
10 SCREEN $80
15 DIM EC%(15):DIM TC(2,8)
20 GOSUB 59000 : REM INITIALIZE ALL VARIABLES
40 RECT 0,0,319,239,$3B
45 RECT 3,3,316,236,$10:GOSUB 1000
50 DC$=CHR$(228):GOSUB 150
55 DC$=CHR$(162):GOSUB 150
60 REM GOSUB TO MAKE 166 TO SOLID BLOCK CHAR
65 DC$=CHR$(113):GOSUB 150
70 CHAR 75,165,$A9,CHR$($0C)+"THE CLASSIC WORD GAME"
75 CHAR 62,180,$AB,CHR$($0C)+"NOW ON THE COMMANDER X16"
80 CHAR 4,222,1,"CODED IN BASIC"
85 CHAR 4,232,1,"2023.. ANTHONY HENRY"
86 CHAR 185,222,1,"MUSIC CONTRIBUTED BY"
87 CHAR 205,232,1,"MOOINGLEMUR"
90 GOSUB 270:GOSUB 300
100 GET X$:IF X$<>"" THEN 100
110 GET X$
115 GOSUB 275:IF X$="" THEN 110
120 FOR X = 1 TO 30
125 LOCATE 1,1:PRINT CHR$(145)
130 GOSUB 275:SLEEP 10
135 NEXT X
140 GOTO 2640
150 X = 5:Y=2:UC=1:WD$="Hang"
155 GOSUB 39600
160 X=8:Y=11:WD$="Man"
165 GOSUB 39600
170 RETURN
REM PALLETTE ANIMATION FOR TITLE SCREEN
270 P1=13
275 IF P1=2 THEN P2=13:GOTO 285
280 P2 = P1 - 1
285 SLEEP 0:GOSUB 40500
290 P1 = P1 - 1:IF P1<2 THEN P1=13
295 RETURN
REM DRAW STICK FIGURE HANGMAN
300 LINE 180,210,300,210,$53
311 LINE 180,209,299,209,$53
320 LINE 300,210,300,17,$53
321 LINE 299,209,299,18,$53
325 LINE 300,17,100,17,$53
326 LINE 299,18,100,18,$53
400 LINE 102,19,102,38,$57
405 FILL=0:CC=$57:YS=.4:XS=0:RA=13:CX=102:CY=45
410 GOSUB 3000
425 YS=0:XS=.8:CY=35:RA=9:CC=$25:FILL=1:GOSUB 3000
426 CX=CX-3:RA=2:CY=CY-2:CC=2:GOSUB 3000:CX=CX+6:GOSUB 3000
430 LINE 102,44,102,49,$25
435 LINE 102,51,102,78,$25
440 LINE 102,53,88,64,$25
445 LINE 102,53,116,64,$25
450 LINE 102,78,87,99,$25
455 LINE 102,78,117,99,$25
500 RETURN
1000 R%=15:G%=0:B%=2
1005 P1=$3B:P2=10:GOSUB 41000
1006 P1=1:P2=11:GOSUB 41000
1007 P1=$C7:P2=12:GOSUB 41000
1008 P1=$A0:P2=13:GOSUB 41000
1010 FOR I= 2 TO 9
1015 TC(2,I-1) = 0
1020 TC(1,I-1) = I
1025 P1 = I:GOSUB 40000:R%=R%-1
1030 IF I/3 = INT(I/3) THEN R%=R%-1:G%=G%+1
1050 NEXT I
1090 RETURN
2640 GOSUB 45000:GOSUB 59300
REM THE BACKGROUND
2650 GOSUB 5000
REM GALLOWS
2655 GOSUB 7000
REM ROPE
2660 GOSUB 8000
REM THE HEAD AND FACE
2665 GOSUB 9500
REM TORSO
2670 GOSUB 10000
REM LEFT ARM
2675 GOSUB 11000
REM RIGHT ARM
2680 GOSUB 12000
REM RIGHT LEG
2685 GOSUB 12500
REM LEFT LEG
2690 GOSUB 12620
2695 DM$="AWAITING KEY":GOSUB 20010:GOSUB 63000
2700 GOSUB 20100
REM DEADFACE
2705 GOSUB 4000
REM PULSING EYES
2710 GOSUB 20010:GOSUB 4200
REM RESTORE DRAWING PALLETTE
2715 GOSUB 59300
2720 COLOR 1,6
2725 LOCATE 6,14:PRINT " ";
2730 LOCATE 7,14:PRINT " WORKING WORD HERE ";
2735 LOCATE 8,14:PRINT " ";
2740 DM$=" CLUE GOES HERE : ANY KEY TO END DEMO":GOSUB 20010
2745 GOSUB 63000
REM RESTORE VERA DEFAULT PALLETTE
2746 GOSUB 45000
2750 SCREEN 0:END
REM CIRCLE,ELLIPSE AND ARC SUBROUTINE
REM SINE/COSINE ALGORITHM
3000 Q = 1 / RA
3010 IF FILL = 1 THEN Q = .2/RA
3030 FOR I = 0 TO PI / 2 STEP Q
3040 DY = SIN(I) * RA
3050 IF YS > 0 AND YS < 1 THEN DY = DY*YS
3060 DX = COS(I) * RA
3070 IF XS > 0 AND XS < 1 THEN DX = DX*XS
3080 ZX = INT(CX - DX)
3090 ZY = INT(CY - DY)
3100 AX = INT(CX + DX)
3110 AY = INT(CY + DY)
3115 IF FILL = 1 THEN 3220
3120 IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT OR Q4 = 0 THEN 3140
3130 PSET AX, AY, CC
3140 IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT OR Q3 = 0 THEN 3160
3150 PSET ZX, AY, CC
3160 IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q2 = 0 THEN 3180
3170 PSET AX, ZY, CC
3180 IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q1 = 0 THEN 3300
3190 PSET ZX, ZY, CC
3200 GOTO 3300
3220 IF Q4<> 0 THEN LINE CX,CY,AX,AY,CC
3225 IF Q3<> 0 THEN LINE CX,CY,ZX,AY,CC
3230 IF Q2<> 0 THEN LINE CX,CY,AX,ZY,CC
3235 IF Q1<> 0 THEN LINE CX,CY,ZX,ZY,CC
3300 NEXT I
3310 RETURN
REM DEADFACE
4000 P1=$24:P2=$FF:J=4:GOSUB 40200
4010 P1=$3B:P2=$FE:J=4:GOSUB 40200
4011 P1=$01:J=5:GOSUB 40200
4012 P1=$3A:J=3:GOSUB 40200
4013 P1=$15:J=5:GOSUB 40200
4014 P1=$3B:J=7:GOSUB 40200
4015 P1=$23:P2=$FF:J=8:GOSUB 40200
4016 P1=$B8:J=7:GOSUB 40200
4020 P1=$BF:GOSUB 40200
4030 P1=$C0:GOSUB 40200
4100 RETURN
REM EYE PULSING WHILE WAIT FOR KEY
4200 P2=$FE
4205 GET X$:IF X$<>"" THEN 4205
4210 GET X$
4215 IF X$<>"" THEN RETURN
4220 I=INT(RND(1)*15)+1
4225 P1 = EC%(I):J=INT(RND(1)*3)+2
4230 GOSUB 40200
4235 GOTO 4210
REM IY LOCATE Y LOCATION
REM IX LOCATE X LOCATION
REM ML MAX LENGTH OF STRING TO GET (1 TO 80)
REM IT TYPE OF INPUT 1=ALPHA ONLY, 2=NUMERIC(INCLUDE 1 AND ONLY 1 DECIMAL
REM POINT)
REM 3=ALPHANUMERIC, 4=LINE INPUT(CAN INCLUDE SPACE AND
REM TAB AND PUNCTUATION MARKS)
REM IS$ THE STRING TO RETURN
REM AC ADD CHAR 1=YES
REM ID DECIMAL DONE 1=YES
REM SPECIALIZED INPUT ROUTINE
4800 GET X$:IF X$<>"" THEN 4800
4801 IS$="":ID=0
REM BEFORE INPUT BEGINS
REM RESTORE VERA DEFAULT PALLETTE
4805 GOSUB 4920
4810 GET X$:IF X$="" THEN 4810
4811 C=ASC(X$)
4815 IF WL=ML THEN
4820 AC=0
4830 IF (IT<>2 OR IT=3) AND C>=65 AND C<=90 THEN AC=1
4835 IF (IT=2 OR IT=4 OR IT=3) AND C>=48 AND C<=57 THEN AC=1
4840 IF (IT=2) AND C=46 AND ID=0 THEN AC=1:ID=1
4845 IF (IT=4) AND C=32 THEN AC = 1: REM ALLOW SPACES WHEN INPUTTING A LINE
4846 IF (IT=4) AND (C>=35 AND C<=47) THEN AC=1
4847 IF (IT=4) AND (C>=58 AND C<=63) THEN AC=1 : REM ALLOW PUNCS IN STRING.
4850 IF C=13 THEN RETURN
4855 IF AC=1 AND LEN(IS$)<ML THEN PRINT CHR$(C);:IS$=IS$+CHR$(C):GOTO 4810
4860 IF C<>20 THEN 4895
4861 IF LEN(IS$) = 0 THEN PRINT CHR$(7);
4865 IF LEN(IS$)=1 OR LEN(IS$)=0 THEN IS$="":GOSUB 4920:GOTO 4810
4870 I = LEN(IS$)-1
4871 IF RIGHT$(IS$,1)="." AND IT=2 THEN ID=0
4875 IS$=LEFT$(IS$,I)
4890 GOSUB 4920:PRINT IS$;:GOTO 4810
4895 PRINT CHR$(7);:GOTO 4810
4920 LOCATE IY,IX:FOR I = 1 TO ML+1:PRINT " ";:NEXT I
4921 LOCATE IY,IX
4925 RETURN
5000 DM$="THE SKY":GOSUB 20000
REM THE SKY
5005 RECT 0,0, XLIMIT, YLIMIT, 14
5010 CX = 5:CY=4:CC = $10:FILL = 0:XS=0:YS=0:RA = 33
5020 GOSUB 3000:RA=RA-.5:GOSUB 3000:RA=RA-.6:GOSUB 3000:RA = RA+1.2:GOSUB 3000
5029 DM$="THE SUN":GOSUB 20000
5030 CC = $07
5035 RECT 0,0,27,25,CC:RECT 0,26,22,29,CC
5036 RECT 0,30,19,31,CC:RECT 0,32,14,33,CC
5037 RECT 28,0,34,14,CC:RECT 28,14,31,20,CC
5045 FOR RA = 31 TO 29 STEP -.75:GOSUB 3000:NEXT RA:PSET CX,CY,$07
REM BRUTE FORCE, RAYS FROM THE SUN...
5050 LINE 2,36,2,42,$07:LINE 6,36,6,43,$07
5051 LINE 9,36,10,42,$07:LINE 13,36,15,41,$07
5052 LINE 15,33,18,40,$07:LINE 18,33,21,39,$07
5053 LINE 20,31,24,38,$07:LINE 22,29,27,37,$07
5054 LINE 24,27,29,35,$07:LINE 27,25,32,32,$07
5055 LINE 30,23,35,29,$07:LINE 32,21,37,26,$07
5056 LINE 33,19,39,23,$07:LINE 35,17,41,20,$07
5057 LINE 36,15,42,17,$07:LINE 36,13,43,14,$07
5058 LINE 37,11,44,11,$07:LINE 37,8,44,8,$07
5060 LINE 37,5,45,5,$07:LINE 37,2,44,2,$07
REM DRAW CLOUDS AT GOSUB 6500
5095 GOSUB 6500:GOSUB 6500:GOSUB 6500:GOSUB 6500
5100 DM$="GRASS":GOSUB 20000
5110 RECT 0, 180, XLIMIT, YLIMIT, $85
5120 FOR Y = 161 TO 179
5130 LINE 0, Y, 40, 179, 105
5140 NEXT Y
5150 FOR Y = 180 TO 150 STEP -1
5160 LINE 288,179, XLIMIT, Y, 105
5170 NEXT Y
5171 COLOR 1
REM DRAW GRASS STUFF
5180 GOSUB 6000
5190 GOSUB 6000
5200 GOSUB 6000
5210 RETURN
REM RANDOM GRASS
6000 FOR I = 1 TO 35
6110 X1 = INT(RND(1)*310) + 5
6120 Y1 = INT(RND(1)*60) + 180:IF Y1 > YLIMIT THEN GOTO 6120
6130 X2 = INT(RND(1)*310) + 5:IF X2 = X1 THEN GOTO 6130
6140 Y2 = INT(RND(1)*60) + 180:IF Y2 = Y1 OR Y2 > YLIMIT THEN GOTO 6140
6145 IF X2 - X1 > 55 OR X1 - X2 > 55 THEN GOTO 6110
6146 IF Y2 - Y1 > 12 OR Y1 - Y2 > 15 THEN GOTO 6110
6150 REM GOSUB 6400:LINE X1,Y1,X2,Y2, GC
6155 PSET X1, Y1 - 1, 133:PSET X1 , Y1-1, 104:PSET X2, Y1 - 3,107
6160 GOSUB 6200:X1=X2:Y1=Y2:GOSUB 6200
6180 NEXT I
6185 FOR I = 1 TO 10:X1=INT(RND(1)*310)+5:Y1=INT(RND(1)*4)+180
6186 GOSUB 6200:NEXT I
6190 RETURN
6200 GOSUB 6400
6210 LINE X1,Y1,X1-4,Y1-5,GC:GOSUB 6400
6215 LINE X1,Y1,X1-3,Y1-3,GC:GOSUB 6400
6220 LINE X1,Y1,X1,Y1-5,GC:GOSUB 6400
6225 LINE X1,Y1,X1+3,Y1-3,GC:GOSUB 6400
6230 LINE X1,Y1,X1+4,Y1-5,GC
6235 RETURN
6400 GC=INT(RND(1)*24)+$60:RETURN
6500 REM SUPPOSED TO BE A CLOUD HERE
6501 Q1=1:Q2=1:Q3=1:Q4=1:FILL=1
6502 DM$="CLOUDS":GOSUB 20000
6540 H = INT(RND(1)*(165))+ 45
6541 HL = INT(RND(1)*30)+25
6545 V = INT(RND(1)*30) + 6
6550 VB = INT(RND(1)*11) + 7
6555 FOR Y = V TO V+VB STEP 3
6560 FOR X = H TO H + HL STEP 4
6580 RA = INT(RND(1)*5)+3
6585 CC = INT(RND(1)*4)+ $1C
6590 CX=X
6592 CY= INT(RND(1)*4) + (Y-4):IF (CY - RA) < 0 THEN 6580
6600 GOSUB 6800
6605 NEXT X
6610 NEXT Y
6615 RETURN
REM MIDPOINT CIRCLE ALGORITHM FILLED
6800 T1=RA/16:XA=RA:YA=0
6810 LINE CX+(XA),CY+(YA),CX-(XA),CY+(YA),CC
6815 LINE CX+(YA),CY+(XA),CX-(YA),CY+(XA),CC
6820 LINE CX+(XA),CY-(YA),CX-(XA),CY-(YA),CC
6825 LINE CX+(YA),CY-(XA),CX-(YA),CY-(XA),CC
6830 YA=YA+1
6835 T1=T1+YA
6840 T2=T1-XA
6845 IF T2 >= 0 THEN T1=T2:XA=XA-1
6850 IF XA>=YA THEN 6810
6855 RETURN
REM THE GALLOWS
7000 DM$="THE GALLOWS":GOSUB 20000
7010 FRAME 189,195,285,208,$10
7020 FRAME 188,194,285,211,$10
7021 LINE 189,210,285,210,$10
7022 PSET 189,209,$10
7023 PSET 284,206,$10
7024 PSET 284,209,$10
7030 FRAME 275,21,285,207,$10
7040 FRAME 276,22,284,205,$10
7050 FRAME 67,20,285,30,$10
7060 FRAME 68,21,284,29,$10
7070 RECT 71,30,79,33,$10
7080 RECT 190,196,283,209,$53
7090 RECT 277,23,283,209,$53
7100 RECT 69,22,283,28,83
7150 RETURN
REM THE ROPE
8000 DM$="THE NOOSE":GOSUB 20000
8005 FILL = 0
8010 LINE 73,33,73,53,16
8020 LINE 77,33,77,53,16
8030 RECT 74,34,76,53,87
8040 FOR Y = 38 TO 53 STEP 3
8050 LINE 73, Y, 77, Y - 3, $10
8060 NEXT Y
8070 FRAME 71,53,80, 68, 16
8080 RECT 72,54,79,68,87
8090 FOR Y = 56 TO 68 STEP 4
8100 LINE 72,Y,79, Y-4, $10
8110 NEXT Y
REM THE NOOSE
8130 RA = 24
8140 YS = .38
8150 CX = 75:CY = 79:CC = 16
8160 GOSUB 3000:RA=25:GOSUB 3000
8165 RA = 24:GOSUB 3000
8170 RA = 19:GOSUB 3000
8175 RA = 18:GOSUB 3000
8180 CC = 87
8190 FOR X = 20 TO 23 STEP .4
8200 RA = X:GOSUB 3000
8210 NEXT X
9000 YS=0:RETURN
REM END ROPE
REM THE FACE
9500 DM$="A TROUBLED FACE":GOSUB 20000
9501 CX = 59:CY = 60:RA = 6:XS = .4:CC = $10
9505 Q1=1:Q2=0:Q3=1:Q4=0
9510 GOSUB 3000:RA = RA - 1:GOSUB 3000
9520 RA = RA - 1:FILL = 1:CC = $25:GOSUB 3000
9530 FILL=0:CX = 89:RA = 6:CC=$10
9531 Q1=0:Q2=1:Q3=0:Q4=1
9540 GOSUB 3000:RA = RA - 1:GOSUB 3000
9550 RA = RA - 1:FILL = 1:CC = $25:GOSUB 3000
9555 Q1=1:Q2=Q1:Q3=Q1:Q4=Q1
REM DRAW HIS NECK
9560 LINE 67,76,67,84,$10
9570 LINE 66,76,66,84,$10
9580 LINE 67,87,67,90,$10:LINE 66,87,66,90,$10
9590 LINE 82,76,82,84,$10
9600 LINE 83,76,83,84,$10
9605 LINE 82,87,82,90,$10:LINE 83,87,83,90,$10
9610 RECT 68,76,81,84,$25
9620 RECT 68,89,81,90,$25
REM END NECK
9630 RA = 20:XS = .8:FILL = 0
9640 CC = $10:CX = 74:CY = 63
9650 GOSUB 3000:RA = RA -1:GOSUB 3000
9660 RA = RA -1:GOSUB 3000:RA = RA -1:GOSUB 3000
9665 CY = CY - 1:GOSUB 3000:CY = CY -1:GOSUB 3000:CY=CY + 2
9670 RA = RA :CC = $FF:FILL=1:CY = CY + 1:GOSUB 3000
9672 RECT 62,54,85,73,CC
9680 XS = 1:YS = XS
9690 CY = CY - 6:CX = CX - 6:RA=4:CC = $FE:GOSUB 3000
REM THE PUPILS OF HIS EYES
9700 PSET CX+4,CY,$FF:GOSUB 9950
9710 CX = CX + 12:GOSUB 3000
9720 PSET CX+4,CY,$FF:GOSUB 9950:CX = 74:CY = 63
9730 LINE CX-1,CY, CX - 2, CY + 6, $10
9740 LINE CX+1,CY, CX + 2, CY + 6, $10
9750 LINE CX,CY,CX -1, CY + 6, $23
9760 LINE CX,CY,CX + 1, CY + 6, $23
9770 LINE CX,CY+3,CX,CY+6,$22
9780 Q3=0:Q4=0:CC=$10:CY = CY + 13:YS=.35:RA=6:FILL=0
9790 GOSUB 3000
9800 CY = CY + 1:CC=$31:GOSUB 3000
9805 CY = CY + 1:CC=$10:GOSUB 3000
REM REMEMBER TO TURN CIRCLE FULLY ON !!!
9806 Q3=1:Q4=1:YS=0
9810 RETURN
REM THE PUPILS
9950 PSET CX,CY, $10:PSET CX -1,CY,$10
9955 PSET CX,CY -1,$10:PSET CX - 1, CY -1 ,$10
9960 RETURN
REM END FACE
REM THE TORSO
10000 DM$="TORSO":GOSUB 20000
10001 LINE 82,90,105,93,$10
10005 LINE 83,91,105,94,$10
10010 LINE 68,90,42,93, $10
10015 LINE 69,91,42,94, $10
10020 LINE 67,90,74,105,$10
10025 LINE 83,90,74,105,$10
REM THIS FOR LOOP FILLS IN THE NECKLINE
10030 FOR X = 81 TO 68 STEP -1
10035 LINE 75,103,X, 90, $25
10040 NEXT X
10053 LINE 74,105,72,110,$10
10054 LINE 72,110,72,141,$10
10055 LINE 72,141,53,144,$10
10060 LINE 53,144,53,108,$10
10065 RECT 71,140,54,103,$08
10066 LINE 54,141,68,141,$08
10067 LINE 54,142,62,142,$08
10068 LINE 54,143,56,143,$08
10069 PSET 65,91,$10
10070 LINE 72,102,72,108,$08
10071 LINE 73,104,73,106,$08
10072 PSET 74,109,$08
10073 RECT 47,107,68,94,$08
10074 RECT 69,96,69,99,$08
10076 RECT 42,107,48,95,$08
10077 LINE 56,93,67,93, $08:PSET 55,92,$10:PSET 64,91,$10
10078 LINE 65,92,67,92, $08
10079 RECT 68,100,71,102,$08
10080 LINE 70,98,70,100, $08
10090 RECT 73,110,91,140,$08
10095 RECT 75,105,91,109,$08
10120 RECT 88, 94, 101, 106, $08
10125 RECT 81, 95, 105, 106, $08
10130 LINE 80, 96, 80, 105, $08
10135 LINE 79,98,79,105, $08
10140 LINE 78,100,78,105,$08
10145 LINE 77,101,77,105,$08
10150 LINE 76,103,76,105,$08
10155 LINE 74,103,75,103, $10
10160 PSET 76,101,$10:PSET 73,101,$10:PSET 72,99,$10:PSET 71,97,$10
10165 PSET 70,95,$10:PSET 69,93,$10:PSET 81,92,$10:PSET 80,94,$10
10166 PSET 80,96,$10:PSET 78,97,$10:PSET 77,99,$10
10167 LINE 76,100,76,103,$10
10175 RECT 82, 94, 93, 93, $08
10180 LINE 83, 92, 86, 92, $08
10185 LINE 74, 107,74, 108,$08
10190 PSET 73,109,$10
10195 PSET 73,141,$10
10200 LINE 76,141,91,141,$08
10205 LINE 81,142,91,142,$08
10210 LINE 89,143,91,143,$08
10360 LINE 74,141,92,144,$10
10365 LINE 92,144,92,107,$10
REM STRAY PIXEL AT WAISTLINE
12366 PSET 73,141,$10
REM SHIRT BUTTONS
10370 CC = 16:RA = 1
10375 CX = 76:FILL = 1
10385 FOR CY = 112 TO 142 STEP 8
10390 GOSUB 3000
10400 NEXT CY
REM POCKET AND PRISONER NUMBER
10410 LINE 58,108,68,108,$10
10415 LINE 58,108,58,116,$10
10420 LINE 68,108,68,116,$10
10425 Q1=0:Q2=0:Q3=1:Q4=1:RA=4.5:XS=0:YS=.6
10430 CX = 63:CY=116:CC=$10:FILL=0
10435 GOSUB 3000
10436 PN$="P-1"
10440 CHAR 57,106,$10,PN$
10600 RETURN
REM ARM ON THE RIGHT (LEFT ARM)
11000 Q1=0:Q2=1:Q3=0:Q4=0:FILL = 0
11005 DM$="LEFT ARM":GOSUB 20000
11010 XSQUISH = .52
11020 RA = 16:CC=$10
11030 CY = 116:CX = 92
11035 GOSUB 3000:RA=RA+.6
11040 GOSUB 3000
11060 RA=RA-1:GOSUB 3000
11090 XSQUISH=.28:CX = 106:CY = 105:FILL=0
11095 GOSUB 3000
11096 FOR L = 1 TO 3:RA=RA+.5:GOSUB 3000:NEXT L
11100 CC = $08:Q1=0:Q2=1:Q3=0:Q4=0
11105 FOR RA = 14 TO 12 STEP -.7
11110 GOSUB 3000:IF RA =12 THEN Q1=1
11115 NEXT RA
11116 RECT CX-1,CY-3,CX+1,CY-7,$08
11120 LINE 99,115,99,133,$10
11130 LINE 111,102,111,133,$10
11135 RECT 100,102,110,133,$08
11140 LINE 99,107,99,109,$08
11145 LINE 98,108,101,108,$08
11150 LINE 97,107,100,107,$08 :PSET 94,107,$0E
11155 LINE 99,134,111,134,$10
REM (THE LEFT HAND)
11160 LINE 101,134,101,143,$10
11165 LINE 101,143,103,143,$10
11166 LINE 102,142,102,139,$25
11170 LINE 103,144,103,140,$10
11175 LINE 103,145,105,145,$10
11176 LINE 104,144,104,139,$25
11180 LINE 105,146,105,140,$10
11185 LINE 105,146,107,146,$10
11186 LINE 106,145,106,139,$25
11190 LINE 107,146,107,140,$10
11195 LINE 107,145,109,145,$10
11196 LINE 108,144,108,139,$25
11200 LINE 109,145,109,134,$10
11205 RECT 102,139,108,135,$25
11210 RETURN
REM ARM ON THE LEFT (RIGHT ARM)
12000 Q1=1:Q2=0:Q3=0:Q4=0:FILL = 0
12010 XSQUISH = .52
12020 RA = 16:CC=$10
12030 CY = 118:CX = 54
12031 DM$="RIGHT ARM":GOSUB 20000
12035 GOSUB 3000:RA=RA+.6
12040 GOSUB 3000
12060 RA=RA-1:GOSUB 3000
12090 XSQUISH=.43:CX = 42:CY = 105:FILL=0
12095 GOSUB 3000
12096 FOR L = 1 TO 3:RA=RA+.3:GOSUB 3000:NEXT L
12100 CC = $08:Q1=1:Q2=0:Q3=0:Q4=0
12105 FOR RA = 14 TO 12 STEP -.7
12110 GOSUB 3000:IF RA =12 THEN Q1=1
12115 NEXT RA
12116 RECT CX-4,CY-8,CX+3,CY+6,$08
12117 RECT CX-4,CY-4,CX,CY+6,$08
12120 LINE 34,102,34,133,$10
12130 LINE 46,115,46,133,$10
12135 RECT 35,102,45,133,$08
12136 LINE 34,134,46,134,$10
12140 LINE 46,CY,46,CY+6,$08
12142 LINE 47,CY,47,CY+5,$08
12145 RECT 47,CY,49,CY+3,$08
12150 LINE 51,CY+4,52,CY+4,$0E
12155 PSET 48,CY+4, $08
REM (THE LEFT HAND)
12160 LINE 44,134,44,143,$10
12165 LINE 44,143,42,143,$10
12166 LINE 43,142,43,139,$25
12170 LINE 42,140,42,145,$10
12175 LINE 42,145,40,145,$10
12176 LINE 41,144,41,139,$25
12180 LINE 40,146,40,140,$10
12185 LINE 40,146,38,146,$10
12186 LINE 39,145,39,139,$25
12190 LINE 38,146,38,140,$10
12195 LINE 38,145,36,145,$10
12196 LINE 37,144,37,139,$25
12200 LINE 36,145,36,134,$10
12205 RECT 43,139,37,135,$25
12210 RETURN
REM RIGHT LEG
12500 Q1=1:Q2=0:Q3=0:Q4=0
12505 CC=$10:CX=74:CY=159:RA=8:XQUISH=.10
12506 DM$="RIGHT LEG":GOSUB 20000
12510 GOSUB 3000
12515 LINE 70,159,70,192,$10
12520 LINE 55,145,53,192,$10
12525 LINE 53,193,70,193,$10
12530 RECT 56,145,69,192,$46
12535 LINE 55,157,55,192,$46
12540 LINE 54,181,54,192,$46
12555 LINE 57,144,71,144,$46
12560 RECT 69,142,71,154,$46
12565 RECT 72,142,73,153,$46
12570 LINE 63,143,68,143,$46
12575 PSET 70,155,$46
REM THE FOOT
12580 Q1=1:Q2=1:Q3=1:Q4=1:RA=20:XS=.35:CC=$10:FILL=1:CX=62:CY=208
12585 GOSUB 3000:RA=RA+1:FILL=0:CC=$12:GOSUB 3000:FILL=1
12590 XS=.38:CY=204:CC=$1C:RA=11:GOSUB 3000
12591 RA = RA + 1:CC=$12:FILL=0:GOSUB 3000
12595 LINE 57,193,57,202,$10
12600 LINE 66,193,66,202,$10
12605 RECT 58,194,65,200,$1C
12610 RETURN
REM LEFT LEG
12620 Q1=0:Q2=1:Q3=0:Q4=0
12625 CC=$10:CX=74:CY=159:RA=8:XQUISH=.10
12626 DM$="LEFT LEG":GOSUB 20000
12630 GOSUB 3000
12635 LINE 77,157,77,192,$10
12640 LINE 90,145,92,192,$10
12645 LINE 77,193,92,193,$10
12650 RECT 78,145,89,192,$46
12655 LINE 90,157,90,192,$46
12660 LINE 91,181,91,192,$46
12665 LINE 74,144,88,144,$46
12670 RECT 76,143,79,154,$46
12675 RECT 74,142,76,153,$46
12680 LINE 74,143,82,143,$46
12685 LINE 77,154,77,156,$46
REM THE FOOT
12690 Q1=1:Q2=1:Q3=1:Q4=1:RA=20:XS=.35:CC=$10:FILL=1
12695 CX=85:CY=208
12700 GOSUB 3000
12705 RA=RA+1:FILL=0:CC=$12:GOSUB 3000:FILL=1
12710 XS=.38:CY=204:CC=$1C:RA=11:GOSUB 3000
12715 RA = RA + 1:CC=$12:FILL=0:GOSUB 3000
12720 LINE 80,193,80,202,$10
12725 LINE 89,193,89,202,$10
12730 RECT 81,194,88,200,$1C
12740 RETURN
REM THIS ROUTINE SAVES THE SCREEN TO "BG.DAT" FOR
REM SUBSEQUENT BVLOAD. TESTED AND WORKS
REM NOT CURRENTLY USED. VERY SLOW
15000 OPEN 8,8,8,"BG.DAT,S,W"
15010 FOR P = 0 TO 65535
15020 PRINT#8,CHR$(VPEEK(0,P));
15021 PRINT ST,P
15030 NEXT P
15040 FOR P = 0 TO 11264
15050 PRINT#8,CHR$(VPEEK(1,P));
15051 PRINT ST,P,
15060 NEXT P
15070 CLOSE 8
15080 RETURN
REM PLACE A MESSAGE ON THE BOTTOM OF THE SCREEN
20000 DM$="DRAWING: "+DM$
20010 COLOR 1,0:GOSUB 20100
20015 LOCATE 30,2:PRINT DM$;
20020 RETURN
20100 LOCATE 30,2:PRINT RPT$(32,35);
20101 RETURN
REM BIGWORD ROUTINE.. READS ROM FONT AND BLOWS IT UP
39600 L = LEN(WD$)
39660 SX = X
39665 OB=PEEK(1)
39670 BANK PEEK(0),6
39675 FOR K = 1 TO L
39680 CC=ASC(MID$(WD$,K,1))
REM READ IN A CHARACTER MAP CC
REM AND PRINT IT OUT AT Y,X
39685 IF (CC>=64 AND CC<=90) OR (CC>=193 AND CC<=218) THEN AA=64:GOTO 39695
39690 AA = 0
39695 CA = $C000 + 8*(CC-AA)
39700 FOR I = 1 TO 8
39710 CM(I) = PEEK(CA+(I-1)):CM$(I)=""
39715 NEXT I
39720 IF DC$="" THEN DC$=CHR$(CC)
39725 FOR J = 1 TO 8
39730 RESTORE 50200
39735 FOR CT = 1 TO 8
39740 READ CP
39745 IF (CP AND CM(J)) THEN CM$(J)=CM$(J)+DC$:GOTO 39755
39750 CM$(J)=CM$(J)+CHR$(32)
39755 NEXT CT
39760 LOCATE Y+(J-1),X:IF UC=1 THEN COLOR TC(1,J),TC(2,J)
39765 PRINT CM$(J);
39770 NEXT J
39775 IF DC$=CHR$(CC) THEN DC$=""
39780 X=X+8
39785 NEXT K
39790 X=SX
39795 BANK PEEK(0),OB
39800 RETURN
REM SET PALLETTE ENTRY P1 TO R%,G%,B%
40000 VPOKE 1,$FA00+(P1*2),(G%*16) + B%
40010 VPOKE 1,$FA00+((P1*2)+1),R%
40020 RETURN
REM READ PALLETTE ENTRY AT P1
REM RETURNED IN %R,%G,%B
40100 A1 = $FA00+(P1*2)
40105 R% = VPEEK(1,A1+1)
40110 GB%= VPEEK(1,A1)
40115 G% = GB%/16
40120 B% = GB% AND $0F
40125 RETURN
REM FADE P2 FROM CURRENT COLOR TO P1 COLOR, J IS JIFFY DELAY
40200 GOSUB 40100
40205 P3=P1
40210 P1=P2
40215 GOSUB 40300
40220 P1=P3
40225 RETURN
REM FADE P1 TO R%,G%,B%, J IS JIFFY DELAY
40300 DR%=R%:DG%=G%:DB%=B%
40305 GOSUB 40100
40310 RI=1:IF DR%<R% THEN RI=-1
40315 GI=1:IF DG%<G% THEN GI=-1
40320 BI=1:IF DB%<B% THEN BI=-1
40325 IF DR%<>R% THEN R%=R%+RI
40330 IF DG%<>G% THEN G%=G%+GI
40335 IF DB%<>B% THEN B%=B%+BI
40340 GOSUB 40000
40345 SLEEP J
40350 IF DR%=R% AND DG%=G% AND DB%=B% THEN 40360
40355 GOTO 40325
40360 RETURN
REM SWAP PALLETTE COLORS AT P1 & P2
40500 A1 = $FA00+(P1*2)
40505 A2 = $FA00+(P2*2)
40510 B1 = VPEEK (1,A1)
40515 B2 = VPEEK (1,A1+1)
40520 B3 = VPEEK (1,A2)
40525 B4 = VPEEK (1,A2+1)
40530 VPOKE 1, A1, B3
40535 VPOKE 1, A1+1, B4
40450 VPOKE 1, A2, B1
40455 VPOKE 1, A2+1, B2
40560 RETURN
REM COPY P1 PALLETTE ENTRY TO P2.. P1 IS LEFT UNCHANGED.
41000 VPOKE 1,$FA00+(P2*2), VPEEK(1, $FA00+(P1*2))
41010 VPOKE 1,$FA00+(P2*2)+1, VPEEK(1, $FA00+(P1*2)+1)
41020 RETURN
REM LOOP THROUGH THE PALLETTE ADDRESS SPACE
REM AND POKE THE VERA DEFAULT PALLETTE
45000 RESTORE 50000
45020 FOR PE = $FA00 TO $FBFE STEP 2
45025 READ R:READ GB
45030 VPOKE 1,PE,GB
45035 VPOKE 1,PE+1, R
45040 NEXT PE
45050 RETURN
REM DEFAULT VERA PALLETTE AS DATA. FROM 0 TO 255 (2 BYTES EACH ENTRY)R,GB
50000 DATA 0,0,15,255,8,0,10,254,12,76,0,197,0,10,14,231,13,133,6,64,15,119,3
50005 DATA 51,7,119,10,246,0,143,11,187,0,0,1,17,2,34,3,51,4,68,5,85,6,102,7
50010 DATA 119,8,136,9,153,10,170,11,187,12,204,13,221,14,238,15,255,2,17,4,51
50015 DATA 6,68,8,102,10,136,12,153,15,187,2,17,4,34,6,51,8,68,10,85,12,102,15
50020 DATA 119,2,0,4,17,6,17,8,34,10,34,12,51,15,51,2,0,4,0,6,0,8,0,10,0,12,0
50025 DATA 15,0,2,33,4,67,6,100,8,134,10,168,12,201,15,235,2,17,4,50,6,83,8
50030 DATA 116,10,149,12,182,15,215,2,16,4,49,6,81,8,98,10,130,12,163,15,195,2
50035 DATA 16,4,48,6,64,8,96,10,128,12,144,15,176,1,33,3,67,5,100,7,134,9,168
50040 DATA 11,201,13,251,1,33,3,66,4,99,6,132,8,165,9,198,11,247,1,32,2,65,4
50045 DATA 97,5,130,6,162,8,195,9,243,1,32,2,64,3,96,4,128,5,160,6,192,7,240,1
50050 DATA 33,3,67,4,101,6,134,8,168,9,202,11,252,1,33,2,66,3,100,4,133,5,166
50055 DATA 6,200,7,249,0,32,1,65,1,98,2,131,2,164,3,197,3,246,0,32,0,65,0,97,0
50060 DATA 130,0,162,0,195,0,243,1,34,3,68,4,102,6,136,8,170,9,204,11,255,1,34
50065 DATA 2,68,3,102,4,136,5,170,6,204,7,255,0,34,1,68,1,102,2,136,2,170,3
50070 DATA 204,3,255,0,34,0,68,0,102,0,136,0,170,0,204,0,255,1,18,3,52,4,86,6
50075 DATA 104,8,138,9,172,11,207,1,18,2,36,3,70,4,88,5,106,6,140,7,159,0,2,1
50080 DATA 20,1,38,2,56,2,74,3,92,3,111,0,2,0,20,0,22,0,40,0,42,0,60,0,63,1,18
50085 DATA 3,52,5,70,7,104,9,138,11,156,13,191,1,18,3,36,4,54,6,72,8,90,9,108
50090 DATA 11,127,1,2,2,20,4,22,5,40,6,42,8,60,9,63,1,2,2,4,3,6,4,8,5,10,6,12
50095 DATA 7,15,2,18,4,52,6,70,8,104,10,138,12,156,15,190,2,17, 4,35,6,53,8,71
50100 DATA 10,89,12,107,15,125,2,1,4,19,6,21,8,38,10,40,12,58,15,60,2,1,4,3,6
50105 DATA 4,8,6,10,8,12,9,15,11
REM BITMAP VALUES FOR READING FONTS.
REM 50200 DATA %10000000,%01000000,%00100000,%00010000,%00001000,%00000100
REM 50205 DATA %00000010,%00000001,%00000000
50200 DATA 128,64,32,16,8,4,2,1,0
REM SETUP INITIAL VARIABLES
59000 XLIMIT=319:YLIMIT=239:PI=3.1416:X=RND(-TI)
REM LOAD DEFAULT PALLETTE INIT VERA
59005 GOSUB 45000
REM SET PRETTY FONT
59007 POKE$30C,4:SYS$FF62
REM Q1-Q4 ARE INITIALIZED FOR CIRCLE DRAWING ROUTINE AT 3000
59020 Q1=1:Q2=1:Q3=1:Q4=1
REM MAX LENGTH OF WORD AND CLUE
59030 MW = 15
59035 MC = 35
REM CRAZY PALLETTE COLORS FOR EYE PULSE ROUTINE
59040 EC%(1)=$2D
59045 FOR I = 2 TO 7:EC%(I)=$27+I:NEXT I
59046 EC%(8)=$F8
59050 FOR I = 8 TO 14:EC%(I)=$35+I:NEXT I
59055 EC%(15)=$14
59200 RETURN
REM SET MY PALLETTE COLORS I AM GOING TO ANIMATE LATER
REM COPY FLESH COLOR ALSO TO $FF
59300 P1=$25:P2=$FF:GOSUB 41000
REM COPY PURE WHITE ALSO TO $FE
59305 P1=1:P2=$FE:GOSUB 41000
REM RED TO $FD
59310 P1=$3B:P2=$FD:GOSUB 41000
59400 RETURN
REM FLUSH KEYBOARD BUFFER AND WAIT FOR KEYPRESS
63000 GET X$:IF X$<>"" THEN 63000
63010 GET X$:IF X$="" THEN 63010
63020 RETURN
- ahenry3068
- Posts: 1138
- Joined: Tue Apr 04, 2023 9:57 pm
NOW WITH TITLE SCREEN MUSIC.
Ok I merged The Music Routine the MooingLemur Contributed to the Title Screen.
I worked out better than I had hoped. In maintaining the Timing for the Music. When the SPLASH Title
Scrolls down and off the Screen it does it in Time with the Music. I hadn't planned on that
it just fortuitously happened. It is just a side affect of Maintaining the Music Tempo in the loop.
But I LIKE IT.
So..
HERE's the CODE.
I worked out better than I had hoped. In maintaining the Timing for the Music. When the SPLASH Title
Scrolls down and off the Screen it does it in Time with the Music. I hadn't planned on that
it just fortuitously happened. It is just a side affect of Maintaining the Music Tempo in the loop.
But I LIKE IT.
So..
HERE's the CODE.
Code: Select all
10 SCREEN $80
15 DIM EC%(15):DIM TC(2,8)
20 GOSUB 59000 : REM INITIALIZE ALL VARIABLES
40 RECT 0,0,319,239,$3B
45 RECT 3,3,316,236,$10:GOSUB 1000
50 DC$=CHR$(228):GOSUB 180
55 DC$=CHR$(162):GOSUB 180
60 REM GOSUB TO MAKE 166 TO SOLID BLOCK CHAR
65 DC$=CHR$(113):GOSUB 180
70 CHAR 75,165,$A9,CHR$($0C)+"THE CLASSIC WORD GAME"
75 CHAR 62,180,$AB,CHR$($0C)+"NOW ON THE COMMANDER X16"
80 CHAR 4,222,1,"CODED IN BASIC"
85 CHAR 4,232,1,"2023.. ANTHONY HENRY"
86 CHAR 185,222,1,"MUSIC CONTRIBUTED BY"
87 CHAR 205,232,1,"MOOINGLEMUR"
90 GOSUB 270:GOSUB 300
95 RESTORE 50300
100 READ PS$,DL
105 IF DL=0 THEN 95
110 FMCHORD 0,PS$
115 FOR I=1 TO DL
120 GET X$
125 IF X$ <>"" THEN 150
130 GOSUB 275
135 NEXT I
140 GOTO 100
150 FOR X = 1 TO 31
160 LOCATE 1,1:PRINT CHR$(145)
161 READ PS$,DL:IF DL=0 THEN RESTORE 50300:GOTO 161
162 FMCHORD 0,PS$
166 GOSUB 275:SLEEP DL-2
170 NEXT X
171 READ PS$,DL
172 IF DL=0 THEN 178
173 FMCHORD 0,PS$
174 GOSUB 275:SLEEP DL-2
175 GOTO 171
178 FMINIT
179 GOTO 2640
180 X = 5:Y=2:UC=1:WD$="Hang"
185 GOSUB 39600
190 X=8:Y=11:WD$="Man"
195 GOSUB 39600
200 RETURN
REM PALLETTE ANIMATION FOR TITLE SCREEN
270 P1=13
275 IF P1=2 THEN P2=13:GOTO 285
280 P2 = P1 - 1
285 GOSUB 40500
290 P1 = P1 - 1:IF P1<2 THEN P1=13
295 RETURN
REM DRAW STICK FIGURE HANGMAN
300 LINE 180,210,300,210,$53
311 LINE 180,209,299,209,$53
320 LINE 300,210,300,17,$53
321 LINE 299,209,299,18,$53
325 LINE 300,17,100,17,$53
326 LINE 299,18,100,18,$53
400 LINE 102,19,102,38,$57
405 FILL=0:CC=$57:YS=.4:XS=0:RA=13:CX=102:CY=45
410 GOSUB 3000
425 YS=0:XS=.8:CY=35:RA=9:CC=$25:FILL=1:GOSUB 3000
426 CX=CX-3:RA=2:CY=CY-2:CC=2:GOSUB 3000:CX=CX+6:GOSUB 3000
430 LINE 102,44,102,49,$25
435 LINE 102,51,102,78,$25
440 LINE 102,53,88,64,$25
445 LINE 102,53,116,64,$25
450 LINE 102,78,87,99,$25
455 LINE 102,78,117,99,$25
500 RETURN
1000 R%=15:G%=0:B%=2
1005 P1=$3B:P2=10:GOSUB 41000
1006 P1=1:P2=11:GOSUB 41000
1007 P1=$C7:P2=12:GOSUB 41000
1008 P1=$A0:P2=13:GOSUB 41000
1010 FOR I= 2 TO 9
1015 TC(2,I-1) = 0
1020 TC(1,I-1) = I
1025 P1 = I:GOSUB 40000:R%=R%-1
1030 IF I/3 = INT(I/3) THEN R%=R%-1:G%=G%+1
1050 NEXT I
1090 RETURN
2640 GOSUB 45000:GOSUB 59300
REM THE BACKGROUND
2650 GOSUB 5000
REM GALLOWS
2655 GOSUB 7000
REM ROPE
2660 GOSUB 8000
REM THE HEAD AND FACE
2665 GOSUB 9500
REM TORSO
2670 GOSUB 10000
REM LEFT ARM
2675 GOSUB 11000
REM RIGHT ARM
2680 GOSUB 12000
REM RIGHT LEG
2685 GOSUB 12500
REM LEFT LEG
2690 GOSUB 12620
2695 DM$="AWAITING KEY":GOSUB 20010:GOSUB 63000
2700 GOSUB 20100
REM DEADFACE
2705 GOSUB 4000
REM PULSING EYES
2710 GOSUB 20010:GOSUB 4200
REM RESTORE DRAWING PALLETTE
2715 GOSUB 59300
2720 COLOR 1,6
2725 LOCATE 6,14:PRINT " ";
2730 LOCATE 7,14:PRINT " WORKING WORD HERE ";
2735 LOCATE 8,14:PRINT " ";
2740 DM$=" CLUE GOES HERE : ANY KEY TO END DEMO":GOSUB 20010
2745 GOSUB 63000
REM RESTORE VERA DEFAULT PALLETTE
2746 GOSUB 45000
2750 SCREEN 0:END
REM CIRCLE,ELLIPSE AND ARC SUBROUTINE
REM SINE/COSINE ALGORITHM
3000 Q = 1 / RA
3010 IF FILL = 1 THEN Q = .2/RA
3030 FOR I = 0 TO PI / 2 STEP Q
3040 DY = SIN(I) * RA
3050 IF YS > 0 AND YS < 1 THEN DY = DY*YS
3060 DX = COS(I) * RA
3070 IF XS > 0 AND XS < 1 THEN DX = DX*XS
3080 ZX = INT(CX - DX)
3090 ZY = INT(CY - DY)
3100 AX = INT(CX + DX)
3110 AY = INT(CY + DY)
3115 IF FILL = 1 THEN 3220
3120 IF AX<0 OR AX > XLIMIT OR AY<0 OR AY > YLIMIT OR Q4 = 0 THEN 3140
3130 PSET AX, AY, CC
3140 IF ZX<0 OR ZX>XLIMIT OR AY < 0 OR AY > YLIMIT OR Q3 = 0 THEN 3160
3150 PSET ZX, AY, CC
3160 IF AX<0 OR AX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q2 = 0 THEN 3180
3170 PSET AX, ZY, CC
3180 IF ZX<0 OR ZX > XLIMIT OR ZY<0 OR ZY > YLIMIT OR Q1 = 0 THEN 3300
3190 PSET ZX, ZY, CC
3200 GOTO 3300
3220 IF Q4<> 0 THEN LINE CX,CY,AX,AY,CC
3225 IF Q3<> 0 THEN LINE CX,CY,ZX,AY,CC
3230 IF Q2<> 0 THEN LINE CX,CY,AX,ZY,CC
3235 IF Q1<> 0 THEN LINE CX,CY,ZX,ZY,CC
3300 NEXT I
3310 RETURN
REM DEADFACE
4000 P1=$24:P2=$FF:J=4:GOSUB 40200
4010 P1=$3B:P2=$FE:J=4:GOSUB 40200
4011 P1=$01:J=5:GOSUB 40200
4012 P1=$3A:J=3:GOSUB 40200
4013 P1=$15:J=5:GOSUB 40200
4014 P1=$3B:J=7:GOSUB 40200
4015 P1=$23:P2=$FF:J=8:GOSUB 40200
4016 P1=$B8:J=7:GOSUB 40200
4020 P1=$BF:GOSUB 40200
4030 P1=$C0:GOSUB 40200
4100 RETURN
REM EYE PULSING WHILE WAIT FOR KEY
4200 P2=$FE
4205 GET X$:IF X$<>"" THEN 4205
4210 GET X$
4215 IF X$<>"" THEN RETURN
4220 I=INT(RND(1)*15)+1
4225 P1 = EC%(I):J=INT(RND(1)*3)+2
4230 GOSUB 40200
4235 GOTO 4210
REM IY LOCATE Y LOCATION
REM IX LOCATE X LOCATION
REM ML MAX LENGTH OF STRING TO GET (1 TO 80)
REM IT TYPE OF INPUT 1=ALPHA ONLY, 2=NUMERIC(INCLUDE 1 AND ONLY 1 DECIMAL
REM POINT)
REM 3=ALPHANUMERIC, 4=LINE INPUT(CAN INCLUDE SPACE AND
REM TAB AND PUNCTUATION MARKS)
REM IS$ THE STRING TO RETURN
REM AC ADD CHAR 1=YES
REM ID DECIMAL DONE 1=YES
REM SPECIALIZED INPUT ROUTINE
4800 GET X$:IF X$<>"" THEN 4800
4801 IS$="":ID=0
REM BEFORE INPUT BEGINS
REM RESTORE VERA DEFAULT PALLETTE
4805 GOSUB 4920
4810 GET X$:IF X$="" THEN 4810
4811 C=ASC(X$)
4815 IF WL=ML THEN
4820 AC=0
4830 IF (IT<>2 OR IT=3) AND C>=65 AND C<=90 THEN AC=1
4835 IF (IT=2 OR IT=4 OR IT=3) AND C>=48 AND C<=57 THEN AC=1
4840 IF (IT=2) AND C=46 AND ID=0 THEN AC=1:ID=1
4845 IF (IT=4) AND C=32 THEN AC = 1: REM ALLOW SPACES WHEN INPUTTING A LINE
4846 IF (IT=4) AND (C>=35 AND C<=47) THEN AC=1
4847 IF (IT=4) AND (C>=58 AND C<=63) THEN AC=1 : REM ALLOW PUNCS IN STRING.
4850 IF C=13 THEN RETURN
4855 IF AC=1 AND LEN(IS$)<ML THEN PRINT CHR$(C);:IS$=IS$+CHR$(C):GOTO 4810
4860 IF C<>20 THEN 4895
4861 IF LEN(IS$) = 0 THEN PRINT CHR$(7);
4865 IF LEN(IS$)=1 OR LEN(IS$)=0 THEN IS$="":GOSUB 4920:GOTO 4810
4870 I = LEN(IS$)-1
4871 IF RIGHT$(IS$,1)="." AND IT=2 THEN ID=0
4875 IS$=LEFT$(IS$,I)
4890 GOSUB 4920:PRINT IS$;:GOTO 4810
4895 PRINT CHR$(7);:GOTO 4810
4920 LOCATE IY,IX:FOR I = 1 TO ML+1:PRINT " ";:NEXT I
4921 LOCATE IY,IX
4925 RETURN
5000 DM$="THE SKY":GOSUB 20000
REM THE SKY
5005 RECT 0,0, XLIMIT, YLIMIT, 14
5010 CX = 5:CY=4:CC = $10:FILL = 0:XS=0:YS=0:RA = 33
5020 GOSUB 3000:RA=RA-.5:GOSUB 3000:RA=RA-.6:GOSUB 3000:RA = RA+1.2:GOSUB 3000
5029 DM$="THE SUN":GOSUB 20000
5030 CC = $07
5035 RECT 0,0,27,25,CC:RECT 0,26,22,29,CC
5036 RECT 0,30,19,31,CC:RECT 0,32,14,33,CC
5037 RECT 28,0,34,14,CC:RECT 28,14,31,20,CC
5045 FOR RA = 31 TO 29 STEP -.75:GOSUB 3000:NEXT RA:PSET CX,CY,$07
REM BRUTE FORCE, RAYS FROM THE SUN...
5050 LINE 2,36,2,42,$07:LINE 6,36,6,43,$07
5051 LINE 9,36,10,42,$07:LINE 13,36,15,41,$07
5052 LINE 15,33,18,40,$07:LINE 18,33,21,39,$07
5053 LINE 20,31,24,38,$07:LINE 22,29,27,37,$07
5054 LINE 24,27,29,35,$07:LINE 27,25,32,32,$07
5055 LINE 30,23,35,29,$07:LINE 32,21,37,26,$07
5056 LINE 33,19,39,23,$07:LINE 35,17,41,20,$07
5057 LINE 36,15,42,17,$07:LINE 36,13,43,14,$07
5058 LINE 37,11,44,11,$07:LINE 37,8,44,8,$07
5060 LINE 37,5,45,5,$07:LINE 37,2,44,2,$07
REM DRAW CLOUDS AT GOSUB 6500
5095 GOSUB 6500:GOSUB 6500:GOSUB 6500:GOSUB 6500
5100 DM$="GRASS":GOSUB 20000
5110 RECT 0, 180, XLIMIT, YLIMIT, $85
5120 FOR Y = 161 TO 179
5130 LINE 0, Y, 40, 179, 105
5140 NEXT Y
5150 FOR Y = 180 TO 150 STEP -1
5160 LINE 288,179, XLIMIT, Y, 105
5170 NEXT Y
5171 COLOR 1
REM DRAW GRASS STUFF
5180 GOSUB 6000
5190 GOSUB 6000
5200 GOSUB 6000
5210 RETURN
REM RANDOM GRASS
6000 FOR I = 1 TO 35
6110 X1 = INT(RND(1)*310) + 5
6120 Y1 = INT(RND(1)*60) + 180:IF Y1 > YLIMIT THEN GOTO 6120
6130 X2 = INT(RND(1)*310) + 5:IF X2 = X1 THEN GOTO 6130
6140 Y2 = INT(RND(1)*60) + 180:IF Y2 = Y1 OR Y2 > YLIMIT THEN GOTO 6140
6145 IF X2 - X1 > 55 OR X1 - X2 > 55 THEN GOTO 6110
6146 IF Y2 - Y1 > 12 OR Y1 - Y2 > 15 THEN GOTO 6110
6150 REM GOSUB 6400:LINE X1,Y1,X2,Y2, GC
6155 PSET X1, Y1 - 1, 133:PSET X1 , Y1-1, 104:PSET X2, Y1 - 3,107
6160 GOSUB 6200:X1=X2:Y1=Y2:GOSUB 6200
6180 NEXT I
6185 FOR I = 1 TO 10:X1=INT(RND(1)*310)+5:Y1=INT(RND(1)*4)+180
6186 GOSUB 6200:NEXT I
6190 RETURN
6200 GOSUB 6400
6210 LINE X1,Y1,X1-4,Y1-5,GC:GOSUB 6400
6215 LINE X1,Y1,X1-3,Y1-3,GC:GOSUB 6400
6220 LINE X1,Y1,X1,Y1-5,GC:GOSUB 6400
6225 LINE X1,Y1,X1+3,Y1-3,GC:GOSUB 6400
6230 LINE X1,Y1,X1+4,Y1-5,GC
6235 RETURN
6400 GC=INT(RND(1)*24)+$60:RETURN
6500 REM SUPPOSED TO BE A CLOUD HERE
6501 Q1=1:Q2=1:Q3=1:Q4=1:FILL=1
6502 DM$="CLOUDS":GOSUB 20000
6540 H = INT(RND(1)*(165))+ 45
6541 HL = INT(RND(1)*30)+25
6545 V = INT(RND(1)*30) + 6
6550 VB = INT(RND(1)*11) + 7
6555 FOR Y = V TO V+VB STEP 3
6560 FOR X = H TO H + HL STEP 4
6580 RA = INT(RND(1)*5)+3
6585 CC = INT(RND(1)*4)+ $1C
6590 CX=X
6592 CY= INT(RND(1)*4) + (Y-4):IF (CY - RA) < 0 THEN 6580
6600 GOSUB 6800
6605 NEXT X
6610 NEXT Y
6615 RETURN
REM MIDPOINT CIRCLE ALGORITHM FILLED
6800 T1=RA/16:XA=RA:YA=0
6810 LINE CX+(XA),CY+(YA),CX-(XA),CY+(YA),CC
6815 LINE CX+(YA),CY+(XA),CX-(YA),CY+(XA),CC
6820 LINE CX+(XA),CY-(YA),CX-(XA),CY-(YA),CC
6825 LINE CX+(YA),CY-(XA),CX-(YA),CY-(XA),CC
6830 YA=YA+1
6835 T1=T1+YA
6840 T2=T1-XA
6845 IF T2 >= 0 THEN T1=T2:XA=XA-1
6850 IF XA>=YA THEN 6810
6855 RETURN
REM THE GALLOWS
7000 DM$="THE GALLOWS":GOSUB 20000
7010 FRAME 189,195,285,208,$10
7020 FRAME 188,194,285,211,$10
7021 LINE 189,210,285,210,$10
7022 PSET 189,209,$10
7023 PSET 284,206,$10
7024 PSET 284,209,$10
7030 FRAME 275,21,285,207,$10
7040 FRAME 276,22,284,205,$10
7050 FRAME 67,20,285,30,$10
7060 FRAME 68,21,284,29,$10
7070 RECT 71,30,79,33,$10
7080 RECT 190,196,283,209,$53
7090 RECT 277,23,283,209,$53
7100 RECT 69,22,283,28,83
7150 RETURN
REM THE ROPE
8000 DM$="THE NOOSE":GOSUB 20000
8005 FILL = 0
8010 LINE 73,33,73,53,16
8020 LINE 77,33,77,53,16
8030 RECT 74,34,76,53,87
8040 FOR Y = 38 TO 53 STEP 3
8050 LINE 73, Y, 77, Y - 3, $10
8060 NEXT Y
8070 FRAME 71,53,80, 68, 16
8080 RECT 72,54,79,68,87
8090 FOR Y = 56 TO 68 STEP 4
8100 LINE 72,Y,79, Y-4, $10
8110 NEXT Y
REM THE NOOSE
8130 RA = 24
8140 YS = .38
8150 CX = 75:CY = 79:CC = 16
8160 GOSUB 3000:RA=25:GOSUB 3000
8165 RA = 24:GOSUB 3000
8170 RA = 19:GOSUB 3000
8175 RA = 18:GOSUB 3000
8180 CC = 87
8190 FOR X = 20 TO 23 STEP .4
8200 RA = X:GOSUB 3000
8210 NEXT X
9000 YS=0:RETURN
REM END ROPE
REM THE FACE
9500 DM$="A TROUBLED FACE":GOSUB 20000
9501 CX = 59:CY = 60:RA = 6:XS = .4:CC = $10
9505 Q1=1:Q2=0:Q3=1:Q4=0
9510 GOSUB 3000:RA = RA - 1:GOSUB 3000
9520 RA = RA - 1:FILL = 1:CC = $25:GOSUB 3000
9530 FILL=0:CX = 89:RA = 6:CC=$10
9531 Q1=0:Q2=1:Q3=0:Q4=1
9540 GOSUB 3000:RA = RA - 1:GOSUB 3000
9550 RA = RA - 1:FILL = 1:CC = $25:GOSUB 3000
9555 Q1=1:Q2=Q1:Q3=Q1:Q4=Q1
REM DRAW HIS NECK
9560 LINE 67,76,67,84,$10
9570 LINE 66,76,66,84,$10
9580 LINE 67,87,67,90,$10:LINE 66,87,66,90,$10
9590 LINE 82,76,82,84,$10
9600 LINE 83,76,83,84,$10
9605 LINE 82,87,82,90,$10:LINE 83,87,83,90,$10
9610 RECT 68,76,81,84,$25
9620 RECT 68,89,81,90,$25
REM END NECK
9630 RA = 20:XS = .8:FILL = 0
9640 CC = $10:CX = 74:CY = 63
9650 GOSUB 3000:RA = RA -1:GOSUB 3000
9660 RA = RA -1:GOSUB 3000:RA = RA -1:GOSUB 3000
9665 CY = CY - 1:GOSUB 3000:CY = CY -1:GOSUB 3000:CY=CY + 2
9670 RA = RA :CC = $FF:FILL=1:CY = CY + 1:GOSUB 3000
9672 RECT 62,54,85,73,CC
9680 XS = 1:YS = XS
9690 CY = CY - 6:CX = CX - 6:RA=4:CC = $FE:GOSUB 3000
REM THE PUPILS OF HIS EYES
9700 PSET CX+4,CY,$FF:GOSUB 9950
9710 CX = CX + 12:GOSUB 3000
9720 PSET CX+4,CY,$FF:GOSUB 9950:CX = 74:CY = 63
9730 LINE CX-1,CY, CX - 2, CY + 6, $10
9740 LINE CX+1,CY, CX + 2, CY + 6, $10
9750 LINE CX,CY,CX -1, CY + 6, $23
9760 LINE CX,CY,CX + 1, CY + 6, $23
9770 LINE CX,CY+3,CX,CY+6,$22
9780 Q3=0:Q4=0:CC=$10:CY = CY + 13:YS=.35:RA=6:FILL=0
9790 GOSUB 3000
9800 CY = CY + 1:CC=$31:GOSUB 3000
9805 CY = CY + 1:CC=$10:GOSUB 3000
REM REMEMBER TO TURN CIRCLE FULLY ON !!!
9806 Q3=1:Q4=1:YS=0
9810 RETURN
REM THE PUPILS
9950 PSET CX,CY, $10:PSET CX -1,CY,$10
9955 PSET CX,CY -1,$10:PSET CX - 1, CY -1 ,$10
9960 RETURN
REM END FACE
REM THE TORSO
10000 DM$="TORSO":GOSUB 20000
10001 LINE 82,90,105,93,$10
10005 LINE 83,91,105,94,$10
10010 LINE 68,90,42,93, $10
10015 LINE 69,91,42,94, $10
10020 LINE 67,90,74,105,$10
10025 LINE 83,90,74,105,$10
REM THIS FOR LOOP FILLS IN THE NECKLINE
10030 FOR X = 81 TO 68 STEP -1
10035 LINE 75,103,X, 90, $25
10040 NEXT X
10053 LINE 74,105,72,110,$10
10054 LINE 72,110,72,141,$10
10055 LINE 72,141,53,144,$10
10060 LINE 53,144,53,108,$10
10065 RECT 71,140,54,103,$08
10066 LINE 54,141,68,141,$08
10067 LINE 54,142,62,142,$08
10068 LINE 54,143,56,143,$08
10069 PSET 65,91,$10
10070 LINE 72,102,72,108,$08
10071 LINE 73,104,73,106,$08
10072 PSET 74,109,$08
10073 RECT 47,107,68,94,$08
10074 RECT 69,96,69,99,$08
10076 RECT 42,107,48,95,$08
10077 LINE 56,93,67,93, $08:PSET 55,92,$10:PSET 64,91,$10
10078 LINE 65,92,67,92, $08
10079 RECT 68,100,71,102,$08
10080 LINE 70,98,70,100, $08
10090 RECT 73,110,91,140,$08
10095 RECT 75,105,91,109,$08
10120 RECT 88, 94, 101, 106, $08
10125 RECT 81, 95, 105, 106, $08
10130 LINE 80, 96, 80, 105, $08
10135 LINE 79,98,79,105, $08
10140 LINE 78,100,78,105,$08
10145 LINE 77,101,77,105,$08
10150 LINE 76,103,76,105,$08
10155 LINE 74,103,75,103, $10
10160 PSET 76,101,$10:PSET 73,101,$10:PSET 72,99,$10:PSET 71,97,$10
10165 PSET 70,95,$10:PSET 69,93,$10:PSET 81,92,$10:PSET 80,94,$10
10166 PSET 80,96,$10:PSET 78,97,$10:PSET 77,99,$10
10167 LINE 76,100,76,103,$10
10175 RECT 82, 94, 93, 93, $08
10180 LINE 83, 92, 86, 92, $08
10185 LINE 74, 107,74, 108,$08
10190 PSET 73,109,$10
10195 PSET 73,141,$10
10200 LINE 76,141,91,141,$08
10205 LINE 81,142,91,142,$08
10210 LINE 89,143,91,143,$08
10360 LINE 74,141,92,144,$10
10365 LINE 92,144,92,107,$10
REM STRAY PIXEL AT WAISTLINE
12366 PSET 73,141,$10
REM SHIRT BUTTONS
10370 CC = 16:RA = 1
10375 CX = 76:FILL = 1
10385 FOR CY = 112 TO 142 STEP 8
10390 GOSUB 3000
10400 NEXT CY
REM POCKET AND PRISONER NUMBER
10410 LINE 58,108,68,108,$10
10415 LINE 58,108,58,116,$10
10420 LINE 68,108,68,116,$10
10425 Q1=0:Q2=0:Q3=1:Q4=1:RA=4.5:XS=0:YS=.6
10430 CX = 63:CY=116:CC=$10:FILL=0
10435 GOSUB 3000
10436 PN$="P-1"
10440 CHAR 57,106,$10,PN$
10600 RETURN
REM ARM ON THE RIGHT (LEFT ARM)
11000 Q1=0:Q2=1:Q3=0:Q4=0:FILL = 0
11005 DM$="LEFT ARM":GOSUB 20000
11010 XSQUISH = .52
11020 RA = 16:CC=$10
11030 CY = 116:CX = 92
11035 GOSUB 3000:RA=RA+.6
11040 GOSUB 3000
11060 RA=RA-1:GOSUB 3000
11090 XSQUISH=.28:CX = 106:CY = 105:FILL=0
11095 GOSUB 3000
11096 FOR L = 1 TO 3:RA=RA+.5:GOSUB 3000:NEXT L
11100 CC = $08:Q1=0:Q2=1:Q3=0:Q4=0
11105 FOR RA = 14 TO 12 STEP -.7
11110 GOSUB 3000:IF RA =12 THEN Q1=1
11115 NEXT RA
11116 RECT CX-1,CY-3,CX+1,CY-7,$08
11120 LINE 99,115,99,133,$10
11130 LINE 111,102,111,133,$10
11135 RECT 100,102,110,133,$08
11140 LINE 99,107,99,109,$08
11145 LINE 98,108,101,108,$08
11150 LINE 97,107,100,107,$08 :PSET 94,107,$0E
11155 LINE 99,134,111,134,$10
REM (THE LEFT HAND)
11160 LINE 101,134,101,143,$10
11165 LINE 101,143,103,143,$10
11166 LINE 102,142,102,139,$25
11170 LINE 103,144,103,140,$10
11175 LINE 103,145,105,145,$10
11176 LINE 104,144,104,139,$25
11180 LINE 105,146,105,140,$10
11185 LINE 105,146,107,146,$10
11186 LINE 106,145,106,139,$25
11190 LINE 107,146,107,140,$10
11195 LINE 107,145,109,145,$10
11196 LINE 108,144,108,139,$25
11200 LINE 109,145,109,134,$10
11205 RECT 102,139,108,135,$25
11210 RETURN
REM ARM ON THE LEFT (RIGHT ARM)
12000 Q1=1:Q2=0:Q3=0:Q4=0:FILL = 0
12010 XSQUISH = .52
12020 RA = 16:CC=$10
12030 CY = 118:CX = 54
12031 DM$="RIGHT ARM":GOSUB 20000
12035 GOSUB 3000:RA=RA+.6
12040 GOSUB 3000
12060 RA=RA-1:GOSUB 3000
12090 XSQUISH=.43:CX = 42:CY = 105:FILL=0
12095 GOSUB 3000
12096 FOR L = 1 TO 3:RA=RA+.3:GOSUB 3000:NEXT L
12100 CC = $08:Q1=1:Q2=0:Q3=0:Q4=0
12105 FOR RA = 14 TO 12 STEP -.7
12110 GOSUB 3000:IF RA =12 THEN Q1=1
12115 NEXT RA
12116 RECT CX-4,CY-8,CX+3,CY+6,$08
12117 RECT CX-4,CY-4,CX,CY+6,$08
12120 LINE 34,102,34,133,$10
12130 LINE 46,115,46,133,$10
12135 RECT 35,102,45,133,$08
12136 LINE 34,134,46,134,$10
12140 LINE 46,CY,46,CY+6,$08
12142 LINE 47,CY,47,CY+5,$08
12145 RECT 47,CY,49,CY+3,$08
12150 LINE 51,CY+4,52,CY+4,$0E
12155 PSET 48,CY+4, $08
REM (THE LEFT HAND)
12160 LINE 44,134,44,143,$10
12165 LINE 44,143,42,143,$10
12166 LINE 43,142,43,139,$25
12170 LINE 42,140,42,145,$10
12175 LINE 42,145,40,145,$10
12176 LINE 41,144,41,139,$25
12180 LINE 40,146,40,140,$10
12185 LINE 40,146,38,146,$10
12186 LINE 39,145,39,139,$25
12190 LINE 38,146,38,140,$10
12195 LINE 38,145,36,145,$10
12196 LINE 37,144,37,139,$25
12200 LINE 36,145,36,134,$10
12205 RECT 43,139,37,135,$25
12210 RETURN
REM RIGHT LEG
12500 Q1=1:Q2=0:Q3=0:Q4=0
12505 CC=$10:CX=74:CY=159:RA=8:XQUISH=.10
12506 DM$="RIGHT LEG":GOSUB 20000
12510 GOSUB 3000
12515 LINE 70,159,70,192,$10
12520 LINE 55,145,53,192,$10
12525 LINE 53,193,70,193,$10
12530 RECT 56,145,69,192,$46
12535 LINE 55,157,55,192,$46
12540 LINE 54,181,54,192,$46
12555 LINE 57,144,71,144,$46
12560 RECT 69,142,71,154,$46
12565 RECT 72,142,73,153,$46
12570 LINE 63,143,68,143,$46
12575 PSET 70,155,$46
REM THE FOOT
12580 Q1=1:Q2=1:Q3=1:Q4=1:RA=20:XS=.35:CC=$10:FILL=1:CX=62:CY=208
12585 GOSUB 3000:RA=RA+1:FILL=0:CC=$12:GOSUB 3000:FILL=1
12590 XS=.38:CY=204:CC=$1C:RA=11:GOSUB 3000
12591 RA = RA + 1:CC=$12:FILL=0:GOSUB 3000
12595 LINE 57,193,57,202,$10
12600 LINE 66,193,66,202,$10
12605 RECT 58,194,65,200,$1C
12610 RETURN
REM LEFT LEG
12620 Q1=0:Q2=1:Q3=0:Q4=0
12625 CC=$10:CX=74:CY=159:RA=8:XQUISH=.10
12626 DM$="LEFT LEG":GOSUB 20000
12630 GOSUB 3000
12635 LINE 77,157,77,192,$10
12640 LINE 90,145,92,192,$10
12645 LINE 77,193,92,193,$10
12650 RECT 78,145,89,192,$46
12655 LINE 90,157,90,192,$46
12660 LINE 91,181,91,192,$46
12665 LINE 74,144,88,144,$46
12670 RECT 76,143,79,154,$46
12675 RECT 74,142,76,153,$46
12680 LINE 74,143,82,143,$46
12685 LINE 77,154,77,156,$46
REM THE FOOT
12690 Q1=1:Q2=1:Q3=1:Q4=1:RA=20:XS=.35:CC=$10:FILL=1
12695 CX=85:CY=208
12700 GOSUB 3000
12705 RA=RA+1:FILL=0:CC=$12:GOSUB 3000:FILL=1
12710 XS=.38:CY=204:CC=$1C:RA=11:GOSUB 3000
12715 RA = RA + 1:CC=$12:FILL=0:GOSUB 3000
12720 LINE 80,193,80,202,$10
12725 LINE 89,193,89,202,$10
12730 RECT 81,194,88,200,$1C
12740 RETURN
REM THIS ROUTINE SAVES THE SCREEN TO "BG.DAT" FOR
REM SUBSEQUENT BVLOAD. TESTED AND WORKS
REM NOT CURRENTLY USED. VERY SLOW
15000 OPEN 8,8,8,"BG.DAT,S,W"
15010 FOR P = 0 TO 65535
15020 PRINT#8,CHR$(VPEEK(0,P));
15021 PRINT ST,P
15030 NEXT P
15040 FOR P = 0 TO 11264
15050 PRINT#8,CHR$(VPEEK(1,P));
15051 PRINT ST,P,
15060 NEXT P
15070 CLOSE 8
15080 RETURN
REM PLACE A MESSAGE ON THE BOTTOM OF THE SCREEN
20000 DM$="DRAWING: "+DM$
20010 COLOR 1,0:GOSUB 20100
20015 LOCATE 30,2:PRINT DM$;
20020 RETURN
20100 LOCATE 30,2:PRINT RPT$(32,35);
20101 RETURN
REM BIGWORD ROUTINE.. READS ROM FONT AND BLOWS IT UP
39600 L = LEN(WD$)
39660 SX = X
39665 OB=PEEK(1)
39670 BANK PEEK(0),6
39675 FOR K = 1 TO L
39680 CC=ASC(MID$(WD$,K,1))
REM READ IN A CHARACTER MAP CC
REM AND PRINT IT OUT AT Y,X
39685 IF (CC>=64 AND CC<=90) OR (CC>=193 AND CC<=218) THEN AA=64:GOTO 39695
39690 AA = 0
39695 CA = $C000 + 8*(CC-AA)
39700 FOR I = 1 TO 8
39710 CM(I) = PEEK(CA+(I-1)):CM$(I)=""
39715 NEXT I
39720 IF DC$="" THEN DC$=CHR$(CC)
39725 FOR J = 1 TO 8
39730 RESTORE 50200
39735 FOR CT = 1 TO 8
39740 READ CP
39745 IF (CP AND CM(J)) THEN CM$(J)=CM$(J)+DC$:GOTO 39755
39750 CM$(J)=CM$(J)+CHR$(32)
39755 NEXT CT
39760 LOCATE Y+(J-1),X:IF UC=1 THEN COLOR TC(1,J),TC(2,J)
39765 PRINT CM$(J);
39770 NEXT J
39775 IF DC$=CHR$(CC) THEN DC$=""
39780 X=X+8
39785 NEXT K
39790 X=SX
39795 BANK PEEK(0),OB
39800 RETURN
REM SET PALLETTE ENTRY P1 TO R%,G%,B%
40000 VPOKE 1,$FA00+(P1*2),(G%*16) + B%
40010 VPOKE 1,$FA00+((P1*2)+1),R%
40020 RETURN
REM READ PALLETTE ENTRY AT P1
REM RETURNED IN %R,%G,%B
40100 A1 = $FA00+(P1*2)
40105 R% = VPEEK(1,A1+1)
40110 GB%= VPEEK(1,A1)
40115 G% = GB%/16
40120 B% = GB% AND $0F
40125 RETURN
REM FADE P2 FROM CURRENT COLOR TO P1 COLOR, J IS JIFFY DELAY
40200 GOSUB 40100
40205 P3=P1
40210 P1=P2
40215 GOSUB 40300
40220 P1=P3
40225 RETURN
REM FADE P1 TO R%,G%,B%, J IS JIFFY DELAY
40300 DR%=R%:DG%=G%:DB%=B%
40305 GOSUB 40100
40310 RI=1:IF DR%<R% THEN RI=-1
40315 GI=1:IF DG%<G% THEN GI=-1
40320 BI=1:IF DB%<B% THEN BI=-1
40325 IF DR%<>R% THEN R%=R%+RI
40330 IF DG%<>G% THEN G%=G%+GI
40335 IF DB%<>B% THEN B%=B%+BI
40340 GOSUB 40000
40345 SLEEP J
40350 IF DR%=R% AND DG%=G% AND DB%=B% THEN 40360
40355 GOTO 40325
40360 RETURN
REM SWAP PALLETTE COLORS AT P1 & P2
40500 A1 = $FA00+(P1*2)
40505 A2 = $FA00+(P2*2)
40510 B1 = VPEEK (1,A1)
40515 B2 = VPEEK (1,A1+1)
40520 B3 = VPEEK (1,A2)
40525 B4 = VPEEK (1,A2+1)
40530 VPOKE 1, A1, B3
40535 VPOKE 1, A1+1, B4
40450 VPOKE 1, A2, B1
40455 VPOKE 1, A2+1, B2
40560 RETURN
REM COPY P1 PALLETTE ENTRY TO P2.. P1 IS LEFT UNCHANGED.
41000 VPOKE 1,$FA00+(P2*2), VPEEK(1, $FA00+(P1*2))
41010 VPOKE 1,$FA00+(P2*2)+1, VPEEK(1, $FA00+(P1*2)+1)
41020 RETURN
REM LOOP THROUGH THE PALLETTE ADDRESS SPACE
REM AND POKE THE VERA DEFAULT PALLETTE
45000 RESTORE 50000
45020 FOR PE = $FA00 TO $FBFE STEP 2
45025 READ R:READ GB
45030 VPOKE 1,PE,GB
45035 VPOKE 1,PE+1, R
45040 NEXT PE
45050 RETURN
REM DEFAULT VERA PALLETTE AS DATA. FROM 0 TO 255 (2 BYTES EACH ENTRY)R,GB
50000 DATA 0,0,15,255,8,0,10,254,12,76,0,197,0,10,14,231,13,133,6,64,15,119,3
50005 DATA 51,7,119,10,246,0,143,11,187,0,0,1,17,2,34,3,51,4,68,5,85,6,102,7
50010 DATA 119,8,136,9,153,10,170,11,187,12,204,13,221,14,238,15,255,2,17,4,51
50015 DATA 6,68,8,102,10,136,12,153,15,187,2,17,4,34,6,51,8,68,10,85,12,102,15
50020 DATA 119,2,0,4,17,6,17,8,34,10,34,12,51,15,51,2,0,4,0,6,0,8,0,10,0,12,0
50025 DATA 15,0,2,33,4,67,6,100,8,134,10,168,12,201,15,235,2,17,4,50,6,83,8
50030 DATA 116,10,149,12,182,15,215,2,16,4,49,6,81,8,98,10,130,12,163,15,195,2
50035 DATA 16,4,48,6,64,8,96,10,128,12,144,15,176,1,33,3,67,5,100,7,134,9,168
50040 DATA 11,201,13,251,1,33,3,66,4,99,6,132,8,165,9,198,11,247,1,32,2,65,4
50045 DATA 97,5,130,6,162,8,195,9,243,1,32,2,64,3,96,4,128,5,160,6,192,7,240,1
50050 DATA 33,3,67,4,101,6,134,8,168,9,202,11,252,1,33,2,66,3,100,4,133,5,166
50055 DATA 6,200,7,249,0,32,1,65,1,98,2,131,2,164,3,197,3,246,0,32,0,65,0,97,0
50060 DATA 130,0,162,0,195,0,243,1,34,3,68,4,102,6,136,8,170,9,204,11,255,1,34
50065 DATA 2,68,3,102,4,136,5,170,6,204,7,255,0,34,1,68,1,102,2,136,2,170,3
50070 DATA 204,3,255,0,34,0,68,0,102,0,136,0,170,0,204,0,255,1,18,3,52,4,86,6
50075 DATA 104,8,138,9,172,11,207,1,18,2,36,3,70,4,88,5,106,6,140,7,159,0,2,1
50080 DATA 20,1,38,2,56,2,74,3,92,3,111,0,2,0,20,0,22,0,40,0,42,0,60,0,63,1,18
50085 DATA 3,52,5,70,7,104,9,138,11,156,13,191,1,18,3,36,4,54,6,72,8,90,9,108
50090 DATA 11,127,1,2,2,20,4,22,5,40,6,42,8,60,9,63,1,2,2,4,3,6,4,8,5,10,6,12
50095 DATA 7,15,2,18,4,52,6,70,8,104,10,138,12,156,15,190,2,17, 4,35,6,53,8,71
50100 DATA 10,89,12,107,15,125,2,1,4,19,6,21,8,38,10,40,12,58,15,60,2,1,4,3,6
50105 DATA 4,8,6,10,8,12,9,15,11
REM BITMAP VALUES FOR READING FONTS.
REM 50200 DATA %10000000,%01000000,%00100000,%00010000,%00001000,%00000100
REM 50205 DATA %00000010,%00000001,%00000000
50200 DATA 128,64,32,16,8,4,2,1,0
REM MUSIC FROM MOOINGLEMUR
50300 DATA "O4V63I0CO3V50I18CV50I18E-V50I18G",60,"O4CO3E-G-B-",45,"O4C",15
50305 DATA "O4CO3CE-G",60,"RE-G-B-",60,"O4CO3CE-G",60,"O4CO3E-G-B-",45
50310 DATA "O4C",15,"O4CO3CE-G",60,"RE-G-B-",60,"O4CO3CE-G",60
50315 DATA "O4CO3E-G-B-",45,"O4C",15,"O4CO3CE-G",60,"O4E-O3E-G-B-",45,"O4D",12
50320 DATA "E-",3,"O4DO3CE-G",45,"O4C",15,"O4CO3E-G-B-",45,"O4C",15
50325 DATA "O4CO3CE-G",60,"RE-G-B-",60,"",0
REM SETUP INITIAL VARIABLES
59000 XLIMIT=319:YLIMIT=239:PI=3.1416:X=RND(-TI):FMINIT
REM LOAD DEFAULT PALLETTE INIT VERA
59005 GOSUB 45000
REM SET PRETTY FONT
59007 POKE$30C,4:SYS$FF62
REM Q1-Q4 ARE INITIALIZED FOR CIRCLE DRAWING ROUTINE AT 3000
59020 Q1=1:Q2=1:Q3=1:Q4=1
REM MAX LENGTH OF WORD AND CLUE
59030 MW = 15
59035 MC = 35
REM CRAZY PALLETTE COLORS FOR EYE PULSE ROUTINE
59040 EC%(1)=$2D
59045 FOR I = 2 TO 7:EC%(I)=$27+I:NEXT I
59046 EC%(8)=$F8
59050 FOR I = 8 TO 14:EC%(I)=$35+I:NEXT I
59055 EC%(15)=$14
59200 RETURN
REM SET MY PALLETTE COLORS I AM GOING TO ANIMATE LATER
REM COPY FLESH COLOR ALSO TO $FF
59300 P1=$25:P2=$FF:GOSUB 41000
REM COPY PURE WHITE ALSO TO $FE
59305 P1=1:P2=$FE:GOSUB 41000
REM RED TO $FD
59310 P1=$3B:P2=$FD:GOSUB 41000
59400 RETURN
REM FLUSH KEYBOARD BUFFER AND WAIT FOR KEYPRESS
63000 GET X$:IF X$<>"" THEN 63000
63010 GET X$:IF X$="" THEN 63010
63020 RETURN
Re: NEW GAME IN BASIC... COMING DOWN THE HOME STRETCH
Wow! Kudos getting all that together from scratch. I hadn't even gotten to graphics yet in X16 BASIC, but eeek, people are not kidding it's kind of slow eh? I noticed The Shirt seems to draw fast??
Hmm, I wonder if using the PI symbol (SHIFT-` or something) might be faster than defining PI ?
Might multiply by 0.33 be faster than divide by 3?
Also in this line:
3030 FOR I = 0 TO PI / 2 STEP Q
I can't remember, is the PI / 2 re-evaluated each loop iteration? So, could define PH to be "half of PI" and avoid the divide?
Sorry if all that's already been suggested, late to the party here and hadn't read all the other pages.
I was using a Sharp PC-5000 earlier this year, making some demos on that -- an old portable from '83 with BASIC - doing some PSET and circles. It was super slow on that too! I actually think its liquid matrix LCD screen itself was a bottleneck.
Long Long ago, when I first learned about PSET, I had this thought "wow now I can program anything! I can just PSET the screen to look like whatever! Programming is E-Z." haha
Hmm, I wonder if using the PI symbol (SHIFT-` or something) might be faster than defining PI ?
Might multiply by 0.33 be faster than divide by 3?
Also in this line:
3030 FOR I = 0 TO PI / 2 STEP Q
I can't remember, is the PI / 2 re-evaluated each loop iteration? So, could define PH to be "half of PI" and avoid the divide?
Sorry if all that's already been suggested, late to the party here and hadn't read all the other pages.
I was using a Sharp PC-5000 earlier this year, making some demos on that -- an old portable from '83 with BASIC - doing some PSET and circles. It was super slow on that too! I actually think its liquid matrix LCD screen itself was a bottleneck.
Long Long ago, when I first learned about PSET, I had this thought "wow now I can program anything! I can just PSET the screen to look like whatever! Programming is E-Z." haha
Last edited by voidstar on Sat Aug 19, 2023 10:46 pm, edited 1 time in total.
-
- Posts: 14
- Joined: Fri Jun 30, 2023 8:41 am
- ahenry3068
- Posts: 1138
- Joined: Tue Apr 04, 2023 9:57 pm
Re: NEW GAME IN BASIC... COMING DOWN THE HOME STRETCH
I did take the suggestion of taking the calculation for PI/2 out of the loop. At the very least It might have made
just a tiny difference. I also did a couple small things to optimize. None of it made a huge difference.
I haven't worried about it to much because once its an actual Game each Body Part is drawn individually and
none of them take more than a few seconds to draw. That won't break up Game play much.
My only real speed up (besides making the Circle an ASM routine is using the Mid Point Circle algorithm
as opposed to SIN/COS. (SIN/COS are the real bottlenecks on this routine). I made an attempt early
in code development to do that. But I couldn't get XSquish and YSquish to operate properly with the Mid-Point
routine. All the little tweeks I did do the GOSUB really make it a general purpose ARC / CIRCLE / OVAL Drawing
routine. I really needed that to work out drawing the Noose, The Head and the HangMans Feet.
Its also used in some places that might not be to intuitive to Start. The guys shoulders. His Armpits and
his crotch are arcs. I use the Same GOSUB to draw those. I just modify parameters before doing a GOSUB 3000.
Everything else is done with Line/Rect and Frame that are all pretty quick routines. (There are a couple PSET's in the Code that are
really just cheats because I might not have covered everything with the FRAME or LINE Command, Theres not enough
of them to have any significant effect on Code Speed.
Once I Get the GAME Logic all Done I may go back and retry the Mid-Point Algorithm to see if I can get it working with
XSquish and YSquish. If I succeed I can just drop it in place of the existing SubRoutine and I'll get an immediate
Speed up on everything that calls it. I have a simplified version of the Mid-Point Algorith already in the Code.
It only draws FILLED Circles with no Squishing. I'm only using it when I draw the Clouds.
just a tiny difference. I also did a couple small things to optimize. None of it made a huge difference.
I haven't worried about it to much because once its an actual Game each Body Part is drawn individually and
none of them take more than a few seconds to draw. That won't break up Game play much.
My only real speed up (besides making the Circle an ASM routine is using the Mid Point Circle algorithm
as opposed to SIN/COS. (SIN/COS are the real bottlenecks on this routine). I made an attempt early
in code development to do that. But I couldn't get XSquish and YSquish to operate properly with the Mid-Point
routine. All the little tweeks I did do the GOSUB really make it a general purpose ARC / CIRCLE / OVAL Drawing
routine. I really needed that to work out drawing the Noose, The Head and the HangMans Feet.
Its also used in some places that might not be to intuitive to Start. The guys shoulders. His Armpits and
his crotch are arcs. I use the Same GOSUB to draw those. I just modify parameters before doing a GOSUB 3000.
Everything else is done with Line/Rect and Frame that are all pretty quick routines. (There are a couple PSET's in the Code that are
really just cheats because I might not have covered everything with the FRAME or LINE Command, Theres not enough
of them to have any significant effect on Code Speed.
Once I Get the GAME Logic all Done I may go back and retry the Mid-Point Algorithm to see if I can get it working with
XSquish and YSquish. If I succeed I can just drop it in place of the existing SubRoutine and I'll get an immediate
Speed up on everything that calls it. I have a simplified version of the Mid-Point Algorith already in the Code.
It only draws FILLED Circles with no Squishing. I'm only using it when I draw the Clouds.
- ahenry3068
- Posts: 1138
- Joined: Tue Apr 04, 2023 9:57 pm
Re: NEW GAME IN BASIC... COMING DOWN THE HOME STRETCH
I've also been researching using a Lookup Table in place of SIN COS. That might even be as quick as the Midpoint Algorithm
but all the example code I've found has been 32 bit implementations which are very hard to translate to 8 bit.
but all the example code I've found has been 32 bit implementations which are very hard to translate to 8 bit.