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:
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)
; 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ó)
; invoca a rotina em 31000 (muda banco só)
35 RANDOMIZE USR 31000
; carrega ecrã em $C000
; carrega ecrã em $C000
37 LOAD ""CODE 49152
40 NEXT i
; faz ciclo entre os bancos de memória disponiveis no 128K
; 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)
; 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)
; 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
; 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:
Enviar um comentário