quinta-feira, 5 de março de 2020

Paginação em 128K (II)

Como vistos no post anterior, em paginação no 128K (I) , os modelos da Amstrad permitem paginar um banco/página de RAM no endereço $000-$3FFF (em cima da ROM).

Neste artigo apresentamos um exemplo de um programa em assembly, que carrega uma imagem de uma ROM em memória alta, pagina-a em cima da ROM, e salta para ela.

Neste caso, mudados o stack de código máquina e os stacks aplicacionais para um endereço abaixo de 32768, já que ao mudar para o modo especial 2, as duas páginas superiores vão ser mudadas.

Configuração por defeito, no arranque:
$FFFF
-
$C000
Bank 0
$BFFF
-
$8000
Bank 2

$7FFF
-
$4000
Bank 5
(screen 0)

$3FFF
-
$0000
ROM 0

Depois mudamos o banco 0 no topo, pelo banco 4.

$5b5c/$7ffd AND     $f8 / OR $04
Port
Bit
7
6
5
4
3
2
1
0
$7ffd
=
=
=
=
=
100  ($4)               

Nova paginação:
$FFFF
-
$C000
Bank 4
$BFFF
-
$8000
Bank 2

$7FFF
-
$4000
Bank 5
(screen 0)

$3FFF
-
$0000
ROM 0

Fazemos o load da imagem da ROM a partir de 49152/$C000, para carregar esse banco com uma imagem de ROM com um tamanho máximo de 16KB (LOAD "" CODE 49152).

Carregada a imagem de ROM, solicitamos ficar no modo especial 2, para o banco 4, e consequentemente a imagem da ROM, ficar disponível a partir da posição $0000. Note-se a saída dos bancos 2 e 4, e daí a necessidade do stack/CLEAR ter tido de ficar abaixo de $7FFF.

$5b67/$1ffd  OR      $07 / XOR     $02 
Port
Bit
7
6
5
4
3
2
1
0
$1ffd
=
=
=
=
=
10 ($2)
1

Nova paginação:
$FFFF
-
$C000
Bank 3
$BFFF
-
$8000
Bank 6

$7FFF
-
$4000
Bank 5
(screen 0)

$3FFF
-
$0000
Bank 4

Se quisermos uma compatibilidade melhor com 48K apenas, podemos também desactivar a paginação (passo opcional, comentado no assembly).

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

Finalmente então saltamos para $0000, para executar a imagem de ROM que carregamos.

;
; Routine for the 128K+2/2A/3 to load bank 4 with a ROM
; and map it on top of ROM/address $0000
;
; (C) Rui Ribeiro Fev 2020
;
; Invoked from 128K mode BASIC
;
; By default memory banks will be ROM 0->Bank 5 (screen)->Bank 2->Bank 0
; Each RAM bank is 16KB
;
; Requirements before calling it, CLEAR 30999 ; if it not done it will crash 
; as stack needs to be bellow 32768 by the end of this routine, as
; bank 0 and bank 2 will shift positions
;
; see https://www.worldofspectrum.org/faq/reference/128kreference.htm
;
; CLEAR 30999: LOAD "THIS" CODE : RAND USR 31000 : LOAD "ROM" CODE 49152 : RAND USR 31001 
;
; Short note: USR BASIC routine loads BC with called address

ORG 31000
NOP
LD A,C               ; point of entry for 2nd time calling
AND 1   
JR NZ,SPECIAL_MODE   ; if BC odd, go to SPECIAL_MODE


; First moves bank 4 to $C000 (49152) replacing  Bank 0
;
; called with RANDOMIZE USR 31000 (first time)
;
; 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     $f8        ; reset bit 0-2
       ; RAM page/bank to load at $C000
OR      4              ; Select bank 4

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

OUT     (C),A        ; change bank 0 for bank 4 at $C000
RET

; After LOAD "" CODE 49152
; called with RANDOMIZE USR 31001
;
;
; for loading the "ROM" in Bank 4 at $C000

; shift for special mode 2
;
; bank 4 $C000->$FFFF which we LOADed"" will be moved to $0000->$3FFF
;
; Bank 4->Bank 5->Bank 6->Bank 3
;
; Paging variable from 128K +2A Onwards
; $1ffd - Bit 0: Paging mode. 0=normal, 1=special
;         Bit 2=1 and Bit 1=0 : Banks 4->5->6->3

SPECIAL_MODE:

LD      A,($5b67) ; system copy of $1ffd

OR      $07
XOR     $02 ; Special mode, mode 2

LD      BC,$1ffd
DI
LD      ($5b67),A ; save copy of the new value

