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"
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