segunda-feira, 9 de março de 2020

Paginação em 128K (III)

Neste artigo, oferecemos como exemplo, um programa de paging para todos os modelos de ZX Spectrum 128K.

O programa Basic associado faz ciclo entre todos os bancos disponíveis (8). No primeiro FOR, carrega um SCREEN de tape, no segundo faz ciclo entre as paginas em $C000, transferindo o ecrã para $4000. Não nos preocupamos com a possibilidade de corromper o banco 5 do BASIC em $4000, porque o começo do banco 5 é a zona do ecrã.

Note-se que o TAP / programa é um exemplo, com 128K podia-se colocar o dobro de ecrãs que estamos a mostrar sem compressão e a usar atributos.


$5b5c/
$7ffd AND     $f0 / OR D
Port
Bit
7
6
5
4
3
2
1
0
$7ffd
=
=
=
=
0
D          

; (C) Rui Ribeiro Fev 2020
;
; Invoked from 128K mode BASIC

        ORG     31000
        NOP
LD D,0       ; page <--- value changed by BASIC LD D,i

; Paging variable from 128K model onwards
; $7ffd - Bits 0-2: RAM page (0-7) to map into memory at 0xc000.

        LD      A,($5b5c)      ; system copy of $7ffd

        AND     $f0            ; reset bit 0-2
                               ; RAM page/bank to load at $C000
                               ; video 0
        OR      D              ; Select bank D

        PUSH BC
        LD      BC,$7ffd
        DI
        LD      ($5b5c),A      ; save copy of the new value

        OUT     (C),A          ; change for bank i at $C000
        EI
        POP BC

LD A,C
AND 1
RET Z

; If invoked with 31001, keep running
; Besides changing memory bank paged into $C000, also
; transfers screen from $C000 to $4000 (video 0)

        LD HL,$C000
        LD DE,$4000
LD BC,6912
LDIR
        RET


 BASIC:

; coloca stack a seguir ao BASIC, para libertar as páginas superiores
5 CLEAR 30999
6 BORDER 0
; carrega o C/M
10 LOAD ""CODE 
; faz ciclo entre os bancos de memória disponíveis
20 FOR i=0 TO 7
; modifica o código máquina para colocar o D com o valor do banco (LD D,i)
30 POKE 31002,i
; invoca a rotina em 31000 (muda banco só)
35 RANDOMIZE USR 31000
; carrega ecrã em $C000
37 LOAD ""CODE 49152
40 NEXT i
; faz ciclo entre os bancos de memória disponiveis no 128K
50 FOR i=0 TO 7
; modifica o código máquina ( LD D,i)
60 POKE 31002,i
; invoca a rotina em 31001 (muda banco e transfere o ecrã em $C000 para $4000)
70 RANDOMIZE USR 31001
80 PAUSE 30
90 NEXT i
; ciclo a mostrar continuamente os ecrãs
100 GO TO 50

Demo: download destas rotinas com ecrãs de loading de jogos aqui; o TAP tem de ser carregado com LOAD "" desde BASIC 128, num emulador que suporte 128K / pageamento (ou na máquina real).

Sem comentários:

Publicar um comentário