by Rick Kephart
August 1, 1991
This program will produce a machine language subroutine which may be
included in card games written in BASIC. It will shuffle a deck of cards, and
place them into an array which can easily be read from BASIC. The program is
very fast, shuffling an entire deck and filling the array in a tenth of a
second or less.
First RUN the SHUFFLEMAKE program. This will produce a 2-block machine
language program on your disk called SHUFFLE.
To use SHUFFLE in a program, first LOAD it in memory using:
10 SYS 57812 "SHUFFLE",8,1:POKE 780,0:SYS 65493
or:
10 IF A=0 THEN A=1:LOAD"SHUFFLE",8,1
You must use the DIM statement to prepare the area for the array. Use the
statement DIM C$(52) before calling SHUFFLE and before using any other array
variables. After the DIMC$(52), other array variables can be used; another
array may even be DIM'd at the same time, as long as the C$ comes first. You
may use a different name for variable, but it must be a string array and be
the first array used in the program. Numerical and string variables may be
used any time in the program. After the DIM statement, use SYS 49152 to
shuffle the deck and fill the array. You can re-shuffle the deck (and refill
the array) at any time with another call to SYS 49152.
The shuffled cards may then be found in the array C$(1) through C$(52).
Each one may be read as follows:
ASC(C$(x)) Value of the card:
2 through 10
Jack =11
Queen=12
King =13
Ace = 14
MID$(C$(x),2,1) Color:
Red = CHR$(28)
Black = CHR$(144)
RIGHT$(C$(x),1) Suit
RIGHT$(C$(x),4) Prints out the card
in red or black
RIGHT$(C$(x),3) Prints the card without
changing color
Also included here is a short demo, a poker game, to illustrate how SHUFFLE
may be used in a BASIC card game program. First RUN the SHUFFLEMAKE program
before POKER, then be sure to RUN POKER with the disk containing SHUFFLE in
the drive, so it can LOAD in the machine language SHUFFLE program.
SHUFFLEMAKE
10 OPEN8,8,8,"SHUFFLE,P,W"
20 FORI=0TO256:READA:PRINT#8,CHR$(A);:NEXT:CLOSE8
100 DATA 0,192,24,160,13,169,18,153,254,192,73,48,153,11,193,9,16,153
110 DATA 24,193,73,112,153,37,193,73,80,105,1,136,208,231,160,128
120 DATA 140,24,212,169,255,141,14,212,141,15,212,200,140,18,212,169
130 DATA 0,133,254,173,27,212,41,63,201,52,176,247,168,173,27,212
140 DATA 41,63,201,52,176,247,170,189,255,192,72,185,255,192,157,255
150 DATA 192,104,153,255,192,230,254,165,254,208,216,56,165,51,133,253
160 DATA 233,1,133,51,165,52,133,254,233,4,133,52,160,10,169,5
170 DATA 145,47,200,56,165,253,233,5,133,253,165,254,233,0,133,254
180 DATA 165,253,145,47,165,254,200,145,47,200,192,166,144,224,162,52
190 DATA 160,0,189,254,192,72,41,15,145,253,200,104,72,41,16,240
200 DATA 3,169,144,44,169,28,145,253,200,104,72,41,15,201,11,176
210 DATA 27,201,10,240,12,9,48,145,253,200,169,32,145,253,200,208
220 DATA 24,169,49,145,253,200,169,48,145,253,208,13,168,185,240,192
230 DATA 160,2,145,253,200,169,32,145,253,104,74,74,74,74,168,185
240 DATA 246,192,160,4,145,253,24,165,253,105,5,133,253,165,254,105
250 DATA 0,133,254,202,208,154,96,193,211,216,218,74,81,75,65
POKER
10 SYS 57812 "SHUFFLE",8,1:POKE 780,0:SYS 65493: DIMC$(52),H$(14)
20 POKE 53281,13:REM GREEN SCREEN
30 H$(11)="JACK":H$(12)="QUEEN":H$(13)="KING":H$(14)="ACE"
40 PRINT:PRINT"SHUFFLE":PRINT:SYS 49152:P=1:REM P = CURRENT POSITION IN DECK
50 PRINT:FOR I=1 TO 5:A$(I)=C$(P):B$(I)=C$(P+1):P=P+2:NEXT
60 REM A$(1) TO A$(5) ARE YOUR CARDS, B$(1) TO B$(5) ARE THE 64'S
70 FOR I=1 TO 5:S2$(I)=RIGHT$(B$(I),1):V2(I)=ASC(B$(I))
80 REM S2$( ) ARE THE SUITS, V2( ) ARE FACE VALUES OF CARDS FOR THE 64
90 PRINT RIGHT$(A$(I),4)" ";:NEXT:PRINT:REM THIS PRINTS YOUR CARDS
100 FORI=1TO4:IFV2(I)>V2(I+1)THEN X=V2(I):V2(I)=V2(I+1):V2(I+1)=X:GOTO100
110 NEXT:REM THIS SORTS THE FACE VALUES OF THE CARDS
120 PRINT:PRINT "[dark blue]HOW MANY DO YOU WANT?";
130 GET N$:N=VAL(N$):IF N>5 THEN 130
140 IF N=0 THEN IF N$<>"0" THEN 130
150 IF N=0 THEN PRINT:PRINT:GOTO 200: KEEP ALL CARDS
160 PRINT N:PRINT "[dark blue]DISCARD WHICH CARDS? (1-5)";
170 FOR I=1 TO N
180 GET M$:M=VAL(M$):IF M<1 OR M>5 THEN 180
190 PRINT M;:A$(M)=C$(P):P=P+1:NEXT:PRINT:PRINT:REM SUBSTITUTE NEW CARDS
200 FOR I=1TO5:S1$(I)=RIGHT$(A$(I),1):V1(I)=ASC(A$(I)):REM SUITS AND VALUES
210 PRINT RIGHT$(A$(I),4)" ";:NEXT:PRINT
220 FORI=1TO4:IFV1(I)>V1(I+1)THENX=V1(I):V1(I)=V1(I+1):V1(I+1)=X:GOTO 220
230 NEXT:REM SORTS CARDS
240 PRINT:PRINT"[dark blue]YOU GOT ";:FOR I = 1 TO 5
245 X(I)=V1(I):X$(I)=S1$(I):NEXT:GOSUB 350
250 PRINT:FORI=1TO5:PRINTRIGHT$(B$(I),4)" ";:NEXT:PRINT:REM SHOW 64'S CARDS
260 PRINT:PRINT "[dark blue]I GOT ";:FOR I=1 TO 5:X(I)=V2(I)
265 X$(I)=S2$(I):NEXT:GOSUB 350
270 PRINT:PRINT "[dark blue]PLAY AGAIN?"
280 GET N$:IF N$="N" THEN END
290 IF N$<>"Y" THEN 280
300 IF P<37 THEN 50:REM NO SHUFFLE
310 GOTO 40:REM RESHUFFLE DECK
320 :
330 REM SUBROUTINE TO FIND SCORE
340 REM X(1) IS THE LOWEST CARD, X(5) IS THE HIGHEST CARD
350 M3=0:F=0:S=0:REM FLAGS: M3=3 OF A KIND, F=FLUSH, S=STRAIGHT
360 IFX$(1)=X$(2)THENIFX$(2)=X$(3)THENIFX$(3)=X$(4)THENIFX$(4)=X$(5)THEN F=1
370 X=X(1):IFX+1=X(2)THEN IF X+2=X(3)THEN IF X+3=X(4)THENIF X+4=X(5)THEN S=1
380 IF F THEN IF S THEN IF X(1)=10 THEN PRINT"A ROYAL FLUSH":RETURN
390 IF F THEN IF S THEN PRINT"A STRAIGHT FLUSH":RETURN
400 FOR I=1 TO 2
410IFX(I)=X(I+1)ANDX(I+1)=X(I+2)ANDX(I+2)=X(I+3)THENPRINT"4 OF A KIND":RETURN
420 NEXT
430 IF X(1)=X(2) THEN IF X(2)=X(3) THEN M3=1:IF X(4)=X(5) THEN 540
440 IF X(3)=X(4) THEN IF X(4)=X(5) THEN M3=1:IF X(1)=X(2) THEN 540
450 IF F THEN PRINT "A FLUSH":RETURN
460 IF S THEN PRINT "A STRAIGHT":RETURN
470 IF M3 OR (X(2)=X(3) AND X(3)=X(4)) THEN PRINT "3 OF A KIND":RETURN
480 IF X(1)=X(2) THEN IF(X(3)=X(4) OR X(4)=X(5))THEN PRINT "2 PAIRS":RETURN
490 IF X(2)=X(3) THEN IF X(4)=X(5) THEN PRINT"2 PAIRS":RETURN
500 FOR I=1 TO 4:IF X(I)=X(I+1) THEN PRINT "ONE PAIR":RETURN
510 NEXT
520 IF X(5)<11 THEN PRINT X(5) "HIGH":RETURN
530 PRINT H$(X(5)) " HIGH":RETURN:REM "JACK", "QUEEN", ETC.
540 PRINT "A FULL HOUSE":RETURN
====================================================================
C000 18 CLC ;fill with 52 cards
C001 A0 0D LDY #$0D ;13 different cards
C003 A9 12 LDA #$12 ;start with 2 of spades
C005 99 FE C0 STA $C0FE,Y ; "$1x" = x of spades
C008 49 30 EOR #$30 ;EOR's and ORA produce all 4
C00A 99 0B C1 STA $C10B,Y ;different suits
C00D 09 10 ORA #$10
C00F 99 18 C1 STA $C118,Y
C012 49 70 EOR #$70
C014 99 25 C1 STA $C125,Y
C017 49 50 EOR #$50
C019 69 01 ADC #$01 ;go to next number of cards
C01B 88 DEY
C01C D0 E7 BNE $C005
C01E A0 80 LDY #$80 ;set up SID noise generator to
C020 8C 18 D4 STY $D418 ;random numbers
C023 A9 FF LDA #$FF
C025 8D 0E D4 STA $D40E
C028 8D 0F D4 STA $D40F
C02B C8 INY
C02C 8C 12 D4 STY $D412
C02F A9 00 LDA #$00 ;$FE counts down 255 random card
C031 85 FE STA $FE ;exchanges
C033 AD 1B D4 LDA $D41B ;get a random number between 1
C036 29 3F AND #$3F ;and 52 and store it in Y
C038 C9 34 CMP #$34
C03A B0 F7 BCS $C033
C03C A8 TAY
C03D AD 1B D4 LDA $D41B ;second random number in X
C040 29 3F AND #$3F
C042 C9 34 CMP #$34
C044 B0 F7 BCS $C03D
C046 AA TAX
C047 BD FF C0 LDA $C0FF,X ;exchange cards pointed to by X
C04A 48 PHA ;and Y
C04B B9 FF C0 LDA $C0FF,Y
C04E 9D FF C0 STA $C0FF,X
C051 68 PLA
C052 99 FF C0 STA $C0FF,Y
C055 E6 FE INC $FE ;do it 255 times
C057 A5 FE LDA $FE
C059 D0 D8 BNE $C033
C05B 38 SEC ;move bottom of strings down
C05C A5 33 LDA $33 ;$0104 (260 or 5*52)
C05E 85 FD STA $FD ;bytes, and stores the location
C060 E9 01 SBC #$01 ;in $FD and $FE
C062 85 33 STA $33 ;where the array strings are to
C064 A5 34 LDA $34 ;be built
C066 85 FE STA $FE
C068 E9 04 SBC #$04
C06A 85 34 STA $34
C06C A0 0A LDY #$0A ;set up the addresses and length
C06E A9 05 LDA #$05 ;(5 bytes) of all 52 array
C070 91 2F STA ($2F),Y ;strings
C072 C8 INY
C073 38 SEC
C074 A5 FD LDA $FD
C076 E9 05 SBC #$05 ;each string 5 bytes away from
C078 85 FD STA $FD ;the last one
C07A A5 FE LDA $FE
C07C E9 00 SBC #$00
C07E 85 FE STA $FE
C080 A5 FD LDA $FD
C082 91 2F STA ($2F),Y
C084 A5 FE LDA $FE
C086 C8 INY
C087 91 2F STA ($2F),Y
C089 C8 INY
C08A C0 A6 CPY #$A6 ;array data takes up a total of
C08C 90 E0 BCC $C06E ;166 bytes
C08E A2 34 LDX #$34 ;get 52 ($34) cards one at a
C090 A0 00 LDY #$00 ;time to convert to array data
C092 BD FE C0 LDA $C0FE,X ;and place in string memory
C095 48 PHA
C096 29 0F AND #$0F ;stores value to be read with
C098 91 FD STA ($FD),Y ;ASC(C$(x))
C09A C8 INY ;$FD points to current
C09B 68 PLA ;location in string memory
C09C 48 PHA
C09D 29 10 AND #$10 ;color - check for even suit
C09F F0 03 BEQ $C0A4 ;even=red
C0A1 A9 90 LDA #$90 ;$90=ASCII("black")
C0A3 2C A9 1C BIT $1CA9 ;LDA #$1C $1C=ascii("red")
C0A6 91 FD STA ($FD),Y
C0A8 C8 INY
C0A9 68 PLA
C0AA 48 PHA
C0AB 29 0F AND #$0F ;remove suit to see card's value
C0AD C9 0B CMP #$0B
C0AF B0 1B BCS $C0CC ;face card if >$0B
C0B1 C9 0A CMP #$0A
C0B3 F0 0C BEQ $C0C1 ;make sure it's not ten
C0B5 09 30 ORA #$30 ;poke the ASCII value of the
C0B7 91 FD STA ($FD),Y ;card number
C0B9 C8 INY
C0BA A9 20 LDA #$20 ;follow with a space
C0BC 91 FD STA ($FD),Y
C0BE C8 INY
C0BF D0 18 BNE $C0D9
C0C1 A9 31 LDA #$31 ;if it's a ten, poke "10"
C0C3 91 FD STA ($FD),Y ;in ASCII
C0C5 C8 INY
C0C6 A9 30 LDA #$30
C0C8 91 FD STA ($FD),Y
C0CA D0 0D BNE $C0D9
C0CC A8 TAY ;if it's a face card, get the
C0CD B9 F0 C0 LDA $C0F0,Y ;value from data pointed to
C0D0 A0 02 LDY #$02 ;by Y, which begins with 11
C0D2 91 FD STA ($FD),Y
C0D4 C8 INY
C0D5 A9 20 LDA #$20
C0D7 91 FD STA ($FD),Y
C0D9 68 PLA ;get the suit, 1 to 4 in the high
C0DA 4A LSR ;nibble
C0DB 4A LSR
C0DC 4A LSR
C0DD 4A LSR
C0DE A8 TAY
C0DF B9 F6 C0 LDA $C0F6,Y ;get the suit ASCII from the
C0E2 A0 04 LDY #$04 ;table
C0E4 91 FD STA ($FD),Y
C0E6 18 CLC ;move on to the next area in
C0E7 A5 FD LDA $FD ;string memory in which to build
C0E9 69 05 ADC #$05 ;the next array variable
C0EB 85 FD STA $FD
C0ED A5 FE LDA $FE
C0EF 69 00 ADC #$00
C0F1 85 FE STA $FE
C0F3 CA DEX ;count 52 cards
C0F4 D0 9A BNE $C090
C0F6 60 RTS
C0F7 C1 D3 CMP ($D3,X) ;[Ace graphic], [Heart graphic]
C0F9 D8 CLD ;[Spade graphic]
C0FA DA ??? ;[Diamond graphic]
C0FB 4A LSR ;"J"
C0FC 51 4B EOR ($4B),Y ;"Q","K"
C0FE 41 EOR ($2D,X) ;"A"
End of file.
You can write to me at
.
| HOME | Religion | Latin Mass | Denton | Prayer Requests | |
| Stories | Art | ******* | Commodore | Miniatures | |
| England | Italy | Florida | Musical | Gregorian Chant | LPH Resource Center |