CODING ★ EDITION DU BUFFER ★

Fdc - 13 - Edition du Buffer (SOS Programmeurs)

Cette section à été considérablement modifiée par rapport à la version précédente . Les sections de listing inchangées sont collées contre la marge.

1 : Initialisation

;
AFFBUF CALL #B906
CALL FENBUF
LD HL,20000
LD DE,(NBLUS) ;Calculer et mémoriser adresse de fin du buffer
ADD HL,DE
LD (ADFBUF),HL
;
AFFBUF1 CALL FENBUF1 ;Point de reprise pour changement de secteur
;
LD HL,0
LD (DECABUF),HL
LD DE,(ADBUFF)
;
NEXTPAG LD (ADIMPBU),DE ;Memoriser debut page pour imprimante
;
LD (EDICASE),DE ;Mémoriser case édition
LD HL,#0702
LD (LOCCASE),HL ;Position X-Y curseur hexadécimal
LD A,64
LD (LOCASC),A ;Position X du curseur ASCII
;
LD IY,#0201
LD HL,TBUFFER
CALL PRTLOC
LD HL,(ADBUFF)
LD BC,(DECABUF)
ADD HL,BC
LD (VALEUR),HL
CALL DEUCON16
LD HL,#C141+80
LD B,16
;
ENCORE PUSH DE
LD DE,(DECABUF)
CALL INVRAP
CALL HEXRDE
CALL INVRAP
POP DE
INC L
INC L
PUSH BC
LD B,16
PUSH DE
BCL1A LD A,(DE)
CALL HEXRAP
INC HL
INC DE
DJNZ BCL1A
LD BC,8
ADD HL,BC
LD B,16
POP DE
BCL2A LD A,(DE)
CALL AFFI
INC DE
DJNZ BCL2A
INC HL
INC HL
PUSH HL
LD HL,(DECABUF)
LD BC,16
ADD HL,BC
LD (DECABUF),HL
POP HL
POP BC
DJNZ ENCORE
EI
;

2 : Commandes d'édition

;
TSTBUF1 PUSH DE
TSTBUF2 CALL INVCASE ;Afficher case en vidéo inverse
;
LD HL,TOCTET ;Afficher position d'édition
CALL PRT
LD HL,(EDICASE)
PUSH HL
LD (VALEUR),HL
CALL DEUCON16
POP DE
;
CALL #BB06
;
PUSH AF
CALL RESTICAS ;Réafficher case en normal
POP AF
;
CP #F4
MODBUF JP Z,REMONTE ;Reculer d'une page (Modifié vers REMONT1 si appel
CP #F5 ;vient de LITPHY)
MODBUF1 JP Z,AVANCE ;Avancer d'une page (Modifié vers REMONT1 si appel
CP #F5 ;vient de LITPHY)
CP #F3
JP Z,INCCASE ;Avancer édition d'une case
CP #F2
JP Z,DECCASE ;Reculer édition d'une case
CP #F0
JP Z,CASEUP ;Avancer édition d'une ligne
CP #F1
JP Z,CASEDOW ;Reculer édition d'une ligne
;
CP 23 ;CTRL+W
TSTWRIT DB 0,0,0 ;Saut en WRITSEC si appel vient de LITPHY
;
CP 6 ;CRTL+F
JP Z,FILL ;Remplir de AD1 à AD2 avec N
CP 4 ;CRTL+D
JP Z,MOVE ;Copier de AD1 à AD2 vers AD3
CP 5 ;CRTL+E
JP Z,ECHANGE ;Echanger de AD1 à AD2 vers AD3
;
CP 17 ;CRTL+Q
JP Z,FINBUF
CP "P"
JP Z,IMPBUF
CP "p"
JP Z,IMPBUF
;
PUSH DE
LD DE,(EDICASE) ;Passer par une partie de MODIVAL (SOS2) . Au retour
CALL INCNUM1 ;A=#FF si le contenu de l'octet a été modifié .
CP #FF
CALL Z,INVCASE ;Si modifié , réafficher .
POP DE
JR TSTBUF2
;


3 : Changer de page

