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

Vous trouverez dans les pages suivantes le listing de l'arithmétique à virgule flottante. Chaque routine contient également l'adresse de la table de saut à travers laquelle elle est appelée par l'interpréteur Basic. Vous trouverez ensuite, dans le chapitre consacré à la ROM BASIC, aux adresses DD2F à DE19, l'arithmétique entière qui est utilisée par l'interpréteur chaque fois que c'est possible. En effet comme elle ne travaille qu'avec des valeurs sur deux octets, cette arithmétique est toujours nettement plus rapide que le calcul avec des nombres à virgule flottante. Servez-vous également de ce fait dans vos programmes et utilisez autant que possible des variables entières. Cela vaut notamment pour les boucles FOR-NEXT (voyez également à ce sujet le chapitre 3.2).

****** Cpc 664 & 6128 BASIC 1.1

C000 première ROM de premier plan
C001 marque 1
C002 Version 1
C003 Modification 0
C004 Adresse du nom

****** initialisation du BASIC

C006 Stack à partir de C000
C009 KL ROM WALK
C00C configurer la mémoire
C00F trop peu de mémoire, alors Reset
C013 supprimer flag pour inhibation espaces
C016 pointeur sur ' BASIC 1.1*
C019 sortir texte
C01C adresse de ligne actuelle sur zéro
C01F annuler numéro d'erreur
C022 RND-Init
C025 annuler mode AUTO
C028 instruction NEW
C02B 240
C02E SYMBOL AFTER 240
C031 au mode READY
C033 ' BASIC 1.1% LF,LF,0
C040 'BASF, 'C'+80H,0

******* instruction BASIC EDIT

C046 amener numéro de ligne dans DE
C04A initialiser la pile
C04D chercher ligne BASIC DE
C050 lister ligne BASIC dans buffer
C053 aller chercher ligne d'entrée

******* mode READY

C058 initialiser la pile
C05B diverses initialisations
C05E aller chercher adresse de ligne
C061 SOUND HOLD
C064 supprimer Break Event
C067 initialiser l'écran
C06A programme protégé ?
C06E oui, supprimer programme et variables
C071 numéro ERROR
C074 'Syntax error' ?
C076 non
C078 numéro ERROR sur zéro
C07B aller chercher numéro de ligne de la ligne ERROR
C07F à l'instruction EDIT
C081 pointeur sur 'Ready'
C084 sortir
C087 adresse de ligne actuelle sur zéro
C08A AUTO-Flag mis ?
C08E non
C090 indiquer prochain numéro de ligne
C093 au mode READY
C095 ignorer espace, TAB et LF
C09D ignorer espace, TAB et LF
COAD
COAF aller chercher ligne d'entrée
C0B2 'ESC appuyée, alors répéter
C0B4 sortir LF
C0B7 ignorer espace, TAB et LF
C0CB
C0D4 à la boucle de l'interpréteur
C0D7 'Ready', LF,0

******* annuler mode AUTO

C0DF

******* fixer mode AUTO

C0E1 numéro de ligne
C0E6 mettre flag pour AUTO

******* instruction BASIC AUTO

COEA 10, Default
C0EF ','
C0F1 amener numéro de ligne dans DE
C0F5 10, Default
C0F8 suit virgule ?
C0FB oui, amener numéro de ligne dans DE
C0FE fin de ligne, sinon 'Syntax error'
C102 ranger incrément AUTO
C106 ranger flag pour mode AUTO
C10D numéro de ligne
C115 annuler mode AUTO
C118 éditer ligne
C11E numéro de ligne
C121 plus incrément
C122 fixer mode AUTO

****** instruction BASIC NEW

C128
C129 supprimer programme et variables
C12C au mode READY

****** instruction BASIC CLEAR

C12F INPUT'
Cl3A diverses initialisations

****** CLEAR INPUT

C13F ignorer les espaces

****** supprimer programme et variables

C145 début de la RAM libre
C149 HIMEM
C152 annuler accu
C154 supprimer début RAM libre jusqu'à HIMEM
C156 annuler flag pour programme protégé
C159 restaurer pointeur de variable
C15F interrompre Disk I/O
C163 fixer mode RAD
C166 initialiser pile descripteur
C16C Stream-Reset
C16F TROFF
C172 supprimer mode AUTO
C175 diverses initialisations, voir plus bas
C17A supprimer Strings
C17D restaurer pointeur de variable
C180 toutes les variables sur type 'Real'
C183 ignorer espace, TAB et LF

****** diverses initialisations

