For the ones interested, here is the painting program (the BASIC part at least, there are two other modules, the driver that loads in $400 and something else that loads in $7000), not the most readable code I've seen
Code: Select all
0 HIMEM20000:O=5:POKE#26A,10:DOKE#24E,522:FP=1
1 GOSUB5000:IFPEEK(#20C)=255THENPRINTCHR$(20)
2 IF PEEK(#7000)<>#A9 THEN GOSUB14000:GOSUB15000
3 X1=120:Y1=90:X=120:Y=100:GOTO30000
4 HIRES
5 CLS:POKE#26A,10:PRINT:PRINT"Press space to draw the line"
10 K$=KEY$:IFK$=<"a"THEN200
20 Q=ASC(K$):X=X+X(Q):Y=Y+Y(Q):IFQ(X+1)ORW(Y+1)THENX=X-X(Q):Y=Y-Y(Q)
30 IFK$="m"THENGOSUB20020:GOTO30000
31 IFK$="n"THENFL=1:GOSUB20000
32 IFK$="p"THENCLS:PRINTX" ,"Y:PRINTX1" ,"Y1
91 IFX=X1ANDY1=YTHEN10
100 CURSETX,Y,2:DRAWX1-X,Y1-Y,2
105 IFK$=" "THENCURSETX,Y,FB:DRAWX1-X,Y1-Y,FB:GOTO10
110 CURSETX,Y,2:DRAWX1-X,Y1-Y,2
120 GOTO10
200 IFK$=""THEN91
210 Q=ASC(K$):X1=X1+X(Q):Y1=Y1+Y(Q)
211 IFQ(X1+1)ORW(Y1+1)THENX1=X1-X(Q):Y1=Y1-Y(Q)
220 GOTO91
300 K$=KEY$:IFK$<"a"ANDK$<>"*"THEN400
301 Z=2
310 CURSETX,Y,Z:Q=ASC(K$):X=X+X(Q):Y=Y+Y(Q)
311 IFQ(X+1)ORW(Y+1)THENX=X-X(Q):Y=Y-Y(Q)
320 IFK$="m"THENGOSUB20020:GOTO30000
321 IFK$="n"THENFL=1:GOSUB20000
322 IFK$="p"THENCLS:PRINTX" ,"Y
340 CURSETX,Y,2
350 GOTO300
400 IFK$=""THEN300
410 Z=FB:GOTO310
500 POKEX,95:Z=W:CLS:PRINT:PRINT"Press space to change atribute value"
505 K$=KEY$:IFK$<"a"ANDK$<>"*"THEN600
510 POKEX,W:Q=ASC(K$):X=X+X(Q):X=X+Y(Q)*40
511 IFX<#A000ORX>#BF40THENX=X-X(Q):X=X-Y(Q)*40
515 IFK$=" "THENPRINT:INPUT"ENTER ATRIBUTE (0 - 255)";Z:CLS:IFZ>255ORZ<0THEN515
520 IFK$="m"THENGOSUB20020:X=X1:Y=Y1:GOTO30000
521 IFK$="n"THENFL=1:GOSUB20000
522 IFK$="p"THENCLS:PRINT"BYTE"X
540 W=PEEK(X):POKEX,95
550 GOTO505
600 IFK$=""THEN505
605 IFK$=" "THEN510
610 W=Z:GOTO510
700 K$=KEY$:IFK$<"a"THEN800
710 CURSETX,Y,2:Q=ASC(K$):X=X+X(Q):Y=Y+Y(Q)
711 IFX>232THENX=232
712 IFX<0THENX=0
713 IFY>192THENY=192
714 IFY<2THENY=2
715 IFK$="a"THENCHARD,1,FP
716 IFK$="s"THENCHARC,0,FP
720 IFK$="m"THENGOSUB20020:GOTO30000
721 IFK$="n"THENFL=1:GOSUB20000
722 IFK$="p"THENCLS:PRINTX" ,"Y
740 CURSETX,Y,2
750 GOTO700
800 IFK$=""THEN700
810 C=C+X(ASC(K$)):IFC>126THENC=33
811 IFC<33THENC=126
813 D=D+Y(ASC(K$)):IFD>126THEND=33
814 IFD<33THEND=126
815 CLS:PRINT"S = ";CHR$(C):PRINT"A =";CHR$(27)"I"CHR$(D)
816 GOTO700
900 K$=KEY$:IFK$<"a"THEN950
905 Q=ASC(K$):X=X+X(Q):Y=Y+Y(Q):IFQ(X+1)ORW(Y+1)THENX=X-X(Q):Y=Y-Y(Q)
910 IFK$="m"THENGOSUB20020:GOTO30000
911 IFK$="n"THENFL=1:GOSUB20000
912 IFK$="p"THENCLS:PRINTX" ,"Y:PRINTX1" ,"Y1
915 IFX=X1ANDY1=YTHEN900
920 CURSETX,Y,2:DRAWX1-X,Y1-Y,2
930 CURSETX,Y,2:DRAWX1-X,Y1-Y,2
931 IFK$=" "THENGOSUB980
935 GOTO900
950 IFK$=""THEN915
960 Q=ASC(K$):X1=X1+X(Q):Y1=Y1+Y(Q)
961 IFQ(X1+1)ORW(Y1+1)THENX1=X1-X(Q):Y1=Y1-Y(Q)
970 GOTO915
980 AA=SQR(ABS(X1-X)^2+ABS(Y1-Y)^2)
985 IFX1+AA>239ORX1-AA<0THENRETURN
990 IFY1+AA>199ORY1-AA<0THENRETURN
995 CIRCLEAA,FP:RETURN
999 CLS:POKE#26A,10:PRINT"Press space to fill areas"
1000 K$=KEY$:IFK$<"a"ANDK$<>"*"THEN1100
1001 Z=2
1010 CURSETX,Y,Z:Q=ASC(K$):X=X+X(Q):Y=Y+Y(Q)
1011 IFQ(X+1)ORW(Y+1)THENX=X-X(Q):Y=Y-Y(Q)
1020 IFK$="m"THENGOSUB20020:GOTO30000
1021 IFK$="n"THENFL=1:GOSUB20000
1022 IFK$="p"THENCLS:PRINTX" ,"Y
1030 IFK$=" "THENGOSUB1200
1040 CURSETX,Y,2
1050 GOTO1000
1100 IFK$=""THEN1000
1110 Z=1:GOTO1010
1200 CLS:PRINT"SCANNING";:POKE775,39
1210 REPEAT
1220 PRINT".";
1230 CALL#7000
1240 UNTILPEEK(#46)=0 OR KEY$="s"
1241 IF PEEK(#FFFC)=45 THEN POKE775,17
1245 IF PEEK(#46)<>0THENCLS:PRINT"BREAKED":PING:RETURN
1250 CLS:PRINT"FINISHED":PING:RETURN
5000 DIMX(127),Y(127),Q(241),W(201)
5010 FORB=1TO8:READA$:A=ASC(A$):READX(A),Y(A):NEXT
5020 FORB=1TO8:READA$:A=ASC(A$):READX(A),Y(A):NEXT
5100 DATAt,,-1,y,1,-1,h,1,,b,1,1,v,,1,c,-1,1,f,-1,,r,-1,-1
5200 DATAT,,-1,Y,1,-1,H,1,,B,1,1,V,,1,C,-1,1,F,-1,,R,-1,-1
5300 Q(241)=1:Q(0)=1:W(0)=1:W(201)=1
10000 FORA=20000TO20027:READB$:B=VAL("#"+B$):POKEA,B:NEXT
10010 DATAA0,00,B1,FE,91,FC,C8,D0,F9,18,A5,FF,69,01,85,FF,18,A5,FD,69,01
10020 DATA85,FD,C9,BF,D0,E5,60
10025 RETURN
14000 IF PEEK(#FFFC)=45 THEN CALL#E6CA:POKE#67,0:POKE#35,0:CALL#E4A8:CALL#E804
14010 IF PEEK(#FFFC)<>45 THEN CLOAD""
14020 RETURN
15000 PAPER0:INK1:HIRES:POKE#26A,10
15010 CURSET50,50,3:CIRCLE40,1
15020 CURSET70,70,3:CIRCLE50,1
15030 CURSET100,100,3:CIRCLE45,1
15040 CURSET105,105,3:CIRCLE30,1
15050 CURSET140,140,3:CIRCLE45,1
15060 CURSET160,160,3:CIRCLE25,1
15065 FORA=0TO190:CURSET0,A,3:FILL1,1,RND(1)*7+1:NEXT
15070 GOSUB20020
15080 CURSET30,30,1:CURSET70,70,1
15090 CURSET40,99,1:CURSET99,40,1
15100 CURSET100,100,2
15110 CURSET80,135,1:CURSET135,80,1
15120 CURSET120,120,1:CURSET135,135,1
15130 CURSET171,171,1
15200 FORA=1TO2:CALL#7000:NEXT
15220 CURSET189,50,3:CIRCLE50,1:CIRCLE39,1
15230 CURSET200,60,3:CIRCLE20,1:CIRCLE10,1
15240 CURSET177,37,3:CIRCLE10,1
15250 GOSUB20020
15300 CURSET190,2,1:CURSET190,95,1
15310 CURSET177,37,1:CURSET200,43,1
15320 CURSET200,77,1:CALL#7000:CALL#7000
15400 CLS:PRINTCHR$(27)"G (press a key)"
15410 PRINTCHR$(4)CHR$(27)"J IMAGE DESIGNER!!"CHR$(4)
15999 GETA$:RETURN
20000 IFPEEK(#FFFC)=45 THENPOKE775,17:REM NYT BILLED
20001 IFFLTHENFL=0:CLS:PRINT"ARE YOU SURE (Y/N)?":GETA$:CLS:IF A$<>"y"THENRETURN
20010 DOKE#FE,30000:DOKE#FC,#A000:POKE20024,192
20015 CALL20000:RETURN
20020 DOKE#FE,#A000:DOKE#FC,30000:POKE20024,149
20021 POKE775,39
20025 CLS:CALL20000:RETURN
30000 INK0:TEXT:PAPER0:CLS:PLOT5,1,CHR$(14)+"MAIN MENU":POKE48036,0
30001 PLOT5,2,CHR$(14)+"MAIN MENU":POKE#26A,10
30002 FP=FP-1:PLOT21,17,1:PLOT22,17,"MODE:":GOSUB31000:PLOT27,17,2
30010 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT"1 > NEW PICTURE "CHR$(27)"P"
30020 PRINT:PRINT"2 > LINE EDITOR "CHR$(27)"P"
30030 PRINT:PRINT"3 > DRAW EDITOR "CHR$(27)"P"
30034 PRINT:PRINT"4 > ATRI EDITOR "CHR$(27)"P"
30035 PRINT:PRINT"5 > CHAR EDITOR "CHR$(27)"P"
30036 PRINT:PRINT"6 > CIRC EDITOR "CHR$(27)"P"
30037 PRINT:PRINT"7 > FILL EDITOR "CHR$(27)"P"
30038 PRINT:PRINT"8 > SAVE / LOAD "CHR$(27)"P"
30040 PRINT:PRINT:PRINT" SELECT OPTION":POKE48057+22*40,16:POKE48042+22*40,17
30041 PLOT22,9,CHR$(10)+"IMAGE DESIGNER"+CHR$(8)
30042 PLOT22,10,CHR$(10)+"IMAGE DESIGNER"+CHR$(8)
30043 PLOT22,11,CHR$(1)+" by"+CHR$(7)
30044 PLOT22,12,CHR$(2)+"ANDERS KJ0LLER"+CHR$(7)
30045 PLOT21,7,"~~~~~~~~~~~~~~~~~~"
30046 PLOT21,14,"~~~~~~~~~~~~~~~~~~"
30047 FORA=7TO14:PLOT21,A,126:PLOT38,A,126:PLOT20,A,7:NEXT:INK7
30048 A$="":K$=KEY$:GOTO30053
30049 GETA$:IFA$="t"ANDO>6THENO=O-2:O1=O+2
30050 IFA$="v"ANDO<18THENO=O+2:O1=O-2
30051 IF A$=" "THENGOSUB31000
30052 IFA$=CHR$(1)THENGETA$:IFA$=CHR$(11)THENCLS:POKE#24E,10:PRINTCHR$(20):END
30053 POKE48040+40*O1,16:POKE48041+40*O1,7:POKE48040+40*O,0:POKE48041+40*O,23
30054 IFA$<>"g"THENA$=KEY$:GOTO30049
30059 IFO=5THENHIRES:GOSUB20020:GOTO30000
30060 IFO=7THENHIRES:GOSUB20000:GOTO5
30070 IFO=9THENHIRES:GOSUB20000:CURSETX,Y,2:POKE#26A,10:CLS:GOTO300
30080 IFO=11THENHIRES:GOSUB20000:X1=X:Y1=Y:X=#A000+X/6+Y*40:W=PEEK(X):GOTO500
30090 IFO=13THENHIRES:GOSUB20000:C=65:D=65:CURSETX,Y,2:POKE#26A,10:GOTO700
30100 IFO=15THENHIRES:GOSUB20000:CLS:POKE#26A,10:GOTO900
30120 IFO=19THEN40000
30130 IFO=17THENHIRES:GOSUB20000:CURSETX,Y,2:GOTO999
30200 GOTO30049
31000 FP=FP+1:IFFP=3THENFP=0
31010 FB=FP:IFFB=2THENFB=3
31020 IF FP=0 THENPLOT28,17,"ERASE BITS "
31030 IF FP=1 THENPLOT28,17,"SET BITS "
31040 IF FP=2 THENPLOT28,17,"INVERSE "
31050 RETURN
40000 POKE#26A,11:CLS:PRINT:PRINT"SAVE OR LOAD?":GETA$:IFA$="s"THEN41000
40010 IFA$<>"l"THEN40000
40020 PRINT:INPUT"PLEASE ENTER NAME OF PICTURE TO BE LOADED";NA$
40030 IFLEN(NA$)>16THENPING:PRINT"?name too long error":GOTO40020
40040 IFNA$="?"THENNA$=""
40045 IFPEEK(#FFFC)<>45THENCLOADNA$:GOTO30000
40047 FOR A=1TOLEN(NA$):POKE#34,ASC(MID$(NA$,A,1)):NEXT
40050 CALL#E6CA:POKE#67,0:CALL#E4A8:CALL#E804:GOTO30000
41000 INPUT"PLEASE ENTER NAME OF PICTURE TO BE SAVED";NA$
41010 IFLEN(NA$)>16THENPING:PRINT"?name too long error":GOTO41000
41020 IFNA$="?"THENNA$=""
41030 CSAVENA$,A30000,E38000
41035 IFPEEK(#FFFC)=45 THEN30000
41040 PRINT:PRINT"DO YOU WANT TO VERIFY IT?":GETA$:IFA$<>"y"THEN30000
41050 CLOADNA$,V:WAIT500:GOTO30000
42000 REM ` ANDERS KJ0LLER 1984
42010 REM COPE DENMARK DEPT.
From what I see, the line 2 checks if the last module was loaded (by checking $A9) and if not loads it, with some ROM check to either call CLOAD or some CALL, so I guess this is some 1.0/1.1 ROM checks, and the same check makes sure to only call the "Circle Intro" only once (starts at 15000)... and I believe the code in 7000 is the flood fill routine.