OUT     (C),A ; change for special mode 2
; 4->5->6->3

; possible addition to improve 48K compatibility
        ; disabling paging
        ;
        ;LD      A,($5b5c)      ; system copy of $7ffd

        ;OR      $20            ; disable paging

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

        ;OUT     (C),A          ; disable paging


JP      0 ; JUMP to the beginning of the "new" "ROM"

END 31000

PS. Note-se que se pode alterar esta rotina, para desactivar o paging e criar um modo 48K mais compatível com software, nomeadamente nos jogos (exemplo: Jetpac). Ver os comentários do setup da porta $7ffd.

Activando o bit 5 da porta $7ffd, o paging fica desactivado até se desligar o computador.

asm source code

TZXs para carregar a partir de modo 128+2A/+2B/+3


ROM de ZX Spectrum 48K (100% identica, ao contrario da ROM de 48K alterada nos modelos 128)
ROM de TK95
ROM de SE BASIC 3.1.2
ROM de diagnóstico da Retroleum
ROM de Shadow of Unicorn, que permite carregar os TZX de tape do World of Spectrum

quarta-feira, 4 de março de 2020

El Mosquetero de la Reina foi libertado


aqui havíamos anunciado o iminente lançamento de El Mosquetero de la Reina. A novidade agora é que o jogo foi finalmente libertado em formato digital, na sua versão completa. Também quem não adquiriu o jogo em formato físico durante a campanha de pré-venda, tem agora oportunidade de o fazer.

El Mosquetero de la Reina é mais uma aventura de texto, ou conversacional, como nuestros hermanos o dizem, baseado na célebre obra de Alexandre Dumas. Uma pena estar apenas em castelhano, pois isso vai limitar o espectro de potenciais utilizadores.

De qualquer forma, poderão vir aqui descarregar o jogo. Sendo gratuito, uma pequena contribuição para os seus autores parece-nos mais que justa...

Saiu Springbot


E o dia de hoje está a ser inexcedível ao nível dos novos lançamentos. O mais recente é um atractivo platformer, da autoria de Andy Farrel, que já há algum tempo que o vinha anunciando. Embora, e segundo o seu criador ainda esteja em fase de testes, nomeadamente para avaliar o grau de dificuldade, a nós parece-nos já "no ponto".

Podem aqui descarregar o jogo e tirar as vossas conclusões. Fica prometida uma análise completa para breve...

MicroSe7e n.º 41


Mais um suplemento do MicroSe7e é hoje disponibilizado. Inclui um artigo interessante sobre o Basicode e a repetição do código de Sésamo, programa criado por Fernando Prata.

Podem descarregar aqui o suplemento, cortesia do Museu LOAD ZX Spectrum, Cantanhede, Portugal.

RTTY (MIA)


Do lote de cassetes que o Vasco Gonçalves nos emprestou vinha um programa destinado a rádio-amadores, ou pelo menos é isto que nos parece, pois não entendemos bem o que teríamos que fazer.

De qualquer forma, foi criado pro Francisco Guerra em 1986, e parece ter sido bastante útil para esses entusiastas, podendo aqui ser descarregado.

E também Bandito foi hoje lançado


Fora da competição BASIC 2020, foi também lançado um novo jogo. Payndz não é novato nestas lides, mas há mais de um ano que não nos trazia algo. No seu repertório estão jogos de labirintos, e até uma aventura de texto. Parece-nos que Bandito traz o seu autor de volta às suas primeiras criações, mas desta vez com uma aventura passada no Velho Oeste, em  pleno século XIX (1848). Seremos capazes de recolher os 20 sacos de dinheiro ao longo dos 64 ecrãs?

Análise detalhada a sair nos próximos dias, mas entretanto poderão aqui descarregar o jogo...

Saíram Bitfactory, Roque y sus Bloques e Monte Infierno

De uma assentada saíram três novos jogos na competição BASIC 2020, aumentando os competidores para mais de duas dezenas.

O primeiro deles, Bitfactory, é uma proposta fora do comum de Juan Antonio Fernández e mete-nos na pele de um operador de uma fábrica, que tem que transformar as matérias-primas em produtos acabados. Será que os operários fabris vão gostar do jogo, ou ficarão a lembrar-se do seu dia de trabalho?


A segunda proposta vem da mente de Druida8bits e é um pouco mais convencional. Ro1ue y sus Bloques é um misto de puzzle e jogo de acção, onde rapidez e pensamento lateral se fundem, para criar um desafio que parece bastante prometedor.