C189 initialiser taquets de tabulation
C18C annuler pointeur de programme
C18F annuler ON ERROR
C192 annuler pointeur de programme après interruption
C195 reset SOUND et event
C198 initialiser pile BASIC
C19B annuler flag pour FN
C19E RESTORE
C1AB < 8 ?
C1AD TXT STR SELECT
C1B1 actuel numéro stream
C1B7 canal d'entrée
Cl Cl actuel numéro stream
C1C4 imprimante ?
C1C7 canal d'entrée
C1CA disquette?
C1CD tester sur numéro stream
C1D2 tester numéro stream
C1D7 tester numéro stream

****** aller chercher numéro stream

C1E8 tester numéro stream
C1ED Tmproper argument'
C1F5 ','
C1F7 saut dans (BC), exécuter fonction

******* tester sur numéro stream

C1FF '#'
C201 0 comme défaut
C204 aller chercher numéro stream
C208 suit virgule ?
C20B non, alors fin de l'instruction

****** Streamnummer holen

C210 Test sur nachfolgendes Zeichen
C213 "#"
C214 10, valeur maximum+1
C218 valeur maximum dans B
C219 aller chercher valeur 8 bits
C21C comparer avec valeur maximum
C21F plus petit, ok
C220 Tmproper argument'

****** aller chercher valeur 8 bits plus petite que 2

C223 valeur maximum 2
C225 aller chercher argument et tester

****** instruction BASIC PEN

C227 aller chercher numéro stream
C22A TXT SET PEN
C230 aller chercher suit virgule ?
C234 valeur 8 bits plus petit 2
C237 TXT SET BACK

****** instruction BASIC PAPER

C23C aller chercher numéro stream
C23F TXT SET PAPER
C242 aller chercher argument < 16
C246 saut dans (BC), exécuter fonction

****** instruction BASIC BORDER

C24B aller chercher 2 arguments plus petits que 32
C24F SCR SET BORDER

****** instruction BASIC INK

C254 aller chercher argument plus petit que 16
C258 tester si ','
C25B aller chercher 2 arguments plus petits que 32
C260 SCR SET INK

****** aller chercher 2 arguments plus petits que 32

C265 aller chercher argument < 32
C268 dans B
C269 suit virgule ?
C26D 32
C26F aller chercher argument plus petit que 32
C272 dans C

****** aller chercher argument < 16

C274 16
C276 aller chercher argument plus petit que 16

****** instruction BASIC MODE

C278 3
C27A aller chercher argument plus petit que 3
C27E SCR SET MODE

****** instruction BASIC CLS

C283 aller chercher numéro stream
C287 TXT CLEAR WINDOW
C28C aller chercher numéro stream
C291 Tmproper argument'
C294 tester si ')'

****** fonction BASIC COPYCHRS

C29B aller chercher numéro stream, parenthèse fermée
C29E TXT RD CHAR
C2A1 accepter caractère comme chaîne

****** fonction BASIC VPOS

C2A4 aller chercher numéro stream
C2A8 aller chercher ligne curseur

****** fonction BASIC POS

C2AD aller chercher numéro stream
C2B0 tester si ')'
C2B4 aller chercher position
C2B7 accepter contenu accu comme nombre entier

****** aller chercher position PRINT actuelle

****** aller chercher ligne curseur

C2CA TXT GET CURSOR
C2CD TXT VALIDATE
C2DA TXT GET WINDOW

****** instruction BASIC LOCATE

C302 aller chercher numéro stream
C305 aller chercher deux valeurs 8 bits différentes de zéro
C30C TXT SET CURSOR

****** instruction BASIC WINDOW

C311 'SWAP'
C315 aller chercher numéro stream
C318 aller chercher deux valeurs 8 bits différentes de zéro
C31C tester si ','
C31F aller chercher deux valeurs 8 bits différentes de zéro
C326 TXT WIN ENABLE

****** WINDOW SWAP

C32B ignorer les espaces
C32E aller chercher argument < 8
C332 suit virgule ?
C335 défaut zéro
C337 oui, aller chercher argument < 8
C33C TXT SWAP STREAMS

****** aller chercher argument < 8

C341 8, valeur maximum
C343 aller chercher argument

****** instruction BASIC TAG

C346 aller chercher numéro stream

****** instruction BASIC TAGOFF

C34D aller chercher numéro stream
C351 TXT SET GRAPHIC

****** aller chercher deux valeurs 8 bits différentes de zéro

C354 aller chercher première valeur
C357 dans D
C358 tester si ','
C35C aller chercher valeur 8 bits différente de zéro
C360 valeur dans E

****** instruction BASIC CURSOR

