ORG &A000
;init ROM disc
LD C,7
LD DE,&40
LD HL,&B0FF
CALL &BCCE
LD SP,&BFFF ;la pile
;MODE 1
LD A,1
CALL &BC0E
CALL ALL_BLACK
CALL OUT_OVERSCAN
boucle_debut
CALL ALL_BLACK ;toutes les encres en noires
LD A,"A"
LD (nomfichier),A
boucle_continue
CALL LOADIMG
LD HL,&C000 ;source
LD DE,&200 ;destination
CALL dzx0_turbo
CALL affichage_palette
CALL &BB03
CALL &BB06
LD A,(nomfichier)
CP "V" ; dernière image atteinte ?
JR Z,boucle_debut
INC A
LD (nomfichier),A
CALL ALL_BLACK ;toutes les encres en noires
JR boucle_continue
RET
affichage_palette
;encre 0
LD A,(&801)
LD B,A
LD C,B
XOR A
CALL &BC32
;encre 1
LD A,(&802)
LD B,A
LD C,B
LD A,1
CALL &BC32
;encre 2
LD A,(&803)
LD B,A
LD C,B
LD A,2
CALL &BC32
;encre 3
LD A,(&804)
LD B,A
LD C,B
LD A,3
CALL &BC32
CALL &BD19
RET
; -----------------------------------------------------------------------------
; Chargement a l'écran de l'image compressée
; -----------------------------------------------------------------------------
LOADIMG
;vider l'écran
LD HL,&C000
LD DE,&C001
LD BC,&3FFF
LD (HL),0
LDIR
;charger le fichier
LD B,5
LD HL,nomfichier
LD DE,&A400
CALL &BC77
LD HL,&C000
CALL &BC83
CALL &BC7A
RET
nomfichier
DEFM "A.ZX0"
; -----------------------------------------------------------------------------
; toutes les encres noires
; -----------------------------------------------------------------------------
ALL_BLACK
XOR A
LD BC,0
CALL &BC32
LD A,1
LD BC,0
CALL &BC32
LD A,2
LD BC,0
CALL &BC32
LD A,3
LD BC,0
CALL &BC32
CALL &BD19
RET
; -----------------------------------------------------------------------------
; OUT OVERSCAN
; -----------------------------------------------------------------------------
OUT_OVERSCAN
;largeur
LD BC,&BC01
OUT (C),C
LD BC,&BD30
OUT (C),C
;hauteur
LD BC,&BC06
OUT (C),C
LD BC,&BD22
OUT (C),C
;decalage horizontal
LD BC,&BC02
OUT (C),C
LD BC,&BD32
OUT (C),C
;decalage vertical
LD BC,&BC07
OUT (C),C
LD BC,&BD23
OUT (C),C
;compatibilité CRTC 2
LD BC,&BC03
OUT (C),C
LD BC,&BD06
OUT (C),C
;ecran 32 ko (&0000 a &7FFF)
LD BC,&BC0C
OUT (C),C
LD BC,&BD0D
OUT (C),C
;debut offset (en &0200)
LD BC,&BC0D
OUT (C),C
LD BC,&BD00
OUT (C),C
RET
;------------------------------------------------------------------------------
; Decompactage ZX0 v2.0
;------------------------------------------------------------------------------
dzx0_turbo
LD BC, &FFFF ; preserve default offset 1
LD (dzx0t_last_offset+1), BC
INC BC
LD A, &80
JR dzx0t_literals
dzx0t_new_offset
LD C, &FE ; prepare negative offset
ADD A, A
JP NZ, dzx0t_new_offset_skip
LD A, (HL) ; load another group of 8 bits
INC HL
RLA
dzx0t_new_offset_skip
CALL NC, dzx0t_elias ; obtain offset MSB
INC C
RET Z ; check end marker
LD B, C
LD C, (HL) ; obtain offset LSB
INC HL
RR B ; last offset bit becomes first length bit
RR C
LD (dzx0t_last_offset+1), BC ; preserve new offset
LD BC, 1 ; obtain length
CALL NC, dzx0t_elias
INC BC
dzx0t_copy
PUSH HL ; preserve source
dzx0t_last_offset
LD HL, 0 ; restore offset
ADD HL, DE ; calculate destination - offset
LDIR ; copy from offset
POP HL ; restore source
ADD A, A ; copy from literals or new offset?
JR C, dzx0t_new_offset
dzx0t_literals
INC C ; obtain length
ADD A, A
JP NZ, dzx0t_literals_skip
LD A, (HL) ; load another group of 8 bits
INC HL
RLA
dzx0t_literals_skip
CALL NC, dzx0t_elias
LDIR ; copy literals
ADD A, A ; copy from last offset or new offset?
JR C, dzx0t_new_offset
INC C ; obtain length
ADD A, A
JP NZ, dzx0t_last_offset_skip
LD A, (HL) ; load another group of 8 bits
INC HL
RLA
dzx0t_last_offset_skip
CALL NC, dzx0t_elias
JP dzx0t_copy
dzx0t_elias
ADD A, A ; interlaced Elias gamma coding
RL C
ADD A, A
JR NC, dzx0t_elias
RET NZ
LD A, (HL) ; load another group of 8 bits
INC HL
RLA
RET C
ADD A, A
RL C
ADD A, A
RET C
ADD A, A
RL C
ADD A, A
RET C
ADD A, A
RL C
ADD A, A
RET C
dzx0t_elias_loop
ADD A, A
RL C
RL B
ADD A, A
JR NC, dzx0t_elias_loop
RET NZ
LD A, (HL) ; load another group of 8 bits
INC HL
RLA
JR NC, dzx0t_elias_loop
RET