Skip past logotype.

Othello for the Commodore 64


[ Download D64 ]

The history of my Commodore 64 port

Before I could afford to buy my own Commodore 64 I played a bit with a ABC 80 that my father had where he worked. It was used for taking inventory and calculating circuits, but there was also a couple of demo disks with games on them, among other an Othello game that I was quite fond of. When I got my Commodore 64 I wanted to play Othello on it. Since the game was written in BASIC I made a hardcopy of the listing using the office printer and brought it home, so that I could translate it to Commodore BASIC.

One big problem with the Commodore 64's Microsoft BASIC is that it is so extremely slow, at least compared to an ABC 80 (in a comparsion quoted on Wikipedia, the ABC 80 BASIC is between two and six times faster, depending on the tests performed). Since I had got my hands on a BASIC compiler for the Commodore 64, that was solvable.

I did the translation in 1991, and published it in my small PD library. I had forgotten all about it until recently (this is written in 2025) when I stumbled upon Lemon64's game database, where there is a small page describing the game (I have also found it on Internet Archive, where it was bundled with another Othello variant I did not author).

Since the program is compiled, the source has not been available; I found it on a disk from 1991 that I have since copied over to my PC, and the D64 linked to at the top of the page contains the BASIC code in the file OTHELLO.BAS. I have as of yet (2025) not found the original for the graphics that is displayed on load.

Once I had found the source code, I was curious if I could fine the ABC 80 original to compare to. Once again, Internet Archive came to the rescue. I am not completely sure that this version is 100% identical to the one I once ported, since the line numbers are a bit off, but it at least looks very much alike.

An unexpected relative and a common source?

The program seems to stem from somewhere else prior, however. While looking for software for my VIC-20 computer, I came across a VIC-20 emulator for the Commodore 64, bundled with a couple of simple BASIC games that run fine in it. Among them was a VIC-20 implementation of Othello, which also looks very much like this game, with the same variable names and algorithm. While the ABC 80 predates the VIC-20, I doubt the latter is a port of the former, so there must be a common ancestor somewhere.

If anyone knows where this implementation originates, please let me know!

Download

The files on the disk are as follows:

OTHELLO
This program loads the start-up screen.
X
Patches Swedish characters and runs the main program.
" (yes, the file name is a double quote character)
The compiled program The game can be started directly with LOADCHR$(34),8:RUN but then Swedish characters are not patched (so it is the best fit for a Swedish Commodore 64).
OTHELLO.BAS
Uncompiled version of the program.
SV TECKEN.SC and SV TECKEN.MC
Subroutine to create a Swedish character set; used by "X". SC is source code in Mega Assembler format.
VIEW ART.SC and VIEW ART.MC
Subroutine to display Art Studio graphics; used by the main binary. SC is source code in Mega Assembler format.
VIC BOOT and VIC EMULATOR
VIC-20 emulator for the Commodore 64.
OTHELLO.VIC
VIC-20 version of Othello, se the description above for information about the relationship with the Commodore 64 program.

You can also download the source code and see a comparison between my Commodore 64 version and the ABC 80 versionen:

