Questa procedura crea l'animazione muovendo le parti che compongono il serpente un passo in avanti.
L'ultimo elemento dell'array Serpente (la coda)] si cancella, mentre le parti intermedie vengono copiate una posizione in avanti nell'array
Si inizializza ES per puntare al segmento
40h, dove sono contenute informazioni di sistema, in particolare il numero di righe e il numero di colonne del video:
muoviSerpente PROC NEAR
MOV AX, 40h
MOV ES, AX
Il registro
DI viene inizializzato con l'indice dell'array che contiene il penultimo elemento dell'array Serpente, mentre nel registro
CX si scrive il numero di elementi del serpente:
MOV DI, Lunghezza * 2 - 2
MOV CX, Lunghezza-1
Mediante un ciclo si muovono tutte le parti del corpo un passo in avanti
Ogni elemento viene portato nell'elemento successivo:
avanza:
MOV AX, Serpente[DI-2]
MOV Serpente[DI], AX
SUB DI, 2
LOOP avanza
Prima di stampare la testa del serpente si esamina la variabile
Direzione:
CMP Direzione, Sinistra
JE vaiSinistra
CMP Direzione, Destra
JE vaiDestra
CMP Direzione, Su
JE vaiSu
CMP Direzione, Giu
JE vaiGiu
JMP fermaSerpente ; nessuna direzione scelta.
Se il serpente procede verso sinistra si deve decrementare il numero di colonna, prima di modificare le coordinate della testa contenute nell'elemento 0 dell'array Serpente.
Se però, il serpente esce fuori dallo schermo (colonna < 0) allora si fa rientrare il serpente dall'altro lato. Occorre però conoscere il numero di colonne dello schermo per modificare il numero di colonna in cui deve comparire la testa del serpente. Questa informazione è disponibile nella variabile di sistema che si trova all'offset
4Ah nel segmento
40h.
vaiSinistra:
MOV AL, byte ptr Serpente[0]
DEC AL
MOV byte ptr Serpente[0], AL
CMP AL, -1
JNE fermaSerpente
MOV AL, ES:[4Ah] ; numero colonna.
DEC AL
MOV byte ptr Serpente[0], AL ; rientra a destra.
JMP fermaSerpente
Analogamente, se il serpente si muove verso destra si deve incrementare la coordinata di colonna della testa, ma quando raggiunge l'estremità destra dello schermo, si deve modificare la coordinata di colonna portandola a 0.
vaiDestra:
MOV AL, byte ptr Serpente[0]
INC AL
MOV byte ptr Serpente[0], AL
CMP AL, ES:[4Ah] ; numero colonna.
JB fermaSerpente
MOV byte ptr Serpente[0], 0 ; rientra a sinistra.
JMP fermaSerpente
Le stesse considerazioni valgono quando il serpente si muove in verticale. Se il serpente sale si decrementa la coordinata di riga, altrimenti la si incrermenta, e quando giunge ad una delle estremità dello schermo deve rientrare dall'altra estremità. In questo caso il numero di righe dello schermo è, specificato nell'offset
84h del segmento
40h
vaiSu:
MOV AL, byte ptr Serpente[1]
DEC AL
MOV byte ptr Serpente[1], AL
CMP AL, -1
JNE fermaSerpente
MOV AL, ES:[84h] ; numero di riga -1.
MOV byte ptr Serpente[1], AL ; ritorna in basso.
JMP fermaSerpente
vaiGiu:
MOV AL, byte ptr Serpente[1]
INC AL
MOV byte ptr Serpente[1], AL
CMP AL, ES:[84h] ; numero di riga -1.
JBE fermaSerpente
MOV byte ptr Serpente[1], 0 ; ritorna in alto.
JMP fermaSerpente
La pressione di un tasto diverso da un tasto cursore esce dalla procedura
fermaSerpente:
RET
muoviSerpente ENDP