Finalmente, a terceira proposta, Monte Infierno, é um típico role playing game, com opção para textos em castelhano e inglês. Criado em Basic puro por Ddann, inclusive consegue-se entrar facilmente na listagem para ver como o jogo foi desenvolvido (muito útil para os pretendentes a programadores).


Os três jogos serão analisados nos próximos dias em pormenor, mas desde já não podemos deixar de nos regozijar com o elevado número de propostas a concurso e com a grande qualidade da maior parte delas.

terça-feira, 3 de março de 2020

4. Elite


50. Nether Earth
49. Ranarama
48. Alien 8
47. Equinox
46. Lords of Midnight
45. Midnight Resistance
44. Saboteur
43. Highway Encounter
42. Fairlight
41. Starstrike II
40. Thunderbirds
39. Rebelstar
38. Castle Master
37. Atic Atac
36. Johnny Reb II
35. Bobsleigh
34. Terramex
33. Cybernoid II: the Revenge
32. Xeno
31. Dan Dare: Pilot of the Future
30. Mad Mix Game
29. Los Amores de Brunilda
28. Jet Set Willy
27. La Abadia del Crimen
26. Auf Wiedersehen Monty
25. Sim City
24. Football Manager
23. Formula One
22. Crystal Kingdom Dizzy 
21. Academy
20. Target Renegade
19. Operation Wolf
18. Where Time Stood Still
17. Bomb Jack 
16. Starquake
15. Spy vs Spy
14. Frankie Goes to Hollywood
13. Pang
12. Manic Miner
11. Quazatron
10. Chuckie Egg
9. Tetris
8. Jetpac
7. R-Type
6. Head over Heels
5. Match Day 2
4. Elite
3. ?
2. ?
1. ?

segunda-feira, 2 de março de 2020

Pequenos programas da VideoSpectrum


Mais uma disquete recuperada do espólio de Edmundo da Assunção, esta contendo uma boa vintena de pequenos programas e curiosidades, a maior parte deles saídos da revista VideoSpectrum. Mas o mais interessante é o menu que o autor criou, organizando todos os programas em cinco categorias: Apoio ZX, Apoio Vário, Música, Brincando e Curiosidades.

Tem dois campos em aberto, provavelmente tendo o trabalho ficado a meio. De qualquer forma, mostra o labor deste autor, anónimo até agora. E ainda temos bastantes disquetes para catalogar...

Poderão aqui descarregar estes programas.

Paginação em 128K (I)

Enquanto no modelo do ZX Spectrum 48K, só existe a ROM de 16KB e RAM de 48KB, saiu em 1985 o modelo de 128K.

O processador Z80 só endereça 64KB. Para endereçar 128KB, é necessário recorrer ao conceito de paginação. Não existindo hardware dedicado que trate de uma forma transparente de paginação, é necessária mudar posições de páginas, directamente através de portas de input/ouput para aceder a mais RAM.

No caso do ZX Spectrum 128K,  as páginas têm 16KB, distribuídas por 8 bancos.

No entanto, (ab)usar da paginação requer algumas cautelas. Ao trocar posição de páginas:
  • Os interrupts devem ser desactivados;
  • O stack não deve ser movido de sitio;
  • Os apontadores stacks aplicacionais da ROM também não devem ser movidos de sitio, especialmente se se pretende voltar ao BASIC ou usar rotinas da ROM;
  • A rotina actual C/M não deve ser movida;
  • Caso se pretenda voltar ao BASIC, a zona de BASIC e variáveis também não deve ser mexida;
  • O valor enviado para a porta de paginação deve ser copiado na variável correspondente de RAM;
  • Ao reactivar as interrupts, o endereço de interrupt deve ter uma rotina válida;
  • Os valores enviados para os ports, devem ser copiados para as variáveis a este efeito destinadas;
  • Algumas destas condições podem ser ignoradas caso se faça inicialização com outra ROM, depois de definir o esquema de paging.
Os bancos de RAM também têm usos especiais pelas ROMs. Os bancos 1,3,4 e 6 são usados para cache de disco e RAMdisc, enquanto o banco 7 é usado para espaço temporário do editor e do +3DOS. Portanto, usar os 128K em paginação, recomenda-se usar a partir de código máquina e não de rotinas BASIC.

Note-se que a paginação deve ser feita entrando em modo BASIC 128.

128K

No caso do 128K, a porta $7ffd controla o comportamento de paging.

Port
Bit
7
6
5
4
3
2
1
0
$7ffd


Disable Paging
ROM low
Active Screen
RAM Bank

O bit 5, desliga a funcionalidade de paging, não sendo possível reactivar a funcionalidade sem desligar o computador.