Othello for ABC 80 (saved as a text file, can be read in an ABC 80 emulator if you manage to copy the file there in some way; if you know how to do it I would like to know!

Othello for C64 saved as a readable bastext file, which can be converted back into a binary using bastext (tok64 might also work); you can also see and manipulate the source code in Stig Christensen's BASIC converter.

Othello for VIC-20 saved as a readable bastext file.

Source comparison

My Commodore 64 port is a direct translation of the ABC 80 versio, as can be seen in this comparison:

Sida-by-side comparison
Commodore 64ABC 80
Start-up screen
1 POKE53280,.:POKE53281,.:PRINT"{CLEAR}{DOWN*5}{RIGHT*3}{WHITE}(C){LIGHT BLUE} 1979 {YELLOW}LUXOR {GREEN}(ABC-80)
2 PRINT"{DOWN*4}{RIGHT*3}{WHITE}(C) {LIGHT BLUE}1991 {YELLOW}SOFTWOLVES SOFTWARE/MR.P.
3 PRINT,,"{LEFT*2}{BLUE}FÖR C-64 VERSIONEN
4 PRINT"{HOME}{DOWN*24}{SPACE*3}{WHITE}{REVERSE ON} TRYCK MELLANSLAG {REVERSE OFF}{HOME}
7 PRINT"{HOME}{RIGHT*5}--O--T--H--E--L--L--O--6--4--
8 IFPEEK(198)=.THENPOKE646,(PEEK(646)+1)AND15:GOTO7
9 GETB$
10 REM (C) 1979 LUXOR
20 REM (C) 1991 SOFTWOLVES SOFTWARE
30 REM /MR.P.
Initialization
39 D$="{HOME}{DOWN*24}":DIMA(9,9) 50 DIM A%(9,9),I4%(8),J4%(8),C$(8),D$(2)
40 POKE53280,5:POKE53281,5 60 ; CHR$(12);"- O T H E L L O -"
50 GOSUB 2730:REM BRÄDET 70 ; CUR(5,0);
60 REM
Instructions
70 PRINTLEFT$(D$,23)"{LIGHT GREEN}BEHÖVER DU INSTRUKTIONER?{HOME} 80 PRINT "Behöver du instruktioner : ";
80 GET X$ 90 INPUT X$
90 IF X$="N" THEN 270 100 IF LEFT$(X$,1)="N" THEN 280
100 IF X$<>"J" THEN 80 110 IF LEFT$(X$,1)<>"J" THEN 90
110PRINT"{CLEAR}{WHITE}"TAB(16)"OTHELLO"TAB(56)"‾‾‾‾‾‾‾ 120 PRINT CHR$(12);
115 PRINT"{CLEAR}{LIGHT GREEN}OTHELLO SPELAS PÅ EN PLAN MED 8X8 RUTOR,"; 130 PRINT "OTHELLO SPELAS PÅ EN PLAN MED 8X8 RUTOR,";
120 PRINT"RAD {WHITE}1{LIGHT GREEN}-{WHITE}8 {LIGHT GREEN}OCH KOLUMN {WHITE}A{LIGHT GREEN}-{WHITE}H{LIGHT GREEN}. MAN STARTAR ALL- 140 PRINT "RAD 1 TILL 8 OCH KOLUMN A TILL H."
130 PRINT"TID MED DETTA MÖNSTER:{DOWN} 150 PRINT "MAN STARTAR ALLTID MED FÖLJANDE MÖNSTER:"
140 PRINTTAB(19)"{BLACK}●{WHITE}●" 160 PRINT " O X"
150 PRINTTAB(19)"{WHITE}●{BLACK}●" 170 PRINT " X O"
160 PRINT"{DOWN}{RIGHT}{LIGHT GREEN}VI TURAS OM ATT LÄGGA EN PJÄS VAR. NÄR 180 ;
170 PRINT"AN LAGT UT EN PJÄS FÅR MAN ALLA MOTSPE- 190 ; "VI TURAS OM ATT LÄGGA 1 PJÄS VAR."
180 PRINT"LARENS PJÄSER MELLAN ENS EGNA OCH DEN 200 ; "NÄR MAN LAGT UT EN PJÄS, FÅR MAN"
190 PRINT"UTLAGDA PJÄSEN.{DOWN} 210 ; "ALLA MOTSPELARENS PJÄSER MELLAN ENS"
200 PRINT"{RIGHT}OBS! MAN MÅSTE 'TA' MINST EN AV MOT- 220 ; "EGNA PJÄSER OCH DEN UTLAGDA PJÄSEN."
210 PRINT"SPELARENS PJÄSER VARJE GÅNG, ANNARS MÅS-"; 230 ; "OBS! MAN MÅSTE 'TA' MINST EN AV"
220 PRINT"TE MAN STÅ ÖVER DRAGET. (DET GÖR MAN 240 ; "MOTSPELARENS PJÄSER VARJE GÅNG, ANNARS"
230 PRINT"{RIGHT}GENOM ATT SVARA '{WHITE}A0{LIGHT GREEN}')" 250 ; "MÅSTE MAN STÅ ÖVER DET DRAGET."
232 PRINT"{DOWN}{RIGHT}MAN KAN, OM MAN VILL, MITT I SPELET 260 ; " DETTA GÖR MAN GENOM ATT SVARA 'A0' ."
233 PRINT"BYTA FÄRGER PÅ PLANEN. SKRIV DÅ: '{WHITE}BF{LIGHT GREEN}' 270 ;
234 PRINT"(STÅR FÖR {WHITE}B{LIGHT GREEN}YTA {WHITE}F{LIGHT GREEN}ÄRG{.*3}) 280 PRINT : ;
240 PRINTLEFT$(D$,23)"{WHITE}TRYCK NÄR DU LÄST KLART{HOME} 290 F2%=0
250 GET A$:IF A$="" THEN 250
Select level
260 GOSUB 2730
270 RESTORE :PRINTLEFT$(D$,23)"{BLACK}SKA JAG SPELA EFTER BÄSTA FÖRMÅGA? {LEFT}"; 300 RESTORE : ; : ; "SKA JAG SPELA EFTER BÄSTA FÖRMÅGA ";
290 S2=0 310 S2%=0
300 GET X$:PRINTX$; 320 INPUT X$
310 IF X$="N" THEN 340 330 IF LEFT$(X$,1)="N" THEN 360
320 IF X$<>"J" THEN 270 340 IF LEFT$(X$,1)<>"J" THEN 320
330 S2=2 350 S2%=2
340 B=-1 360 B%=-1
350 W=1 370 W%=1
Game initialization
360 D$(B+1)="{WHITE}●" 380 D$(B%+1)="X"
370 D$(1)=" " 390 D$(0%+1)=" "
380 D$(W+1)="{BLACK}●" 400 D$(W%+1)="O"
390 FOR K=1 TO 8 410 FOR K%=1 TO 8
400 READ I4(K) 420 READ I4%(K%)
410 NEXT K 430 NEXT K%
420 DATA 0,-1,-1,-1,0,1,1,1 440 DATA 0,-1,-1,-1,0,1,1,1
430 FOR K=1 TO 8 450 FOR K%=1 TO 8
440 READ J4(K) 460 READ J4%(K%)
450 NEXT K 470 NEXT K%
460 DATA 1,1,0,-1,-1,-1,0,1 480 DATA 1,1,0,-1,-1,-1,0,1
470 FOR K=1 TO 8 490 FOR K%=1 TO 8
480 READ C$(K) 500 READ C$(K%)
490 NEXT K 510 NEXT K%
500 DATA A,B,C,D,E,F,G,H 520 DATA "A","B","C","D","E","F","G","H"
510 PRINT 530 PRINT
520 FOR I=0 TO 9 540 FOR I%=0 TO 9
530 FOR J=0 TO 9 550 FOR J%=0 TO 9
540 A(I,J)=0 560 A%(I%,J%)=0
550 NEXT J,I 570 NEXT J%
580 NEXT I%
560 A(4,4)=W 590 A%(4,4)=W%
570 A(5,5)=W 600 A%(5,5)=W%
580 A(4,5)=B 610 A%(4,5)=B%
590 A(5,4)=B 620 A%(5,4)=B%
600 C1=2 630 C1%=2
610 H1=2 640 H1%=2
620 N1=4 650 N1%=4
Select colour
630 Z=0:PRINTLEFT$(D$,23)"{SPACE*39}{HOME} 660 Z%=0
640 PRINTLEFT$(D$,23)"{LIGHT GREEN}VILL DU HA {WHITE}(V)IT {LIGHT GREEN}ELLER {BLACK}(S)VART?{HOME} 670 PRINT "VILL DU HA X ELLER O";
650 C=W:CC$="{BLACK}" 680 C%=W%
660 H=B:HH$="{WHITE}" 690 H%=B%
670 GET X$ 700 INPUT X$
680 IF X$="V"THEN 720 710 IF X$="X" THEN 750
690 IF X$<>"S" THEN 670 720 IF X$<>"O" THEN 700
700 C=B:CC$="{WHITE}" 730 C%=B%
710 H=W:HH$="{BLACK}" 740 H%=W%
Select starting player
720 PRINTLEFT$(D$,23)"{LIGHT GREEN}VILL DU DRA FÖRST?{SPACE*21}{HOME} 750 PRINT "VILL DU DRA FÖRST";
730 GETX$ 760 INPUT X$
731 IFX$<>""THENPRINTLEFT$(D$,23)"{SPACE*39}{HOME} 770 IF LEFT$(X$,1)="N" THEN 820
740 IF X$="N" THEN GOSUB 2660:GOTO 790 780 IF LEFT$(X$,1)<>"J" THEN 760
750 IF X$<>"J" THEN 720 790 GOSUB 2860
760 GOSUB 2660 800 GOSUB 2790
770 GOTO 1270 810 GOTO 1320
Computer's move
790 PRINTCC$"{HOME}JAG TÄNKER{.*3} " 820 GOSUB 2860 : GOTO 850
830 IF F2%=0 THEN 850
840 INPUT X$
810 B1=-1 850 B1%=-1
820 I3=0:J3=0 860 I3%=0 : J3%=0
830 T1=C 870 T1%=C%
840 T2=H 880 T2%=H%
850 FORI9=1TO8:FORJ9=1TO8:I=I9:J=J9 890 FOR I%=1 TO 8
900 FOR J%=1 TO 8
870 IF A(I9,J9)<>0 THEN 1040 910 IF A%(I%,J%)<>0 THEN 1080
880 GOSUB 2330 920 GOSUB 2450
890 IF F1=0 THEN 1040 930 IF F1%=0 THEN 1080
900 U=-1 940 U%=-1
910 GOSUB 2410 950 GOSUB 2540
920 IF S1=0 THEN 1040 960 IF S1%=0 THEN 1080
930 IF (I9-1)*(I9-8)<>0 THEN 950 970 IF (I%-1)*(I%-8)<>0 THEN 990
940 S1=S1+S2 980 S1%=S1%+S2%
950 IF (J-1)*(J-8)<>0 THEN 970 990 IF (J%-1)*(J%-8)<>0 THEN 1010
960 S1=S1+S2 1000 S1%=S1%+S2%
970 IF S1<B1 THEN 1040 1010 IF S1%<B1% THEN 1080
980 IF S1>B1 THEN 1010 1020 IF S1%>B1% THEN 1050
990 R=RND(.):IF (I=1 OR I=8) AND (J=1 OR J=8) THEN I3=I:J3=J:B1=S1:GOTO 1060 1030 R=RND
1000 IF R>.5 THEN 1040 1040 IF R>.5 THEN 1080
1010 B1=S1 1050 B1%=S1%
1020 I3=I 1060 I3%=I%
1030 J3=J 1070 J3%=J%
1040 NEXTJ9,I9 1080 NEXT J%
1090 NEXT I%
1060 IF B1>0 THEN 1120 1100 IF B1%>0 THEN 1150
Computer is unable to find a valid move
1070 PRINTCC$LEFT$(D$,23)"{SPACE*39}{HOME} 1110 ; CUR(22,0);"JAG MÅSTE AVSTÅ MITT DRAG";
1080 PRINT"{HOME}JAG STÅR ÖVER."
1090 IF Z=1 THEN 1860 1120 IF Z%=1 THEN 1930
1100 Z=1 1130 Z%=1
1110 GOTO 1270 1140 GOTO 1320
Computer finds a valid move
1120 Z=0 1150 Z=0
1130 PRINTCC$"{HOME}MITT DRAG:{SPACE*2}"; 1160 ; CUR(0%,0%);"MITT DRAG: ";
1140 PRINTC$(J3); 1170 PRINT C$(J3%);
1150 PRINTCHR$(I3+48) 1180 PRINT CHR$(I3%+48%);
1160 I=I3 1190 I%=I3%
1170 J=J3 1200 J%=J3%
1180 U=1 1210 U%=1
1190 GOSUB 2410 1220 GOSUB 2540
1200 C1=C1+S1+1 1230 C1%=C1%+S1%+1
1210 H1=H1-S1 1240 H1%=H1%-S1%
1220 N1=N1+1 1250 N1%=N1%+1
1230 PRINTLEFT$(D$,23)"JAG TOG"S1"{LEFT} AV DINA PJÄSER!!{SPACE*15}"; 1260 ; CUR(22%,0%);"JAG TOG";
1270 PRINT S1%;
1280 PRINT " AV DINA PJÄSER";SPACE$(15%);
1240 GOSUB2660:Q9=-1:GOSUB1880 1290 GOSUB 2790
1250 IF H1=0 THEN GOTO1860 1300 IF H1%=0 THEN 1930
1260 IF N1=64 THEN GOTO1860 1310 IF N1%=64 THEN 1930
Player's move
1270 T1=H 1320 T1%=H%
1280 T2=C 1330 T2%=C%
1290 PRINTHH$"{HOME}{DOWN}{SPACE*22}" 1340 ; CUR(1%,0%);"DITT DRAG:";SPACE$(12%);
1310 INPUT"{HOME}{DOWN}DITT DRAG ";Z$ 1350 ; CUR(1%,12%);
1311 IFZ$<>"BF"THEN1320 1360 INPUTLINE Z$ : Z$=LEFT$(Z$,LEN(Z$)-2%)
1312 FORX=1TO8:FORY=1TO8
1313 IFA(X,Y)=BTHENA(X,Y)=W:GOTO1315
1314 IFA(X,Y)=WTHENA(X,Y)=B
1315 NEXT:NEXT:X=C1:C1=H1:H1=X:GOSUB2660:Q9=-1:GOSUB1880:GOTO790
1320 IF LEN(Z$)<>2 THEN 1350 1370 IF LEN(Z$)=2 THEN 1380 ELSE 1400
1330 Z1=ASC(Z$):Z2=ASC(RIGHT$(Z$,1)) 1380 Z1=ASC(LEFT$(Z$,1)) : Z2=ASC(MID$(Z$,2,1))
1340 IF(Z1>47ANDZ1<57ANDZ2>64ANDZ2<73)OR(Z1>64ORZ1<73ORZ2>47ORZ2<57)THEN1360 1390 IF Z1>47 AND Z1<57 AND Z2>64 AND Z2<73 OR Z1>64 AND Z1<73 AND Z2>47 AND Z2<57 THEN 1410
1350 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}FEL - FÖRSÖK IGEN.{SPACE*4}":PRINT"{SPACE*15}":GOTO1290 1400 ; CHR$(7%);CUR(2%,0%);"FEL. FÖRSÖK IGEN. ";CUR(3%,0%);SPACE$(15%); : GOTO 1340
1360 IF Z1>57 THENI=Z2-48:X$=CHR$(Z1):GOTO1390 1410 IF Z1>57 THEN 1430
1370 I=Z1-48 : X$=CHR$(Z2) 1420 I%=Z1-48% : X$=CHR$(Z2) : GOTO 1440
1430 I%=Z2-48% : X$=CHR$(Z1)
1390 IF I<0ORI>8 THEN 1310 1440 IF I%<0 THEN 1360
1450 IF I%>8 THEN 1360
1410 IF I<>0 THEN 1520 1460 IF I%<>0 THEN 1570
Player skips turn
1420 PRINT"{HOME}{DOWN*3}{SPACE*15}" 1470 ; CUR(3,0);SPACE$(14);
1430 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}{SPACE*22}" 1480 ; CUR(2%,0%);"AVSTÅR DU ?";
1450 INPUT"{HOME}{DOWN*2}AVSTÅR DU? J{LEFT*3}";X$:X$=LEFT$(X$,1) 1490 ; SPACE$(11);CUR(2%,12%);
1460 PRINT"{HOME}{DOWN*2}{SPACE*14}" 1500 INPUTLINE X$ : X$=LEFT$(X$,LEN(X$)-2%)
1461 PRINTHH$"{HOME}{DOWN} DU STÅR ÖVER.
1462 PRINTLEFT$(D$,24)"{SPACE*39}{HOME} 1510 ; CUR(2%,0%);SPACE$(22%);
1470 IF X$="" THEN 1430 1520 IF LEN(X$)=0 THEN 1480
1480 IF X$<>"J" THEN 1290 1530 IF LEFT$(X$,1)<>"J" THEN 1340
1490 IF Z=1 THEN 1860 1540 IF Z%=1 THEN 1930
1500 Z=1 1550 Z%=1
1510 GOTO 790 1560 GOTO 830
Check the player's move
1520 PRINT"{HOME}{DOWN*2}{SPACE*22}" 1570 ; CUR(2%,0%);SPACE$(22%);
1530 FOR J=1 TO 8 1580 FOR J%=1 TO 8
1540 IF C$(J)=X$ THEN 1570 1590 IF C$(J%)=LEFT$(X$,1) THEN 1620
1550 NEXT J 1600 NEXT J%
1560 GOTO 1310 1610 GOTO 1360
1570 IF A(I,J)=0 THEN 1610 1620 IF A%(I%,J%)=0 THEN 1660
1580 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}UPPTAGEN RUTA" 1630 ; CUR(2%,0%);"UPPTAGEN RUTA"
1590 PRINT"-FÖRSÖK IGEN." 1640 ; CUR(3%,0%);"-FÖRSÖK IGEN."
1600 GOTO 1290 1650 GOTO 1340
1610 GOSUB 2330 1660 GOSUB 2450
1620 IF F1=1 THEN 1660 1670 IF F1%=1 THEN 1710
1630 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}EJ BREDVID MINA PJÄSER" 1680 ; CUR(2%,0%);"EJ BREDVID MINA PJÄSER"
1640 PRINT"{HOME}{DOWN*3}-FÖRSÖK IGEN." 1690 ; CUR(3%,0%);"-FÖRSÖK IGEN."
1650 GOTO 1290 1700 GOTO 1340
1660 U=-1 1710 U%=-1
1670 GOSUB 2410 1720 GOSUB 2540
1680 IF S1>0 THEN 1730 1730 IF S1%>0 THEN 1780
1690 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}DU KAN EJ VÄNDA NÅGRA" 1740 ; CUR(2%,0%);"DU KAN EJ VÄNDA NÅGRA"
1700 PRINT"-FÖRSÖK IGEN." 1750 ; CUR(3%,0%);"FÖRSÖK IGEN.";
1710 GOTO 1290 1760 GOTO 1340
Player's move is OK
1730 Z=. 1770 REM Hans drag OK.
1780 Z%=0
1740 PRINT"{HOME}{DOWN*2}{SPACE*22}" 1790 ; CUR(2%,0%);SPACE$(22%);
1750 PRINT"{HOME}{DOWN*3}{SPACE*22}" 1800 ; CUR(3%,0%);SPACE$(15%);
1760 PRINTHH$LEFT$(D$,24)" DU TOG"S1"{LEFT} AV MINA PJÄSER{SPACE*14}{HOME} 1810 ; CUR(23%,0%);" DU TOG";
1820 PRINT S1%;
1830 PRINT " AV MINA PJÄSER";SPACE$(14%);
1770 U=1 1840 U%=1
1780 GOSUB 2410 1850 GOSUB 2540
1790 H1=H1+S1+1 1860 H1%=H1%+S1%+1
1800 C1=C1-S1 1870 C1%=C1%-S1%
1810 N1=N1+1 1880 N1%=N1%+1
1820 GOSUB 2660:Q9=-1:GOSUB1880 1890 GOSUB 2790
1830 IF C1=0 THEN GOTO1860 1900 IF C1%=0 THEN 1930
1840 IF N1=64 THEN GOTO1860 1910 IF N1%=64 THEN 1930
1850 GOTO 790 1920 GOTO 830
1860 PRINTLEFT$(D$,23)"{SPACE*39}" 1930 FOR I%=0% TO 10% : ; CHR$(7); : NEXT I%
1870 PRINT"{UP}{SPACE*39}{HOME}":Q9=. 1940 ; CUR(3%,0%);
Show current scoreShow the final result
1880 PRINT"{HOME}{DOWN*4}{LIGHT GREEN}DU :"HH$H1"{LEFT} ST " 1950 PRINT "DU HAR";
1960 PRINT H1%
1970 PRINT "PJÄSER"
1900 PRINT"{LIGHT GREEN}JAG:"CC$C1"{LEFT} ST {LIGHT GREEN} 1980 ; "OCH JAG"
1921 IFQ9=-1THENRETURN 1990 ; "HAR";
2000 PRINT C1%
2010 PRINT "PJÄSER"
Determine the winner and end the game
1930 IF H1=C1 THEN 1970 2020 IF H1%=C1% THEN 2060
1940 IF H1>C1 THEN 1990 2030 IF H1%>C1% THEN 2080
1950 PRINT "JAG VANN!" 2040 ; : ; "JAG VANN!" : ;
1960 GOTO 2000 2050 GOTO 2090
1970 PRINT "OAVGJORT!!" 2060 PRINT "OAVGJORT!!"
1980 GOTO 2190 2070 GOTO 2280
1990 PRINT "DU VANN." 2080 PRINT "DU VANN !"
2000 C1=C1-H1 2090 C1%=C1%-H1%
2010 IF C1>0 THEN 2030 2100 IF C1%>0 THEN 2120
2020 C1=-C1:PRINT"{WHITE} 2110 C1%=-C1%
2030 C1=(64*C1)/N1 2120 C1%=(64*C1%)/N1%
2040 IF C1<11 THEN 2180 2130 IF C1%<11 THEN 2270
2050 IF C1<25 THEN 2160 2140 IF C1%<25 THEN 2250
2060 IF C1<39 THEN 2140 2150 IF C1%<39 THEN 2230
2070 IF C1<53 THEN 2110 2160 IF C1%<53 THEN 2200
2080 PRINT "PERFEKT PARTI !"; 2170 PRINT "PERFEKT"
2180 ; "PARTI !"
2100 GOTO 2190 2190 GOTO 2280
2110 PRINT "SKAPLIGT SPELAT !"; 2200 PRINT "SKAPLIGT"
2210 ; "SPELAT !"
2130 GOTO 2190 2220 GOTO 2280
2140 PRINT "BRA FIGHT"; 2230 PRINT "BRA FIGHT"
2150 GOTO 2190 2240 GOTO 2280
2160 PRINT "SKICKLIGT!"; 2250 PRINT "SKICKLIGT!"
2170 GOTO 2190 2260 GOTO 2280
2180 PRINT "FUSK !!"; 2270 PRINT "FUSK !"
2190 PRINTLEFT$(D$,23)"ETT SPEL TILL ?{HOME} 2280 PRINT CUR(22,0);SPACE$(39%);
2290 ; CUR(22,0);"ETT SPEL TILL ";
2210 GET X$:IF X$="N" THEN 2320 2300 INPUT X$
2220 IF X$<>"J" THEN 2210 2310 IF LEFT$(X$,1)<>"J" THEN 2410
2310 RUN10 2320 ; CUR(0,0);SPACE$(22)
2330 ; SPACE$(22)
2340 ; SPACE$(15)
2350 FOR I%=4% TO 21%
2360 ; SPACE$(11)
2370 NEXT I%
2380 ; SPACE$(15)
2390 ; SPACE$(39)
2400 GOTO 300
2320 SYS64738 2410 ; CUR(22,0);SPACE$(39);
2420 ; CUR(23,0);SPACE$(39);
2430 ; CUR(21,0);"TACK FÖR IDAG.";
2440 GOTO 3140
Check adjacency
2330 FOR I1=-1 TO 1 2450 FOR I1%=-1 TO 1
2340 FOR J1=-1 TO 1 2460 FOR J1%=-1 TO 1
2350 IF A(I+I1,J+J1)=T2 THEN 2390 2470 IF A%(I%+I1%,J%+J1%)=T2% THEN 2520
2360 NEXT J1,I1 2480 NEXT J1%
2490 NEXT I1%
2370 F1=0 2500 F1%=0
2380 RETURN 2510 RETURN
2390 F1=1 2520 F1%=1
2400 RETURN 2530 RETURN
Perform a move and update the gameboard
2410 S1=0 2540 S1%=0
2420 FOR K=1 TO 8 2550 FOR K%=1 TO 8
2430 I5=I4(K) 2560 I5%=I4%(K%)
2440 J5=J4(K) 2570 J5%=J4%(K%)
2450 I6=I+I5 2580 I6%=I%+I5%
2460 J6=J+J5 2590 J6%=J%+J5%
2470 S3=0 2600 S3%=0
2480 IF A(I6,J6)<>T2 THEN 2640 2610 IF A%(I6%,J6%)<>T2% THEN 2770
2490 S3=S3+1 2620 S3%=S3%+1
2500 I6=I6+I5 2630 I6%=I6%+I5%
2510 J6=J6+J5 2640 J6%=J6%+J5%
2520 IF A(I6,J6)=T1 THEN 2550 2650 IF A%(I6%,J6%)=T1% THEN 2680
2530 IF A(I6,J6)=0 THEN 2640 2660 IF A%(I6%,J6%)=0 THEN 2770
2540 GOTO 2490 2670 GOTO 2620
2550 S1=S1+S3 2680 S1%=S1%+S3%
2560 IF U<>1 THEN 2640 2690 IF U%<>1 THEN 2770
2570 I6=I 2700 I6%=I%
2580 J6=J 2710 J6%=J%
2590 FOR K1=0 TO S3 2720 FOR K1%=0 TO S3%
2600 A(I6,J6)=T1 2730 A%(I6%,J6%)=T1%
2610 I6=I6+I5 2740 I6%=I6%+I5%
2620 J6=J6+J5 2750 J6%=J6%+J5%
2630 NEXT K1 2760 NEXT K1%
2640 NEXT K 2770 NEXT K%
2650 RETURN 2780 RETURN
Paint the game pieces
2660 PRINTLEFT$(D$,5):FORI=1TO8:PRINTTAB(22):FORJ=1TO8 2790 FOR I%=1% TO 8%
2800 FOR J%=1% TO 8%
2670 PRINTD$(A(I,J)+1)"{RIGHT}";:NEXT:PRINT:PRINT:NEXT:RETURN 2810 ; CUR(2%*I%+3%,3%*J%+12%);
2820 ; D$(A%(I%,J%)+1%);
2830 NEXT J%
2840 NEXT I%
2850 RETURN
Paint the gameboard
2730 PRINT "{LIGHT GREEN}{CLEAR}"; 2860 ; CHR$(12); : REM Init brädet
2740 PRINTLEFT$(D$,21)TAB(21)"└─┴─┴─┴─┴─┴─┴─┴─┘ 2870 FOR I%=0% TO 2% : ; CUR(I%,22%);CHR$(151) : NEXT I%
2741 PRINTTAB(22)"{WHITE}A B C D E F G H{LIGHT GREEN} 2880 FOR I%=1% TO 6%
2742 PRINTLEFT$(D$,5)TAB(21)"┌─┬─┬─┬─┬─┬─┬─┬─┐ 2890 SETDOT I%,46% : SETDOT I%,75%
2750 FORR=5TO19STEP2:A$=CHR$(48+(R/2)-1) 2900 NEXT I%
2751 PRINTTAB(20)"{WHITE}"A$"{LIGHT GREEN}│ │ │ │ │ │ │ │ │{WHITE}"A$:IFR>18THEN2770 2910 FOR I%=47% TO 75%
2760 PRINTTAB(21)"{LIGHT GREEN}├─┼─┼─┼─┼─┼─┼─┼─┤ 2920 SETDOT 1%,I% : SETDOT 6%,I%
2770 NEXT 2930 NEXT I%
2785 PRINT"{HOME}"TAB(21)"{DOWN*3}{REVERSE ON}▍OTHELLO (C)MR.P🮈 2940 ; CUR(1%,24%);"O T H E L L O"
2820 RETURN 2950 FOR I%=4% TO 20%
2960 ; CUR(I%,12%);CHR$(151);
2970 ; CUR(I%,38%);CHR$(135);
2980 NEXT I%
2990 FOR I%=13% TO 61% STEP 6%
3000 FOR J%=27% TO 75%
3010 SETDOT I%,J%
3020 NEXT J% : NEXT I%
3030 FOR I%=27% TO 75% STEP 6% : FOR J%=13% TO 61%
3040 SETDOT J%,I%
3050 NEXT J% : NEXT I%
3060 FOR I%=1% TO 8%
3070 ; CUR(3%+I%*2%,10%);I%;CUR(3%+I%*2%,39%);CHR$(I%+48%);
3080 NEXT I%
3090 FOR I%=1% TO 8%
3100 ; CUR(3%,12%+I%*3%);CHR$(64+I%);
3110 ; CUR(21%,12%+I%*3%);CHR$(64+I%);
3120 NEXT I%
3130 RETURN
2830 REM *** END *** 3140 END

