Révisions:
1.0 : / /1989
2.0 : 04/02/1997
2.1 : 15/06/2006
Dernière mise à jour: 25/06/2006 (ajout sources sous DOS
3.3).
Présentation
Voici les sources complets du RDOS 3.3 de la société
américaine SSI (Strategic
Simulations, Inc.) qui a sorti des
jeux sur Apple II pendant des années, surtout des jeux de role
et des jeux de stratégie.
Il ne s'agit pas des sources de l'auteur (Roland
Gustafsson) -et pour
cause, ils ne furent jamais diffusés!- mais d'une
interprétation personnelle... pour un usage personnel!!
Ce système d'exploitation propriétaire n'est pas
récent : il date du début des années 80.
Les logiciels sortis jusqu'à la version 2.1 du système
ont tous une protection.
Ces disks sont en 13 secteurs : c'est pour cela que la version 2.1 est
aussi appelée Rdos 3.2 (en référence au DOS 3.2
qui est lui aussi en 13 secteurs par piste).
A l'époque pour cracker ces logiciels, les pirates pouvaient les
convertir vers un format 16 secteurs (et ainsi en avoir une version
copiable au Locksmith Fast Backup). Ils
devaient pour celà
modifier le système d'exploitation et y placer une RWTS du DOS
3.3. On trouve une référence à cette modification
dans une ancienne interview du pirate Mister Z.
D'autres (notamment des américains) firent de même pour
leurs cracks.
Finalement, SSI finit par faire évoluer
son système en le passant en 16 secteurs. Ce Rdos 3.3 a une RWTS
identique au DOS 3.3 à l'exception d'un skewing
différent. Cette dernière version a un copyright de 1986.
A la fin les logiciels de cette société n'étaient
plus protégés. J'ai par exemple regardé Pool Of
Radiance. Dans la doc, il est clairement mentionné qu'une
copie
de l'original doit être faite afin de ne jouer qu'avec le
duplicata.
Enfin si, il y avait quand même une forme de protection, via la
doc avec une sorte de roue (translation wheel) qui permettait de
s'assurer que l'utilisateur avait bien un original. On retrouve aussi
ce système de roue dans Curse Of The Azure Bonds
mais elle
disparait complètement dans Champions Of Krynn
où il ne
subsiste qu'une routine demandant une référence dans la
doc en début de partie.
LE SYSTEME D'EXPLOITATION DETAILLE ICI AVEC SON
SOURCE COMPLET EST L'EXACTE VERSION QUE L'ON TROUVE SUR CES JEUX
COMMERCIAUX NON PROTEGES (dans le sens copiable sur d'autres
disquettes).
La particularité de ce système est sa rapidité,
l'accès aux commandes du DOS via l'ampersand et surtout un
HIMEM:
$B100 bien pratique pour qui travaille en BASIC tout en ayant usage de
la page graphique HGR.
Au niveau de l'underground, ce DOS a été utilisé
pour la série des
Muryaden après quelques patchs (notamment
un catalogue
déplacé de la piste $01 à
la piste $22). Je l'ai aussi repris en version de base pour le jeu de
role A la recherche de Karine de mon ami de
l'époque, Bozo (et
son frère).
Il s'agit à mon avis d'un des systèmes d'exploitations
les plus agréables pour gérer une disquette 5,25 pouces
dans le cadre d'un jeu de
role contenant des programmes BASIC très longs et donc
très
gourmants en mémoire.
Il n'utilise ni les banks ni la mémoire étendu de l'apple
II. Faire un jeu avec une configuration de base est tout à fait
possible.
Spécifications
Avec le Rdos, on n'utilise pas la notion de secteur mais la notion de
bloc.
Attention à ne pas confondre avec les blocs ProDOS! En effet, le
bloc Rdos tout comme un secteur classique en DOS 3.3 fait 256 octets et
pas 512 comme le bloc ProDOS.
La numérotation des blocs va de 0 à 559 soit 560 blocs
maximum
pour une disquette 5,25p (blocs $0000-$022F).
Un numéro de bloc a le format: $0PPS avec PP=numéro de
piste et S =numéro de secteur.
Exemple: bloc $022F = piste $22 secteur $0F
Pour connaitre l'équivalence entre bloc Rdos et découpage
logique Rdos en piste/secteur, il suffit de se ramener à son
affichage hexa.
Attention ici, la notion de secteur correspond à une valeur
logique différente de celle du DOS 3.3.
Table des équivalences
bloc/T-S:
Bloc Piste/secteur
Piste/secteur Piste/secteur physique
RDOS
RDOS
DOS 3.3
(boot 0)
(& copy2+ 5.x)
$0000 T$00 S$00 T$00
S$00 T$00 S$00
$0001 T$00 S$01 T$00
S$0E T$00 S$02
$0002 T$00 S$02 T$00
S$0D T$00 S$04
$0003 T$00 S$03 T$00
S$0C T$00 S$06
$0004 T$00 S$04 T$00
S$0B T$00 S$08
$0005 T$00 S$05 T$00
S$0A T$00 S$0A
$0006 T$00 S$06 T$00
S$09 T$00 S$0C
$0007 T$00 S$07 T$00
S$08 T$00 S$0E
$0008 T$00 S$08 T$00
S$07 T$00 S$01
$0009 T$00 S$09 T$00
S$06 T$00 S$03
$000A T$00 S$0A T$00
S$05 T$00 S$05
$000B T$00 S$0B T$00
S$04 T$00 S$07
$000C T$00 S$0C T$00
S$03 T$00 S$09
$000D T$00 S$0D T$00
S$02 T$00 S$0B
$000E T$00 S$0E T$00
S$01 T$00 S$0D
$000F T$00 S$0F T$00
S$0F T$00 S$0F
$0010 T$01 S$00 T$01
S$00 T$01 S$00
...
$022E T$22 S$0E T$22
S$01 T$22 S$0D
$022F T$22 S$0F T$22
S$0F T$22 S$0F
Le Rdos pour garder une petite taille n'intègre pas toutes ses
commandes en ram.
En fonction des besoins, certains morceaux de code peuvent être
chargés depuis la disquette.
C'est le cas pour 2 commandes: &CAT et &GOTO.
Une disquette Rdos 3.3 a ses 2 1ères pistes
réservées:
- Piste $00 : RDOS et ses 2 modules (goto et
cat)
- Piste $01 : catalogue
Les objets sont stockés à partir de la piste 2,
c'est à dire à partir du bloc 32.
En temps normal le 1er objet présent est le
fichier de lancement SYSTEMBOOT.
il n'y a pas de VTOC ni de TSL. Toutes les informations utiles sont
dans le catalog.
Découpage de la
disquette:
Bloc 0000 : boot1
Bloc 0001 : module &cat
Bloc 0002 : module &goto
Bloc 0003-0015 : RDOS 3.3
Bloc 0016-0031 : catalog
Bloc 0032 : SYSTEMBOOT
Bloc 0033-559 : objets
Une fois le Rdos en ram, la
mémoire occupée est la
suivante:
$B100-$B1FF Buffer 1 (contient le code d'une
commande
supplémentaire chargée)
$B200-$B2FF Buffer 2
$B300-$BFFF RDOS 3.3
Le catalog va du bloc Rdos $0010 (16) au $001F (31) dans l'ordre
séquentiel.
Le descriptif d'un objet fait 32 octets. Dans un bloc, il y a donc
l'information pour 8 objets.
Et on peut avoir au maximum 8 * 16 blocs = 128 noms d'objets max.
Description d'un objet:
Offset
Rôle
$00-$17 (00-23) Nom de l'objet (1er caractère =$80 si objet
supprimé)
(1er caractère = $00 -> fin catalog)
Le caractère espace est interdit.
Pour
être valable, il faut des valeurs > espace ($A0).
Si un nom fait moins de 24 caractères, il est
complété
par des espaces à la fin.
$18 (24) Type objet (A=basic,
B=binaire,
T=fichier, espace=objet supprimé)
$19 (25) Nbr de bloc
utilisé
$1A (26) Adresse implantation
low
$1B (27) Adresse implantation
high
$1C (28) Longueur low
$1D (29) Longueur high
$1E (30) Numéro 1er
bloc (low)
$1F (31) Numéro 1er
bloc (high)
Exemple d'un catalog avec un disk blank:
]&CAT
LEN
-<NAME>- LENGTH BLK
B 032 RDOS 3.3 COPYRIGHT 1986 8192 000
T 001
SYSTEMBOOT
256 032
A 001
HELLO
48 033
Le 1er nom (bidon) permet de protéger les 2 premières
pistes, c'est à dire le Rdos proprement dit et son catalogue.
Le fichier exec SYSTEMBOOT contient les instructions suivantes:
PR#0:IN#0:&RUN"HELLO".
Commandes et erreurs
&CAT : Donne le catalogue d'une disquette
Rdos. Il s'agit d'une
commande externe qui est chargée à chaque appel sur la
piste $00
secteur $01 (référence logique Rdos), c'est à dire
le bloc 1.
&LOAD "nom" (,adresse) : Charge un programme
basic et redonne la
main à l'utilisateur.
Il est possible de spécifier l'adresse d'implantation. Si rien
n'est donné, le programme est chargé à l'adresse
de début du
basic (txttab).
&RUN "nom" (,adresse) : Charge et
exécute un programme
basic. Même remarque pour l'adresse d'implantation.
&GOTO "nom" (,adresse) : Permet de lancer un
autre programme basic
en conservant les données. Il s'agit d'une commande externe
chargée
à chaque fois sur la piste $00 secteur $02
(référence logique Rdos), soit le
bloc 2.
Ceci n'est possible que si le nouveau programme basic est de taille
inférieure ou égale au précédant.
Cette commande est l'équivalent du CHAIN sous DOS 3.3.
&SAVE "nom" : Sauvegarde du programme basic
en cours.
&STORE "nom", adresse, longueur : Equivalent
du BSAVE.
&RECALL "nom" (,adresse) : Charge un objet
binaire. Si pas
d'adresse mentionnée, utilise celle de la sauvegarde (incluse
dans le descriptif du catalog).
&DEF "nom", nbr de blocs (1 à 255) :
Réserve une
place pour un objet en taille de bloc. Rdos écrit des
zéros dans l'espace réservé.
&PRINT "nom" : Permet d'ajouter des
informations dans un fichier
texte.
Le mécanisme de cette commande passe par le détournement
de CSW/KSW.
Toutes les sorties classiques de type "print" seront dirigées
vers
le fichier jusqu'à ce que la commande &END stoppe le
process. On ne
peut traiter qu'un seul fichier à la fois. Les infos sont
écrites sur
disk que quand un bloc est totalement rempli ou si la commande
&END est rencontrée.
&READ "nom" : Cette commande permet de lire
le contenu d'un fichier texte (inverse de la commande &print).
On ne peut traiter qu'un seul fichier à la fois.
On ne peut pas lire plus de données que ce qui a
été
écrit dedans. Par contre, on peut en lire moins si on veut.
&END : Arret commandes &PRINT ou
&READ. Ceci est fait par
l'envoi d'un $00 via COUT et remet les CSW/KSW d'avant &PRINT ou
&READ.
Exemple d'utilisation:
d'abord l'enregistrement des données:
10 INPUT "EXISTING FILE (Y/N):";A$
20 IF A$="Y" THEN &DEL "INCREDIBLE"
30 &DEF "INCREDIBLE",1
40 &PRINT "INCREDIBLE"
50 ? "STEVE WOZNIAK" : ? "APPLE II"
60 &END
puis la relecture (et affichage écran):
10 &READ "INCREDIBLE"
20 INPUT C1$: INPUT C2$
30 &END
40 ? C1$ : ? C2$
&DEL "nom" : Supprime un objet en
écrasant son type et le
1er caractère du nom.
&LEN : Commande liée au programme
basic en cours. Elle
permet de connaitre l'adresse de début du programme, sa taille
et l'adresse de
début des variables.
&D lecteur, (autre commande Rdos) : Change
le drive courant et
éventuellement lance une autre commande Rdos.
&S slot, (autre commande Rdos) : Change le
slot du drive courant et
éventuellement lance une autre commande Rdos.
&NEW : Supprime le programme basic en
mémoire (commande
basic NEW) et remet le himem $B100.
&USR adresse : Défini une porte de
sortie si la commande
& trouvée n'est pas répertoriée en standard.
Ceci permet de créer de nouvelles commandes et de les rattacher
au Rdos.
Notes:
- Quand j'indique "nom", il s'agit soit du nom réel entre
guillemet soit une variable alpha soit un mixe des 2.
- Les adresses et longueurs doivent être indiquées en
numérique (pas de support de l'alpha contrairement au DOS 3.3 et
ProDOS).
Liste des erreurs:
File not found
Dos syntax error
Duplicate entry
Disk full
Out of data
I/O error
File type error
write protect error
Assemblage
Les sources ont été réalisés avec MERLIN-8
ProDOS.
Vous trouverez 2 disquettes en pièces jointes.
Une version dite "statique" avec tous les éléments inclus
dans le fichier MAKE.
Il suffit de taper:
(L)oad MAKE
ASM
et l'objet est dispo.
Une version dite dynamique car elle est découpée en
modules linkables.
Si vous avez envie de faire des modifs, utilisez plutôt celle
là.
A dire vrai, j'ai rajouté la statique pour sortir le listing des
annexes!
Pour la "dynamique", il faut assembler individuellement les
différentes composantes (relogeable REL), puis linker le tout.
Cette étape se fait avec LINK $B300 "LNK.RDOS".
Le binaire résultat s'appelle RDOS.SSI dans le répertoire
OBJ. (Pour la "dynamique", c'est dans LNK/OBJ).
Le Rdos 3.3 en lui même se compose des sources suivants:
INTERFACE.S Interface gérant le
& et le traitement des commandes RDOS
RWTS.S
Routine principale de la RWTS
RWTS.SUBS.S Sous programmes de la RWTS
NBUF.S
Buffers NBUF1 et NBUF2 utilisés par la RWTS. NBUF1 contient
le code de démarrage du RDOS.
VARIABLES Tables et variables
utilisées par le RDOS 3.3.
J'ai également mis les sources complémentaires:
BOOT1.S
Amorçage piste $00 secteur $00 d'une disquette RDOS 3.3.
Ce boot très court charge le RDOS en une passe et le
stocke de $B300 à $BFFF avant de l'exécuter.
MODULE.CAT.S Module exécuté suite
à la commande &CAT (catalogue).
MODULE.CHAIN.S Module exécuté suite à
la commande &GOTO (chainage de 2
programmes BASIC pour conserver les variables).
Le résultat obtenu après le LINK n'est bien sur pas
exploitable sous ProDOS.
Si vous souhaitez vous créer une disquette RDOS 3.3, utilisez
ShrinkIt 3.4:
L'archive ($E0) RDOS3.3 contient l'image d'une disquette RDOS 3.3 avec
juste le SYSTEMBOOT et un petit programme BASIC HELLO. La disquette
obtenue est amorçable. Un message vous accueillera:
RDOS LOADED.
READY.
Vous avez alors la main pour tapez vos instructions.
Notes
Pour remplacer un objet dont le nom existe déjà au
catalog, il faut obligatoirement le supprimer via les instructions
&DEL puis le sauvegarder avec la commande liée au type.
Il faut être attentif à la place prise. En effet, du fait
de l'usage exclusif du numéro de 1er bloc et de la longueur,
chaque augmentaton de taille d'un objet peut poser problème.
Il faut gérer intelligement l'espace des blocs.
Par ex, si vous êtes en train de faire un programme et qu'il
s'allonge
à fur et à mesure, commencez avant tout à lui
prévoir une place suffisament grande avec l'instruction &DEF
(et supprimer le fichier immédiatement après avec
l'instruction
&DEL). Le Rdos vous aura ainsi fait un "trou" dans le catalog
où vous pourrez sereinement sauvegarder votre programme à
fur et à mesure de son évolution.
Dans le cas contraire, à
chaque fois que vous allez sauver votre programme, il va trouver que
l'ancien
espace est insuffisant et se positionner après en laissant
l'espace
précédant intact (même s'il n'y a pas d'objet du
tout derrière). A ce petit jeu là, vous allez
rapidement arriver
à un message d'erreur "disk full".
Si vous faites un &CAT après un &DEF / &DEL, la
place libre apparaîtra avec un nom d'objet <NOT IN USE>.
Autre cas de figure: si vous voulez sauver un objet de petite taille et
que la 1ère place dispo (résultant d'un &DEL) entre 2
autres objets est très grande, votre objet va être
placé dans ce trou et il y aura plein de place gachée
pour le reste (non utilisable) car un objet en remplace un autre dans
le catalogue (et c'est tout).
Ajout du 20/06/2006: il semblerait que des outils aient filtrés
finalement de chez Roland Gustafsson car
après quelques
recherches google, je suis tombé sur un disk d'outils à
l'url http://www.apple2.org.za/gswv/a2zine/Sel/RDOSstuff.html.
|
ProDOS
|
Download Rdos 3.3 dynamic source code -linked-
(gzipped)
|
|
ProDOS
|
Download Rdos 3.3 static source code (gzipped)
|
|
DOS 3.3
|
Download Rdos 3.3 static source code (gzipped)
|
|
Rdos 3.3
|
Download Rdos 3.3 blank disk (gzipped)
|
|
Rdos 3.3
|
Download Rdos 3.3 Utils disk (gzipped)
|
File: Rdos_3_3_Master_Sources_Dynamic_Sous_ProDOS.dsk
Disk: ProDOS /RDOS.DYNAMIC (140KB)
Name
Type Auxtyp Modified
Format Length
------------------------------------------------------------------------------
SRC
DIR $0000 16-Jun-06 01:14
ProDOS 512
SRC:BOOT1.S
TXT $0000 15-Jun-06 21:21
ProDOS 2721
SRC:INTERFACE.S
TXT $0000 15-Jun-06 22:50 ProDOS
32253
SRC:RWTS.S
TXT $0000 15-Jun-06 22:58
ProDOS 4868
SRC:RWTS.SUBS.S
TXT $0000 15-Jun-06 23:01
ProDOS 7121
SRC:NBUF.S
TXT $0000 15-Jun-06 23:02
ProDOS 1291
SRC:VARIABLES.S
TXT $0000 15-Jun-06 23:07
ProDOS 2969
SRC:LNK.RDOS.S
TXT $0000 15-Jun-06 23:29
ProDOS 495
SRC:MODULE.CAT.S
TXT $0000 15-Jun-06 23:26
ProDOS 3349
SRC:MODULE.CHAIN.S
TXT $0000 15-Jun-06 23:26
ProDOS 4344
SRC:INCLUDE
DIR $0000 16-Jun-06 01:10
ProDOS 512
SRC:INCLUDE:INCLUDE.ROM.S
TXT $0000 08-Mar-98 15:53
ProDOS 3226
SRC:INCLUDE:INCLUDE.PAGE0.S
TXT $0000 19-Apr-98 17:56
ProDOS 2052
SRC:LNK
DIR $0000 16-Jun-06 01:14
ProDOS 512
SRC:LNK:OBJ
DIR $0000 16-Jun-06 01:14
ProDOS 512
SRC:LNK:OBJ:RDOS3.3
LBR $8002 04-Feb-97 17:28
ProDOS 4589
SRC:LNK:OBJ:MODULE.CAT
BIN $B100 16-Jun-06 01:12
ProDOS 256
SRC:LNK:OBJ:RDOS.SSI
BIN $B300 16-Jun-06 01:14
ProDOS 3328
SRC:LNK:OBJ:MODULE.CHAIN
BIN $B100 16-Jun-06 01:13
ProDOS 256
SRC:LNK:OBJ:BOOT1
BIN $0800 16-Jun-06 01:11
ProDOS 256
SRC:LNK:NBUF
$F8 $0156 16-Jun-06 01:12
ProDOS 484
SRC:LNK:VARIABLES
$F8 $0068 16-Jun-06 01:12
ProDOS 659
SRC:LNK:INTERFACE
$F8 $062D 16-Jun-06 01:12
ProDOS 2925
SRC:LNK:RWTS
$F8 $00EC 16-Jun-06 01:12
ProDOS 575
SRC:LNK:RWTS.SUBS
$F8 $0300 16-Jun-06 01:12
ProDOS 1069
SRC:LNK:LNK.RDOS
BIN $8000 16-Jun-06 01:12
ProDOS 46
------------------------------------------------------------------------------
File: Rdos_3_3_Master_Sources_Static_Sous_ProDOS.dsk
Disk: ProDOS /RDOS.STATIC (140KB)
Name
Type Auxtyp Modified
Format Length
------------------------------------------------------------------------------
SRC
DIR $0000 16-Jun-06 01:05
ProDOS 512
SRC:BOOT1.S
TXT $0000 15-Jun-06 23:35
ProDOS 2717
SRC:INTERFACE.S
TXT $0000 16-Jun-06 00:20 ProDOS
30624
SRC:RWTS.S
TXT $0000 15-Jun-06 23:50
ProDOS 3560
SRC:RWTS.SUBS.S
TXT $0000 15-Jun-06 23:51
ProDOS 6664
SRC:NBUF.S
TXT $0000 15-Jun-06 23:36
ProDOS 943
SRC:VARIABLES.S
TXT $0000 15-Jun-06 23:40
ProDOS 2571
SRC:MODULE.CAT.S
TXT $0000 15-Jun-06 23:37
ProDOS 3345
SRC:MODULE.CHAIN.S
TXT $0000 15-Jun-06 23:37
ProDOS 4340
SRC:MAKE.S
TXT $0000 16-Jun-06 00:01
ProDOS 393
SRC:INCLUDE
DIR $0000 16-Jun-06 01:02
ProDOS 512
SRC:INCLUDE:INCLUDE.ROM.S
TXT $0000 08-Mar-98 15:53
ProDOS 3226
SRC:INCLUDE:INCLUDE.PAGE0.S
TXT $0000 19-Apr-98 17:56
ProDOS 2052
SRC:INCLUDE:INCLUDE.RDOS.S
TXT $0000 16-Jun-06 00:01
ProDOS 881
SRC:OBJ
DIR $0000 16-Jun-06 01:05
ProDOS 512
SRC:OBJ:BOOT1
BIN $0800 16-Jun-06 01:04
ProDOS 256
SRC:OBJ:MODULE.CAT
BIN $B100 16-Jun-06 01:05
ProDOS 256
SRC:OBJ:MODULE.CHAIN
BIN $B100 16-Jun-06 01:04
ProDOS 256
SRC:OBJ:RDOS.SSI
BIN $B300 16-Jun-06 01:05
ProDOS 3328
------------------------------------------------------------------------------.
25/06/2006 : Rajout sources sous DOS 3.3.
|
Sommaire Annexes
Lien |
Contenu |
|
Source Boot 1. |
|
Source Rdos 3.3 (boot 2). |
|
Source &CAT. |
|
Source &GOTO. |
Source Boot 1.
1
2
ORG $0800
3
4 ********************************
5
*
*
6 * BOOT1 du RDOS
3.3 *
7 * (s)ource by
DECKARD *
8
*
*
9 ********************************
10
11 * Le boot1 charge le RDOS en mémoire ($B300-$BFFF)
12 * et l'exécute à partir de l'adresse $BE00.
13 * Ce boot utilise la routine du controleur de disk II
14 * comme sous programme pour le chargement.
15 *
16 * Chargement:
17 *
18 * Secteur
Secteur
Secteur
19 * Physique
Logique
Logique
20 * (Boot 0)
RDOS
DOS 3.3 (©2+ 5.x)
21
22 * T$00 S$00 T$00
S$00
T$00 S$00
23 * T$00 S$01 T$00 S$08
$B800-$B8FF T$00 S$07
24 * T$00 S$02 T$00
S$01
T$00 S$0E
25 * T$00 S$03 T$00 S$09
$B900-$B9FF T$00 S$06
26 * T$00 S$04 T$00
S$02
T$00 S$0D
27 * T$00 S$05 T$00 S$0A
$BA00-$BAFF T$00 S$05
28 * T$00 S$06 T$00 S$03
$B300-$B3FF T$00 S$0C
29 * T$00 S$07 T$00 S$0B
$BB00-$BBFF T$00 S$04
30 * T$00 S$08 T$00 S$04
$B400-$B4FF T$00 S$0B
31 * T$00 S$09 T$00 S$0C
$BC00-$BCFF T$00 S$03
32 * T$00 S$0A T$00 S$05
$B500-$B5FF T$00 S$0A
33 * T$00 S$0B T$00 S$0D
$BD00-$BDFF T$00 S$02
34 * T$00 S$0C T$00 S$06
$B600-$B6FF T$00 S$09
35 * T$00 S$0D T$00 S$0E
$BE00-$BEFF T$00 S$01
36 * T$00 S$0E T$00 S$07
$B700-$B7FF T$00 S$08
37 * T$00 S$0F T$00 S$0F
$BF00-$BFFF T$00 S$0F
38
39 ********************************
40
41 * Adresses page 0
42
43 SLOT16 EQU
$2B
44 SECTEUR EQU
$3D
45 BUFHIGH EQU
$27
46 COMPTEUR EQU
$50
47
48 RESET EQU
$03F2
49 MODE EQU
$04F8+3
50
51 * Adresses ROM
52
53 KEY EQU
$C000
54 INIT EQU
$FB2F
55 HOME EQU
$FC58
56 SETNORM EQU
$FE84
57 SETKBD EQU
$FE89
58 SETVID EQU
$FE93
59
60 ********************************
61
0800: 01
62
DFB 1
; charge un seul secteur
63
0801: A9 60 64
H0801 LDA
#$60 ; RTS nécessaire car on
utilise le sous-programme
0803: 8D 01 08
65
STA H0801 ; de chargement du
controleur qui finit par un
66
; JMP $0801.
67
0806: A9 FF
68
LDA #%11111111 ; cf firmware carte video (slot 3)
0808: 8D FB 04
69
STA MODE
70
080B: 8D F3 03
71
STA RESET+1 ; reset=reboot system
080E: 8D F4 03
72
STA RESET+2
0811: 8D 00 C0
73
STA KEY
0814: 8D 0C C0
74
STA $C00C
0817: 8D 0E C0
75
STA $C00E
081A: 8D 5F C0
76
STA $C05F
081D: 8D 81 C0
77
STA $C081
0820: 20 2F FB
78
JSR INIT
0823: 20 58 FC
79
JSR HOME
0826: 20 84 FE
80
JSR SETNORM
0829: 20 93 FE
81
JSR SETVID
082C: 20 89 FE
82
JSR SETKBD
83
082F: A6 2B
84
LDX SLOT16 ; slot16/16
0831: 8A
85
TXA
0832: 4A
86
LSR
0833: 4A
87
LSR
0834: 4A
88
LSR
0835: 4A
89
LSR
0836: 09 C0
90
ORA #$C0 ; $Cslot
0838: 8D 4D 08
91
STA H084B+2
92
083B: A0 00
93
LDY #0 ;
compteur des 16 secteurs de la piste 0
083D: 84 50 94
H083D STY COMPTEUR
95
083F: B9 5A 08
96
LDA H085A,Y ; secteur physique
0842: 85 3D
97
STA SECTEUR
0844: B9 6A 08
98
LDA H086A,Y ; adr high buffer
0847: F0 05
99
BEQ H084E ; pas de chargement
si adr high=0
100
0849: 85 27
101
STA BUFHIGH
084B: 20 5C 00 102 H084B JSR
$005C ; $Cx5C avec x=slot: chargement
secteur
103
084E: A4 50 104 H084E
LDY COMPTEUR ; incrémente compteur
0850: C8
105
INY
0851: C0 10
106
CPY #16
0853: D0 E8
107
BNE H083D ; pas fini
108
0855: A6 2B
109
LDX SLOT16
0857: 4C 00 BE
110
JMP $BE00 ; lance RDOS
111
112 * Liste des secteurs physiques selon l'ordre logique
113 * du RDOS
114
085A: 00 02 04 115 H085A HEX
00020406080A0C0E01030507090B0D0F
085D: 06 08 0A 0C
0861: 0E 01 03 05
0865: 07 09 0B 0D
0869: 0F
116
117 * Liste des adresses high d'implantation
118
086A: 00 00 00 119 H086A HEX
000000B3B4B5B6B7B8B9BABBBCBDBEBF
086D: B3 B4 B5 B6
0871: B7 B8 B9 BA
0875: BB BC BD BE
0879: BF
120
087A: 00 00 00
121
DS
\
...
08F9: 00 00 00 00
08FD: 00 00 00
122
123
SAV LNK/OBJ/BOOT1
Object saved as LNK/OBJ/BOOT1,A$0800,L$0100,BIN
--End assembly, 256 bytes, Errors: 0
Symbol table - alphabetical order:
BUFHIGH =$27
COMPTEUR=$50
H0801 =$0801
H083D =$083D
H084B =$084B
H084E =$084E
H085A =$085A
H086A =$086A
HOME
=$FC58 INIT
=$FB2F KEY
=$C000 MODE =$04FB
RESET =$03F2
SECTEUR =$3D SETKBD
=$FE89 SETNORM =$FE84
SETVID =$FE93
SLOT16 =$2B
Symbol table - numerical order:
BUFHIGH =$27
SLOT16 =$2B SECTEUR
=$3D COMPTEUR=$50
RESET =$03F2
MODE =$04FB
H0801 =$0801
H083D =$083D
H084B =$084B
H084E =$084E
H085A =$085A
H086A =$086A
KEY
=$C000 INIT
=$FB2F HOME
=$FC58 SETNORM =$FE84
SETKBD =$FE89
SETVID =$FE93
Retour sommaire
Source Rdos 3.3.
Programme d'assemblage static :
1
2 LST
OFF
3 ORG
$B300
4 TYP
$06
5
6 ********************************
7
*
*
8 * Création RDOS
original *
9 * (c)1997 by
Deckard *
10
*
*
11 ********************************
12
13
USE INCLUDE/INCLUDE.ROM
14
USE INCLUDE/INCLUDE.PAGE0
15
USE INCLUDE/INCLUDE.RDOS
16
17
PUT INTERFACE
18
PUT RWTS
19
PUT RWTS.SUBS
20
PUT NBUF
21
PUT VARIABLES
22
23
SAV OBJ/RDOS.SSI
********************************************
:asm
1
2
ORG $B300
3
TYP $06
4
5 ********************************
6
*
*
7 * Création RDOS
original *
8 * (c)1997 by
Deckard *
9
*
*
10 ********************************
11
12
USE INCLUDE/INCLUDE.ROM
>1
>2
>3 ********************************
>4
*
*
>5 * Adresses de référence
ROM *
>6 * (c)1994 by
Deckard *
>7
*
*
>8 ********************************
>9
>10 KEY EQU
$C000 ; touche entrée
>11 RDPRINC EQU
$C002 ; lire en mem princ
>12 RDAUX EQU
$C003 ; lire en mem aux
>13 WTPRINC EQU
$C004 ; écrire en mem princ
>14 WTAUX EQU
$C005 ; écrire en mem aux
>15 STROBE EQU
$C010 ; remise à zéro
saisie clavier
>16 STORE80 EQU
$C018 ; état de 80STORE
>17 RD80COL EQU
$C01F ; test pour savoir si 80c ou 40c
>18 SPEAK EQU
$C030
>19 PRINC EQU
$C054
>20 AUX EQU
$C055
>21 BUTTN0 EQU
$C061
>22 BUTTN1 EQU
$C062
>23 PADDL0 EQU
$C064 ; état manette 0
>24 PADDL1 EQU
$C065 ; état manette 1
>25 PTRIG EQU
$C070 ; init manette
>26 PHASEOFF EQU
$C080
>27 XFER EQU
$C314
>28 AUXMOVE EQU
$C311
>29 BLTU2 EQU
$D39A
>30 ERRORN EQU
$D412
>31 RESTART EQU
$D43C ; fin traitement erreur
>32 LINKSET EQU
$D4F2 ; init pointeurs basic
>33 RUNPROG EQU
$D566 ; lance prog basic en ram
>34 INLINE EQU
$D52C
>35 NEWCMD EQU
$D64B
>36 CLEARC EQU
$D66C ; fin inits pour prog basic
>37 STXTPT EQU
$D697
>38 NEWSTT EQU
$D7D2
>39 ADDON EQU
$D998 ; ajoute Y à l'adr de chargot
>40 CRDO EQU
$DAFB
>41 STROUT EQU
$DB3A
>42 STRPRT EQU
$DB3D ; affiche une chaine
>43 OUTQUES EQU
$DB5A
>44 OUTSP EQU
$DB57
>45 OUTDO EQU
$DB5C ; affiche caractère ACC 'x'
>46 FRMNUM EQU
$DD67 ; évalue expression et
vérif nbre
>47 CHKSTR EQU
$DD6C ; vérifie que c'est une
chaine
>48 FRMEVL EQU
$DD7B
>49 CHKCOM EQU
$DEBE ; vérifie présence
virgule
>50 SYNERR EQU
$DEC9 ; syntax error
>51 PTRGET EQU
$DFE3 ; positionne sur variable
>52 BASIC EQU
$E000
>53 BASIC2 EQU
$E003
>54 AYINT EQU
$E10C
>55 IQERR EQU
$E199 ; illegal quantity
>56 GIVAYF EQU
$E2F2 ; entier A,Y -> FAC
>57 STRLIT EQU
$E3E7
>58 GETSPA EQU
$E452 ; fait la place pour une chaine
>59 GARBAG EQU
$E484 ; nettoyage chaines
inutilisées
>60 MOVSTR EQU
$E5E2 ; recopie chaine pointée
vers variable
>61 FREFAC EQU
$E600
>62 GETBYT EQU
$E6F8 ; lecture nombre 1 octet -> X
>63 GETADR EQU
$E752 ; lecture nbr. In: Y (low) Acc
(High)
>64 FADDT EQU
$E7C1 ; FAC + ARG -> FAC
>65 FMULTT EQU
$E982 ; FAC * ARG -> FAC
>66 MOVFM EQU
$EAF9 ; A(-),Y(+) ptr flottant cond ->
FAC
>67 MOVAF EQU
$EB63 ; FAC -> ARG
>68 FLO2 EQU
$EBA0 ; routine de LINPRT
>69 INPRT EQU
$ED19
>70 LINPRT EQU
$ED24 ; affichage nombre en décimal
>71 PRNTFAC EQU
$ED2E ; affiche FAC
>72 FOUT EQU
$ED34 ; converti FAC en 1 chaine
>73 NOTRACE EQU
$F26F
>74 NORMAL EQU
$F273 ; mode normal
>75 INVERSE EQU
$F277 ; mode inverse
>76 HANDLERR EQU
$F2E9 ; traitement ON ERR
>77 TEXT EQU
$F399 ; mode TEXT
>78 HGR EQU
$F3F2
>79 PROLOGP EQU
$F832
>80 SETCOL EQU
$F864 ; fixe couleur
>81 GBASCALC EQU
$F847 ; calcul adresse ligne
>82 PRNTYX EQU
$F940
>83 PRNTAX EQU
$F941
>84 PRNTX EQU
$F944
>85 PRBLNK EQU
$F948 ; affiche 3 espaces
>86 PRBL2 EQU
$F94A ; affiche le nb d'espace
donné par X
>87 OLDBRK EQU
$FA59
>88 INIT EQU
$FB2F
>89 TABV EQU
$FB5B ; position curseur
>90 BASCALC EQU
$FBC1
>91 BELL2 EQU
$FBE4
>92 VTAB EQU
$FC22 ; Positionne pour affichage text
>93 HOME EQU
$FC58 ; nettoie écran text
>94 WAIT EQU
$FCA8 ; délai attente
>95 RDKEY EQU
$FD0C ; lecture clavier
>96 CROUT EQU
$FD8E ; affiche retour chariot
>97 PRBYTE EQU
$FDDA
>98 COUT EQU
$FDED ; affiche caractère ACC "x"
>99 COUT1 EQU
$FDF0 ; sortie normale CSW
>100 IDENTGS EQU
$FE1F ; routine identifiant un IIGS
>101 SETINV EQU
$FE80 ; inverse
>102 SETNORM EQU
$FE84 ; normal
>103 SETKBD EQU
$FE89
>104 SETVID EQU
$FE93
>105 IN EQU
$FE8B ; IN#
>106 PR EQU
$FE95 ; PR#
>107 BELL EQU
$FF3A ; bip erreur
>108 OLDRST EQU
$FF59
>109 MON EQU
$FF65
>110 MONZ EQU
$FF69 ; call -151
13
USE INCLUDE/INCLUDE.PAGE0
>1
>2 ********************************
>3
*
*
>4 * Adresses de référence page 0 *
>5 * (c)1994 by
Deckard *
>6
*
*
>7 ********************************
>8
>9
>10 STAT EQU
$11 ; flags dernière
opération sur FAC
>11 WNDLFT EQU
$20 ; marge gauche
>12 WNDWDTH EQU
$21 ; largeur
>13 WNDTOP EQU
$22 ; marge haute
>14 WNDBTM EQU
$23 ; marge basse
>15 CH
EQU $24 ;
position horizontale curseur
>16 CV
EQU $25 ;
position verticale curseur
>17 GBASL EQU
$26 ; adr low ligne
calculée par GBASCALC
>18 GBASH EQU
$27 ; adr high ligne
calculée par GBASCALC
>19 BASL EQU
$28 ;
>20 BASH EQU
$29 ;
>21 MASK EQU
$2E ; parité: 0F
(ligne paire), F0 (ligne impaire)
>22 COLOR EQU
$30 ; couleur après
SETCOL ($F864)
>23 INVFLG EQU
$32 ; #$3F=inverse
#$FF=normal
>24 CSWL EQU
$36 ; sortie de
caractères low
>25 CSWH EQU
$37 ; sortie de
caractères high
>26 KSWL EQU
$38 ; entrée de
caractères low
>27 KSWH EQU
$39 ; entrée de
caractères high
>28 A2L EQU
$3E ; adr travail moniteur
>29 A2H EQU
$3F ; adr travail moniteur
>30 A3L EQU
$40 ; adr travail moniteur
>31 A3H EQU
$41 ; adr travail moniteur
>32 A4L EQU
$42 ; adr travail moniteur
>33 A4H EQU
$43 ; adr travail moniteur
>34 LINNUM EQU
$50
>35 TEMPPT EQU
$52
>36 TEMPST EQU
$55
>37 INDEX EQU
$5E
>38 TXTTAB EQU
$67 ; adr début texte
basic
>39 VARTAB EQU
$69 ; adr début des
variables simples
>40 ARYTAB EQU
$6B ; adr début des
variables dimensionnées
>41 STREND EQU
$6D ; début de
l'espace libre
>42 FRETOP EQU
$6F ; et $70
>43 MEMSIZ EQU
$73 ; et $74
>44 CURLIN EQU
$75
>45 VARNAM EQU
$82 ; infos variable
après PTRGET
>46 VARPNT EQU
$83 ; utilisé par
PTRGET
>47 DSCLEN EQU
$8F
>48 HIGHDS EQU
$94
>49 HIGHTR EQU
$96
>50 LOWTR EQU
$9B
>51 FAC EQU
$9D
>52 FACMO EQU
$A0 ; milieu de FAC (used by
STRPRT)
>53 FACSGN EQU
$A2 ; signe FAC
>54 ARG EQU
$A5
>55 PGEND EQU
$AF ; fin du texte basic
>56 CHARGET EQU
$00B1 ; incrémente et lit
caractère
>57 CHARGOT EQU
$00B7 ; lecture caractère only
>58 TXTPTR EQU
$B8 ; pointeur texte
>59 ERRFLG EQU
$D8 ; flag ONERR
>60 ERRNUM EQU
$DE ; numéro erreur
(mli, ...)
>61 ONERR EQU
$D8 ; POUR ON ERR GOTO...
>62 CMDCPT EQU
$EC ; numéro de la
cmd-1 dans la liste
>63 ANL_CPT EQU
$ED ; numéro de liste
>64 CURADR EQU
$EE ; et $EF adresses de la
liste
>65 SPEEDZ EQU
$F1
14
USE INCLUDE/INCLUDE.RDOS
>1
>2 ********************************
>3
*
*
>4 * Définitions RDOS
pour *
>5 * assemblage
static *
>6 * (c)2006 by
Deckard *
>7
*
*
>8 ********************************
>9
>10 * Buffers RDOS
>11
>12 BUFFER1 EQU
$B100 ; $B100-$B1FF
>13 BUFFER2 EQU
$B200 ; $B200-$B2FF
>14
>15 * RWTS + subs
>16
>17 SLOTZ EQU
$27
>18 CSUM EQU
$27
>19 PRIOR EQU
$27
>20 WTEMP EQU
$26
>21 IDX EQU
$26
>22 COUNT EQU
$26
>23 LAST EQU
$26
>24 TRKCNT EQU
$26
>25 SLOTEMP EQU
$2B
>26 TRKN EQU
$2A
>27 SECFND EQU
$2D ; secteur trouvé
>28 TRKFND EQU
$2E ; piste trouvée
>29 DRIVNO EQU
$35 ; bit 7: [0=drive
2,1=drive 1]
>30 BUFADR EQU
$3E ; buffer implantation
>31 IOBPH EQU
$49 ; bit 7: [0=write,1=read]
>32 CURTRK EQU
$0478 ; piste courante
>33 SEEKCNT EQU
$04F8 ; nbr de passes
>34 SLOTABS EQU
$678
>35
>36 * Softswitchs drive
>37
>38 LC088 EQU
$C088 ; arret drive
>39 LC089 EQU
$C089 ; drive on
>40 LC08C EQU
$C08C
>41 LC08D EQU
$C08D
>42 LC08E EQU
$C08E
>43 LC08F EQU
$C08F
15
18
PUT INTERFACE
>1
>2
>3 ********************************
>4
*
*
>5 * INTERFACE RDOS 3.3
SSI *
>6 * (C)1986 by Roland Gustafsson *
>7 * (S)1989-97 by
Deckard *
>8
*
*
>9 ********************************
>10
>11
>12 ********************************
>13
*
*
>14 * Recherche token commande *
>15
*
*
>16 ********************************
>17
>18 * In: acc=caractère ou token
>19
>20
SKTOKEN
B300: 85 46
>21
STA $46 ;
sauvegarde input
B302: A0 FD
>22
LDY #$FD ; $FD+3=0
B304: C8 >23
:1
INY
B305: C8
>24
INY
B306: C8
>25
INY
B307: B9 41 B3
>26
LDA COMMANDES,Y ; commande connue
B30A: F0 0F
>27
BEQ OTHER_CMD ; fin de liste
>28
B30C: C5 46
>29
CMP $46 ; compare
avec input &
B30E: D0 F4
>30
BNE :1 ;
pas le bonne. Skip token+adr pour cmd suivante
>31
B310: B9 43 B3
>32
LDA COMMANDES+2,Y ; empile adr-1 high
B313: 48
>33
PHA
B314: B9 42 B3
>34
LDA COMMANDES+1,Y ; empile adr-1 low
B317: 48
>35
PHA
B318: 4C B1 00
>36
JMP CHARGET ; positionne sur la suite et
exécute commande
>37
B31B: 4C 33 B4 >38 OTHER_CMD JMP
GO_RTS ; commande inconnue. Poursuit l'analyse
ailleurs.
>39
; Par défaut, on ne fait rien de plus (RTS)
>40
>41
>42 *------------------------------*
>43
* infos
auteur *
>44 *------------------------------*
>45
B31E: C3 CF D0
>46
ASC "COPYRIGHT 1986 BY ROLAND GUSTAFSSON"
B321: D9 D2 C9 C7
B325: C8 D4 A0 B1
B329: B9 B8 B6 A0
B32D: C2 D9 A0 D2
B331: CF CC C1 CE
B335: C4 A0 C7 D5
B339: D3 D4 C1 C6
B33D: D3 D3 CF CE
>47
>48
>49 *------------------------------*
>50 * Liste des commandes RDOS 3.3 *
>51 *------------------------------*
>52
>53
COMMANDES
B341: 43
>54
ASC 'C'
B342: 74 B3
>55
DA CAT-1
>56
B344: B6
>57
DFB $B6
B345: A9 B3
>58
DA LOAD-1
>59
B347: AC
>60
DFB $AC
B348: AF B3
>61
DA RUN-1
>62
B34A: AB
>63
DFB $AB
B34B: 74 B4
>64
DA GOTO-1
>65
B34D: B7
>66
DFB $B7
B34E: A9 B4
>67
DA SAVE-1
>68
B350: A8
>69
DFB $A8
B351: 30 B5
>70
DA STORE-1
>71
B353: A7
>72
DFB $A7
B354: 46 B5
>73
DA RECALL-1
>74
B356: B8
>75
DFB $B8
B357: 5F B5
>76
DA DEF-1
>77
B359: BA
>78
DFB $BA
B35A: 87 B5
>79
DA PRINT-1
>80
B35C: 87
>81
DFB $87
B35D: 9D B5
>82
DA READ-1
>83
B35F: 80
>84
DFB $80
B360: C4 B5
>85
DA END-1
>86
B362: 85
>87
DFB $85
B363: C9 B5
>88
DA DEL-1
>89
B365: E3
>90
DFB $E3
B366: E8 B5
>91
DA LEN-1
>92
B368: 44
>93
ASC 'D'
B369: 1F B6
>94
DA D-1
>95
B36B: 53
>96
ASC 'S'
B36C: 2D B6
>97
DA S-1
>98
B36E: BF
>99
DFB $BF
B36F: 4D B6
>100
DA NEW-1
>101
B371: D5
>102
DFB $D5
B372: 82 B6
>103
DA USR-1
>104
B374: 00
>105
DFB 0
; fin de liste
>106
>107
>108 ********************************
>109
*
*
>110 *
Commande &CAT *
>111
*
*
>112 ********************************
>113
>114 * Permet d'obtenir le catalog d'une disquette RDOS
>115 *
>116 * &CAT
>117
B375: 49 C5 >118
CAT EOR
#$C5 ; #$C5 = mot clef de 'AT' (le
'C' est déjà vérifié)
B377: F0 03
>119
BEQ :1 ;
'AT' trouvé
>120
B379: 4C 41 B8
>121
JMP RDOS_ERR+3 ; dos syntax err (&C???)
>122
B37C: 20 B1 00 >123 :1
JSR CHARGET ; positionne sur la suite
>124
>125
CATD
B37F: A9 01
>126
LDA #<$0001 ; bloc 1 (COPY II+:P$00
S$0E)
>127
B381: A0 00 >128 MODULE
LDY #>$0001 ; low=0
B383: 20 FB B8
>129
JSR SAVE_1ER_BLOC ; sauvegarde le numéro de bloc de
&cat
B386: 20 04 B8
>130
JSR LOAD_BLOC ; charge le module dans BUFFER2
>131
B389: A0 03
>132
LDY #3 ;
vérifie que c'est bien un module RDOS
B38B: B9 A6 B3 >133 :1
LDA SIGN_RDOS,Y ; on doit trouvé 'RDOS' au
début du bloc
B38E: D9 00 B2
>134
CMP BUFFER2,Y
B391: D0 10
>135
BNE :3 ;
pas 'RDOS' en préambule (mauvaise disquette)
>136
B393: 88
>137
DEY
; poursuit le controle des 4 lettres
B394: 10 F5
>138
BPL :1
>139
B396: C8
>140
INY
; Y=0
B397: B9 00 B2 >141 :2
LDA BUFFER2,Y ; recopie le module cat en buffer1
B39A: 99 00 B1
>142
STA BUFFER1,Y
B39D: C8
>143
INY
B39E: D0 F7
>144
BNE :2
>145
B3A0: 4C 04 B1
>146
JMP BUFFER1+4 ; exécute module chargé
(skip 'RDOS')
>147
B3A3: 4C 4D B8 >148 :3
JMP RDOS_ERR+15 ; i/o error
>149
>150
>151 *------------------------------*
>152 *
Signature RDOS *
>153 *------------------------------*
>154
B3A6: 52 44 4F >155 SIGN_RDOS ASC 'RDOS'
B3A9: 53
>156
>157
>158 ********************************
>159
*
*
>160 * Commande
&LOAD *
>161
*
*
>162 ********************************
>163
>164 * Permet de charger un programme BASIC
>165 *
>166 * &LOAD "nom" (,adresse)
>167
B3AA: 20 B6 B3 >168 LOAD
JSR LOAD_PRG_BAS ; charge le programme BASIC
B3AD: 4C 6C B6
>169
JMP HOT_BASIC ; redonne la main à l'utilisateur
>170
>171
>172 ********************************
>173
*
*
>174 * Commande
&RUN *
>175
*
*
>176 ********************************
>177
>178 * Permet d'exécuter un programme BASIC
>179 *
>180 * &RUN "nom" (,adresse)
>181
B3B0: 20 B6 B3 >182 RUN
JSR LOAD_PRG_BAS ; charge le programme BASIC
B3B3: 4C 66 D5
>183
JMP RUNPROG ; exécution
>184
>185
>186 ********************************
>187
*
*
>188 * Chargement d'un prog BASIC *
>189
*
*
>190 ********************************
>191
>192
LOAD_PRG_BAS
B3B6: A4 67
>193
LDY TXTTAB ; par défaut,
charge au début du texte BASIC
B3B8: A5 68
>194
LDA TXTTAB+1 ; ($0801 ou autre)
B3BA: 84 50
>195
STY LINNUM
B3BC: 85 51
>196
STA LINNUM+1
B3BE: 20 BA B7
>197
JSR GET_NAME ; lecture nom+adr
éventuelle (si adr spécifiée, alors
>198
; elle est placée dans LINNUM et remplace celle par
>199
; défaut
>200
B3C1: A9 C1
>201
LDA #"A" ; prog BASIC
B3C3: 20 1C B4
>202
JSR CHK_TYPE ; recherche objet dans catalog et
vérifie type
>203
B3C6: A4 50
>204
LDY LINNUM
B3C8: A5 51
>205
LDA LINNUM+1
B3CA: 8C 7A BF
>206
STY OBJ_ADR ; force adr d'implantation
dans descriptif
B3CD: 8D 7B BF
>207
STA OBJ_ADR+1
>208
B3D0: 46 D8
>209
LSR ERRFLG ; bit 7 =0 ->
désactive on error
B3D2: 20 34 B4
>210
JSR LOAD_OBJ ; charge l'objet
>211
B3D5: 18
>212
CLC
; assigne l'adr de début d'implantation comme début
B3D6: A5 50
>213
LDA LINNUM ; du texte basic
B3D8: 85 67
>214
STA TXTTAB
B3DA: 6D 7C BF
>215
ADC OBJ_LEN ; et affecte début des
variables
B3DD: 85 69
>216
STA VARTAB
>217
B3DF: A5 51
>218
LDA LINNUM+1
B3E1: 85 68
>219
STA TXTTAB+1
B3E3: 6D 7D BF
>220
ADC OBJ_LEN+1
B3E6: 85 6A
>221
STA VARTAB+1
>222
B3E8: A0 FF
>223
LDY #$FF ; place la
valeur 0 juste avant le début du texte
B3EA: C6 68
>224
DEC TXTTAB+1 ; basic
B3EC: A9 00
>225
LDA #0
B3EE: 91 67
>226
STA (TXTTAB),Y
B3F0: E6 68
>227
INC TXTTAB+1
>228
B3F2: A4 36
>229
LDY CSWL ; sauvegarde
CSW
B3F4: A5 37
>230
LDA CSWH
B3F6: 84 40
>231
STY $40
B3F8: 85 41
>232
STA $41
>233
B3FA: 68
>234
PLA
; sauvegarde adr-1 retour
B3FB: 85 42
>235
STA $42
B3FD: 68
>236
PLA
B3FE: 85 43
>237
STA $43
>238
B400: A0 0B
>239
LDY #<LOAD_PRG_BAS2 ; adr reprise après linkset
B402: A9 B4
>240
LDA #>LOAD_PRG_BAS2
B404: 84 36
>241
STY CSWL
B406: 85 37
>242
STA CSWH
B408: 4C F2 D4
>243
JMP LINKSET ; init pointeur basic
>244
>245
LOAD_PRG_BAS2
B40B: A5 43
>246
LDA $43 ; remet
adr-1 retour
B40D: 48
>247
PHA
B40E: A5 42
>248
LDA $42
B410: 48
>249
PHA
>250
B411: A4 40
>251
LDY $40 ; remet
CSW
B413: A5 41
>252
LDA $41
B415: 84 36
>253
STY CSWL
B417: 85 37
>254
STA CSWH
B419: 4C 6C D6
>255
JMP CLEARC ; fin init
>256
>257
>258 ********************************
>259
*
*
>260 * Vérifie le type d'un objet *
>261 * du catalog avec le type *
>262
*
attendu
*
>263
*
*
>264 ********************************
>265
B41C: 20 8D B6 >266 CHK_TYPE JSR SEEK_NAME ;
recherche nom objet
B41F: B0 03
>267
BCS :1 ;
nom trouvé
B421: 4C 3E B8
>268
JMP RDOS_ERR ; file not found
>269
B424: F0 03 >270
:1 BEQ
:2 ; type identique
à celui recherché
B426: 4C 50 B8
>271
JMP RDOS_ERR+18 ; file type err
>272
>273 * Recopie le descriptif trouvé dans le catalogue
>274
B429: A0 1F >275
:2 LDY
#31
B42B: B1 3E >276
:3 LDA (BUFADR),Y
B42D: 99 60 BF
>277
STA OBJ_NOM,Y
B430: 88
>278
DEY
B431: 10 F8
>279
BPL :3
>280
GO_RTS
B433: 60
>281
RTS
>282
>283
>284 ********************************
>285
*
*
>286 * Chargement d'un
objet *
>287
*
*
>288 ********************************
>289
B434: AD 7D BF >290 LOAD_OBJ LDA OBJ_LEN+1 ;
calcul nbr de blocs réels utilisés (problème de
B437: 8D 79 BF
>291
STA OBJ_NBR_BLOC ; l'allocation de la place d'un objet
deleté plus
>292
; grand)
>293
B43A: AD 7C BF
>294
LDA OBJ_LEN ; low
B43D: F0 03
>295
BEQ :1 ;
page plein
>296
B43F: EE 79 BF
>297
INC OBJ_NBR_BLOC ; le reliquat compte comme un bloc entier
>298
B442: AD 7A BF >299 :1
LDA OBJ_ADR ; adr de chargement bloc
B445: AC 7B BF
>300
LDY OBJ_ADR+1
>301
B448: A2 01
>302
LDX #1 ;
commande=READ
B44A: CE 79 BF
>303
DEC OBJ_NBR_BLOC ; un bloc en moins (soustraction
anticipée afin
B44D: F0 0C
>304
BEQ :2 ; de
savoir quand on traite le dernier bloc)
>305
B44F: 20 0A B8
>306
JSR CMD_BLOCD ; read bloc à son adresse
définitive
>307
B452: 20 02 B9
>308
JSR READY_NXT_BLK ; positionne sur bloc suivant
B455: EE 7B BF
>309
INC OBJ_ADR+1 ; adr high implantation+1
B458: 4C 42 B4
>310
JMP :1 ; va
traiter ce bloc suivant
>311
B45B: 20 04 B8 >312 :2
JSR LOAD_BLOC ; dernier bloc chargé dans
buffer2
B45E: AD 7A BF
>313
LDA OBJ_ADR ; pointeur en page 0
B461: AC 7B BF
>314
LDY OBJ_ADR+1
B464: 85 3C
>315
STA $3C
B466: 84 3D
>316
STY $3D
>317
B468: A0 00
>318
LDY #0 ;
recopie le reliquat du buffer2 vers sa place
B46A: B1 3E >319
:3 LDA (BUFADR),Y ;
finale
B46C: 91 3C
>320
STA ($3C),Y
B46E: C8
>321
INY
B46F: CC 7C BF
>322
CPY OBJ_LEN
B472: D0 F6
>323
BNE :3
B474: 60
>324
RTS
>325
>326
>327 ********************************
>328
*
*
>329 * Commande
&GOTO *
>330
*
*
>331 ********************************
>332
>333 * Permet de chainer 2 progs en conservant les
données.
>334 * Il faut bien sur que le 2nd programme chargé
soit plus
>335 * petit (ou de meme taille) que le 1er pour ne rien
écraser.
>336 *
>337 * &GOTO "nom" (,adresse)
>338
B475: A9 02 >339
GOTO LDA
#<$0002 ; bloc 2 (COPY II+:P$00 S$0D)
B477: 20 81 B3
>340
JSR MODULE ; load module chain,
test RDOS et exécution
>341
B47A: A2 07
>342
LDX #7 ;
sauvegarde VARTAB, ARYTAB, STREND et FRETOP
B47C: B5 69 >343
:1 LDA
VARTAB,X
B47E: 9D 9D BF
>344
STA PTR_BASIC,X
B481: CA
>345
DEX
B482: 10 F8
>346
BPL :1
>347
B484: 20 B6 B3
>348
JSR LOAD_PRG_BAS ; charge le nouveau prog BASIC à
chainer
>349
B487: A5 6A
>350
LDA VARTAB+1 ; high début des variables
B489: CD 9E BF
>351
CMP PTR_BASIC+1 ; VARTAB+1 ancien prog BASIC
B48C: D0 05
>352
BNE :2 ;
les tailles high des progs sont différentes
>353
; si meme taille, vérifie low
B48E: A5 69
>354
LDA VARTAB ; low début des
variables
B490: CD 9D BF
>355
CMP PTR_BASIC ; VARTAB ancien prog BASIC
>356
B493: 90 05 >357
:2 BCC
:3 ; le nouveau prog
est plus petit
B495: F0 03
>358
BEQ :3 ;
les 2 progs sont de meme taille
>359
B497: 4C 41 B8
>360
JMP RDOS_ERR+3 ; nouveau prog plus grand:dos syntax err
>361
; impossible de récupérer les variables!
>362
B49A: A2 07 >363
:3 LDX
#7 ; assigne au nouveau
programme les pointeurs de
B49C: BD 9D BF >364 :4
LDA PTR_BASIC,X ; variable de l'ancien
B49F: 95 69
>365
STA VARTAB,X
B4A1: CA
>366
DEX
B4A2: 10 F8
>367
BPL :4
>368
B4A4: 20 97 D6
>369
JSR STXTPT ; pointeur chargot en
place (pointe sur $00 au
>370
; début du prog)
B4A7: 4C D2 D7
>371
JMP NEWSTT ; exécute une
nouvelle instruction basic
>372
>373
>374 ********************************
>375
*
*
>376 * Commande
&SAVE *
>377
*
*
>378 ********************************
>379
B4AA: 20 BA B7 >380 SAVE
JSR GET_NAME ; lecture nom objet
B4AD: 90 03
>381
BCC :1 ;
que le nom
>382
B4AF: 4C 41 B8
>383
JMP RDOS_ERR+3 ; dos syntax err (paramètrage
interdit)
>384
B4B2: A5 67 >385
:1 LDA
TXTTAB ; adr début
sauvegarde=début texte basic
B4B4: A4 68
>386
LDY TXTTAB+1
B4B6: 8D 7A BF
>387
STA OBJ_ADR
B4B9: 8C 7B BF
>388
STY OBJ_ADR+1
>389
B4BC: 38
>390
SEC
; détermine taille réelle (fin du texte basic -
B4BD: A5 AF
>391
LDA PGEND ; début du
texte basic). Résultat dans LINNUM
B4BF: E5 67
>392
SBC TXTTAB
B4C1: 85 50
>393
STA LINNUM
B4C3: A5 B0
>394
LDA PGEND+1
B4C5: E5 68
>395
SBC TXTTAB+1
B4C7: 85 51
>396
STA LINNUM+1
>397
B4C9: A9 C1
>398
LDA #"A" ; basic
>399
>400
>401 ********************************
>402
*
*
>403 * Sauvegarde d'un
objet *
>404
*
*
>405 ********************************
>406
>407 * In: acc = type objet
>408 * LINNUM = taille objet
>409
B4CB: 8D 78 BF >410 SAVE_OBJ STA
OBJ_TYPE
>411
B4CE: A6 51
>412
LDX LINNUM+1 ; met en place len objet et le nbr
de bloc utilisé
B4D0: 8E 7D BF
>413
STX OBJ_LEN+1
B4D3: 8E 79 BF
>414
STX OBJ_NBR_BLOC
B4D6: A6 50
>415
LDX LINNUM
B4D8: 8E 7C BF
>416
STX OBJ_LEN
B4DB: F0 03
>417
BEQ :1
>418
B4DD: EE 79 BF
>419
INC OBJ_NBR_BLOC ; reliquat compte pour 1 bloc de plus
>420
B4E0: AE 79 BF >421 :1
LDX OBJ_NBR_BLOC ; sauve le nbr de bloc pour
décompte lors de
B4E3: 8E A7 BF
>422
STX CPT_NBR_BLOC ; l'opération
B4E6: D0 03
>423
BNE :2
>424
B4E8: 4C 41 B8
>425
JMP RDOS_ERR+3 ; dos syntax err (longueur nulle!)
>426
B4EB: 20 8D B6 >427 :2
JSR SEEK_NAME ; regarde si le nom existe
déjà dans le catalog
B4EE: 90 03
>428
BCC :3 ; non
>429
B4F0: 4C 44 B8
>430
JMP RDOS_ERR+6 ; duplicate entry (l'objet existe
déjà!)
>431
B4F3: 20 92 B6 >432 :3
JSR SEEK_FREE ; cherche une place libre
B4F6: B0 03
>433
BCS :4 ;
place trouvée
>434
B4F8: 4C 47 B8
>435
JMP RDOS_ERR+9 ; disk full
>436
B4FB: AD 79 BF >437 :4
LDA OBJ_NBR_BLOC
B4FE: 20 0B B9
>438
JSR CHK_SPACE ; vérifie que la place
trouvée est assez grande
>439
B501: A0 1F
>440
LDY #31 ; place
le descriptif de l'objet à créer dans
B503: B9 60 BF >441 :5
LDA OBJ_NOM,Y ; le bloc du catalogue
B506: 91 3E
>442
STA (BUFADR),Y
B508: 88
>443
DEY
B509: 10 F8
>444
BPL :5
>445
B50B: A9 02
>446
LDA #2
B50D: 8D 59 BF
>447
STA RWTS_CMD ; commande=ECRIRE
B510: 20 2F B8
>448
JSR GO_RWTS: ; enregistre la modif dans le
catalog
>449
>450 * Ecriture de l'objet sur la disquette
>451
B513: A2 02 >452
:6 LDX
#2 ; commande=WRITE
B515: AD 7A BF
>453
LDA OBJ_ADR
B518: AC 7B BF
>454
LDY OBJ_ADR+1
B51B: 20 0A B8
>455
JSR CMD_BLOCD ; écriture d'un bloc
B51E: 20 02 B9
>456
JSR READY_NXT_BLK ; positionne sur next bloc
>457
B521: AD 78 BF
>458
LDA OBJ_TYPE
B524: C9 D4
>459
CMP #"T" ; fichier?
B526: F0 03
>460
BEQ :7 ;
oui (pas de changement adr début)
>461
B528: EE 7B BF
>462
INC OBJ_ADR+1
>463
B52B: CE A7 BF >464 :7
DEC CPT_NBR_BLOC ; un bloc de moins
B52E: D0 E3
>465
BNE :6 ; il
reste encore des blocs
>466
B530: 60
>467
RTS
>468
>469
>470 ********************************
>471
*
*
>472 * Commande
&STORE *
>473
*
*
>474 ********************************
>475
>476 * Permet de sauvegarder un programme binaire
commançant
>477 * à une certaine adresse et d'une taille
donnée.
>478 *
>479 * &STORE "nom", adresse, longueur
>480
B531: 20 BA B7 >481 STORE JSR
GET_NAME ; lecture nom objet
B534: B0 03
>482
BCS :1 ;
nom+paramètre
>483
B536: 4C 41 B8
>484
JMP RDOS_ERR+3 ; dos syntax err (adresse indispensable!)
>485
B539: 8C 7A BF >486 :1
STY OBJ_ADR ; sauve adresse lue
B53C: 8D 7B BF
>487
STA OBJ_ADR+1
B53F: 20 F9 B7
>488
JSR GET_VAL ; lecture longueur (dans
LINNUM)
>489
>490
STORED
B542: A9 C2
>491
LDA #"B" ; binaire
B544: 4C CB B4
>492
JMP SAVE_OBJ ; sauvegarde l'objet
>493
>494
>495 ********************************
>496
*
*
>497 * Commande
&RECALL *
>498
*
*
>499 ********************************
>500
>501 * Permet de charger un objet binaire.
>502 *
>503 * &RECALL "nom" (,adresse)
>504
B547: 20 BA B7 >505 RECALL JSR
GET_NAME ; lecture nom et adr éventuelle
>506
>507
RECALLD
B54A: 08
>508
PHP
; sauve résultat
B54B: A9 C2
>509
LDA #"B"
B54D: 20 1C B4
>510
JSR CHK_TYPE ; recherche obj dans catalog et
vérifie binaire
B550: 28
>511
PLP
; récupère résultat
>512
B551: 90 0A
>513
BCC :1 ;
que le nom
>514
B553: A5 50
>515
LDA LINNUM ; prend en compte adr de
chargement spécifiée
B555: A4 51
>516
LDY LINNUM+1
B557: 8D 7A BF
>517
STA OBJ_ADR
B55A: 8C 7B BF
>518
STY OBJ_ADR+1
>519
B55D: 4C 34 B4 >520 :1
JMP LOAD_OBJ
>521
>522
>523 ********************************
>524
*
*
>525 * Commande
&DEF *
>526
*
*
>527 ********************************
>528
>529 * Permet de réserver un nbr de blocs pour un objet.
>530 *
>531 * &DEF "nom", nbr de blocs [1,255]
>532
B560: 20 BA B7 >533 DEF
JSR GET_NAME ; lecture nom objet
B563: B0 03
>534
BCS :1 ;
nom+taille
>535
B565: 4C 41 B8 >536 :2
JMP RDOS_ERR+3 ; dos syntax err (pas de taille ou >255
blocs)
>537
B568: A5 51 >538
:1 LDA
LINNUM+1 ; high taille
B56A: D0 F9
>539
BNE :2 ;
allocation trop importante
>540
B56C: AA
>541
TAX
; X=0
B56D: A4 50
>542
LDY LINNUM ; transforme un nbr de
blocs en taille
B56F: 84 51
>543
STY LINNUM+1 ; 1 bloc=$0100
B571: 86 50
>544
STX LINNUM
>545
B573: 9D 00 B1 >546 :3
STA BUFFER1,X ; nettoyage buffer1
B576: E8
>547
INX
B577: D0 FA
>548
BNE :3
>549
B579: A0 00
>550
LDY #<BUFFER1 ; On écrira de 1 à 255
fois le buffer1
B57B: A9 B1
>551
LDA #>BUFFER1
B57D: 8C 7A BF
>552
STY OBJ_ADR ; adr début lecture
B580: 8D 7B BF
>553
STA OBJ_ADR+1
B583: A9 D4
>554
LDA #"T" ; fichier
B585: 4C CB B4
>555
JMP SAVE_OBJ ; sauve le fichier
>556
>557
>558 ********************************
>559
*
*
>560 * Commande
&PRINT *
>561
*
*
>562 ********************************
>563
>564 * Permet de faire un append d'un fichier existant
>565 * afin d'y inséerer des infos nouvelles avec des
print.
>566 * Il faut faire un &END pour arreter.
>567 *
>568 * &PRINT "nom"
>569
B588: 20 BA B7 >570 PRINT JSR
GET_NAME ; lecture nom
B58B: 20 03 B7
>571
JSR SAVE_CSW_KSW ; sauvegarde CSW/KSW
>572
B58E: A9 D4
>573
LDA #"T"
B590: 20 1C B4
>574
JSR CHK_TYPE ; vérifie existance objet
et type fichier
>575
B593: C8
>576
INY
; Y=0
B594: 8C A8 BF
>577
STY IND_BUF ; remplit le buffer à
partir du début
B597: 38
>578
SEC
; bit 7=1
B598: 6E A9 BF
>579
ROR READ_OR_PRINT ; signale commande print
B59B: 4C 19 B7
>580
JMP SET_PRT_VECT ; change CSW/KSW pour gestion print
>581
>582
>583 ********************************
>584
*
*
>585 * Commande
&READ *
>586
*
*
>587 ********************************
>588
>589 * Permet d'ouvrir un fichier existant afin d'en
>590 * lire le contenu avec des input.
>591 * Il faut faire un &END pour arreter.
>592 *
>593 * &READ "nom"
>594
B59E: 20 BA B7 >595 READ
JSR GET_NAME ; lecture nom objet
>596
>597
READD
B5A1: 20 03 B7
>598
JSR SAVE_CSW_KSW ; sauve CSW/KSW
B5A4: A9 D4
>599
LDA #"T"
B5A6: 20 1C B4
>600
JSR CHK_TYPE ; recherche nom et controle type
>601
B5A9: 8C A8 BF
>602
STY IND_BUF ; Y=$FF force lecture 1er
bloc au début trt
>603
B5AC: 18
>604
CLC
; bit 7=0
B5AD: 6E A9 BF
>605
ROR READ_OR_PRINT ; identification commande read
>606
B5B0: AD 7E BF
>607
LDA OBJ_1ER_BLOC ; commence la lecture sur 1er bloc fichier
B5B3: AC 7F BF
>608
LDY OBJ_1ER_BLOC+1
B5B6: 8D A5 BF
>609
STA VAL_BLOCNUM
B5B9: 8C A6 BF
>610
STY VAL_BLOCNUM+1
B5BC: AD 79 BF
>611
LDA OBJ_NBR_BLOC ; init nbr de blocs pouvant etre lu
B5BF: 8D A7 BF
>612
STA CPT_NBR_BLOC
B5C2: 4C 1C B7
>613
JMP SET_READ_VECT ; change vecteurs pour traitement read
>614
>615
>616 ********************************
>617
*
*
>618 *
Commande &END *
>619
*
*
>620 ********************************
>621
>622 * Permet de terminer un instruction &PRINT ou
&READ
>623
B5C5: A9 00 >624
END LDA
#0 ; output $00 (null)
B5C7: 4C ED FD
>625
JMP COUT
>626
>627
>628 ********************************
>629
*
*
>630 * Commande
&DEL *
>631
*
*
>632 ********************************
>633
>634 * Permet de supprimer un objet (provoque un trou
>635 * réutilisable dans le catalog.
>636 *
>637 * &DEL "nom"
>638
B5CA: 20 BA B7 >639 DEL
JSR GET_NAME ; lecture nom
>640
>641
DELD
B5CD: 20 8D B6
>642
JSR SEEK_NAME ; recherche nom dans le catalog
B5D0: B0 03
>643
BCS :1 ;
trouvé
>644
B5D2: 4C 3E B8
>645
JMP RDOS_ERR ; file not found
>646
B5D5: A0 00 >647
:1 LDY
#0
B5D7: A9 80
>648
LDA #$80 ; met $80
à la place du 1er caractère du nom
B5D9: 91 3E
>649
STA (BUFADR),Y
>650
B5DB: A0 18
>651
LDY #24
B5DD: A9 A0
>652
LDA #" " ; efface le
type objet
B5DF: 91 3E
>653
STA (BUFADR),Y
>654
B5E1: A9 02
>655
LDA #2
B5E3: 8D 59 BF
>656
STA RWTS_CMD ; commande=WRITE
B5E6: 4C 2F B8
>657
JMP GO_RWTS: ; modifie le descriptif catalog
>658
>659
>660 ********************************
>661
*
*
>662 * Commande
&LEN *
>663
*
*
>664 ********************************
>665
>666 * Permet de connaitre en décimal l'adr de
début d'un
>667 * programme BASIC, sa taille et l'adr de début des
>668 * variables.
>669 *
>670 * &LEN
>671
B5E9: A2 67 >672
LEN LDX
#TXTTAB ; affiche adr début texte basic
B5EB: 20 0E B6
>673
JSR PRINT_PTR
B5EE: 20 1B B6
>674
JSR PRINT_VIRGULE
>675
B5F1: A2 50
>676
LDX #LINNUM
B5F3: 38
>677
SEC
; calcule taille prog basic
B5F4: A5 AF
>678
LDA PGEND ; fin texte
basic-début texte basic -> LINNUM
B5F6: E5 67
>679
SBC TXTTAB
B5F8: 85 50
>680
STA LINNUM
B5FA: A5 B0
>681
LDA PGEND+1
B5FC: E5 68
>682
SBC TXTTAB+1
B5FE: 85 51
>683
STA LINNUM+1
B600: 20 0E B6
>684
JSR PRINT_PTR ; affiche LINNUM (=taille)
B603: 20 1B B6
>685
JSR PRINT_VIRGULE
B606: A2 69
>686
LDX #VARTAB ; affiche adr début
des variables
B608: 20 0E B6
>687
JSR PRINT_PTR
B60B: 4C FB DA
>688
JMP CRDO
>689
>690 *------------------------------*
>691 * Affiche un pointeur page 0 *
>692 *------------------------------*
>693
>694 * In: X=pointeur à afficher
>695
>696
PRINT_PTR
B60E: B5 01
>697
LDA $01,X
B610: A8
>698
TAY
B611: B5 00
>699
LDA $00,X
B613: AA
>700
TAX
B614: 98
>701
TYA
B615: 20 24 ED
>702
JSR LINPRT ; affiche nbr en
décimal X(-) A(+)
B618: 4C 57 DB
>703
JMP OUTSP ; affiche espace
>704
>705
PRINT_VIRGULE
B61B: A9 2C
>706
LDA #','
B61D: 4C 5C DB
>707
JMP OUTDO
>708
>709
>710 ********************************
>711
*
*
>712 * Commande
&D *
>713
*
*
>714 ********************************
>715
>716 * Permet de changer le numéro du lecteur courant.
>717 *
>718 * &D numéro drive, (autre commande RDOS)
>719
B620: A2 03 >720
D LDX
#2+1 ; nombre max+1
B622: 20 3D B6
>721
JSR GET_NUM ; lecture numéro
lecteur+vérif cohérence
B625: 8E 57 BF
>722
STX RWTS_DRIVE ; sauve le nouveau drive courant
>723
B628: 20 BE DE >724 NEXT_CMD JSR
CHKCOM ; virgule obligatoire
B62B: 4C 00 B3
>725
JMP SKTOKEN ; traite éventuelle
autre commande
>726
>727
>728 ********************************
>729
*
*
>730 *
Commande &S *
>731
*
*
>732 ********************************
>733
>734 * Permet de changer le slot du drive courant.
>735 *
>736 * &S numéro slot, (autre commande RDOS)
>737
B62E: A2 08 >738
S LDX
#7+1 ; nbr max+1
B630: 20 3D B6
>739
JSR GET_NUM ; lecture slot et
vérifie cohérence
B633: 8A
>740
TXA
; slot*16
B634: 0A
>741
ASL
B635: 0A
>742
ASL
B636: 0A
>743
ASL
B637: 0A
>744
ASL
B638: 8D 56 BF
>745
STA RWTS_SLOT16
B63B: 90 EB
>746
BCC NEXT_CMD ; vérifie vrigule et traite
autre cmd
>747
>748 *------------------------------*
>749 * Lecteur nombre de 1 octet *
>750 *------------------------------*
>751
>752 * In: X=valeur max+1
>753
B63D: 86 46 >754 GET_NUM
STX $46
B63F: 20 F8 E6
>755
JSR GETBYT ; lecture
paramètre
B642: E0 01
>756
CPX #1 ;
controle cohérence
B644: 90 05
>757
BCC :1 ;
<1 err
>758
B646: E4 46
>759
CPX $46
B648: B0 01
>760
BCS :1 ;
>=valeur max+1 err
B64A: 60
>761
RTS
>762
B64B: 4C 99 E1 >763 :1
JMP IQERR ; illegal quantity
err
>764
>765
>766 ********************************
>767
*
*
>768 *
Commande &NEW *
>769
*
*
>770 ********************************
>771
>772 * Permet de supprimer le prog basic en mémoire et
>773 * de réinitialiser l'espace mémoire (himem).
>774 *
>775 * &NEW
>776
>777
NEW
B64E: 20 03 B7
>778
JSR SAVE_CSW_KSW ; sauve CSW/KSW
B651: A0 5C
>779
LDY #<NEW2 ; pointeur reprise
B653: A9 B6
>780
LDA #>NEW2
B655: 84 38
>781
STY KSWL
B657: 85 39
>782
STA KSWH
B659: 4C 00 E0
>783
JMP BASIC ; lancement
indirect de NEW2
>784
B65C: 91 28 >785
NEW2 STA (BASL),Y
B65E: A0 00
>786
LDY #<BUFFER1 ; himem:buffer1
B660: A9 B1
>787
LDA #>BUFFER1
B662: 84 73
>788
STY MEMSIZ
B664: 85 74
>789
STA MEMSIZ+1
B666: 20 0E B7
>790
JSR REST_CSW_KSW ; remet en place CSW/KSW origine
B669: 20 4B D6
>791
JSR NEWCMD ; new normal
>792
; et hot basic
>793
>794
>795 ********************************
>796
*
*
>797 * BASIC
à chaud *
>798
*
*
>799 ********************************
>800
>801 * Avant de sauter sur le BASIC à chaud, il
>802 * faut obligatoirement vérifier qu'il est
présent.
>803 *
>804 * AppleSoft: $E000 = JMP ($4C)
>805 * Integer : $E000 = JSR ($20)
>806 *
>807 * Si le BASIC AppleSoft n'est pas trouvé en ROM
($C081)
>808 * on le recherche dans le bank 2 ($C080)
>809
>810
HOT_BASIC
B66C: 20 72 B6
>811
JSR CHK_APLSFT ; vérifie présence BASIC
Applesoft
B66F: 4C 03 E0
>812
JMP BASIC2 ; relance BASIC
>813
>814
CHK_APLSFT
B672: A2 01
>815
LDX #1 ;
privilégie la ROM
B674: BD 80 C0 >816 :1
LDA $C080,X
B677: AD 00 E0
>817
LDA BASIC ; test signature
AppleSoft
B67A: C9 4C
>818
CMP #$4C ; JMP
B67C: F0 0E
>819
BEQ GO_RTS2 ; found! -> RTS
>820
B67E: CA
>821
DEX
; essaie bank 2
B67F: F0 F3
>822
BEQ :1
>823
B681: D0 FE >824
:2 BNE
:2 ; ça coince
mec! Y-a pas d'AppleSoft!!
>825
>826
>827 ********************************
>828
*
*
>829 * Commande
&USR *
>830
*
*
>831 ********************************
>832
>833 * Cette commande permet de définir une adresse de
>834 * saut si la commande & n'est pas reconnue. Au lieu
>835 * de faire un RTS, on donne la main à une autre
routine.
>836 *
>837 * &USR adresse
>838
B683: 20 FC B7 >839 USR
JSR GET_VALD ; lecture adresse (sans test
virgule)
B686: 8C 1C B3
>840
STY OTHER_CMD+1 ; met en place JMP de substitution
B689: 8D 1D B3
>841
STA OTHER_CMD+2
B68C: 60 >842
GO_RTS2
RTS
>843
>844
>845 ********************************
>846
*
*
>847 * Cherche un objet dans le *
>848 *
catalogue *
>849
*
*
>850 ********************************
>851
>852 * In: acc = type objet recherché
[A,B,T]
>853 *
>854 * Out: carry = 0 nom introuvable (fin catalog atteint)
>855 * carry = 1 nom
trouvé
>856
*
Z=1 (BEQ) -> type concordant
>857
*
Z=0 (BNE) -> type différent
>858
>859
SEEK_NAME
B68D: 18
>860
CLC
; cherche objet
B68E: 8D 78 BF
>861
STA OBJ_TYPE
>862
B691: 24
>863
DFB $24 ; bit
>864
>865 ********************************
>866
*
*
>867 * Cherche une place vide avec *
>868 * suffisemment de
place *
>869
*
*
>870 ********************************
>871
>872 * Out: carry = 0 pas de place libre assez grande
>873 * carry = 1 place libre
trouvée
>874
>875
SEEK_FREE
B692: 38
>876
SEC
; cherche place vide
B693: 6E 9B BF
>877
ROR VALEUR ; carry dans bit 7
>878
B696: 20 F7 B8
>879
JSR READY_CATALOG ; pointe sur 1er bloc du catalogue
>880
B699: 8C 97 BF
>881
STY NEXT_1ER_BLOC+1 ; =0 init 1er bloc objet suivant
B69C: 8C 96 BF
>882
STY NEXT_1ER_BLOC ; =0
>883
>884
LOAD_CAT_BLOC
B69F: 20 04 B8
>885
JSR LOAD_BLOC ; charge 1 bloc du catalog dans buffer2
>886
>887 * Aiguille sur le type de recherche voulu
>888
B6A2: 2C 9B BF >889 SEEK_OPT BIT
VALEUR ; test bit 7
B6A5: 10 1C
>890
BPL SEEK_NAME2 ; =0 -> cherche nom d'objet
>891
>892 *------------------------------*
>893 * Recherche place
vide *
>894 *------------------------------*
>895
B6A7: A0 18
>896
LDY #24 ; type
objet
B6A9: B1 3E
>897
LDA (BUFADR),Y
B6AB: D0 08
>898
BNE :2 ;
rempli
>899
B6AD: AD 79 BF
>900
LDA OBJ_NBR_BLOC
B6B0: 8D 79 BF >901 :1
STA OBJ_NBR_BLOC ; taille demandée ou taille objet
prédécent obj del
B6B3: 38
>902
SEC
; place trouvée
B6B4: 60
>903
RTS
>904
B6B5: C9 A0 >905
:2 CMP #"
" ; type=espace -> objet
supprimé
B6B7: D0 21
>906
BNE SEEK_NEXT ; non, la place est prise
>907
B6B9: C8
>908
INY
B6BA: B1 3E
>909
LDA (BUFADR),Y ; nbr de bloc utilisé par l'objet
supprimé
B6BC: CD 79 BF
>910
CMP OBJ_NBR_BLOC
B6BF: B0 EF
>911
BCS :1 ;
suffisement de place. Réserve toute la place vide
>912
; meme s'il y en a plus que nécessaire
B6C1: 90 17
>913
BCC SEEK_NEXT ; pas assez de place
>914
>915
>916 *------------------------------*
>917 * Recherche nom dans un bloc *
>918 *------------------------------*
>919
>920
SEEK_NAME2
B6C3: A0 00
>921
LDY #0 ;
1er caractère du nom
B6C5: B1 3E >922
:1 LDA (BUFADR),Y
B6C7: F0 38
>923
BEQ FIN_CAT ; =0 si fin catalog
>924
B6C9: D9 60 BF
>925
CMP OBJ_NOM,Y ; compare avec caractère de
l'objet recherché
B6CC: D0 0C
>926
BNE SEEK_NEXT ; pas le bon nom. Passe au suivant
>927
B6CE: C8
>928
INY
B6CF: C0 18
>929
CPY #24 ; compare
tous les caractères
B6D1: 90 F2
>930
BCC :1
>931
B6D3: B1 3E
>932
LDA (BUFADR),Y ; compare le nom du type trouvé avec
celui de
B6D5: CD 78 BF
>933
CMP OBJ_TYPE ; l'objet recherché
(résultat dans Z)
B6D8: 38
>934
SEC
; objet trouvé
B6D9: 60
>935
RTS
>936
>937
>938 *------------------------------*
>939 * Passage à l'objet suivant *
>940 *------------------------------*
>941
>942 * Calcule le 1er numéro de bloc de l'objet suivant
>943
>944
SEEK_NEXT
B6DA: A0 19
>945
LDY #25 ; nbr de
bloc utilisés
B6DC: B1 3E
>946
LDA (BUFADR),Y
B6DE: A0 1E
>947
LDY #30
B6E0: 18
>948
CLC
; +numéro 1er bloc
B6E1: 71 3E
>949
ADC (BUFADR),Y ; low
B6E3: 8D 96 BF
>950
STA NEXT_1ER_BLOC
B6E6: C8
>951
INY
B6E7: B1 3E
>952
LDA (BUFADR),Y ; high
B6E9: 69 00
>953
ADC #$00 ; retenue
B6EB: 8D 97 BF
>954
STA NEXT_1ER_BLOC+1
>955
>956 * Pointe sur le descriptif suivant du catalog
>957
B6EE: A5 3E
>958
LDA BUFADR ; un descriptif fait 32
octets
B6F0: 18
>959
CLC
B6F1: 69 20
>960
ADC #32
B6F3: 85 3E
>961
STA BUFADR
B6F5: 90 AB
>962
BCC SEEK_OPT ; pas encore la fin du bloc
>963
>964 * Passe au bloc suivant
>965
B6F7: EE 7E BF
>966
INC OBJ_1ER_BLOC ; next bloc du catalog
B6FA: AD 7E BF
>967
LDA OBJ_1ER_BLOC
B6FD: C9 20
>968
CMP #<$0020 ; bloc 32 (piste $02
secteur $00)
B6FF: D0 9E
>969
BNE LOAD_CAT_BLOC ; il reste encore des blocs du catalog
à explorer
>970
B701: 18 >971
FIN_CAT
CLC
; fin du catalog atteint
B702: 60
>972
RTS
>973
>974
>975 ********************************
>976
*
*
>977 * Sauve vecteurs output/input *
>978
*
*
>979 ********************************
>980
>981
SAVE_CSW_KSW
B703: A2 03
>982
LDX #3
B705: B5 36 >983
:1 LDA
CSWL,X
B707: 9D AA BF
>984
STA VECT_CSW_KSW,X
B70A: CA
>985
DEX
B70B: 10 F8
>986
BPL :1
B70D: 60
>987
RTS
>988
>989
>990 ********************************
>991
*
*
>992 * Restaure
output/input *
>993
*
*
>994 ********************************
>995
>996
REST_CSW_KSW
B70E: A2 03
>997
LDX #3
B710: BD AA BF >998 :1
LDA VECT_CSW_KSW,X
B713: 95 36
>999
STA CSWL,X
B715: CA
>1000
DEX
B716: 10 F8
>1001
BPL :1
B718: 60
>1002
RTS
>1003
>1004
>1005 ********************************
>1006
*
*
>1007 * Met en place vecteurs PRINT *
>1008
*
*
>1009 ********************************
>1010
>1011
SET_PRT_VECT
B719: A0 03
>1012
LDY #3
B71B: 2C
>1013
DFB $2C ; bit
>1014
>1015 ********************************
>1016
*
*
>1017 * Met en place vecteurs READ *
>1018
*
*
>1019 ********************************
>1020
>1021
SET_READ_VECT
B71C: A0 07
>1022
LDY #7
B71E: A2 03
>1023
LDX #3 ;
change CSW/KSW
B720: B9 2A B7 >1024 :1
LDA NEW_VECT,Y
B723: 95 36
>1025
STA CSWL,X
B725: 88
>1026
DEY
B726: CA
>1027
DEX
; 4 octets
B727: 10 F7
>1028
BPL :1
B729: 60
>1029
RTS
>1030
>1031 * Nouveaux vecteurs
>1032
B72A: 32 B7 >1033 NEW_VECT DA
TRT_IN_OUT ; csw print
B72C: 41 B8
>1034
DA RDOS_ERR+3 ; ksw print (input interdit:dos syntax
err)
B72E: B2 B7
>1035
DA TRT_READ_OUT ; csw read
B730: 32 B7
>1036
DA TRT_IN_OUT ; ksw read
>1037
>1038
>1039 ********************************
>1040
*
*
>1041 * Traitement PRINT (out) *
>1042 * Traitement READ
(in) *
>1043
*
*
>1044 ********************************
>1045
>1046
TRT_IN_OUT
B732: 8D 9B BF
>1047
STA VALEUR
B735: 98
>1048
TYA
; sauve registres Y,X
B736: 48
>1049
PHA
B737: 8A
>1050
TXA
B738: 48
>1051
PHA
>1052
>1053 * Aiguille sur traitement
>1054
B739: 2C A9 BF
>1055
BIT READ_OR_PRINT
B73C: 10 2F
>1056
BPL TRT_IN ; bit 7=0 -> read
>1057
>1058 *------------------------------*
>1059 * Traitement
PRINT *
>1060 *------------------------------*
>1061
>1062 * Remplit le buffer avec le caractère lu. On effectue
>1063 * l'enregistrement du bloc que lorsque le buffer est
>1064 * rempli.
>1065
B73E: AC A8 BF >1066 TRT_OUT LDY
IND_BUF ; indice courant
B741: AD 9B BF
>1067
LDA VALEUR ; place la valeur
à écrire
B744: 99 00 B2
>1068
STA BUFFER2,Y
B747: F0 07
>1069
BEQ :1 ;
&END
>1070
B749: EE A8 BF
>1071
INC IND_BUF ; indice suivant buffer
B74C: F0 07
>1072
BEQ :2 ;
buffer plein
B74E: D0 15
>1073
BNE TRT_FIN ; le buffer peut encore
contenir des données
>1074
B750: A9 01 >1075
:1 LDA
#1 ; 1 bloc à
ecrire et c'est fini
B752: 8D 79 BF
>1076
STA OBJ_NBR_BLOC
>1077
B755: A2 02 >1078
:2 LDX
#2 ; commande=WRITE
B757: 20 06 B8
>1079
JSR CMD_BLOC ; sauve bloc
B75A: 20 02 B9
>1080
JSR READY_NXT_BLK ; positionne sur bloc suivant
>1081
B75D: CE 79 BF
>1082
DEC OBJ_NBR_BLOC ; un bloc disponible en moins
B760: D0 03
>1083
BNE TRT_FIN ; il y a encore de la place
>1084
>1085
; tous les blocs sont remplis: force l'arret.
B762: 20 0E B7
>1086
JSR REST_CSW_KSW ; restaure vecteurs CSW/KSW d'origine
>1087
B765: 68 >1088 TRT_FIN
PLA
; retour à l'appelant
B766: AA
>1089
TAX
B767: 68
>1090
PLA
B768: A8
>1091
TAY
B769: AD 9B BF
>1092
LDA VALEUR
B76C: 60
>1093
RTS
>1094
>1095
>1096 *------------------------------*
>1097 * Traitement
READ *
>1098 *------------------------------*
>1099
B76D: A9 A0 >1100 TRT_IN
LDA #" " ; efface
résultat de CSW
B76F: 91 28
>1101
STA (BASL),Y
B771: EE A8 BF
>1102
INC IND_BUF ; indice suivant buffer
B774: D0 22
>1103
BNE :2 ;
pas fini
>1104
>1105 * Chargement du bloc suivant (ou du 1er) contenant
>1106 * les infos à extraire.
>1107
B776: AD A5 BF
>1108
LDA VAL_BLOCNUM
B779: AC A6 BF
>1109
LDY VAL_BLOCNUM+1
B77C: 20 FB B8
>1110
JSR SAVE_1ER_BLOC
>1111
B77F: A2 01
>1112
LDX #1 ;
commande=READ
B781: A9 00
>1113
LDA #<BUFFER1
B783: A0 B1
>1114
LDY #>BUFFER1
B785: 20 0A B8
>1115
JSR CMD_BLOCD ; load bloc dans buffer1
>1116
B788: EE A5 BF
>1117
INC VAL_BLOCNUM ; positionne sur le suivant
B78B: D0 03
>1118
BNE :1
B78D: EE A6 BF
>1119
INC VAL_BLOCNUM+1
>1120
B790: CE A7 BF >1121 :1
DEC CPT_NBR_BLOC ; un bloc lu en +
B793: 10 03
>1122
BPL :2 ; il
reste des blocs
>1123
; on a traité le dernier bloc
B795: 4C 0E B7
>1124
JMP REST_CSW_KSW ; restaure CSW/KSW d'origine
>1125
>1126 * Lecture caractère à l'indice actuel
>1127
B798: AC A8 BF >1128 :2
LDY IND_BUF
B79B: B9 00 B1
>1129
LDA BUFFER1,Y
B79E: F0 0C
>1130
BEQ :3 ; eof
>1131
B7A0: C9 E0
>1132
CMP #$E0 ; mise en forme
B7A2: 90 02
>1133
BCC :4
B7A4: 29 7F
>1134
AND #%01111111
>1135
B7A6: 8D 9B BF >1136 :4
STA VALEUR
B7A9: 4C 65 B7
>1137
JMP TRT_FIN ; attend la suite
>1138
B7AC: 20 0E B7 >1139 :3
JSR REST_CSW_KSW ; restaure CSW/KSW
B7AF: 4C 4A B8
>1140
JMP RDOS_ERR+12 ; out of data
>1141
>1142
>1143 ********************************
>1144
*
*
>1145 * Traitement READ
(out) *
>1146
*
*
>1147 ********************************
>1148
>1149
TRT_READ_OUT
B7B2: C9 00
>1150
CMP #0 ;
attente &END
B7B4: D0 03
>1151
BNE :1 ;
pas encore
>1152
B7B6: 4C 0E B7
>1153
JMP REST_CSW_KSW ; remet les pointeurs in/out d'origine
>1154
B7B9: 60 >1155
:1
RTS
>1156
>1157
>1158 ********************************
>1159
*
*
>1160 * Lecture d'un nom d'objet *
>1161
*
*
>1162 ********************************
>1163
>1164 * Out: carry = 0 -> que le nom
>1165 * carry = 1 ->
nom+paramètre
>1166
B7BA: A9 55 >1167 GET_NAME LDA
#$55 ; évaluation de
l'expression ("nom" ou variable
B7BC: 85 52
>1168
STA TEMPPT ; alpha ou
combinaisons...)
B7BE: 20 7B DD
>1169
JSR FRMEVL
B7C1: 20 6C DD
>1170
JSR CHKSTR
>1171
B7C4: A0 02
>1172
LDY #2 ;
place le descriptif de l'évaluation dans TEMPST
B7C6: B1 A0 >1173
:1 LDA (FACMO),Y
; TEMPST : longueur
B7C8: 99 55 00
>1174
STA TEMPST,Y ; TEMPST+1: adr low début
chaine
B7CB: 88
>1175
DEY
; TEMPST+2: adr high début chaine
B7CC: 10 F8
>1176
BPL :1
B7CE: C8
>1177
INY
; Y=0
>1178
>1179 * Examen du nom de l'objet et mise en place définitive
>1180
B7CF: B1 56 >1181
:2 LDA (TEMPST+1),Y ;
test validité caractère
B7D1: 09 80
>1182
ORA #%10000000
B7D3: C9 A0
>1183
CMP #" "
B7D5: B0 03
>1184
BCS :3 ; si
> espace -> caractère normal ok
B7D7: 4C 99 E1
>1185
JMP IQERR ; caractère
interdit -> illegal quantity
>1186
B7DA: 99 60 BF >1187 :3
STA OBJ_NOM,Y ; sauvegarde du nom final
B7DD: C8
>1188
INY
B7DE: C0 18
>1189
CPY #24 ; a-t'on
fait les 24 caractères?
B7E0: F0 0E
>1190
BEQ :4 ; oui
>1191
B7E2: C4 55
>1192
CPY TEMPST ; longueur atteinte?
B7E4: 90 E9
>1193
BCC :2 ;
pas encore
>1194
>1195 * Complète avec des blancs le nom final s'il fait moins
>1196 * de 24 caractères.
>1197
B7E6: A9 A0
>1198
LDA #" "
B7E8: 99 60 BF >1199 :5
STA OBJ_NOM,Y ; remplissage
B7EB: C8
>1200
INY
B7EC: C0 18
>1201
CPY #24
B7EE: 90 F8
>1202
BCC :5
>1203
B7F0: 20 B7 00 >1204 :4
JSR CHARGOT ; charge le caractère
avec l'expression
B7F3: C9 2C
>1205
CMP #',' ;
paramètrage complémentaire?
B7F5: F0 02
>1206
BEQ GET_VAL ; oui: prise en compte
>1207
B7F7: 18
>1208
CLC
; signale lecture nom seul
B7F8: 60
>1209
RTS
>1210
>1211 ********************************
>1212
*
*
>1213 * Lecture valeur après virgule *
>1214
*
*
>1215 ********************************
>1216
B7F9: 20 BE DE >1217 GET_VAL JSR
CHKCOM ; vérifie virgule
B7FC: 20 67 DD >1218 GET_VALD JSR
FRMNUM ; evalue expression numérique
B7FF: 20 52 E7
>1219
JSR GETADR ; résultat dans
LINNUM
B802: 38
>1220
SEC
; signale présence paramètre
B803: 60
>1221
RTS
>1222
>1223
>1224 ********************************
>1225
*
*
>1226 * Chargement d'un
bloc *
>1227
*
*
>1228 ********************************
>1229
>1230
LOAD_BLOC
B804: A2 01
>1231
LDX #1 ;
commande=READ
>1232
>1233
>1234 ********************************
>1235
*
*
>1236 * Opération sur un
bloc *
>1237
*
*
>1238 ********************************
>1239
>1240 * In: X = commande [1=read, 2=write]
>1241
B806: A9 00 >1242 CMD_BLOC LDA
#<BUFFER2 ; opération dans buffer2
B808: A0 B2
>1243
LDY #>BUFFER2
>1244
>1245 * In: acc = low buffer implantation
>1246 * Y = high buffer
implantation
>1247
B80A: 8D 5C BF >1248 CMD_BLOCD STA RWTS_BUFADR ;
opération dans buffer mentionné (low)
B80D: 8C 5D BF
>1249
STY RWTS_BUFADR+1 ; (high)
B810: 8E 59 BF
>1250
STX RWTS_CMD ; type commande
>1251
>1252 * Transforme un numéro de bloc en piste et secteur
>1253 * pour l'utilisation de la RWTS.
>1254 * bloc $0PPS: OBJ_1ER_BLOC = $PS
>1255
*
OBJ_1ER_BLOC+1 = $0P
>1256
B813: AD 7E BF
>1257
LDA OBJ_1ER_BLOC ; low bloc
B816: 8D 5A BF
>1258
STA RWTS_PISTE ; init piste
B819: 29 0F
>1259
AND #$0F ; vire l'info
piste
B81B: 8D 5B BF
>1260
STA RWTS_SECTEUR ; secteur seul ok
>1261
B81E: AD 7F BF
>1262
LDA OBJ_1ER_BLOC+1 ; high bloc
B821: 4A
>1263
LSR
; bit dans carry
B822: 6E 5A BF
>1264
ROR RWTS_PISTE ; incorpore
B825: 4A
>1265
LSR
; bit dans carry
B826: 6E 5A BF
>1266
ROR RWTS_PISTE ; incopore
B829: 4E 5A BF
>1267
LSR RWTS_PISTE ; insère bit=0
B82C: 4E 5A BF
>1268
LSR RWTS_PISTE ; insère bit=0
>1269
B82F: 20 00 BA >1270 GO_RWTS: JSR
RWTS: ; lecture piste/secteur
B832: B0 01
>1271
BCS :1 ;
erreur RWTS
B834: 60
>1272
RTS
; lecture ok
>1273
B835: AD 5F BF >1274 :1
LDA RWTS_ERRNUM ; erreur
B838: C9 10
>1275
CMP #$10
B83A: F0 17
>1276
BEQ RDOS_ERR+21 ; write protect err
>1277
B83C: D0 0F
>1278
BNE RDOS_ERR+15 ; i/o error
>1279
>1281
>1282 ********************************
>1283
*
*
>1284 * Erreur
RDOS *
>1285
*
*
>1286 ********************************
>1287
>1288
RDOS_ERR
B83E: A2 01
>1289
LDX #$01 ; file not
found
B840: 2C
>1290
DFB $2C
B841: A2 02
>1291
LDX #$02 ; (+3) dos
syntax err
B843: 2C
>1292
DFB $2C
B844: A2 03
>1293
LDX #$03 ; (+6)
duplicate entry
B846: 2C
>1294
DFB $2C
B847: A2 04
>1295
LDX #$04 ; (+9) disk
full
B849: 2C
>1296
DFB $2C
B84A: A2 05
>1297
LDX #$05 ; (+12) out of
data
B84C: 2C
>1298
DFB $2C
B84D: A2 06
>1299
LDX #$06 ; (+15) I/O
error
B84F: 2C
>1300
DFB $2C
B850: A2 07
>1301
LDX #$07 ; (+18) file
type error
B852: 2C
>1302
DFB $2C
B853: A2 08
>1303
LDX #$08 ; (+21) write
protect err
>1304
B855: 4C 81 BF
>1305
JMP GO_AFF_ERR ; va afficher l'erreur dos
>1306
>1307
>1308 ********************************
>1309
*
*
>1310 * Affichage message erreur dos *
>1311
*
*
>1312 ********************************
>1313
>1314
AFFICHE_ERR
B858: 24 D8
>1315
BIT ERRFLG ; on error actif?
B85A: 10 03
>1316
BPL :1 ; non
>1317
B85C: 4C 12 D4
>1318
JMP ERRORN ; branchement on err
>1319
B85F: 20 FB DA >1320 :1
JSR CRDO ; retour
chariot
B862: A0 FF
>1321
LDY #$FF ; #$FF+1=0
>1322
>1323 * Cherche la fin d'un message
>1324
B864: C8 >1325
:2
INY
B865: B9 8A B8
>1326
LDA LISTE_ERR,Y
B868: 10 FA
>1327
BPL :2 ;
pas la fin
>1328
B86A: CA
>1329
DEX
; un message passé
B86B: D0 F7
>1330
BNE :2 ; ce
n'est pas encore celui là
>1331
>1332
; ok on pointe sur le bon
B86D: 20 5A DB
>1333
JSR OUTQUES ; print '?'
>1334
>1335 * Affiche le message
>1336
B870: C8 >1337
:3
INY
B871: B9 8A B8
>1338
LDA LISTE_ERR,Y ; parcourt message
B874: 08
>1339
PHP
B875: 20 5C DB
>1340
JSR OUTDO ; affiche 1
caractère
B878: 28
>1341
PLP
B879: 10 F5
>1342
BPL :3 ; ce
n'était pas le dernier caractère (identifié
>1343
; par le DCI)
>1344
B87B: A5 76
>1345
LDA CURLIN+1 ; mode direct?
B87D: C9 FF
>1346
CMP #$FF ; (#$FF =
direct)
B87F: F0 03
>1347
BEQ :4 ; oui
>1348
B881: 20 19 ED
>1349
JSR INPRT ; affiche "IN" +
numéro ligne
B884: 20 E2 FB >1350 :4
JSR BELL2-2 ; biip!
B887: 4C 6C B6
>1351
JMP HOT_BASIC ; rend la main
>1352
>1353
>1354 *------------------------------*
>1355 * Messages
d'erreur *
>1356 *------------------------------*
>1357
B88A: 80 >1358 LISTE_ERR
DFB $80 ; permet de
déterminer le début msg err 1 en gardant
>1359
; la meme routine pour tous les messages.
>1360
B88B: 46 49 4C
>1361
DCI 'FILE NOT FOUND'
B88E: 45 20 4E 4F
B892: 54 20 46 4F
B896: 55 4E C4
B899: 44 4F 53
>1362
DCI 'DOS SYNTAX ERROR'
B89C: 20 53 59 4E
B8A0: 54 41 58 20
B8A4: 45 52 52 4F
B8A8: D2
B8A9: 44 55 50
>1363
DCI 'DUPLICATE ENTRY'
B8AC: 4C 49 43 41
B8B0: 54 45 20 45
B8B4: 4E 54 52 D9
B8B8: 44 49 53
>1364
DCI 'DISK FULL'
B8BB: 4B 20 46 55
B8BF: 4C CC
B8C1: 4F 55 54
>1365
DCI 'OUT OF DATA'
B8C4: 20 4F 46 20
B8C8: 44 41 54 C1
B8CC: 49 2F 4F
>1366
DCI 'I/O ERROR'
B8CF: 20 45 52 52
B8D3: 4F D2
B8D5: 46 49 4C
>1367
DCI 'FILE TYPE ERROR'
B8D8: 45 20 54 59
B8DC: 50 45 20 45
B8E0: 52 52 4F D2
B8E4: 57 52 49
>1368
DCI 'WRITE PROTECT ERROR'
B8E7: 54 45 20 50
B8EB: 52 4F 54 45
B8EF: 43 54 20 45
B8F3: 52 52 4F D2
>1369
>1370
>1371 ********************************
>1372
*
*
>1373 * Met en place 1er bloc du *
>1374 *
catalogue *
>1375
*
*
>1376 ********************************
>1377
>1378
READY_CATALOG
B8F7: A9 10
>1379
LDA #<$0010 ; bloc 16 (piste $01
secteur $00)
B8F9: A0 00
>1380
LDY #>$0010
>1381
>1382
>1383 ********************************
>1384
*
*
>1385 * Met en place 1er bloc de *
>1386 *
l'objet
*
>1387
*
*
>1388 ********************************
>1389
>1390
SAVE_1ER_BLOC
B8FB: 8D 7E BF
>1391
STA OBJ_1ER_BLOC
B8FE: 8C 7F BF
>1392
STY OBJ_1ER_BLOC+1
B901: 60
>1393
RTS
>1394
>1395
>1396 ********************************
>1397
*
*
>1398 * Positionne sur bloc suivant *
>1399
*
*
>1400 ********************************
>1401
>1402
READY_NXT_BLK
B902: EE 7E BF
>1403
INC OBJ_1ER_BLOC ; low
B905: D0 03
>1404
BNE :1
>1405
B907: EE 7F BF
>1406
INC OBJ_1ER_BLOC+1 ; high
>1407
B90A: 60 >1408
:1
RTS
>1409
>1410
>1411 ********************************
>1412
*
*
>1413 * Vérifie que la place trouvée *
>1414 * sera assez grande pour y *
>1415 * sauver
l'objet *
>1416
*
*
>1417 ********************************
>1418
>1419 * In: acc=nbr de bloc total de l'objet
>1420
>1421
CHK_SPACE
B90B: 18
>1422
CLC
; ajoute au 1er bloc de l'espace vide
B90C: 6D 96 BF
>1423
ADC NEXT_1ER_BLOC
B90F: A8
>1424
TAY
B910: AD 97 BF
>1425
LDA NEXT_1ER_BLOC+1
B913: 69 00
>1426
ADC #0 ;
retenue
>1427
B915: C9 02
>1428
CMP #>$0231 ; déborde sur piste
$23?
B917: D0 02
>1429
BNE :1 ; non
>1430
B919: C0 31
>1431
CPY #<$0231
B91B: 90 03 >1432
:1 BCC
:2 ; ça baigne
>1433
B91D: 4C 47 B8
>1434
JMP RDOS_ERR+9 ; disk full (place insuffisante)
>1435
B920: AD 96 BF >1436 :2
LDA NEXT_1ER_BLOC ; 1er bloc de l'objet=1er bloc de
l'espace vide
B923: 8D 7E BF
>1437
STA OBJ_1ER_BLOC
B926: AD 97 BF
>1438
LDA NEXT_1ER_BLOC+1
B929: 8D 7F BF
>1439
STA OBJ_1ER_BLOC+1
B92C: 60
>1440
RTS
>1441
B92D: 00 00 00
>1442
DS \,0
...
B9FC: 00 00 00 00
19
PUT RWTS
>1
>2 ********************************
>3
*
*
>4 * RWTS du
RDOS 3.3 *
>5 * (s)ource by
Deckard *
>6
*
*
>7 ********************************
>8
>9
RWTS:
>10
>11 * Lecture de l'état du drive courant
>12
BA00: A9 05
>13
LDA #5 ; 5
passes de lecture champs autorisées
BA02: 8D F8 04
>14
STA SEEKCNT
>15
BA05: AE 56 BF
>16
LDX RWTS_SLOT16
BA08: BD 8E C0
>17
LDA LC08E,X ; disk vers ram
BA0B: BD 8C C0
>18
LDA LC08C,X ; mode lecture read
>19
BA0E: A0 08
>20
LDY #8
BA10: BD 8C C0 >21
:1 LDA
LC08C,X ; attente 2 lectures différentes
BA13: 20 33 B4
>22
JSR GO_RTS ; rts tempo
BA16: DD 8C C0
>23
CMP LC08C,X
>24
BA19: D0 03
>25
BNE :3 ; le
drive tourne
BA1B: 88
>26
DEY
BA1C: D0 F2
>27
BNE :1 ;
relecture
>28
; meme valeur après 8 essais -> drive inactif
>29
BA1E: 08 >30
:3
PHP
; Z=0 (BNE) -> drive courant actif
>31
; Z=1 (BEQ) -> drive courant inactif
>32
>33 * Met en route le nouveau drive et regarde si
c'était
>34 * le meme que le drive courant
précédant
>35
BA1F: 8A
>36
TXA
; slot16+lecteur
BA20: 18
>37
CLC
BA21: 6D 57 BF
>38
ADC RWTS_DRIVE
BA24: A8
>39
TAY
BA25: B9 89 C0
>40
LDA LC089,Y ; sélectionne le
nouveau drive
BA28: BD 89 C0
>41
LDA LC089,X ; drive on (meme s'il
tournait déjà)
>42
BA2B: AD 57 BF
>43
LDA RWTS_DRIVE ; [%00000001=drive1,%00000010=drive2]
BA2E: CD 58 BF
>44
CMP RWTS_OLD_DRV ; changement de drive?
BA31: F0 0A
>45
BEQ :2 ;
non (DRIVNO identique)
>46
>47 * On a changé de drive
>48
BA33: 8D 58 BF
>49
STA RWTS_OLD_DRV ; old drive=new
BA36: 6A
>50
ROR
; info new drive dans carry: [0=drv2,1=drv1]
BA37: 66 35
>51
ROR DRIVNO ; dans bit 7
BA39: 28
>52
PLP
; restaure état drive courant
BA3A: A0 00
>53
LDY #0 ; Z=1
BA3C: 08
>54
PHP
; drive courant=inactif (force tempo)
>55
BA3D: AD 59 BF >56
:2 LDA
RWTS_CMD ; [%00000001=read, %00000010=write]
BA40: 6A
>57
ROR
; carry:1=read,0=write
BA41: 66 49
>58
ROR IOBPH ; dans bit 7
BA43: 28
>59
PLP
; restaure état activité drive
>60
BA44: D0 0C
>61
BNE :5 ;
Z=0: il était déjà actif
>62
BA46: 24 49
>63
BIT IOBPH ; commande?
BA48: 30 08
>64
BMI :5 ;
read
>65
>66 * Pas de tempo si:
>67 * - drive actif
>68 * - commande read
>69
BA4A: A0 04
>70
LDY #4 ;
tempo
BA4C: 20 A8 FC >71
:4 JSR
WAIT
BA4F: 88
>72
DEY
BA50: D0 FA
>73
BNE :4
>74
>75 * Le drive est actif et pret
>76
BA52: AD 5C BF >77
:5 LDA RWTS_BUFADR ;
pointeur adr chargement
BA55: 85 3E
>78
STA BUFADR
BA57: AD 5D BF
>79
LDA RWTS_BUFADR+1
BA5A: 85 3F
>80
STA BUFADR+1
>81
BA5C: 24 49
>82
BIT IOBPH ; commande?
BA5E: 30 03
>83
BMI TRYTRK2 ; read
>84
>85
; write
BA60: 20 00 BB
>86
JSR PRENIB16 ; transforme 256 octets en 342
nibbles
>87
>88 ********************************
>89
>90 * On regarde où on se trouve sur le disk
>91
>92
TRYTRK2
BA63: A9 30
>93
LDA #48 ; 48
essais
BA65: 8D 78 04
>94
STA CURTRK
>95
>96
TRYADR
BA68: AE 56 BF
>97
LDX RWTS_SLOT16
BA6B: 20 42 BC
>98
JSR RDADR16 ; read SECFND, TRKFND
BA6E: 90 2E
>99
BCC RDRIGHT ; ok
>100
BA70: CE 78 04 >101 TRYADR2 DEC
CURTRK ; un essai de moins
BA73: 10 F3
>102
BPL TRYADR ; re-essaie
>103
BA75: A9 10
>104
LDA #16
BA77: 8D 5E BF
>105
STA RWTS_DRV0TRK
BA7A: A9 00
>106
LDA #0
BA7C: CE F8 04
>107
DEC SEEKCNT ; une passe de moins
BA7F: F0 15
>108
BEQ BAD_DRIVE ; bad drive si dernière passe
>109
BA81: 20 9E BC
>110
JSR SEEKABS
BA84: 4C 63 BA
>111
JMP TRYTRK2
>112
>113 *------------------------------*
>114 * Fin traitement
RWTS *
>115 *------------------------------(
>116
BA87: A9 00 >117 ALLDONE
LDA #0
BA89: 18
>118
CLC
; pas d'erreur
BA8A: 24
>119
DFB $24 ; faux bit
>120
BA8B: 38 >121
HNDLERR
SEC
; signale erreur
BA8C: 8D 5F BF
>122
STA RWTS_ERRNUM ; met en place code erreur
BA8F: BD 88 C0
>123
LDA LC088,X ; arret drive
BA92: 60
>124
RTS
>125
>126
>127 *------------------------------*
>128 * Branchement en cas d'erreur *
>129 *------------------------------*
>130
>131
WRITE_PROTECT
BA93: A9 10
>132
LDA #$10 ; write protect
BA95: 2C
>133
DFB $2C ; faux bit
>134
BAD_DRIVE
BA96: A9 40
>135
LDA #$40 ; bad drive
BA98: 2C
>136
DFB $2C ; faux bit
>137
READ_ERROR
BA99: A9 80
>138
LDA #$80 ; erreur de
lecture (après 48 essais)
BA9B: 4C 8B BA
>139
JMP HNDLERR
>140
>141 ********************************
>142
>143 * On a trouvé une piste. Est-ce la bonne.
>144
BA9E: A5 2E >145 RDRIGHT
LDA TRKFND ; piste trouvée
BAA0: CD 5A BF
>146
CMP RWTS_PISTE ; =piste demandée?
BAA3: F0 1C
>147
BEQ CRCTVOL ; oui
>148
BAA5: BD 80 C0
>149
LDA $C080,X
BAA8: BD 82 C0
>150
LDA $C082,X
BAAB: BD 84 C0
>151
LDA $C084,X
BAAE: BD 86 C0
>152
LDA $C086,X
BAB1: A5 2E
>153
LDA TRKFND ; piste trouvée*2
BAB3: 0A
>154
ASL
BAB4: 8D 5E BF
>155
STA RWTS_DRV0TRK
>156
BAB7: AD 5A BF
>157
LDA RWTS_PISTE ; piste attendue*2
BABA: 0A
>158
ASL
BABB: 20 9E BC
>159
JSR SEEKABS
BABE: 4C 68 BA
>160
JMP TRYADR
>161
>162 * Piste ok. Est-ce le bon secteur
>163
BAC1: A4 2D >164 CRCTVOL
LDY SECFND ; secteur trouvé
BAC3: B9 AE BF
>165
LDA INTRLEAV,Y
BAC6: CD 5B BF
>166
CMP RWTS_SECTEUR ; =secteur recherché?
BAC9: F0 07
>167
BEQ :1 ; oui
>168
BACB: CE 78 04
>169
DEC CURTRK ; un essai de moins
BACE: 10 98
>170
BPL TRYADR ; recherche
BAD0: 30 C7
>171
BMI READ_ERROR ; essais non concluants
>172
BAD2: 24 49 >173
:1 BIT
IOBPH ; commande
BAD4: 10 0E
>174
BPL WRIT ; write
>175
BAD6: 20 DA BB
>176
JSR READ16 ; lecture secteur
BAD9: B0 95
>177
BCS TRYADR2 ; erreur
>178
BADB: 20 C2 BB
>179
JSR POSTNB16 ; conversion en octets
BADE: AE 56 BF >180 FINI
LDX RWTS_SLOT16
BAE1: 4C 87 BA
>181
JMP ALLDONE
>182
BAE4: 20 2A BB >183 WRIT
JSR WRITE16
BAE7: 90 F5
>184
BCC FINI
>185
BAE9: 4C 93 BA
>186
JMP WRITE_PROTECT ; write protect
>187
BAEC: 00 00 00
>188
DS \,0
BAEF: 00 00 00 00
BAF3: 00 00 00 00
BAF7: 00 00 00 00
BAFB: 00 00 00 00
BAFF: 00
20
PUT RWTS.SUBS
>1
>2 ********************************
>3
*
*
>4 * Sous programmes RWTS RDOS *
>5
*
*
>6 ********************************
>7
>8 *------------------------------*
>9 * PRENIBBLIZE
ROUTINE *
>10 *------------------------------*
>11
>12 * CONVERTS 256 BYTES POINTED AT BY BUFADR TO 342
>13 * 6-BIT NIBBLES OF THE FORM 00XXXXXX
>14
>15
PRENIB16
BB00: A2 00
>16
LDX #0
BB02: A0 02
>17
LDY #2
>18
>19 * GET NEXT USER BYTE
>20
BB04: 88 >21
PRENIB1
DEY
BB05: B1 3E
>22
LDA (BUFADR),Y
>23
>24 * SHIFT H.O. TWO BYTES INTO NBUF2.
>25
BB07: 4A
>26
LSR
BB08: 3E 00 BF
>27
ROL NBUF2,X
BB0B: 4A
>28
LSR
BB0C: 3E 00 BF
>29
ROL NBUF2,X
>30
>31 * PUT L.O. SIX BITS (SHIFTED LEFT) INTO NBUF1.
>32
BB0F: 99 00 BE
>33
STA NBUF1,Y
BB12: E8
>34
INX
BB13: E0 56
>35
CPX #$56
BB15: 90 ED
>36
BCC PRENIB1
>37
>38 * DONE YET?
>39
BB17: A2 00
>40
LDX #0
BB19: 98
>41
TYA
BB1A: D0 E8
>42
BNE PRENIB1
>43
>44 * STRIP H.O. TWO BITS OF NBUF2.
>45
BB1C: A2 55
>46
LDX #$55
BB1E: BD 00 BF >47 PRENIB2 LDA
NBUF2,X
BB21: 29 3F
>48
AND #$3F
BB23: 9D 00 BF
>49
STA NBUF2,X
BB26: CA
>50
DEX
BB27: 10 F5
>51
BPL PRENIB2
BB29: 60
>52
RTS
>53
>54 *------------------------------*
>55 * WRITE
SUBROUTINE *
>56 *------------------------------*
>57
>58 * WRITES PRENIBBILIZED DATA IN NBUF1 AND NBUF2 TO
DISK.
>59 *
>60 * NOTE: THIS STUFF IS ALL TIME CRITICAL.
>61 *
>62 * WATCH PAGE BOUNDRIES, DON'T REMOVE NOP'S, ETC.
>63
>64
WRITE16
BB2A: 38
>65
SEC
;ANTICIPATE WRITE PROTECT
BB2B: 86 27
>66
STX SLOTZ
BB2D: 8E 78 06
>67
STX SLOTABS
BB30: BD 8D C0
>68
LDA LC08D,X
BB33: BD 8E C0
>69
LDA LC08E,X ;SENSE WRITE PROTECT
BB36: 30 7C
>70
BMI WEXIT
BB38: AD 00 BF
>71
LDA NBUF2
BB3B: 85 26
>72
STA WTEMP
BB3D: A9 FF
>73
LDA #$FF ;SYNC BYTE
BB3F: 9D 8F C0
>74
STA LC08F,X ;WRITE 1ST NIBBLE
BB42: 1D 8C C0
>75
ORA LC08C,X
BB45: 48
>76
PHA
BB46: 68
>77
PLA
BB47: EA
>78
NOP
BB48: A0 04
>79
LDY #4
>80
>81 * WRITE THE SYNC BYTE
>82
BB4A: 48 >83
WSYNC
PHA
BB4B: 68
>84
PLA
BB4C: 20 B9 BB
>85
JSR WNIBL7
BB4F: 88
>86
DEY
BB50: D0 F8
>87
BNE WSYNC
BB52: A9 D5
>88
LDA #$D5 ;FIRST DATA
MARK
BB54: 20 B8 BB
>89
JSR WNIBL9
BB57: A9 AA
>90
LDA #$AA ;2ND DATA MARK
BB59: 20 B8 BB
>91
JSR WNIBL9
BB5C: A9 AD
>92
LDA #$AD ;3RD DATA MARK
BB5E: 20 B8 BB
>93
JSR WNIBL9
BB61: 98
>94
TYA
;CLEAR CHECKSUM
BB62: A0 56
>95
LDY #$56 ;NBUF2 INDEX
BB64: D0 03
>96
BNE L1
;ALWAYS TAKEN
>97
BB66: B9 00 BF >98 WDATA0 LDA
NBUF2,Y ;GET PRIOR 6-BIT NIBBLE
BB69: 59 FF BE >99
L1 EOR NBUF2-1,Y
;AND XOR WITH CURRENT NIBBLE
BB6C: AA
>100
TAX
BB6D: BD 1F BD
>101
LDA NIBL,X
BB70: A6 27
>102
LDX SLOTZ
BB72: 9D 8D C0
>103
STA LC08D,X ;WRITE NIBBLE
BB75: BD 8C C0
>104
LDA LC08C,X
BB78: 88
>105
DEY
;NEXT NIBBLE
BB79: D0 EB
>106
BNE WDATA0
>107
>108 * NOW HANDLE NBUF1.
>109
>110 * GET PRIOR NIBBLE
>111
BB7B: A5 26
>112
LDA WTEMP
BB7D: EA
>113
NOP
>114
>115 * LOOP TO WRITE OUT DATA IN NBUF1
>116
BB7E: 59 00 BE >117 WDATA2 EOR
NBUF1,Y
BB81: AA
>118
TAX
BB82: BD 1F BD
>119
LDA NIBL,X
BB85: AE 78 06
>120
LDX SLOTABS
BB88: 9D 8D C0
>121
STA LC08D,X ;WRITE NIBBLE
BB8B: BD 8C C0
>122
LDA LC08C,X
BB8E: B9 00 BE
>123
LDA NBUF1,Y
BB91: C8
>124
INY
BB92: D0 EA
>125
BNE WDATA2
BB94: AA
>126
TAX
BB95: BD 1F BD
>127
LDA NIBL,X
>128
>129 * WRITE CHECKSUM
>130
BB98: A6 27
>131
LDX SLOTZ
BB9A: 20 BB BB
>132
JSR WNIBL
>133
>134 * WRITE EPILOG TO DATA
>135
BB9D: A9 DE
>136
LDA #$DE ;DM4, BIT SLIP
MARK
BB9F: 20 B8 BB
>137
JSR WNIBL9
BBA2: A9 AA
>138
LDA #$AA ;DM5, BSM
BBA4: 20 B8 BB
>139
JSR WNIBL9
BBA7: A9 EB
>140
LDA #$EB ;DM6, BSM
BBA9: 20 B8 BB
>141
JSR WNIBL9
>142
>143 * ALL DONE, CLOSE UP THE SHOP!
>144
BBAC: A9 FF
>145
LDA #$FF
BBAE: 20 B8 BB
>146
JSR WNIBL9
>147
>148 * TURN OFF THE WRITE MODE
>149
BBB1: BD 8E C0
>150
LDA LC08E,X
>151
>152 * AND BACK TO THE READ MODE
>153
BBB4: BD 8C C0 >154 WEXIT LDA
LC08C,X
BBB7: 60
>155
RTS
>156
>157 * WNIBL9 9 CYCLES, THEN WRITE
>158
BBB8: 18 >159
WNIBL9
CLC
>160
>161 * WNIBL7 7 CYCLES, THEN WRITE
>162
BBB9: 48 >163
WNIBL7
PHA
BBBA: 68
>164
PLA
>165
>166 * WRITE NIBBLE TO DISK
>167
BBBB: 9D 8D C0 >168 WNIBL STA
LC08D,X
BBBE: 1D 8C C0
>169
ORA LC08C,X
BBC1: 60
>170
RTS
>171
>172 *------------------------------*
>173 * POST NIBBLIZE
ROUTINE. *
>174 *------------------------------*
>175
>176 * CONVERTS 342 NIBBLES OF THE FORM 00XXXXXX
>177 * TO EIGHT BIT BYTES.
>178 *
>179 * THE NIBBLES ARE STORED IN NBUF1 AND NBUF2, THE 8-BIT
>180 * BYTES WILL BE STORED AT (BUFADR).
>181
>182
POSTNB16
BBC2: A0 00
>183
LDY #0
BBC4: A2 56 >184 POST1
LDX #$56
BBC6: CA >185
POST2
DEX
BBC7: 30 FB
>186
BMI POST1
>187
>188 * GET BYTE AND SHIFT IN L.O. TWO BITS FROM NBUF2
>189
BBC9: B9 00 BE
>190
LDA NBUF1,Y
BBCC: 5E 00 BF
>191
LSR NBUF2,X
BBCF: 2A
>192
ROL
BBD0: 5E 00 BF
>193
LSR NBUF2,X
BBD3: 2A
>194
ROL
>195
>196 * STORE IN USER BUFFER
>197
BBD4: 91 3E
>198
STA (BUFADR),Y
BBD6: C8
>199
INY
BBD7: D0 ED
>200
BNE POST2
BBD9: 60
>201
RTS
>202
>203 *------------------------------*
>204 * READ
ROUTINE *
>205 *------------------------------*
>206
>207 * READS A SECTOR FROM THE DISK AND STORES THE DATA IN
>208 * NBUF1 AND NBUF2.
>209
>210
READ16
BBDA: A0 20
>211
LDY #$20
>212
>213 * GET SYNC BYTES
>214
BBDC: 88 >215
RSYNC
DEY
BBDD: F0 61
>216
BEQ RDERR
>217
>218 * WAIT UNTIL A BYTE IS RECIEVED FROM THE DISK DRIVE.
>219
BBDF: BD 8C C0 >220 L2
LDA LC08C,X
BBE2: 10 FB
>221
BPL L2
>222
>223 * BYTE RECIEVED, CHECK FOR DM1
>224
BBE4: 49 D5 >225 RSYNC1
EOR #$D5
BBE6: D0 F4
>226
BNE RSYNC
BBE8: EA
>227
NOP
>228
>229 * GET NEXT BYTE AND CHECK FOR DM2
>230
BBE9: BD 8C C0 >231 L3
LDA LC08C,X
BBEC: 10 FB
>232
BPL L3
BBEE: C9 AA
>233
CMP #$AA
BBF0: D0 F2
>234
BNE RSYNC1
BBF2: A0 56
>235
LDY #$56
>236
>237 * CHECK FOR DM3
>238
BBF4: BD 8C C0 >239 L4
LDA LC08C,X
BBF7: 10 FB
>240
BPL L4
BBF9: C9 AD
>241
CMP #$AD
BBFB: D0 E7
>242
BNE RSYNC1
>243
>244 * READ THE DATA FROM THE SECTOR
>245
BBFD: A9 00
>246
LDA #0
;INIT CHECKSUM
>247
>248 * READ STUFF INTO NBUF2
>249
BBFF: 88 >250
RDATA1
DEY
BC00: 84 26
>251
STY IDX
BC02: BC 8C C0 >252 L5
LDY LC08C,X ; Y=[$96,$FF]
BC05: 10 FB
>253
BPL L5
BC07: 59 00 BD
>254
EOR TRANS_6_2-$96,Y
BC0A: A4 26
>255
LDY IDX
BC0C: 99 00 BF
>256
STA NBUF2,Y
BC0F: D0 EE
>257
BNE RDATA1
>258
>259 * READ STUFF INTO NBUF1
>260
BC11: 84 26 >261 RDATA2
STY IDX
BC13: BC 8C C0 >262 L6
LDY LC08C,X
BC16: 10 FB
>263
BPL L6
BC18: 59 00 BD
>264
EOR TRANS_6_2-$96,Y
BC1B: A4 26
>265
LDY IDX
BC1D: 99 00 BE
>266
STA NBUF1,Y
BC20: C8
>267
INY
BC21: D0 EE
>268
BNE RDATA2
>269
>270 * GET AND CHECK THE CHECKSUM BYTE
>271
BC23: BC 8C C0 >272 L7
LDY LC08C,X
BC26: 10 FB
>273
BPL L7
BC28: D9 00 BD
>274
CMP TRANS_6_2-$96,Y
BC2B: D0 13
>275
BNE RDERR
>276
>277 * CHECK FOR DM4
>278
BC2D: BD 8C C0 >279 L8
LDA LC08C,X
BC30: 10 FB
>280
BPL L8
BC32: C9 DE
>281
CMP #$DE
BC34: D0 0A
>282
BNE RDERR
BC36: EA
>283
NOP
>284
>285 * CHECK FOR DM5
>286
BC37: BD 8C C0 >287 L9
LDA LC08C,X
BC3A: 10 FB
>288
BPL L9
BC3C: C9 AA
>289
CMP #$AA
BC3E: F0 5C
>290
BEQ RDADRX
BC40: 38 >291
RDERR
SEC
BC41: 60
>292
RTS
>293
>294 *------------------------------*
>295 * READ ADDRESS
FIELD. *
>296 *------------------------------*
>297
>298 * READS STARTING ADDRESS MARKS ($D5, $AA, $96), ADDRESS
>299 * INFO (VOLUME/TRACK/SECTOR/CHECKSUM), AND CLOSING
>300 * ADDRESS MARKS ($DE, $AA)
>301
>302
RDADR16
BC42: A0 FC
>303
LDY #$FC
BC44: 84 26
>304
STY COUNT
BC46: C8 >305
RDASYN
INY
BC47: D0 04
>306
BNE L10
BC49: E6 26
>307
INC COUNT
BC4B: F0 F3
>308
BEQ RDERR
>309
>310 * READ FIRST ADDRESS MARK ($D5)
>311
BC4D: BD 8C C0 >312 L10
LDA LC08C,X
BC50: 10 FB
>313
BPL L10
BC52: C9 D5 >314 RDASYN1
CMP #$D5
BC54: D0 F0
>315
BNE RDASYN
BC56: EA
>316
NOP
>317
>318 * READ NEXT ADDRESS MARK
>319
BC57: BD 8C C0 >320 L11
LDA LC08C,X
BC5A: 10 FB
>321
BPL L11
BC5C: C9 AA
>322
CMP #$AA
BC5E: D0 F2
>323
BNE RDASYN1
BC60: A0 03
>324
LDY #3
>325
>326 * READ LAST ADDRESS MARK
>327
BC62: BD 8C C0 >328 L12
LDA LC08C,X
BC65: 10 FB
>329
BPL L12
BC67: C9 96
>330
CMP #$96
BC69: D0 E7
>331
BNE RDASYN1
>332
>333 * INIT CHECKSUM AND READ THE ADDRESS DATA FIELD (FOUR
BYTES)
>334
BC6B: A9 00
>335
LDA #0
BC6D: 85 27 >336 RDAFLD
STA CSUM
>337
>338 * READ 'ODD' BIT NIBBLE
>339
BC6F: BD 8C C0 >340 L13
LDA LC08C,X
BC72: 10 FB
>341
BPL L13
BC74: 2A
>342
ROL
BC75: 85 26
>343
STA LAST
>344
>345 * READ EVEN BIT NIBBLE.
>346
BC77: BD 8C C0 >347 L14
LDA LC08C,X
BC7A: 10 FB
>348
BPL L14
>349
>350 * MERGE THE TWO.
>351
BC7C: 25 26
>352
AND LAST
>353
>354 * STORE THE DATA BYTE, UPDATE CHECKSUM, AND REPEAT UNTIL
>355 * ENTIRE ADDRESS FIELD IS READ.
>356
BC7E: 99 2C 00
>357
STA SLOTEMP+1,Y
BC81: 45 27
>358
EOR CSUM
BC83: 88
>359
DEY
BC84: 10 E7
>360
BPL RDAFLD
>361
>362 * CHECKSUM (IN ACC) MUST BE 0.
>363
BC86: A8
>364
TAY
BC87: D0 B7
>365
BNE RDERR
>366
>367 * READ FIRST EPILOGUE BYTE ($DE)
>368
BC89: BD 8C C0 >369 L15
LDA LC08C,X
BC8C: 10 FB
>370
BPL L15
BC8E: C9 DE
>371
CMP #$DE
BC90: D0 AE
>372
BNE RDERR
BC92: EA
>373
NOP
>374
>375 * READ SECOND EPILOGUE BYTE ($AA)
>376
BC93: BD 8C C0 >377 L16
LDA LC08C,X
BC96: 10 FB
>378
BPL L16
BC98: C9 AA
>379
CMP #$AA
BC9A: D0 A4
>380
BNE RDERR
BC9C: 18 >381
RDADRX
CLC
BC9D: 60
>382
RTS
>383
>384 *------------------------------*
>385 * SEEKABS
ROUTINE *
>386 *------------------------------*
>387
>388 * MOVES THE DISK HEAD OVER THE DESIRED TRACK.
>389
>390
SEEKABS
BC9E: 85 2A
>391
STA TRKN
BCA0: CD 5E BF
>392
CMP RWTS_DRV0TRK
BCA3: F0 55
>393
BEQ RTS0
BCA5: A9 00
>394
LDA #0
BCA7: 85 26
>395
STA TRKCNT
BCA9: AD 5E BF >396 MOVEHEAD LDA RWTS_DRV0TRK
BCAC: 85 27
>397
STA PRIOR
BCAE: 38
>398
SEC
BCAF: E5 2A
>399
SBC TRKN
BCB1: F0 33
>400
BEQ ISTHERE
BCB3: B0 07
>401
BCS L17
BCB5: 49 FF
>402
EOR #$FF
BCB7: EE 5E BF
>403
INC RWTS_DRV0TRK
BCBA: 90 05
>404
BCC L18
BCBC: 69 FE >405
L17 ADC
#$FE
BCBE: CE 5E BF
>406
DEC RWTS_DRV0TRK
BCC1: C5 26 >407
L18 CMP
TRKCNT
BCC3: 90 02
>408
BCC L19
BCC5: A5 26
>409
LDA TRKCNT
BCC7: C9 0C >410
L19 CMP
#$C
BCC9: B0 01
>411
BCS L20
BCCB: A8
>412
TAY
BCCC: 38 >413
L20
SEC
BCCD: 20 EA BC
>414
JSR CHKPOS
BCD0: B9 07 BD
>415
LDA ONTBL,Y
BCD3: 20 FB BC
>416
JSR MSWAIT
BCD6: A5 27
>417
LDA PRIOR
BCD8: 18
>418
CLC
BCD9: 20 ED BC
>419
JSR CHKPOS2
BCDC: B9 13 BD
>420
LDA OFFTBL,Y
BCDF: 20 FB BC
>421
JSR MSWAIT
BCE2: E6 26
>422
INC TRKCNT
BCE4: D0 C3
>423
BNE MOVEHEAD
BCE6: 20 FB BC >424 ISTHERE JSR
MSWAIT
BCE9: 18
>425
CLC
BCEA: AD 5E BF >426 CHKPOS LDA
RWTS_DRV0TRK
BCED: 29 03 >427 CHKPOS2
AND #3
BCEF: 2A
>428
ROL
BCF0: 0D 56 BF
>429
ORA RWTS_SLOT16
BCF3: AA
>430
TAX
BCF4: BD 80 C0
>431
LDA PHASEOFF,X
BCF7: AE 56 BF
>432
LDX RWTS_SLOT16
BCFA: 60 >433
RTS0
RTS
>434
>435 *------------------------------*
>436 * HEAD MOVE DELAY SUBROUTINE *
>437 *------------------------------*
>438
>439 * DELAYS ACC*100 USEC
>440
BCFB: AE 80 BF >441 MSWAIT LDX
VAL_MSWAIT
BCFE: CA >442
L21
DEX
;DELAY 86 USEC
BCFF: D0 FD
>443
BNE L21
BD01: 38 >444
L22
SEC
BD02: E9 01
>445
SBC #1
BD04: D0 F5
>446
BNE MSWAIT
BD06: 60
>447
RTS
>448
>449 ********************************
>450
>451 * PHASEON/PHASEOFF TABLES
>452
BD07: 01 30 >453 ONTBL
HEX 0130
BD09: 28 24 20
>454
HEX 2824201E1D1C1C1C1C1C
BD0C: 1E 1D 1C 1C
BD10: 1C 1C 1C
BD13: 70 2C 26 >455 OFFTBL HEX
702C26221F1E1D1C1C1C1C1C
BD16: 22 1F 1E 1D
BD1A: 1C 1C 1C 1C
BD1E: 1C
>456
>457 ********************************
>458
>459 * WRITE TRANSLATE TABLES
>460
BD1F: 96 97 9A >461 NIBL
HEX 96979A9B9D9E9FA6A7ABACADAEAFB2B3
BD22: 9B 9D 9E 9F
BD26: A6 A7 AB AC
BD2A: AD AE AF B2
BD2E: B3
BD2F: B4 B5 B6
>462
HEX B4B5B6B7B9BABBBCBDBEBFCBCDCECFD3
BD32: B7 B9 BA BB
BD36: BC BD BE BF
BD3A: CB CD CE CF
BD3E: D3
BD3F: D6 D7 D9
>463
HEX D6D7D9DADBDCDDDEDFE5E6E7E9EAEBEC
BD42: DA DB DC DD
BD46: DE DF E5 E6
BD4A: E7 E9 EA EB
BD4E: EC
BD4F: ED EE EF
>464
HEX EDEEEFF2F3F4F5F6F7F9FAFBFCFDFEFF
BD52: F2 F3 F4 F5
BD56: F6 F7 F9 FA
BD5A: FB FC FD FE
BD5E: FF
>465
>466 ********************************
>467
>468 * ALIGN REMAINDER OF TABLE
>469
BD5F: 00 00 00
>470
DS 55
...
BD92: 00 00 00 00
>471
>472
TRANS_6_2
BD96: 00 01 98
>473
HEX 0001989902039C040506A0A1A2A3A4A5
BD99: 99 02 03 9C
BD9D: 04 05 06 A0
BDA1: A1 A2 A3 A4
BDA5: A5
BDA6: 07 08 A8
>474
HEX 0708A8A9AA090A0B0C0DB0B10E0F1011
BDA9: A9 AA 09 0A
BDAD: 0B 0C 0D B0
BDB1: B1 0E 0F 10
BDB5: 11
BDB6: 12 13 B8
>475
HEX 1213B81415161718191AC0C1C2C3C4C5
BDB9: 14 15 16 17
BDBD: 18 19 1A C0
BDC1: C1 C2 C3 C4
BDC5: C5
BDC6: C6 C7 C8
>476
HEX C6C7C8C9CA1BCC1C1D1ED0D1D21FD4D5
BDC9: C9 CA 1B CC
BDCD: 1C 1D 1E D0
BDD1: D1 D2 1F D4
BDD5: D5
BDD6: 20 21 D8
>477
HEX 2021D822232425262728E0E1E2E3E429
BDD9: 22 23 24 25
BDDD: 26 27 28 E0
BDE1: E1 E2 E3 E4
BDE5: 29
BDE6: 2A 2B E8
>478
HEX 2A2BE82C2D2E2F303132F0F133343536
BDE9: 2C 2D 2E 2F
BDED: 30 31 32 F0
BDF1: F1 33 34 35
BDF5: 36
BDF6: 37 38 F8
>479
HEX 3738F8393A3B3C3D3E3F
BDF9: 39 3A 3B 3C
BDFD: 3D 3E 3F
21
PUT NBUF
>1
>2
>3 ********************************
>4
*
*
>5 * Buffers RWTS et point entrée *
>6 * du RDOS
3.3 SSI *
>7 * (s)ource by
Deckard *
>8
*
*
>9 ********************************
>10
>11
NBUF1
BE00: 8E 56 BF
>12
STX RWTS_SLOT16 ; sauve slot*16
BE03: 20 72 B6
>13
JSR CHK_APLSFT ; vérifie présence AppleSoft
en ligne
>14
BE06: A2 2F
>15
LDX #$2F
BE08: BD 1A BE >16
:1 LDA RDOS_VECT,X
BE0B: 9D D0 03
>17
STA $3D0,X ; met en place nouveaux
vecteurs page 3
BE0E: CA
>18
DEX
BE0F: 10 F7
>19
BPL :1
>20
BE11: A9 B6
>21
LDA #>NEW-1 ; on fera NEW à la
fin de cette routine
BE13: 48
>22
PHA
BE14: A9 4D
>23
LDA #<NEW-1
BE16: 48
>24
PHA
BE17: 4C A1 B5
>25
JMP READD ; effectue un READ
direct (EXEC)
>26
>27
>28 *------------------------------*
>29 * Vecteurs RDOS page
3 *
>30 *------------------------------*
>31
>32
RDOS_VECT
BE1A: 4C 6C B6
>33
JMP HOT_BASIC
BE1D: 4C 00 E0
>34
JMP BASIC
BE20: 4C 33 B4
>35
JMP GO_RTS
BE23: 4C 00 BA
>36
JMP RWTS: ; point
d'entrée RWTS
>37
BE26: EA EA EA
>38
DS 19,$EA ; nop
BE29: EA EA EA EA
BE2D: EA EA EA EA
BE31: EA EA EA EA
BE35: EA EA EA EA
>39
BE39: 4C 59 FA
>40
JMP OLDBRK
BE3C: 6C B6
>41
DA HOT_BASIC ; reset
BE3E: 13
>42
DFB $13 ; DFB
#>HOT_BASIC!$A500
>43
BE3F: 4C 00 B3
>44
JMP SKTOKEN ; & point d'entrée
(SeeKTOKEN)
BE42: 4C 65 FF
>45
JMP MON
BE45: 4C 65 FF
>46
JMP MON
BE48: 65 FF
>47
DA MON
>48
BE4A: 00 00 00
>49
DS $B6,0
...
BEF9: 00 00 00 00
BEFD: 00 00 00
>50
>51 ********************************
>52
>53
NBUF2
BF00: 00 00 00
>54
DS $56
...
BF4F: 00 00 00 00
BF53: 00 00 00
22
PUT VARIABLES
>1
>2
>3 ********************************
>4
*
*
>5 * Tables et
valeurs *
>6
*
*
>7 ********************************
>8
>9 *------------------------------*
>10 *
Paramètres RWTS *
>11 *------------------------------*
>12
>13
RWTS_SLOT16
; slot*16 (slot 6 par défaut)
BF56: 60
>14
DFB $60
>15
RWTS_DRIVE
; numéro lecteur (1 par défaut)
BF57: 01
>16
DFB 1
>17
RWTS_OLD_DRV
; ancien numéro de lecteur utilisé (1 par défaut)
BF58: 01
>18
DFB 1
>19
RWTS_CMD
; commande RDOS (read=1 par défaut)
BF59: 01
>20
DFB 1
>21
RWTS_PISTE
; piste
BF5A: 00
>22
DFB 0
>23
RWTS_SECTEUR
; secteur
BF5B: 00
>24
DFB 0
>25
RWTS_BUFADR
; adr implantation ($0800 pour SYSTEMBOOT)
BF5C: 00 08
>26
DA $0800
>27
RWTS_DRV0TRK
;
BF5E: 00
>28
DFB 0
>29
RWTS_ERRNUM
; numéro erreur générée par RWTS
BF5F: 00
>30
DFB 0
>31
>32
>33 *------------------------------*
>34 * Descriptif objet en cours *
>35 *------------------------------*
>36
>37
OBJ_NOM
; nom par défaut boot. Taille max=24 caractères
BF60: D3 D9 D3
>38
ASC
"SYSTEMBOOT
"
BF63: D4 C5 CD C2
BF67: CF CF D4 A0
BF6B: A0 A0 A0 A0
BF6F: A0 A0 A0 A0
BF73: A0 A0 A0 A0
BF77: A0
>39
OBJ_TYPE
; boot par défaut sur fichier
BF78: D4
>40
ASC "T"
>41
OBJ_NBR_BLOC
; nbr de bloc utilisé (SYSTEMBOOT=1 bloc)
BF79: 01
>42
DFB 01
>43
OBJ_ADR
; adresse implantation objet
BF7A: 00 00
>44
DA
0
>45
OBJ_LEN
; longueur objet
BF7C: 00 00
>46
DA
0
>47
OBJ_1ER_BLOC
; numéro bloc (bloc 32 par défaut=P$02 S$00)
BF7E: 20 00
>48
DA 32
>49
>50
VAL_MSWAIT
; délai MSWAIT (dans RWTS.SUBS)
BF80: 0F
>51
DFB $0F
>52
>53
>54 *------------------------------*
>55
* JMP
figés
*
>56 *------------------------------*
>57
>58
GO_AFF_ERR
; affiche message d'erreur dos
BF81: 4C 58 B8
>59
JMP AFFICHE_ERR
>60
GO_READY_CAT
; pointe sur bloc 16 (P$01 S$00)
BF84: 4C F7 B8
>61
JMP READY_CATALOG
>62
GO_LOAD_BLOC
; charge un bloc
BF87: 4C 04 B8
>63
JMP LOAD_BLOC
>64
GO_RECALLD
; &RECALL direct
BF8A: 4C 4A B5
>65
JMP RECALLD
>66
GO_STORED
; &STORE direct
BF8D: 4C 42 B5
>67
JMP STORED
>68
GO_DELD
; &DEL direct
BF90: 4C CD B5
>69
JMP DELD
>70
GO_CATD
; &CAT direct
BF93: 4C 7F B3
>71
JMP CATD
>72
>73
>74 *------------------------------*
>75
*
Variables *
>76 *------------------------------*
>77
>78
NEXT_1ER_BLOC
; numéro 1er bloc objet suivant
BF96: 00 00
>79
DA
0
>80
HBF98
; ?
BF98: 00
>81
DFB 0
>82
HBF99
; ?
BF99: 00
>83
DFB 0
>84
HBF9A
; ?
BF9A: 00
>85
DFB 0
>86
VALEUR
; %10000000 = cherche place vide
BF9B: 00
>87
DFB 0
; %00000000 = cherche nom objet
>88
; ou sauvegarde acc pendant PRINT/READ
>89
HBF9C
; ?
BF9C: 00
>90
DFB 0
>91
PTR_BASIC
; sauvegarde des pointeurs BASIC (pour chain)
BF9D: 00 00 00
>92
DS 8,0
BFA0: 00 00 00 00
BFA4: 00
>93
VAL_BLOCNUM
; numéro bloc en cours (pour traitement read)
BFA5: 00 00
>94
DA
0
>95
CPT_NBR_BLOC
; compteur nbr de bloc (save_bloc, read)
BFA7: 01
>96
DFB 1
>97
IND_BUF
; indice buffer pendant print/read
BFA8: 00
>98
DFB 0
>99
READ_OR_PRINT
; flag différenciant les 2 traitements
BFA9: 00
>100
DFB 0
; %10000000 = print et %00000000 = read
>101
VECT_CSW_KSW
; sauvegarde CSW/KSW
BFAA: 00 00 00
>102
DS 4,0
BFAD: 00
>103
>104
>105 *------------------------------*
>106
*
*
>107 * Interleaving RWTS RDOS 3.3 *
>108
*
*
>109 *------------------------------*
>110
>111
INTRLEAV
BFAE: 00 08 01
>112
HEX 00080109020A030B040C050D060E070F
BFB1: 09 02 0A 03
BFB5: 0B 04 0C 05
BFB9: 0D 06 0E 07
BFBD: 0F
>113
BFBE: 00 00 00
>114
DS
\
...
BFF9: 00 00 00 00
BFFD: 00 00 00
:asm
1
23
24
SAV OBJ/RDOS.SSI
Object saved as OBJ/RDOS.SSI,A$B300,L$0D00,BIN
--End assembly, 3328 bytes, Errors: 0
Symbol table - alphabetical order:
? A2H =$3F
? A2L =$3E
? A3H =$41
? A3L =$40
? A4H =$43
? A4L =$42
? ADDON =$D998
AFFICHE_ERR=$B858
ALLDONE =$BA87 ? ANL_CPT
=$ED ? ARG
=$A5 ? ARYTAB =$6B
? AUX =$C055 ? AUXMOVE
=$C311 ? AYINT
=$E10C BAD_DRIVE=$BA96
? BASCALC =$FBC1 ? BASH
=$29 BASIC
=$E000 BASIC2 =$E003
BASL =$28
? BELL =$FF3A
BELL2 =$FBE4 ? BLTU2 =$D39A
BUFADR
=$3E BUFFER1
=$B100 BUFFER2 =$B200 ?
BUTTN0 =$C061
? BUTTN1 =$C062
CAT =$B375
CATD =$B37F ?
CH =$24
CHARGET =$B1
CHARGOT =$B7 CHKCOM
=$DEBE CHKPOS =$BCEA
CHKPOS2 =$BCED CHKSTR
=$DD6C
CHK_APLSFT=$B672 CHK_SPACE=$B90B
CHK_TYPE=$B41C CLEARC
=$D66C ? CMDCPT
=$EC CMD_BLOC=$B806
CMD_BLOCD=$B80A ? COLOR
=$30
COMMANDES=$B341 COUNT =$26
COUT =$FDED ?
COUT1 =$FDF0
CPT_NBR_BLOC=$BFA7 CRCTVOL =$BAC1
CRDO =$DAFB ?
CROUT =$FD8E
CSUM =$27
CSWH =$37
CSWL =$36
? CURADR =$EE
CURLIN =$75
CURTRK =$0478
? CV
=$25
D
=$B620 DEF
=$B560 DEL =$B5CA
DELD
=$B5CD DRIVNO
=$35 ? DSCLEN
=$8F
END =$B5C5
ERRFLG =$D8 ?
ERRNUM =$DE
ERRORN =$D412 ? FAC =$9D
FACMO =$A0 ?
FACSGN =$A2 ? FADDT
=$E7C1 FINI =$BADE
FIN_CAT =$B701 ? FLO2
=$EBA0 ? FMULTT =$E982 ?
FOUT =$ED34
? FREFAC =$E600 ? FRETOP
=$6F FRMEVL
=$DD7B FRMNUM =$DD67
? GARBAG =$E484 ?
GBASCALC=$F847 ? GBASH
=$27 ? GBASL =$26
GETADR =$E752
GETBYT =$E6F8 ? GETSPA
=$E452 GET_NAME=$B7BA
GET_NUM =$B63D GET_VAL
=$B7F9 GET_VALD=$B7FC ?
GIVAYF =$E2F2
GOTO
=$B475 GO_AFF_ERR=$BF81
? GO_CATD =$BF93 ? GO_DELD =$BF90
? GO_LOAD_BLOC=$BF87 ?
GO_READY_CAT=$BF84 ?
GO_RECALLD=$BF8A GO_RTS =$B433
GO_RTS2 =$B68C
GO_RWTS:=$B82F ? GO_STORED=$BF8D ?
HANDLERR=$F2E9
? HBF98 =$BF98 ? HBF99
=$BF99 ? HBF9A =$BF9A ?
HBF9C =$BF9C
? HGR =$F3F2 ?
HIGHDS =$94 ? HIGHTR
=$96 HNDLERR =$BA8B
? HOME =$FC58
HOT_BASIC=$B66C ? IDENTGS
=$FE1F IDX =$26
? IN =$FE8B ?
INDEX =$5E
IND_BUF =$BFA8 ? INIT =$FB2F
? INLINE =$D52C
INPRT =$ED19
INTRLEAV=$BFAE ? INVERSE =$F277
? INVFLG =$32
IOBPH =$49
IQERR =$E199 ISTHERE =$BCE6
? KEY
=$C000 KSWH
=$39 KSWL
=$38
L1 =$BB69
L10
=$BC4D L11
=$BC57 L12
=$BC62 L13 =$BC6F
L14
=$BC77 L15
=$BC89 L16
=$BC93 L17 =$BCBC
L18
=$BCC1 L19
=$BCC7 L2
=$BBDF L20 =$BCCC
L21 =$BCFE ?
L22 =$BD01
L3 =$BBE9
L4 =$BBF4
L5
=$BC02 L6
=$BC13 L7
=$BC23 L8
=$BC2D
L9
=$BC37 LAST
=$26 LC088
=$C088 LC089 =$C089
LC08C =$C08C
LC08D =$C08D
LC08E =$C08E
LC08F =$C08F
LEN
=$B5E9 LINKSET
=$D4F2 LINNUM
=$50 LINPRT =$ED24
LISTE_ERR=$B88A
LOAD =$B3AA
LOAD_BLOC=$B804 LOAD_CAT_BLOC=$B69F
LOAD_OBJ=$B434
LOAD_PRG_BAS=$B3B6
LOAD_PRG_BAS2=$B40B ? LOWTR =$9B
? MASK
=$2E MEMSIZ
=$73 MODULE
=$B381 MON =$FF65
? MONZ =$FF69 ?
MOVAF =$EB63
MOVEHEAD=$BCA9 ? MOVFM =$EAF9
? MOVSTR =$E5E2 MSWAIT
=$BCFB NBUF1
=$BE00 NBUF2 =$BF00
NEW
=$B64E NEW2
=$B65C NEWCMD
=$D64B NEWSTT =$D7D2
NEW_VECT=$B72A
NEXT_1ER_BLOC=$BF96
NEXT_CMD=$B628 NIBL
=$BD1F
? NORMAL =$F273 ? NOTRACE
=$F26F
OBJ_1ER_BLOC=$BF7E OBJ_ADR =$BF7A
OBJ_LEN =$BF7C
OBJ_NBR_BLOC=$BF79 OBJ_NOM
=$BF60 OBJ_TYPE=$BF78
OFFTBL =$BD13
OLDBRK =$FA59 ? OLDRST =$FF59
? ONERR =$D8
ONTBL =$BD07
OTHER_CMD=$B31B OUTDO
=$DB5C OUTQUES =$DB5A
OUTSP =$DB57 ? PADDL0
=$C064 ? PADDL1
=$C065 PGEND =$AF
PHASEOFF=$C080
POST1 =$BBC4
POST2 =$BBC6 POSTNB16=$BBC2
? PR =$FE95 ?
PRBL2 =$F94A ? PRBLNK
=$F948 ? PRBYTE =$FDDA
PRENIB1 =$BB04
PRENIB16=$BB00 PRENIB2 =$BB1E
? PRINC =$C054
PRINT =$B588
PRINT_PTR=$B60E
PRINT_VIRGULE=$B61B PRIOR =$27
? PRNTAX =$F941 ? PRNTFAC
=$ED2E ? PRNTX =$F944 ?
PRNTYX =$F940
? PROLOGP =$F832 ? PTRGET
=$DFE3 ? PTRIG
=$C070 PTR_BASIC=$BF9D
? RD80COL =$C01F RDADR16
=$BC42 RDADRX
=$BC9C RDAFLD =$BC6D
RDASYN =$BC46 RDASYN1
=$BC52 RDATA1
=$BBFF RDATA2 =$BC11
? RDAUX =$C003
RDERR =$BC40 ? RDKEY
=$FD0C RDOS_ERR=$B83E
RDOS_VECT=$BE1A ? RDPRINC
=$C002 RDRIGHT
=$BA9E READ =$B59E
READ16 =$BBDA
READD =$B5A1
READY_CATALOG=$B8F7 READY_NXT_BLK=$B902
READ_ERROR=$BA99
READ_OR_PRINT=$BFA9 RECALL
=$B547 RECALLD =$B54A
? RESTART =$D43C
REST_CSW_KSW=$B70E RSYNC
=$BBDC RSYNC1 =$BBE4
RTS0
=$BCFA RUN
=$B3B0 RUNPROG
=$D566 RWTS: =$BA00
RWTS_BUFADR=$BF5C
RWTS_CMD=$BF59
RWTS_DRIVE=$BF57 RWTS_DRV0TRK=$BF5E
RWTS_ERRNUM=$BF5F
RWTS_OLD_DRV=$BF58
RWTS_PISTE=$BF5A RWTS_SECTEUR=$BF5B
RWTS_SLOT16=$BF56
S
=$B62E SAVE
=$B4AA SAVE_1ER_BLOC=$B8FB
SAVE_CSW_KSW=$B703
SAVE_OBJ=$B4CB SECFND
=$2D SEEKABS =$BC9E
SEEKCNT =$04F8
SEEK_FREE=$B692
SEEK_NAME=$B68D SEEK_NAME2=$B6C3
SEEK_NEXT=$B6DA
SEEK_OPT=$B6A2 ? SETCOL =$F864
? SETINV =$FE80
? SETKBD =$FE89 ? SETNORM
=$FE84 ? SETVID
=$FE93 SET_PRT_VECT=$B719
SET_READ_VECT=$B71C
SIGN_RDOS=$B3A6 SKTOKEN
=$B300 SLOTABS =$0678
SLOTEMP =$2B
SLOTZ =$27 ?
SPEAK =$C030 ? SPEEDZ =$F1
? STAT
=$11 STORE
=$B531 ? STORE80 =$C018
STORED =$B542
? STREND =$6D ? STRLIT
=$E3E7 ? STROBE =$C010 ?
STROUT =$DB3A
? STRPRT =$DB3D STXTPT
=$D697 ? SYNERR =$DEC9 ?
TABV =$FB5B
TEMPPT
=$52 TEMPST
=$55 ? TEXT
=$F399 TRANS_6_2=$BD96
TRKCNT
=$26 TRKFND
=$2E TRKN
=$2A TRT_FIN =$B765
TRT_IN =$B76D
TRT_IN_OUT=$B732 ? TRT_OUT
=$B73E TRT_READ_OUT=$B7B2
TRYADR =$BA68 TRYADR2
=$BA70 TRYTRK2 =$BA63 ?
TXTPTR =$B8
TXTTAB
=$67
USR =$B683
VALEUR =$BF9B VAL_BLOCNUM=$BFA5
VAL_MSWAIT=$BF80 ? VARNAM
=$82 ? VARPNT
=$83 VARTAB =$69
VECT_CSW_KSW=$BFAA ?
VTAB =$FC22
WAIT =$FCA8
WDATA0 =$BB66
WDATA2 =$BB7E
WEXIT =$BBB4 ? WNDBTM
=$23 ? WNDLFT =$20
? WNDTOP =$22 ? WNDWDTH
=$21 WNIBL
=$BBBB WNIBL7 =$BBB9
WNIBL9 =$BBB8
WRIT =$BAE4 WRITE16
=$BB2A WRITE_PROTECT=$BA93
WSYNC =$BB4A ?
WTAUX =$C005
WTEMP =$26 ? WTPRINC =$C004
? XFER =$C314
Symbol table - numerical order:
? STAT =$11 ?
WNDLFT =$20 ? WNDWDTH
=$21 ? WNDTOP =$22
? WNDBTM =$23 ?
CH =$24 ?
CV =$25 ?
GBASL =$26
WTEMP
=$26
IDX
=$26 COUNT
=$26 LAST
=$26
TRKCNT =$26 ?
GBASH =$27
SLOTZ =$27
CSUM =$27
PRIOR
=$27 BASL
=$28 ? BASH
=$29 TRKN
=$2A
SLOTEMP =$2B
SECFND =$2D ?
MASK =$2E
TRKFND =$2E
? COLOR =$30 ?
INVFLG =$32
DRIVNO =$35
CSWL =$36
CSWH
=$37 KSWL
=$38 KSWH
=$39 ? A2L =$3E
BUFADR =$3E ?
A2H =$3F ?
A3L =$40 ?
A3H =$41
? A4L =$42
? A4H
=$43 IOBPH
=$49 LINNUM =$50
TEMPPT
=$52 TEMPST
=$55 ? INDEX
=$5E TXTTAB =$67
VARTAB =$69 ?
ARYTAB =$6B ? STREND
=$6D ? FRETOP =$6F
MEMSIZ
=$73 CURLIN
=$75 ? VARNAM
=$82 ? VARPNT =$83
? DSCLEN =$8F ? HIGHDS
=$94 ? HIGHTR
=$96 ? LOWTR =$9B
? FAC
=$9D FACMO
=$A0 ? FACSGN
=$A2 ? ARG =$A5
PGEND
=$AF CHARGET
=$B1 CHARGOT
=$B7 ? TXTPTR =$B8
ERRFLG =$D8 ?
ONERR =$D8 ? ERRNUM
=$DE ? CMDCPT =$EC
? ANL_CPT =$ED ? CURADR
=$EE ? SPEEDZ
=$F1 CURTRK =$0478
SEEKCNT =$04F8 SLOTABS
=$0678 BUFFER1
=$B100 BUFFER2 =$B200
SKTOKEN =$B300
OTHER_CMD=$B31B
COMMANDES=$B341
CAT =$B375
CATD
=$B37F MODULE
=$B381
SIGN_RDOS=$B3A6 LOAD
=$B3AA
RUN
=$B3B0
LOAD_PRG_BAS=$B3B6
LOAD_PRG_BAS2=$B40B CHK_TYPE=$B41C
GO_RTS =$B433
LOAD_OBJ=$B434 GOTO
=$B475 SAVE =$B4AA
SAVE_OBJ=$B4CB
STORE =$B531 STORED
=$B542 RECALL =$B547
RECALLD =$B54A
DEF =$B560
PRINT =$B588
READ =$B59E
READD =$B5A1
END =$B5C5
DEL =$B5CA
DELD =$B5CD
LEN
=$B5E9
PRINT_PTR=$B60E
PRINT_VIRGULE=$B61B
D =$B620
NEXT_CMD=$B628
S
=$B62E GET_NUM
=$B63D NEW =$B64E
NEW2
=$B65C
HOT_BASIC=$B66C
CHK_APLSFT=$B672
USR =$B683
GO_RTS2 =$B68C
SEEK_NAME=$B68D
SEEK_FREE=$B692 LOAD_CAT_BLOC=$B69F
SEEK_OPT=$B6A2
SEEK_NAME2=$B6C3
SEEK_NEXT=$B6DA FIN_CAT =$B701
SAVE_CSW_KSW=$B703
REST_CSW_KSW=$B70E
SET_PRT_VECT=$B719 SET_READ_VECT=$B71C
NEW_VECT=$B72A
TRT_IN_OUT=$B732 ? TRT_OUT
=$B73E TRT_FIN =$B765
TRT_IN =$B76D
TRT_READ_OUT=$B7B2
GET_NAME=$B7BA GET_VAL =$B7F9
GET_VALD=$B7FC
LOAD_BLOC=$B804
CMD_BLOC=$B806 CMD_BLOCD=$B80A
GO_RWTS:=$B82F
RDOS_ERR=$B83E
AFFICHE_ERR=$B858 LISTE_ERR=$B88A
READY_CATALOG=$B8F7
SAVE_1ER_BLOC=$B8FB
READY_NXT_BLK=$B902 CHK_SPACE=$B90B
RWTS: =$BA00
TRYTRK2 =$BA63 TRYADR
=$BA68 TRYADR2 =$BA70
ALLDONE =$BA87 HNDLERR
=$BA8B
WRITE_PROTECT=$BA93 BAD_DRIVE=$BA96
READ_ERROR=$BA99 RDRIGHT
=$BA9E CRCTVOL
=$BAC1 FINI =$BADE
WRIT
=$BAE4
PRENIB16=$BB00 PRENIB1
=$BB04 PRENIB2 =$BB1E
WRITE16 =$BB2A
WSYNC =$BB4A WDATA0
=$BB66 L1
=$BB69
WDATA2 =$BB7E
WEXIT =$BBB4 WNIBL9
=$BBB8 WNIBL7 =$BBB9
WNIBL =$BBBB
POSTNB16=$BBC2 POST1
=$BBC4 POST2 =$BBC6
READ16 =$BBDA
RSYNC =$BBDC
L2 =$BBDF
RSYNC1 =$BBE4
L3
=$BBE9 L4
=$BBF4 RDATA1
=$BBFF L5
=$BC02
RDATA2 =$BC11
L6 =$BC13
L7 =$BC23
L8 =$BC2D
L9
=$BC37 RDERR
=$BC40 RDADR16
=$BC42 RDASYN =$BC46
L10
=$BC4D RDASYN1
=$BC52 L11
=$BC57 L12 =$BC62
RDAFLD =$BC6D
L13 =$BC6F
L14 =$BC77
L15 =$BC89
L16
=$BC93 RDADRX
=$BC9C SEEKABS
=$BC9E MOVEHEAD=$BCA9
L17
=$BCBC L18
=$BCC1 L19
=$BCC7 L20 =$BCCC
ISTHERE =$BCE6 CHKPOS
=$BCEA CHKPOS2
=$BCED RTS0 =$BCFA
MSWAIT =$BCFB
L21 =$BCFE ?
L22 =$BD01
ONTBL =$BD07
OFFTBL =$BD13
NIBL =$BD1F
TRANS_6_2=$BD96 NBUF1 =$BE00
RDOS_VECT=$BE1A
NBUF2 =$BF00
RWTS_SLOT16=$BF56 RWTS_DRIVE=$BF57
RWTS_OLD_DRV=$BF58
RWTS_CMD=$BF59
RWTS_PISTE=$BF5A RWTS_SECTEUR=$BF5B
RWTS_BUFADR=$BF5C
RWTS_DRV0TRK=$BF5E
RWTS_ERRNUM=$BF5F OBJ_NOM =$BF60
OBJ_TYPE=$BF78
OBJ_NBR_BLOC=$BF79 OBJ_ADR
=$BF7A OBJ_LEN =$BF7C
OBJ_1ER_BLOC=$BF7E
VAL_MSWAIT=$BF80
GO_AFF_ERR=$BF81 ? GO_READY_CAT=$BF84
? GO_LOAD_BLOC=$BF87 ?
GO_RECALLD=$BF8A ? GO_STORED=$BF8D
? GO_DELD =$BF90
? GO_CATD =$BF93
NEXT_1ER_BLOC=$BF96 ? HBF98
=$BF98 ? HBF99 =$BF99
? HBF9A =$BF9A
VALEUR =$BF9B ? HBF9C
=$BF9C PTR_BASIC=$BF9D
VAL_BLOCNUM=$BFA5
CPT_NBR_BLOC=$BFA7 IND_BUF
=$BFA8 READ_OR_PRINT=$BFA9
VECT_CSW_KSW=$BFAA
INTRLEAV=$BFAE ? KEY
=$C000 ? RDPRINC =$C002
? RDAUX =$C003 ? WTPRINC
=$C004 ? WTAUX =$C005 ?
STROBE =$C010
? STORE80 =$C018 ? RD80COL =$C01F
? SPEAK =$C030 ? PRINC
=$C054
? AUX =$C055 ?
BUTTN0 =$C061 ? BUTTN1 =$C062
? PADDL0 =$C064
? PADDL1 =$C065 ? PTRIG
=$C070
PHASEOFF=$C080 LC088 =$C088
LC089 =$C089
LC08C =$C08C
LC08D =$C08D
LC08E =$C08E
LC08F =$C08F ? AUXMOVE
=$C311 ? XFER =$C314
? BLTU2 =$D39A
ERRORN =$D412 ? RESTART
=$D43C LINKSET =$D4F2 ?
INLINE =$D52C
RUNPROG =$D566 NEWCMD
=$D64B CLEARC
=$D66C STXTPT =$D697
NEWSTT =$D7D2 ? ADDON
=$D998 CRDO
=$DAFB ? STROUT =$DB3A
? STRPRT =$DB3D
OUTSP =$DB57 OUTQUES
=$DB5A OUTDO =$DB5C
FRMNUM =$DD67
CHKSTR =$DD6C FRMEVL
=$DD7B CHKCOM =$DEBE
? SYNERR =$DEC9 ? PTRGET
=$DFE3 BASIC
=$E000 BASIC2 =$E003
? AYINT =$E10C
IQERR =$E199 ? GIVAYF
=$E2F2 ? STRLIT =$E3E7
? GETSPA =$E452 ? GARBAG
=$E484 ? MOVSTR =$E5E2 ?
FREFAC =$E600
GETBYT =$E6F8
GETADR =$E752 ? FADDT
=$E7C1 ? FMULTT =$E982
? MOVFM =$EAF9 ? MOVAF
=$EB63 ? FLO2
=$EBA0 INPRT =$ED19
LINPRT =$ED24 ? PRNTFAC
=$ED2E ? FOUT =$ED34
? NOTRACE =$F26F
? NORMAL =$F273 ? INVERSE
=$F277 ? HANDLERR=$F2E9 ?
TEXT =$F399
? HGR =$F3F2 ? PROLOGP
=$F832 ? GBASCALC=$F847 ?
SETCOL =$F864
? PRNTYX =$F940 ? PRNTAX
=$F941 ? PRNTX =$F944 ?
PRBLNK =$F948
? PRBL2 =$F94A
OLDBRK =$FA59 ? INIT
=$FB2F ? TABV =$FB5B
? BASCALC =$FBC1 BELL2
=$FBE4 ? VTAB =$FC22
? HOME =$FC58
WAIT =$FCA8 ?
RDKEY =$FD0C ? CROUT
=$FD8E ? PRBYTE =$FDDA
COUT =$FDED ?
COUT1 =$FDF0 ? IDENTGS =$FE1F
? SETINV =$FE80
? SETNORM =$FE84 ? SETKBD
=$FE89 ? IN
=$FE8B ? SETVID =$FE93
? PR =$FE95 ?
BELL =$FF3A ? OLDRST
=$FF59 MON =$FF65
? MONZ =$FF69
Object saved as OBJ/RDOS.SSI,A$B300,L$0D00,BIN
--End assembly, 3328 bytes, Errors: 0
Retour sommaire
Source &CAT.
1
2
ORG $B100
3
4
USE INCLUDE/INCLUDE.ROM
>1
>2
>3 ********************************
>4
*
*
>5 * Adresses de référence
ROM *
>6 * (c)1994 by
Deckard *
>7
*
*
>8 ********************************
>9
>10 KEY EQU
$C000 ; touche entrée
>11 RDPRINC EQU
$C002 ; lire en mem princ
>12 RDAUX EQU
$C003 ; lire en mem aux
>13 WTPRINC EQU
$C004 ; écrire en mem princ
>14 WTAUX EQU
$C005 ; écrire en mem aux
>15 STROBE EQU
$C010 ; remise à zéro
saisie clavier
>16 STORE80 EQU
$C018 ; état de 80STORE
>17 RD80COL EQU
$C01F ; test pour savoir si 80c ou 40c
>18 SPEAK EQU
$C030
>19 PRINC EQU
$C054
>20 AUX EQU
$C055
>21 BUTTN0 EQU
$C061
>22 BUTTN1 EQU
$C062
>23 PADDL0 EQU
$C064 ; état manette 0
>24 PADDL1 EQU
$C065 ; état manette 1
>25 PTRIG EQU
$C070 ; init manette
>26 PHASEOFF EQU
$C080
>27 XFER EQU
$C314
>28 AUXMOVE EQU
$C311
>29 BLTU2 EQU
$D39A
>30 ERRORN EQU
$D412
>31 RESTART EQU
$D43C ; fin traitement erreur
>32 LINKSET EQU
$D4F2 ; init pointeurs basic
>33 RUNPROG EQU
$D566 ; lance prog basic en ram
>34 INLINE EQU
$D52C
>35 NEWCMD EQU
$D64B
>36 CLEARC EQU
$D66C ; fin inits pour prog basic
>37 STXTPT EQU
$D697
>38 NEWSTT EQU
$D7D2
>39 ADDON EQU
$D998 ; ajoute Y à l'adr de chargot
>40 CRDO EQU
$DAFB
>41 STROUT EQU
$DB3A
>42 STRPRT EQU
$DB3D ; affiche une chaine
>43 OUTQUES EQU
$DB5A
>44 OUTSP EQU
$DB57
>45 OUTDO EQU
$DB5C ; affiche caractère ACC 'x'
>46 FRMNUM EQU
$DD67 ; évalue expression et
vérif nbre
>47 CHKSTR EQU
$DD6C ; vérifie que c'est une
chaine
>48 FRMEVL EQU
$DD7B
>49 CHKCOM EQU
$DEBE ; vérifie présence
virgule
>50 SYNERR EQU
$DEC9 ; syntax error
>51 PTRGET EQU
$DFE3 ; positionne sur variable
>52 BASIC EQU
$E000
>53 BASIC2 EQU
$E003
>54 AYINT EQU
$E10C
>55 IQERR EQU
$E199 ; illegal quantity
>56 GIVAYF EQU
$E2F2 ; entier A,Y -> FAC
>57 STRLIT EQU
$E3E7
>58 GETSPA EQU
$E452 ; fait la place pour une chaine
>59 GARBAG EQU
$E484 ; nettoyage chaines
inutilisées
>60 MOVSTR EQU
$E5E2 ; recopie chaine pointée
vers variable
>61 FREFAC EQU
$E600
>62 GETBYT EQU
$E6F8 ; lecture nombre 1 octet -> X
>63 GETADR EQU
$E752 ; lecture nbr. In: Y (low) Acc
(High)
>64 FADDT EQU
$E7C1 ; FAC + ARG -> FAC
>65 FMULTT EQU
$E982 ; FAC * ARG -> FAC
>66 MOVFM EQU
$EAF9 ; A(-),Y(+) ptr flottant cond ->
FAC
>67 MOVAF EQU
$EB63 ; FAC -> ARG
>68 FLO2 EQU
$EBA0 ; routine de LINPRT
>69 INPRT EQU
$ED19
>70 LINPRT EQU
$ED24 ; affichage nombre en décimal
>71 PRNTFAC EQU
$ED2E ; affiche FAC
>72 FOUT EQU
$ED34 ; converti FAC en 1 chaine
>73 NOTRACE EQU
$F26F
>74 NORMAL EQU
$F273 ; mode normal
>75 INVERSE EQU
$F277 ; mode inverse
>76 HANDLERR EQU
$F2E9 ; traitement ON ERR
>77 TEXT EQU
$F399 ; mode TEXT
>78 HGR EQU
$F3F2
>79 PROLOGP EQU
$F832
>80 SETCOL EQU
$F864 ; fixe couleur
>81 GBASCALC EQU
$F847 ; calcul adresse ligne
>82 PRNTYX EQU
$F940
>83 PRNTAX EQU
$F941
>84 PRNTX EQU
$F944
>85 PRBLNK EQU
$F948 ; affiche 3 espaces
>86 PRBL2 EQU
$F94A ; affiche le nb d'espace
donné par X
>87 OLDBRK EQU
$FA59
>88 INIT EQU
$FB2F
>89 TABV EQU
$FB5B ; position curseur
>90 BASCALC EQU
$FBC1
>91 BELL2 EQU
$FBE4
>92 VTAB EQU
$FC22 ; Positionne pour affichage text
>93 HOME EQU
$FC58 ; nettoie écran text
>94 WAIT EQU
$FCA8 ; délai attente
>95 RDKEY EQU
$FD0C ; lecture clavier
>96 CROUT EQU
$FD8E ; affiche retour chariot
>97 PRBYTE EQU
$FDDA
>98 COUT EQU
$FDED ; affiche caractère ACC "x"
>99 COUT1 EQU
$FDF0 ; sortie normale CSW
>100 IDENTGS EQU
$FE1F ; routine identifiant un IIGS
>101 SETINV EQU
$FE80 ; inverse
>102 SETNORM EQU
$FE84 ; normal
>103 SETKBD EQU
$FE89
>104 SETVID EQU
$FE93
>105 IN EQU
$FE8B ; IN#
>106 PR EQU
$FE95 ; PR#
>107 BELL EQU
$FF3A ; bip erreur
>108 OLDRST EQU
$FF59
>109 MON EQU
$FF65
>110 MONZ EQU
$FF69 ; call -151
5
USE INCLUDE/INCLUDE.PAGE0
>1
>2 ********************************
>3
*
*
>4 * Adresses de référence page 0 *
>5 * (c)1994 by
Deckard *
>6
*
*
>7 ********************************
>8
>9
>10 STAT EQU
$11 ; flags dernière
opération sur FAC
>11 WNDLFT EQU
$20 ; marge gauche
>12 WNDWDTH EQU
$21 ; largeur
>13 WNDTOP EQU
$22 ; marge haute
>14 WNDBTM EQU
$23 ; marge basse
>15 CH
EQU $24 ;
position horizontale curseur
>16 CV
EQU $25 ;
position verticale curseur
>17 GBASL EQU
$26 ; adr low ligne
calculée par GBASCALC
>18 GBASH EQU
$27 ; adr high ligne
calculée par GBASCALC
>19 BASL EQU
$28 ;
>20 BASH EQU
$29 ;
>21 MASK EQU
$2E ; parité: 0F
(ligne paire), F0 (ligne impaire)
>22 COLOR EQU
$30 ; couleur après
SETCOL ($F864)
>23 INVFLG EQU
$32 ; #$3F=inverse
#$FF=normal
>24 CSWL EQU
$36 ; sortie de
caractères low
>25 CSWH EQU
$37 ; sortie de
caractères high
>26 KSWL EQU
$38 ; entrée de
caractères low
>27 KSWH EQU
$39 ; entrée de
caractères high
>28 A2L EQU
$3E ; adr travail moniteur
>29 A2H EQU
$3F ; adr travail moniteur
>30 A3L EQU
$40 ; adr travail moniteur
>31 A3H EQU
$41 ; adr travail moniteur
>32 A4L EQU
$42 ; adr travail moniteur
>33 A4H EQU
$43 ; adr travail moniteur
>34 LINNUM EQU
$50
>35 TEMPPT EQU
$52
>36 TEMPST EQU
$55
>37 INDEX EQU
$5E
>38 TXTTAB EQU
$67 ; adr début texte
basic
>39 VARTAB EQU
$69 ; adr début des
variables simples
>40 ARYTAB EQU
$6B ; adr début des
variables dimensionnées
>41 STREND EQU
$6D ; début de
l'espace libre
>42 FRETOP EQU
$6F ; et $70
>43 MEMSIZ EQU
$73 ; et $74
>44 CURLIN EQU
$75
>45 VARNAM EQU
$82 ; infos variable
après PTRGET
>46 VARPNT EQU
$83 ; utilisé par
PTRGET
>47 DSCLEN EQU
$8F
>48 HIGHDS EQU
$94
>49 HIGHTR EQU
$96
>50 LOWTR EQU
$9B
>51 FAC EQU
$9D
>52 FACMO EQU
$A0 ; milieu de FAC (used by
STRPRT)
>53 FACSGN EQU
$A2 ; signe FAC
>54 ARG EQU
$A5
>55 PGEND EQU
$AF ; fin du texte basic
>56 CHARGET EQU
$00B1 ; incrémente et lit
caractère
>57 CHARGOT EQU
$00B7 ; lecture caractère only
>58 TXTPTR EQU
$B8 ; pointeur texte
>59 ERRFLG EQU
$D8 ; flag ONERR
>60 ERRNUM EQU
$DE ; numéro erreur
(mli, ...)
>61 ONERR EQU
$D8 ; POUR ON ERR GOTO...
>62 CMDCPT EQU
$EC ; numéro de la
cmd-1 dans la liste
>63 ANL_CPT EQU
$ED ; numéro de liste
>64 CURADR EQU
$EE ; et $EF adresses de la
liste
>65 SPEEDZ EQU
$F1
6
7 ********************************
8
*
*
9 * Module traitement
&CAT *
10
* RDOS
SSI *
11 * (s)1989-97 by
Deckard *
12
*
*
13 ********************************
14
15 BUFADR EQU
$3E ; pointeur adr
implantation bloc chargé
16
17 OBJ_1ER_BLOC EQU $BF7E ; low 1er bloc
d'un objet
18 GO_READY_CAT EQU $BF84 ; pointe sur
bloc 16 (P$01 S$00)
19 GO_LOAD_BLOC EQU $BF87 ; charge un bloc
20 VALEUR EQU
$BF9B ; nbr de noms avant la pause
21
22 *------------------------------*
23 * Signature module
RDOS *
24 *------------------------------*
25
B100: 52 44 4F 26 RDOS
ASC 'RDOS'
B103: 53
27
28 ********************************
29
B104: A9 89
30
LDA #<LIGNE ; affiche colonnage catalog
B106: A0 B1
31
LDY #>LIGNE
B108: 20 3A DB
32
JSR STROUT
33
B10B: 20 84 BF
34
JSR GO_READY_CAT ; positionne sur catalog
B10E: 20 83 B1
35
JSR INIT_VALEUR ; 18 noms avant la pause
36
37
NXT_BLOC_CAT
B111: 20 87 BF
38
JSR GO_LOAD_BLOC ; charge un bloc catalog
39
40 * Affichage du descriptif d'un objet
41
42
PRINT_DESC
B114: A0 18
43
LDY #24
B116: B1 3E
44
LDA (BUFADR),Y
B118: F0 60
45
BEQ :1 ;
pas d'objet
46
B11A: 20 5C DB
47
JSR OUTDO ; affiche type
B11D: 20 57 DB
48
JSR OUTSP ; et un espace
B120: C8
49
INY
50
B121: B1 3E
51
LDA (BUFADR),Y
B123: AA
52
TAX
; low=nbr bloc
B124: A9 00
53
LDA #0 ;
high=0
B126: 20 BF B1
54
JSR PRINT_NBR ; affiche nbr de blocs
B129: 20 57 DB
55
JSR OUTSP ; et un espace
56
B12C: A0 00
57
LDY #0
B12E: B1 3E 58
:5 LDA (BUFADR),Y ;
affiche le nom de l'objet
B130: 29 7F
59
AND #%01111111
B132: D0 0B
60
BNE :2 ;
objet ok
61
62
; 1er caractère=$80 -> objet supprimé
B134: B9 B2 B1 63
:4 LDA NOTINUSE,Y ;
affiche <not in use>
B137: F0 19
64
BEQ :3 ;
fin de chaine
65
B139: 20 5C DB
66
JSR OUTDO
B13C: C8
67
INY
B13D: D0 F5
68
BNE :4
69
B13F: 20 5C DB 70
:2 JSR
OUTDO ; affiche caractère 1
à 1
B142: C8
71
INY
B143: C0 18
72
CPY #24 ;
jusqu'au 24ième
B145: 90 E7
73
BCC :5
74
B147: A0 1C
75
LDY #28
B149: B1 3E
76
LDA (BUFADR),Y ; taille low
B14B: AA
77
TAX
B14C: C8
78
INY
B14D: B1 3E
79
LDA (BUFADR),Y ; taille high
B14F: 20 24 ED
80
JSR LINPRT ; affiche taille objet
81
B152: A9 24 82
:3 LDA
#36
B154: 85 24
83
STA CH ;
attn: ne fonctionne pas en 80c!
84
B156: A0 1E
85
LDY #30
B158: B1 3E
86
LDA (BUFADR),Y ; 1er bloc low
B15A: AA
87
TAX
B15B: C8
88
INY
B15C: B1 3E
89
LDA (BUFADR),Y ; 1er bloc high
B15E: 20 BF B1
90
JSR PRINT_NBR ; afficher 1er bloc de l'objet
B161: 20 FB DA
91
JSR CRDO ; retour
chariot
B164: 20 7B B1
92
JSR DEC_VALEUR ; test si pause
93
B167: A5 3E
94
LDA BUFADR ; positionne sur le
descriptif objet suivant
B169: 18
95
CLC
B16A: 69 20
96
ADC #32
B16C: 85 3E
97
STA BUFADR ; low
B16E: D0 A4
98
BNE PRINT_DESC ; on n'a pas fini de traiter le bloc
99
B170: EE 7E BF
100
INC OBJ_1ER_BLOC ; high
101
B173: AD 7E BF
102
LDA OBJ_1ER_BLOC ; a-t'on atteint la piste 2?
B176: C9 20
103
CMP #<$0020 ; bloc 32
B178: D0 97
104
BNE NXT_BLOC_CAT ; non->charge le bloc suivant
105
B17A: 60 106
:1
RTS
107
108
109 ********************************
110
*
*
111 * Routines traitement pause *
112
*
*
113 ********************************
114
115
DEC_VALEUR
B17B: CE 9B BF
116
DEC VALEUR ; un objet de moins
avant la pause
B17E: D0 08
117
BNE NO_PAUSE
118
B180: 20 0C FD
119
JSR RDKEY ; attente touche
120
; et réinit pour la prochaine
121
INIT_VALEUR
B183: A9 12
122
LDA #18 ; 18 noms
avant la pause
B185: 8D 9B BF
123
STA VALEUR
B188: 60 124 NO_PAUSE
RTS
125
126
127 *------------------------------*
128 *
Messages
*
129 *------------------------------*
130
B189: 20 20 4C 131 LIGNE ASC
' LEN
-<NAME>- LENGTH BLK'0D00
B18C: 45 4E 20 20
B190: 20 20 20 20
B194: 20 20 20 2D
B198: 3C 4E 41 4D
B19C: 45 3E 2D 20
B1A0: 20 20 20 20
B1A4: 20 20 4C 45
B1A8: 4E 47 54 48
B1AC: 20 42 4C 4B
B1B0: 0D 00
B1B2: 3C 4E 4F 132 NOTINUSE ASC '<NOT IN
USE>'00
B1B5: 54 20 49 4E
B1B9: 20 55 53 45
B1BD: 3E 00
133
134
135 ********************************
136
*
*
137 * Affiche un nombre de 2 bytes *
138 * en
décimal *
139
*
*
140 ********************************
141
142 * Le nombre affiché a systématiquement 3 digits
143 * (on complètera avec des 0 pour les petits nbr).
144 *
145 * In: acc=high nbr
146 * X =low nbr
147
B1BF: A8 148 PRINT_NBR
TAY
; sauve high
B1C0: D0 12
149
BNE :1 ; si
nbr>256 -> affiche tel quel (3 chiffres)
150
B1C2: A9 30
151
LDA #'0' ;
complète avec zéro si nbr<10
B1C4: E0 0A
152
CPX #10
B1C6: B0 03
153
BCS :2
154
B1C8: 20 5C DB
155
JSR OUTDO ; ?'0'
156
B1CB: E0 64 157
:2 CPX
#100 ; complète avec
zéro si nbr<100
B1CD: B0 03
158
BCS :3
159
B1CF: 20 5C DB
160
JSR OUTDO ; ?'0'
161
B1D2: A9 00 162
:3 LDA
#0
B1D4: 4C 24 ED 163 :1
JMP LINPRT ; affiche nbr en
décimal
164
B1D7: 00 00 00
165
DS \
B1DA: 00 00 00 00
B1DE: 00 00 00 00
B1E2: 00 00 00 00
B1E6: 00 00 00 00
B1EA: 00 00 00 00
B1EE: 00 00 00 00
B1F2: 00 00 00 00
B1F6: 00 00 00 00
B1FA: 00 00 00 00
B1FE: 00 00
166
167
SAV OBJ/MODULE.CAT
Object saved as OBJ/MODULE.CAT,A$B100,L$0100,BIN
--End assembly, 256 bytes, Errors: 0
Symbol table - alphabetical order:
? A2H =$3F
? A2L =$3E
? A3H =$41
? A3L =$40
? A4H =$43
? A4L =$42
? ADDON =$D998 ? ANL_CPT =$ED
? ARG =$A5
? ARYTAB =$6B ?
AUX =$C055 ? AUXMOVE =$C311
? AYINT =$E10C ? BASCALC
=$FBC1 ? BASH
=$29 ? BASIC =$E000
? BASIC2 =$E003 ? BASL
=$28 ? BELL
=$FF3A ? BELL2 =$FBE4
? BLTU2 =$D39A
BUFADR =$3E ? BUTTN0
=$C061 ? BUTTN1 =$C062
CH
=$24 ? CHARGET
=$B1 ? CHARGOT
=$B7 ? CHKCOM =$DEBE
? CHKSTR =$DD6C ? CLEARC
=$D66C ? CMDCPT =$EC
? COLOR =$30
? COUT =$FDED ?
COUT1 =$FDF0
CRDO =$DAFB ? CROUT
=$FD8E
? CSWH =$37 ?
CSWL =$36 ?
CURADR =$EE ? CURLIN =$75
? CV
=$25
DEC_VALEUR=$B17B ? DSCLEN
=$8F ? ERRFLG =$D8
? ERRNUM =$DE ? ERRORN
=$D412 ? FAC
=$9D ? FACMO =$A0
? FACSGN =$A2 ?
FADDT =$E7C1 ? FLO2
=$EBA0 ? FMULTT =$E982
? FOUT =$ED34 ? FREFAC
=$E600 ? FRETOP =$6F
? FRMEVL =$DD7B
? FRMNUM =$DD67 ? GARBAG
=$E484 ? GBASCALC=$F847 ?
GBASH =$27
? GBASL =$26 ?
GETADR =$E752 ? GETBYT =$E6F8
? GETSPA =$E452
? GIVAYF =$E2F2
GO_LOAD_BLOC=$BF87
GO_READY_CAT=$BF84 ? HANDLERR=$F2E9
? HGR =$F3F2 ?
HIGHDS =$94 ? HIGHTR
=$96 ? HOME =$FC58
? IDENTGS =$FE1F ?
IN =$FE8B ?
INDEX =$5E ?
INIT =$FB2F
INIT_VALEUR=$B183 ? INLINE
=$D52C ? INPRT =$ED19 ?
INVERSE =$F277
? INVFLG =$32 ?
IQERR =$E199 ?
KEY =$C000 ?
KSWH =$39
? KSWL
=$38 LIGNE
=$B189 ? LINKSET =$D4F2 ?
LINNUM =$50
LINPRT =$ED24 ? LOWTR
=$9B ? MASK
=$2E ? MEMSIZ =$73
? MON =$FF65 ?
MONZ =$FF69 ? MOVAF
=$EB63 ? MOVFM =$EAF9
? MOVSTR =$E5E2 ? NEWCMD
=$D64B ? NEWSTT =$D7D2 ?
NORMAL =$F273
NOTINUSE=$B1B2 ? NOTRACE
=$F26F
NO_PAUSE=$B188 NXT_BLOC_CAT=$B111
OBJ_1ER_BLOC=$BF7E ? OLDBRK
=$FA59 ? OLDRST =$FF59 ?
ONERR =$D8
OUTDO =$DB5C ? OUTQUES
=$DB5A OUTSP
=$DB57 ? PADDL0 =$C064
? PADDL1 =$C065 ? PGEND
=$AF ? PHASEOFF=$C080 ?
PR =$FE95
? PRBL2 =$F94A ? PRBLNK
=$F948 ? PRBYTE =$FDDA ?
PRINC =$C054
PRINT_DESC=$B114
PRINT_NBR=$B1BF ? PRNTAX =$F941
? PRNTFAC =$ED2E
? PRNTX =$F944 ? PRNTYX
=$F940 ? PROLOGP =$F832 ?
PTRGET =$DFE3
? PTRIG =$C070 ? RD80COL
=$C01F ? RDAUX
=$C003 RDKEY =$FD0C
? RDOS =$B100 ? RDPRINC
=$C002 ? RESTART =$D43C ? RUNPROG
=$D566
? SETCOL =$F864 ? SETINV
=$FE80 ? SETKBD =$FE89 ?
SETNORM =$FE84
? SETVID =$FE93 ? SPEAK
=$C030 ? SPEEDZ =$F1
? STAT =$11
? STORE80 =$C018 ? STREND
=$6D ? STRLIT =$E3E7
? STROBE =$C010
STROUT =$DB3A ? STRPRT
=$DB3D ? STXTPT =$D697 ?
SYNERR =$DEC9
? TABV =$FB5B ? TEMPPT
=$52 ? TEMPST
=$55 ? TEXT =$F399
? TXTPTR =$B8 ? TXTTAB
=$67 VALEUR
=$BF9B ? VARNAM =$82
? VARPNT =$83 ? VARTAB
=$69 ? VTAB
=$FC22 ? WAIT =$FCA8
? WNDBTM =$23 ? WNDLFT
=$20 ? WNDTOP
=$22 ? WNDWDTH =$21
? WTAUX =$C005 ? WTPRINC
=$C004 ? XFER =$C314
Symbol table - numerical order:
? STAT =$11 ?
WNDLFT =$20 ? WNDWDTH
=$21 ? WNDTOP =$22
? WNDBTM =$23
CH =$24 ?
CV =$25 ?
GBASL =$26
? GBASH =$27 ?
BASL =$28 ?
BASH =$29 ?
MASK =$2E
? COLOR =$30 ?
INVFLG =$32 ?
CSWL =$36 ?
CSWH =$37
? KSWL =$38 ?
KSWH =$39 ?
A2L
=$3E BUFADR =$3E
? A2H =$3F
? A3L =$40
? A3H =$41
? A4L =$42
? A4H =$43
? LINNUM =$50 ? TEMPPT
=$52 ? TEMPST =$55
? INDEX =$5E ?
TXTTAB =$67 ? VARTAB
=$69 ? ARYTAB =$6B
? STREND =$6D ? FRETOP
=$6F ? MEMSIZ
=$73 ? CURLIN =$75
? VARNAM =$82 ? VARPNT
=$83 ? DSCLEN
=$8F ? HIGHDS =$94
? HIGHTR =$96 ?
LOWTR =$9B ?
FAC =$9D ?
FACMO =$A0
? FACSGN =$A2 ?
ARG =$A5 ?
PGEND =$AF ? CHARGET =$B1
? CHARGOT =$B7 ? TXTPTR
=$B8 ? ERRFLG
=$D8 ? ONERR =$D8
? ERRNUM =$DE ? CMDCPT
=$EC ? ANL_CPT
=$ED ? CURADR =$EE
? SPEEDZ =$F1 ?
RDOS =$B100
NXT_BLOC_CAT=$B111 PRINT_DESC=$B114
DEC_VALEUR=$B17B
INIT_VALEUR=$B183
NO_PAUSE=$B188 LIGNE =$B189
NOTINUSE=$B1B2
PRINT_NBR=$B1BF
OBJ_1ER_BLOC=$BF7E GO_READY_CAT=$BF84
GO_LOAD_BLOC=$BF87
VALEUR =$BF9B ? KEY
=$C000 ? RDPRINC =$C002
? RDAUX =$C003 ? WTPRINC
=$C004 ? WTAUX =$C005 ?
STROBE =$C010
? STORE80 =$C018 ? RD80COL =$C01F
? SPEAK =$C030 ? PRINC
=$C054
? AUX =$C055 ?
BUTTN0 =$C061 ? BUTTN1 =$C062
? PADDL0 =$C064
? PADDL1 =$C065 ? PTRIG
=$C070 ? PHASEOFF=$C080 ? AUXMOVE
=$C311
? XFER =$C314 ?
BLTU2 =$D39A ? ERRORN
=$D412 ? RESTART =$D43C
? LINKSET =$D4F2 ? INLINE
=$D52C ? RUNPROG =$D566 ?
NEWCMD =$D64B
? CLEARC =$D66C ? STXTPT
=$D697 ? NEWSTT =$D7D2 ?
ADDON =$D998
CRDO
=$DAFB STROUT =$DB3A
? STRPRT =$DB3D
OUTSP =$DB57
? OUTQUES =$DB5A OUTDO
=$DB5C ? FRMNUM =$DD67 ?
CHKSTR =$DD6C
? FRMEVL =$DD7B ? CHKCOM
=$DEBE ? SYNERR =$DEC9 ?
PTRGET =$DFE3
? BASIC =$E000 ? BASIC2
=$E003 ? AYINT =$E10C ?
IQERR =$E199
? GIVAYF =$E2F2 ? STRLIT
=$E3E7 ? GETSPA =$E452 ?
GARBAG =$E484
? MOVSTR =$E5E2 ? FREFAC
=$E600 ? GETBYT =$E6F8 ?
GETADR =$E752
? FADDT =$E7C1 ? FMULTT
=$E982 ? MOVFM =$EAF9 ?
MOVAF =$EB63
? FLO2 =$EBA0 ?
INPRT =$ED19 LINPRT
=$ED24 ? PRNTFAC =$ED2E
? FOUT =$ED34 ? NOTRACE
=$F26F ? NORMAL =$F273 ?
INVERSE =$F277
? HANDLERR=$F2E9 ? TEXT
=$F399 ? HGR
=$F3F2 ? PROLOGP =$F832
? GBASCALC=$F847 ? SETCOL
=$F864 ? PRNTYX =$F940 ?
PRNTAX =$F941
? PRNTX =$F944 ? PRBLNK
=$F948 ? PRBL2 =$F94A ?
OLDBRK =$FA59
? INIT =$FB2F ?
TABV =$FB5B ? BASCALC
=$FBC1 ? BELL2 =$FBE4
? VTAB =$FC22 ?
HOME =$FC58 ?
WAIT =$FCA8
RDKEY =$FD0C
? CROUT =$FD8E ? PRBYTE
=$FDDA ? COUT =$FDED
? COUT1 =$FDF0
? IDENTGS =$FE1F ? SETINV
=$FE80 ? SETNORM =$FE84 ?
SETKBD =$FE89
? IN =$FE8B ?
SETVID =$FE93 ?
PR =$FE95 ?
BELL =$FF3A
? OLDRST =$FF59 ?
MON =$FF65 ?
MONZ =$FF69
Exemple de &CAT sur la face 1 de Pool Of Radiance:
(pour stopper le programme, il suffit de faire un ctrl-C au
démarrage!! puis de taper &CAT)
]&CAT
LEN
-<NAME>- LENGTH BLK
B 032 POOL APPLE SIDE A1 V1.1 8192 000
T 001
SYSTEMBOOT
256 032
B 004
ANIMATE00
928 033
B 004
ANIMATE01
963 037
B 003
BODY03
552 041
B 003
BODY07
558 044
B 003
BODY19
546 047
B 008
CHARPIC00
2045 050
B 025
CHARPIC01
6216 058
B 006
CHARPIC02
1280 083
B 008
CHARPIC03
1920 089
B 015
CHARPIC04
3600 097
B 004
CHARPIC05
768 112
B 005
CHARPIC10
1024 116
B 005
CHARSET
1024 121
B 018
COM.PREP
4365 126
B 001
COMPIC02
192 144
B 001
COMPIC03
192 145
B 001
COMPIC04
192 146
B 001
COMPIC05
192 147
B 001
COMPIC06
192 148
B 001
COMPIC07
192 149
B 002
COMPIC08
384 150
B 001
COMPIC09
192 152
B 001
COMPIC0B
192 153
B 001
COMPIC10
192 154
B 001
COMPIC21
192 155
B 004
COPYIT
864 156
B 026
ECL12
6642 160
B 030
ECL18
7654 186
B 005
ECL1E
1216 216
B 013
ECL64
3326 221
B 003
ECL65
751 234
B 012
GDRIVE00
3046 237
B 012
GDRIVE01
3034 249
B 005
GEO12
1024 261
B 005
GEO18
1024 266
B 005
GEO1F
1024 271
B 002
HEAD06
296 276
B 002
HEAD0D
331 278
B 002
HEAD30
281 280
B 014
INIT
3536 282
B 002
IOBANK
304 296
B 001
ITEMFILE04
16 298
B 001
ITEMFILE06
48 299
B 001
ITEMFILE08
48 300
B 001
ITEMFILE09
112 301
B 001
ITEMFILE11
128 302
B 001
ITEMFILE16
16 303
B 004
ITEMFILE35
912 304
B 013
ITEMNAMES
3072 308
B 009
ITEMS
2048 321
B 001
LINKER
176 330
B 002
MON02
480 331
B 002
MON03
480 333
B 001
MON04
255 335
B 002
MON05
480 336
B 001
MON06
255 338
B 002
MON07
480 339
B 001
MON08
255 341
B 002
MON09
480 342
B 002
MON16
480 344
B 001
STAR
192 346
B 002
MON21
480 347
B 002
MON29
480 349
B 002
MON2C
480 351
B 002
MON4F
480 353
B 002
MON6B
480 355
B 005
MUSIC
1134 357
B 004
PIC01
992 362
B 005
PIC02
1040 366
B 009
PIC04
2120 371
B 007
PIC06
1741 380
B 006
PIC08
1509 387
B 007
PIC10
1652 393
B 005
PIC1D
1037 400
B 035
POST.COM
8914 405
B 003
SECSET02
671 440
B 003
SOUNDFX
559 443
B 008
SPELLE00
1982 446
B 008
SPELLE01
2042 454
B 004
SPELLE02
1012 462
B 008
SPELLE04
2022 466
B 007
SPELLN00
1776 474
B 003
SPRITE02
680 481
B 003
SPRITE04
648 484
B 003
SPRITE06
536 487
B 003
SPRITE08
696 490
B 004
SPRITE13
856 493
B 004
SQRPACI64
957 497
001 <NOT IN
USE>
501
B 019
TITLEPAGE
4644 502
B 004
WALLDEF01
967 521
B 005
WALLDEF03
1153 525
B 004
WALLDEF05
960 530
B 005
WALLSET01
1127 534
B 005
WALLSET03
1278 539
B 005
WALLSET05
1213 544
B 005
MON17
480 549
A 006
HELLO
1336 554
Retour sommaire
Source &GOTO.
1
2
ORG $B100
3
4
USE INCLUDE/INCLUDE.ROM
>1
>2
>3 ********************************
>4
*
*
>5 * Adresses de référence
ROM *
>6 * (c)1994 by
Deckard *
>7
*
*
>8 ********************************
>9
>10 KEY EQU
$C000 ; touche entrée
>11 RDPRINC EQU
$C002 ; lire en mem princ
>12 RDAUX EQU
$C003 ; lire en mem aux
>13 WTPRINC EQU
$C004 ; écrire en mem princ
>14 WTAUX EQU
$C005 ; écrire en mem aux
>15 STROBE EQU
$C010 ; remise à zéro
saisie clavier
>16 STORE80 EQU
$C018 ; état de 80STORE
>17 RD80COL EQU
$C01F ; test pour savoir si 80c ou 40c
>18 SPEAK EQU
$C030
>19 PRINC EQU
$C054
>20 AUX EQU
$C055
>21 BUTTN0 EQU
$C061
>22 BUTTN1 EQU
$C062
>23 PADDL0 EQU
$C064 ; état manette 0
>24 PADDL1 EQU
$C065 ; état manette 1
>25 PTRIG EQU
$C070 ; init manette
>26 PHASEOFF EQU
$C080
>27 XFER EQU
$C314
>28 AUXMOVE EQU
$C311
>29 BLTU2 EQU
$D39A
>30 ERRORN EQU
$D412
>31 RESTART EQU
$D43C ; fin traitement erreur
>32 LINKSET EQU
$D4F2 ; init pointeurs basic
>33 RUNPROG EQU
$D566 ; lance prog basic en ram
>34 INLINE EQU
$D52C
>35 NEWCMD EQU
$D64B
>36 CLEARC EQU
$D66C ; fin inits pour prog basic
>37 STXTPT EQU
$D697
>38 NEWSTT EQU
$D7D2
>39 ADDON EQU
$D998 ; ajoute Y à l'adr de chargot
>40 CRDO EQU
$DAFB
>41 STROUT EQU
$DB3A
>42 STRPRT EQU
$DB3D ; affiche une chaine
>43 OUTQUES EQU
$DB5A
>44 OUTSP EQU
$DB57
>45 OUTDO EQU
$DB5C ; affiche caractère ACC 'x'
>46 FRMNUM EQU
$DD67 ; évalue expression et
vérif nbre
>47 CHKSTR EQU
$DD6C ; vérifie que c'est une
chaine
>48 FRMEVL EQU
$DD7B
>49 CHKCOM EQU
$DEBE ; vérifie présence
virgule
>50 SYNERR EQU
$DEC9 ; syntax error
>51 PTRGET EQU
$DFE3 ; positionne sur variable
>52 BASIC EQU
$E000
>53 BASIC2 EQU
$E003
>54 AYINT EQU
$E10C
>55 IQERR EQU
$E199 ; illegal quantity
>56 GIVAYF EQU
$E2F2 ; entier A,Y -> FAC
>57 STRLIT EQU
$E3E7
>58 GETSPA EQU
$E452 ; fait la place pour une chaine
>59 GARBAG EQU
$E484 ; nettoyage chaines
inutilisées
>60 MOVSTR EQU
$E5E2 ; recopie chaine pointée
vers variable
>61 FREFAC EQU
$E600
>62 GETBYT EQU
$E6F8 ; lecture nombre 1 octet -> X
>63 GETADR EQU
$E752 ; lecture nbr. In: Y (low) Acc
(High)
>64 FADDT EQU
$E7C1 ; FAC + ARG -> FAC
>65 FMULTT EQU
$E982 ; FAC * ARG -> FAC
>66 MOVFM EQU
$EAF9 ; A(-),Y(+) ptr flottant cond ->
FAC
>67 MOVAF EQU
$EB63 ; FAC -> ARG
>68 FLO2 EQU
$EBA0 ; routine de LINPRT
>69 INPRT EQU
$ED19
>70 LINPRT EQU
$ED24 ; affichage nombre en décimal
>71 PRNTFAC EQU
$ED2E ; affiche FAC
>72 FOUT EQU
$ED34 ; converti FAC en 1 chaine
>73 NOTRACE EQU
$F26F
>74 NORMAL EQU
$F273 ; mode normal
>75 INVERSE EQU
$F277 ; mode inverse
>76 HANDLERR EQU
$F2E9 ; traitement ON ERR
>77 TEXT EQU
$F399 ; mode TEXT
>78 HGR EQU
$F3F2
>79 PROLOGP EQU
$F832
>80 SETCOL EQU
$F864 ; fixe couleur
>81 GBASCALC EQU
$F847 ; calcul adresse ligne
>82 PRNTYX EQU
$F940
>83 PRNTAX EQU
$F941
>84 PRNTX EQU
$F944
>85 PRBLNK EQU
$F948 ; affiche 3 espaces
>86 PRBL2 EQU
$F94A ; affiche le nb d'espace
donné par X
>87 OLDBRK EQU
$FA59
>88 INIT EQU
$FB2F
>89 TABV EQU
$FB5B ; position curseur
>90 BASCALC EQU
$FBC1
>91 BELL2 EQU
$FBE4
>92 VTAB EQU
$FC22 ; Positionne pour affichage text
>93 HOME EQU
$FC58 ; nettoie écran text
>94 WAIT EQU
$FCA8 ; délai attente
>95 RDKEY EQU
$FD0C ; lecture clavier
>96 CROUT EQU
$FD8E ; affiche retour chariot
>97 PRBYTE EQU
$FDDA
>98 COUT EQU
$FDED ; affiche caractère ACC "x"
>99 COUT1 EQU
$FDF0 ; sortie normale CSW
>100 IDENTGS EQU
$FE1F ; routine identifiant un IIGS
>101 SETINV EQU
$FE80 ; inverse
>102 SETNORM EQU
$FE84 ; normal
>103 SETKBD EQU
$FE89
>104 SETVID EQU
$FE93
>105 IN EQU
$FE8B ; IN#
>106 PR EQU
$FE95 ; PR#
>107 BELL EQU
$FF3A ; bip erreur
>108 OLDRST EQU
$FF59
>109 MON EQU
$FF65
>110 MONZ EQU
$FF69 ; call -151
5
USE INCLUDE/INCLUDE.PAGE0
>1
>2 ********************************
>3
*
*
>4 * Adresses de référence page 0 *
>5 * (c)1994 by
Deckard *
>6
*
*
>7 ********************************
>8
>9
>10 STAT EQU
$11 ; flags dernière
opération sur FAC
>11 WNDLFT EQU
$20 ; marge gauche
>12 WNDWDTH EQU
$21 ; largeur
>13 WNDTOP EQU
$22 ; marge haute
>14 WNDBTM EQU
$23 ; marge basse
>15 CH
EQU $24 ;
position horizontale curseur
>16 CV
EQU $25 ;
position verticale curseur
>17 GBASL EQU
$26 ; adr low ligne
calculée par GBASCALC
>18 GBASH EQU
$27 ; adr high ligne
calculée par GBASCALC
>19 BASL EQU
$28 ;
>20 BASH EQU
$29 ;
>21 MASK EQU
$2E ; parité: 0F
(ligne paire), F0 (ligne impaire)
>22 COLOR EQU
$30 ; couleur après
SETCOL ($F864)
>23 INVFLG EQU
$32 ; #$3F=inverse
#$FF=normal
>24 CSWL EQU
$36 ; sortie de
caractères low
>25 CSWH EQU
$37 ; sortie de
caractères high
>26 KSWL EQU
$38 ; entrée de
caractères low
>27 KSWH EQU
$39 ; entrée de
caractères high
>28 A2L EQU
$3E ; adr travail moniteur
>29 A2H EQU
$3F ; adr travail moniteur
>30 A3L EQU
$40 ; adr travail moniteur
>31 A3H EQU
$41 ; adr travail moniteur
>32 A4L EQU
$42 ; adr travail moniteur
>33 A4H EQU
$43 ; adr travail moniteur
>34 LINNUM EQU
$50
>35 TEMPPT EQU
$52
>36 TEMPST EQU
$55
>37 INDEX EQU
$5E
>38 TXTTAB EQU
$67 ; adr début texte
basic
>39 VARTAB EQU
$69 ; adr début des
variables simples
>40 ARYTAB EQU
$6B ; adr début des
variables dimensionnées
>41 STREND EQU
$6D ; début de
l'espace libre
>42 FRETOP EQU
$6F ; et $70
>43 MEMSIZ EQU
$73 ; et $74
>44 CURLIN EQU
$75
>45 VARNAM EQU
$82 ; infos variable
après PTRGET
>46 VARPNT EQU
$83 ; utilisé par
PTRGET
>47 DSCLEN EQU
$8F
>48 HIGHDS EQU
$94
>49 HIGHTR EQU
$96
>50 LOWTR EQU
$9B
>51 FAC EQU
$9D
>52 FACMO EQU
$A0 ; milieu de FAC (used by
STRPRT)
>53 FACSGN EQU
$A2 ; signe FAC
>54 ARG EQU
$A5
>55 PGEND EQU
$AF ; fin du texte basic
>56 CHARGET EQU
$00B1 ; incrémente et lit
caractère
>57 CHARGOT EQU
$00B7 ; lecture caractère only
>58 TXTPTR EQU
$B8 ; pointeur texte
>59 ERRFLG EQU
$D8 ; flag ONERR
>60 ERRNUM EQU
$DE ; numéro erreur
(mli, ...)
>61 ONERR EQU
$D8 ; POUR ON ERR GOTO...
>62 CMDCPT EQU
$EC ; numéro de la
cmd-1 dans la liste
>63 ANL_CPT EQU
$ED ; numéro de liste
>64 CURADR EQU
$EE ; et $EF adresses de la
liste
>65 SPEEDZ EQU
$F1
6
7 ********************************
8
*
*
9 * Module traitement
&GOTO *
10
* RDOS
SSI *
11 * (s)1989-97 by
Deckard *
12
*
*
13 ********************************
14
15 LC089 EQU
$C089
16 RWTS_SLOT16 EQU $BF56 ; slot*16
17
18
19 *------------------------------*
20 * Signature module
RDOS *
21 *------------------------------*
22
B100: 52 44 4F 23 RDOS
ASC 'RDOS'
B103: 53
24
25 ********************************
26
B104: AE 56 BF
27
LDX RWTS_SLOT16 ; slot*16
B107: BD 89 C0
28
LDA LC089,X ; motor on (avant chargement
nouveau prog basic)
29
B10A: 20 84 E4
30
JSR GARBAG ; nettoyage chaine
31
32 * Traitement VARTAB (variables simples, pointeurs de
chaines
33 * et de fonctions)
34
B10D: A9 07
35
LDA #7 ; 2
caractères pour le nom et 5 octets pour la valeur
B10F: 85 8F
36
STA DSCLEN
B111: A5 69
37
LDA VARTAB ; init:FAC=VARTAB
B113: A6 6A
38
LDX VARTAB+1
B115: 85 9D
39
STA FAC
B117: 86 9E
40
STX FAC+1
41
B119: E4 6C 42
:3 CPX
ARYTAB+1 ; reste t'il de ce type de données?
B11B: D0 04
43
BNE :1 ; oui
B11D: C5 6B
44
CMP ARYTAB
B11F: F0 05
45
BEQ :2 ; non
46
B121: 20 7B B1 47
:1 JSR COPY_CHAINE ;
sauvegarde chaine du texte basic dans espace libre
B124: F0 F3
48
BEQ :3 ;
toujours: traite variable suivante
49
50 * Traitement ARYTAB (variables dimensionnées,
pointeurs des
51 * tableaux de chaines)
52
B126: 85 9F 53
:2 STA
FAC+2 ; sauve pointeur ARYTAB
B128: 86 A0
54
STX FACMO
B12A: A9 03
55
LDA #3 ; 2
caractères nom variable+1 octet taille descriptif
B12C: 85 8F
56
STA DSCLEN
57
B12E: A5 9F 58 NEXT_TAB
LDA FAC+2
B130: A6 A0
59
LDX FACMO
60
61
NEXT_TAB2
B132: E4 6E
62
CPX STREND+1 ; reste t'il de ce type de
données?
B134: D0 05
63
BNE TRT_TAB ; oui
64
B136: C5 6D
65
CMP STREND
B138: D0 01
66
BNE TRT_TAB ; oui
67
B13A: 60
68
RTS
; FIN CHAIN (on a atteint le début de l'espace libre)
69
70
71 ********************************
72
*
*
73 * Traite un tableau de chaines *
74 * afin de recopier chaque *
75 * string du texte basic dans *
76 * l'espace libre
après *
77 *
allocation *
78
*
*
79 ********************************
80
B13B: 85 9D 81 TRT_TAB
STA FAC ;
FAC=pointeur courant ARYTAB
B13D: 86 9E
82
STX FAC+1
83
B13F: A0 00
84
LDY #0
B141: B1 9D
85
LDA (FAC),Y
B143: AA
86
TAX
; X=1er caractère nom variable
B144: C8
87
INY
B145: B1 9D
88
LDA (FAC),Y
B147: 08
89
PHP
; sauve état N (bit 7 octet) pour BPL/BMI 2nd
90
; caractère nom variable
B148: C8
91
INY
B149: B1 9D
92
LDA (FAC),Y ; taille descriptif low+ptr
courant ARYTAB
B14B: 65 9F
93
ADC FAC+2
B14D: 85 9F
94
STA FAC+2
B14F: C8
95
INY
B150: B1 9D
96
LDA (FAC),Y ; idem high
B152: 65 A0
97
ADC FACMO
B154: 85 A0
98
STA FACMO ; FAC+2/FACMO
pointe sur le descriptif du prochain
99
; tableau
100
B156: 28
101
PLP
; 2nd caractère nom variable
B157: 10 D5
102
BPL NEXT_TAB ; tableau de réels
103
B159: 8A
104
TXA
; 1er caractère nom variable
B15A: 30 D2
105
BMI NEXT_TAB ; tableau d'entiers
106
107
; tableau de chaines
B15C: C8
108
INY
B15D: B1 9D
109
LDA (FAC),Y ; nbr de dimensions*2 pour
skipper ces éléments
B15F: A0 00
110
LDY #0 ;
descriptifs
B161: 0A
111
ASL
B162: 69 05
112
ADC #5 ; +5
octets=1(nom variable)+2(taille descr)+1(nbr de
B164: 65 9D
113
ADC FAC ;
dimensions)
B166: 85 9D
114
STA FAC ; FAC
pointe sur le descriptif valeur d'une chaine
B168: 90 02
115
BCC :1 ; du
tableau
116
B16A: E6 9E
117
INC FAC+1 ; high
118
B16C: A6 9E 119
:1 LDX
FAC+1 ; a-t'on traiter tous les indices
du tableau?
120
B16E: E4 A0 121
:3 CPX
FACMO
B170: D0 04
122
BNE :2 ; non
B172: C5 9F
123
CMP FAC+2
B174: F0 BC
124
BEQ NEXT_TAB2 ; oui
125
B176: 20 85 B1 126 :2
JSR COPY_CHAINE2
B179: F0 F3
127
BEQ :3 ;
toujours
128
129
130 ********************************
131
*
*
132 * Recopie une chaine du texte *
133 * basic dans l'espace libre *
134 * après allocation
place *
135
*
*
136 ********************************
137
138 * In: FAC est positionné sur le pointeur
désiré
139 * Out: FAC pointe sur le descriptif suivant
140
141
COPY_CHAINE
B17B: B1 9D
142
LDA (FAC),Y ; 1er caractère du nom
de la variable
B17D: 30 46
143
BMI NEXT_VAR ; entier ou fonction
144
B17F: C8
145
INY
; réel ou chaine
B180: B1 9D
146
LDA (FAC),Y ; 2nd caractère du nom
variable
B182: 10 41
147
BPL NEXT_VAR ; réel
B184: C8
148
INY
149
150 * Traitement des chaines
151
152
COPY_CHAINE2
B185: B1 9D
153
LDA (FAC),Y ; longueur
B187: F0 3C
154
BEQ NEXT_VAR ; chaine vide, passe à la
suivante
155
B189: C8
156
INY
B18A: B1 9D
157
LDA (FAC),Y ; X=low adr chaine
B18C: AA
158
TAX
B18D: C8
159
INY
B18E: B1 9D
160
LDA (FAC),Y ; acc=high adr chaine
B190: 85 9C
161
STA LOWTR+1
B192: 86 9B
162
STX LOWTR
B194: C5 B0
163
CMP PGEND+1
B196: F0 02
164
BEQ :1 ;
valeur inclue dans le texte basic/prog non executé
B198: B0 2B
165
BGE NEXT_VAR ; valeur hors texte basic
166
B19A: 88 167
:1
DEY
B19B: 88
168
DEY
B19C: B1 9D
169
LDA (FAC),Y ; longueur
B19E: 48
170
PHA
B19F: 38
171
SEC
B1A0: A5 6F
172
LDA FRETOP ; fin de l'espace
libre-taille chaine
B1A2: 85 94
173
STA HIGHDS
B1A4: F1 9D
174
SBC (FAC),Y
B1A6: C8
175
INY
B1A7: 91 9D
176
STA (FAC),Y ; définit nouvelle adr
low chaine
B1A9: 85 6F
177
STA FRETOP ; nouvelle fin espace
libre low
B1AB: C8
178
INY
B1AC: A5 70
179
LDA FRETOP+1
B1AE: 85 95
180
STA HIGHDS+1
B1B0: E9 00
181
SBC #0 ;
retenue
B1B2: 91 9D
182
STA (FAC),Y ; high adr chaine
B1B4: 85 70
183
STA FRETOP+1 ; high fin espace libre
B1B6: 68
184
PLA
; longueur
185
B1B7: 18
186
CLC
B1B8: 65 9B
187
ADC LOWTR ; HIGHTR=adr dans
texte basic+longueur
B1BA: 85 96
188
STA HIGHTR
B1BC: A5 9C
189
LDA LOWTR+1
B1BE: 69 00
190
ADC #0
B1C0: 85 97
191
STA HIGHTR+1
B1C2: 20 9A D3
192
JSR BLTU2 ; recopie dans
l'espace créé le contenu de la chaine
193
194
B1C5: A5 8F 195 NEXT_VAR LDA
DSCLEN ; ajoute taille descriptif variable
B1C7: 18
196
CLC
B1C8: 65 9D
197
ADC FAC
B1CA: 85 9D
198
STA FAC ; low
B1CC: 90 02
199
BCC :1
200
B1CE: E6 9E
201
INC FAC+1 ; high
202
B1D0: A5 9D 203
:1 LDA
FAC
B1D2: A6 9E
204
LDX FAC+1
B1D4: A0 00
205
LDY #0 ;
BEQ always
B1D6: 60
206
RTS
207
B1D7: 00 00 00
208
DS \
B1DA: 00 00 00 00
B1DE: 00 00 00 00
B1E2: 00 00 00 00
B1E6: 00 00 00 00
B1EA: 00 00 00 00
B1EE: 00 00 00 00
B1F2: 00 00 00 00
B1F6: 00 00 00 00
B1FA: 00 00 00 00
B1FE: 00 00
209
210
SAV OBJ/MODULE.CHAIN/
Object saved as OBJ/MODULE.CHAIN/,A$B100,L$0100,BIN
--End assembly, 256 bytes, Errors: 0
Symbol table - alphabetical order:
? A2H =$3F
? A2L =$3E
? A3H =$41
? A3L =$40
? A4H =$43
? A4L =$42
? ADDON =$D998 ? ANL_CPT =$ED
? ARG
=$A5 ARYTAB
=$6B ? AUX
=$C055 ? AUXMOVE =$C311
? AYINT =$E10C ? BASCALC
=$FBC1 ? BASH
=$29 ? BASIC =$E000
? BASIC2 =$E003 ? BASL
=$28 ? BELL
=$FF3A ? BELL2 =$FBE4
BLTU2 =$D39A ? BUTTN0
=$C061 ? BUTTN1 =$C062 ?
CH =$24
? CHARGET =$B1 ? CHARGOT
=$B7 ? CHKCOM =$DEBE
? CHKSTR =$DD6C
? CLEARC =$D66C ? CMDCPT
=$EC ? COLOR
=$30 COPY_CHAINE=$B17B
COPY_CHAINE2=$B185 ?
COUT =$FDED ? COUT1
=$FDF0 ? CRDO =$DAFB
? CROUT =$FD8E ?
CSWH =$37 ?
CSWL =$36 ?
CURADR =$EE
? CURLIN =$75 ?
CV
=$25 DSCLEN
=$8F ? ERRFLG =$D8
? ERRNUM =$DE ? ERRORN
=$D412 FAC
=$9D FACMO =$A0
? FACSGN =$A2 ?
FADDT =$E7C1 ? FLO2
=$EBA0 ? FMULTT =$E982
? FOUT =$ED34 ? FREFAC
=$E600 FRETOP
=$6F ? FRMEVL =$DD7B
? FRMNUM =$DD67 GARBAG
=$E484 ? GBASCALC=$F847 ?
GBASH =$27
? GBASL =$26 ?
GETADR =$E752 ? GETBYT =$E6F8
? GETSPA =$E452
? GIVAYF =$E2F2 ?
HANDLERR=$F2E9 ? HGR
=$F3F2 HIGHDS =$94
HIGHTR =$96 ?
HOME =$FC58 ? IDENTGS
=$FE1F ? IN =$FE8B
? INDEX =$5E ?
INIT =$FB2F ? INLINE
=$D52C ? INPRT =$ED19
? INVERSE =$F277 ? INVFLG
=$32 ? IQERR
=$E199 ? KEY =$C000
? KSWH =$39 ?
KSWL =$38
LC089 =$C089 ? LINKSET =$D4F2
? LINNUM =$50 ? LINPRT
=$ED24 LOWTR
=$9B ? MASK =$2E
? MEMSIZ =$73 ?
MON =$FF65 ?
MONZ =$FF69 ? MOVAF
=$EB63
? MOVFM =$EAF9 ? MOVSTR
=$E5E2 ? NEWCMD =$D64B ?
NEWSTT =$D7D2
NEXT_TAB=$B12E
NEXT_TAB2=$B132
NEXT_VAR=$B1C5 ? NORMAL =$F273
? NOTRACE =$F26F ? OLDBRK
=$FA59 ? OLDRST =$FF59 ?
ONERR =$D8
? OUTDO =$DB5C ? OUTQUES
=$DB5A ? OUTSP =$DB57 ?
PADDL0 =$C064
? PADDL1 =$C065
PGEND =$AF ?
PHASEOFF=$C080 ? PR
=$FE95
? PRBL2 =$F94A ? PRBLNK
=$F948 ? PRBYTE =$FDDA ?
PRINC =$C054
? PRNTAX =$F941 ? PRNTFAC
=$ED2E ? PRNTX =$F944 ?
PRNTYX =$F940
? PROLOGP =$F832 ? PTRGET
=$DFE3 ? PTRIG =$C070 ?
RD80COL =$C01F
? RDAUX =$C003 ? RDKEY
=$FD0C ? RDOS =$B100
? RDPRINC =$C002
? RESTART =$D43C ? RUNPROG
=$D566 RWTS_SLOT16=$BF56
? SETCOL =$F864
? SETINV =$FE80 ? SETKBD
=$FE89 ? SETNORM =$FE84 ?
SETVID =$FE93
? SPEAK =$C030 ? SPEEDZ
=$F1 ? STAT
=$11 ? STORE80 =$C018
STREND =$6D ?
STRLIT =$E3E7 ? STROBE =$C010
? STROUT =$DB3A
? STRPRT =$DB3D ? STXTPT
=$D697 ? SYNERR =$DEC9 ?
TABV =$FB5B
? TEMPPT =$52 ? TEMPST
=$55 ? TEXT
=$F399 TRT_TAB =$B13B
? TXTPTR =$B8 ? TXTTAB
=$67 ? VARNAM
=$82 ? VARPNT =$83
VARTAB =$69 ?
VTAB =$FC22 ?
WAIT =$FCA8 ? WNDBTM =$23
? WNDLFT =$20 ? WNDTOP
=$22 ? WNDWDTH
=$21 ? WTAUX =$C005
? WTPRINC =$C004 ? XFER
=$C314
Symbol table - numerical order:
? STAT =$11 ?
WNDLFT =$20 ? WNDWDTH
=$21 ? WNDTOP =$22
? WNDBTM =$23 ?
CH =$24 ?
CV =$25 ?
GBASL =$26
? GBASH =$27 ?
BASL =$28 ?
BASH =$29 ?
MASK =$2E
? COLOR =$30 ?
INVFLG =$32 ?
CSWL =$36 ?
CSWH =$37
? KSWL =$38 ?
KSWH =$39 ?
A2L =$3E ?
A2H =$3F
? A3L =$40
? A3H =$41
? A4L =$42
? A4H =$43
? LINNUM =$50 ? TEMPPT
=$52 ? TEMPST
=$55 ? INDEX =$5E
? TXTTAB =$67
VARTAB =$69
ARYTAB =$6B
STREND =$6D
FRETOP =$6F ?
MEMSIZ =$73 ? CURLIN
=$75 ? VARNAM =$82
? VARPNT =$83
DSCLEN =$8F
HIGHDS =$94
HIGHTR =$96
LOWTR
=$9B
FAC
=$9D FACMO
=$A0 ? FACSGN =$A2
? ARG
=$A5 PGEND
=$AF ? CHARGET
=$B1 ? CHARGOT =$B7
? TXTPTR =$B8 ? ERRFLG
=$D8 ? ONERR
=$D8 ? ERRNUM =$DE
? CMDCPT =$EC ? ANL_CPT
=$ED ? CURADR
=$EE ? SPEEDZ =$F1
? RDOS =$B100
NEXT_TAB=$B12E
NEXT_TAB2=$B132 TRT_TAB =$B13B
COPY_CHAINE=$B17B
COPY_CHAINE2=$B185
NEXT_VAR=$B1C5 RWTS_SLOT16=$BF56
? KEY =$C000 ? RDPRINC
=$C002 ? RDAUX =$C003 ?
WTPRINC =$C004
? WTAUX =$C005 ? STROBE
=$C010 ? STORE80 =$C018 ? RD80COL
=$C01F
? SPEAK =$C030 ? PRINC
=$C054 ? AUX
=$C055 ? BUTTN0 =$C061
? BUTTN1 =$C062 ? PADDL0
=$C064 ? PADDL1 =$C065 ?
PTRIG =$C070
? PHASEOFF=$C080 LC089
=$C089 ? AUXMOVE =$C311 ?
XFER =$C314
BLTU2 =$D39A ? ERRORN
=$D412 ? RESTART =$D43C ? LINKSET
=$D4F2
? INLINE =$D52C ? RUNPROG
=$D566 ? NEWCMD =$D64B ?
CLEARC =$D66C
? STXTPT =$D697 ? NEWSTT
=$D7D2 ? ADDON =$D998 ?
CRDO =$DAFB
? STROUT =$DB3A ? STRPRT
=$DB3D ? OUTSP =$DB57 ?
OUTQUES =$DB5A
? OUTDO =$DB5C ? FRMNUM
=$DD67 ? CHKSTR =$DD6C ?
FRMEVL =$DD7B
? CHKCOM =$DEBE ? SYNERR
=$DEC9 ? PTRGET =$DFE3 ?
BASIC =$E000
? BASIC2 =$E003 ? AYINT
=$E10C ? IQERR =$E199 ?
GIVAYF =$E2F2
? STRLIT =$E3E7 ? GETSPA
=$E452 GARBAG =$E484
? MOVSTR =$E5E2
? FREFAC =$E600 ? GETBYT
=$E6F8 ? GETADR =$E752 ?
FADDT =$E7C1
? FMULTT =$E982 ? MOVFM
=$EAF9 ? MOVAF =$EB63 ?
FLO2 =$EBA0
? INPRT =$ED19 ? LINPRT
=$ED24 ? PRNTFAC =$ED2E ?
FOUT =$ED34
? NOTRACE =$F26F ? NORMAL
=$F273 ? INVERSE =$F277 ?
HANDLERR=$F2E9
? TEXT =$F399 ?
HGR =$F3F2 ? PROLOGP
=$F832 ? GBASCALC=$F847
? SETCOL =$F864 ? PRNTYX
=$F940 ? PRNTAX =$F941 ?
PRNTX =$F944
? PRBLNK =$F948 ? PRBL2
=$F94A ? OLDBRK =$FA59 ?
INIT =$FB2F
? TABV =$FB5B ? BASCALC
=$FBC1 ? BELL2 =$FBE4 ?
VTAB =$FC22
? HOME =$FC58 ?
WAIT =$FCA8 ? RDKEY
=$FD0C ? CROUT =$FD8E
? PRBYTE =$FDDA ? COUT
=$FDED ? COUT1 =$FDF0 ?
IDENTGS =$FE1F
? SETINV =$FE80 ? SETNORM
=$FE84 ? SETKBD =$FE89 ?
IN =$FE8B
? SETVID =$FE93 ?
PR =$FE95 ?
BELL =$FF3A ? OLDRST =$FF59
? MON =$FF65 ?
MONZ =$FF69
Retour sommaire