[Κατασκευή] Παιχνίδι φιδάκι στον Assembler

συζητήσεις για assembly

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
eizon
Δημοσιεύσεις: 2
Εγγραφή: 31 Μαρ 2010 21:54

[Κατασκευή] Παιχνίδι φιδάκι στον Assembler

Δημοσίευση από eizon » 03 Απρ 2010 20:57

Χρειάζεται να γράψω ένα παιχνίδι φιδάκι στον assembler.
Σε τυχαία σημεία στην οθόνη θα εμφανίζονται τελείες που όταν τις τρώει περνώντας από επάνω θα μεγαλώνει το μήκος της ουράς.
Το παιχνίδι θα λαμβάνει τέλος μόλις χτυπήσει την ουρά του η στις άκρες της οθόνης.
Υπάρχουν σκέψεις και για σκόρ.

Άρχισα με τον διάβασμα των πλήκτρων αλλά κάπου υπάρχει λάθος στον κώδικα μου.
Όταν πατήσω τα βελάκια κολάει και δεν τυπώνει up,down,left,right.
Help.

Κώδικας: Επιλογή όλων

code segment
     assume cs:code,ds:code,es:nothing
     org 100h
	
start:
	in al,60h	;read the current port status
	
	cmp al,04dh
	jnz right
	mov dx,offset left_str
	call puts
	
right:
	cmp al,04bh
	jnz up
	mov dx,offset right_str
	call puts
	
up:
	cmp al,048h
	jnz down
	mov dx,offset up_str
	call puts
	
down:
	cmp al,050h
	jnz start
	mov dx,offset down_str
	call puts
	jmp start

puts:	; string output
	push ax
	mov ah,09h
	int 21h
	pop ax
	ret


	up_str db "up",0dh,0ah
	down_str db "down",0dh,0ah
	left_str db "left",0dh,0ah
	right_str db "right",0dh,0ah
	
code ends
end start

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

[Κατασκευή] Παιχνίδι φιδάκι στον Assembler

Δημοσίευση από LightForce » 04 Απρ 2010 13:45

hi eizon,

Η συνάρτηση INT 21h/09h τυπώνει string που τερματίζουν σε '$'

Κώδικας: Επιλογή όλων

   up_str db "up",0dh,0ah,24h
Ψάξε και στην google, θα βρείς snake source.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

[Κατασκευή] Παιχνίδι φιδάκι στον Assembler

Δημοσίευση από LightForce » 05 Απρ 2010 19:09

Στο κείμενο που ακολουθεί εξηγώ την κατασκευή ενός απλού προγράμματος φιδάκι σε VGA Mode 13h.
Στο συμπιεσμένο zip αρχείο υπάρχει o κώδικας σε δύο εκδόσεις FASM/TASM, source και εκτελέσιμο com.
Θα τρέξει σε XP 32-Bιτ και πιθανόν σε πραγματικό DOS όχι όμως σε Vista.

Πάμε...

Μπαίνουμε σε VGA Μode 13h - 320x200 pixels με τον καταχωρητής ES να δείχνει στην Video Memory διεύθυνση 0A000H.

Κώδικας: Επιλογή όλων

     
    ORG 100H
       
    MOV AL, 13H							
    INT 10H    

    PUSH 0A000H							
    POP ES
Πρώτα θα βάψουμε την οθόνη μπλέ,
Καθαρίζουμε την σημαία DF (direction flag), χρειάζεται για την REP STOSB.
Το χρώμα στον καταχωρητή AL, στον DI το σημείο που θα ξεκινήσουμε στην οθόνη, στον μετρητή CX o αριθμός των pixels που θα βάψουμε.

Κώδικας: Επιλογή όλων

    CLD            
    MOV AL, 1
    MOV DI, 0
    MOV CX, 320*200
    REP STOSB
Το περίγραμμα θα είναι λευκό,
Βάφουμε πρώτα το πάνω μέρος, με τον ίδιο τρόπο.
Kρατάμε την τιμή 320, θα την χρειαστούμε αργότερα για το κάτω μέρος.