C363 aller chercher numéro stream
C366 zéro ?
C368 aller chercher valeur 8 bits < 2
C36C TXT CUR OFF
C36F TXT CUR ON
C372 suit virgule ?
C375 non
C376 aller chercher valeur 8 bits < 2
C37A TXT CUR DISABLE
C37D TXT CUR ENABLE

****** sortir chaîne

C380 adresse chaîne
C381 132
C384 WIDTHsur 132
C387 fixer POS sur un
C390 aller chercher caractère
C391 incrémenter pointeur
C392 dernier caractère ?
C393 non, sortir
C396 prochain caractère

****** sortir LF

C39C LF
C39E sortir

****** sortir caractère

C3A5 sortir caractère
C3AB LF
C3AD non
C3AF périphérique de sortie
C3B2 imprimante ?
C3B5 disque ?
C3B8 sortir caractère

****** sortir caractère

C3BE sortir caractère

****** canal de sortie sélectionné

C3C4 canal de sortie
C3C9 sortir sur imprimante
C3 CC sur disque
C3D0 sur écran
C3D4 TXT SET GRAPHIC
C3D9 TXT SET BACK
C3DD TXT VDU ENABLE
C3E0 TXT VALIDATE
C3E5 CR
C3EA LF
C3EC TXT OUTPUT
C3F1 TXT VALIDATE

****** sortir CR & LF sur imprimante

C3F8 CR
C3FD LF
C40B MC PRINT CHAR
C40F tester si interruption avec 'ESC
C415 CR
C41A ' '
C434 CR
C439 LF
C449 DISK OUT CHAR
C44C pas d'erreur ?
C44D sortir message d'erreur
C44F fixer DERR
C453 CAS TEST EOF
C45A accepter signe comme nombre entier
C45F CAS IN CHAR
C462 pas d'erreur ?
C468 sortir message d'erreur
C46B 'erreur disquette'

****** fixer POS sur un

C472 KM READ CHAR

****** tester si interruption avec 'ESC

C475 KM READ CHAR
C479 'Break'
C47C attendre deuxième frappe de touche
C47F 'ESC, alors interruption
C485 adresse de la routine Break Event
C488 BASIC-ROM-Select
C48E KM ARM BREAK

****** Break-Event-Routine

C495 KM READ CHAR
C498 aucune touche appuyée ?
C49A Break par 'ESC
C49C ignorer touches frappées avant 'ESC
C49E attendre deuxième 'ESC

****** attendre touche frappée après 'ESC

****** attendre touche frappée après 'ESC

C4A7 SOUND HOLD
C4AF TXT CUR ON
C4B2 KM WAIT CHAR
C4B5 'ESC
C4BB TXT CUR OFF
C4C3
C4C5 KM CHAR RETURN
C4CA SOUND CONTINUE
C4DC KM DISARM BREAK

****** instruction BASIC ORIGIN

C4E1 aller chercher 2 arguments
C4E6 suit virgule ?
C4E9 non
C4EB aller chercher 2 arguments
C4F0 tester si ','
C4F3 aller chercher 2 arguments
C4F8 GRA WIN HEIGHT
C4FE GRA WIN WIDTH
C504 GRA SET ORIGIN
C509 fin de l'instruction ?
C510 GRA CLEAR WIN DOW

******* instruction BASIC FILL

C515 aller chercher argument < 16
C51A Garbage Collection
C51D calculer place mémoire libre
C520 au moins 29 octets
C523 comparaison HL <> BC
C526 sinon 'Memory full'
C528 sortir message d'erreur
C52D FILL

****** instruction BASIC MOVE

C532 GRA MOVE ABSOLUTE

****** instruction BASIC MOVER

C537 GRA MOVE RELATIVE

****** instruction BASIC DRAW

C53C GRA LINE ABSOLUTE

****** instruction BASIC DRAWR

C541 GRA LINE RELATIVE

****** instruction BASIC PLOT

C546 GRA PLOT ABSOLUTE

****** instruction BASIC PLOTR

C54B GRA PLOT ABSOLUTE
C54F aller chercher 2 arguments entiers
C552 suit virgule ?
C555 non
C557 V
C55C suit virgule ?
C55F non
C563 aller chercher valeur 8 bits < 4
C567 SCR ACCESS
C56F saut dans (BC)

****** fonction BASIC TEST

C574 GRA TEST ABSOLUTE

****** fonction BASIC TESTR

C579 GRA TEST RELATIVE
C57D aller chercher 2 arguments
C580 tester si ')'
C587 saut dans (BC)
C58A accepter contenu accu comme nombre entier

****** aller chercher 2 arguments entiers

