 ;
 ;- DEPLACEMENT DE SPRITE EN MODE 0 SUR FOND UNI -
 ;
         ORG 35000
         JP DEBUT
 NOLIST
 ;
 TABLSP  EQU 40000
 NBSP    EQU TABLSP+1
 LASTAD  EQU TABLSP+2
 ADRESS  EQU TABLSP+4
 ;
 XPOS    DW 304
 YPOS    DW 200
 NUMSP   DB 1
 LSP     DB 0
 HSP     DB 0
 ADSP    DW 0
 VISAD   DW 0
 LONGLTA DW 0
 COINBD  DW 0
 ADPROV  DW 0
 OLDADV  DW 0
 DIRJOY  DB 0
 ;
 ;- Initialiser -
 ;
 DEBUT   LD HL,(LASTAD)
         XOR A
 FIXINK  INC A
         LD B,(HL)
         LD C,(HL)
         BIT 7,B
         JR NZ,RECOM
         PUSH AF
         PUSH HL
         CALL #BC32
         POP HL
         INC HL
         POP AF
         JR FIXINK
  ;
  ;- Premier affichage -
  ;
 RECOM   LD HL,#C050   ;Convert est supprime , on initialise VISAD
         LD (VISAD),HL ;avec une adresse ecran queconque .
         CALL FINDSP
         CALL AFFISP   ;1er affichage
  ;
  ;- TEST JOYSTICK -
  ;
 JOY0    LD A,67       ;Plus de premier , arriere , ou moyen plan
         CALL #BB1E    ;donc plus de tests des touches .
         RET NZ
 ;
         CALL #BB24
         AND %00011111
         JR Z,JOY0
         BIT 4,A
         JR Z,NOFIRE
 ;
 ;- Changer de sprite -
 ;
 CHANGE  LD A,(NBSP)
         LD E,A
         LD A,(NUMSP)
         INC A
         CP E
         JR Z,OK
         JR C,OK
         LD A,1
 OK      LD (NUMSP),A
 ;
         LD B,200
 WAIT    CALL FRAME
         DJNZ WAIT
         JP RECOM
 ;
 NOFIRE  LD (DIRJOY),A
         LD HL,(VISAD)
         LD (OLDADV),HL
         RRCA
         PUSH AF
         CALL C,ENHAUT
         POP AF
         RRCA
         PUSH AF
         CALL C,ENBAS
         POP AF
         RRCA
         PUSH AF
         CALL C,AGAUCH
         POP AF
         RRCA
         CALL C,ADROIT
 ;
         CALL AFFISP
         JP JOY0
 ;
 ;- En bas -
 ;
 ENBAS   LD B,4            ;Toutes les routines de transfert vers la TABLE
         LD HL,(COINBD)    ;ont disparu , ca vous soulage non ?
 ;
 B1      LD A,H
         SUB #FF
         JR NZ,OKBAS
         LD A,L
         CP #80
         RET NC
 ;
 OKBAS   CALL ADINF
         DJNZ B1
         LD (COINBD),HL
 ;
         LD HL,(VISAD)
         LD B,4
 B2      CALL ADINF
         DJNZ B2
         LD (VISAD),HL
 ;
         LD HL,(OLDADV) ;Il faut quand meme penser a initialiser ADPROV
         LD (ADPROV),HL
         RET
 ;
 ;- Mouvement en haut -
 ;
 ENHAUT  LD HL,(VISAD)
         LD B,4
 ;
 H1      LD A,H
         SUB #C0
         JR NZ,OKHAUT
         LD A,L
         CP #50
         RET C
 ;
 OKHAUT  CALL ADSUP
         DJNZ H1
         LD (VISAD),HL
 ;
         LD HL,(COINBD)
         LD B,4
 H2      CALL ADSUP
         DJNZ H2
         LD (COINBD),HL
 ;
         INC HL          ;Il faut quand meme penser a initialiser ADPROV
         LD BC,(LONGLTA)
         AND A
         SBC HL,BC
         CALL ADINF
         LD (ADPROV),HL
         RET
 ;
 ;- A DROITE -
 ;
 STOPLAT LD A,(DIRJOY)
         AND %00000011
         LD (DIRJOY),A
         RET
 ;
 ADROIT  LD HL,(COINBD)
         CALL TSTLAT
         CP #4F
         JR Z,STOPLAT
 ;
         INC HL
         LD (COINBD),HL
         LD HL,(VISAD)
         LD (OLDADV),HL
         INC HL
         LD (VISAD),HL
         RET
 ;
 ;- A gauche -
 ;
 AGAUCH  LD HL,(VISAD)
         CALL TSTLAT
         OR A
         JR Z,STOPLAT
 ;
         DEC HL
         LD (VISAD),HL
         LD HL,(COINBD)
         DEC HL
         LD (COINBD),HL
         RET
 ;
 ;- Ici commencent les routines d'affichage , seules sont commentees celles -
 ;- qui n'ont pas ete abordees dans SOS5 -
 ;
 ;- Tester hors ecran -
 ;
 TSTLAT  PUSH HL
         LD A,H
 RESUB   SUB 8
         BIT 6,A
         JR NZ,RESUB
         ADD A,8
 ;
         LD H,A
         AND A
         LD DE,#50
 RESUB1  SBC HL,DE
         BIT 6,H
         JR NZ,RESUB1
         ADD HL,DE
         LD A,L
         POP HL
         RET
 ;
 ;- Affichage sprite a l'ecran -
 ;
 AFFISP  LD BC,(LSP)   ;Plus de BUFFER sprite , on affiche directement
         LD DE,(VISAD)
         LD HL,(ADSP)  ;depuis la table des sprites .
 LIST
         DS 3,0        ;Place pour CALL FRAME
 NOLIST
 ;
         CALL MODI38
 BCLAFI  PUSH DE
         PUSH BC
         LD B,0
         LDIR
         POP BC
 LASUIT  POP DE
         LD A,D
         ADD A,8
         LD D,A
         JR NC,EXITAF
         PUSH HL
         LD HL,#C050
         ADD HL,DE
         EX DE,HL
         POP HL
 EXITAF  DJNZ BCLAFI
 ;
 ;- Afficher les lignes ecran stockees pour recouvrir les traces de -
 ;- l'ancien affichage -
 ;
         LD A,(DIRJOY)
         AND %00000011
         JR Z,TSTCOL
 ;
         LD HL,(ADPROV)
         LD BC,(LONGLTA)
         DEC BC            ;Necessaire pour astuce LDIR
 ;
 AFLINE  LD B,4   ;Toujours 4 lignes
 BCLINE  PUSH HL
 ;
         PUSH HL  ;Astuce pour mettre a 0 une ligne ecran commencant
         POP DE   ;en HL et de longueur BC + 1 (D'ou DEC BC)
         INC DE
         LD (HL),0
         PUSH BC
         LD B,0
         LDIR
 ;
         POP BC
         POP HL
 ;
         LD A,H      ;On travaille directement sur HL
         ADD A,8
         LD H,A
         JR NC,F1
         LD DE,#C050
         ADD HL,DE
 ;
 F1      DJNZ BCLINE
 ;
 ;- Colonne gauche -
 ;
 TSTCOL  LD A,(DIRJOY)
         AND %00001100
         JR Z,EXIT
 ;
         BIT 3,A
         JR NZ,CG
 ;
         LD HL,(VISAD)
         LD DE,(LONGLTA)
         ADD HL,DE
         JR COLON1
 ;
 ;- Colonne droite -
 ;
 CG      LD HL,(OLDADV)
 COLON1  LD A,(HSP)
         LD B,A
 BCLCOL  LD (HL),0      ;On travaille directement sur HL
         LD A,H         ;ou il suffit de mettre un 0 pour effacer la trace
         ADD A,8        ;de la colonne .
         LD H,A
         JR NC,F2
         LD DE,#C050
         ADD HL,DE
 ;
 F2      DJNZ BCLCOL
 ;
 EXIT    XOR A
         LD (DIRJOY),A
         JP RECU38
 ;
 ;- Calcul de l'octet au dessus et en dessous d'un octet ecran -
 ;
 ADINF   LD A,H
         ADD A,8
         LD H,A
         RET NC
         PUSH DE
         LD DE,#C050
         ADD HL,DE
         POP DE
         RET
 ;
 ADSUP   LD A,H
         SUB 8
         LD H,A
         AND %01000000
         RET NZ
         PUSH DE
         LD DE,#3FB0
         ADD HL,DE
         POP DE
         RET
 ;
 LIST
 FRAME   PUSH BC
 NOLIST
         LD B,245
 ATTEND  IN A,(C)
         RRA
         JR NC,ATTEND
         POP BC
         RET
 ;
 ;- Va chercher et range les paramtres du dessin NUMSP -
 ;
 FINDSP  LD A,(NUMSP)
         LD B,A
         LD IY,LASTAD
 INCREM  INC IY
         INC IY
         DJNZ INCREM
         LD L,(IY+0)
         LD H,(IY+1)
 ;
 ;- Passer les parametres -
 ;
 PARAM   INC HL         ;Le INC C pour cas impairs est supprime
         INC HL
         INC HL
         LD B,(HL)
         INC HL
         LD C,(HL)
         LD (LSP),BC
         LD A,C
         LD (LONGLTA),A
         INC HL
         LD (ADSP),HL
 ;
         PUSH BC
         LD B,0
         DEC C
         LD HL,(VISAD)
         ADD HL,BC
         POP BC
         DEC B
 COIN    CALL ADINF        ;Les calculs pour la table sont supprimes
         DJNZ COIN
         LD (COINBD),HL
         RET
 ;
 MODI38  LD A,(#38)
         LD (ADR38),A
         LD A,#C9
 MOD38   LD (#38),A
         RET
  ;
 RECU38  LD A,(ADR38)
         JR MOD38
 ;
 LIST
 ADR38   DB 0