Emulación Sinclair zx80 / ​​zx81

imagen

Muchos estarán de acuerdo en que la pandemia emergente de COVID-19 ha echado a perder la vida de la comunidad de TI. Pero no hablaremos de una franja oscura, sino de otro episodio.

Ya en marzo, la famosa demoparty Forever 2020 fue cancelada , y más tarde el evento se pospuso para el otoño. Mucho antes de la cancelación, hablé con los organizadores. Se negaron a aceptar uno de mis trabajos, explicando que no había Apple II, y pidieron a cambio un video de trabajo desde una computadora real.

Bueno, no pude obtener el registro, así que noté la lista de plataformas:
Amstrad CPC, Thomson, PMD-85, MSX, ZX81, Sam Coupe, todos los Commodores de 8 bits que no son C = 64 o cualquier otro sistema de 8 bits

Me atrajo el ZX81, ya que ya estaba tratando de aprender la computadora, pero me caí.

La investigación fue de acuerdo con mi patrón habitual:

Emulador


Elegí EightyOne
tomó la versión 1.6.1. La versión tiene un depurador conveniente, pero el programa no emula otro modelo: ZX80, más tarde encontré otra compilación 3.7.

Cruz significa


La búsqueda trajo a FASM (un tema en el foro adaptado para la plataforma. Sin embargo, los ejemplos compilados no comenzaron. Probé otras opciones de ensamblador - Pasmo y otros, pero no compilé un programa de trabajo.

Las búsquedas largas trajeron un ejemplo de impresión ¡Hola, mundo!

¡Milagro! Resultó que ahora ha llegado el tercer episodio.

Documentación


Se encontró parte de la información aquí.
ROM de desensamblador aquí.

Tarjeta de memoria:

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

Parte de la memoria está reservada para las variables del sistema .

Además, en 16509, el programa BASIC y sus variables se almacenan.

El programa en BASIC contiene el formato:

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

Para un casete, solo son posibles los programas BÁSICOS; se propuso este método:

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

Debe prestar atención a la variable del sistema D_FILE, que indica la memoria de video.

En el ejemplo indicado, esto se implementa de la siguiente manera:

D_FILE:     defw    display_file

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

El primer byte es un signo del comienzo de la línea, luego 32 bytes son espacios.

Resultó 24 líneas, que parecían voluminosas.

El primer programa que escribí:

imagen

;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

Una versión abreviada sugirió este tema .

Un inconveniente: después de cargar el programa, no se muestra el resultado final. Esto no es sorprendente, porque las líneas están vacías. Leer los manuales sugirió otro cambio:

NXTLIN:     defw    basic_0010 ;    

Resultó un truco tan simple: después de cargar, no necesita escribir RUN, el programa se iniciará solo.

En resumen, describiré la esencia del programa: primero llenando la memoria de video de acuerdo con el modelo, como estaba en el programa de impresión "Hola, mundo", luego llenando las líneas con caracteres con los códigos 00-63.

imagen

En el primer desarrollo, cometí un error y escribí caracteres de relleno con los códigos 00-255, pero el programa no funcionó, ya que parte de los códigos no se utilizan.
El resultado de la investigación fue el trabajo de kerr , lo que parecería poco interesante, pero para mí el programa en sí es un gran logro.

Y antes de la fiesta de demostración, se dedicará mucho tiempo a desarrollar un programa en la nominación de 1k.

Sigue siendo ZX80.

Hay un orden diferente de variables del sistema para ello..

El software se almacena aquí .

Por lo tanto, escribí el programa y busqué en el depurador: aquí

imagen

hay una ligera limitación: memoria de 1k, por lo que debe pensar qué programa escribir.

Tal vez te escriba algún día.

All Articles