I'm just putting this here for my own notes. This is the complete Assembly listing for my conversion of G. P. Ridley's "Connect 4" game:
Code: Select all
LD SP,10F0H
CALL TITLES
LD B,2
LD DE,NA+6
PUSH DE
NAMELOOP:
PUSH DE
LD HL,XPOS
LD (HL),62H
INC HL
LD (HL),0D2H
LD DE,NAME
CALL 0015H
LD A,(N)
CALL 03DAH
CALL 0012H
CALL 6
CALL 62
POP DE
CALL 3
PUSH BC
LD BC,6
LD H,D
LD L,E
SBC HL,BC
LD D,H
LD E,L
POP BC
LD C,1
DRAWBAR:
LD A,(DE)
CP 13
JR Z,NEXTNAME
CP 65
JR C,SKIPCHAR
SBC A,64
PUSH DE
LD DE,20
CALL MULTIPLY
LD D,H
LD E,L
LD HL,(XPOS)
SBC HL,DE
PUSH BC
LD B,0
ADD HL,BC
LD D,H
LD E,L
LD HL,(XPOS)
ADD HL,BC
LD BC,80
ADD HL,BC
ADD A,128
LD (HL),A
SBC HL,BC
LD BC,40
BARLOOP:
OR A
SBC HL,DE
ADD HL,DE
JR Z,EQUAL
JR C,NEXTBAR
LD (HL),127
SBC HL,BC
JR BARLOOP
EQUAL:
LD (HL),248
NEXTBAR:
POP BC
POP DE
SKIPCHAR:
INC DE
INC C
JR DRAWBAR
NEXTNAME:
POP DE
CALL 62
PUSH DE
LD DE,MUSICR9
CALL 0030H
POP DE
LD A,(N)
INC A
LD (N),A
PUSH BC
LD BC,86
LD H,D
LD L,E
ADD HL,BC
LD D,H
LD E,L
POP BC
DEC B
LD A,B
CP 0
JP NZ,NAMELOOP
LD A,1
LD (N),A
BEGIN:
LD A,0C6H
CALL 0DDCH
LD A,9
LD IX,XA
BOARD1:
LD H,(IX+1)
LD L,(IX+0)
LD B,8
BOARD11:
LD (HL),121
PUSH BC
LD BC,40
ADD HL,BC
LD (HL),189
ADD HL,BC
POP BC
DJNZ BOARD11
INC IX
INC IX
DEC A
CP 0
JR NZ,BOARD1
LD A,8
LD IX,XA
BOARD2:
LD H,(IX+1)
LD L,(IX+0)
LD B,8
BOARD22:
PUSH BC
LD BC,41
ADD HL,BC
LD (HL),120
LD BC,39
ADD HL,BC
POP BC
DJNZ BOARD22
INC IX
INC IX
DEC A
CP 0
JR NZ,BOARD2
LD A,33
LD IX,XA
LD B,8
BOARD3:
LD H,(IX+1)
LD L,(IX+0)
PUSH BC
LD BC,119
SBC HL,BC
LD (HL),A
POP BC
INC A
INC IX
INC IX
DJNZ BOARD3
LD HL,1400H
LD (1171H),HL
LD DE,COLUMNS
CALL 0015H
LD DE,SCORE
CALL 0015H
LD HL,0101H
LD (1171H),HL
LD IX,S
LD A,(IX+0)
CALL 03DAH
CALL 0012H
LD HL,0301H
LD (1171H),HL
LD A,(IX+1)
CALL 03DAH
CALL 0012H
LD HL,0103H
LD (1171H),HL
LD DE,NA+6
CALL 0015H
LD DE,PIECE1
CALL 0015H
LD HL,0303H
LD (1171H),HL
LD DE,NA+92
CALL 0015H
LD DE,PIECE2
CALL 0015H
BEGINCHOICE:
LD HL,1600H
LD (1171H),HL
LD B,24
BLANKSP:
CALL 000CH
DJNZ BLANKSP
LD HL,PP
LD A,(N)
ADD A,70
LD (HL),A
LD HL,0B00H
LD (1171H),HL
LD DE,CHOICE
CALL 0015H
CALL 6
CALL 6
LD B,18
BLANKSP2:
CALL 000CH
DJNZ BLANKSP2
CALL 6
LD DE,MOVE
CALL 0015H
LD HL,NA+6
LD A,(N)
CP 2
JR NZ,SKIPP2
LD HL,NA+92
SKIPP2:
LD D,H
LD E,L
CALL 0015H
CALL 6
CALL 62
GETKEY1:
CALL 001BH
CP 0
JR NZ,GETKEY1
GETKEY2:
CALL 001BH
CP 0
JR Z,GETKEY2
CP 49
JR C,GETKEY1
CP 57
JR NC,GETKEY1
LD DE,CHOSEN
CALL 0015H
CALL 0012H
LD B,4
PUSH AF
BLANKSP3:
CALL 000CH
DJNZ BLANKSP3
POP AF
OR A
LD B,49
SBC A,B
ADD A,A
LD DE,XA
LD H,0
LD L,A
ADD HL,DE
LD C,(HL)
INC HL
LD B,(HL)
LD H,B
LD L,C
INC HL
LD A,(HL)
CP 0
JR Z,EMPTY
LD HL,1600H
LD (1171H),HL
LD DE,FULL
CALL 0015H
CALL 62
LD DE,MUSICR2
CALL 0030H
JP BEGINCHOICE
EMPTY:
LD BC,80
SBC HL,BC
PLOT:
LD A,(PP)
LD (HL),A
PUSH BC
LD BC,0FA0H
PAUSE:
NOP
DEC BC
LD A,B
OR C
JR NZ,PAUSE
POP BC
ADD HL,BC
LD A,(HL)
CP 0
JR NZ,CHECKWIN
SBC HL,BC
LD (HL),0
ADD HL,BC
JR PLOT
CHECKWIN:
SBC HL,BC
LD (XPOS),HL
LD IX,BA-1
LINELOOP:
LD HL,(XPOS)
LD E,1
LD IY,FW
LD (IY+0),L
LD (IY+1),H
INC IY
INC IY
PUSH IX
LD D,3
LINELOOP2:
INC IX
LD HL,(XPOS)
LD A,(IX+0)
CP 255
JR Z,EXITCHECK
LD B,0
LD C,A
ADD HL,BC
LD A,(PP)
CP (HL)
JR NZ,SUBCHECK
INC E
LD (IY+0),L
LD (IY+1),H
INC IY
INC IY
LD A,E
CP 4
JR Z,FOUNDWIN
DEC D
LD A,D
CP 0
JR NZ,LINELOOP2
SUBCHECK:
POP IX
LD D,3
LINELOOP3:
INC IX
LD HL,(XPOS)
LD A,(IX+0)
CP 255
JR Z,EXITCHECK
LD B,0
LD C,A
OR A
SBC HL,BC
LD A,(PP)
CP (HL)
JR NZ,LINELOOP
INC E
LD (IY+0),L
LD (IY+1),H
INC IY
INC IY
LD A,E
CP 4
JR Z,FOUNDWIN
DEC D
LD A,D
CP 0
JR NZ,LINELOOP3
JR LINELOOP
EXITCHECK:
LD A,(N)
CP 1
JR NZ,SWAPPLAYER
LD A,2
LD (N),A
JP BEGINCHOICE
SWAPPLAYER:
LD A,1
LD (N),A
JP BEGINCHOICE
FOUNDWIN:
LD HL,0F00H
LD (1171H),HL
LD DE,WINNER
CALL 0015H
LD HL,1104H
LD (1171H),HL
LD DE,NA+6
LD A,(N)
CP 2
JR NZ,SHOWNAME
LD DE,NA+92
SHOWNAME:
CALL 0015H
LD HL,S
LD A,(N)
CP 1
JR Z,POINTS
INC HL
POINTS:
LD A,(HL)
INC A
LD (HL),A
LD A,74
LD B,10
FLASHLOOP:
PUSH BC
LD B,4
LD IX,FW
FLASHLOOP2:
LD H,(IX+1)
LD L,(IX+0)
LD (HL),A
INC IX
INC IX
DJNZ FLASHLOOP2
POP BC
PUSH AF
CALL 0062
LD DE,MUSICR1
CALL 0030H
POP AF
CP 74
JR NZ,CHANGECHAR
LD A,(PP)
JR NEXTFLASH
CHANGECHAR:
LD A,74
NEXTFLASH:
DJNZ FLASHLOOP
LD HL,1700H
LD (1171H),HL
LD DE,NEWGAME
CALL 0015H
CALL 6
YESNO:
CALL 001BH
CP 0
JR Z,YESNO
CP 89
JR Z,STARTNEW
CP 78
JR Z,FINISH
JR YESNO
STARTNEW:
LD A,(N)
CP 1
JR Z,CHANGEPLAYER
LD A,1
LD (N),A
JP BEGIN
CHANGEPLAYER:
LD A,2
LD (N),A
JP BEGIN
FINISH:
LD DE,THANKS
CALL 0015H
LD DE,NA+6
CALL 0015H
CALL 000CH
LD A,38
CALL 0012H
CALL 000CH
LD DE,NA+92
CALL 0015H
LD DE,MUSICEND
CALL 0030H
JP 0
TITLES:
LD A,0C6H
CALL 0DDCH
LD B,5
FLASHTITLE:
LD HL,57346
LD (HL),0
LD HL,040AH
LD (1171H),HL
LD DE,TITLE
CALL 0015H
LD HL,060AH
LD (1171H),HL
LD DE,TITLE2
CALL 0015H
LD HL,080AH
LD (1171H),HL
LD DE,TITLE
CALL 0015H
LD DE,MUSICR2
CALL 0030H
LD HL,57346
LD (HL),1
LD DE,MUSICTITLE
CALL 0030H
DJNZ FLASHTITLE
CALL 6
LD DE,INST1
CALL 0015H
CALL 6
LDE DE,INST2
CALL 0015H
CALL 6
LD DE,INST3
CALL 0015H
CALL 6
LD DE,INST4
CALL 0015H
CALL 6
CALL 6
LD DE,SPW
CALL 0015H
CALL 6
LD DE,SPW2
CALL 0015H
CALL 6
LD DE,MUSICR9
CALL 0030H
LD DE,INST5
CALL 0015H
SPACEBAR:
CALL 001BH
CP 32
JR NZ,SPACEBAR
RET
MULTIPLY:
PUSH BC
LD B,8
LD HL,0
ADD HL,HL
RLCA
JR NC,$+3
ADD HL,DE
DJNZ $-5
POP BC
RET
NAME:
DB 22,"WHAT IS YOUR NAME PLAYER "
DB 13
MUSICR9:
DB "R9",13
COLUMNS:
DB "___________________1 2 3 4 5 "
DB "6 7 8______",13
SCORE:
DB 21,"SCORE",13
PIECE1:
DB " IS [FILLED CIRCLE]",13
PIECE2:
DB " IS [UNFILLED CIRCLE]",13
CHOICE:
DB "WHICH COLUMN(1to8)",13
MOVE:
DB "[UP][RIGHT][RIGHT][RIGHT]",13
CHOSEN:
DB "[UP][UP][UP] COLUMN ",13
FULL:
DB "### COLUMN IS FULL ###",13
MUSICR2:
DB "R2",13
WINNER:
DB "THE WINNER IS",13
MUSICR1:
DB "R1",13
NEWGAME:
DB "ANOTHER GAME? (Y/N)",13
THANKS:
DB "THANKS ",13
MUSICEND:
DB "C3D3F#3",13
TITLE:
DB "*****************",13
TITLE2:
DB "C O N N E C T 4",13
MUSICTITLE:
DB "+C+D",13
INST1:
DB "[DOWN][DOWN][DOWN]FOR 2 PLAYERS",13
INST2:
DB "[DOWN]"THE FIRST TO GET 4 TOKENS "
DB "IN ANY ROW",13
INST3:
DB "[DOWN]IS THE WINNER",13
INST4:
DB "[DOWN]EITHER HORIZONTAL, VERTICAL"
DB " OR DIAGONAL",13
INST5:
DB "[DOWN]press SPACE BAR to play",13
SPW:
DB "CONVERTED TO MACHINE CODE BY"
DB 0DH
DPW2:
DB "B. COFFER / SHARPWORKS (2018)"
DB 0DH
NA:
DB "HELLO'"
DS 80
DB "HELLO'"
DS 80
XA:
DW 53426
DW 53428
DW 53430
DW 53432
DW 53434
DW 53436
DW 53438
DW 53440
DW 53442
BA:
DB 80,160,240,254
DB 78,156,234,254
DB 82,164,246,254
DB 2,4,6,254
DB 255
DW:
DS 16
S:
DB 0,0
N:
DB 1
PP:
DB 71
XPOS:
DW 53858
Obviously I know the code could be more compact but I was trying to stay as true to the original flow of the BASIC listing as I could.