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

Sem comentários:

Publicar um comentário