Antes que nada he de decir que no las he desarrollado con un CPC sino con un simulador en el PC, de ahí que finalicen con HALT. Para portarlas al CPC está claro que hay que sustituir los HALT por RET.
Algunas de ellas las he probado en un CPC real cargándolas a base de POKEs (sí, ya, un poco primitivo) y funcionan bien. Que haya piedad, pues mi sistema siempre ha sido el Commodore 64 y este CPC lo tenía por ahí en el trastero
Me gustaría escuchar opiniones sobre mejoras, "yo lo haría de este otro modo", etc...
Ahí van las rutinillas, todas con el mismo objetivo: cargar un cero desde 0C000H a 0FFFFH.
Código: Seleccionar todo
; Versión 1
XOR A
LD HL,0C000H
L1:LD (HL),A
INC L
JP NZ, LOOP
INC H
JP NZ, L1
HALT
Por ejemplo, la versión 1 puede reescribirse así:
Código: Seleccionar todo
; Versión 1 bis
XOR A
LD HL,0C000H
L1:LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
INC L
JP NZ, LOOP
INC H
JP NZ, L1
HALT
Código: Seleccionar todo
; Versión 2
XOR A
LD BC,03FFFH
LD DE,0C000H
LD HL,0C000H
LD (DE),A
INC DE
LDIR
HALT
Código: Seleccionar todo
; Versión 3
XOR A
LD DE,01H
LD HL,0C000H
L1:LD (HL),A
ADD HL,DE
JP NC, L1
HALT
Código: Seleccionar todo
; Versión 4
XOR A ; Hace C=0, importante para ADC
LD DE,01H
LD HL,0C000H
L1:LD (HL),A
ADC HL,DE
JP NZ, L1
HALT
Código: Seleccionar todo
; Versión 5
XOR A
LD HL,0C000H
L1:LD (HL),A
INC HL ; INC HL no modifica los flags, me obliga a comparar
CP H
JP NZ, L1
HALT
Código: Seleccionar todo
; Versión 6
XOR A
LD B,A
LD C,0C0H ; C como contador de páginas
LD HL,0C000H
L1:LD (HL),A
INC HL
DJNZ L1
INC C
JP NZ, L1
HALT
Código: Seleccionar todo
; Versión 7
DI ; Interrupciones anuladas mientras manipulo SP
LD (0800H),SP ; Salva SP
XOR A
LD BC,04002H
LD HL,00000H
LD SP,HL ; Nuevo SP
L1:PUSH HL ; 11 T // 16 bit fill
ADD A,C ; Suma 2 bytes pushed
JP NZ, L1
DJNZ L1
LD SP,(0800H) ; Restaura SP
EI
HALT