Emulação Sinclair zx80 / ​​zx81

imagem

Muitos concordam que a emergente pandemia do COVID-19 estragou a vida da comunidade de TI. Mas não vamos falar sobre uma faixa escura, mas sobre outro episódio.

Já em março, o famoso demopartido Forever 2020 foi cancelado e mais tarde o evento foi adiado para o outono. Muito antes do cancelamento, conversei com os organizadores. Eles se recusaram a aceitar um dos meus trabalhos, explicando que não havia Apple II, e pediram um vídeo do trabalho em um computador real.

Bem, como não consegui obter o registro, observei a lista de plataformas:
Amstrad CPC, Thomson, PMD-85, MSX, ZX81, Sam Coupe, todos os Commodores não C = 64 de 8 bits ou qualquer outro sistema de 8 bits

Fui atraído pelo ZX81, pois já estava tentando aprender o computador, mas bati.

A pesquisa correu de acordo com meu padrão usual:

Emulador


Eu escolhi o EightyOne
versão 1.6.1. A versão possui um depurador conveniente, mas o programa não emula outro modelo - ZX80, depois encontrei outra versão 3.7.

Meios cruzados


A pesquisa trouxe para o FASM (um tópico no fórum adaptado para a plataforma. No entanto, os exemplos compilados não foram iniciados. Tentei outras opções de assembler - Pasmo e outros, mas não compilamos um programa de trabalho.

Pesquisas longas trouxeram um exemplo de impressão Olá, mundo!

, milagre! acabou! Agora, a vez chegou ao terceiro episódio.

Documentação


Parte da informação foi encontrada aqui
ROM do desmontador aqui

Cartão de memória:

0000-1FFF - ROM
2000-3FFF - Shadow ROM.   ,   Interface 1
4000-7FFF -  16

Parte da memória é reservada para variáveis ​​do sistema .

Além disso, em 16509, o programa BASIC e suas variáveis ​​são armazenados.

O programa no BASIC contém o formato:

2      big endian
2   
...  
1  ($76) -  

Para uma fita, somente os programas BASIC são possíveis; esse método foi proposto:

1 REM (    )
2 RANDOMIZE USR(16514) -    ,   REM

Você deve prestar atenção à variável de sistema D_FILE, que indica a memória de vídeo.

No exemplo indicado, isso é implementado da seguinte maneira:

D_FILE:     defw    display_file

display_file:   defb    _NL
        defs    32
...
        defs    32
        defb    _NL

O primeiro byte é um sinal do início da linha, então 32 bytes são espaços.

Foram 24 linhas, que pareciam volumosas.

O primeiro programa que escrevi:

imagem

;compile with sjasmplus
	device zxspectrum128

p_start:    org 0x4009
begin

VERSN:      defb    0
E_PPC:      defw    20      ; BASIC line number of line with cursor.
D_FILE:     defw    display_file2
DF_CC:      defw    display_file2+1
VARS:       defw    variables
DEST:       defw    0
E_LINE:     defw    edit_line
CH_ADD:     defw    p_end-1
X_PTR:      defw    0
STKBOT:     defw    p_end
STKEND:     defw    p_end
BERG:       defb    0
MEM:        defw    MEMBOT
SPARE1:     defb    0
DF_SZ:      defb    2       ; Number of lines in lower part of screen.
S_TOP:      defw    10      ; BASIC line number of line at top of screen.
LAST_K:     defw    0xffff
DB_ST:      defb    0
MARGIN:     defb    55      ; Blank lines above/below TV picture: US = 31, UK = 55.
NXTLIN:     defw    display_file    ; Memory address of next program line to be executed.
OLDPPC:     defw    0
FLAGX:      defb    0
STRLEN:     defw    0
T_ADDR:     defw    0x0c8d
SEED:       defw    0
FRAMES:     defw    0       ; Updated once for every TV frame displayed.
COORDS:     defw    0
PR_CC:      defb    0xbc
S_POSN:     defb    0x21,0x18
CDFLAG:     defb    0x40
PRBUF:      defs    0x20
        defb    _NL
MEMBOT:     defs    0x1e
SPARE2:     defw    0

; Start of the BASIC area for user programs.

basic_0001: defb    0,1     ; 1 REM
        defw    basic_0010-basic_0001-4
        defb    _REM

; Start of user machine code program
mem_16514:
	ld hl,p_end;display_file2
	push hl
;cls
	ld c,25
c1:
	ld b,32
	ld (hl),$76:inc hl
c2:
	ld (hl),0:inc hl
	djnz c2
	dec c
	jr nz,c1

	pop hl
	push hl
	ld c,$0
ylp:
	ld (hl),$76
	inc hl
	ld b,32
xlp:
	ld (hl),c
	inc hl
	inc c

	bit 6,c
	jr nz,endp;ret nz
	djnz xlp
	jr ylp
endp:
	pop hl
	ld (D_FILE),hl
	jr $
display_file2:
 dup 25
 defb _NL
 edup


end
	display /d,end-begin
	savebin "prb.p",begin,end-begin

Uma versão reduzida sugeriu este tópico .

Uma desvantagem: após o carregamento do programa, a linha inferior não é exibida. Isso não é surpreendente, porque as linhas estão vazias.A leitura dos manuais sugeriu outra mudança:

NXTLIN:     defw    basic_0010 ;    

Acabou sendo um truque simples: após o carregamento, você não precisa digitar RUN, o programa será iniciado sozinho.

Em resumo, descreverei a essência do programa: primeiro preenchendo a memória de vídeo de acordo com o modelo, como estava no programa de impressão “Olá, mundo”, depois preenchendo as linhas com caracteres com os códigos 00-63.

imagem

No primeiro desenvolvimento, cometi um erro e escrevi caracteres de preenchimento com os códigos 00-255, mas o programa não funcionou, pois parte dos códigos não são utilizados.O
resultado da pesquisa foi o trabalho de kerr , o que pareceria desinteressante, mas para mim o próprio programa é uma grande conquista.

E antes da demopartia, há muito tempo gasto no desenvolvimento de um programa na nomeação de 1k.

Permanece ZX80.

Existe uma ordem diferente de variáveis do sistema para ele.

O software é armazenado aqui .

Portanto, digitei o programa e procurei no depurador:

imagem

Há uma pequena limitação aqui - 1k de memória, então você precisa pensar em qual programa gravar.

Talvez eu escreva um dia.

All Articles