C58F aller chercher valeur 16 bits -32768 à 32767
C593 tester si ','
C596 aller chercher valeur 16 bits -32768 à 32767
C59A résultat dans BC

****** instruction BASIC GRAPHICS
C59D 'PAPER'
C5A1 tester si encore un caractère
C5A4 'PEN'
C5A5 V
C5AA suit virgule ?
C5AE aller chercher valeur 8 bits < 2

****** GRAPHICS PAPER

C5B4 ignorer les espaces
C5B7 aller chercher argument < 16
C5BA GRA SET PAPER
****** GRAPHICS PEN
C5BD aller chercher argument < 16
C5C0 GRA SET PEN

****** instruction BASIC MASK

C5C3 ','
C5C7 aller chercher argument 8 bits
C5CD suit virgule ?
C5D1 aller chercher valeur 8 bits < 2

****** instruction BASIC FOR

C5D7 lire variable
C5DD chercher NEXT correspondant
C5E0 ranger adresse
C5E6 chercher boucle FOR-NEXT ouverte
C5E9 trouvé, fixer pointeur de pile BASIC
C5ED fin de l'instruction ?
C5F0 défaut zéro
C5F3 non, aller chercher variable
C5FC comparaison HLoDE
C5FF 'Unexpected NEXT'
C603 adresse de ligne actuelle dans HL
C607 fixer adresse de ligne actuelle
C610 22 octets, type 5 'Real'
C616 16 octets, type 2 Integer'
C61A 'type mismatch'
C61C sortir message d'erreur
C61F nombre octets dans A
C620 reserver place dans pile BASIC
C624 adresse de variable sur pile BASIC
C628 tester si '='
C62B aller chercher expression
C62F comparer type de variable
C633 mémoire provisoire pour variable FOR
C636 copier variable dans HL
C63A tester si encore un caractère
C63D TO'
C63E aller chercher expression
C643 comparer type de variable
C646 valeur finale sur pile BASIC
C64C un comme valeur STEP défaut
C64F accepter nombre entier HL
C653 prochain caractère
C654 'STEP ?
C656 non
C658 ignorer les espaces
C65B aller chercher expression
C65F comparer type de variable
C663 copier variable dans (HL)
C666 aller chercher signe
C66A signe de valeur STEP sur pile BASIC
C66E fin de l'instruction, sinon 'Syntax error'
C673 adresse de l'instruction FOR sur pile BASIC
C677 adresse de ligne actuelle dans HL
C67C adresse de ligne de FOR sur pile BASIC
C681 adresse de l'instruction NEXT sur pile BASIC
C689 adresse de ligne instruction NEXT sur pile BASIC
C68C #10 ou #16 pour Integer/Real sur pile
C68E pointeur sur mémoire provisoire
C691 ramener variable FOR
C695 flag pour premier parcours
C699 fixer adresse de ligne actuelle
C69F à l'instruction NEXT
C6A1 sortir message d'erreur
C6A4 'Unexpected NEXT'

******* instruction BASIC NEXT

C6A5 additionner
C6A7 flag pour incrément
C6AB chercher boucle FOR-NEXT ouverte
C6B1 fixer pointeur de pile BASIC
C6B6 tester si fin de boucle
C6BE pointeur de programme dans DE
C6C2 adresse de ligne dans HL
C6C5 fixer adresse de ligne actuelle
C6CA pointeur de pile BASIC
C6CD plus 5
C6CF pointeur de programme dans 'NEXT'
C6D2 fixer pointeur de pile BASIC
C6D6 suit virgule ?
C6D9 oui, prochaine boucle NEXT

****** chercher boucle FOR-NEXT ouverte

C6DC pointeur de pile BASIC
C6EB 'WHILE-WEND' ?
C6F8 comparaison HL <> DE
C70A Integer ?
C70C oui
C713 fixer type et adresse de variable
C717 flag pour premier parcours
C71B oui, sauter addition
C71F addition
C729 copier variable dans (HL)
C730 comparaison arithmétique
C734 10
C73E premier parcours ?
C742 oui, sauter addition
C749 aller chercher valeur STEP dans HL
C74C Integer-Addition HL := HL + DE
C74F 'Overflow'
C751 sortir message d'erreur
C761 comparaison entiers

****** instruction BASIC IF

C76A aller chercher expression
C76D 'GOTO'
C771 tester si encore un caractère
C774 THEN'
C778 chercher fin de la ligne ou branche ELSE
C77C fin de l'instruction ?
C77F oui
C780 numéro de ligne
C782 oui, à l'instruction GOTO
C784 adresse de ligne ?
C786 non, exécuter instruction BASIC

