Stampa stringa char by char a cordinate x/y in memoria video

di il
2 risposte

Stampa stringa char by char a cordinate x/y in memoria video

Salve, sono nuovo del forum, vi scrivo per un intoppo che non riesco a risolvere come voglio.
Spiegazione…
Ho necessità di stampare una stringa passata come parametro direttamente in memoria video, il codice che posto è il punto che sono giunto senza problemi, ricordo che il codice e parte integrante di un insieme.
La questione e fare in modo che ogni carattere venga avanzato e stampato a cordinate xy che possono variare durante la stampa, questo per ottenere attraverso una CALL di una funzione che ne ricava XY UpdateCursor, in modo da poter contenere i caratteri stampati in un'aria x,y,xx,yy.
Al momento stampo tranquillamente la stringa, ma questa viene stampata senza poter interagire su singoli caratteri e posizioni xy.
So che esiste un modo, ma non riesco a trovarlo. Gradirei una soluzione.

ECCO IL CODICE

 push ds
 dec x
 dec y
 les di, VIDEO_PTR_ADDR
 mov ah, bc
 shl ah, 4
 add ah, fc
 mov bx, y
 add bx, bx
 add di, word ptr VIDEO_TABLE[bx]
 mov bx, x
 add bx, bx
 add di, bx
 lds si, str
 xor ch, ch
 mov cl, byte ptr[si]
 jcxz @exit
 inc si
 cld
@next:
 lodsb                       # quì dovrebbe esserci la possibilità di passare X,Y ad ogni carattere, ho la funzione, ma non so come passarli
 stosw
 loop @next
@exit:
 pop ds

Grazie

2 Risposte

  • Re: Stampa stringa char by char a cordinate x/y in memoria video

    Sinceramente non si capisce molto.

    Spiega meglio il problema che hai soprattutto indica il contesto in cui operi, strumenti, tool. Inoltre il significato delle variabili utilizzate(a noi sconoaciuto) e due parole sul codice.

    Inoltre il codice andrebbe sul forum tra tag CODE 

  • Re: Stampa stringa char by char a cordinate x/y in memoria video

    12/10/2023 - oregon ha scritto:


    Sinceramente non si capisce molto.

    Spiega meglio il problema che hai soprattutto indica il contesto in cui operi, strumenti, tool. Inoltre il significato delle variabili utilizzate(a noi sconoaciuto) e due parole sul codice.

    Inoltre il codice andrebbe sul forum tra tag CODE 

    Hai ragione, andavo un po di fretta al momento della domanda. Mi spiego meglio:

    Queta è una funzione che andrà in una libreria FPC , ho gia realizzato la funzione che una volta chiamata CALL UpdateCursor, questa aggiorna rispettivamente due variabili (NewX e NewY) che trasportano la posizione già adeguata per stampare un carattere in una WINDOW x,y,xx,yy.

    Adesso ho realizzato quest'altra che stampa direttamente nella VRAM una stringa passata in STR a cordinate di partenza X,Y con colori di primo piano FC e secondo piano BC.  La domanda (intoppo) che non riesco ad uscirne dopo vari tentativi è:
    Come posso stampare ogni singolo carattere della stringa, poi chiamare UpdateCursor e ricavare NewX, NewY per il prossimo carattere e così via?

    CODICE ATTUALE:

    push ds
     dec x
     dec y
     les di, VIDEO_PTR_ADDR       ;PUNTATORE VIDEO
     mov ah, BC                              ; colore sfondo
     shl ah, 4
     add ah, fc                                 ; colore testo
     mov bx, y                                                 ; riga iniziale
     add bx, bx
     add di, word ptr VIDEO_TABLE[bx]   ; Puntatore TABELLA VIDEO
     mov bx, X                                               ; Colonna iniziale
     add bx, bx
     add di, bx
     lds si, str                                                 : sringa
     xor ch, ch
     mov cl, byte ptr[si]
     jcxz @exit
     inc si
     cld
    @next:                                                          
     lodsb                       
     stosw
     loop @next
    @exit:
     pop ds

    ho provato vari tentativi senza successo, ma da qualche parte dovrebbe andare 
    CALL UpdateCursor
    mov  dh, NewY
    mov  dl, NewX
    per indicare le cordinate giuste al prossimo carattere della stringa.
    Questa funzione dovrebbe comportarsi come fa un semplice printf o write all'interno si una finestra window, e UpdateCursor non fa altro che spostare la posizione NewX di un passo finche non trova il bordo della window per poi incrementere NewY e spostare NewX all'estrema sinistra.

    Spero di essermi espresso meglio

Devi accedere o registrarti per scrivere nel forum
2 risposte