The VIC 20 version is a bit more condensed, probably to fit in the small memory and is shown in its own listing here (I have added extra whitespace to increase readability, that was not in the version linked above):

VIC-20 version
Start-up screen
2 REM S&J KRUUV
3 POKE 36879,234
5 PRINT "{CLEAR}{DOWN*2}{BLACK} WELCOME TO OTHELLO !!"
6 PRINT "{DOWN*2}WOULD YOU LIKE{SPACE*8}INSTRUCTIONS? ( Y-N )
7 GET U$ : IF U$="" THEN 7
8 IF U$="N" THEN 10
9 GOSUB 2000
Initialization
10 DN$="{HOME}{DOWN*18}" : FOR I=1 TO 21 : E$=E$+" " : NEXT
12 FOR I=1 TO 21 : E$=E$+"{LEFT}" : NEXT : R$="{RIGHT*20}" : F2=0 : S2=0
14 DIMA(9,9),I4(8),J4(8),D$(2)
Select level
   : PRINT "{CLEAR}SHOULD I PLAY MY BEST" : INPUT X$
15 PRINT "FORFEIT={REVERSE ON}I0{REVERSE OFF}"
16 IF LEFT$(X$,1)="N" THEN 20
18 S2=2
Game initialization
20 B=-1 : W=1 : D$(B+1)="○" : D$(0+1)=" " : D$(W+1)="●" : FOR K=1 TO 8 : READ I4(K),J4(K) : NEXT
22 FOR I=0 TO 9 : FOR J=0 TO 9 : A(I,J)=0 : NEXT J,I : A(4,4)=W : A(5,5)=W : A(4,5)=B : A(5,4)=B
24 C1=2 : H1=C1 : N1=4 : Z=0
Select colour
   : PRINT "{DOWN}DO YOU WANT BLACK OR WHITE" : H=W : INPUT X$ : C=B
