domenica 20 febbraio 2011

Gioco del solitario in assembler

Un semplice programmino per giocare al Solitario con le carte francesi (Cuori, Quadri, Fiori, Picche)

Ho preso spunto da un vecchio listato in C++ del prof. Lopriore G. e delle esercitazioni fatte in aula.
Naturalmente logica simile ma linguaggio differente.
Qui si ragiona in bit :-)

La logica molto semplice.
Puo essere naturalmente ottimizzato.
Spero che i commenti possano aiutare.
Ho cercato di essere il piu "lineare" e "sequenziale" possibile.
Provato su Dos Box, (s.o.:Ubuntu 10.04)
Link alle risorse:
http://www.iet.unipi.it/g.stea/Programmazione/index_Prog.html






#
# ------------------------------------------------
# Il gioco del solitario in assembler
# creato da: Al.Col.
#
# ------------------------------------------------
#

.GLOBAL _main

.DATA
vett_cuori: .FILL 10,1,0
vett_fiori: .FILL 10,1,0
vett_picche: .FILL 10,1,0
vett_quadri: .FILL 10,1,0
seme: .BYTE 0x00
all: .BYTE 0x00

mess0: .ASCII "\nIstruzioni del gioco SOLITARIO \nX: exit \nS: stampa \nI: istruzioni \n"
mess1: .ASCII "\nSeme [C,Q,F,P]: "
mess2: .ASCII "\nCarta [01-10]: "
mess3: .ASCII "\nCarta gia inserita, RIPROVA "
mess4: .ASCII "\nSituazione ATTUALE di "

.TEXT
_main: NOP
# ----------------------------------------
# SCEGLIERE il seme della carta
# tra cuori, quadri, picche, fiori
# es: C,Q,F,P
# controllo il giusto inserimento di C,Q,F,P
# ----------------------------------------
istruzioni: PUSH %EBX
PUSH %CX
MOV $mess0,%EBX
MOV $68,%CX
CALL outmess
POP %CX
POP %EBX

insfig: MOV $0,%EAX
MOV $0,%ESI
MOV $0,%ECX
MOV $0,%EBX
# ho pulito i registri

PUSH %EBX
PUSH %CX
MOV $mess1,%EBX
MOV $17,%CX
CALL outmess
POP %CX
POP %EBX




CALL input
CALL output
CMP $'I',%AL
JE istruzioni
CMP $'X',%AL
JE fine
CMP $'S',%AL
CALL newline
JE tutto_C
CMP $'C',%AL
JE cuori
CMP $'Q',%AL
JE quadri
CMP $'F',%AL
JE fiori
CMP $'P',%AL
JE picche
JMP insfig

# ----------------------------------------
# memorizzo la scelta del SEME
# ----------------------------------------
cuori: MOVB %AL,seme
JMP insnum
quadri: MOVB %AL,seme
JMP insnum
fiori: MOVB %AL,seme
JMP insnum
picche: MOVB %AL,seme
JMP insnum

# ----------------------------------------
# scelgo il NUMERO carta
# controllo il giusto inserimento dei valori
# ----------------------------------------
insnum: PUSH %EBX
PUSH %CX
MOV $mess2,%EBX
MOV $16,%CX
CALL outmess
POP %CX
POP %EBX

MOV $0,%ECX
MOV $2,%CX
MOV $0,%ESI
MOV $0,%EAX
# ho pulito i registri

CALL inDANB16_eco
CMP $1,%AX
JB insnum
CMP $10,%AX
JA insnum


# ESI contiene indice del vettore
DEC %EAX
MOV %EAX,%ESI

# vedo il seme scelto e vado al rispettivo vettore
CMPB $67,seme
JE cuori_1
CMPB $81,seme
JE quadri_1
CMPB $70,seme
JE fiori_1
CMPB $80,seme
JE picche_1

# ---------------------------------------------------------------------------------
# CONTROLLO se gia inserita la carta
# SI: messaggio di avviso e vado a nuovo inserimento
# NO: accendo la posizione di numero uguale alla carta scelta e stampo situazione
# ---------------------------------------------------------------------------------
cuori_1: MOV $0,%EAX
MOVB vett_cuori(%ESI),%AL
CMP $1,%AL
JE giains
INCB vett_cuori(%ESI)
JMP stampa