;
REMONTE LD HL,(DECABUF)
CALL SUB512
JR C,NOGOODS
;
REMONT2 POP DE
LD (DECABUF),HL
EX DE,HL
CALL SUB512
EX DE,HL
JR AVANCE2
;
AVANCE LD HL,(NBLUS)
LD DE,(DECABUF)
AND A
;SBC HL,DE
JR C,NOGOODS
JR Z,NOGOODS
;
AVANCE3 POP DE
AVANCE2 JP NEXTPAG
;
NOGOODS CALL SONNE
JP TSTBUF2
;


4 : Deplacement et lecture speciaux pour LITPHY

;
;- Reculer d'une page -
;
REMONT1 LD HL,(DECABUF) ;Tant que DECABUF > 512 ne pas changer
CALL SUB512 ;de secteur .
JR NC,REMONT2
;
NEXTUP LD HL,(POINTID) ;Reculer d'un secteur
LD DE,(POINTER) ;et d'un état d'erreur
DEC DE ;Pointer etat erreur precedent
DEC HL ;Reculer de 4 IDS dans la serie
DEC HL
DEC HL
DEC HL
LD A,(COUNT) ;Si revenu au dela du 1er , pointer sur le dernier
DEC A ;secteur
JR NZ,LITAUTR
;
;- Passer du 1er au dernier secteur de la piste -
;
LD A,(NBSEC) ;Dernière position physique
LD B,A
LD DE,LISTERR-1
;
BCLINCID INC HL ;Aller chercher le dernier ID de la serie
INC HL
INC HL
INC HL
INC DE ;avec son état d'erreur en lecture
DJNZ BCLINCID
JR LITAUTR
;
;- Avancer d'une page et d'un secteur s'il y-a lieu -
;
AVANCE1 LD HL,(NBLUS) ;Tant que DECABUF < NBLUS ne pas changer
LD DE,(DECABUF) ;de secteur
AND A
;SBC HL,DE
JR C,NEXTAVAN
JR Z,NEXTAVAN
JR AVANCE3
;
NEXTAVAN LD HL,(POINTID) ;Pointer 4 IDS plus loin
LD DE,(POINTER)
INC DE
INC HL
INC HL
INC HL
INC HL
;
LD A,(NBSEC) ;Si COUNT <> NBSECT
LD B,A ;On avance d'un secteur
LD A,(COUNT)
CP B
JR NZ,LITAUT1
;
PUSH IX ;Sinon on revient au debut
POP HL ;1er ID dans HL
LD DE,LISTERR
LD A,1
JR LITAUTR
;
LITAUT1 INC A
LITAUTR LD (POINTID),HL ;Parametrer prochaine lecture
LD (POINTER),DE
LD (COUNT),A
CALL LITPHYA ;Lire
POP DE
JP AFFBUF1 ;Et recommencer affichage
;
;- Ecrire secteur -
;
WRITSEC CALL WRITPHY
CALL FEN1
CALL RESSOUR ;Restaurer paramètres sources
CALL FENBUF1
JP NEXTAVAN ;et lire le prochain secteur
;


5 : Edition buffer

;
INCCASE INC DE ;Avancer d'une case dans la page
;
LD HL,(LOCCASE) ;Position X curseur
INC H ;+3
INC H
INC H
LD A,H
CP 53
LD A,(LOCASC) ;Récupérer X curseur ASCII
JR C,EXEDIBU ;Tout va bien
;
LD H,7 ;On sort à droite de la fene^tre
INC L ;Il faut revenir au début de la ligne suivante
LD A,L
CP 18 ;En vérifiant qu'on ne sort pas en bas de la page
LD A,63
JR NZ,EXEDIBU
;
LD DE,(ADIMPBU) ;Revenir en haut et à gauche sur la 1ère case
LD HL,#0702 ;si on sort à droite par le bas .
JR EXEDIBU
;
DECCASE DEC DE ;Reculer d'une case dans la page
LD HL,(LOCCASE) ;Comme pour avancer mais dans l'autre sens
DEC H
DEC H
DEC H
LD A,H
CP 6
LD A,(LOCASC)
DEC A
DEC A
JR NC,EXEDIBU ;Tout va bien
;
LD H,52 ;On sort à gauche donc on monte d'une ligne
DEC L
LD A,L
CP 1
LD A,78
JR NZ,EXEDIBU
;
LD DE,(ADIMPBU) ;On sort en haut et à gauche , il faut aller
LD HL,255 ;en bas et à droite
ADD HL,DE
EX DE,HL
LD HL,#3411
JR EXEDIBU
;
CASEUP LD A,(LOCCASE) ;Monter d'une ligne
DEC A
CP 1
LD HL,-16
JR NZ,UPCASE1
;
LD HL,240 ;Si on déborde , retourner en bas
LD A,17
JR UPCASE1
;
CASEDOW LD A,(LOCCASE) ;Descendre d'une ligne
INC A
CP 18
LD HL,16
JR NZ,UPCASE1 ;Si on déborde , retourner en haut
;
LD A,2
LD HL,-240
;
UPCASE1 LD (LOCCASE),A ;Ranger Y curseur HEXA
ADD HL,DE
EX DE,HL ;Pointer nouvelle case
JR EXEDIB1
;
EXEDIBU INC A
LD (LOCASC),A ;Ranger Y curseur ASCII
LD (LOCCASE),HL ;Ranger X-Y curseur HEXA
EXEDIB1 LD (EDICASE),DE ;Ranger nouvelle case édition
POP DE
JP TSTBUF1
;


6 : Afficher les 2 curseurs d'édition

;
INVCASE CALL INV ;Vidéo inverse
CALL RESTICAS
JP INV
;
RESTICAS PUSH HL ;Placer et afficher HEXA
LD HL,(LOCCASE)
PUSH HL
CALL #BB75
CALL SPACE
LD HL,(EDICASE)
LD A,(HL)
LD B,A
CALL PRTHEX1
POP HL
;
LD A,(LOCASC) ;Placer et afficher ASCII
LD H,A
CALL #BB75
LD A,B
PUSH DE
;BIT 7,A
JR Z,NON7
;
AND %01111111
CALL INV
CALL #BB5D
CALL INV
JR EXI7
;
NON7 CALL #BB5D
EXI7 POP DE
POP HL
RET
;


7 : Routines FILL - MOVE - EXCHANGE

Fill remplit le buffer depuis AD1 sur une longueur de AD3 avec l'octet donné .

;
FILL CALL DEBFIN ;Entrer et tester les adresses de début et de fin
LD HL,TFILL ;Donner l'octet de remplissage
CALL INPUPRT2
LD A,(VALEUR)
LD E,A
LD HL,(AD1) ;Début
LD BC,(AD3) ;Longueur
;
BCLFILL LD (HL),E ;Remplir
INC HL
DEC BC
LD A,B
OR C
JR NZ,BCLFILL
;
YYY LD HL,TEFFINP ;Effacer la ligne input
CALL PRT
CALL FENBUF1 ;Restaurer la fene^tre du buffer
;
LD HL,(DECABUF)
LD DE,256 ;Diminuer DECABUF de 256 pour réafficher la page
AND A ;modifiée sans décaler les pointeurs
;SBC HL,DE
LD (DECABUF),HL
POP DE
LD DE,(ADIMPBU)
JP NEXTPAG
;
;- Copie la zone AD1 vers AD2 sur AD3 octets -
;
MOVE CALL DEBFIN
LD HL,(AD1)
LD DE,(AD2)
LD BC,(AD3)
;
PUSH HL ;Si Adresse source < adresse destination on effectue
AND A ;un transfert ascendant par LDIR . Sinon on utilise
;SBC HL,DE ;LDDR pour transfert descendant . Ceci afin de
POP HL ;recopier convenablement en cas de chevauchement
JR Z,MOVE ;des zones sources et destination .
JR NC,NOLDIR ;Si DE=HL transfert impossible on recommence
;
LDIR
JR YYY
;
NOLDIR ADD HL,BC ;Pour LDDR on commence par la fin des zones
EX DE,HL
ADD HL,BC
EX DE,HL
DEC DE
DEC HL
LDDR
JR YYY
;
;- Echange la zone AD1 vers AD2 sur AD3 octets -
;
ECHANGE CALL DEBFIN ;Entrer et tester les adresses de début et de fin
CALL VERSAD ;Entrer et tester l'adresse destination .
CALL VERSAD
LD HL,(AD1)
LD DE,(AD2)
LD BC,(AD3)
;
PUSH HL ;Source < dest = Echange ascendant , descendant sinon
AND A
;SBC HL,DE
POP HL
JR Z,ECHANGE ;Si DE=HL transfert impossible on recommence
JR NC,NOLDI1
;
BCLECH LD A,(HL) ;Echange ascendant
PUSH AF ;Préserver contenu de HL
LD A,(DE)
LD (HL),A ;Mettre (DE) dans (HL)
POP AF ;Récupérer (HL)
LD (DE),A ;et mettre dans (DE)
INC HL
INC DE
DEC BC
LD A,B
OR C
JR NZ,BCLECH
JP YYY
;
NOLDI1 ADD HL,BC ;Echange descendant
EX DE,HL
ADD HL,BC
EX DE,HL
DEC DE
DEC HL
;
BCLECH1 LD A,(HL)
PUSH AF
LD A,(DE)
LD (HL),A
POP AF
LD (DE),A
DEC HL
DEC DE
DEC BC
LD A,B
OR C
JR NZ,BCLECH1
JP YYY
;
;- Entrée adresses debut et fin -
;
DEBFIN CALL FEN1
DEBFIN1 CALL VERISTAR ;Adresse source < Debut buffer ?
JR C,DEBFIN1 ;C=oui et c'est raté
CALL VERIEND ;Adresse source > Finbuff ?
JR C,DEBFIN1 ;C=oui , c'est encore raté .
LD (AD1),HL
;
FINAD LD HL,ADBFIN
CALL INPUPRT5
CALL VERIEND ;Adresse Fin > finbuff
JR C,FINAD ;C=oui c'est toujours raté
CALL VERIEN1 ;Adresse fin < Adresse debut
JR C,FINAD ;C=oui c'et à refaire
LD (AD2),HL
LD DE,(AD1) ;Fin - Debut
PUSH HL
AND A
;SBC HL,DE
INC HL ;+ 1
LD (AD3),HL ;= longueur a traiter
POP HL
RET
;
;- Adresse destination -
;
VERSAD LD HL,TADEND
CALL VERISTA1 ;Entrer adresse et voir si < Debut buffer ?
JR C,VERSAD ;Oui !
CALL VERIEND ;> Fin buffer ?
JR C,VERSAD ;Oui !
LD (AD2),HL
RET
;
VERISTAR LD HL,ADBSTAR ;Vérifier validité de l'adresse départ
VERISTA1 CALL INPUPRT5
LD HL,(VALEUR)
LD DE,20000
PUSH HL
AND A
;SBC HL,DE ;Debut < Debut buffer ? C=oui
POP HL
RET
;
VERIEND LD HL,(VALEUR) ;Vérifier validité de l'adresse fin
EX DE,HL
LD HL,(ADFBUF)
AND A
;SBC HL,DE
EX DE,HL
RET ;Debut > Finbuff ? C=oui
;
VERIEN1 PUSH HL
LD DE,(AD1)
AND A
;SBC HL,DE ;Fin < debut ? C=oui
POP HL
RET
;
;- Variables buffer et textes -
;
LIST
AD1 DW 0
AD2 DW 0
AD3 DW 0
ADFBUF DW 0
NOLIST
;
TEFFINP DB 31,1,21,18+#80
ADBSTAR DB 31,2,21,24," Depart ? ",24,32,18+#80
ADBFIN DB 31,22,21,24," Fin ? ",24,32,18+#80
TADEND DB 31,42,21,24," Vers ? ",24,32,18+#80
TFILL DB 31,42,21,24," Octet fill ? ",24,32,18+#80
LOCCASE DW 0
LOCASC DB 0
EDICASE DW 0
;

SOS Programmeurs n°3

★ ANNÉE: ???
★ AUTEUR: MICHEL MAIGROT

Page précédente : Fdc - 12 - la Routine d'Ecriture de Secteurs
★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  3    FRENCHDATE: 2003-03-29
DL: 828
TYPE: ZIP
SiZE: 144Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Fdc - 14 - Creation d'un Piste a Partir du Buffer (SOS Programmeurs)
» Coding » Fdc - 25 - Formatage et Ecriture Piste (SOS Programmeurs)
» Coding » Fdc - 06 - Entree Programme (SOS Programmeurs)
» Coding » Fdc - 08 - Test Interrupt (SOS Programmeurs)
» Coding » Fdc - 24 - Reproduction (SOS Programmeurs)
» Coding » FDC - 23 - Etude de la Piste (SOS Programmeurs)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» 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.7-desktop/c
Page créée en 770 millisecondes et consultée 1635 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.