****** instruction BASIC GOTO

C789 aller chercher adresse de ligne
C78D accepter adresse comme pointeur de programme

****** instruction BASIC GOSUB

C78F aller chercher adresse de ligne
C794 marque pour GOSUB normal
C796 ranger adresse du sous-programme
C797 6 octets
C799 reserver place dans pile BASIC
C79F adresse de l'instruction dans 'GOSUB'
C7A0 sur pile BASIC
C7A3 adresse de ligne actuelle dans HL
C7A8 adresse de ligne sur pile BASIC
C7AB marque pour 'GOSUB'
C7B1 pointeur de programme sur sous-programme

******* instruction BASIC RETURN

C7B4 chercher 'GOSUB' sur pile BASIC
C7B7 restaurer pointeur de pile BASIC
C7BA octet type
C7BD adresse de l'instruction dans 'GOSUB'
C7BE aller chercher dans DE
C7C1 adresse de ligne dans HL
C7C4 fixer actuel numéro de ligne
C7C8 octet type
C7C9 plus petit que un ?
C7CB oui, GOSUB normal
C7CC un, alors GOSUB dans AFTER/EVERY
C7CF à la routine event
C7D6 aller chercher marque de pile BASIC
C7DB restaurer pointeur de pile BASIC
C7E0 'GOSUB'
C7E6 sortir message d'erreur
C7E9 'Unexpected RETURN'

****** instruction BASIC WHILE

C7EB chercher WEND correspondant
C7EE ranger adresse
C7F0 adresse de ligne pour 'WHILE-WEND'
C7F6 fixer pointeur de pile BASIC
C7F9 7 octets
C7FB reserver place dans pile BASIC
C7FF adresse de ligne actuelle dans HL
C804 adresse de ligne sur pile BASIC
C809 adresse dans 'WEND' sur pile BASIC
C810 adresse de la condition WHILE
C811 sur pile BASIC
C813 marque pour 'WHILE'
C816 fixer pointeur de pile BASIC
C81B tester condition WHILE

****** instruction BASIC WEND

C81D
C822 'Unexpected WEND'
C824 sortir message d'erreur
C82C fixer pointeur de pile BASIC
C82F adresse de ligne actuelle dans HL
C832 adresse de ligne pour-WHILE-WEND
C83B fixer adresse de ligne actuelle
C848 aller chercher expression
C84B aller chercher signe
C84F condition remplie ?
C850 adresse de ligne pour WHILE-WEND
C853 fixer comme adresse de ligne actuelle
C858 libérer place dans pile BASIC

*******

C860 pointeur de pile BASIC
C87B comparaison HL <> DE

******* instruction BASIC ON

C885 'ERROR'
C88A aller chercher valeur 8 bits
C88F 'GOTO'
C894 tester si encore un caractère
C897 'GOSUB'
C899 ignorer les espaces suivants
C89C décrémenter compteur
C89F aller chercher numéro de ligne dans DE
C8A2 suit virgule ?

****** traitement event (AFTER/EVERY)

C8B5
C8B9 KL NEXT SYNC
C8BC aucun événement en attente ?
C8BE ranger priorité
C8C2 annuler bit 7
C8C8 adresse du bloc event
C8C9 KL DO SYNC
C8D4 KL DONE SYNC
C8D9 prochain Event
C8E0 autoriser interruption par 'ESC
C8ED 'Break'
C8F2 à la boucle de l'interpréteur
C8FC adresse ON-BREAK
C901 numéro de ligne dans HL
C906 mode direct ?
C909 SOUND CONTINUE
C915 tester si encore un caractère
C918 'GOSUB'
C919 aller chercher adresse de ligne
C91D dans BC
C920 10

****** Event-Routine

C929
C92D aller chercher numéro de ligne/mode direct ?
C932 oui
C934 octet type pour AFTER/EVERY-GOSUB
C937 instruction GOSUB
C93A adresse de l'instruction actuelle
C949 adresse de l'instruction actuelle
C95A -8
C95E KL DONE SYNC
C968 -4
C96C KL DONE SYNC
C96F autoriser interruption par 'Break'
C976 à la boucle de l'interpréteur

****** instruction BASIC ON BREAK

C979
C97C ignorer les espaces
C97F 'CONT'
C984 'STOP'
C986 valeur défaut zéro pour Stop
C98B tester si encore un caractère
C98E 'GOSUB'
C98F aller chercher adresse de ligne
C993 adresse ON-BREAK
C997 KM DISARM BREAK

******* instruction BASIC DI

C99A
C99B KL EVENT DISABLE

******* instruction BASIC El

