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 bitsFui 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 EightyOneversã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 aquiROM do desmontador aquiCartã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:
;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.
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.Oresultado 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:
Há uma pequena limitação aqui - 1k de memória, então você precisa pensar em qual programa gravar.Talvez eu escreva um dia.