O bit 4 selecciona o banco de ROM, sendo 0 o 128k editor, e 1 a ROM de 48K BASIC.

O bit 3 define o ecrã activo, sendo 0 o primeiro ecrã e 1 o ecrã secundário.

Do bit 0-2 define a página activa na posição $C000

A cópia em RAM do último valor enviado para esta porta está na posição de memória $5b5c.

$FFFF
-
$C000
Bank 0
Bank 1
Bank 2
Bank 3
Bank 4
Bank 5
(screen 0)
Bank 6
Bank 7
(screen 1)
$BFFF
-
$8000
Bank 2

$7FFF
-
$4000
Bank 5
(screen 0)

$3FFF
-
$0000
ROM 0
ROM 1

Neste mapa, podem-se escolher entre duas ROMs, e em $C000, 7 bancos de páginas RAM.

Os bancos 5 e 7 são bancos especiais, em que o banco 5 é o ecrã 0, e o banco 7 o ecrã 1.

128K +2A/+2B/3

Nos modelos de Amstrad a funcionalidade de paginação foi ampliada. Notavelmente com a capacidade de paginar RAM em cima de ROM, e ter 4 ROMs em vez de 2.

Ou seja:
ROM 0 -> 128K editor
ROM 1 -> 128K syntax checker
ROM 2 -> +3DOS
ROM 3 -> 48K BASIC

Além de responder à porta $7ffd, copiada em $5b5c, como nos modelos anteriores de ZX Spectrum 128K, também ganhou uma nova porta de controle de paginação, a $1ffd.

Port
Bit
7
6
5
4
3
2
1
0
$1ffd



Printer Strobe
Disk Motor
ROM high

0
Special paging
1

Bit 0: se 1 paginação especial; se a 0 normal.

Se paginação normal, o bit 2 define o bit alto para definir a ROM, enquanto o bit 4 de $7ffd define o bit baixo, permitindo assim paginar 4 ROMs.

Se paginação especial, os bits 2 e 1 definem o modo.

A cópia em RAM do último valor enviado para esta porta está na posição de memória $5b67.

O mapa de combinações possíveis de paginação também mudou:

Modo de paginação normal

$FFFF
-
$C000
Bank 0Bank 1Bank 2Bank 3Bank 4Bank 5
(screen 0)
Bank 6Bank 7
(screen 1)
$BFFF
-
$8000
Bank 2
$7FFF
-
$4000
Bank 5
(screen 0)
$3FFF
-
$0000
ROM 0ROM 1ROM 2ROM 3

Neste mapa, podem-se escolher entre quatro ROMs, e em $C000, 7 bancos de páginas RAM.

Os bancos 5 e 7 são bancos especiais, em que o banco 5 é o ecrã 0, e o banco 7 o ecrã 1.

Modo de paginação especial

O modo de paginação especial tem 4 modos diferentes, cada qual com o seu esquema de ordenamento de bancos.

O principal interesse destes modos especiais, é poder mapear RAM em cima de RAM. O modo 1 poderá também ter o seu interesse para mapear RAM e usar double caching de vídeo por hardware.


mode 0
mode 1
mode 2
mode 3
$FFFF
-
$C000
Bank 3
Bank 7 (screen 1)
Bank 3
Bank 3
$BFFF
-
$8000
Bank 2
Bank 6
Bank 6
Bank 6
$7FFF
-
$4000
Bank 1
Bank 5 (screen 0)
Bank 5 (screen 0)
Bank 7 (screen 1)
$3FFF
-
$0000
Bank 0
Bank 4
Bank 4
Bank 4

ver:
https://www.worldofspectrum.org/faq/reference/128kreference.htm
https://spectrumforeveryone.com/technical/spectrum-compatibility-issues/

domingo, 1 de março de 2020

Diferenças ROM 48K do +2/+3 da Amstrad em relação à ROM do ZX Spectrum 48K

Para começarmos a falar de paging do ZX Spectrum 128K, vimos aqui falar da ROM do modo BASIC.

A ROM usada no modo 48K num ZX Spectrum 128 +2/2A/3 da Amstrad não é exactamente igual a um 48K. Tem diferenças na rotina de interrupt IM 1, onde invoca uma rotina que não existe originalmente, numa zona de ROM que está livre no modelo de 48K.

Na rotina de interrupts, vê-se a adição de um CALL ao endereço $386E.

Saliente-se que a rotina está a assumir que tem cópias dos registos de I/O de controle de paging em $5B67 e $5B5C, e que tem no banco 7 de RAM um contador do tempo de inactividade do floppy drive (supomos) em $E600.