C9A0
C9A1 KL EVENT ENABLE

****** reset SOUND et event

C9A6 SOUND RESET
C9A9 adresse de base du bloc event
C9AC 4 Timer
C9AF KL DEL TICKER
C9B3 18
C9B6 additionner
C9B7 prochain timer
C9B9 KM DISARM BREAK
C9BC KL SYNC RESET
C9C2 annuler adresse ON-BREAK
C9C5 autoriser interruption par BREAK
C9C8 adresse de la Sound-Queue
C9D4 adresse du bloc event
C9DF BASIC-ROM-Select
C9E1 ADresse de la Event-Routine
C9E4 KL INIT EVENT

****** instruction BASIC ON SQ

C9F8 tester si '('
C9FB aller chercher valeur 8 bits
C9FF calculer adresse de la Sound-Queue
CA05 tester si ')'
CA08 aller chercher 'GOSUB' et adresse
CAOE SOUND ARM EVENT

****** calculer adresse de la Sound-Queue

CA13 bit 0 mis ?
CA18 bit 1 mis ?
CA1D bit 2 mis ?
CA22 'Improper argument'

****** instruction BASIC AFTER

CA25 aller chercher valeur 16 bits 0 - 32767
CA28 Recharge Count sur zéro

****** instruction BASIC EVERY

CA2D aller chercher valeur 16 bits 0 - 32767
CA30 comme Count et
CA31 Recharge Count
CA34 suit virgule ?
CA37 valeur défaut zéro
CA3A oui, aller chercher valeur entière avec signe
CA3E aller chercher dans Timer# adresse du bloc event
CA42 additionner 6 octets pour Tickerblock
CA47 aller chercher 'GOSUB' et adresse
CA4E KL ADD TICKER

****** fonction BASIC REMAIN

CA53 CINT
CA56 aller chercher adresse du bloc event
CA59 KL DEL TICKER
CA5C trouvé ?
CA5E non, zéro
CA62 accepter nombre entier dans HL

****** calculer adresse du bloc event

CA65
CA66 octet fort égale zéro ?
CA67 non, 'Improper argument'
CA6A supérieur ou égal 4 ?
CA6C oui, 'Improper argument'
CA70 * 18
CA74 adresse de base table event
CA77 plus Offset

****** chercher NEXT correspondant

CA79
CA7A adresse de ligne actuelle dans HL
CA7F compteur pour imbrication
CA81 numéro d'erreur pour 'NEXT missing'
CA87 ignorer les espaces
CA8A 'NEXT'
CA8F 'FOR'
CA93 incrémenter imbrication
CA94 chercher encore
CA99 adresse de ligne actuelle dans HL
CA9D fixer adresse de ligne actuelle
CAA1 décrémenter imbrication
CAA2 NEXT correspondant trouvé ?
CAA4 ignorer les espaces
CAA7 fin de ligne ?
CAAB chercher variable
CABO suit virgule ?
CAB3 non
CAB5 sinon prochaine variable dans NEXT
CAB8 trouvé NEXT correspondant
CABA oui
CABD adresse de ligne actuelle dans HL
CAO fixer adresse de ligne actuelle
CAC6 chercher encore
CAC9 ignorer les espaces

****** chercher WEND correspondant

CACC
CACE adresse de ligne actuelle dans HL
CAD2 compteur pour imbrication
CAD4 incrémenter
CAD5 numéro d'erreur pour 'WEND missing'
CADB ignorer les espaces
CADF 'WHILE'
CAE1 incrémenter imbrication
CAE3 'WEND'
CAE7 décrémenter imbrication
CAE9 ignorer les espaces
CAEC ignorer les espaces
CAEF aller chercher ligne d'entrée
CAF3 sélectionné stream 0
CAF6 initialiser pointeur de pile
CAF9 à la boucle de l'interpréteur

****** aller chercher ligne d'entrée

CAFC pointeur sur buffer d'entrée
CAFF annuler contenu buffer
CB01 aller chercher ligne d'entrée
****** éditer ligne
CB04 pointeur sur buffer d'entrée
CB07 éditer ligne
CB0A sortir LF

****** aller chercher ligne d'entrée sur la disquette

CB0D
CB0E pointeur sur buffer d'entrée
CB18 DISK IN CHAR
CB1D CR
CB25 LF
CB2D sortir message d'erreur
CB30 'Une too long'
CB32 LF

****** annuler numéro d'erreur

CB3A

****** fixer numéro d'erreur

CB3B erreur disquette
CB3E numéro d'erreur
CB41 adresse de ligne actuelle dans HL
CB44 comme ERROR-Line

****** sortir message d'erreur

CB48 adresse de retour dans HL
CB49 aller chercher caractère dans instruction CALL
CB4A comme numéro d'erreur, sortir message

****** sortir 'Syntax error'

CB4C numéro d'erreur pour 'Syntax error'
CB4E sortir message d'erreur

****** sortir 'Improper argument'

CB50 numéro d'erreur pour 'Improper argument'
CB52 sortir message d'erreur

****** instruction BASIC ERROR

CB54 aller chercher valeur 8 bits différ. de 0
CB58 fixer numéro et ligne d'erreur
CB5B adresse de l'instruction actuelle
CB5E pointeur de programme dans ERROR
CB61 ranger adresse de ligne et pointeur de programme
CB67 pointeur de pile sur C000
CB70 initialiser descripteur de pile
CB79 adresse de la routine ON-ERROR
CB7D flag pour en traitement d'erreur
CB8B à la boucle de l'interpréteur
CB90 numéro d'erreur
CB93 calculer adresse des messages d'erreur
CB99 comme actuel numéro de ligne
CBA3 erreur disquette
CBAA au mode READY
CBAD adresse de la ligne ERROR
CBBO aller chercher numéro de ligne dans HL
CBBA pointeur sur 'Division by zéro'
CBBD numéro d'erreur
CBC3 pointeur sur 'Overflow'
CBC6 numéro d'erreur
CBCA adresse de la routine ON-ERROR
CBDO numéro d'erreur dans accu
CBD1 sortir message d'erreur
CBD4 numéro stream sur zéro
CBD5 stream sélectionné
CBD8 ranger ancien numéro stream
CBDA sortir message d'erreur
CBDE sortir LF
CBE1 ancien numéro stream
CBE2 sélectionné
CBE9 initialiser écran
CBEC sortir 'Undefind Une'
CBEF sortir numéro de ligne
CBF2 sortir 'in numéro de ligne'
CBF4 'Undefined Une ',0
CC04 pointeur sur 'Break'
CCOA initialiser écran
CCOD sortir message d'erreur
CC10 aller chercher adresse de ligne
CC13 mode direct ?
CC15 pointeur sur ' in '
CC18 sortir chaîne
CC1C sortir numéro de ligne
CC1F 'Break'
CC24 ' in ',0

****** instruction BASIC STOP

CC29
CC2B sortir 'Break in numéro de ligne'
CC32 au mode READY

****** instruction BASIC END

CC34

****** erreur disquette

CC3A ranger erreur disque
CC3D sortir message d'erreur
CC40 'Nr 32'
CC4A au mode READY
CC66 au mode READY
CC6A aller chercher numéro de ligne dans HL
CC6E mode direct ?
CC70 fin de l'instruction ?
CC7B fixer adresse de ligne actuelle
CC87 mode direct ?
CC8A oui
CC8B adresse de ligne dans HL
CC8E adresse de ligne après interruption
CC92 pointeur de programme après interruption

****** instruction BASIC CONT

CC96
CC97 pointeur de programme après interruption
CC9B tester si mode direct
CC9C 'Cannot CONTinue'
CC9E sortir message d'erreur
CCA2 adresse de ligne après interruption
CCA5 fixer adresse de ligne actuelle
CCA8 SOUND CONTINUE
CCAC à la boucle de l'interpréteur
CCBO annuler flag pour en traitement d'erreur
CCB6 adresse de la routine ON-ERROR

****** ON ERROR

CCBB ignorer les espaces
CCBE tester si encore un caractère
CCC1 'GOTO'
CCC2 aller chercher numéro de ligne dans DE
CCC6 chercher ligne BASIC DE
CCCB fixer adresse de la routine ON-ERROR

****** instruction BASIC ON ERROR GOTO 0

CCCD adresse ON-ERROR sur zéro
CCD0 en traitement d'erreur ?
CCD4 non
CCD5 sortie d'erreur

****** instruction BASIC RESUME

CCD8
CCDA 'NEXT'
CCDE aller chercher adresse de ligne
CCE2 en traitement d'erreur ?
CCE8 à la boucle de l'interpréteur
CCEB en traitement d'erreur ?
CCEF à la boucle de l'interpréteur
CCF2 ignorer les espaces
CCF6 en traitement d'erreur
CCFA ignorer reste de la ligne
CCFD en traitement d'erreur ?
CD01 'Unexpected RESUME'
CD03 non, sortir message d'erreur
CD07 annuler numéro ERROR
CDOA annuler flag pour en traitement d'erreur
CDOD adresse de la ligne ERROR
CD 10 comme adresse de ligne actuelle
CD 13 pointeur de programme après ERROR

****** messages d'erreur

****** sortir message d'erreur

CE76 adresse de base des messages d'erreur
CE79 fixer pointeur sur message d'erreur
CE7D aller chercher caractère des messages d'erreur
CE7E annuler bit 7
CE80 caractère imprimable ?
CE82 oui, sortir
CE85 non, fixer message d'erreur
CE89 aller chercher caractère encore une fois
CE8A incrémenter pointeur
CE8B tester bit 7
CE8C pas mis, sortir encore

****** fixer pointeur DE sur message d'erreur

CE8F
CE95 numéro zéro ?
CE96 terminé
CE98 numéro d'erreur dans B
CE99 aller chercher caractère
CE9A incrémenter pointeur
CE9B tester bit 7
CE9C pas mis, ignorer message
CE9E prochain message d'erreur
CEA0 DE pointe maintenant sur début du message

****** aller chercher valeur 8 bits

CEBB aller chercher valeur entière avec signe
CEBF octet fort
CEC1 différ. de zéro, 'Improper argument'
CEC4 accepter octet faible

******* aller chercher valeur 8 bits différente de zéro

CEC6 aller chercher valeur entière avec signe
CECC différ. de zéro ?
CECE 'Improper argument'

******* aller chercher valeur 16 bits 0 à 32767

CED1 aller chercher valeur entière avec signe
CED5 octet fort
CED6 tester bit 15
CED7 mis, 'Improper argument'

******* aller chercher valeur entière avec signe

CEDB aller chercher expression
CEEO CINT
CEE6 aller chercher expression
CEE9 tester si chaîne
CEEC non

****** aller chercher valeur 16 bits, expression d'adresse

CEF8 aller chercher expression
CEFE UNT

****** aller chercher expression chaîne et paramètre

CF06 aller chercher expression
CF09 aller chercher param. de chaîne

****** aller chercher expression chaîne

CF0C aller chercher expression
CF0F type chaîne, sinon 'Type mismatch'

****** aller chercher numéro de zone de ligne

CF12 1 et
CF15 65535 comme défaut
CF18 suit virgule ?
CF1B non, fin de l'instruction ?
CF1E oui
CF1F '#'
CF22 '-'
CF26 aller chercher numéro de ligne dans DE
CF2A et dans BC
CF2C suit virgule ?
CF2F oui
CF30 tester si encore un caractère
CF33 '-'
CF34 65535 comme valeur finale défaut
CF38 suit virgule ?
CF3B oui
CF3C aller chercher numéro de ligne dans DE
CF3F suit virgule ?
CF46 'Improper argument'

******* aller chercher numéro de ligne dans DE

CF4B type de constante
CF4E valeur dans DE
CF50 numéro de ligne ?
CF52 oui, terminé
CF54 adresse de ligne ?
CF56 non, 'Syntax error'
CF5A HL pointe sur début de ligne
CF5F numéro de ligne dans DE
CF62 ignorer les espaces

****** aller chercher expression

CF65
CF66 code de hiérarchie zéro
CF68 aller chercher terme
CF6D ignorer les espaces

****** aller chercher terme

CF70
CF72 aller chercher expression
CF78 opérateur
CF79 V
CF7B plus petit ?
CF7C 'NOT'
CF7E supérieur ou égal ?
CF7F '+'
CF81 plus petit, alors opérateur de comparaison
CF83 '+', alors tester si chaîne
CF86 pas chaîne
CF8A descripteur de chaîne
CF8D sur pile
CF8E aller chercher expression
CF91 type chaîne, sinon 'Type mismatch'
CF95 addition de chaîne
CF98 traiter prochain terme

****** opérateurs arithmétiques

CF9A
CF9B moins #F4
CF9E fois 4
CFA2 plus #CFF0, adresse table
CFA9 code de hiérarchie
CFAB plus petit, terminé
CFAD placer résultat sur pile
CFB3 code de hiérarchie
CFB4 aller chercher terme
CFC0 reserver place dans pile BASIC
CFC3 JP (DE), exécuter opération
CFC6 traiter prochain terme

****** opérateurs de comparaison

CFC8
CFCD Token
CFCE moins Offset
CFD1 tester si chaîne
CFD4 adresse pour comparaisons arithmétiques
CFD7 pas chaîne
CFDA descripteur de chaîne
CFDD sur pile
CFDF code de hiérarchie
CFE1 aller chercher terme
CFE7 comparaison de chaîne
CFEB aller chercher résultat des comparaisons
CFEE traiter prochain terme

★ 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.73-desktop/c
Page créée en 463 millisecondes et consultée 1352 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.