Émulation Sinclair zx80 / ​​zx81

image

Beaucoup conviendront que la pandémie émergente de COVID-19 a pratiquement gâché la vie de la communauté informatique. Mais nous ne parlerons pas d'une bande sombre, mais d'un autre épisode.

Déjà en mars, la célèbre démopartie Forever 2020 a été annulée , puis l'événement a été reporté à l'automne. Bien avant l'annulation, j'ai parlé avec les organisateurs. Ils ont refusé d'accepter l'un de mes travaux, expliquant qu'il n'y avait pas d'Apple II, et ont demandé en retour une vidéo du travail à partir d'un véritable ordinateur.

Eh bien, je n'ai pas pu obtenir le record, j'ai donc remarqué la liste des plates-formes:
Amstrad CPC, Thomson, PMD-85, MSX, ZX81, Sam Coupe, tous les Commodores 8 bits non-C = 64 ou tout autre système 8 bits

J'étais attiré par le ZX81, car j'essayais déjà d'apprendre l'ordinateur, mais je suis tombé en panne.

La recherche s'est déroulée selon mon schéma habituel:

Émulateur


J'ai choisi EightyOne a
pris la version 1.6.1. La version a un débogueur pratique, mais le programme n'émule pas un autre modèle - ZX80, plus tard j'ai trouvé une autre version 3.7.

Croix signifie


La recherche a amené à FASM (un sujet sur le forum adapté à la plate-forme. Cependant, les exemples compilés n'ont pas démarré. J'ai essayé d'autres options d'assembleur - Pasmo et d'autres, mais je n'ai pas compilé un programme de travail. De

longues recherches ont apporté un exemple d'impression Bonjour, mon monde!

, miracle! il s'est avéré! Maintenant, le tour est venu au troisième épisode.

Documentation


Une partie des informations a été trouvée ici.
ROM du démonteur ici.

Carte mémoire:

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

Une partie de la mémoire est réservée aux variables système .

De plus, à 16 h 50, le programme BASIC et ses variables sont stockés.

Le programme sur BASIC contient le format:

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

Pour une cassette, seuls les programmes BASIC sont possibles; cette méthode a été proposée:

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

Vous devez faire attention à la variable système D_FILE, qui indique la mémoire vidéo.

Dans l'exemple indiqué, ceci est implémenté comme suit:

D_FILE:     defw    display_file

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

Le premier octet est un signe du début de la ligne, puis 32 octets sont des espaces.

Il s'est avéré que 24 lignes étaient volumineuses.

Le premier programme que j'ai Ă©crit:

image

;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

Une version abrégée a suggéré ce sujet .

Un inconvénient: après le chargement du programme, la ligne du bas ne s'affiche pas. Ce n'est pas surprenant, car les lignes sont vides. La lecture des manuels suggère un autre changement:

NXTLIN:     defw    basic_0010 ;    

Il s'est avéré une astuce si simple: après le chargement, vous n'avez pas besoin de taper RUN, le programme démarrera de lui-même.

En bref, je décrirai l'essence du programme: remplir d'abord la mémoire vidéo selon le modèle, comme c'était le cas dans le programme d'impression «Bonjour, monde», puis remplir les lignes avec des caractères avec les codes 00-63.

image

Au premier développement, j'ai fait une erreur et j'ai écrit des caractères de remplissage avec les codes 00-255, mais le programme n'a pas fonctionné, car les codes ne sont pas utilisés.
Le résultat de la recherche a été le travail de kerr , ce qui semble inintéressant, mais pour moi, le programme lui-même est une grande réussite.

Et avant la démopartie, il y aura beaucoup de temps qui sera consacré à l'élaboration d'un programme dans la nomination 1k.

Reste ZX80.

Il y a un ordre différent de variables système pour cela.

Le logiciel est stocké ici .

Par conséquent, j'ai tapé le programme et regardé dans le débogueur:

image

Il y a une légère limitation ici - 1k de mémoire, donc vous devez penser au programme à écrire.

J'Ă©crirai peut-ĂŞtre un jour.

All Articles