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: 840
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 - 21 - Programme de Copie (SOS Programmeurs)
» Coding » Fdc - 14 - Creation d'un Piste a Partir du Buffer (SOS Programmeurs)
» Coding » Fdc - 03 - Commandes du Fdc (SOS Programmeurs)
» Coding » FDC - 26 - Sub Routines Pour le FDC (SOS Programmeurs)
» Coding » Fdc - 30 - Fdc Exemple de Bidouilles (SOS Programmeurs)
» Coding » Fdc - 23 - Ecraser les Secteurs (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 210 millisecondes et consultée 1685 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.