Dernière mise à jour: jeudi 11/01/2007.
ACS!
Un nom de groupe underground qui a largement marqué l'ère
Apple II non seulement en France, mais aussi à l'étranger
(que ce soit sous cette forme ou sous la version commerciale du groupe:
S.S.S. pour Second Sight Software).
J'ai déjà eu l'occasion d'aborder (superficiellement)
leur premier jeu, Flobynoid lors de l'interview du pirate Godfather.
Ce fut pour The Gog's, Deny
et Spk une expérience malheureuse;
leur logiciel de casse-briques n'ayant pas pu être
commercialié à cause d'une licence exclusive
détenue par Taito et leur propre projet Arkanoid
déjà en cours de développement sur la plateforme
Apple II.
Le logiciel Flobynoid final, après
être resté un
moment sous
le coude, fut finalement diffusé en shareware.
Mais l'esprit de gratuité de l'underground régnant alors,
le soft n'a pas dû
rapporter beaucoup d'espèces sonnantes et trébuchantes
à nos malchanceux programmeurs et artistes.
Flobynoid fut répandu un peu partout dans
l'hexagone et finit de
l'autre côté de l'Atlantique où il fit le bonheur
des vendeurs américain de freewares. On trouve ainsi sans trop
de
difficulté le disk image du jeu sur internet.
Il fonctionne sur PC avec l'émulateur de IIe Apple
Oasis mais malheureusement se crashe sur Applewin.
Correction du 11/01/2007: le jeu fonctionne avec certaines versions d'Applewin (les anciennes) mais pas avec les
dernières.
Par exemple c'est OK avec la 1.12.3 sous Linux (émulation Wine)
mais le boot finit sous moniteur avec les versions 1.12.5.0 et 1.12.6.0
sous Win98SE.
Dans tous les cas de figure, il faut préciser au niveau de la
configuration de
l'émulateur que l'on veut avoir la vitesse authentique du drive:
Ce que l'on sait moins, c'est qu'ACS a aussi fait
une démo de ce
jeu. Et elle, on ne la trouve pas DU TOUT sur internet, y compris sur
le site FTA de The Gog's.
C'est en créant des disks images avec mon outil FASTDSK,
que je
me suis fait un .DSK de cette disquette de démo inhumée
dans un de mes cartons.
J'ai testé ma version sur un vrai Apple IIe. Elle marche
correctement en affichant une partie automatique enregistrée de
quelques tableaux, puis s'arrête brutalement sous moniteur avec
un message "FICHIER TEXTE".
Est-ce normal ou pas, je l'ignore, mais c'est la seule version que je
possède.
J'ai vu au passage qu'elle avait probablement déjà
été tripatouillée par d'autres users (les modifs
des vecteurs reset étaient désactivées et il y a
du
NOP qui traine au milieu du code).
Aussi je me suis dit que ce serait bien qu'elle soit accessible
à tous.
J'ai donc testé mon .DSK sur Applewin,
et malheureusement cela ne fonctionnait pas :-(((
Et puis j'ai pensé à Deny qui
m'avait contacté en
mai/juin 2006 après avoir découvert mon site.
Il n'a pas souhaité faire une interview pour la raison suivante
(je cite): "
je crois qu'il faut toujours laisser une part de mystère aux
mythes, non ? ;) "
Mais il m'a très sympatiquement fait cadeau d'un bouquin sur
l'Apple II: "How to program the Apple II using 6502 assembly language"
écrit par Randy Hyde et paru chez Datamost.
Aussi dans l'espoir qu'il veuille bien me recontacter pour m'en dire
plus sur ce soft (par exemple pour savoir comment ils ont
enregistré les parties de la démo), j'ai passé un
peu de temps sur cette
disquette pour voir ce qui ne passait pas.
J'ai donc fait chauffer Sourceror et ai
trouvé 3 raisons de
disfonctionnement.
Je me propose de vous les expliquer à présent.
J'ai fixé chaque problème au moyen d'un patch.
1) La caractéristique
ACS
Comme je l'ai déjà abordé sur la page
consacrée à Déplombage mode d'emploi 6, l'emploi du
softswitch $C080 dans les routines de lecture de nibbles du disk II
fonctionne.
Néanmoins, le standard, c'est $C08C pour remplir le latch, aussi
les émulateurs rencontrant $C080 se bloquent.
Le boot 1 de la disquette ne permet donc pas de démarrer le
programme.
C'est un problème commun à presque tous les softs d'ACS.
Ils ont toujours aimé se démarquer (particularisme, quand
tu nous tiens)... rappelez vous le marker FTA de
Photonix
détecté comme "erreur" par ZZ-Copy...
J'ai shunté les $C080 et ai mis des $C08C à la place
(patch #1).
Attention, il ne faut pas faire du remplacement bestial car $C080 est
aussi utilisé dans les routines de déplacement du bras!
Bref, comprendre les routines est obligatoire.
2) L'émulation
incomplète
Les émulateurs ne sont pas à 100% à l'image de
leur modèle.
ACS était surtout connu pour programmer
"au ras du
métal". Et ce gap entre haute technicité d'ACS
et
codage empirique d'applications par les concepteurs d'émulos...
coince.
Dans le boot 1 (toujours), on constate que le programme ne s'embarrasse
pas de lire les champs adresses de la piste 0!
Il se contente de prendre les champs datas lus par le lecteur de
disquette au fil de l'eau.
Or sur un vrai Apple IIe, le temps que le programme traite et
denibblize les données d'un secteur, la tête de lecture a
sauté le secteur suivant. On a donc un pas de 2 sur l'ordre des
secteurs physiques.
Un émulateur n'est pas assujeti à ce facteur temps (ou
les programmeurs d'Applewin ne se sont pas
embarrassés de cette
réalité va-t-on dire). De ce fait, le pas est de 1 sur
l'ordre des secteurs physiques.
Donc au final, le programme ne charge pas la même chose sur un
vrai apple IIe et sur un émulateur.
Evidement sur ce dernier, il y a crash!!!
Voici illustré le chargement du boot 2:
Buffer Logical Sector
Physical ! Logical sector Physical
(True Apple
IIe)
! (Applewin)
$B600 : T$00 S$0E
T$00 S$02 ! T$00 S$07 T$00 S$01
$B700 : T$00 S$0D
T$00 S$04 ! T$00 S$0E T$00 S$02
$B800 : T$00 S$0C
T$00 S$06 ! T$00 S$06 T$00 S$03
$B900 : T$00 S$0B
T$00 S$08 ! T$00 S$0D T$00 S$04
$BA00 : T$00 S$0A
T$00 S$0A ! T$00 S$05 T$00 S$05
$BB00 : T$00 S$09
T$00 S$0C ! T$00 S$0C T$00 S$06
$BC00 : T$00 S$08
T$00 S$0E ! T$00 S$04 T$00 S$07
$BD00 : T$00 S$00
T$00 S$00 ! T$00 S$0B T$00 S$08
->pas de
2
->pas de 1
J'ai donc dû ré-écrire un boot 1 plus "standard"
qui lit aussi les champs adresses. Je me suis basé sur un
Acco-boot que j'ai simplifié mais en respectant l'apparence
visuelle du boot 1 initial (signature Flobynoid).
J'ai fait la copie de secteurs logiques suivant sur la piste $00:
Source->cible
S$0E->S$01
S$0D->S$02
S$0C->S$03
S$0B->S$04
S$0A->S$05
S$09->S$06
S$08->S$07
S$00->S$08 : contient l'ancien boot1
Et j'ai mis mon nouveau boot1 en T$00 S$00.
Je précise que sur ma disquette, les secteurs logiques $01
à $07 d'origine n'étaient pas utilisés et ne
contenaient que des zéros.
Cette modif correspond au patch #2.
Correction du 11/01/2007: Ce patch permet uniquement de faire
tourner la démo sur Applewin sans avoir
à mettre d'office la
config du drive
à "authentic speed". J'ai été mauvaise langue avec
les programmeurs d'émulos! C'est une option qui existe... ou
tout au moins a existé (bug dans les dernières versions?)
car l'option semble ignorée sur les 1.12.5.0 et 1.12.6.0:
même résultat (plantage) que l'on soit en authentic speed
ou en enhanced speed!!!
Prenez donc ma version patchée et restez tout le temps en
enhanced speed sans vous souciez des bévues des programmeurs
d'émulos:
3) Le bug
Mais ça ne marchait toujours pas.
J'ai fini par comprendre le hic!
Je dirais que la faute est partagée.
Tout d'abord ACS aurait dû programmer avec
un vrai assembleur et
pas faire du bricolage avec Mobby Disk II.
Même s'il faut reconnaitre que c'est dingue d'avoir pondu ce jeu
sans fichier source, il y a des limites à ce type d'exercice et
c'est un facteur d'introduction de bugs qu'il est possible de
détecter tout de suite via un assembleur comme Merlin
8.
C'est avec ce dernier que j'ai assez rapidement capté le
problème.
Le bug se trouvait dans la routine de commutation du mode graphique
($BF25) et plus particulièrement dans une instruction de
branchement. Au lieu d'avoir un BPL $BF3D (sur un RTS), il y a un BPL
$BF3F avec $BF3F:54 C0 60.
A l'origine le code est:
$BF3D:RTS
$BF3E:STA $C054
$BF41:RTS
Sur un vrai Apple IIe, quand le proc de la famille 6502 traite la
séquence de codes: 54 C0 60, ça marche.
Sur émulateur, plantum.
Pourquoi?
Parce que $54 est un opcode non documenté!
C'est un NOP sur 2 octets. Sur IIe, le programme ne plante pas et fait
NOP+RTS.
Sur émulateur, seuls les opcodes documentés sont
traités en temps que tel. Donc splashhh!
Info opcode $54 :
DOP (NOP) [SKB] : No operation (double NOP). The argument has no
significance.
Addressing |Mnemonics |Opc|Sz | n
------------|-----------|---|---|---
Zero Page,X |DOP arg,X |$54| 2 | 4
Pour corriger ça, avec un éditeur de secteur:
Chargement T$00 S$0F
Changement Byte$2E: remplacement de $10 par $0E (patch #3)
Voila ce qu'on peut voir avec un assembleur:
L'autre possibilité, c'est que ce branchement ait
été volontairement dirigé vers cet opcode... pour
montrer qu'ils connaissaient.
Tordu mais pas irréaliste!!!
Suite à ces corrections, Applewin
affiche la même chose
que sur mon IIe.
La preuve sur 2 versions différentes d'Applewin,
dont une
récente avec émulation de disque dur .HDV:
Voici quelques écrans de la démo (on n'en voit pas
souvent
sur le net des screenshots de Floby!)
On voit tomber les bonus, un dédoublement de balle et une
ouverture en bas à droite vers le level suivant.
A noter un point important: si vous exécutez plusieurs fois de
suite la démo, vous constaterez que l'enchainement des niveaux
n'est pas forcément le même. Il y a une notion de hasard
dans les bonus (laser, colle, next level, etc...). La durée d'un
level en dépend.
Vous pouvez avoir 3 levels de démo ou plus (j'en ai eu 5
à un moment). Et donc voir à un moment donné un
tableau que vous n'aviez pas vu la fois précédante...
Lors d'un run, j'ai eu un level très très long. Il ne
restait plus qu'une seule brique et j'ai cru à un bug car la
raquette n'arrivait pas à l'avoir. Finalement j'ai
été patient et elle a fini par faire mouche. Mais
c'était à s'endormir!!!
Ajout du 11/01/2007: à noter que cette notion de hasard semble
perturber l'autre émulateur Apple Oasis.
En effet, sur 3 boots, les 3 fois je n'ai pas eu droit à 1 seul
tableau!!! Je passe directement de la page graphique m'invitant
à appuyer sur ESC pour commencer au message "FICHIER TEXTE".
Bizarre, bizarre car je tenais Apple Oasis pour
meilleur qu'Applewin
côté compatibilité...
Bon, j'espère qu'avec tout ça, il y en a au moins un
-SPK- qui ne fait plus la gueule ;-)

