Respecto del uso de registros en los programas.
A machine code program is called by using the USR function, for example:
LET N=USR startaddress
Note that only decimal addresses are supported. Cosa que evidentemente ya sabes
The official ZX81 manual guidelines for returning to BASIC are:
BC may contain returned value, if any (loaded into N in above example).
IY must be 4000h upon return (pointer to the System Area)
I must be 1Eh upon return (pointer to the Character set in ROM)
return by RET opcode
That is nonsense, IY=4000h is restored automatically when returning,
but whenvideo is enabled it might be not a good idea to change IY or I at all.
The official ZX81 manual guidelines for machine code execution are:
In SLOW mode, the AF' and IX' and R registers are used by
the video interrupt handler and should not be modified.
That's garbage in so far that I've never heard of a IX' register
Respecto del uso de puertos.
Output to Port FFh (or ANY other port)
Writing any data to any port terminates the Vertical Retrace period, and
restarts the LINECNTR counter (ULA internal counter). Tambien es la salida de cassette.
Input from Port FEh (or any other port with A0 zero)
Reading from this port also initiates the Vertical Retrace period, and resets
the LINECNTR register to zero, LINECNTR remains stopped/zero until user
terminates retrace - In the ZX81, all of the above happens only if NMIs are
disabled.
Bit Expl.
0-4 Keyboard column bits (0=Pressed)
5 Not used (1)
6 Display Refresh Rate (0=60Hz, 1=50Hz)
7 Cassette input (0=Normal, 1=Pulse)
When reading from the keyboard, one of the upper bits (A8-A15) of the I/O
address must be "0" to select the desired keyboard row (0-7).
(When using IN A,(nn), the old value of the A register is output as upper
address bits and as lower bits. Otherwise, ie. when using IN r,(C) or INI
or IND, the BC register is output to the address bus.)
The Keyboard Matrix
__Line____Bit__0____1____2____3____4__
0 (A8) SHIFT Z X C V
1 (A9) A S D F G
2 (A10) Q W E R T
3 (A11) 1 2 3 4 5
4 (A12) 0 9 8 7 6
5 (A13) P O I U Y
6 (A14) ENTER L K J H
7 (A15) SPC . M N B
Port FDh Write (ZX81 only)
Writing any data to this port disables the NMI generator.
Port FEh Write (ZX81 only)
Writing any data to this port enables the NMI generator.
NMIs (Non maskable interrupts) are used during SLOW mode vertical blanking
periods to count the number of drawn blank scanlines.
Podes setear el modo FAST solo haciendo OUT (#FD), A. para volver a SLOW haces OUT (#FE), A.
El cuelgue puede deberse a que tenes alguno de los registros IX,IY o I con valores no adecuado para modo SLOW.
Tene en cuenta tener deshabilitadas las NMI mientras haces la salida del PWM y no habilitarlas por error.
Antes de retornar del codigo de maquina, ajusta los valores de IX, IY e I a lo que tenian cuando entraron a tu rutina. Volve al basic siempre con un RET.
En este
LINK podes ver la parte de la rutina de save de la ROM (en realidad empieza un poco mas arriba en #031E). En principio solo se ve el OUT(#FF), A, que inicia el pulso al cassete/video, pero en la rutina que chequea el break hace in IN A,(#FE) lo cual lo finaliza.
En este
LINK hay un muy buen articulo de como se genera el video asi como rutinas de HI-RES. Esta escrito por el guru del HI-RES Wilf Rigter y en este
LINK pueden bajar juegos HI-RES y su codigo fuente.
En este
LINK hay una rutina de carga rapida donde se puede apreciar como deshabilita las NMI y con un buen truco vuelve a SLOW.
En este
LINK esta la data que puse al principio.
Saludos.