quadri_1: MOV $0,%EAX
MOVB vett_quadri(%ESI),%AL
CMP $1,%AL
JE giains
INCB vett_quadri(%ESI)
JMP stampa
fiori_1: MOV $0,%EAX
MOVB vett_fiori(%ESI),%AL
CMP $1,%AL
JE giains
INCB vett_fiori(%ESI)
JMP stampa
picche_1: MOV $0,%EAX
MOVB vett_picche(%ESI),%AL
CMP $1,%AL
JE giains
INCB vett_picche(%ESI)
JMP stampa
# ----------------------------------------------
# se carta gia scelta stampo AVVISO a video
# ----------------------------------------------
giains: PUSH %EBX
PUSH %CX
MOV $mess3,%EBX
MOV $29,%CX
CALL outmess
POP %CX
POP %EBX
JMP insfig
# -----------------------------------------------
# stampo a video la SITUAZIONE del seme scelto
# -----------------------------------------------
stampa: PUSH %EBX
PUSH %CX
MOV $mess4,%EBX
MOV $23,%CX
CALL outmess
POP %CX
POP %EBX

CMPB $67,seme
JE print_C
CMPB $81,seme
JE print_Q
CMPB $70,seme
JE print_F
CMPB $80,seme
JE print_P
# -------------------------------------------
# situazione dei CUORI
# -------------------------------------------
print_C: CALL newline
MOVB seme,%AL
CALL output

MOV $10,%ECX
MOV $0,%EAX
MOV $0,%ESI



MOV $':',%AL
CALL output
avanti_C:MOV $' ',%AL
CALL output
MOVB vett_cuori(%ESI),%AL
CALL B16DAN_out
INC %ESI
DEC %ECX
CMP $0,%ECX
JNE avanti_C
CMPB $1,all
JE tutto_Q
JMP insfig
# -------------------------------------------
# situazione dei QUADRI
# -------------------------------------------
print_Q: CALL newline
MOVB seme,%AL
CALL output

MOV $10,%ECX
MOV $0,%EAX
MOV $0,%ESI

MOV $':',%AL
CALL output
avanti_Q:MOV $' ',%AL
CALL output
MOVB vett_quadri(%ESI),%AL
CALL B16DAN_out
INC %ESI
DEC %ECX
CMP $0,%ECX
JNE avanti_Q
CMPB $2,all
JE tutto_F
JMP insfig
# -------------------------------------------
# situazione dei FIORI
# -------------------------------------------
print_F: CALL newline
MOVB seme,%AL
CALL output

MOV $10,%ECX
MOV $0,%EAX
MOV $0,%ESI

MOV $':',%AL
CALL output
avanti_F:MOV $' ',%AL
CALL output
MOVB vett_fiori(%ESI),%AL
CALL B16DAN_out
INC %ESI
DEC %ECX
CMP $0,%ECX
JNE avanti_F
CMPB $3,all
JE tutto_P
JMP insfig
# -------------------------------------------
# situazione dei PICCHE
# -------------------------------------------
print_P: CALL newline
MOVB seme,%AL
CALL output

MOV $10,%ECX
MOV $0,%EAX
MOV $0,%ESI

MOV $':',%AL
CALL output
avanti_P:MOV $' ',%AL
CALL output
MOVB vett_picche(%ESI),%AL
CALL B16DAN_out
INC %ESI
DEC %ECX
CMP $0,%ECX
JNE avanti_P
CMPB $4,all
JE azzero
JMP insfig


# ----------------------------------------------
# stampo a video tutte le carte giocate
# ----------------------------------------------





tutto_C:MOVB $1,all
MOVB $'C',seme
JMP print_C
tutto_Q:MOVB $2,all
MOVB $'Q',seme
JMP print_Q
tutto_F:MOVB $3,all
MOVB $'F',seme
JMP print_F
tutto_P:MOVB $4,all
MOVB $'P',seme
JMP print_P
azzero: MOVB $0,all
JMP insfig



fine: CALL pause
RET

.INCLUDE "C:/GAS/utility"

1 commenti:

  1. Ehi amico mio qua ci divertiamo e' ??? mi fai venire in mente i bei tempi di reti logiche quando ho programmato lo snake in assembler :) Mi piace il nuovo colore sfondo del blog. Come gia' ti avevo detto, il nero di sfondo proprio non me piaceva.

    RispondiElimina