[zxspectrum] Re: IM MODE

Alessandro Poppi wrote:
On Monday, February 27, 2006 8:00 AM [GMT+1],
Paolo Ferraris <pieffe8@xxxxxxxxxxxxx> wrote:

sembra troppo complicato. Comunque una soluzione software come quella
prospettata da te non dovrebbe essere difficile da scrivere, se si
possono usare i 16K inferiori come ROM custom/RAM. Se vuoi ti
suggerisco come fare.

Dimmi, dimmi... pero` considera che non posso permettermi di modificare nemmeno un byte di ram, eccetto quella relativa allo schermo, altrimenti potrei non riuscire a rientrare nel programma appena snappato. Va beh che posso rileggerlo dallo snap stesso, ma mi sembra un po` macchinoso.


Ok. La cosa migliore sarebbe avere qualche byte di RAM prima della zona video, ma questo dipende dall'hardware. La zona video va comunque bene lo stesso. La sintassi precisa ovviamente dipende dall'assembler.

-p


IMODE equ 16384 ;; o qualunque altro indirizzo in cui possiamo ;; scrivere, conterra` i'interrupt mode ORG 003F ;; interrupt address

        ...     ;; la routine puo` contenere niente
                ;; se si vuole solo scoprire l'interrupt mode;
                ;; puo` contenere dell'altro in caso si voglia, per
                ;; esempio, gestire la tastiera se il magic button e`
                ;; interattivo
        EI
        RET


org 0066 ;; NON-MASKABLE INTERRUPT routine

        ...     ;; salvataggio dei registri, in particolare di I ed AF;
                ;; gli interrupt sono disabilitati
        xor     a
        ld      (IMODE),a       ;; salviamo che siamo in IM0
        ld      i,2
        ei      ;; abilitiamo momentaneamente gli interrupt
        halt    ;; (almeno) una chiamata agli interrupt;
                ;; se siamo in IM2 allora la routine all'indirizzo
                ;; puntato dalla locazione di memoria 02FFh (cioe`
                ;; NEWINT) viene lanciato, altrimenti direttamente 33h
        di      ;; ridisabilitiamo gli interrupt
        ...     ;; continuiamo la routine normale


org 02FF
defw NEWINT ;; puntatore alla routine da essere lanciata in ;; caso in IM2 (I deve essere settato a 2)


        ...

org     ...     ;; routine di interrupt in caso di IM2
NEWINT:
        push    af
        ld      a,2
        ld      (IMODE),a       ;; salviamo che siamo in IM2
        pop     af
        jp      3Fh             ;; normale routine di interrupt



Other related posts: