CODINGLA BIBLE DU CPC 6128

La bible du CPC 6128 : 3.04.01 L'arithmétique à virgule flottante
3.4 La ROM Basic

3.4.1 L'arithmétique à virgule flottante

****** opérateurs BASIC codes de hiérarchie + adresses

CFF0 F4, '+'
CFF3 F5, '-'
CFP6 F6, '*'
CFF9 F7, '/'
CFFC F8, 'A'
CFFF F9, 'Backslash'
D002 FA, 'AND'
D005 FB, 'MOD'
D008 FC, 'OR'
D00B FD, 'XOR'

****** comparaison arithmétique

D00E
D012 comparaison arithmétique
D01D accepter signe

****** '-' signe négatif

D020 code de hiérarchie
D022 aller chercher terme
D026 changer signe

****** opérateur BASIC NOT

D02B code de hiérarchie
D02D aller chercher terme
D031 opérateur NOT

****** aller chercher expression

D036 ignorer les espaces

****** aller chercher expression

D039 'Operand missing'
D03D aller chercher variable
D041 aller chercher valeur numérique
D043 ""
DO45 aller chercher chaîne
D048 fonction ?
D04A au calcul de fonction
D04E adresse de base de la table
D051 rechercher dans la table
D055 ignorer les espaces, saut à fonction
D058 sortir message d'erreur
D05B 'Operand missing'

****** fonctions spéciales

D05C nombre des entrées de la table
D05D pas trouvé, 'Syntax error'
D05E '-'
D062 '+'
D065 '('
D068 'NOT'
D06B 'ERL'
D06E 'FN'
D071 'MID$'
D074 '@'

****** aller chercher variable

D077 aller chercher adresse de variable
D07A pas encore définie ?
D07C type de variable
D07E chaîne ?
D087 chaîne ?
D089 annuler variable
D08C pointeur sur zéro
D08F comme descripteur de chaîne
D094 longueur de chaîne zéro

******* aller chercher valeur numérique

D095 ôter Offset
D09A plus petit que 10 ?
D09C oui, aller chercher chiffre
D0A0 valeur un octet ?
D0A2 oui
D0A6 valeur deux octets (déc, hex, bin) ?
D0A8 oui
D0AA valeur à virgule flottante ?
DOAC oui
D0AE 'Syntax error'
D0B1 'Real'
D0B3 fixer type de variable

****** aller chercher valeur deux octets

D0B9
****** aller chercher valeur à virgule flottante

D0C0
D0CD type de variable sur 'Real'
D0D1 ignorer les espaces

******* '(' aller chercher terme entre parenthèses

D0D4 aller chercher expression
D0D7 tester si ')'

*******

D0DA 'Syntax error'

******* calcul de fonction

D0DD incrémenter pointeur de programme
D0DE aller chercher Token
D0DF ignorer les espaces
D0E2 tester Token
D0E5 40 - 49, variable réservée
D0E9 aller chercher adresse de variable réservée
DOEC tester si '('
DOF0 Token fois 2
D0F6 'Syntax error'
D0FA calculer fonction
D0FC aller chercher argument de fonction en parenthèses
D100 calculer fonction

****** calculer fonction

D105 adresse des fonctions
D10A annuler octet fort
D10C additionner Token fois 2
D111 exécuter fonction

****** aller chercher adresse de variable réservée

D113 doubler Token
D115 adresse de base d'Offset de table

****** adresses des variables réservées

D11A 40, EOF
D11C 41.ERR
D11E 42, HIMEM
D120 43, INKEY$
D122 44, PI
D124 45, RND
D126 46, TIME
D128 47, XPOS
D12A 48, YPOS
D12C 49, DERR

****** variable réservée DERR

D12E numéro erreur disque

****** variable réservée ERR

D133 numéro ERROR
D137 accepter contenu accu comme nombre entier

****** variable réservée TIME

D13D KL TIME PLEASE
D140 convertir valeur 4 octets en format virgule flottante

****** variable réservée ERL

D146 aller chercher numéro de ligne ERROR

****** variable réservée HIMEM

D14B
D14C HIMEM
D14F accepter valeur

****** '@', pointeur de variable

D151 aller chercher adresse de variable
D154 pas défini, 'Improper argument'
D15A chaîne ?
D15F accepter valeur

****** variable réservée XPOS

D164
D165 GRA ASK CURSOR
D168 valeur de colonne dans HL

****** variable réservée YPOS

D16C GRA ASK CURSOR
D16F accepter nombre entier dans HL

******* instruction BASIC DEF

D174 tester si encore un caractère
D177 'FN'
D179 aller chercher numéro de ligne dans HL
D17D 'Invalid direct command'
D17F sortir message d'erreur
D182 chercher fonction
D18A ignorer reste de l'instruction

****** fonction BASIC FN

D18D chercher fonction
D199 'Unknown user function'
D19B sortir message d'erreur
D1A2 '('
D1A6 ignorer les espaces
D1AA tester si '('
D1B3 aller chercher expression
D1B8 affecter valeur à une variable
D1BC suit virgule ?
D1BF non
D1C2 tester si','
D1C5 prochaine variable
D1C7 tester si ')'
D1CB tester si ')'
D1D1 tester si '='
D1D4 aller chercher expression
D1D7 'Syntax error'
D1DA tester si chaîne
D1E5 tester si même type de variable

****** fonctions BASIC avec plusieurs arguments

D1E8 71,BIN$
D1EA 72, DEC$
D1EC 73, HEX$
D1EE 74, INSTR
D1F0 75, LEFTS
D1F2 76, MAX
D1F4 77, MIN
D1F6 78, POS
D1F8 79, RIGHTS
D1FA 7A, ROUND
D1FC 7B, STRINGS
D1FE 7C, TEST
D200 7D, TESTR
D202 7E, COPYCHRS
D204 7F, VPOS

****** adresses des fonctions BASIC

D206 00, ABS
D208 01, ASC
D20A 02, ATN
D20C 03, CHR$
D20E 04, CINT
D210 05, COS
D212 06, CREAL
D214 07, EXP
D216 08, FIX
D218 09, FRE
D21A 0A, INKEY
D21C 0B, INP
D21E 0C, INT
D220 0D, JOY
D222 0E, LEN
D224 0F, LOG
D226 10, LOG10
D228 ll,LOWER$
D22A 12, PEEK
D22C 13, REMAIN
D22E 14, SGN
D230 15, SIN
D232 16, SPACE$
D234 17, SQ
D236 18.SQR
D238 19, STR$
D23A 1A, TAN
D23C 1B, UNT
D23E 1C, UPPERS
D240 1D, VAL

****** fonction BASIC MIN

D242 flag pour MIN

****** fonction BASIC MAX

D246 flag pour MAX
D248 aller chercher expression
D24B suit virgule ?
D24E non, tester si ')', terminé
D251 placer variable sur pile BASIC
D254 aller chercher expression
D259 libérer place dans pile BASIC
D25E comparaison arithmétique
D267 aller chercher résultat des comparaisons
D26B prochain argument

****** fonction BASIC ROUND

D26D aller chercher expression
D270 et placer sur pile BASIC
D273 suit virgule ?
D276 défaut zéro
D279 oui, aller chercher valeur entière avec signe
D27C tester si *)'
D281 39
D284 additionner
D285 79
D288 comparaison HL <> DE
D28B supérieur, Tmproper argument'
D290 libérer place dans pile BASIC
D293 nombre de chiffres d'arrondissage dans B
D294 arrondir nombre

****** instruction BASIC CAT

D29B interrompre I/O disque
D2A1 DISK CATALOG
D2A4 ranger erreur disquette

****** instruction BASIC OPENOUT

D2AB
D2B4 DISK OUT OPEN

****** instruction BASIC OPENIN

D2B7
D2BD sortir message d'erreur
D2C0 'File type error'
D2C1 aller chercher nom de fichier
D2C7 DISK IN OPEN
D2CD aller chercher expression et param. chaîne
D2D2 tester si messages système
D2D5 ranger erreur disquette
D2DA sortir message d'erreur
D2DD 'File already open'

****** tester si messages système

D2DE
D2E0 pas nom de fichier ?
D2E3 premier caractère du nom
D2E4 '!'
D2E8 non
D2EA fixer pointeur sur second caractère
D2EB décrémenter longueur
D2EC inverser flag
D2ED CAS NOISY

****** instruction BASIC CLOSEIN

D2F0
D2F1 DISK IN CLOSE

****** instruction BASIC CLOSEOUT

D2F8
D2F9 DISK OUT CLOSE
D2FC ranger erreur disquette

****** interrompre I/O disque

D303
D306 DISK IN ABANDOM
D30C DISK OUT ABANDOM

******* instruction BASIC SOUND

D316 aller chercher valeur 8 bits
D319 état canal
D31C tester si ','
D31F aller chercher argument 0 à 4095
D322 période de note
D326 suit virgule ?
D329 valeur défaut 20
D32C oui, aller chercher valeur entière avec signe
D32F durée
D333 max. 15, défaut 12
D336 aller chercher arguments s'il y en a
D339 volume
D33C max. 15, défaut 0
D33E aller chercher arguments s'il y en a
D341 courbe d'enveloppe de volume
D344 aller chercher arguments s'il y en a
D347 courbe d'enveloppe de note
D34A max. 31, défaut 0
D34C aller chercher arguments s'il y en a
D34F période de bruit
D352 fin de l'instruction, sinon 'Syntax error'
D356 adresse du bloc de paramètres SOUND
D359 SOUND QUEUE
D35F à la boucle de l'interpréteur

****** aller chercher s'il y a lieu valeur 8 bits

D362 suit virgule ?
D365 charger valeur défaut
D366 pas virgule, terminé
D368 ','
D36C aller chercher valeur 8 bits
D36F comparer avec valeur maximum
D370 plus petit, ok
D371 Improper argument'

****** instruction BASIC RELEASE

D373 8
D375 aller chercher valeur 8 bits < 8
D379 SOUND RELEASE

****** fonction BASIC SQ

D37E CINT
D383 tester bit 0
D384 mis ?
D386 tester bit 1
D387 mis ?
D389 tester bit 2
D38A pas mis, 'Improper argument'
D38C octet fort supérieur zéro ?
D38D oui, Tmproper argument'
D390 SOUND CHECK
D393 accepter contenu accu comme nombre entier

****** aller chercher argument -128 à +127

D396 aller chercher valeur entière avec signe
D39E 'Improper argument'

******* instruction BASIC ENV

D3A1 aller chercher valeur 8 bits différente de zéro
D3A4 supérieur ou égal 16 ?
D3A6 oui, 'Improper argument'
D3AC aller chercher paramètre
D3B1 adresse du bloc de paramètre
D3B5 SOUND AMPL ENVELOPE
D3BB '='
D3BF ignorer les espaces
D3C2 16
D3C4 aller chercher valeur 8 bits < 16
D3C7 fixer bit 7
D3CA tester si ','
D3CD aller chercher valeur 16 bits
D3D0 128
D3D2 aller chercher valeur 8 bits < 128
D3D5 aller chercher 2 arguments

****** instruction BASIC ENT

D3D7 aller chercher argument -128 à +127
D3DD zéro ?
D3E2 zéro ?
D3E3 'Improper argument'
D3E5 supérieur ou égal 16 ?
D3E7 'Improper argument'
D3ED aller chercher paramètre
D3F2 adresse du bloc de paramètre
D3FB SOUND TONE ENVELOPE
D401
D405 ignorer les espaces
D408 aller chercher argument 0 à 4095
D412 240
D414 aller chercher valeur 8 bits < 240
D418 tester si','
D41B aller chercher argument -128 à +127
D41F tester si ','
D422 aller chercher valeur 8 bits

****** aller chercher paramètre pour ENT & ENV

D428
D42B suit virgule ?
D432 JP (DE)
D439 adresse du bloc de paramètre
D44C fin de l'instruction, sinon 'Syntax error'

****** aller chercher argument 0 à 4095

D44F aller chercher valeur entière avec signe
D452 octet fort
D453 bit 12-15 mis ?
D455 oui, 'Improper argument'

****** fonction BASIC INKEY

D459 CINT
D45C 80
D45F comparaison HL <> DE
D462 'Improper argument'
D465 KM TEST KEY
D468 -1 si pas appuyée
D46D résultat dans L
D470 accepter nombre entier dans HL

****** fonction BASIC JOY

D473 KM GET JOYSTICK
D477 CINT
D483 accepter contenu accu comme nombre entier
D486 'Improper argument'

****** instruction BASIC KEY

D489 'DEF'
D48D aller chercher valeur 8 bits
D491 tester si ','
D494 aller chercher expression chaîne et paramètre
D497 longueur de chaîne dans C
D499 numéro de touche dans B
D49B adresse chaîne dans HL
D49C KM SET EXPAND
D4A0 'Improper argument'

****** KEY DEF

D4A3 ignorer les espaces
D4A6 80 comme valeur maximum
D4A8 aller chercher valeur 8 bits < 80
D4AC tester si ','
D4AF 2
D4B1 aller chercher argument < 2
D4BA KM SET REPEAT
D4BF KM SET TRANSLATE
D4C2 tester si encore un argument
D4C5 KM SET SHIFT
D4C8 tester si encore un argument
D4CB KM SET CONTROL
D4CE suit virgule ?
D4D1 non, terminé
D4D3 aller chercher valeur 8 bits
D4D9 saut en (HL)

****** instruction BASIC SPEED

D4DE 'WRITE'
D4E2 'KEY'
D4E4 KM SET DELAY
D4E9 INK'
D4EB SCR SET FLASHING
D4EE 'Syntax error'

******* SPEED KEY & INK

D4FI
D4F2 ignorer les espaces
D4F5 aller chercher valeur 8 bits différente de zéro
D4F9 tester si ','
D4FC aller chercher valeur 8 bits différente de zéro
D503 saut en (BC)

****** SPEED WRITE

D508 ignorer les espaces
D50B 2
D50D aller chercher argument < 2
D511 167
D517 zéro ?
D519 non, doubler constante de durée
D51B CAS SET SPEED

******* variable réservée PI

D520
D521 fixer type sur 'Real'
D524 type de variable dans C, HL sur variable
D527 aller chercher PI

****** instruction BASIC DEG

D52C flag pour DEG

****** instruction BASIC RAD

D530 flag pour RAD
D53I fixer mode DEG/RAD

****** fonction BASIC SQR

D534 fonction SQR

****** opérateur BASIC 'A'

D539
D53B CREAL
D53F mémoire provisoire pour variable à virgule flottante
D542 copier variable de (DE) dans (HL)
D548 fixer type et adresse de variable
D54C élévation à la puissance
D54F exécuter fonction
D552 pas d'erreur ?
D553 'Division by zéro'
D556 'Overflow'
D559 Improper argument'

****** exécuter fonction à virgule flottante

D55C
D55E CREAL
D562 exécuter fonction

****** fonction BASIC EXP

D563 fonction EXP

****** fonction BASIC LOG10

D568 fonction LOG10

****** fonction BASIC LOG

D56D fonction LOG

****** fonction BASIC SIN

D572 fonction SIN

****** fonction BASIC COS

D577 fonction COS

****** fonction BASIC TAN

D57C fonction TAN

****** fonction BASIC ATN

D581 fonction ATN
D586 'Random number seed ? ',0

******* instruction BASIC RANDOMIZE

D59C
D59E aller chercher expression
D5A5 'Random number seed ? '
D5A8 sortir
D5AB aller chercher ligne d'entrée
D5AE sortir LF
D5B1 lire entrée
D5B4 non valable, répéter
D5B6 ignorer espace, TAB et LF
D5BA non valable, répéter
D5BC CREAL
D5BF SET RANDOM SEED

****** variable réservée RND

D5C4
D5C5 '('
D5C9 ignorer les espaces
D5CC aller chercher expression
D5CF tester si ')'
D5D3 CREAL
D5D6 SGN
D5D9 différ. de zéro ?
D5DB aller chercher dernière valeur RND
D5E0 négatif, SET RANDOM SEED
D5E5 fixer type sur virgule flottante
D5E8 RND

****** restaurer pointeur de variable

D5ED annuler table
D5F0 fin du programme
D5F3 début des variables
D5F6 début des tableaux
D5F9 fin des tableaux

******* annuler table

D5FD base de la table
D600 54 = 2*27, A-Z plus fonctions
D602 annuler #ADB7 â #ADEC
D60A annuler #ADED à #ADF2

****** annuler flag pour FN

D611

****** calculer adresse table

D61A 'Z'+1
D61C début des variables
D620 moins 1
D621 fois 2
D624 plus #AD35

****** calculer adresse table pour tableau

D62A début des tableaux
D62E moins 1
D632 fois
D635 plus #ADED

****** toutes les variables sur type REAL

D63B 'AZ'
D63E type 'Real'
D641 nombre dans A
D642 plus petit 1, alors 'Syntax error'
D646 base de la table égale #ADB2
D64B lettre égale pointeur dans table
D64E toutes les lettres

****** instruction BASIC DEFSTR

D653 type 'chaîne'

****** instruction BASIC DEFINT

D657 type Integer'

****** instruction BASIC DEFREAL

D65B type 'Real'
D65D aller chercher lettre
D65E tester si lettre
D661 'Syntax error'
D663 dans BC (de - à)
D665 ignorer les espaces
D668 '-'
D66C ignorer les espaces
D66F tester si lettre
D672 'Syntax error'
D674 à
D675 ignorer les espaces
D678 fixer type de variable
D67B suit virgule ?
D67E oui, continuer
D681 'Syntax error'
D684 sortir message d'erreur
D687 'Subscript out of range'
D688 sortir message d'erreur
D68B 'Array already dimensioned'
D68C 2* #7C T
D68E extension d'instruction
****** instruction BASIC LET
D691 aller chercher variable
D695 tester si '='
D698 aller chercher expression
D69D affecter valeur à une variable
****** affecter valeur à une variable
D6A2 type de variable
D6A3 et type du résultat
D6A6 comparer
D6A8 types correspondants, sinon 'Type mismatch'
D6AB tester si chaîne
D6AE non, copier variable dans (HL)
D6B2 gestion de chaîne
D6B6 accepter pointeur sur chaîne
****** instruction BASIC DIM
D6B9 dimensionnement
D6BC suit virgule ?
D6BF oui, prochaine variable
****** chercher variable
D6C2 lire nom de variable
D6C5 tester si variable dimensionnée
D6C8 aller chercher type de variable
****** aller chercher adresse de variable
D6CC lire nom de variable
D6CF tester si variable dimensionnée
D6D2 aller chercher type de variable
D6D5 première lettre
D6D6 calculer position table

****** chercher fonction

D6DE lire nom de variable
D6E4 calculer position table pour FN
D6EA créer fonction
D6EF lire nom de variable
D6F5 première lettre
D6F6 calculer position table
D6FC type de variable
D705 début des variables
D70C type de variable
D712 lire nom de variable
D715 tester si variable indexée
D718 aller chercher type de variable
D72A chercher tableau
D72E trouvé ?
D733 chercher tableau
D736 trouvé ?

****** chercher tableau

D75B type de variable
D77A fixer bit 6, 'FN'
D787 début des tableaux
D78B reserver place dans zone des variables
D78E incrémenter pointeur pour zone des tableaux
D7C6 LDIR
D7C9 type de variable

****** dimensionnement

D7E4 aller chercher nom de variable
D7E8 '('
D7EC ']'
D7EE 'Syntax error'
D7F6 type de variable
D7F9 calculer position table pour tableau
D7FC chercher tableau
D7FF trouvé, 'tableau already dimensioned'

****** tester si variable dimensionnée

D80A
D80C '('
D810 ']'
D817 début des variables

****** variable dimensionnée

D820
D827 début des tableaux
D830 type de variable
D833 calculer position table pour tableau
D836 chercher tableau
D839 pas trouvé ?
D845 'Subscript out of range'
D857 nombre des dimensions
D85C limite des tableaux dans DE

****** lire indices

D887
D888 ignorer les espaces
D88B type de variable
D88E ranger
D88F nombre des indices
D891 aller chercher valeur 16 bits 0 - 32767, index
D897 reserver place dans pile BASIC
D89B index sur pile BASIC
D89E incrémenter nombre des indices
D89F suit virgule ?
D8A2 oui, prochain index
D8A5 ')'
D8A9 '['
D8AB 'Syntax error'
D8AE ignorer les espaces
D8B2 restaurer type de variable
D8C4 fin des tableaux
D8C8 reserver place dans zone des variables
D8D5 type de variable
D8E3 10, valeur défaut pour index
D92B 2 octets
D92D libérer place dans pile BASIC

****** lire nom de variable

D935 déterminer type de variable
D93D variable déjà définie ?
D93E non
D941 ignorer lettres du nom
D942 tester bit 7
D943 dernière lettre ?
D945 ignorer les espaces suivants
D94B fixer pointeur sur type de variable
D988 type de variable
D991 #05 + #09 => #0D
D995 40
D997 reserver place dans pile BASIC
D99B 41
D99D déjà 40 caractères?
D99E oui, alors 'Syntax error'
D9A1 lire prochain caractère du nom
D9A3 convertir minuscules en majuscules
D9A7 dernier caractère ?
D9A8 non
D9AA fixer pointeur de pile BASIC
D9B0 ignorer les espaces suivants

****** déterminer type de variable

D9B3
D9B6 plus petit que #0B ?
D9B8 -#09, #0D => #05
D9BA '!', variable Real ?
D9BC fixer type sur 'Real'
D9BE 'Syntax error'
D9C0 '%', variable entière ?
D9C2 ou '$', chaîne ?
D9C4 non, 'Syntax error'
D9C7 'Real'
D9C9 ranger type de variable

****** actualiser table des tableaux

D9CD annuler table pour tableaux
D9D0 fin des tableaux
D9D4 début des tableaux
D9D7 comparaison HL <> DE
D9DA aucun tableau
D9E5 calculer position table pour tableau

******* instruction BASIC ERASE

D9F4
D9F7 annuler tableau
D9FA suit virgule ?
D9FD oui, prochain tableau
******* annuler tableau
DA00 lire nom de variable
DA04 type de variable
DA07 calculer position table pour tableau
DA0A chercher tableau
DA0D pas trouvé, 'Improper argument'
DA16 BC:=HL-DE
DA1F actualiser table des tableaux
DA33 6 octets
DA35 reserver place dans pile BASIC
DA71 reserver place dans pile BASIC
DA75 déterminer type de variable
DA88 type de variable
DA8D reserver place dans pile BASIC
DAAC 26 lettres, 'A'
DABO première lettre du nom
DABI calculer position table
DAB8 prochaine lettre
DAB9 déjà toutes les lettres ?
DABD calculer position table pour tableau
DAC8 début des tableaux
DAE2 comparaison HL <> BC
DB10 saut en (HL)

****** instruction BASIC LINE

DB18 tester si encore un caractère
DB1B 'INPUT
DBlC aller chercher numéro de canal
DB1F sortir évent. chaîne de dialogue
DB22 chercher variable
DB25 type 'chaîne', sinon 'Type mismatch'
DB2A aller chercher entrée sur périphérique actif
DB2D entrer chaîne dans descripteur de pile
DB31 affecter résultat à une variable

****** aller chercher entrée sur périphérique actif

DB36
DB39 aller chercher entrée sur la disquette
DB42 ';'

****** instruction BASIC INPUT

DB48 aller chercher numéro de canal
DB4B aller chercher entrée et convertir
DB4F chercher variable
DB59 suit virgule ?
DB5C oui, prochaine variable

****** aller chercher entrée et convertir

DB60
DB63 sortir évent. chaîne de dialogue

******

DB7E '?Redo from start', LF,0

****** sortir évent. chaîne de dialogue

DB90
DB91 ';'
DB93 ranger signe de séparation
DB96 ignorer les espaces
DB99 ""
DB9B pas chaîne ?
DBA0 suit virgule ?
DBA3 oui
DBA4 tester si encore un caractère
DBA4 tester si encore un caractère
DBA7 ';'
DBAC '?'
DBAE sortir
DBB1 ' '
DBB3 sortir
DBC6 'type mismatch'
DBCE sortir message d'erreur
DBD1 'type mismatch'
DBD5 aller chercher nom et type de variable
DBDF 'chaîne'
DBE1 oui, aller chercher param. de chaîne
DBE5 suit virgule ?
DBEA non
DBEC ','
DBFD tester si chaîne
DC13 ignorer espace, TAB et LF
DC22 entrer chaîne dans Descriptor
DC25 ignorer espace, TAB et LF
DC28 ""
DC2A lire chaîne
DC39 sortir message d'erreur
DC3C 'EOF met'
DC42 '"'
DC53 début du buffer d'entrée
DC56 premier caractère égale zéro
DC59 ""
DC5F 'EOF met'
DC64 début du buffer d'entrée
DC6A JP (DE)
DC7F CR
DC82 ""
DCA4 LF + CR
DCA7 CR ?
DCAA LF ?
DCBE ','
DCC1 CR
DCC4 "
DCC7 TAB
DCCA LF

****** instruction BASIC RESTORE

DCCD aucun numéro de ligne ?
DCCF aller chercher numéro de ligne dans DE
DCD3 chercher ligne BASIC DE
DCD7 fixer pointeur DATA
DCDA début du programme
DCDD comme pointeur DATA

****** instruction BASIC READ

DCDF
DCE0 pointeur DATA
DCE3 aller chercher prochain élément DATA
DCE7 chercher variable
DCEC ':'
DCF6 ','
DCFA adresse de ligne pendant instruction READ
DCFD fixer adresse de ligne actuelle
DD00 'Syntax error'
DD04 suit virgule ?
DD08 oui
DD0A pointeur DATA
DD10 ','
DD13 ignorer reste de la ligne
DD16 fin de ligne ?
DD17 non
DD1A longueur de ligne
DD1C zéro, fin du programme ?
DD1E 'DATA exhausted'
DD20 sortir message d'erreur
DD23 adresse de ligne pendant instruction READ
DD27 ignorer les espaces
DD2A 'DATA'
DD2C non, continuer à chercher
DD2F ranger signe
DD30 former valeur absolue

******* accepter signe B

DD3C
DD41 signe du résultat
DD42 négatif, alors changement de signe
DD47 inverser bit signe

******* addition entière HL := DE + HL

DD4F annuler flag carry
DD50 addition
DD53 résultat positif ?
DD54 fixer flags

******* soustraction entière HL := DE - HL

DD57 échanger opérandes
DD58 annuler flag carry
DD59 soustraction
DD5C résultat positif ?
DD5D fixer flags

******* multiplication entière avec signe

DD60 déterminer signe du résultat
DD63 multiplication non signée
DD66 accepter signe
******* déterminer signe du résultat
DD6C signe de HL
DD6D et signe de DE
DD6E dans B
DD70 former valeur absolue de DE
DD74 former valeur absolue de HL

******* multiplication entière sans signe

DD77
****** division entière avec signe

DDA1 Division HL := HL / DE
DDA4 accepter signe

******* calcul MOD integer

DDA8 ranger signe
DDA9 Division
DDAC reste dans HL
DDAD ramener signe
DDAE et accepter

****** Division HL := HL / DE, DE := reste

DDB0 déterminer signe du résultat

****** former valeur absolue

DDEF tester signe
DDF1 positif, déjà terminé

****** changement de signe integer

DDF2

******* SGN signe de HL

DDFE

****** comparaison HL <> DE

DE07 signe de HL
DE08 et signe de DE
DE0A comparer nombres avec même signe

******* tester si encore une virgule

DE1A ','
******* tester si parenthèse ouverte

DE1E '('

******* tester si parenthèse fermée
DE22 ')'

******* tester si signe égale

DE26 '='

******* tester si encore un caractère

DE2A aller chercher adresse de retour
DE2B aller chercher caractère
DE2D ramener pointeur de programme
DE2E comparer caractère
DE2F 'Syntax error'
****** ignorer les espaces

DE31
DE33 ' '
DE35 continuer à tester si espaces
DE37 fin de l'instruction ?

****** tester si fin de ligne, sinon 'Syntax error'

DE3C
DE40 'Syntax error'

****** tester si fin de l'instruction

DE42

****** tester si virgule

DE46
DE47 ignorer les espaces
DE4A ','
DE4D ignorer les espaces

****** ignorer espace, TAB et LF

DE52 aller chercher caractère
DE53 incrémenter pointeur
DE54 ' '
DE58 TAB
DE5C LF
DE60 décrémenter pointeur

****** boucle de l'interpréteur

DE62 adresse de l'instruction actuelle
DE65 fixer adresse de l'instruction actuelle
DE68 KL POLL SYNCHRONOUS
DE6B traitement event (AFTER/EVERY)
DE6E ignorer les espaces
DE71 exécuter instruction BASIC
DE74 lire texte programme
DE75 ':', fin de l'instruction ?
DE77 oui
DE79 'Syntax error'
DE7D longueur de ligne
DE7E égale zéro ?
DE80 oui, à l'instruction END
DE82 ranger adresse de ligne actuelle
DE86 flag TRACE mis ?
DE8A non
DE8C routine TRACE
DE8F au début de la boucle de l'interpréteur
DE91 à l'instruction END

****** exécuter instruction BASIC

DE94 Token fois 2
DE95 tester si extension d'instruction
DE9A token non valable, 'Syntax error'
DE9F plus #DEE5 (adresse table)
DEA7 adresse d'instruction sur pile
DEA9 ignorer les espaces, saut à instruction
DEAC 'Syntax error'

****** adresse de ligne actuelle sur zéro

DEAF zéro
DEB2 comme adresse de ligne actuelle

****** charger adresse de ligne actuelle

DEB6 adresse de ligne actuelle

****** test mode direct/aller chercher adresse de ligne

DEBA adresse de ligne actuelle
DEBF zéro, mode direct
DEC2 numéro de ligne dans HL

****** instruction BASIC TRON

DEC6 fixer flag

****** instruction BASIC TROFF

DECA annuler flag

****** routine TRACE

DECF ']'
DED1 sortir
DED5 adresse de ligne actuelle
DED9 numéro de ligne dans HL
DEDC sortir numéro de ligne
DEEO '['
DEE2 sortir

******* adresses des instructions BASIC

DEE5 80, AFTER
DEE7 81, AUTO
DEE9 82, BORDER
DEEB 83, CALL
DEED 84, CAT
DEEF 85, CHAIN
DEF1 86, CLEAR
DEF3 87, CLG
DEF5 88, CLOSEIN
DEF7 89, CLOSEOUT
DEF9 8A, CLS
DEFB 8B, CONT
DEFD 8C, DATA
DEFF 8D, DEF
DF01 8E, DEFINT
DF03 8F, DEFREAL
DF04 90, DEFSTR
DF07 91,DEG
DF09 92, DELETE
DF0B 93, DIM
DF0D 94, DRAW
DF0F 95, DRAWR
DF11 96, EDIT
DF13 97, ELSE
DF15 98, END
DF17 99, ENT
DF19 9A, ENV
DF1B 9B, ERASE
DF1D 9C, ERROR
DF1F 9D, EVERY
DF21 9E, FOR
DF23 9F, GOSUB
DF25 AO, GOTO
DF27 AI, IF
DF29 A2, INK
DF2B A3, INPUT
DF2D A4, KEY
DF2F A5, LET
DF31 A6, UNE
DF33 A7, LIST
DF35 A8, LOAD
DF37 A9, LOCATE
DF39 AA, MEMORY
DF3B AB, MERGE
DF3D AC, MID$
DF3F AD, MODE
DF41 AE, MOVE
DF43 AF, MO VER
DF45 BO, NEXT
DF47 Bl, NEW
DF49 B2, ON
DF4B B3, ON BREAK
DF4D B4, ON ERROR GOTO 0
DF4F B5, ON SQ
DF51 B6, OPENIN
DF53 B7, OPENOUT
DF55 B8, ORIGIN
DF57 B9, OUT
DF59 BA, PAPER
DF5B BB, PEN
DF5D BC, PLOT
DF5F BD, PLOTR
DF61 BE, POKE
DF63 BF, PRINT
DF65 CO, '
DF67 Cl.RAD
DF69 C2, RANDOMIZE
DF6B C3, READ
DF6D C4, RELEASE
DF6F C5, REM
DF71 C6, RENUM
DF73 Cl, RESTORE
DF75 C8, RESUME
DF77 C9, RETURN
DF79 CA, RUN
DF7B CB, SAVE
DF7D CC, SOUND
DF7F CD, SPEED
DF81 CE, STOP
DF83 CF, SYMBOL
DF85 DO, TAG
DF86 Dl,TAGOFF
DF89 D2, TROFF
DF8B D3, TRON
DF8D D4, WAIT
DF8F D5, WEND
DF91 D6, WHILE
DF93 D7, WIDTH
DF95 D8, WINDOW
DF97 D9, WRITE
DF99 DA, ZONE
DF9B DB, DI
DF9D DC, El
DF9E DD, FILL
DFA1 DE, GRAPHICS
DFA3 DF, MASK
DFA5 EO, FRAME
DFA7 El.CURSOR
DFAA début de la RAM libre
DFB2 max. 300 caractères
DFB5 aller chercher caractère dans buffer d'entrée
DFB9 dernier caractère ?
DFBA non
DFBE 301 - état compteur
DFC0 égale longueur de ligne
DFC3 dans B
DFC6 trois fois zéro comme terminaison

****** aller chercher caractère dans buffer d'entrée

DFCD
DFCE dernier caractère ?
DFD0 lettre ?
DFD3 oui
DFD5 numérique ?
DFD8 oui
DFDB '&' ?
DFDD oui
DFE1 Token ?
DFE2 oui
DFE3 '!'
DFE8 ignorer espaces supplémentaires ?
E0A3 écrire dans buffer
E0B6 adresse de base de la table
E0B9 rechercher dans la table

★ ANNÉE: ???

Page précédente : La bible du CPC 6128 : 3.04.01 L'arithmétique à virgule flottante
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 157 millisecondes et consultée 1763 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.