|
Fast Boot
|
Download Flobynoid Demo for Applewin - enhanced
& authentic speed (gzipped)
Patchs 1 & 2 & 3
|

|
Fast Boot
|
Download Flobynoid Demo for Applewin - runs only
with authentic disk II speed (gzipped)
Patchs 1 & 3
|

|
Fast Boot
|
Download Flobynoid Demo for REAL Apple II, which
doesn't work with emulators (gzipped)
|

|
DOS 3.3
|
Download Flobynoid Demo: boot source code (gzipped)
|
File: Demo_Flobynoid_Src.dsk
Disk: DOS 3.3 Volume 254 (140KB)
Name
Type Auxtyp Modified
Format Length
------------------------------------------------------------------------------
DISK*
BAS $0801 [No
Date]
DOS 119
T.FLOBYDEMO.BOOT1.NEW
TXT $0000 [No
Date]
DOS 2466
FLOBYDEMO.BOOT1.NEW
BIN $0800 [No
Date]
DOS 256
INSTALL.SPEEDY
BAS $0801 [No
Date]
DOS 1560
BOOT1.ORIG
BIN $0800 [No
Date]
DOS 256
BOOT2.ORIG
BIN $B600 [No
Date]
DOS 2048
BOOT1
BIN $0800 [No
Date]
DOS 256
T.BOOT1
TXT $0000 [No
Date]
DOS 3627
T.BOOT2
TXT $0000 [No
Date]
DOS 12049
BOOT2
BIN $B600 [No
Date]
DOS 2048
DRIVER.ORIG
BIN $BF00 [No
Date]
DOS 256
T.DRIVER
TXT $0000 [No
Date]
DOS 3046
DRIVER
BIN $BF00 [No
Date]
DOS 256
------------------------------------------------------------------------------
Références
Lien |
Référence |
Source |
 |
Boot 1 original. |
ACS. |
 |
Boot 2 original (Fast Load). |
ACS. |
 |
Driver original. |
ACS. |
 |