26 IF LEFT$(X$,1)="B" THEN 30
28 C=W : H=B
Select starting player
30 PRINT "DO YOU WANT TO GO FIRST" : INPUT X$ : PRINT "{CLEAR}" : GOSUB 144
32 IF LEFT$(X$,1)="Y" THEN 76
Computer's move
34 PRINT DN$;E$"I AM THINKING !"
36 B1=-1 : I3=0 : J3=0 : T1=C : T2=H : FOR I=1 TO 8 : FOR J=1 TO 8 : IF A(I,J)<>0 THEN 58
38 GOSUB 122 : IF F1=0 THEN 58
40 U=-1 : GOSUB 128 : IF S1=0 THEN 58
42 IF (I-1)*(I-8)<>0 THEN 46
44 S1=S1+S2
46 IF (J-1)*(J-8)<>0 THEN 50
48 S1=S1+S2
50 IF S1<B1 THEN 58
52 IF S1>B1 THEN 56
54 IF RND(1)>0.5 THEN 58
56 B1=S1 : I3=I : J3=J
58 NEXT J,I
60 IF B1>0 THEN 68
Computer is unable to find a valid move
62 PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}I FORFEIT MY MOVE"
64 IF Z=1 THEN 110
66 Z=1 : GOTO 76
Computer finds a valid move
68 PRINT "{SPACE*21}"
69 Z=0 : PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}I WILL MOVE TO {REVERSE ON}"RIGHT$(STR$(I3),1)"{REVERSE OFF} {REVERSE ON}"CHR$(J3+64)
70 GOSUB 186 : I=I3 : J=J3 : U=1 : GOSUB 128 : C1=C1+S1+1 : H1=H1-S1 : N1=N1+1
72 PRINT DN$"{DOWN*2}"E$"THAT GIVES ME ";S1;"OF" : PRINT "YOUR PIECES"
74 GOSUB 144 : IF H1=0 OR N1=64 THEN 110
Player's move
76 T1=H : T2=C
78 PRINT DN$;E$"{WHITE}INPUT YOUR MOVE;{REVERSE ON}ROW{REVERSE OFF}COL{UP}{LEFT*3}"; : GOSUB 168 : IF I<>0 THEN 88
80 PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}FORFEITING YOUR TURN" : INPUT X$
82 IF LEFT$(X$,1)<>"Y" THEN 78
84 IF Z=1 THEN 110
86 Z=1 : GOTO 36
88 IF A(I,J)=0 THEN 92
90 PRINT DN$"{DOWN}"E$"SQUARE OCCUPIED" : GOTO 100
92 GOSUB 122 : IF F1=1 THEN 96
94 PRINT DN$"{DOWN}"E$"NOT NEXT TO MY PIECES" : GOTO 100
96 U=-1 : GOSUB 128 : IF S1>0 THEN 102
98 PRINT DN$"{DOWN}"E$"DOESN'T FLANK A ROW"
100 PRINT E$"{RIGHT*5}TRY AGAIN" : PRINT E$ : GOTO 78
Player's move is OK
102 PRINT "{SPACE*23}"
103 Z=0 : PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}THAT GIVES YOU ";
104 PRINT S1;" OF" : PRINT "MY PIECES"
106 U=1 : GOSUB 128 : H1=H1+S1+1 : C1=C1-S1 : N1=N1+1 : GOSUB 144 : IF C1=0 OR N1=64 THEN 110
108 GOTO 36
Show current score
110 PRINT DN$;E$"YOU HAVE "H1"PIECES "
114 PRINT "{SPACE*22}"E$"{UP*2}I HAVE "C1"PIECES{SPACE*21}"
Determine the winner and end the game
115 IF C1>H1 THEN 117
116 GOTO 4000
117 PRINT "{SPACE*24}I WIN***"
118 PRINT E$"ANOTHER GAME" : INPUT X$
119 IF LEFT$(X$,1)="Y" THEN 10
120 PRINT "IT'S BEEN FUN !{SPACE*10}THANK YOU{>*3}"
121 END
Check adjacency
122 F1=0 : FOR I1=-1 TO 1 : FOR J1=-1 TO 1 : IF A(I+I1,J+J1)=T2 THEN 126
124 NEXT J1,I1 : RETURN
126 F1=1 : RETURN
Perform a move and update the gameboard
128 S1=0 : FOR K=1 TO 8 : I5=I4(K) : J5=J4(K) : I6=I+I5 : J6=J+J5 : S3=0
130 IF A(I6,J6)<>T2 THEN 142
132 S3=S3+1 : I6=I6+I5 : J6=J6+J5 : IF A(I6,J6)=T1 THEN 138
134 IF A(I6,J6)=0 THEN 142
136 GOTO 132
138 S1=S1+S3 : IF U<>1 THEN 142
140 I6=I : J6=J : FOR K1=0 TO S3 : A(I6,J6)=T1 : I6=I6+I5 : J6=J6+J5 : NEXT K1
142 NEXT K : RETURN
Paint the gameboard
144 PRINT "{HOME} A B C D E F G H"
146 PRINT " {RED}┌─┬─┬─┬─┬─┬─┬─┬─┐{BLACK}"
148 FOR I=1 TO 8
150 PRINTI"{BLUE}{LEFT}│{BLACK}";
152 FOR J=1 TO 8
154 PRINTD$(A(I,J)+1)"{BLUE}│{BLACK}";
156 NEXT J
158 PRINT
160 IF I<>8 THEN PRINT " {BLUE}├─┼─┼─┼─┼─┼─┼─┼─┤{BLACK}"
162 NEXT I
164 PRINT " {RED}└─┴─┴─┴─┴─┴─┴─┴─{RED}┘{BLACK}"
166 RETURN
Enter the player's move
168 I=-1 : J=-1 : K=1
170 GET X$ : IF X$<>"" THEN 178
172 IF K=1 THEN PRINT "{WHITE}🮕{LEFT}"; : GOTO 176
174 PRINT " {LEFT}";
176 K=-1*K : FOR L=1 TO 200 : NEXT : GOTO 170
178 G=ASC(X$) : IF 47<G AND G<58 THEN I=G-48 : PRINT "{REVERSE ON}"X$"{REVERSE OFF}{BLACK}";
180 IF 64<G AND G<74 THEN J=G-64 : PRINT "{REVERSE ON}"X$"{REVERSE OFF}{BLACK}";
182 IF I<>-1 AND J<>-1 THEN RETURN
184 GOTO 170
186 PRINT LEFT$(DN$,2*(I3-1)+3);LEFT$(R$,2*(J3-1)+3); : K=1 : M=0 : X$=D$(C+1)
188 IF K=1 THEN PRINT X$"{LEFT}"; : GOTO 192
190 PRINT " {LEFT}";
192 K=-1*K : FOR L=1 TO 200 : NEXT : IF M>9 THEN RETURN
194 M=M+1 : GOTO 188
196 DATA 0,1,-1,1,-1,0,-1,-1,0,-1,1,-1,1,0,1,1
Instructions
2000 REM INSTRUCTIONS
2010 PRINT "{DOWN} {BLACK}OTHELLO IS PLAYED ON A 8 ✕ 8 CHECKER"
2020 PRINT "BOARD. ROWS ARE NUMBERED 1 THRU 8, AND"
2030 PRINT "COLUMNS A THRU H. THE INITIAL SET UP IS"
2040 PRINT "ALL BLANK EXCEPT FOR THE CENTER FOUR "
2050 PRINT "SQUARES, WHICH FORM THE PATTERN : "
2052 PRINT "{BLUE}HIT RETURN TO CONT.{BLACK}"
2053 GET U$ : IF U$="" THEN 2053
2054 PRINT "{UP}{SPACE*20}"
2055 PRINT "{DOWN} ●○"
2056 PRINT " ○●"
2060 PRINT "{DOWN}TRY TO PLACE YOUR PIECE SO THAT IT"
2070 PRINT "OUTFLANKS MINE, CREATING A HORIZONTAL"
2080 PRINT "VERTICAL OR DIAGONAL RUN OF MY PIECES"
2090 PRINT "BOUND ON EACH END BY AT LEAST ONE OF YOURS."
2093 PRINT "THIS WILL FLIP MY PIECES TURNING THEM INTO YOURS.",
2095 PRINT "{BLUE}HIT RETURN TO CONT.{BLACK}"
2096 GET U$ : IF U$="" THEN 2096
2097 PRINT "{UP}{SPACE*19}{DOWN}"
3000 PRINT "NOTE : YOU MUST CAPTUREAT LEAST ONE OF MY"
3010 PRINT "PIECES IN THIS WAY IF AT ALL POSSIBLE."
3020 PRINT "IF IT IS NOT POSSIBLE THEN YOU FORFEIT YOUR"
3030 PRINT "TURN BY ENTERING I 0 FOR YOUR MOVE."
3060 PRINT "{DOWN*2}HIT RETURN TO START."
3065 GET U$ : IF U$="" THEN 3065
3070 PRINT "{CLEAR}"
3100 RETURN
Sound effect if the player wins
4000 REM***YOU WIN***
4010 PRINT "{SPACE*23}**YOU WIN!****"
4015 POKE 36878,15
4020 FOR W3=125 TO 255
4030 POKE 36879,W3 : POKE 36876,W3 : NEXT W3
4050 POKE 36878,0 : POKE 36879,234
4060 GOTO 118
[HTML 4.01!] [Any browser is fine with us!] $Date: 2025-10-30 12:37:28 $ | peter@softwolves.pp.se

Back to Softwolves' Commodore page | Peter's home page