Note-se: isto não é um modo de funcionamento 100% compatível com ZX Spectrum 48K.
Especialmente se for para usar paginação e BASIC, o melhor será ou partir para IM 2, ou usar um dos modos especiais.

0038 F5 PUSH AF
0039 E5 PUSH HL
003A 2A 78 5C LD HL,($5C78) ; LD HL,(FRAMES1)
003D 23 INC HL
003E 22 78 5C LD ($5C78),HL ; LD (FRAMES1),HL
0041 7C LD A,H
0042 B5 OR L
0043 20 03 JR NZ,0048 ; JR NZ,KEY_INT
0045 FD 34 40 INC (IY+40)

KEY_INT:
0048 C5 PUSH BC
0049 D5 PUSH DE
004A CD 6E 38 CALL $386E ; CALL SPARE (ao invés de CALL KEYBOARD)
004D D1 POP DE
004E C1 POP BC
004F E1 POP HL
0050 F1 POP AF
0051 FB EI
0052 C9 RET

A  nova rotina é esta:

386E DD E5 PUSH IX ; SPARE
3870 CD BF 02 CALL $02BF ; CALL KEYBOARD
3873 FD CB 01 66 BIT 4,(IY+01)   ; FLAGS $5C3B - test if in 128K mode
3877 28 03 JR Z,387C
3879 CD 7F 38 CALL $387F
387C DD E1 POP IX
387E C9 RET

387F 01 FD 7F LD BC,$7FFD
3882 3A 5C 5B LD A,($5B5C)
3885 F6 07 OR $07                              ; bank 7 at $C000
3887 ED 79 OUT (C),A
3889 3A 00 E6 LD A,($E600)
388C B7 OR A
388D 28 1D JR Z,38AC

388F 3A 78 5C LD A,($5C78) ; LD A,(FRAMES1)
3892 CB 47 BIT 0,A
3894 20 16 JR NZ,38AC
3896 3A 00 E6 LD A,($E600)            ; variable/counter in bank 7
3899 3D DEC A
389A 32 00 E6 LD ($E600),A
389D 20 0D JR NZ,38AC                 ; ja passaram 20 segundos?
                                                           ; se não salta para $38AC

389F 01 FD 1F LD BC,$1FFD
38A2 3A 67 5B LD A,($5B67)
38A5 E6 F7 AND $F7                      ; disk motor=off ao fim de  20 segundos (de inactividade?)
38A7 32 67 5B LD ($5B67),A
38AA ED 79 OUT (C),A                ; do disk motor=off

38AC 01 FD 7F LD BC,$7FFD
38AF 3A 5C 5B LD A,($5B5C)   
38B2 ED 79 OUT (C),A                ; return to other bank in $C000
38B4 C9 RET

Entrando em modo 48K a partir do modo 128K, existe também uma rotina para voltar para 128K na área do print buffer:

    ORG 23354
    DI         
    LD A,$10          ; make it normal paging (no special)
    LD BC,$1FFD  ; out it
    OUT (C),A
    LD ($5B67),A   ; and update copy

    SET 4,A         ; ROM 1 - 128K syntax checker
    LD  BC,$7FFD
    OUT (C),A    ; out it
    LD  ($5B5C),A ; and update copy
    JP  $26A7      ; Jump to address $26A7 of ROM 1

No próximo artigo, vamos falar sobre os modos de paginação do ZX Spectrum 128K.

Nota: existem mais diferenças na zona livre da ROM. As diferenças todas estão documentadas aqui 


ver https://www.worldofspectrum.org/faq/reference/128kreference.htm

Principais novidades de Março de 1985

Há 35 anos as principais novidades foram:
  • Foi criado um tool kit para o QL (QLKIT), que por apenas £ 29.95 fornece quase 60 rotinas escritas por Tony Tebby, autor do QDOS.
  • E o QL parece estar na moda, pois também saiu um livro para esse computador: Games for Your Sinclair QL.
  • Ainda para o QL, embora possa ser utilizado no Spectrum, surgiu STOP, da Digitex, que permite optimizar (através da compressão), a capacidade das microdrives.
  • É lançado The Touchmaster, um pad que permite quase dispensar o uso do teclado no Spectrum.
  • Lançamentos importantes: Gyron (Firebird Software), Moon Cresta (Incentive Software), Wizard's Lair (Bubble Bus Software), Spider-Man (Adventure International), Everyone's a Wally (Mikro-Gen), Monty is Innocent (Gremlin Graphics Software), Mutant Monty (Artic Computing), Lazy Jones (Terminal Software) e Zaxxon (US Gold).