; ------------------------------------------------------------------------------
; AFFICHE.MAX
;
; Programme d'affichage d'un ecran suivant un mode et une adresse choisie par
; des parametres.
; Syntaxe - ùAFFICHE,<numero du mode>,<adresse d'implantation>
; L'ecran a afficher doit auparavant etre stocke dans la memoire a partir de
; l'adresse d'implantation sous la forme d'un ecran non compile
; Le mode d'affichage permet l'affichage dans le bon sens et dans le mauvais
; sens comme l'indique le liste suivante :
; 0 - Affichage dans le bon sens de haut en bas
; 1 - Affichage dans le bon sens de bas en haut
; 2 - Affichage dans le bon sens de droite a gauche
; 3 - Affichage dans le bon sens de gauche a droite
; 4 - Affichage dans le mauvais sens de haut en bas
; 5 - Affichage dans le mauvais sens de bas en haut
; 6 - Affichage dans le mauvais sens de droite a gauche
; 7 - Affichage dans le mauvais sens de gauche a droite
;
; (C) J.P.B SYSTEM 1989 ** All rights reserved
;
; ------------------------------------------------------------------------------
ORG &A100
LD HL,RESER
LD BC,ADDR
JP INITRSX
RESER DEFS 04
BUFFER1 DEFS 01
BUFFER2 DEFS 01
STOCKE1 DEFS 01
STOCKE2 DEFS 01
STOCKE3 DEFS 01
ADDR DEFW NAME
JR PROG
NAME DEFM "AFFICH","E"+&80
DEFM &00
PROG CP &02 ; Verifie le nombre de parametres
JR NZ,ERROR1
LD A,(IX+&01)
CP &C0 ; Teste le poids fort de l'adresse
JR NC,ERROR2 ; SI (A)>&C0
LD A,(IX+&03)
CP &00 ; Teste le poids fort du mode d'affichage
JR NZ,ERROR3
LD A,(IX+&02)
AND A,&F8
JR NZ,ERROR3 ; Fin de la detection des erreurs
LD A,(IX+&02)
CP &00
JP Z,AFFI0
CP &01
JP Z,AFFI1
CP &02
JP Z,AFFI2
CP &03
JP Z,AFFI3
CP &04
JP Z,AFFI4
CP &05
JP Z,AFFI5
CP &06
JP Z,AFFI6
JP AFFI7
ERROR3 LD HL,ECRIT3
JR CONT1
ERROR2 LD HL,ECRIT2
JR CONT1
ERROR1 LD HL,ECRIT1
CONT1 LD A,(HL)
CP &FF
RET Z
CALL ECRIRE
INC HL
JR CONT1
ECRIT1 DEFM "Nombre de parametres errone ."
DEFM &FF
ECRIT2 DEFM "Erreur dans l'adresse d'implantation ."
DEFM &FF
ECRIT3 DEFM "Erreur dans le numero du mode d'affichage ."
DEFM &FF
; ---------------------------------------------------------------PROGRAMME AFFI0
AFFI0 LD D,(IX+&01) ; Initialisation des pointeurs
LD E,(IX+&00)
LD HL,&C000 ; HL=Ecran DE=Memoire
LD B,25 ; Programme principal des 25 lignes
CPT30 PUSH BC
LD A,L
LD (BUFFER1),A
PUSH HL
PUSH DE
CALL TRANS10
POP DE
POP HL
PUSH DE ; Incremente le pointeur ecran pour
LD DE,&0050 ; Passer a la ligne suivante
ADD HL,DE
POP DE
EX DE,HL ; Incremente le pointeur memoire pour
PUSH DE ; Passer a la ligne suivante
LD DE,&0050
ADD HL,DE
POP DE
EX DE,HL
POP BC
DJNZ CPT30
RET
TRANS10 LD B,8 ; Transfere d'un groupe de 8 lignes
CPT20 PUSH BC
PUSH HL
PUSH DE
PUSH AF
PUSH BC
CALL TEMPO0
POP BC
POP AF
CALL TRANS0 ; Transfere une ligne horizontale
POP DE
POP HL
LD A,D ; Passe a la ligne suivante en memoire
ADD A,8
LD D,A
LD A,(BUFFER1) ; Remet a zero les poids faibles
LD L,A
LD E,A
LD A,H ; Passe a la ligne suivante dans l'ecran
ADD A,&8
LD H,A
POP BC
DJNZ CPT20
RET
TRANS0 LD B,&50
CPT10 LD A,(DE)
LD (HL),A
INC HL
INC DE
DJNZ CPT10
RET
TEMPO0 LD BC,&0200
TEMPO10 DEC BC
LD A,B
OR C
JR NZ,TEMPO10
RET
; ---------------------------------------------------------------PROGRAMME AFFI1
AFFI1 LD H,(IX+&01) ; Initialisation des pointeurs
LD L,(IX+&00) ; HL=Ecran DE=Memoire
LD DE,&3FCF
ADD HL,DE
EX DE,HL
LD HL,&FFCF
LD B,25 ; Programme principal des 25 lignes
CPT31 PUSH BC
LD A,L
LD (BUFFER1),A
PUSH HL
PUSH DE
CALL TRANS11
POP DE
POP HL
PUSH DE ; Decremente le pointeur ecran pour
LD DE,&0050 ; Passer a la ligne superieure
CPT41 DEC DE
DEC HL
LD A,D
OR E
JR NZ,CPT41
POP DE
EX DE,HL ; Decremente le pointeur memoire pour
PUSH DE ; Passer a la ligne superieure
LD DE,&0050
CPT51 DEC DE
DEC HL
LD A,D
OR E
JR NZ,CPT51
POP DE
EX DE,HL
POP BC
DJNZ CPT31
RET
TRANS11 LD B,8 ; Transfere d'un groupe de 8 lignes
CPT21 PUSH BC
PUSH HL
PUSH DE
PUSH AF
PUSH BC
CALL TEMPO1
POP BC
POP AF
CALL TRANS1 ; Transfere une ligne horizontale
POP DE
POP HL
LD A,D ; Passe a la ligne precedente en &4000
SUB 8
LD D,A
LD A,(BUFFER1) ; Remet a zero les poids faibles
LD L,A
LD E,A
LD A,H ; Passe a la ligne precedentes en memoire
SUB 8
LD H,A
POP BC
DJNZ CPT21
RET
TRANS1 LD B,&50
CPT11 LD A,(DE)
LD (HL),A
DEC HL
DEC DE
DJNZ CPT11
RET
TEMPO1 LD BC,&0200
TEMPO11 DEC BC
LD A,B
OR C
JR NZ,TEMPO11
RET
; ---------------------------------------------------------------PROGRAMME AFFI2
AFFI2 LD HL,&C000 ; Initialisation des pointeurs
LD D,(IX+&01)
LD E,(IX+&00)
LD A,&4F ; Nombre de colonnes dans un ecran standard
SUITE2 PUSH AF
LD L,A ; Selectionne la colonne courante
LD E,A
LD H,&C0
LD D,(IX+&01)
LD B,25 ; Nombre de lignes courante
ENCORE2 PUSH BC
PUSH BC
PUSH AF
CALL TEMX2
POP AF
POP BC
LD A,H
LD (STOCKE1),A
LD A,D
LD (STOCKE2),A
LD B,8 ; Nombre de lignes octets comprises dans une ligne courante
TOURNE2 PUSH BC
LD A,(DE)
LD (HL),A
LD A,H ; Passe 800 octets plus bas dans la ligne courante
ADD A,8 ; Operation sur DE et HL
LD H,A
LD A,D
ADD A,8
LD D,A
POP BC
DJNZ TOURNE2
LD A,(STOCKE1)
LD H,A
LD A,(STOCKE2)
LD D,A
PUSH DE ; Passe a la ligne suivante
LD DE,&0050
ADD HL,DE
POP DE
EX DE,HL
PUSH DE
LD DE,&0050
ADD HL,DE
POP DE
EX DE,HL
POP BC
DJNZ ENCORE2
POP AF
CP &00
JR NZ,TOTO2
RET
TOTO2 DEC A
JR SUITE2
TEMX2 LD BC,&0010
TEMX12 DEC BC
LD A,B
OR C
JR NZ,TEMX12
RET
; ---------------------------------------------------------------PROGRAMME AFFI3
AFFI3 LD HL,&C000
LD D,(IX+&01)
LD E,(IX+&00)
XOR A ; Initialise le nombre de colonnes dans un ecran standard
SUITE3 PUSH AF
LD L,A ; Selectionne la colonne courante
LD E,A
LD H,&C0
LD D,(IX+&01)
LD B,25 ; Nombre de lignes courante
ENCORE3 PUSH BC
PUSH BC
PUSH AF
CALL TEMX2
POP AF
POP BC
LD A,H
LD (STOCKE1),A
LD A,D
LD (STOCKE2),A
LD B,8 ; Nombre de lignes octets comprises dans une lignes courante
TOURNE3 PUSH BC
LD A,(DE)
LD (HL),A
LD A,H ; Passe 800 octets plus bas dans la ligne courante
ADD A,8 ; Operation sur DE et HL
LD H,A
LD A,D
ADD A,8
LD D,A
POP BC
DJNZ TOURNE3
LD A,(STOCKE1)
LD H,A
LD A,(STOCKE2)
LD D,A
PUSH DE ; Passe a la ligne suivante
LD DE,&0050
ADD HL,DE
POP DE
EX DE,HL
PUSH DE
LD DE,&0050
ADD HL,DE
POP DE
EX DE,HL
POP BC
DJNZ ENCORE3
POP AF
CP &4F
JR NZ,TOTO3
RET
TOTO3 INC A
JR SUITE3
; ---------------------------------------------------------------PROGRAMME AFFI4
AFFI4 LD H,(IX+&01) ; Initialisation des pointeurs
LD L,(IX+&00) ; HL=Ecran DE=Memoire
LD DE,&3FCF
ADD HL,DE
EX DE,HL
LD HL,&C000
LD B,25 ; Programme principal des 25 lignes
CPT34 PUSH BC
LD A,L
LD (BUFFER1),A
LD A,E
LD (BUFFER2),A
PUSH HL
PUSH DE
CALL TRANS14
POP DE
POP HL
PUSH DE ; Incremente le pointeur ecran pour
LD DE,&0050 ; Passer a la ligne suivante
ADD HL,DE
POP DE
PUSH AF
EX DE,HL ; Decremente le pointeur memoire pour
PUSH DE ; Passer a la ligne suivante
LD DE,&0050
ENRE14 DEC HL
DEC DE
LD A,D
OR E
JR NZ,ENRE14
POP DE
EX DE,HL
POP AF
POP BC
DJNZ CPT34
RET
TRANS14 LD B,8 ; Transfere d'un groupe de 8 lignes
CPT24 PUSH BC
PUSH HL
PUSH DE
CALL TRANS4 ; Transfere une ligne horizontale
POP DE
POP HL
LD A,D ; Passe a la ligne precedente en memoire
SUB &08
LD D,A
LD A,(BUFFER1) ; Remet a zero les poids faibles
LD L,A
LD A,(BUFFER2)
LD E,A
LD A,H ; Passe a la ligne suivante en memoire
ADD A,&8
LD H,A
POP BC
DJNZ CPT24
RET
TRANS4 LD B,&50
CPT14 LD A,(DE) ; Aquisition d'un octet puis symetrie.max !
CALL SYMETRY
LD (HL),A ; Une fois que tout les bits sont inverses c'est fini
INC HL
DEC DE
DJNZ CPT14
RET
; ---------------------------------------------------------------PROGRAMME AFFI5
AFFI5 LD HL,&FFCF ; Initialisation des pointeurs
LD D,(IX+&01) ; HL=Ecran DE=Memoire
LD E,(IX+&00)
LD B,25 ; Programme principal des 25 lignes
CPT35 PUSH BC
LD A,L
LD (BUFFER1),A
LD A,E
LD (BUFFER2),A
PUSH HL
PUSH DE
CALL TRANS15
POP DE
POP HL
PUSH DE ; Decremente le pointeur ecran pour
LD DE,&0050 ; Passer a la ligne superieure
CPT45 DEC DE
DEC HL
LD A,D
OR E
JR NZ,CPT45
POP DE
EX DE,HL ; Incremente le pointeur memoire pour
PUSH DE ; Passer a la ligne suivante
LD DE,&0050
ADD HL,DE
POP DE
EX DE,HL
POP BC
DJNZ CPT35
RET
TRANS15 LD B,8 ; Transfere d'un groupe de 8 lignes
CPT25 PUSH BC
PUSH HL
PUSH DE
CALL TRANS5 ; Transfere une ligne horizontale
POP DE
POP HL
LD A,D ; Passe a la ligne precedente en memoire
ADD &08
LD D,A
LD A,(BUFFER1) ; Remet a zero les poids faibles
LD L,A
LD A,(BUFFER2)
LD E,A
LD A,H ; Passe a la ligne suivante en memoire
SUB A,&8
LD H,A
POP BC
DJNZ CPT25
RET
TRANS5 LD B,&50
CPT15 LD A,(DE) ; Aquisition d'un octet puis symetrie.max !
CALL SYMETRY
LD (HL),A ; Une fois que tout les bits sont inverses c'est fini
DEC HL
INC DE
DJNZ CPT15
RET
; ---------------------------------------------------------------PROGRAMME AFFI6
AFFI6 XOR A
LD (STOCKE3),A
LD H,(IX+&01)
LD L,(IX+&00)
LD DE,&3FFF
ADD HL,DE
EX DE,HL
LD HL,&C000
LD A,&4F ; Nombre de colonnes dans un ecran standard
SUITE6 PUSH AF
LD L,A ; Selectionne la colonne courante
LD L,A
ADD A,&31
PUSH HL
LD HL,STOCKE3
ADD A,(HL)
INC (HL)
INC (HL)
POP HL
LD E,A ; Incremente le compteur de 2 unites
; a chaque colonne suivante
LD H,&C0 ; Reinitialise les pointeurs avant
LD A,(IX+&01)
ADD A,&3F
LD D,A ; de commencer la colonne suivante
LD B,25 ; Nombre de lignes courante
ENCORE6 PUSH BC
LD A,H
LD (STOCKE1),A
LD A,D
LD (STOCKE2),A
LD B,8 ; Nombre de lignes octets comprises dans une ligne courante
TOURNE6 PUSH BC
LD A,(DE)
CALL SYMETRY
LD (HL),A ; Une fois que tout les bits sont inverses c'est fini
LD A,H ; Passe 800 octets plus bas dans la ligne courante
ADD A,8 ; Operation sur DE et HL
LD H,A
LD A,D
SUB A,8
LD D,A
POP BC
DJNZ TOURNE6
LD A,(STOCKE1)
LD H,A
LD A,(STOCKE2)
LD D,A
PUSH DE
LD DE,&0050
ADD HL,DE
POP DE
PUSH HL
LD HL,&0050
DECRE6 DEC HL
DEC DE
LD A,H
OR L
JR NZ,DECRE6
POP HL
POP BC
DJNZ ENCORE6
POP AF
CP &00
JR NZ,TOTO6
RET
TOTO6 DEC A
JR SUITE6
; ---------------------------------------------------------------PROGRAMME AFFI7
AFFI7 XOR A
LD (STOCKE3),A
LD H,(IX+&01)
LD L,(IX+&00)
LD DE,&7FFF
ADD HL,DE
EX DE,HL
LD HL,&C000
LD A,&00 ; Nombre de colonnes dans un ecran standard
SUITE7 PUSH AF
LD L,A ; Selectionne la colonne courante
ADD A,&CF
PUSH HL
LD HL,STOCKE3
SUB A,(HL)
INC (HL)
INC (HL)
POP HL
LD E,A ; Decremente le compteur de 2 unites
; a chaque colonne suivante
LD H,&C0 ; Reinitialise les pointeurs avant
LD A,(IX+&01)
ADD A,&3F
LD D,A ; de commencer la colonne suivante
LD B,25 ; Nombre de lignes courante
ENCORE7 PUSH BC
LD A,H
LD (STOCKE1),A
LD A,D
LD (STOCKE2),A
LD B,8 ; Nombre de lignes octets comprises comprises dans une lignes courante
TOURNE7 PUSH BC
LD A,(DE)
CALL SYMETRY
LD (HL),A ; Une fois que tout les bits sont inverses c'est fini
LD A,H ; Passe 800 octets plus bas dans la ligne courante
ADD A,8 ; Operation sur DE et HL
LD H,A
LD A,D
SUB A,8
LD D,A
POP BC
DJNZ TOURNE7
LD A,(STOCKE1)
LD H,A
LD A,(STOCKE2)
LD D,A
PUSH DE
LD DE,&0050
ADD HL,DE
POP DE
PUSH HL
LD HL,&0050
DECRE7 DEC HL
DEC DE
LD A,H
OR L
JR NZ,DECRE7
POP HL
POP BC
DJNZ ENCORE7
POP AF
CP &4F ; Regarde si la derniere colonne a ete faite
JR NZ,TOTO7
RET
TOTO7 INC A
JR SUITE7
; --------------------------------------------------------PROGRAMME SYMETRIE.MAX
SYMETRY PUSH BC
LD C,&00 ; Initialise C
LD B,&08 ; Repete 8 fois la boucle de tournage
TEST2 BIT 0,A ; Test le bit 0
JR Z,METTRE0
SET 0,C
SUITE1 RLC C ; Decale pour passer au bit suivant
SRL A ; Fait de meme sur l'original
DJNZ TEST2
RRC C ; Remet C en forme
LD A,C
POP BC
RET
METTRE0 RES 0,C
JR SUITE1
; ----------------------------------------------------------LISTE DES ETIQUETTES
ECRIRE EQU &BB5A
INITRSX EQU &BCD1