Nouveau boot 1. |
Deckard. |
Boot 1 original.
:asm
1
2
; LST OFF
3
ORG $0800
4
5 ********************************
6
*
*
7 * BOOT 1 FLOBYNOID
DEMO *
8 *
(C)1987 SSS *
9 * SOURCE BY
DECKARD *
10
*
*
11 ********************************
12
13 * Une fois de plus ACS/SSS a utilisé le softswitch
14 * $C080 au lieu de $C08C pour remplir le latch.
15 * C'est quasiment une seconde signature!!!
16
17 * Sur un vrai Apple II, ce n'est pas génant de
skipper
18 * la recherche du champ addresse au niveau du boot1.
19 * Voila ce qui se passe:
20 *
21 * Chargement de 8 secteurs.
22 *
23 * Buffer T/S
logique T/S physique
24 * $B600-$B6FF : T$00 S$0E T$00 S$02
25 * $B700-$B7FF : T$00 S$0D T$00 S$04
26 * $B800-$B8FF : T$00 S$0C T$00 S$06
27 * $B900-$B9FF : T$00 S$0B T$00 S$08
28 * $BA00-$BAFF : T$00 S$0A T$00 S$0A
29 * $BB00-$BBFF : T$00 S$09 T$00 S$0C
30 * $BC00-$BCFF : T$00 S$08 T$00 S$0E
31 * $BD00-$BDFF : T$00 S$00 T$00 S$00
32 *
33 * Mais avec un émulateur, c'est la catastrophe
car il
34 * n'y a pas un pas de 2 pour les secteurs physiques.
35 * Bref, on charge différement et
évidemment il y a un crash.
36
37 *-------------------------------
38
39
BUFL
EQU $26 ; buffer
low chargement
40
BUFH
EQU $27 ; buffer
high chargement
41
42 H02D6
= $02D6
43 H0300
= $0300
44 RESET
= $03F2
45 H03F3
= $03F3
46 H03F4
= $03F4
47 H08FF
= $08FF
48
KEY
= $C000
49 HC00C
= $C00C
50 HC080
= $C080
51
INIT
= $FB2F
52
HOME
= $FC58
53
WAIT
= $FCA8
54 SETKBD
= $FE89
55 SETVID
= $FE93
56
57 *-------------------------------
58
0800: 01
59
DFB 1
; 1 secteur à charger
60
61 *-------------------------------
62
0801: E0 60
63
CPX #$60 ; slot*16
0803: F0 03
64
BEQ H0808 ; ok en slot 6
65
0805: 4C D1 08
66
JMP H08D1 ; msg must boot
from slot 6 et fin
67
0808: A9 B6 68
H0808
LDA #>$B600
080A: 85 27
69
STA BUFH
70
71 *-------------------------------
72 * Routine de chargement secteur
73
080C: BD 80 C0 74
H080C
LDA HC080,X ; 1er nibble header champ data
080F: 10 FB
75
BPL H080C
76
0811: 49 D5 77
H0811
EOR #$D5
0813: D0 F7
78
BNE H080C
79
0815: BD 80 C0 80
H0815
LDA HC080,X ; 2nd nibble header champ data
0818: 10 FB
81
BPL H0815
82
081A: C9 AA
83
CMP #$AA
081C: D0 F3
84
BNE H0811
85
081E: BD 80 C0 86
H081E
LDA HC080,X ; 3eme nibble header champ
data
0821: 10 FB
87
BPL H081E
88
0823: C9 AD
89
CMP #$AD
0825: D0 EA
90
BNE H0811
91
0827: A9 00
92
LDA #$00 ;
décodage 6-2
0829: A0 56
93
LDY #$56
082B: 84 3C 94
H082B
STY $3C
082D: BC 80 C0 95
H082D
LDY HC080,X ; lecture nibble data
0830: 10 FB
96
BPL H082D
97
0832: 59 D6 02
98
EOR H02D6,Y
0835: A4 3C
99
LDY $3C
0837: 88
100
DEY
0838: 99 00 03
101
STA H0300,Y
083B: D0 EE
102
BNE H082B
103
083D: 84 3C 104
H083D
STY $3C
083F: BC 80 C0 105
H083F
LDY HC080,X ; lecture nibble data
0842: 10 FB
106
BPL H083F
107
0844: 59 D6 02
108
EOR H02D6,Y
0847: A4 3C
109
LDY $3C
0849: 91 26
110
STA (BUFL),Y
084B: C8
111
INY
084C: D0 EF
112
BNE H083D
113
084E: BC 80 C0 114
H084E
LDY HC080,X ; lecture nibble checksum
0851: 10 FB
115
BPL H084E
116
0853: 59 D6 02
117
EOR H02D6,Y
0856: D0 48
118
BNE H089F+1 ; crash si différent
de 0
119
0858: A0 00
120
LDY #$00 ; integre les
2 bits dans chaque octet
085A: A2 56 121
H085A
LDX #$56
085C: CA 122
H085C
DEX
085D: 30 FB
123
BMI H085A
124
085F: B1 26
125
LDA (BUFL),Y
0861: 5E 00 03
126
LSR H0300,X
0864: 2A
127
ROL
0865: 5E 00 03
128
LSR H0300,X
0868: 2A
129
ROL
0869: EA
130
NOP
086A: EA
131
NOP
086B: 91 26
132
STA (BUFL),Y ; et rempli le buffer
résultat
086D: C8
133
INY
086E: D0 EC
134
BNE H085C
135
136 *-------------------------------
137
0870: E6 27
138
INC BUFH ; page suivante
0872: A2 60
139
LDX #$60
0874: CE FF 08
140
DEC H08FF ; un secteur de -
à charger
0877: D0 93
141
BNE H080C ; pas fini
142
143 *-------------------------------
144
0879: 20 C4 08
145
JSR H08C4 ; inits
087C: 20 2F FB
146
JSR INIT
147
087F: A9 59
148
LDA #$59 ; protection
reset disable
0881: 2C F2 03
149
BIT RESET
0884: A9 FF
150
LDA #$FF
0886: 2C F3 03
151
BIT H03F3
0889: 49 A5
152
EOR #$A5
088B: 2C F4 03
153
BIT H03F4
154
155 * Signature FLOBYNOID
156
088E: 20 58 FC
157
JSR HOME
0891: A9 DF
158
LDA #$DF
0893: A0 00
159
LDY #$00
0895: 99 0E 04 160
H0895
STA $040E,Y
0898: C8
161
INY
0899: C0 0B
162
CPY #$0B
089B: D0 F8
163
BNE H0895
164
089D: A0 00
165
LDY #$00
089F: B9 B2 08 166
H089F
LDA H08B2,Y
08A2: 99 8C 04
167
STA $048C,Y
08A5: C8
168
INY
08A6: C0 0F
169
CPY #$0F
08A8: D0 F5
170
BNE H089F
08AA: A9 00
171
LDA #$00
08AC: 20 A8 FC
172
JSR WAIT
08AF: 4C 00 B6
173
JMP $B600 ; lance boot2
174
175 *-------------------------------
176
177 * Signature
178
08B2: A8 BA 179
H08B2
ASC "(:"
08B4: 20
180
ASC ' '
08B5: 06 0C 0F
181
INV 'FLOBYNOID'
08B8: 02 19 0E 0F 09 04
08BE: 20
182
ASC ' '
08BF: BA A9
183
ASC ":)"
08C1: 00 00 00
184
HEX 000000
185
186 *-------------------------------
187
188 * Inits
189
08C4: 20 93 FE 190
H08C4
JSR SETVID
08C7: 20 89 FE
191
JSR SETKBD
08CA: 8D 00 C0
192
STA KEY
08CD: 8D 0C C0
193
STA HC00C
08D0: 60
194
RTS
195
196 *-------------------------------
197
198 * Message bloquant si pas boot depuis slot 6
199
08D1: 20 2F FB 200
H08D1
JSR INIT
08D4: 20 58 FC
201
JSR HOME
08D7: A0 00
202
LDY #$00
08D9: B9 E6 08 203
H08D9
LDA H08E6,Y
08DC: 99 00 04
204
STA $0400,Y
08DF: C8
205
INY
08E0: C0 18
206
CPY #$18
08E2: D0 F5
207
BNE H08D9
08E4: D0 FE 208
H08E4
BNE H08E4
209
08E6: A0 210
H08E6
ASC " "
08E7: 0D
211
INV 'M'
08E8: D5 D3 D4
212
ASC "UST "
08EB: A0
08EC: 02
213
INV 'B'
08ED: CF CF D4
214
ASC "OOT "
08F0: A0
08F1: 06
215
INV 'F'
08F2: D2 CF CD
216
ASC "ROM "
08F5: A0
08F6: 13
217
INV 'S'
08F7: CC CF D4
218
ASC "LOT "
08FA: A0
08FB: 13
219
INV 'S'
08FC: C9 D8 AE
220
ASC "IX."
221
222 *-------------------------------
223
08FF: 08
224
DFB 8
; nbr de secteurs à charger
225
226
SAV BOOT1
Object saved as BOOT1,A$0800,L$0100
--End assembly, 256 bytes, Errors: 0
Symbol table - alphabetical order:
BUFH
=$27
BUFL
=$26
H02D6
=$02D6
H0300 =$0300
H03F3
=$03F3
H03F4
=$03F4
H0808
=$0808
H080C =$080C
H0811
=$0811
H0815
=$0815
H081E
=$081E
H082B =$082B
H082D
=$082D
H083D
=$083D
H083F
=$083F
H084E =$084E
H085A
=$085A
H085C
=$085C
H0895
=$0895
H089F =$089F
H08B2
=$08B2
H08C4
=$08C4
H08D1
=$08D1
H08D9 =$08D9
H08E4
=$08E4
H08E6
=$08E6
H08FF
=$08FF
HC00C =$C00C
HC080
=$C080
HOME
=$FC58
INIT
=$FB2F
KEY =$C000
RESET
=$03F2
SETKBD
=$FE89
SETVID
=$FE93
WAIT =$FCA8
Symbol table - numerical order:
BUFL
=$26
BUFH
=$27
H02D6
=$02D6
H0300 =$0300
RESET
=$03F2
H03F3
=$03F3
H03F4
=$03F4
H0808 =$0808
H080C
=$080C
H0811
=$0811
H0815
=$0815
H081E =$081E
H082B
=$082B
H082D
=$082D
H083D
=$083D
H083F =$083F
H084E
=$084E
H085A
=$085A
H085C
=$085C
H0895 =$0895
H089F
=$089F
H08B2
=$08B2
H08C4
=$08C4
H08D1 =$08D1
H08D9
=$08D9
H08E4
=$08E4
H08E6
=$08E6
H08FF =$08FF
KEY
=$C000
HC00C
=$C00C
HC080
=$C080
INIT =$FB2F
HOME
=$FC58
WAIT
=$FCA8
SETKBD
=$FE89
SETVID =$FE93
Retour sommaire
Boot 2 original (Fast Load).
:asm
1
2
; LST OFF
3
ORG $B600
4
5 ********************************
6
*
*
7 * BOOT 2 FLOBYNOID
DEMO *
8 *
(C)1987 SSS *
9 * SOURCE BY
DECKARD *
10
*
*
11 ********************************
12
13 * Adresses page 0
14
15 PTR_BUFF
EQU $00 ; et $01
: pointeur sur BUFFER
16 SLOT16
EQU $2B
17 FOUND_TRK EQU
$2D
18 H002C
EQU $002C ; store address
field
19
20 * Adresses ram
21
22 H02FF
EQU $02FF ; byte check disk
T$00 S$00
23 H0800
EQU $0800
24 H11FF
EQU $11FF
25 H1F03
EQU $1F03 ; entry point demo
26 H3D00
EQU $3D00
27 H67B0
EQU $67B0
28
29 * Adresses driver
30
31 _SAV_HGRSTAT EQU
$BF18
32 _SET_GRAPHIC EQU
$BF25
33 _SAV_BUFFER EQU
$BF45
34 _BLOADER_CHK EQU
$BF90
35 _BLOADER
EQU $BF9A
36 _BLOADERD EQU
$BF9D
37 _TXT_FLOBYA EQU
$BFE0
38 _SET_BUFFER EQU
$BFF8 ; acc=high, Y=low
39
40 * Adresses ROM
41
42
KEY
EQU $C000
43 STROBE
EQU $C010
44 BUTTN0
EQU $C061
45 BUTTN1
EQU $C062
46 HC080
EQU $C080
47 HC081
EQU $C081
48 HC089
EQU $C089
49 HC08C
EQU $C08C
50 HC08E
EQU $C08E
51 HC0E9
EQU $C0E9
52 HC0EC
EQU $C0EC ; $C08C slot 6
53
INIT
EQU $FB2F
54
HOME
EQU $FC58
55
WAIT
EQU $FCA8
56
57 *-------------------------------
58
B600: A9 00 59
HB600
LDA #$00 ; charge
driver T$00 S$0F dans $BF00
B602: 8D 4B BA
60
STA TRACK_START
B605: A9 00
61
LDA #<$BF00
B607: 8D 4D BA
62
STA BUFFERL
B60A: A9 0F
63
LDA #$0F
B60C: 8D 4C BA
64
STA SECTOR_START
B60F: A9 01
65
LDA #$01
B611: 8D 4F BA
66
STA NB_SECT
B614: A9 BF
67
LDA #>$BF00
B616: 8D 4E BA
68
STA BUFFERH
B619: A2 60
69
LDX #$60 ; slot*16
B61B: AD E9 C0
70
LDA HC0E9 ; motor on
B61E: 20 6D B6
71
JSR BLOADER0
72
B621: EA
73
NOP
B622: EA
74
NOP
B623: EA
75
NOP
76
B624: 20 01 BB
77
JSR CHECK_DISK0 ; met le bon disk
78
B627: A9 1A
79
LDA #>$1A00 ; charge la suite via le
driver
B629: A0 00
80
LDY #<$1A00
B62B: 20 F8 BF
81
JSR _SET_BUFFER
82
; image SSS + musique
B62E: A9 09
83
LDA #$09
B630: A0 0A
84
LDY #$0A
B632: A2 51
85
LDX #$51 ; secteurs
B634: 20 90 BF
86
JSR _BLOADER_CHK
87
B637: 4C 03 1F
88
JMP H1F03 ; run demo
89
B63A: 00 00 00
90
DS 8,0
B63D: 00 00 00 00 00
91
92 *-------------------------------
93
B642: A0 00 94
CLR_LINE LDY
#0
B644: A9 A0
95
LDA #" "
B646: 99 A0 05 96
HB646
STA $05A0,Y
B649: C8
97
INY
B64A: C0 29
98
CPY #41
B64C: D0 F8
99
BNE HB646
100
B64E: A9 00
101
LDA #$00
B650: 8D FF 02
102
STA H02FF
B653: 60
103
RTS
104
B654: 00 00 00
105
DS 25,0
B657: 00 00 00 00 00 00 00 00
B65F: 00 00 00 00 00 00 00 00
B667: 00 00 00 00 00 00
106
107 *===============================
108 * Chargement d'un objet
109 *===============================
110
B66D: AD 4B BA 111 BLOADER0
LDA TRACK_START
B670: C9 23
112
CMP #$23
B672: D0 05
113
BNE HB679 ; standard
114
115
; boucle jusqu'à repartir à la piste 0
B674: EE 4B BA
116
INC TRACK_START
B677: D0 F4
117
BNE BLOADER0
118
B679: 8D 51 BA 119
HB679
STA TRACK_END ; par defaut
B67C: AD 4D BA
120
LDA BUFFERL
B67F: 85 00
121
STA PTR_BUFF
B681: AD 4E BA
122
LDA BUFFERH
B684: 85 01
123
STA PTR_BUFF+1
124
B686: AD 4C BA
125
LDA SECTOR_START ; [$00,$0F]
B689: 8D 49 BA
126
STA HBA49 ; secteur
début et secteur fin sur meme piste?
B68C: 18
127
CLC
B68D: 49 0F
128
EOR #$0F
B68F: 69 01
129
ADC #$01
B691: CD 4F BA
130
CMP NB_SECT
B694: 90 10
131
BCC HB6A6 ; non
132
B696: AD 4C BA
133
LDA SECTOR_START ; on reste sur la meme piste
(TRACK_END dft)
B699: 18
134
CLC
B69A: 6D 4F BA
135
ADC NB_SECT
B69D: 38
136
SEC
B69E: E9 01
137
SBC #$01
B6A0: 8D 4A BA
138
STA SECTOR_END
B6A3: 4C D3 B9
139
JMP FLOAD_TRK
140
B6A6: A9 0F 141
HB6A6
LDA #$0F
B6A8: 8D 4A BA
142
STA SECTOR_END
B6AB: 38
143
SEC
B6AC: ED 49 BA
144
SBC HBA49
B6AF: 18
145
CLC
B6B0: 69 01
146
ADC #$01
B6B2: 18
147
CLC
B6B3: 8D 50 BA
148
STA HBA50
B6B6: 6D 4E BA
149
ADC BUFFERH
B6B9: 8D 4E BA
150
STA BUFFERH
151
B6BC: AD 4F BA
152
LDA NB_SECT
B6BF: 38
153
SEC
B6C0: ED 50 BA
154
SBC HBA50
B6C3: 8D 4F BA
155
STA NB_SECT
B6C6: 20 D3 B9
156
JSR FLOAD_TRK
157
B6C9: EE 4B BA
158
INC TRACK_START
B6CC: A9 00
159
LDA #$00
B6CE: 8D 4C BA
160
STA SECTOR_START
B6D1: F0 9A
161
BEQ BLOADER0 ; toujours
162
B6D3: 38 163
HB6D3
SEC
B6D4: 60
164
RTS
165
166 *===============================
167 * Lecture champ data+denibblizing
168 *===============================
169
B6D5: A5 00 170
RDSECDTA LDA
PTR_BUFF
B6D7: A4 01
171
LDY PTR_BUFF+1
B6D9: 8D 73 B7
172
STA HB772+1
B6DC: 8C 74 B7
173
STY HB772+2
B6DF: 38
174
SEC
B6E0: E9 54
175
SBC #$54
B6E2: B0 02
176
BCS HB6E6
177
B6E4: 88
178
DEY
179
B6E5: 38
180
SEC
B6E6: 8D 5B B7 181
HB6E6
STA HB75A+1
B6E9: 8C 5C B7
182
STY HB75A+2
B6EC: E9 57
183
SBC #$57
B6EE: B0 01
184
BCS HB6F1
185
B6F0: 88
186
DEY
B6F1: 8D 34 B7 187
HB6F1
STA HB733+1
B6F4: 8C 35 B7
188
STY HB733+2
B6F7: A0 20
189
LDY #$20
B6F9: 88 190
HB6F9
DEY
B6FA: F0 D7
191
BEQ HB6D3
192
193 *-------------------------------
194 * Lecture champ data
195
B6FC: AD EC C0 196
HB6FC
LDA HC0EC ; 1er header champ
data
B6FF: 10 FB
197
BPL HB6FC
198
B701: 49 D5 199
HB701
EOR #$D5
B703: D0 F4
200
BNE HB6F9
201
B705: EA
202
NOP
203
B706: AD EC C0 204
HB706
LDA HC0EC ; 2nd header champ
data
B709: 10 FB
205
BPL HB706
206
B70B: C9 AA
207
CMP #$AA
B70D: D0 F2
208
BNE HB701
209
B70F: EA
210
NOP
211
B710: AD EC C0 212
HB710
LDA HC0EC ; 3eme header champ
data
B713: 10 FB
213
BPL HB710
214
B715: C9 AD
215
CMP #$AD
B717: D0 E8
216
BNE HB701
217
218 * Lecture groupe nibbles (complement 6-2)
219
B719: A0 AA
220
LDY #$AA ; Y [$AA,$FF]
B71B: A9 00
221
LDA #$00 ; init checksum
B71D: 85 26 222
HB71D
STA $26
223
B71F: AE EC C0 224
HB71F
LDX HC0EC ; lecture nibble
data
B722: 10 FB
225
BPL HB71F
226
; X [$96,$FF]
B724: BD D3 B7
227
LDA HB869-$96,X
B727: 99 00 BD
228
STA HBD00,Y
B72A: 45 26
229
EOR $26
B72C: C8
230
INY
B72D: D0 EE
231
BNE HB71D
232
233 * Lecture groupe nibbles (part 1)
234
B72F: A0 AA
235
LDY #$AA
B731: D0 03
236
BNE HB736
237
B733: 99 FF FF 238
HB733
STA $FFFF,Y
239
B736: AE EC C0 240
HB736
LDX HC0EC ; lecture nibble
data
B739: 10 FB
241
BPL HB736
242
B73B: 5D D3 B7
243
EOR HB869-$96,X
B73E: BE 00 BD
244
LDX HBD00,Y
B741: 5D D3 B8
245
EOR HB8D3,X
B744: C8
246
INY
B745: D0 EC
247
BNE HB733
248
B747: 48
249
PHA
; on finira plus tard (timing problem)
B748: 29 FC
250
AND #$FC
251
252 * Lecture groupe nibble (part 2)
253
B74A: A0 AA
254
LDY #$AA
255
B74C: AE EC C0 256
HB74C
LDX HC0EC ; lecture nibble
data
B74F: 10 FB
257
BPL HB74C
258
B751: 5D D3 B7
259
EOR HB869-$96,X
B754: BE 00 BD
260
LDX HBD00,Y
B757: 5D D4 B8
261
EOR HB8D3+1,X
B75A: 99 FF FF 262
HB75A
STA $FFFF,Y
B75D: C8
263
INY
B75E: D0 EC
264
BNE HB74C
265
266 * Lecture groupe nibble (part 3)
267
B760: AE EC C0 268
HB760
LDX HC0EC
B763: 10 FB
269
BPL HB760
270
B765: 29 FC
271
AND #$FC
272
B767: A0 AC
273
LDY #$AC
B769: 5D D3 B7 274
HB769
EOR HB869-$96,X
B76C: BE FE BC
275
LDX HBCFE,Y
B76F: 5D D5 B8
276
EOR HB8D3+2,X
B772: 99 FF FF 277
HB772
STA $FFFF,Y
278
B775: AE EC C0 279
HB775
LDX HC0EC
B778: 10 FB
280
BPL HB775
281
B77A: C8
282
INY
B77B: D0 EC
283
BNE HB769
284
; last read=checksum
B77D: 29 FC
285
AND #$FC
B77F: 5D D3 B7
286
EOR HB869-$96,X
B782: A6 2B
287
LDX SLOT16
B784: A8
288
TAY
B785: D0 09
289
BNE HB790 ; err checksum
290
B787: AD EC C0 291
HB787
LDA HC0EC ; 1er trailer champ
data
B78A: 10 FB
292
BPL HB787
293
B78C: C9 DE
294
CMP #$DE
B78E: F0 02
295
BEQ HB792
296
B790: 38 297
HB790
SEC
; err
B791: 24
298
DFB $24 ; BIT
B792: 18 299
HB792
CLC
; no err
300
B793: 68
301
PLA
; sauve octet laissé en plan faute de timing
B794: A0 55
302
LDY #$55
B796: 91 00
303
STA (PTR_BUFF),Y
B798: 60
304
RTS
305
306 *-------------------------------
307
B799: 00 308
CURR_HTRACK DFB
0 ; current half track
B79A: 00 309
CPT_ERR DFB
0 ; compteur err track
310
311 *===============================
312 * Avance ou recule le bras du drive
313 *===============================
314
315 * In : acc = wanted dos 3.3 track
316
B79B: 0A 317
MOVE_ARM
ASL
; *2 pour half-track
B79C: 85 26
318
STA $26
B79E: AD 99 B7 319
HB79E
LDA CURR_HTRACK
B7A1: 85 27
320
STA $27
B7A3: 38
321
SEC
B7A4: E5 26
322
SBC $26
B7A6: F0 2F
323
BEQ HB7D7 ; on est
déja sur la bonne piste
324
B7A8: B0 05
325
BCS HB7AF ; il faut avancer
326
B7AA: EE 99 B7
327
INC CURR_HTRACK
B7AD: 90 03
328
BCC HB7B2
329
B7AF: CE 99 B7 330
HB7AF
DEC CURR_HTRACK
331
B7B2: 20 CB B7 332
HB7B2
JSR HB7CB ; first part
B7B5: 20 D8 B7
333
JSR HB7D8 ; delai
334
B7B8: A5 27
335
LDA $27
B7BA: 29 03
336
AND #$03
B7BC: 0A
337
ASL
B7BD: 09 60
338
ORA #$60
B7BF: A8
339
TAY
B7C0: B9 80 C0
340
LDA HC080,Y
B7C3: 20 D8 B7
341
JSR HB7D8 ; delai
B7C6: F0 D6
342
BEQ HB79E
343
B7C8: 20 D8 B7
344
JSR HB7D8 ; delai
345
346
; second part
B7CB: AD 99 B7 347
HB7CB
LDA CURR_HTRACK
B7CE: 29 03
348
AND #$03
B7D0: 0A
349
ASL
B7D1: 09 60
350
ORA #$60
B7D3: A8
351
TAY
B7D4: B9 81 C0
352
LDA HC081,Y
B7D7: 60 353
HB7D7
RTS
354
355 * Délai attente déplacement bras
356
B7D8: A9 28 357
HB7D8
LDA #$28
B7DA: 38
358
SEC
B7DB: 48 359
HB7DB
PHA
B7DC: E9 01 360
HB7DC
SBC #$01
B7DE: D0 FC
361
BNE HB7DC
362
B7E0: 68
363
PLA
B7E1: E9 01
364
SBC #$01
B7E3: D0 F6
365
BNE HB7DB
B7E5: 60
366
RTS
367
368 *-------------------------------
369 * Erreur: impossible de trouver champ adresse
370
B7E6: 38 371
HB7E6
SEC
B7E7: 60
372
RTS
373
374 *===============================
375 * Recherche champ adresse
376 *===============================
377
378 * Out: carry = 1 champ adresse introuvable
379 *
380 * carry = 0 no err
381 * $2C = volume lu
382 * $2D = track lue
383 * $2E = secteur lu
384 * $2F = checksum lu
385
B7E8: A0 FC 386
RDADDRF LDY
#$FC ; init nbr d'essai
B7EA: 84 26
387
STY $26
B7EC: C8 388
HB7EC
INY
B7ED: D0 04
389
BNE HB7F3
390
B7EF: E6 26
391
INC $26
B7F1: F0 F3
392
BEQ HB7E6
393
394 *-------------------------------
395 * Lecture champ adresse
396
B7F3: AD EC C0 397
HB7F3
LDA HC0EC ; 1er header champ
adresse
B7F6: 10 FB
398
BPL HB7F3
399
B7F8: C9 D5 400
HB7F8
CMP #$D5
B7FA: D0 F0
401
BNE HB7EC
402
B7FC: EA
403
NOP
404
B7FD: AD EC C0 405
HB7FD
LDA HC0EC ; 2nd header champ
adresse
B800: 10 FB
406
BPL HB7FD
407
B802: C9 AA
408
CMP #$AA
B804: D0 F2
409
BNE HB7F8
410
B806: A0 03
411
LDY #$03 ; lecture 2*4
nibbles en 4-4:
412
; volume/track/secteur/checksum
413
B808: AD EC C0 414
HB808
LDA HC0EC ; 3eme header champ
adresse
B80B: 10 FB
415
BPL HB808
416
B80D: C9 96
417
CMP #$96
B80F: D0 E7
418
BNE HB7F8
419
B811: A9 00
420
LDA #$00
B813: 85 27 421
HB813
STA $27
422
B815: AD EC C0 423
HB815
LDA HC0EC
B818: 10 FB
424
BPL HB815
425
B81A: 2A
426
ROL
B81B: 85 26
427
STA $26
428
B81D: AD EC C0 429
HB81D
LDA HC0EC
B820: 10 FB
430
BPL HB81D
431
B822: 25 26
432
AND $26
B824: 99 2C 00
433
STA H002C,Y ; $2C=volume, $2D=track,
$2E=sector
B827: 45 27
434
EOR $27 ;
$2f=checksum
B829: 88
435
DEY
B82A: 10 E7
436
BPL HB813
437
B82C: A8
438
TAY
B82D: D0 B7
439
BNE HB7E6
440
B82F: AD EC C0 441
HB82F
LDA HC0EC ; lecture 1er
trailer champ adresse
B832: 10 FB
442
BPL HB82F
443
B834: C9 DE
444
CMP #$DE
B836: D0 AE 445
HB836
BNE HB7E6 ; error
446
B838: EA
447
NOP
448
B839: AD EC C0 449
HB839
LDA HC0EC ; lecture 2nd
trailer champ adresse
B83C: 10 FB
450
BPL HB839
451
B83E: C9 AA
452
CMP #$AA
B840: D0 A4
453
BNE HB7E6 ; error
454
B842: 18
455
CLC
; ok found
B843: 60
456
RTS
457
458 *-------------------------------
459
460
HB844
B844: FF FF FF
461
HEX FFFFFFDFAAD5AAD5AAD5FFFFFFFFFF00
B847: DF AA D5 AA D5 AA D5 FF
B84F: FF FF FF FF 00
B854: 00 00 00
462
HEX 00000000000000000000000000000000
B857: 00 00 00 00 00 00 00 00
B85F: 00 00 00 00 00
B864: 00 00 00
463
HEX 0000000000
B867: 00 00
464
B869: 00 04 98 465
HB869
HEX 00049899080C9C101418A0A1A2A3A4A5
B86C: 99 08 0C 9C 10 14 18 A0
B874: A1 A2 A3 A4 A5
B879: 1C 20 A8
466
HEX 1C20A8A9AA24282C3034B0B1383C4044
B87C: A9 AA 24 28 2C 30 34 B0
B884: B1 38 3C 40 44
B889: 48 4C B8
467
HEX 484CB85054585C606468C0C1C2C3C4C5
B88C: 50 54 58 5C 60 64 68 C0
B894: C1 C2 C3 C4 C5
B899: C6 C7 C8
468
HEX C6C7C8C9CA6CCC707478D0D1D27CD4D5
B89C: C9 CA 6C CC 70 74 78 D0
B8A4: D1 D2 7C D4 D5
B8A9: 80 84 D8
469
HEX 8084D8888C9094989CA0E0E1E2E3E4A4
B8AC: 88 8C 90 94 98 9C A0 E0
B8B4: E1 E2 E3 E4 A4
B8B9: A8 AC E8
470
HEX A8ACE8B0B4B8BCC0C4C8F0
B8BC: B0 B4 B8 BC C0 C4 C8 F0
B8C4: F1 CC D0
471
HEX F1CCD0D4D8DCE0F8E4E8ECF0F4F8FC
B8C7: D4 D8 DC E0 F8 E4 E8 EC
B8CF: F0 F4 F8 FC
472
B8D3: 00 00 00 473
HB8D3
HEX 00000096020000970100009A0300009B
B8D6: 96 02 00 00 97 01 00 00
B8DE: 9A 03 00 00 9B
B8E3: 00 02 00
474
HEX 0002009D0202009E0102009F030200A6
B8E6: 9D 02 02 00 9E 01 02 00
B8EE: 9F 03 02 00 A6
B8F3: 00 01 00
475
HEX 000100A7020100AB010100AC030100AD
B8F6: A7 02 01 00 AB 01 01 00
B8FE: AC 03 01 00 AD
B903: 00 03 00
476
HEX 000300AE020300AF010300B2030300B3
B906: AE 02 03 00 AF 01 03 00
B90E: B2 03 03 00 B3
B913: 00 00 02
477
HEX 000002B4020002B5010002B6030002B7
B916: B4 02 00 02 B5 01 00 02
B91E: B6 03 00 02 B7
B923: 00 02 02
478
HEX 000202B9020202BA010202BB030202BC
B926: B9 02 02 02 BA 01 02 02
B92E: BB 03 02 02 BC
B933: 00 01 02
479
HEX 000102BD020102BE010102BF030102CB
B936: BD 02 01 02 BE 01 01 02
B93E: BF 03 01 02 CB
B943: 00 03 02
480
HEX 000302CD020302CE010302CF030302D3
B946: CD 02 03 02 CE 01 03 02
B94E: CF 03 03 02 D3
B953: 00 00 01
481
HEX 000001D6020001D7010001D9030001DA
B956: D6 02 00 01 D7 01 00 01
B95E: D9 03 00 01 DA
B963: 00 02 01
482
HEX 000201DB020201DC010201DD030201DE
B966: DB 02 02 01 DC 01 02 01
B96E: DD 03 02 01 DE
B973: 00 01 01
483
HEX 000101DF020101E5010101E6030101E7
B976: DF 02 01 01 E5 01 01 01
B97E: E6 03 01 01 E7
B983: 00 03 01
484
HEX 000301E9020301EA010301EB030301EC
B986: E9 02 03 01 EA 01 03 01
B98E: EB 03 03 01 EC
B993: 00 00 03
485
HEX 000003ED020003EE010003EF030003F2
B996: ED 02 00 03 EE 01 00 03
B99E: EF 03 00 03 F2
B9A3: 00 02 03
486
HEX 000203F3020203F4010203F5030203F6
B9A6: F3 02 02 03 F4 01 02 03
B9AE: F5 03 02 03 F6
B9B3: 00 01 03
487
HEX 000103F7020103F9010103FA030103FB
B9B6: F7 02 01 03 F9 01 01 03
B9BE: FA 03 01 03 FB
B9C3: 00 03 03
488
HEX 000303FC020303FD010303FE030303FF
B9C6: FC 02 03 03 FD 01 03 03
B9CE: FE 03 03 03 FF
489
490 *-------------------------------
491
B9D3: AD 51 BA 492 FLOAD_TRK
LDA TRACK_END
B9D6: 20 9B B7
493
JSR MOVE_ARM
494
B9D9: A5 01
495
LDA PTR_BUFF+1 ; calcule adresse implantation en mem
pour
B9DB: 38
496
SEC
; les secteurs à charger
B9DC: ED 49 BA
497
SBC HBA49
B9DF: 85 01
498
STA PTR_BUFF+1
499
B9E1: AC 49 BA
500
LDY HBA49
501
B9E4: 98 502
HB9E4
TYA
B9E5: 18
503
CLC
B9E6: 65 01
504
ADC PTR_BUFF+1
B9E8: BE 29 BA
505
LDX SKEWING,Y
B9EB: 9D 39 BA
506
STA LIST_ADR_BUF,X
B9EE: C8
507
INY
B9EF: CC 4A BA
508
CPY SECTOR_END
B9F2: F0 F0
509
BEQ HB9E4
B9F4: 90 EE
510
BCC HB9E4
511
B9F6: A6 2B
512
LDX SLOT16
B9F8: A9 60
513
LDA #$60 ; init nbr max
passage
B9FA: 85 02
514
STA $02
515
B9FC: C6 02 516
HB9FC
DEC $02
B9FE: F0 25
517
BEQ HBA25 ; probleme pour
tout charger dans cette piste
518
BA00: 20 E8 B7
519
JSR RDADDRF ; lecture champ adresse
BA03: B0 F7
520
BCS HB9FC ; error
521
BA05: A4 2D
522
LDY FOUND_TRK
BA07: B9 39 BA
523
LDA LIST_ADR_BUF,Y
BA0A: F0 F0
524
BEQ HB9FC ; déja
chargé: continue
525
BA0C: 85 01
526
STA PTR_BUFF+1
BA0E: 20 D5 B6
527
JSR RDSECDTA ; lecture champ data
BA11: B0 E9
528
BCS HB9FC ; err-> next
529
BA13: A4 2D
530
LDY FOUND_TRK
BA15: A9 00
531
LDA #$00 ; signale
chargement fait
BA17: 99 39 BA
532
STA LIST_ADR_BUF,Y
533
534 * Vérifie que tous les secteurs soient chargés
535
BA1A: A0 0F
536
LDY #$0F ; 16 secteurs
BA1C: B9 39 BA 537
HBA1C
LDA LIST_ADR_BUF,Y ; adr impl destroyed?
BA1F: D0 DB
538
BNE HB9FC ; non, secteur not
loaded:continue
539
BA21: 88
540
DEY
BA22: 10 F8
541
BPL HBA1C
BA24: 60
542
RTS
543
BA25: EE 9A B7 544
HBA25
INC CPT_ERR ; err piste
BA28: 60
545
RTS
546
547 *-------------------------------
548
BA29: 00 0D 0B 549
SKEWING HEX
000D0B09070503010E0C0A080604020F
BA2C: 09 07 05 03 01 0E 0C 0A
BA34: 08 06 04 02 0F
550
551 * Liste des 16 adresses possibles en ram pour load
BA39: 00 00 00 552 LIST_ADR_BUF
DS 16,0
BA3C: 00 00 00 00 00 00 00 00
BA44: 00 00 00 00 00
553
BA49: 00 554
HBA49
DFB 0
BA4A: 00 555
SECTOR_END DFB
0
BA4B: 01 556
TRACK_START DFB
1
BA4C: 00 557
SECTOR_START DFB
0
BA4D: 00 558
BUFFERL DFB
0
BA4E: 20 559
BUFFERH HEX
20
BA4F: 20 560
NB_SECT HEX
20
BA50: 00 561
HBA50
DFB 0
BA51: 00 562
TRACK_END DFB
0
563
564 *-------------------------------
565
BA52: A9 DD 566
HBA52
LDA #$DD
BA54: A0 FF 567
HBA54
LDY #$FF
BA56: 59 00 3F 568
HBA56
EOR $3F00,Y
BA59: 99 00 3F 569
HBA59
STA $3F00,Y
BA5C: 88
570
DEY
BA5D: C0 FF
571
CPY #$FF
BA5F: D0 F5
572
BNE HBA56
573
BA61: CE 58 BA
574
DEC HBA56+2
BA64: CE 6A BA
575
DEC HBA6A
BA67: AE 6A BA
576
LDX HBA6A
BA6A: E0 1F 577
HBA6A
CPX #$1F
BA6C: D0 E6
578
BNE HBA54
579
BA6E: A0 1F
580
LDY #$1F
BA70: 60
581
RTS
582
BA71: A9 DD
583
LDA #$DD
BA73: 8D 00 40
584
STA $4000
BA76: A0 00 585
HBA76
LDY #$00
BA78: B9 00 20 586
HBA78
LDA $2000,Y
BA7B: 59 01 20 587
HBA7B
EOR $2001,Y
BA7E: 99 00 20 588
HBA7E
STA $2000,Y
BA81: C8
589
INY
BA82: D0 F4
590
BNE HBA78
591
BA84: EE 7A BA
592
INC HBA78+2
BA87: EE 7D BA
593
INC HBA7B+2
BA8A: EE 80 BA
594
INC HBA7E+2
BA8D: AE 80 BA
595
LDX HBA7E+2
BA90: E0 40
596
CPX #$40
BA92: D0 E2
597
BNE HBA76
BA94: 60
598
RTS
599
BA95: A9 BA
600
LDA #$BA
BA97: 8D 5B BA
601
STA HBA59+2
BA9A: A9 B5
602
LDA #$B5
BA9C: 8D 6B BA
603
STA HBA6A+1
BA9F: A0 00
604
LDY #$00
BAA1: 98
605
TYA
BAA2: 59 00 08 606
HBAA2
EOR H0800,Y
BAA5: 88
607
DEY
BAA6: D0 FA
608
BNE HBAA2
609
BAA8: C9 31
610
CMP #$31
BAAA: D0 A6
611
BNE HBA52
BAAC: 60
612
RTS
613
614 *-------------------------------
615
616
HBAAD
BAAD: A0 FF 3B
617
HEX A0FF3B3A8200DB452404BA2260616263
BAB0: 3A 82 00 DB 45 24 04 BA
BAB8: 22 60 61 62 63
BABD: 64 65 66
618
HEX 6465666768696A6B6C6D6E6F70717273
BAC0: 67 68 69 6A 6B 6C 6D 6E
BAC8: 6F 70 71 72 73
BACD: 74 75 76
619
HEX 7475767778797A2B7A7A7A7A2200F545
BAD0: 77 78 79 7A 2B 7A 7A 7A
BAD8: 7A 22 00 F5 45
BADD: 28 04 B9
620
HEX 2804B93737322C32383ABAE728313829
BAE0: 37 37 32 2C 32 38 3A BA
BAE8: E7 28 31 38 29
BAED: 3B E7 28
621
HEX 3BE72833293B300006462904B933322C
BAF0: 33 29 3B 30 00 06 46 29
BAF8: 04 B9 33 32 2C
BAFD: 30 3A B9
622
HEX 303AB9
623
624 *-------------------------------
625
BB00: 08 626
HBB00
DFB 8
; nbr de secteurs
627
628 *===============================
629 * Check disk
630 *===============================
631
BB01: 20 18 BF 632 CHECK_DISK0
JSR _SAV_HGRSTAT
633
BB04: A9 02 634
CHECK_DISK LDA
#>$0200 ; buffer=$0200
BB06: A0 00
635
LDY #<$0200
BB08: 20 F8 BF
636
JSR _SET_BUFFER
BB0B: A9 00
637
LDA #$00 ; load 1
sector T$00 S$00
BB0D: A0 00
638
LDY #$00
BB0F: A2 01
639
LDX #$01
BB11: 20 9A BF
640
JSR _BLOADER
641
BB14: AD 00 BB
642
LDA HBB00 ; check nbr of
sectors (byte $FF)
BB17: CD FF 02
643
CMP H02FF
BB1A: D0 04
644
BNE HBB20 ; not the demo
645
BB1C: 20 25 BF
646
JSR _SET_GRAPHIC
BB1F: 60
647
RTS
648
BB20: 48 649
HBB20
PHA
BB21: 20 2F FB
650
JSR INIT
BB24: 2C 58 FC
651
BIT HOME
BB27: 68
652
PLA
BB28: C9 FF
653
CMP #$FF ; byte $FF =
$FF => disk utilisateur
BB2A: F0 0F
654
BEQ HBB3B
655
656
; sinon
BB2C: A0 00
657
LDY #0 ;
message: mettez flobynoid face A.
BB2E: B9 E0 BF 658
HBB2E
LDA _TXT_FLOBYA,Y
BB31: 99 B0 05
659
STA $05B0,Y
BB34: C8
660
INY
BB35: C0 18
661
CPY #$18
BB37: D0 F5
662
BNE HBB2E
BB39: F0 0D
663
BEQ HBB48
664
665 *-------------------------------
666
BB3B: A0 00 667
HBB3B
LDY #$00 ; message:
mettez votre disk tableau
BB3D: B9 5E BB 668
HBB3D
LDA HBB5E,Y
BB40: 99 AF 05
669
STA $05AF,Y
BB43: C8
670
INY
BB44: C0 1B
671
CPY #$1B
BB46: D0 F5
672
BNE HBB3D
673
BB48: A9 00 674
HBB48
LDA #$00 ; attente
insertion et touche
BB4A: 20 A8 FC
675
JSR WAIT
BB4D: 2C 10 C0
676
BIT STROBE
677
BB50: AD 00 C0 678
HBB50
LDA KEY
BB53: 0D 61 C0
679
ORA BUTTN0
BB56: 0D 62 C0
680
ORA BUTTN1
BB59: 10 F5
681
BPL HBB50
682
BB5B: 4C 04 BB
683
JMP CHECK_DISK
684
685 *-------------------------------
686
BB5E: 0D 687
HBB5E
INV 'M'
BB5F: E5 F4 F4
688
ASC "ettez "
BB62: E5 FA A0
BB65: 16
689
INV 'V'
BB66: EF F4 F2
690
ASC "otre "
BB69: E5 A0
BB6B: 04
691
INV 'D'
BB6C: E9 F3 EB
692
ASC "isk "
BB6F: A0
BB70: 14
693
INV 'T'
BB71: E1 E2 EC
694
ASC "ableau. "
BB74: E5 E1 F5 AE A0 A0 A0 A0
BB7C: A0
695
696 *-------------------------------
697
BB7D: A0 698
SAV_Y
ASC " "
BB7E: 00 699
SAV_X
DFB 0
BB7F: 00 700
SAV_A
DFB 0
701
702 *-------------------------------
703
BB80: 8D 7F BB
704
STA SAV_A
BB83: 8E 7E BB
705
STX SAV_X
BB86: 8C 7D BB
706
STY SAV_Y
707
BB89: AD 4D BA
708
LDA BUFFERL
BB8C: 8D 45 BF
709
STA _SAV_BUFFER
BB8F: AD 4E BA
710
LDA BUFFERH
BB92: 8D 46 BF
711
STA _SAV_BUFFER+1
712
BB95: 20 01 BB
713
JSR CHECK_DISK0
714
BB98: AD 46 BF
715
LDA _SAV_BUFFER+1
BB9B: 8D 4E BA
716
STA BUFFERH
BB9E: AD 45 BF
717
LDA _SAV_BUFFER
BBA1: 8D 4D BA
718
STA BUFFERL
719
BBA4: AD 7F BB
720
LDA SAV_A
BBA7: AE 7E BB
721
LDX SAV_X
BBAA: AC 7D BB
722
LDY SAV_Y
BBAD: 4C 9D BF
723
JMP _BLOADERD
724
BBB0: 00 00 00
725
DS 8,0
BBB3: 00 00 00 00 00
726
727 *-------------------------------
728
BBB8: 20 18 BF
729
JSR _SAV_HGRSTAT
BBBB: A9 6D 730
HBBBB
LDA #$6D
BBBD: A0 E8
731
LDY #$E8
BBBF: 20 00 3D
732
JSR H3D00
733
BBC2: EA
734
NOP
BBC3: EA
735
NOP
BBC4: EA
736
NOP
BBC5: EA
737
NOP
BBC6: EA
738
NOP
BBC7: EA
739
NOP
BBC8: EA
740
NOP
BBC9: EA
741
NOP
BBCA: EA
742
NOP
743
BBCB: AD FF 11
744
LDA H11FF
BBCE: C9 08
745
CMP #$08
BBD0: F0 03
746
BEQ HBBD5
747
BBD2: 4C 25 BF
748
JMP _SET_GRAPHIC
749
BBD5: 20 2F FB 750
HBBD5
JSR INIT
BBD8: 2C 58 FC
751
BIT HOME
BBDB: A0 00
752
LDY #$00
BBDD: B9 B0 67 753
HBBDD
LDA H67B0,Y
BBE0: 99 AE 05
754
STA $05AE,Y
BBE3: C8
755
INY
BBE4: C0 20
756
CPY #$20
BBE6: D0 F5
757
BNE HBBDD
758
BBE8: A9 00
759
LDA #$00
BBEA: 20 A8 FC
760
JSR WAIT
BBED: 2C 10 C0
761
BIT STROBE
762
BBF0: AD 00 C0 763
HBBF0
LDA KEY
BBF3: 0D 61 C0
764
ORA BUTTN0
BBF6: 0D 62 C0
765
ORA BUTTN1
BBF9: 10 F5
766
BPL HBBF0
BBFB: 4C BB BB
767
JMP HBBBB
768
BBFE: 00 00
769
DS 2,0
770
771 *-------------------------------
772
BC00: A9 08
773
LDA #$08
BC02: 85 00
774
STA PTR_BUFF
BC04: A2 60 775
HBC04
LDX #$60
BC06: A0 00
776
LDY #$00
BC08: BD 89 C0
777
LDA HC089,X
BC0B: A9 FF
778
LDA #$FF
BC0D: 20 A8 FC
779
JSR WAIT
BC10: A9 FF
780
LDA #$FF
BC12: 20 A8 FC
781
JSR WAIT
BC15: BD 8E C0
782
LDA HC08E,X
BC18: BD 8C C0 783
HBC18
LDA HC08C,X
BC1B: 10 FB
784
BPL HBC18
785
BC1D: C9 D5 786
HBC1D
CMP #$D5
BC1F: D0 F7
787
BNE HBC18
788
BC21: EA
789
NOP
790
BC22: BD 8C C0 791
HBC22
LDA HC08C,X
BC25: 10 FB
792
BPL HBC22
793
BC27: C9 AA
794
CMP #$AA
BC29: D0 F2
795
BNE HBC1D
796
BC2B: A0 03
797
LDY #$03
798
BC2D: BD 8C C0 799
HBC2D
LDA HC08C,X
BC30: 10 FB
800
BPL HBC2D
801
BC32: C9 96
802
CMP #$96
BC34: D0 E7
803
BNE HBC1D
804
BC36: A9 00
805
LDA #$00
BC38: 85 27 806
HBC38
STA $27
807
BC3A: BD 8C C0 808
HBC3A
LDA HC08C,X
BC3D: 10 FB
809
BPL HBC3A
810
BC3F: 2A
811
ROL
BC40: 85 26
812
STA $26
813
BC42: BD 8C C0 814
HBC42
LDA HC08C,X
BC45: 10 FB
815
BPL HBC42
816
BC47: 25 26
817
AND $26
BC49: 99 2C 00
818
STA H002C,Y
BC4C: 45 27
819
EOR $27
BC4E: 88
820
DEY
BC4F: 10 E7
821
BPL HBC38
822
BC51: A8
823
TAY
BC52: D0 C4
824
BNE HBC18
825
BC54: BD 8C C0 826
HBC54
LDA HC08C,X
BC57: 10 FB
827
BPL HBC54
828
BC59: C9 DE
829
CMP #$DE
BC5B: D0 BB
830
BNE HBC18
831
BC5D: EA
832
NOP
833
BC5E: BD 8C C0 834
HBC5E
LDA HC08C,X
BC61: 10 FB
835
BPL HBC5E
836
BC63: C9 AA
837
CMP #$AA
BC65: D0 B1
838
BNE HBC18
839
BC67: 18
840
CLC
BC68: A5 2D
841
LDA FOUND_TRK
BC6A: C9 00
842
CMP #$00
BC6C: F0 03
843
BEQ HBC71
844
BC6E: 4C 18 BC
845
JMP HBC18
846
BC71: BD 8C C0 847
HBC71
LDA HC08C,X
BC74: 10 FB
848
BPL HBC71
849
BC76: C9 C1
850
CMP #$C1
BC78: D0 01
851
BNE HBC7B
852
BC7A: 60
853
RTS
854
BC7B: C6 00 855
HBC7B
DEC PTR_BUFF
BC7D: D0 85
856
BNE HBC04
857
BC7F: D0 FE 858
HBC7F
BNE HBC7F
BC81: F0 FE 859
HBC81
BEQ HBC81
860
861 *-------------------------------
862
BC83: 00 00 00
863
DS 123,0
BC86: 00 00 00 00 00 00 00 00
...
BCFE: 00 00 864
HBCFE
DS 2,0
865
866 *-------------------------------
867
BD00: 00 00 00 868
HBD00
DS 256,0
...
BDFB: 00 00 00 00 00
869
870 *-------------------------------
871
872
SAV BOOT2
Object saved as BOOT2,A$B600,L$0800
--End assembly, 2048 bytes, Errors: 0
Symbol table - alphabetical order:
BLOADER0
=$B66D
BUFFERH
=$BA4E
BUFFERL
=$BA4D
BUTTN0 =$C061
BUTTN1
=$C062 CHECK_DISK
=$BB04 CHECK_DISK0
=$BB01 ? CLR_LINE =$B642
CPT_ERR
=$B79A CURR_HTRACK
=$B799 FLOAD_TRK
=$B9D3 FOUND_TRK =$2D
H002C
=$2C
H02FF
=$02FF
H0800
=$0800
H11FF =$11FF
H1F03
=$1F03
H3D00
=$3D00
H67B0 =$67B0
? HB600 =$B600
HB646
=$B646
HB679
=$B679
HB6A6
=$B6A6
HB6D3 =$B6D3
HB6E6
=$B6E6
HB6F1
=$B6F1
HB6F9
=$B6F9
HB6FC =$B6FC
HB701
=$B701
HB706
=$B706
HB710
=$B710
HB71D =$B71D
HB71F
=$B71F
HB733
=$B733
HB736
=$B736
HB74C =$B74C
HB75A
=$B75A
HB760
=$B760
HB769
=$B769
HB772 =$B772
HB775
=$B775
HB787
=$B787
HB790
=$B790
HB792 =$B792
HB79E
=$B79E
HB7AF
=$B7AF
HB7B2
=$B7B2
HB7CB =$B7CB
HB7D7
=$B7D7
HB7D8
=$B7D8
HB7DB
=$B7DB
HB7DC =$B7DC
HB7E6
=$B7E6
HB7EC
=$B7EC
HB7F3
=$B7F3
HB7F8 =$B7F8
HB7FD
=$B7FD
HB808
=$B808
HB813
=$B813
HB815 =$B815
HB81D
=$B81D
HB82F =$B82F
? HB836
=$B836
HB839 =$B839
? HB844
=$B844
HB869
=$B869
HB8D3
=$B8D3
HB9E4 =$B9E4
HB9FC
=$B9FC
HBA1C
=$BA1C
HBA25
=$BA25
HBA49 =$BA49
HBA50
=$BA50
HBA52
=$BA52
HBA54
=$BA54
HBA56 =$BA56
HBA59
=$BA59
HBA6A
=$BA6A
HBA76
=$BA76
HBA78 =$BA78
HBA7B
=$BA7B
HBA7E
=$BA7E
HBAA2 =$BAA2
? HBAAD =$BAAD
HBB00
=$BB00
HBB20
=$BB20
HBB2E
=$BB2E
HBB3B =$BB3B
HBB3D
=$BB3D
HBB48
=$BB48
HBB50
=$BB50
HBB5E =$BB5E
HBBBB
=$BBBB
HBBD5
=$BBD5
HBBDD
=$BBDD
HBBF0 =$BBF0
HBC04
=$BC04
HBC18
=$BC18
HBC1D
=$BC1D
HBC22 =$BC22
HBC2D
=$BC2D
HBC38
=$BC38
HBC3A
=$BC3A
HBC42 =$BC42
HBC54
=$BC54
HBC5E
=$BC5E
HBC71
=$BC71
HBC7B =$BC7B
HBC7F
=$BC7F
HBC81
=$BC81
HBCFE
=$BCFE
HBD00 =$BD00
HC080
=$C080
HC081
=$C081
HC089
=$C089
HC08C =$C08C
HC08E
=$C08E
HC0E9
=$C0E9
HC0EC
=$C0EC
HOME =$FC58
INIT
=$FB2F
KEY
=$C000 LIST_ADR_BUF
=$BA39 MOVE_ARM
=$B79B
NB_SECT
=$BA4F PTR_BUFF
=$00
RDADDRF
=$B7E8 RDSECDTA
=$B6D5
SAV_A
=$BB7F
SAV_X
=$BB7E
SAV_Y
=$BB7D SECTOR_END =$BA4A
SECTOR_START =$BA4C
SKEWING
=$BA29
SLOT16
=$2B
STROBE =$C010
TRACK_END
=$BA51 TRACK_START
=$BA4B
WAIT
=$FCA8 _BLOADER
=$BF9A
_BLOADERD
=$BF9D _BLOADER_CHK
=$BF90 _SAV_BUFFER
=$BF45 _SAV_HGRSTAT =$BF18
_SET_BUFFER =$BFF8
_SET_GRAPHIC =$BF25 _TXT_FLOBYA
=$BFE0
Symbol table - numerical order:
PTR_BUFF
=$00
SLOT16
=$2B
H002C
=$2C
FOUND_TRK =$2D
H02FF
=$02FF
H0800
=$0800
H11FF
=$11FF
H1F03 =$1F03
H3D00
=$3D00
H67B0 =$67B0
? HB600
=$B600 ? CLR_LINE =$B642
HB646
=$B646 BLOADER0
=$B66D
HB679
=$B679
HB6A6 =$B6A6
HB6D3
=$B6D3 RDSECDTA
=$B6D5
HB6E6
=$B6E6
HB6F1 =$B6F1
HB6F9
=$B6F9
HB6FC
=$B6FC
HB701
=$B701
HB706 =$B706
HB710
=$B710
HB71D
=$B71D
HB71F
=$B71F
HB733 =$B733
HB736
=$B736
HB74C
=$B74C
HB75A
=$B75A
HB760 =$B760
HB769
=$B769
HB772
=$B772
HB775
=$B775
HB787 =$B787
HB790
=$B790
HB792
=$B792 CURR_HTRACK
=$B799
CPT_ERR =$B79A
MOVE_ARM
=$B79B
HB79E
=$B79E
HB7AF
=$B7AF
HB7B2 =$B7B2
HB7CB
=$B7CB
HB7D7
=$B7D7
HB7D8
=$B7D8
HB7DB =$B7DB
HB7DC
=$B7DC
HB7E6
=$B7E6
RDADDRF
=$B7E8
HB7EC =$B7EC
HB7F3
=$B7F3
HB7F8
=$B7F8
HB7FD
=$B7FD
HB808 =$B808
HB813
=$B813
HB815
=$B815
HB81D
=$B81D
HB82F =$B82F
? HB836
=$B836
HB839 =$B839
? HB844
=$B844
HB869 =$B869
HB8D3
=$B8D3 FLOAD_TRK
=$B9D3
HB9E4
=$B9E4
HB9FC =$B9FC
HBA1C
=$BA1C
HBA25
=$BA25
SKEWING
=$BA29 LIST_ADR_BUF =$BA39
HBA49
=$BA49 SECTOR_END
=$BA4A TRACK_START
=$BA4B SECTOR_START =$BA4C
BUFFERL
=$BA4D
BUFFERH
=$BA4E
NB_SECT
=$BA4F
HBA50 =$BA50
TRACK_END
=$BA51
HBA52
=$BA52
HBA54
=$BA54
HBA56 =$BA56
HBA59
=$BA59
HBA6A
=$BA6A
HBA76
=$BA76
HBA78 =$BA78
HBA7B
=$BA7B
HBA7E
=$BA7E
HBAA2 =$BAA2
? HBAAD =$BAAD
HBB00
=$BB00 CHECK_DISK0
=$BB01 CHECK_DISK
=$BB04
HBB20 =$BB20
HBB2E
=$BB2E
HBB3B
=$BB3B
HBB3D
=$BB3D
HBB48 =$BB48
HBB50
=$BB50
HBB5E
=$BB5E
SAV_Y
=$BB7D
SAV_X =$BB7E
SAV_A
=$BB7F
HBBBB
=$BBBB
HBBD5
=$BBD5
HBBDD =$BBDD
HBBF0
=$BBF0
HBC04
=$BC04
HBC18
=$BC18
HBC1D =$BC1D
HBC22
=$BC22
HBC2D
=$BC2D
HBC38
=$BC38
HBC3A =$BC3A
HBC42
=$BC42
HBC54
=$BC54
HBC5E
=$BC5E
HBC71 =$BC71
HBC7B
=$BC7B
HBC7F
=$BC7F
HBC81
=$BC81
HBCFE =$BCFE
HBD00
=$BD00 _SAV_HGRSTAT
=$BF18 _SET_GRAPHIC
=$BF25 _SAV_BUFFER =$BF45
_BLOADER_CHK =$BF90
_BLOADER =$BF9A
_BLOADERD =$BF9D
_TXT_FLOBYA =$BFE0
_SET_BUFFER =$BFF8
KEY
=$C000
STROBE
=$C010
BUTTN0 =$C061
BUTTN1
=$C062
HC080
=$C080
HC081
=$C081
HC089 =$C089
HC08C
=$C08C
HC08E
=$C08E
HC0E9
=$C0E9
HC0EC =$C0EC
INIT
=$FB2F
HOME
=$FC58
WAIT =$FCA8
Retour sommaire
Driver original.
:asm
1
2
; LST OFF
3
ORG $BF00
4
5 ********************************
6
*
*
7 * DRIVER FLOBYNOID
DEMO *
8 *
(C)1987 SSS *
9 * SOURCE BY
DECKARD *
10
*
*
11 ********************************
12
13 * Adresse ram
14
15 H02FF
EQU $02FF
16
17 * Adresses BOOT2
18
19 CLR_LINE
EQU $B642
20 BLOADER0
EQU $B66D
21 TRACK_START EQU
$BA4B
22 SECTOR_START EQU
$BA4C
23 BUFFERL
EQU $BA4D
24 BUFFERH
EQU $BA4E
25 NB_SECT
EQU $BA4F
26
27 * Adresses rom
28
29
KEY
EQU $C000
30 STROBE
EQU $C010
31 RPAGE2
EQU $C01C ; lecture si page
HGR1 ou 2
32 RHIRES
EQU $C01D ; lecture si mode
HGR ou pas
33 TXTCLR
EQU $C050 ; graphic mode
34 LOWSCR
EQU $C054 ; HGR1
35 HISCR
EQU $C055 ; HGR2
36 HIRES
EQU $C057 ; mode HGR
37 BUTTN0
EQU $C061
38 BUTTN1
EQU $C062
39 HC0E8
EQU $C0E8 ; drive off slot 6
40 HC0E9
EQU $C0E9 ; drive on slot 6
41
INIT
EQU $FB2F
42
HOME
EQU $FC58
43
44 *===============================
45 * Attente d'une touche entre 2
46 * acces disk
47 *===============================
48
BF00: 8D E8 C0 49
_WAITKEY STA
HC0E8 ; stop drive
50
BF03: AD 00 C0 51
HBF03
LDA KEY ; attente
touche
BF06: 0D 61 C0
52
ORA BUTTN0
BF09: 0D 62 C0
53
ORA BUTTN1
BF0C: 10 F5
54
BPL HBF03
55
BF0E: 8D E9 C0
56
STA HC0E9 ; lance drive
BF11: EA
57
NOP
BF12: EA
58
NOP
BF13: 4C A8 BF
59
JMP _CHECK_DISK
60
61 *-------------------------------
62
BF16: 00 63
_PAGE_HGR DFB
0 ; HGR ($C054), HGR2
($C055)
BF17: 00 64
_MODE_HGR DFB
0 ; non ($C056),
oui ($C057)
65
66 *-------------------------------
67
BF18: AD 1C C0 68 _SAV_HGRSTAT
LDA RPAGE2
BF1B: 8D 16 BF
69
STA _PAGE_HGR
BF1E: AD 1D C0
70
LDA RHIRES
BF21: 8D 17 BF
71
STA _MODE_HGR
BF24: 60
72
RTS
73
74 *===============================
75 * Enclenche mode graphic
76 *===============================
77
BF25: 20 42 B6 78 _SET_GRAPHIC
JSR CLR_LINE
BF28: EA
79
NOP
BF29: EA
80
NOP
BF2A: AD 17 BF
81
LDA _MODE_HGR
BF2D: 10 10
82
BPL HBF3E+1 ; BUG!!!! must be $BF3D
83
BF2F: 8D 50 C0
84
STA TXTCLR ; graphic
BF32: 8D 57 C0
85
STA HIRES ; mode HGR
BF35: AD 16 BF
86
LDA _PAGE_HGR
BF38: 10 04
87
BPL HBF3E
88
BF3A: 8D 55 C0
89
STA HISCR ; HGR2
BF3D: 60 90
HBF3D
RTS
91
BF3E: 8D 54 C0 92
HBF3E
STA LOWSCR ; HGR1
BF41: 60
93
RTS
94
95 *-------------------------------
96
BF42: 00 97
_SAV_A DFB
0
BF43: 00 98
_SAV_X DFB
0
BF44: 00 99
_SAV_Y DFB
0
BF45: 00 00 100 _SAV_BUFFER
DFB 0,0
101
BF47: 00 00 00
102
DS 7,0
BF4A: 00 00 00 00
103
104 *-------------------------------
105
BF4E: 8D 42 BF 106 _CALLER_CHK
STA _SAV_A
BF51: 8E 43 BF
107
STX _SAV_X
BF54: 8C 44 BF
108
STY _SAV_Y
109
BF57: AD 4E BA
110
LDA BUFFERH
BF5A: 8D 45 BF
111
STA _SAV_BUFFER
BF5D: AD 4D BA
112
LDA BUFFERL
BF60: 8D 46 BF
113
STA _SAV_BUFFER+1
114
BF63: 20 A8 BF
115
JSR _CHECK_DISK
116
BF66: AD 46 BF
117
LDA _SAV_BUFFER+1
BF69: 8D 4D BA
118
STA BUFFERL
BF6C: AD 45 BF
119
LDA _SAV_BUFFER
BF6F: 8D 4E BA
120
STA BUFFERH
121
BF72: AC 44 BF
122
LDY _SAV_Y
BF75: AE 43 BF
123
LDX _SAV_X
BF78: AD 42 BF
124
LDA _SAV_A
BF7B: 20 7F BF
125
JSR _CALLER
BF7E: 60
126
RTS
127
128 *-------------------------------
129
BF7F: 8D 4B BA 130
_CALLER STA
TRACK_START
BF82: 8C 4C BA
131
STY SECTOR_START
BF85: 8E 4F BA
132
STX NB_SECT
BF88: A2 60
133
LDX #$60 ; slot16
BF8A: A9 06
134
LDA #$06
BF8C: 20 6D B6
135
JSR BLOADER0
BF8F: 60
136
RTS
137
138 *-------------------------------
139
BF90: 8D E9 C0 140 _BLOADER_CHK STA
HC0E9
BF93: 20 4E BF
141
JSR _CALLER_CHK
BF96: 8D E8 C0
142
STA HC0E8
BF99: 60
143
RTS
144
145 *-------------------------------
146
BF9A: 8D E9 C0 147 _BLOADER
STA HC0E9
BF9D: 20 7F BF 148 _BLOADERD
JSR _CALLER
BFA0: 8D E8 C0
149
STA HC0E8
BFA3: 60
150
RTS
151
152 *-------------------------------
153
BFA4: 00 00 00
154
DS 3,0
BFA7: FF
155
HEX FF
156
157 *-------------------------------
158
BFA8: A9 02 159 _CHECK_DISK
LDA #>$0200 ; load T$00 S$00 en $0200
BFAA: A0 00
160
LDY #<$0200
BFAC: 20 F8 BF
161
JSR _SET_BUFFER
BFAF: A9 00
162
LDA #$00
BFB1: A0 00
163
LDY #$00
BFB3: A2 01
164
LDX #$01
BFB5: 20 7F BF
165
JSR _CALLER
166
BFB8: AD FF 02
167
LDA H02FF ; check byte
BFBB: C9 08
168
CMP #$08 ; demo?
BFBD: F0 1D
169
BEQ HBFDC ; yes
170
BFBF: EA
171
NOP
172
BFC0: 20 18 BF
173
JSR _SAV_HGRSTAT
BFC3: 20 2F FB
174
JSR INIT
BFC6: 2C 58 FC
175
BIT HOME
BFC9: A0 00
176
LDY #0 ;
affiche ligne de commande
BFCB: B9 E0 BF 177
HBFCB
LDA _TXT_FLOBYA,Y
BFCE: 99 B0 05
178
STA $05B0,Y
BFD1: C8
179
INY
BFD2: C0 18
180
CPY #$18
BFD4: D0 F5
181
BNE HBFCB
182
BFD6: 2C 10 C0
183
BIT STROBE
BFD9: 4C 00 BF
184
JMP _WAITKEY
185
BFDC: 4C 25 BF 186
HBFDC
JMP _SET_GRAPHIC ; RTS inclus
187
BFDF: 55
188
HEX 55
189
190 *-------------------------------
191
BFE0: 0D 192
_TXT_FLOBYA INV 'M'
BFE1: E5 F4 F4
193
ASC "ettez "
BFE4: E5 FA A0
BFE7: 06
194
INV 'F'
BFE8: CC CF C2
195
ASC "LOBYNOID "
BFEB: D9 CE CF C9 C4 A0
BFF1: 06
196
INV 'F'
BFF2: E1 E3 E5
197
ASC "ace "
BFF5: A0
BFF6: 01
198
INV 'A'
BFF7: AE
199
ASC "."
200
201 *-------------------------------
202
BFF8: 8D 4E BA 203 _SET_BUFFER
STA BUFFERH
BFFB: 8C 4D BA
204
STY BUFFERL
BFFE: 60
205
RTS
206
BFFF: 00
207
DFB 0
208
209
SAV DRIVER
Object saved as DRIVER,A$BF00,L$0100
--End assembly, 256 bytes, Errors: 0
Symbol table - alphabetical order:
BLOADER0
=$B66D
BUFFERH
=$BA4E
BUFFERL
=$BA4D
BUTTN0 =$C061
BUTTN1
=$C062 CLR_LINE
=$B642
H02FF
=$02FF
HBF03 =$BF03
? HBF3D
=$BF3D
HBF3E
=$BF3E
HBFCB
=$BFCB
HBFDC =$BFDC
HC0E8
=$C0E8
HC0E9
=$C0E9
HIRES
=$C057
HISCR =$C055
HOME
=$FC58
INIT
=$FB2F
KEY
=$C000
LOWSCR =$C054
NB_SECT
=$BA4F
RHIRES
=$C01D
RPAGE2
=$C01C SECTOR_START =$BA4C
STROBE
=$C010 TRACK_START
=$BA4B
TXTCLR =$C050 ?
_BLOADER =$BF9A
? _BLOADERD =$BF9D ?
_BLOADER_CHK =$BF90
_CALLER
=$BF7F _CALLER_CHK =$BF4E
_CHECK_DISK =$BFA8
_MODE_HGR =$BF17
_PAGE_HGR =$BF16
_SAV_A =$BF42
_SAV_BUFFER =$BF45
_SAV_HGRSTAT =$BF18
_SAV_X
=$BF43
_SAV_Y =$BF44
_SET_BUFFER =$BFF8
_SET_GRAPHIC =$BF25 _TXT_FLOBYA
=$BFE0 _WAITKEY
=$BF00
Symbol table - numerical order:
H02FF
=$02FF CLR_LINE
=$B642 BLOADER0
=$B66D TRACK_START =$BA4B
SECTOR_START =$BA4C
BUFFERL
=$BA4D
BUFFERH
=$BA4E
NB_SECT =$BA4F
_WAITKEY
=$BF00
HBF03
=$BF03 _PAGE_HGR
=$BF16 _MODE_HGR =$BF17
_SAV_HGRSTAT =$BF18
_SET_GRAPHIC =$BF25 ?
HBF3D
=$BF3D
HBF3E =$BF3E
_SAV_A
=$BF42
_SAV_X
=$BF43
_SAV_Y
=$BF44 _SAV_BUFFER =$BF45
_CALLER_CHK =$BF4E
_CALLER =$BF7F ?
_BLOADER_CHK =$BF90 ?
_BLOADER =$BF9A
? _BLOADERD
=$BF9D _CHECK_DISK
=$BFA8
HBFCB
=$BFCB
HBFDC =$BFDC
_TXT_FLOBYA =$BFE0
_SET_BUFFER =$BFF8
KEY
=$C000
STROBE =$C010
RPAGE2
=$C01C
RHIRES
=$C01D
TXTCLR
=$C050
LOWSCR =$C054
HISCR
=$C055
HIRES
=$C057
BUTTN0
=$C061
BUTTN1 =$C062
HC0E8
=$C0E8
HC0E9
=$C0E9
INIT
=$FB2F
HOME =$FC58
Retour sommaire
Nouveau boot 1.
:asm
1
2
; LST OFF
3
ORG $0800
4
5 ********************************
6
*
*
7 * Nouveau boot1 FLOBYNOID DEMO *
8 * (c)2007 by
Deckard *
9
*
*
10 ********************************
11
12 * Adresses page 0
13
14 BUFF_LOW
EQU $26
15 BUFF_HIGH EQU
$27
16 SECTOR
EQU $3D
17 TRACK
EQU $41 ; must be
0!
18 CUR_NBR
EQU $FE ; nbr de
secteur
19 CUR_SECT
EQU $FF ; secteur
en cours (current)
20
21 * Adresse rom
22
23 TXTSET
EQU $C051 ; mode text
24 HC65C
EQU $C65C ; routine load
sector
25
INIT
EQU $FB2F
26 SETNORM
EQU $FE84
27 SETKBD
EQU $FE89
28 SETVID
EQU $FE93
29
HOME
EQU $FC58
30
WAIT
EQU $FCA8
31
32 ********************************
33
0800: 01
34
DFB 1
; un seul secteur à charger
35
36 ********************************
37
38
FLOBY_BOOT1
0801: A9 60
39
LDA #$60 ; RTS
nécessaire car la routine de chargement
0803: 8D 01 08
40
STA FLOBY_BOOT1 ; utilisée ($C65C) finit par
un JMP $0801
41
0806: 20 2F FB
42
JSR INIT
0809: 20 84 FE
43
JSR SETNORM
080C: 20 93 FE
44
JSR SETVID
080F: 20 89 FE
45
JSR SETKBD
0812: 8D 00 C0
46
STA $C000
0815: 8D 0C C0
47
STA $C00C
48
0818: AD 51 C0
49
LDA TXTSET
081B: 20 58 FC
50
JSR HOME
51
52 * Chargement boot2
53
081E: A9 BD
54
LDA #>$BD00 ; implantation $B600-$BDFF
0820: 85 27
55
STA BUFF_HIGH
0822: A9 00
56
LDA #$00 ; piste $00
0824: A2 08
57
LDX #$08 ; secteurs
$08/$07/$06/$05/$04/$03/$02/$01
0826: A0 08
58
LDY #$08 ; 8 secteurs
décroissant
0828: 20 5C 08
59
JSR LOAD ; chargement
60
61 * Signature
62
082B: A9 DF
63
LDA #"_"
082D: A0 00
64
LDY #0
082F: 99 0E 04 65
:1
STA $040E,Y
0832: C8
66
INY
0833: C0 0B
67
CPY #$0B
0835: D0 F8
68
BNE :1
69
0837: A0 00
70
LDY #0
0839: B9 4C 08 71
:2
LDA SIGNATURE,Y
083C: 99 8C 04
72
STA $048C,Y
083F: C8
73
INY
0840: C0 0F
74
CPY #$0F
0842: D0 F5
75
BNE :2
76
0844: A9 00
77
LDA #0
0846: 20 A8 FC
78
JSR WAIT
0849: 4C 00 B6
79
JMP $B600
80
81
SIGNATURE
084C: A8 BA
82
ASC "(:"
084E: 20
83
ASC ' '
084F: 06 0C 0F
84
INV 'FLOBYNOID'
0852: 02 19 0E 0F 09 04
0858: 20
85
ASC ' '
0859: BA A9 00
86
ASC ":)"00
87
88
89 ********************************
90
*
*
91 * Charge des secteurs en T$00 *
92
*
*
93 ********************************
94
95 * In : ACC = piste à lire (TOUJOURS 0!)
96 * X = secteur
à lire en 1er
97 * Y = nbr de
secteurs à lire
98
085C: 85 41 99
LOAD
STA TRACK ; must be 0!
085E: 86 FF
100
STX CUR_SECT
0860: 84 FE
101
STY CUR_NBR
102
0862: A9 00 103
:1
LDA #$00
0864: 85 26
104
STA BUFF_LOW
105
0866: A4 FF
106
LDY CUR_SECT ; équivalence secteur
logique/physique
0868: B9 82 08
107
LDA SKEWING,Y
086B: 85 3D
108
STA SECTOR
109
086D: A2 60
110
LDX #$60 ; slot*16
086F: 20 5C C6
111
JSR HC65C ; routine LOAD de
la carte controleur
112
0872: C6 FF
113
DEC CUR_SECT ; passe au secteur
précédant
0874: 10 03
114
BPL :2 ; il
en reste encore sur cette piste
115
0876: 4C 69 FF
116
JMP $FF69 ; not allowed!
117
0879: C6 27 118
:2
DEC BUFF_HIGH ; revient sur l'adr high du secteur
qu'on
087B: C6 27
119
DEC BUFF_HIGH ; vient de charger et pointe sur le
précédant
120
; car la routine rom a fait adr high+1
087D: C6 FE
121
DEC CUR_NBR ; un secteur de moins
à charger
087F: D0 E1
122
BNE :1 ; il
en reste encore
0881: 60
123
RTS
; chargement fini
124
125 ********************************
126
127 * Table d'équivalence secteurs logiques et physiques
128
0882: 00 0D 0B 129
SKEWING HEX
000D0B09070503010E0C0A080604020F
0885: 09 07 05 03 01 0E 0C 0A
088D: 08 06 04 02 0F
130
131 ********************************
132
0892: 00 00 00
133
DS 102,0
...
08F5: 00 00 00
134
08F8: C4 C5 C3
135
ASC "DECKARD"
08FB: CB C1 D2 C4
08FF: 08
136
DFB 8
; checked
137
138
SAV FLOBYDEMO.BOOT1.NEW
Object saved as FLOBYDEMO.BOOT1.NEW,A$0800,L$0100
--End assembly, 256 bytes, Errors: 0
Symbol table - alphabetical order:
BUFF_HIGH
=$27
BUFF_LOW
=$26
CUR_NBR
=$FE
CUR_SECT =$FF
FLOBY_BOOT1 =$0801
HC65C
=$C65C
HOME
=$FC58
INIT =$FB2F
LOAD
=$085C
SECTOR
=$3D
SETKBD
=$FE89
SETNORM =$FE84
SETVID
=$FE93 SIGNATURE
=$084C
SKEWING
=$0882
TRACK =$41
TXTSET
=$C051
WAIT =$FCA8
Symbol table - numerical order:
BUFF_LOW
=$26
BUFF_HIGH
=$27
SECTOR
=$3D
TRACK =$41
CUR_NBR
=$FE
CUR_SECT
=$FF FLOBY_BOOT1
=$0801 SIGNATURE =$084C
LOAD
=$085C
SKEWING
=$0882
TXTSET
=$C051
HC65C =$C65C
INIT
=$FB2F
HOME
=$FC58
WAIT
=$FCA8
SETNORM =$FE84
SETKBD
=$FE89
SETVID =$FE93
Retour sommaire