Sinclair zx80 / ​​zx81 Emulation

Bild

Viele werden zustimmen, dass die aufkommende COVID-19-Pandemie das Leben der IT-Community ziemlich verdorben hat. Aber wir werden nicht über einen dunklen Streifen sprechen, sondern über eine andere Episode.

Bereits im März wurde die berühmte Demoparty Forever 2020 abgesagt und später die Veranstaltung auf den Herbst verschoben. Lange vor der Absage habe ich mit den Organisatoren gesprochen. Sie lehnten es ab, eine meiner Arbeiten anzunehmen, und erklärten, dass es kein Apple II gab, und baten im Gegenzug um ein Video der Arbeit von einem echten Computer.

Nun, ich konnte den Datensatz nicht erhalten, daher bemerkte ich die Liste der Plattformen:
Amstrad CPC, Thomson, PMD-85, MSX, ZX81, Sam Coupe, alle Nicht-C = 64 8-Bit-Commodores oder jedes andere 8-Bit-System

Ich fühlte mich vom ZX81 angezogen, da ich bereits versuchte, den Computer zu lernen, aber abstürzte.

Die Forschung verlief nach meinem üblichen Muster:

Emulator


Ich entschied mich für EightyOne
Version 1.6.1. Die Version hat einen praktischen Debugger, aber das Programm emuliert kein anderes Modell - ZX80, später fand ich ein anderes Build 3.7.

Kreuz bedeutet


Die Suche wurde zu FASM gebracht (ein Thema im Forum, das für die Plattform angepasst wurde. Die kompilierten Beispiele wurden jedoch nicht gestartet. Ich habe andere Assembler-Optionen ausprobiert - Pasmo und andere, aber immer noch kein Arbeitsprogramm kompiliert.

Lange Suchen brachten ein Beispiel für das Drucken von Hallo, Welt!

Nun, es stellte sich heraus! Jetzt ist die dritte Episode an der Reihe.

Dokumentation


Ein Teil der Informationen wurde hier gefunden .
Disassembler ROM hier.

Speicherkarte:

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

Ein Teil des Speichers ist für Systemvariablen reserviert .

Ferner werden um 16509 das BASIC-Programm und seine Variablen gespeichert.

Das Programm auf BASIC enthält das Format:

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

Für eine Kassette sind nur BASIC-Programme möglich. Diese Methode wurde vorgeschlagen:

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

Sie sollten auf die Systemvariable D_FILE achten, die den Videospeicher angibt.

Im angegebenen Beispiel wird dies wie folgt implementiert:

D_FILE:     defw    display_file

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

Das erste Byte ist ein Zeichen für den Zeilenanfang, dann sind 32 Bytes Leerzeichen.

Es stellte sich heraus, 24 Zeilen, die sperrig aussahen.

Das erste Programm, das ich geschrieben habe:

Bild

;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

Eine verkürzte Version schlug dieses Thema vor .

Ein Nachteil: Nach dem Laden des Programms wird das Endergebnis nicht angezeigt. Dies ist nicht überraschend, da die Zeilen leer sind. Das Lesen der Handbücher schlug eine weitere Änderung vor:

NXTLIN:     defw    basic_0010 ;    

Es stellte sich als so einfacher Trick heraus: Nach dem Laden müssen Sie nicht RUN eingeben, das Programm startet von selbst.

Kurz gesagt, ich werde das Wesentliche des Programms beschreiben: Füllen Sie zuerst den Videospeicher gemäß dem Modell aus, wie es im Druckprogramm „Hallo Welt“ war, und füllen Sie dann die Zeilen mit Zeichen mit den Codes 00-63.

Bild

Bei der ersten Entwicklung habe ich einen Fehler gemacht und Zeichen mit den Codes 00-255 gefüllt, aber das Programm hat nicht funktioniert, da ein Teil der Codes nicht verwendet wird.
Das Ergebnis der Forschung war die Arbeit von Kerr , die uninteressant erscheinen würde, aber für mich ist das Programm selbst eine großartige Leistung.

Und vor der Demoparty wird viel Zeit für die Entwicklung eines Programms für die 1k-Nominierung aufgewendet.

Bleibt ZX80.

Es gibt eine andere Reihenfolge von Systemvariablen dafür.

Software gespeichert ist hier .

Deshalb habe ich das Programm eingegeben und im Debugger nachgesehen:

Bild

Hier gibt es eine leichte Einschränkung - 1 KB Speicher, daher müssen Sie sich überlegen, welches Programm Sie schreiben möchten.

Vielleicht schreibe ich eines Tages.

All Articles