; parametres
AREA_ADR_MEMOIRE EQU &1000 ;adresse où les donnees seront chargees en memoire
TAILLE_ZONE_A_VIDER EQU &5000
SECTEUR_ID_FIRST EQU &C1 ;On va creer un formatage de 10 secteurs entrelaces (lecture plus rapide)
SECTEUR_ID_LAST EQU &CA ;Avec IDs &C1 &C2 &C3 &C4 &C5 &C6 &C7 &C8 &C9 &CA
SECTEUR_SIZE EQU &200 ;512 octets
ORG &A504
;-----[Affichage style Moon Cresta]-----
affscreen
LD HL,&4000 ;adresse de debut de notre image
LD DE,&0FA1 ;incrementation
LD BC,&4000 ;taille de l'image
AffEffetMoonCresta
LD A,(HL) ;lire en &4000
SET 6,H ;bit 6 a 1 = &4000 en &C000
SET 7,H ;bit 7 a 1
LD (HL),A ;ecrire a l'ecran
ADD HL,DE ;adresse suivante
LD A,H ;charger le &C0
AND %01111111 ;&C0 en &40 - part 1
OR %1000000 ;&C0 en &40 - part 2
LD H,A ;&C000 de nouveau en &4000
LD A,C
RRA
DEC BC ;taille de l'image -1
LD A,B
OR C
JR NZ,AffEffetMoonCresta
RET
ORG &A340
loop
CALL MODULE_INIT
;charger le fichier en &1000 (max &3000 - 12 Ko)
CALL chargement_fichier
CALL CLS2
;decomp (de &1000 vers &4000)
CALL DECOMPDATA
CALL &47D0 ;palette dans l'image
CALL affscreen ;affichage style Moon Cresta
CALL &BB03
CALL &BB06
CALL MEMORY_AREA_CLEAN
JR loop
;-----[Chargement fichier]-----
chargement_fichier
LD HL,(adresse_positions)
LD D,(HL) ; Numero de la piste
INC HL
LD C,(HL) ; ID du secteur
INC HL
LD B,(HL) ; nb de secteurs a lire
INC HL
LD (adresse_positions),HL
LD HL,AREA_ADR_MEMOIRE ; HL adresse en memoire
CALL MODULE_READ
LD A,(fichier_numero)
INC A
LD (fichier_numero),A
CP 32
CALL Z,onRemetAuDebut
RET
onRemetAuDebut
XOR A
LD (fichier_numero),A
LD HL,POSITION_DISC_IMAGES
LD (adresse_positions),HL
RET
fichier_numero
DB 0
adresse_positions
defw POSITION_DISC_IMAGES
POSITION_DISC_IMAGES
;piste, secteur_debut, nb_block
DB 1,&C3,6
DB 1,&C9,6
DB 2,&C5,7
DB 3,&C2,19
DB 5,&C1,18
DB 6,&C9,17
DB 8,&C6,15
DB 10,&C1,19
DB 11,&CA,24
DB 14,&C4,6
DB 14,&CA,13
DB 16,&C3,12
DB 17,&C5,14
DB 18,&C9,14
DB 20,&C3,11
DB 21,&C4,17
DB 23,&C1,8
DB 23,&C9,12
DB 25,&C1,10
DB 26,&C1,11
DB 27,&C2,10
DB 28,&C2,6
DB 28,&C8,13
DB 30,&C1,10
DB 31,&C1,12
DB 32,&C3,15
DB 33,&C8,11
DB 34,&C9,14
DB 36,&C3,14
DB 37,&C7,14
DB 39,&C1,14
DB 40,&C5,16
DB 0,0,0 ;on boucle
; -----------------------------------------------------------------------------
; EFFACER LA ZONE POUR RECEVOIR DE NOUVELLE DONNEES
; -----------------------------------------------------------------------------
MEMORY_AREA_CLEAN
LD HL,AREA_ADR_MEMOIRE
LD DE,AREA_ADR_MEMOIRE+1
LD BC,TAILLE_ZONE_A_VIDER-1
LD (HL),0
LDIR
RET
; Identification of the function to read a sector
READ_ADDR DW &C03C ; Function address in ROM. Default = &C03C
READ_NBR DB 7 ; ROM number. Default = ROM 7
; Commands
KL_COMMAND4 DB &84 ; Command number to read a sector
; -----------------------------------------------------------------------------
; Routine to initialize the module management functions
; -----------------------------------------------------------------------------
MODULE_INIT LD HL,KL_COMMAND4 ; Command to read a sector
CALL &BCD4 ; Finds the function in ROM
JR NC,MODULE_INIT_2 ; If vector fails, default values are kept
LD (READ_ADDR),HL ; Function ROM address saved
LD A,C
LD (READ_NBR),A ; ROM number saved
MODULE_INIT_2 RET
; -----------------------------------------------------------------------------
; Reads a module of B sectors in memory pointed by HL
; INPUT ; C = sector, D = track, HL = buffer pointer
; -----------------------------------------------------------------------------
MODULE_READ PUSH BC
PUSH DE
PUSH HL
LD A,(&A700) ; Lecteur courant
LD E,A ; E = lecteur
RST &18 ; LIRE SECTEUR
DW READ_ADDR
POP HL
LD DE,SECTEUR_SIZE
ADD HL,DE ; HL = HL + 512 octets
POP DE
POP BC
LD A,SECTEUR_ID_LAST+1
INC C ; Secteur suivant
CP C ; SI dernier secteur +1 alors premier secteur
JR NZ,MODULE_READ2 ; secteur = secteur + 1
LD C,SECTEUR_ID_FIRST
INC D
MODULE_READ2 DJNZ MODULE_READ
RET
;------------------------------------------------------------------------------
;Vider l'ecran
;------------------------------------------------------------------------------
CLS2
LD HL,&C000
LD BC,&4000
clsloop2:
LD (HL),0;remplir avec l'encre 0 (noire)
LD DE,&0059
ADD HL,DE
JR NC,clsloop1
;CALL &BD19
LD DE,&C000
ADD HL,DE
clsloop1:
DEC BC
LD A,B
OR C
JR NZ,clsloop2
RET
;------------[APLIB]----------------------------------------------------------
; Aplib decrunching routine (c) CNGSOFT
; HL = implantation du code compacte
; DE = implantation du code decompacte
;------------------------------------------------------------------------------
; Maxam source by T&J/GPA - 01/18/2008
; Nothing changed, except thy damned hidden opcodes
; and a new variable for Maxam ( 13+8*0 = 0 for Maxam )
; Attention, cette routine contient un assemblage conditionnel.
; Si Aplib8flag = 0, le code decompacte est ecrite du bas de la
; memoire vers le haut de la memoire. C est ce que font par defaut
; les programmes modifies par Dadman/CEZ - Team (APPACK.EXE et
; aPPackWin.exe.
; Si Aplib8flag = 1, le code decompacte est ecrit du haut de la
; memoire vers le bas de la memoire. Le code compacte doit bien
; evidemment etre organise en consequence.
DECOMPDATA
LD HL,&1000
LD DE,&4000
CALL Boot
JP &000F
aplib8flag equ &0 ; = DEC &00 pour INC
flagdecde equ aplib8flag*8 ; for Maxam compatibility
Boot
PUSH HL ; used for EX HL,(SP)
PUSH HL
POP IX
DB &FD,&26,&80 ; LD IYh,&80
aplib8literal
LD A,(IX+ &00)
DB &DD,&23 + flagdecde ; INC IX/DEC IX
LD (DE),A
DB &13 + flagdecde ; INC DE/DEC DE
DB &FD,&2E,&02 ; LD IYl,&2
aplib8nexttag
CALL aplib8getbit
JR NC, aplib8literal
LD BC,&0000
CALL aplib8getbit
JR NC, aplib8codepair
LD H,B
CALL aplib8getbit
JR NC, aplib8shortmatch
DB &FD,&2E,&02 ; LD IYl,2
INC C ; bc
LD L,&10
aplib8getmorebits
CALL aplib8getbit
RL L
JR NC, aplib8getmorebits
JR NZ, aplib8domatch
LD A,L
LD (DE),A
DB &13+ flagdecde ; INC DE/DEC DE
JR aplib8nexttag
aplib8codepair
CALL aplib8getgamma
DB &FD,&4D ; LD C,IYl
SBC HL,BC
JR NZ, aplib8normalcodepair
CALL aplib8getgamma
LD B,H
JR aplib8domatch_lastpos
aplib8normalcodepair
DEC L
LD H,L
LD L,(IX + &00)
DB &DD,&23+ flagdecde ; INC IX/DEC IX
PUSH HL
CALL aplib8getgamma
LD B,H
POP HL
LD A,H
CP 125 ; cmp eax,32000
JR NC, aplib8domatch_with_2inc
CP &05
JR NC, aplib8domatch_with_inc
AND A
JR NZ, aplib8domatch_new_lastpos
LD A,L
ADD A,A
JR C, aplib8domatch_new_lastpos
aplib8domatch_with_2inc
INC BC
aplib8domatch_with_inc
INC BC
aplib8domatch_new_lastpos
EX (SP),HL
aplib8domatch_lastpos
POP HL
PUSH HL
DB &FD,&2E,&01 ; LD IYl,1
aplib8domatch
if aplib8flag ; LDIR/LDDR
ADD HL,DE
LDDR
else
AND A
EX DE,HL
SBC HL,DE
EX DE,HL
ADD HL,DE
EX DE,HL
LDIR
endif
JR aplib8nexttag
aplib8shortmatch
LD L,(IX+&00)
DB &DD,&23+ flagdecde ; INC IX/DEC IX
SRL L
JR Z, aplib8donedepacking
RL C
JR aplib8domatch_with_2inc
aplib8getbit
DB &FD,&7C ; LD A,IYh
ADD A,A
JR NZ,aplib8getbit_
LD A,(IX + &00)
DB &DD,&23+ flagdecde ; INC IX/DEC IX
ADC A,A
aplib8getbit_
DB &FD,&67 ; LD IYh,A
RET
aplib8getgamma
LD HL,&0001
aplib8getgamma_
CALL aplib8getbit
ADC HL,HL
CALL aplib8getbit
JR C, aplib8getgamma_
LD C,L
RET
aplib8donedepacking
POP HL ; used for EX HL,(SP)
PUSH IX
POP HL
RET ; Warning, A might not be 0!