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
★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 770 millisecondes et consultée 1635 foisL'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. |
|
|