Κώδικας: Επιλογή όλων

    MOV AL, 15
    MOV DI, 0
    MOV CX, 320
    PUSH CX
    REP STOSB
Τώρα βάφουμε τα πλαινά μέρη.

Κώδικας: Επιλογή όλων

    MOV CX, 198
.L1:    
    STOSB
    ADD DI, 318
    STOSB
    LOOP .L1
Τελειώνουμε με το κάτω μέρος, και η πίστα είναι έτοιμη.

Κώδικας: Επιλογή όλων

    POP CX
    REP STOSB
Bάζουμε στον καταχωρητή DX το port έλεγχου Vertical Retrace.
Ίδια τιμή και στον καταχωρητή DI για το σημείο που θα ξεκινήσει το φιδάκι.

Κώδικας: Επιλογή όλων

    MOV DX, 3DAH
    MOV DI, DX
Το κυρίως κομμάτι του κώδικα είναι ιδιαίτερα απλό,
To φιδάκι έχει αρχική κατεύθυνση προς τα κάτω.
H τιμή του καταχωρητή CX προστίθεται στον DI και καθορίζει την κατεύθυνση, παίρνει δε μία απο τις ακόλουθες τιμές: 1, -1, 320, -320.
Πρώτα εκτελείται Vertical Retrace έλεγχος, θα δώσει ομαλή κίνηση και την καθυστέρηση που χρειάζεται.
Εν συνεχεία συγκρίνουμε το pixel που πρόκειται να βάψουμε, εάν δεν είναι μπλέ τότε έχουμε συγκρουστεί, διαφορετικά το βάφουμε λευκό.
Τέλος, διαβάζουμε το port του πληκτρολογίου για τυχόν πάτημα πλήκτρου και αλλαγή τιμής στον CX.

Κώδικας: Επιλογή όλων

.DOWN:
    MOV CX, 320
.MAIN:
    ADD DI, CX

.NoRETR:    
    IN AL, DX
    TEST AL, 8
    JNE .NoRETR
.RETR:       
    IN AL, DX
    TEST AL, 8
    JE .RETR

    CMP BYTE [ES:DI], 1
    JNZ .X
    MOV BYTE [ES:DI], 15

    IN AL, 60H

    CMP AL, 04DH
    JNZ .C
    MOV CX, 1
.C:
    CMP AL, 04BH
    JNZ .D
    MOV CX, -1
.D:
    CMP AL, 048H
    JNZ .E
    MOV CX, -320
.E:
    CMP AL, 050H
    JZ .DOWN
    JMP .MAIN
Επιστροφή σε text mode και έξοδος στο λειτουργικό.

Κώδικας: Επιλογή όλων

     
.X:       
    MOV AL, 03H
    INT 10H     

    INT 20H
Aυτό ήταν.

tiny nibbles 48-120 bytes
Συνημμένα
SOURCE.zip
(1.31 KiB) Μεταφορτώθηκε 636 φορές

eizon
Δημοσιεύσεις: 2
Εγγραφή: 31 Μαρ 2010 21:54

[Κατασκευή] Παιχνίδι φιδάκι στον Assembler

Δημοσίευση από eizon » 06 Απρ 2010 20:32

LightForce έγραψε:hi eizon,

Η συνάρτηση INT 21h/09h τυπώνει string που τερματίζουν σε '$'

Κώδικας: Επιλογή όλων

   up_str db "up",0dh,0ah,24h
Ψάξε και στην google, θα βρείς snake source.
Είχα ήδη βρει το λάθος και μετά διάβασα την απαντησή σου.
LightForce έγραψε:Στο κείμενο που ακολουθεί εξηγώ την κατασκευή ενός απλού προγράμματος φιδάκι σε VGA Mode 13h.
Ωραίος!

Απάντηση

Επιστροφή στο “Assembly”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες