JMP Debut

Filenum DW 0
Decalx DW 0
Red DB 0
Gre DB 0
Blu DB 0
X DW 0
Y DB 0
Value DB 0
RAMSAVING DB 'output.PPF',00
Fichier DB 'input.Xbl',00
Fichie2 DB 'input.pal',00

Error00 DB 'Fatal Error: Cannot Allocate More Memory...  $'
Error01 DB 'Fatal Error: File Not Found... $'
Error02 DB 'Uknow Disk Error: System Halted... $'
Sprite DB 256 DUP(0)
PPalette DB 0
Palette DB 768 DUP(?)
Header DB 128 Dup(?)


Debut:
 CALL ResetScreen
 MOV AX,3D00h       ;ouverture de fichier             ;-----------+
 MOV DX,OFFSET Fichie2                                           ;|
 INT 21h                                                         ;|
 IF C CALL DiskError

 MOV BX,AX                                                       ;|
 MOV AH,3Fh                                                      ;|
 MOV CX,768                                                      ;|
 MOV DX,OFFSET Palette                                           ;|
 INT 21h                                                         ;|
 IF C CALL DiskError
 MOV AH,3Eh                                                      ;|
 INT 21h                                              ;-----------+
 IF C CALL DiskError

 MOV AX,3D00h     ;ouverture
 MOV DX,OFFSET Fichier
 INT 21h
 IF C CALL DiskError
 MOV X,0
 MOV Y,0
 MOV Filenum,AX
Boucle:
 MOV BX,Filenum
 MOV AH,3Fh
 MOV CX,1
 MOV DX,OFFSET Value
 INT 21h
 IF C CALL DiskError
 MOV AX,X
 ADD AX,Decalx
 MOV BL,Y
 MOV BH,Value
 CALL PutPixel
 INC X
 CMP X,20
 JNZ Boucle
 MOV X,0
 INC Y
 CMP Y,189
 JNZ Boucle
 ADD Decalx,20
 MOV Y,0
 CMP Decalx,320
 JNZ Boucle

 MOV AH,3Eh
 MOV BX,Filenum
 INT 21h
 IF C CALL DiskError
 CALL ShadeColor    ;lit 768 valeurs(256*3) dans le fichier      ;|
 CALL Shadeto                                                    ;|
 Mov Ah,00
 Int 16h

 Mov Ah,3Ch
 Mov Dx,Offset RamSaving
 Mov Cx,0
 Int 21h
 Mov Bx,Ax
 
 Mov Ah,40h
 Mov Cx,768
 Mov Dx,Offset PPalette
 Inc Dx
 Int 21h
 Mov Ah,40h
 Mov Cx,64000
 Mov Dx,0
 Push Ds
 Mov Ds,0A000h
 Int 21h
 Pop Ds
 Mov Ah,3Eh
 Int 21h

 Mov Ah,00
 Int 16h


 
 CALL ShadeColor
 MOV AX,0002h
 INT 10h
INT 20h

SetStartScreen PROC NEAR
Push Ax
Push Cx
Push Dx
Mov Cx,Dx
Mov Dx,3D4h
Mov Al,0Ch
Out Dx,Al
Mov Dx,3D5h
Mov Al,Ch
Out Dx,Al
Mov Dx,3D4h
Mov Al,0Dh
Out Dx,Al
Mov Dx,3D5h
Mov Al,Cl
Out Dx,Al
Pop Dx
Pop Cx
Pop Ax
Ret
SetStartScreen ENDP





ResetScreen PROC NEAR
;=================================
;= Cette proc‚dure d‚finit le mo-=
;= -de VGA 320x200 256 couleurs  =
;= avec affichage par accŠs … la =
;= m‚moire vid‚o.                =
;=================================
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV AX,0013h
     INT 10h
     MOV ES,0A000h
     POP DX
     POP CX
     POP BX
     POP AX
     RET
ResetScreen ENDP

PutPixel PROC NEAR
;=================================
;= Cette routine affiche un pixel=
;= en utilisant la m‚moire vid‚o.=
;= ParamŠtres: (AX,BL),BH        =
;=================================
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV CX,AX
     MOV AH,00
     MOV AL,BL
     MOV DX,320
     MUL DX
     MOV DL,BH
     MOV BX,AX
     ADD BX,CX
     ES MOV B[BX],DL
     POP DX
     POP CX
     POP BX
     POP AX
     RET
PutPixel ENDP

GetPixel PROC NEAR
;=================================
;= Cette fonction lit la couleur =
;= d'un pixel via la mem. vid‚o. =
;= ParamŠtres: (AX,BL)           =
;= sortie: BH=couleur            =
;=================================
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV CX,AX
     MOV AH,00
     MOV AL,BL
     MOV DX,320
     MUL DX
     MOV BX,AX
     ADD BX,CX
     ES MOV BH,B[BX]
     POP DX
     POP CX
     MOV AH,BH
     POP BX
     MOV BH,AH
     POP AX
     RET
GetPixel ENDP

GetPaletteRVB PROC NEAR      
;================================
;= Cette fonction permet de lire=
;= les valeurs d'une couleur de =
;= la palette.                  =
;= ParamŠtre:   AL=Couleur      =
;= Sorties:BH=rouge,BL=vert     =
;=         CH=bleu              =
;================================
      PUSH DX
      PUSH AX
      MOV DX,3C6h
      MOV AL,0FFh
      OUT DX,AL
      POP AX
      PUSH AX
      MOV DX,3C7h
      OUT DX,AL
      MOV DX,3C9h
      IN AL,DX
      MOV BH,AL
      IN AL,DX
      MOV BL,AL
      IN AL,DX
      MOV CH,AL
      POP AX
      POP DX
      RET
GetPaletteRVB ENDP

Shadecolor PROC NEAR
;===============================
;= Cette proc‚dure g‚nŠre un   =
;= d‚grad‚ des couleurs de l'  =
;= ‚cran vers le noir          =
;= Autres proc‚dures:          =
;=   PaletteRVB                =
;=   GetPaletteRVB             =
;===============================
      PUSH AX
      PUSH BX
      PUSH CX
      PUSH DX
      MOV AL,0
      MOV DL,0
Shade:CALL GetpaletteRVB
      CMP BH,0
      IF NZ DEC BH
      CMP BL,0
      IF NZ DEC BL
      CMP CH,0
      IF NZ DEC CH
      CALL PaletteRVB
      INC AL
      CMP AL,255
      JNZ Shade
      INC DL
      CMP DL,63
      JNZ Shade
      POP DX
      POP CX
      POP BX
      POP AX
      RET
ShadeColor ENDP
Shadecolorup PROC NEAR
;===============================
;= Cette proc‚dure g‚nŠre un   =
;= d‚grad‚ des couleurs de l'  =
;= ‚cran vers le blanc         =
;= Autres proc‚dures:          =
;=   PaletteRVB                =
;=   GetPaletteRVB             =
;===============================
      PUSH AX
      PUSH BX
      PUSH CX
      PUSH DX
      MOV AL,0
      MOV DL,0
Shad2:CALL GetpaletteRVB
      CMP BH,63
      IF NZ INC BH
      CMP BL,63
      IF NZ INC BL
      CMP CH,63
      IF NZ INC CH
      CALL PaletteRVB
      INC AL
      CMP AL,255
      JNZ Shad2
      INC DL
      CMP DL,63
      JNZ Shad2
      POP DX
      POP CX
      POP BX
      POP AX
      RET
ShadeColorup ENDP

PaletteRVB PROC NEAR                                  
;================================
;= Cette routine permet d'‚crire= 
;= des valeurs dans la palette  =
;= de couleurs                  =
;= ParamŠtres: AL=couleur       =
;=             BH=rouge         =
;=             BL=vert          =
;=             CH=bleu          =
;================================
      PUSH DX
      PUSH AX
      MOV DX,3C6h
      MOV AL,0FFh
      OUT DX,AL
      POP AX
      PUSH AX
      MOV DX,3C8h
      OUT DX,AL
      MOV DX,3C9h
      MOV AL,BH
      OUT DX,AL
      MOV AL,BL
      OUT DX,AL
      MOV AL,CH
      OUT DX,AL
      POP AX
      POP DX
      RET
PaletteRVB ENDP

GetOLDImage PROC NEAR     
;============================
;= Cette proc‚dure m‚morise =
;= une zone d'‚cran dans une=
;= zone m‚moire d‚ja d‚finie=
;= AX=Position en X         =
;= BL=Position en Y         =
;= DS:DX=zone tampon        =
;============================
     PUSH AX      ;AX=Position courante en X
     PUSH BX      ;BL=position courante en Y
     PUSH CX      ;CX=Position max. en X
     PUSH DX      ;DX=position d‚but en X
     PUSH SI      ;Y=position max en Y
                  ;SI=position dans la m‚moire
     
     MOV SI,DX                      ;Met la zone tampon dans SI 
     MOV CL,[SI]                    ;CL=taille en X
     MOV CH,00
     ADD CX,AX
     INC CX                         ;CX=X maximum
     MOV DL,[SI+1]                  ;Y=taille en Y
     MOV Y,DL
     ADD Y,BL
     INC Y
     MOV DX,AX                      ;Sauve l'abscisse de d‚part dans DX 
     ADD SI,2                       ;pointe sur le d‚but des valeurs
GOI1:CALL GetPixel                  ;lit la couleur du point
     MOV [SI],BH                    ;transfŠre cette valeur dans le tampon
     INC AX                         ;d‚place les pointeurs
     INC SI                         
     CMP AX,CX                      ;fin de ligne?
     JNZ GOI1                       ;KenŠny
     MOV AX,DX                      ;restaure le d‚but de ligne
     INC BL                         ;ligne suivante
     CMP BL,Y                       ;fin de Sprite?
     JNZ GOI1                       ;KenŠny
     POP SI
     POP DX
     POP CX
     POP BX
     POP AX
     RET
GetOldImage ENDP

GetNewImage PROC NEAR
;==============================
;= Cette fonction r‚serve une =
;= zone dans la m‚moire et    =
;= m‚morise une image dans    =
;= cette zone                 =
;= (AX,BL)-(CX,BH)            =
;= DX retourne l'adresse de   =
;= la zone de r‚ception       =
;==============================
     PUSH AX
     PUSH BX
     PUSH CX
     SUB CX,AX    ;CX=Taille en X    
     XCHG CX,AX   ;AX=Taille en X
     SUB BH,BL    ;BH=Taille en Y
     MUL BH       ;AX=TAILLE de l'image
     ADD AX,2     ;AX=Taille de l'image+2 octets repr‚sentants sa taille
     MOV BH,16    ;diviseur=16
     DIV BH       ;AX=Nb de paragraphes(16 bytes) … allouer
     MOV BX,AX    ;BX= "  "     "                 "   "
     MOV AH,48h   ;R‚server une zone de m‚moire
     INT 21h
     CMP BX,0
     IF NZ CALL MemoryError
     MOV DX,AX
     POP CX
     POP BX
     POP AX
     PUSH DX
     PUSH SI 
     MOV SI,DX
     PUSH AX
     PUSH BX
     PUSH CX
     SUB CX,AX    ;CX=Taille en X    
     SUB BH,BL    ;BH=Taille en Y
     MOV [SI],CL  ;‚crit la taille en X
     MOV [SI+1],BH;‚crit la taille en Y
     POP CX
     POP BX
     POP AX
     CALL GetOldImage
     POP SI
     POP DX
     RET
GetNewImage ENDP

PutImage PROC NEAR
;=============================
;= Cette routine affiche une =
;= image stock‚e dans la mem.=
;= Coordonn‚es:  (AX,BL)     =
;= Mode d'affichage: CX      =
;=                  0: PSET  =
;=                  1: AND   =
;=                  2: XOR   =
;= Position de m‚moire:DX    =
;=============================
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    PUSH SI
    MOV SI,DX     ;transfŠre dans SI le pointeur sur l'image
    MOV DL,[SI]   ;DL=Taille en abscisse
    MOV DH,00     ;DH=vide =>DX=Taille en abscisse
    MOV X,DX      ;X=Taille en abscisse
    MOV DL,[SI+1] ;Y=Taille en ordonn‚e
    MOV Y,DL
    ADD X,AX      ;X=Abscisse maximale
    INC X
    ADD Y,BL      ;Y=Ordonn‚e maximale
    INC Y
    MOV DX,AX     ;DX=Abscisse minimale(AX d'origine)
    ADD SI,2      ;Ajuste le pointeur sur le d‚but de l'image
PI0:CALL GetPixel ;Reprend l'ancienne valeur du point … modifier
    CMP CX,1      ;Compare le mode d'affichage
    IF B MOV BH,[SI]   ;Mode PSET:  OUT=MEM
    IF Z AND BH,[SI]   ;Mode AND:   OUT=IN & MEM
    IF A XOR BH,[SI]   ;Mode XOR:   OUT=IN X MEM
    CALL PutPixel
    INC SI
    INC AX
    CMP AX,X
    JNZ PI0
    MOV AX,DX
    INC BL
    CMP BL,Y
    JNZ PI0
    POP SI
    POP DX
    POP CX
    POP BX
    POP AX
    RET
PutImage ENDP

LoadImage PROC NEAR
Loadimage ENDP

MemoryError PROC NEAR
;=================================
;= Provoque l'arrˆt du programme =
;=================================
     MOV AX,0002h
     INT 10h
     MOV DX,OFFSET Error00
     MOV AH,09
     INT 21h
     INT 20h
     RET
MemoryError ENDP

DiskError PROC NEAR
;================================
;= TraŒte la nature de l'erreur =
;= et quitte le programme       =
;================================
      CMP AX,65491
      JNZ AutreErreur
      MOV AX,0002h
      INT 10h
      MOV AH,09h
      MOV DX,OFFSET Error01
      INT 21h
      INT 20h
AutreErreur:
      MOV AX,0002h
      INT 10h
      MOV AH,09h
      MOV DX,OFFSET Error02
      INT 21h
      INT 20h
      RET
DiskError ENDP

ShadeTo PROC NEAR
      PUSH AX
      PUSH BX
      PUSH CX
      PUSH DX
      PUSH SI
      MOV AL,0
      MOV DL,0
      MOV SI,OFFSET Palette
ShaTo:MOV BH,B[SI]
      MOV Red,BH
      MOV BH,B[SI+1]
      MOV Gre,BH
      MOV BH,B[SI+2]
      MOV Blu,BH
      CALL GetPaletteRVB
      CMP BH,Red
      IF NZ INC BH
      CMP BL,Gre
      IF NZ INC BL
      CMP CH,Blu
      IF NZ INC CH
      CALL PaletteRVB
      ADD SI,3
      INC AL
      CMP AL,0
      JNZ Shato
      MOV SI,OFFSET Palette
      INC DL
      CMP DL,63
      JNZ Shato
      POP SI
      POP DX
      POP CX
      POP BX
      POP AX
      RET
ShadeTo ENDP     

      
