Accueil de Gladir.com Notes légales de Gladir.com Flux RSS des nouvelles du site Gladir.com - Langage de programmation - Assembleur 80x86 - Stationnement de voiture (AVOSRISQUE) Section du logiciel DOS «MonsterBook» Inventaire de la bibliothèque de Gladir.com Entrée administrateur

Voici une petite application ayant pour but d'effectuer la gestion d'un stationnement de voiture.

Le code source Turbo Assembleur de l'application :

  1. ;\Source\Chantal\Samples\Stationn.mnt\AvosRisq.Asm
  2.  
  3. ;+------------------------------------------------------------------------
  4. ;|                                                                       |
  5. ;|                            AVOSRISQUES Inc.                           |
  6. ;|                                                                       |
  7. ;|                Malte Genesis/Samples de gestion de liste              |
  8. ;|                    Édition Chantal/IV - Version 1.1                   |
  9. ;|                             1998/11/30                                |
  10. ;|                                                                       |
  11. ;|         Tous droits réservés par les Chevaliers de Malte (C)          |
  12. ;|                                                                       |
  13. ;+-----------------------------------------------------------------------|
  14. ;
  15. ;
  16. ;Nom des programmeurs
  17. ;====================
  18. ;
  19. ; Sylvain Maltais
  20. ; ...? Bien il y en qu'un!
  21. ;
  22. ;
  23. ;Description
  24. ;===========
  25. ;
  26. ;  Ce fichier  contient  le listing  d'un  fichier  de gestion  de parc de
  27. ; voiture par l'entremise d'une liste symétrique. A titre de démonstration
  28. ; il est limité à la gestion de  7 voitures  dans le parc  et de 3 dans la
  29. ; rue.
  30. ;
  31. ;
  32. ;Remarque
  33. ;========
  34. ;
  35. ; þ Je dédis ce listing  au «MonsterBook»,  alias  l'Oeuvre inhumaine afin
  36. ;   que son honneur soit  laver ainsi  qu'aux  vieux CPU 8088 et 8086 dont
  37. ;   l'arrogance  de certain permet  de les juger  dépasser pour les tâches
  38. ;   classique.
  39.  
  40. .8086
  41. .MODEL TPASCAL
  42.  
  43. Include \Source\Chantal\Library\Compiler\Assemble.ur\Dialect.Inc
  44. Include \Source\Chantal\Library\System\Dos\Constant.Mac
  45. Include \Source\Chantal\Library\Memories\Real\RBufHead.Mac
  46.  
  47. Public AvosRisque
  48.  
  49. errHdl   Equ 0FFh ; Mauvais handle, erreur d'ouverture de fichier
  50.  
  51. ; ------------------- Constantes d'AVOSRISQUES Inc. -------------------
  52. MaximumVoitureParc  Equ 7     ; Nombre maximal de voiture dans le parc
  53. MaximumVoitureRue   Equ 3     ; Nombre maximal de voiture dans la rue
  54.  
  55. ; ------------ Enregistrement utilisée pour AVOSRISQUES Inc. ------------
  56. InfoAuto STRUC
  57.  Marque       DB 26 DUP (?)   ; Marque de la voiture
  58.  Couleur      DB 16 DUP (?)   ; Couleur de la voiture
  59.  Annee        DW ?            ; Année: 19xx
  60.  Immat        DB 16 DUP (?)   ; Immat
  61. ENDS
  62.  
  63. Extrn         MemAlloc:Far
  64. Extrn         Free:Far
  65.  
  66. .DATA
  67.  
  68. String        DB 255 DUP (?)  ; Variable de retour de fonction
  69. NomFichier    DB 82 DUP (?)   ; Nom du fichier par défaut
  70. InfoParc      RBuf ?          ; Contient les données de la liste AVOSRISQUES
  71.                               ; dans le parc
  72. InfoRue       RBuf ?          ; Contient les données de la liste AVOSRISQUES
  73.                               ; dans la rue
  74. TempAuto      InfoAuto ?      ; Enregistrement temporaire d'auto
  75.  
  76. .CODE
  77.  
  78. RawTxtY DW     0,   80,  160,  240,  320,  400,  480,  560,  640,  720,  800,  880 ; 0 à 11
  79.         DW   960, 1040, 1120, 1200, 1280, 1360, 1440, 1520, 1600, 1680, 1760, 1840 ; 12 à 23
  80.         DW  1920, 2000, 2080, 2160, 2240, 2320, 2400, 2480, 2560, 2640, 2720, 2800 ; 24 à 35
  81.         DW  2880, 2960, 3040, 3120, 3200, 3280, 3360, 3440, 3520, 3600, 3680, 3760 ; 36 à 47
  82.         DW  3840, 3920, 4000, 4080, 4160, 4240, 4320, 4400, 4480, 4560, 4640, 4720 ; 48 à 63
  83.  
  84. ; ------------------ Définition utilisé pour le vidéo ------------------
  85. SegVideo DW 0B800h     ; Segment vidéo
  86. MaxYTxts DB 24         ; Position maximale d'affichage vertical
  87. NmYTxts  DB 25         ; Nombre de ligne affichable
  88. NmXTxts  DB 80         ; Nombre de colonne affichable
  89.  
  90. ; ------------------ Message utilisé dans ce programme -----------------
  91. Pres1                 DB 18,"Travail Pratique 4"
  92. Pres2                 DB  8,"fait par"
  93. Pres3                 DB 15,"Sylvain Maltais"
  94. Pres4                 DB 48,"Tous droits réservés par les Gladir.com"
  95. Pres5                 DB 10,"1998/11/06"
  96. Pres6                 DB 11,"Description"
  97. Pres7                 DB 11,"-----------"
  98. Pres8                 DB 56,"Ce programme permet de gérée un stationnement de voiture"
  99. Pres9                 DB 40,"aussi bien dans le parc que dans la rue."
  100. Titre                 DB 38,"PARC DE STATIONNEMENT AVOSRISQUES inc."
  101. Item1                 DB 21,"1. Arrivée d'une auto"
  102. Item2                 DB 20,"2. Départ d'une auto"
  103. Item3                 DB 26,"3. Consultation d'une auto"
  104. Item4                 DB 25,"4. Informations générales"
  105. Item5                 DB 20,"5. Fin de la journée"
  106. StrFull               DB 57,"Chaîne pleine! Arrêtez dans mettre et presser sur «ENTER»"
  107. StrLettreAttendu      DB 46,"Une lettre valide entre 'A' et 'Z' est attendu"
  108. StrChiffreAttendu     DB 46,"Un chiffre valide entre '0' et '9' est attendu"
  109. PresseUneTouche       DB 35,"Presse une touche pour continuer..."
  110. PrendDessin           DB 40,"Répondez par la lettre «O» ou «N» S.V.P.!"
  111. TitreDepartAuto       DB 20,"Départ d'une voiture"
  112. TitreArriveeAuto      DB 18,"Arrivée d'une auto"
  113. TitreConsultationAuto DB 26,"Consultation d'une voiture"
  114. TitreInformation      DB 11,"Information"
  115. SaisieDonnee          DB 16,"Saisie de donnée"
  116. FinJourneeStr         DB 14,"Fin de journée"
  117. QuesPrinc             DB 13,"Votre choix ?"
  118. QuestionMat           DB 36,"Entrez le matricule de la voiture ? "
  119. QuestionMarque        DB 29,"Entrez la marque du véhicule ?"
  120. QuestionCouleur       DB 30,"Entrez la couleur du véhicule ?"
  121. QuestionAnnee         DB 27,"Entrez l'année du véhicule ?"
  122. EntrezNom             DB 25,"Entrez le nom du fichier:"
  123. AutreFichier          DB 46,"Désirez-vous charger un autre fichier (O/N) ? "
  124. QuesNewVoiture        DB 54,"Désirez-vous faire entrer une nouvelle voiture (O/N) ?"
  125. Pres10                DB 45,"Voulez-vous poursuivre le traîtement (O/N) ? "
  126. QuesConsultNewVoiture DB 51,"Désirez-vous consulter une nouvelle voiture (O/N) ?"
  127. QuesDepartNewVoiture  DB 54,"Désirez-vous faire partir une nouvelle voiture (O/N) ?"
  128. SauveMsg              DB 47,"Sauvegarde des voitures du parc dans un fichier"
  129. ParcEtRuePlein        DB 35,"Parc de stationnement et rue plein!"
  130. VoitureExistante      DB 50,"La voiture est déja dans le parc de stationnement!"
  131. VoitureIntrouvable    DB 20,"Voiture introuvable!"
  132. VoitureExistePas      DB 58,"Aucune voiture ne se trouve dans le parc de stationnement!"
  133. ImpossibleCree        DB 31,"Impossible de créer le fichier!"
  134. AnneeInvalid          DB 44,"Année invalide! Dois être entre 1900 et 1999"
  135. ChoixInvalid          DB 45,"Choix invalide! Entrez 1, 2, 3, 4 ou 5 S.V.P."
  136. StrMarque             DB 7, "Marque:"
  137. StrCouleur            DB 8, "Couleur:"
  138. StrAnnee              DB 6, "Année:"
  139. InfoParcUsed          DB 40,"Nombre d'autos stationnées dans le parc:"
  140. InfoParcFree          DB 36,"Nombre de places libre dans le parc:"
  141. InfoRueUsed           DB 37,"Nombre d'autos attendant dans la rue:"
  142. InfoRueFree           DB 39,"Nombre de places de libres dans la rue:"
  143. InfoVoitureParc       DB 45,"Voici la liste de(s) voiture(s) dans le parc:"
  144. EnteteParc1           DB 63,"Marque Couleur Annee Immatriculation"
  145. EnteteParc2           DB 64,"------------------------- --------------- ----- ----------------"
  146. TuteurAnnee           DB "9999"
  147. AccepteTous           DB 'þ'
  148.  
  149. ; ----- Module incluant les routines de gestion de liste symétrique ----
  150. Include \Source\Chantal\Library\Memories\Real\RBuf.Mac
  151.  
  152. ;+--------------------------------------------------------------------
  153. ;|                           Procédure ClrScr                        |
  154. ;+-------------------------------------------------------------------|
  155. ;
  156. ;
  157. ; Description
  158. ; ===========
  159. ;
  160. ;  Cette procédure est utilisé pour effacer l'écran de mode texte.
  161. ;
  162. ;
  163. ; Entrée
  164. ; ======
  165. ;
  166. ;  AH        = Attribut utilisé pour effacer l'écran
  167. ;
  168. ;
  169. ; Sortie
  170. ; ======
  171. ;
  172. ;  Registres détruit AX, CX, DI, ES et les drapeaux
  173.  
  174. ClrScr Proc Near
  175.  PUSH BX
  176.   CLD
  177.   MOV ES,SegVideo
  178.   XOR DI,DI
  179.   MOV BL,NmYTxts
  180.   XOR BH,BH
  181.   SHL BX,1
  182.   MOV CX,Word Ptr RawTxtY[BX]
  183.   MOV AL,' '
  184.   REP STOSW
  185.  POP BX
  186. EndProc
  187.  
  188. ;+----------------------------------------------------------------------
  189. ;|                          Procédure BarTxtHor                        |
  190. ;+---------------------------------------------------------------------|
  191. ;
  192. ;
  193. ; Description
  194. ; ===========
  195. ;
  196. ;  Cette procédure permet de tracer une barre de texte dans une écran en
  197. ; mode texte dans l'intervalle (X1,Y)-(X2,Y).
  198. ;
  199. ;
  200. ; Entrée
  201. ; ======
  202. ;
  203. ;  AL        = Caractère utilisé pour afficher la barre d'écran de texte
  204. ;  AH        = Attribut utilisé pour afficher la barre d'écran de texte
  205. ;  BL        = Coordonnée texte Y
  206. ;  DL        = Coordonnée texte X1
  207. ;  DH        = Coordonnée texte X2
  208. ;
  209. ;
  210. ; Sortie
  211. ; ======
  212. ;
  213. ;  Registres détruit AX, BX, CX, DX, DI, ES et les drapeaux
  214.  
  215. BarTxtHor Proc Near
  216.  XOR BH,BH
  217.  SHL BX,1
  218.  MOV DI,Word Ptr RawTxtY[BX]
  219.  MOV BL,DL
  220.  ADD DI,BX
  221.  SHL DI,1
  222.  MOV ES,SegVideo
  223.  XOR CH,CH
  224.  MOV CL,DH
  225.  SUB CL,DL
  226.  INC CL
  227.  CLD
  228.  REP STOSW
  229. EndProc
  230.  
  231. ;+--------------------------------------------------------------------
  232. ;|                          Procédure _PutTxtXY                      |
  233. ;+-------------------------------------------------------------------|
  234. ;
  235. ;
  236. ; Description
  237. ; ===========
  238. ;
  239. ;  Cette procédure permet l'affichage  d'un message  texte à partir du
  240. ; segment de donnée à un endroit (X,Y) en texte définit respectivement
  241. ; par les registres BH et BL.
  242. ;
  243. ;
  244. ; Entrée
  245. ; ======
  246. ;
  247. ;  BL        = Coordonnée texte Y ( XX??h )
  248. ;  BH        = Coordonnée texte X ( ??YYh )
  249. ;  DS        = Segment utilisé pour l'affichage du message (String Pascal)
  250. ;  SI        = Offset utilisé pour l'affichage du message (String Pascal)
  251. ;  AH        = Attribut (couleur) utilisé pour l'affichage du message
  252. ;
  253. ;
  254. ; Sortie
  255. ; ======
  256. ;
  257. ;  Registres détruit CX, DX, DI, ES et les drapeaux
  258.  
  259. _PutTxtXY Proc Near
  260.  PUSH AX
  261.   PUSH BX
  262.    PUSH SI
  263.     MOV CL,BH
  264.     XOR BH,BH
  265.     SHL BX,1
  266.     MOV DI,Word Ptr RawTxtY[BX] ; DI:=RawTxtY[Y shl 1]
  267.     MOV BL,CL
  268.     ADD DI,BX
  269.     SHL DI,1
  270.     MOV ES,SegVideo
  271.     MOV CL,DS:[SI]
  272.     XOR CH,CH
  273.     JCXZ @2
  274.     INC SI
  275. @1: LODSB
  276.     STOSW
  277.     LOOP @1
  278. @2:
  279.    POP SI
  280.   POP BX
  281.  POP AX
  282. EndProc
  283.  
  284. ;+--------------------------------------------------------------------
  285. ;|                          Procédure PutTxtXY                       |
  286. ;+-------------------------------------------------------------------|
  287. ;
  288. ;
  289. ; Description
  290. ; ===========
  291. ;
  292. ;  Cette procédure permet l'affichage  d'un message  texte à partir du
  293. ; segment de code à un endroit (X,Y)  en texte  définit respectivement
  294. ; par les registres BH et BL.
  295. ;
  296. ;
  297. ; Entrée
  298. ; ======
  299. ;
  300. ;  BL        = Coordonnée texte Y ( XX??h )
  301. ;  BH        = Coordonnée texte X ( ??YYh )
  302. ;  CS        = Segment utilisé pour l'affichage du message (String Pascal)
  303. ;  SI        = Offset utilisé pour l'affichage du message (String Pascal)
  304. ;  AH        = Attribut (couleur) utilisé pour l'affichage du message
  305. ;
  306. ;
  307. ; Sortie
  308. ; ======
  309. ;
  310. ;  Registres détruit CX, DX, DI, ES et les drapeaux
  311.  
  312. PutTxtXY Proc Near
  313.  PUSH DS
  314.   _MOV_DS_CS
  315.   CALL _PutTxtXY
  316.  POP DS
  317. EndProc
  318.  
  319. ;+------------------------------------------------------------------
  320. ;|                         Procédure PutTxtY                       |
  321. ;+-----------------------------------------------------------------|
  322. ;
  323. ;
  324. ; Description
  325. ; ===========
  326. ;
  327. ;  Cette procédure permet l'affichage  d'un message  texte centrer à
  328. ; l'écran à partir du segment de code à une ligne en texte Y définit
  329. ; par le registres BL.
  330. ;
  331. ;
  332. ; Entrée
  333. ; ======
  334. ;
  335. ;  BL        = Coordonnée texte Y
  336. ;  CS        = Segment utilisé pour l'affichage du message (String Pascal)
  337. ;  SI        = Offset utilisé pour l'affichage du message (String Pascal)
  338. ;  AH        = Attribut (couleur) utilisé pour l'affichage du message
  339. ;
  340. ;
  341. ; Sortie
  342. ; ======
  343. ;
  344. ;  Registres détruit BX, CX, DX, DI, ES et les drapeaux
  345.  
  346. PutTxtY Proc Near
  347.  MOV BH,NmXTxts
  348.  SUB BH,CS:[SI]
  349.  SHR BH,1
  350.  CALL PutTxtXY
  351. EndProc
  352.  
  353. ;+------------------------------------------------------------------
  354. ;|                         Procédure SetChr                        |
  355. ;+-----------------------------------------------------------------|
  356. ;
  357. ;
  358. ; Description
  359. ; ===========
  360. ;
  361. ;  Cette procédure permet l'affichage d'un caractère à la position
  362. ; texte (X,Y) définit respectivement par les registres DL et DH.
  363. ;
  364. ;
  365. ; Entrée
  366. ; ======
  367. ;
  368. ;  DL        = Coordonnée texte X
  369. ;  DH        = Coordonnée texte Y
  370. ;  AL        = Code du caractère à afficher
  371. ;
  372. ;
  373. ; Sortie
  374. ; ======
  375. ;
  376. ;  Registres drapeaux détruit
  377.  
  378. SetChr Proc Near ; (DL,DH) AL=Char
  379.  PUSH BX
  380.   PUSH DI
  381.    PUSH ES
  382.     MOV BL,DH
  383.     XOR BH,BH
  384.     SHL BX,1
  385.     MOV DI,Word Ptr RawTxtY[BX]
  386.     MOV BL,DL
  387.     ADD DI,BX
  388.     SHL DI,1
  389.     MOV ES,SegVideo
  390.     STOSB
  391.    POP ES
  392.   POP DI
  393.  POP BX
  394. EndProc
  395.  
  396. ;+------------------------------------------------------------------
  397. ;|                        Procédure SetCurPos                      |
  398. ;+-----------------------------------------------------------------|
  399. ;
  400. ;
  401. ; Description
  402. ; ===========
  403. ;
  404. ;  Cette procédure permet de fixer la coordonnée d'écran de texte du
  405. ; curseur clignotant à la position (X,Y)  définit respectivement par
  406. ; les registres DL et DH.
  407. ;
  408. ;
  409. ; Entrée
  410. ; ======
  411. ;
  412. ;  DL        = Coordonnée texte X
  413. ;  DH        = Coordonnée texte Y
  414. ;
  415. ;
  416. ; Sortie
  417. ; ======
  418. ;
  419. ; Registre détruit AX, BX, CX, DX, SI, DI et les registres de drapeaux
  420.  
  421. SetCurPos Proc Near ; (DL,DH)
  422.  MOV AH,02h
  423.  XOR BX,BX
  424.  INT 010h
  425.  RET
  426. endp
  427.  
  428. ;+-----------------------------------------------------------------
  429. ;|                        Fonction OpenFile                       |
  430. ;+----------------------------------------------------------------|
  431. ;
  432. ;
  433. ; Description
  434. ; ===========
  435. ;
  436. ;  Cette fonction permet d'ouvrir un fichier de type Handle avec le
  437. ; mode spécifiée par le registre BL (lecture, écriture ou combiné).
  438. ;
  439. ;
  440. ; Entrée
  441. ; ======
  442. ;
  443. ;  DS        = Segment du nom du fichier (Format String Pascal)
  444. ;  DI        = Offset du nom de fichier (Format String Pascal)
  445. ;  BL        = Mode d'accès (lecture=0, écriture=1 ou combiné=2).
  446. ;
  447. ;
  448. ; Retour
  449. ; ======
  450. ;
  451. ;  AL        = Handle alloué
  452. ;            = FFh (errHdl) si une erreur s'est produit
  453.  
  454. OpenFile Proc Near
  455.  MOV AX,3D40h
  456.  OR  AL,BL
  457.  MOV BL,DS:[DI]
  458.  XOR BH,BH
  459.  INC BX
  460.  MOV DS:[DI+BX],BH
  461.  MOV DX,DI
  462.  INC DX
  463.  INT 21h
  464.  JNC @OF2
  465.  MOV AL,errHdl
  466. @OF2:
  467. EndProc
  468.  
  469. ;+-----------------------------------------------------------------
  470. ;|                         Fonction DelFile                       |
  471. ;+----------------------------------------------------------------|
  472. ;
  473. ;
  474. ; Description
  475. ; ===========
  476. ;
  477. ;  Cette fonction permet d'effacer un fichier par l'entremise de la
  478. ; technique des Handle du système d'exploitation DOS.
  479. ;
  480. ;
  481. ; Entrée
  482. ; ======
  483. ;
  484. ;  DS        = Segment du nom du fichier (Format String Pascal)
  485. ;  DI        = Offset du nom de fichier (Format String Pascal)
  486. ;
  487. ;
  488. ; Retour
  489. ; ======
  490. ;
  491. ;  AX       = 0 tous va bien
  492. ;          <> 0 une erreur s'est produit
  493.  
  494. DelFile Proc Near
  495.  MOV BL,DS:[DI]
  496.  INC DI
  497.  MOV BH,0
  498.  MOV DS:[DI+BX],BH
  499.  MOV DX,DI
  500.  MOV AX,04100h
  501.  INT 021h
  502.  JC  @DF2
  503.  XOR AX,AX
  504. @DF2:
  505.  DEC DI
  506. EndProc
  507.  
  508. ;+----------------------------------------------------------------
  509. ;|                        Fonction NewFile                       |
  510. ;+---------------------------------------------------------------|
  511. ;
  512. ;
  513. ; Description
  514. ; ===========
  515. ;
  516. ;  Cette fonction permet de créer un fichier par l'entremise de la
  517. ; technique des Handle du système d'exploitation DOS.
  518. ;
  519. ;
  520. ; Entrée
  521. ; ======
  522. ;
  523. ;  DS        = Segment du nom du fichier (Format String Pascal)
  524. ;  DI        = Offset du nom de fichier (Format String Pascal)
  525. ;
  526. ;
  527. ; Retour
  528. ; ======
  529. ;
  530. ;  AL       = Handle
  531. ;           = FFh (errHdl) s'est qu'une erreur de création s'est produite
  532.  
  533. NewFile Proc Near
  534.  MOV BL,DS:[DI]
  535.  XOR BH,BH
  536.  INC BX
  537.  MOV DS:[DI+BX],BH
  538.  MOV DX,DI
  539.  INC DX
  540.  XOR CX,CX
  541.  MOV AH,03Ch
  542.  INT 021h
  543.  JNC @NF2
  544.  MOV AL,errHdl
  545. @NF2:
  546. EndProc
  547.  
  548. ;+-----------------------------------------------------------------
  549. ;|                         Fonction FileSize                      |
  550. ;+----------------------------------------------------------------|
  551. ;
  552. ;
  553. ; Description
  554. ; ===========
  555. ;
  556. ;  Cette fonction permet de connaître la taille d'un fichier ouvert
  557. ; par  l'entremise  de  la   technique  des  «Handles» du   système
  558. ; d'exploitation DOS.
  559. ;
  560. ;
  561. ; Entrée
  562. ; ======
  563. ;
  564. ;  BL       = Handle
  565. ;
  566. ;
  567. ; Retour
  568. ; ======
  569. ;
  570. ;  DX:AX    = Taille du fichier en 32 bits
  571.  
  572. FileSize Proc Near
  573.  CMP BL,errHdl
  574.  JE  @FS1
  575.  XOR BH,BH
  576.  MOV AX,04202h
  577.  XOR CX,CX
  578.  XOR DX,DX
  579.  INT 021h
  580.  JNC @FS1
  581.  MOV AX,0FFFFh
  582.  MOV DX,AX
  583. @FS1:
  584. EndProc
  585.  
  586. ;+-------------------------------------------------------------------
  587. ;|                         Procédure Rewind                         |
  588. ;+------------------------------------------------------------------|
  589. ;
  590. ;
  591. ; Description
  592. ; ===========
  593. ;
  594. ;  Cette procédure permet de place le pointeur fichier de type Handle
  595. ; au début du dit fichier spécifier par le Handle.
  596. ;
  597. ;
  598. ; Entrée
  599. ; ======
  600. ;
  601. ;  BL       = Handle
  602. ;
  603. ;
  604. ; Sortie
  605. ; ======
  606. ;
  607. ;  Registre détruit AX, BX, DX, SI, DI, ES
  608.  
  609. Rewind Proc Near
  610.  PUSH CX
  611.   MOV AX,4200h
  612.   XOR BH,BH
  613.   CMP BL,errHdl
  614.   JE  @FinRewind
  615.   XOR DX,DX
  616.   XOR CX,CX
  617.   INT 21h
  618.   JC  @ErrRewind
  619.   XOR AX,AX
  620. @ErrRewind:
  621. @FinRewind:
  622.  POP CX
  623. EndProc
  624.  
  625. ;+-------------------------------------------------------------------
  626. ;|                         Procédure _GetRec                        |
  627. ;+------------------------------------------------------------------|
  628. ;
  629. ;
  630. ; Description
  631. ; ===========
  632. ;
  633. ;  Cette procédure permet de lire un enregistrement dans un fichier de
  634. ; type Handle à la position courante.
  635. ;
  636. ;
  637. ; Entrée
  638. ; ======
  639. ;
  640. ;  BL       = Handle
  641. ;  CX       = Taille de l'enregistrement
  642. ;  ES       = Segment de l'enregistrement
  643. ;  DI       = Offset de l'enregistrement
  644. ;
  645. ;
  646. ; Sortie
  647. ; ======
  648. ;
  649. ;  Registre détruit AX, BX, DX, SI, DI, ES
  650.  
  651. _GetRec Proc Near
  652.  PUSH CX
  653.   CLD
  654.   XOR AX,AX
  655.   PUSH CX
  656.    MOV DX,DI
  657.    SHR CX,1
  658.    REP STOSW
  659.    ADC CX,CX
  660.    REP STOSB
  661.   POP CX
  662.   MOV AX,3F00h
  663.   XOR BH,BH
  664.   CMP BL,errHdl
  665.   JE  @1GR
  666.   PUSH DS
  667.    _MOV_DS_ES
  668.    INT 021h
  669.   POP DS
  670.   JNC @1GR
  671.   XOR AX,AX
  672. @1GR:
  673.  POP CX
  674. EndProc
  675.  
  676. ;+---------------------------------------------------------------------
  677. ;|                           Procédure _SetRec                        |
  678. ;+--------------------------------------------------------------------|
  679. ;
  680. ;
  681. ; Description
  682. ; ===========
  683. ;
  684. ;  Cette procédure permet d'écrire un enregistrement dans un fichier de
  685. ; type Handle à la position courante.
  686. ;
  687. ;
  688. ; Entrée
  689. ; ======
  690. ;
  691. ;  BL       = Handle
  692. ;  CX       = Taille de l'enregistrement
  693. ;  DS       = Segment de l'enregistrement
  694. ;  SI       = Offset de l'enregistrement
  695. ;
  696. ;
  697. ; Sortie
  698. ; ======
  699. ;
  700. ;  Registre détruit AX, BX, DX, SI, DI, ES
  701.  
  702. _SetRec Proc Near
  703.  PUSH ES
  704.   PUSH DI
  705.    PUSH BX
  706.     MOV BL,Handle
  707.     XOR BH,BH
  708.     CMP BL,errHdl
  709.     JE  @ErrSetRec
  710.     MOV DX,SI
  711.     MOV AX,04000h
  712.     INT 021h
  713. @ErrSetRec:
  714.     JC @FinSetRec
  715.     XOR AX,AX
  716. @FinSetRec:
  717.    POP BX
  718.   POP DI
  719.  POP ES
  720. EndProc
  721.  
  722. ;+----------------------------------------------------------------------
  723. ;|                           Procédure CloseFile                       |
  724. ;+---------------------------------------------------------------------|
  725. ;
  726. ;
  727. ; Description
  728. ; ===========
  729. ;
  730. ;  Cette procédure permet de fermer un fichier de type Handle du système
  731. ; d'exploitation DOS.
  732. ;
  733. ;
  734. ; Entrée
  735. ; ======
  736. ;
  737. ;  BL       = Handle
  738. ;
  739. ;
  740. ; Sortie
  741. ; ======
  742. ;
  743. ;  Registre détruit AX, BX, CX, DX, SI, DI, ES
  744.  
  745. CloseFile Proc Near
  746.  MOV AX,03E00h
  747.  XOR BH,BH
  748.  INT 021h
  749. EndProc
  750.  
  751. ;+----------------------------------------------------------------------
  752. ;|                            Fonction ReadKey                         |
  753. ;+---------------------------------------------------------------------|
  754. ;
  755. ;
  756. ; Description
  757. ; ===========
  758. ;
  759. ;  Cette fonction permet de lire le dernier caractère avec son scan code
  760. ; enfoncé  au clavier.  Si aucun caractère  n'attend dans le tampon,  il
  761. ; attend après l'utilisateur afin de retourner l'action de l'utilisateur.
  762. ;
  763. ;
  764. ; Entrée
  765. ; ======
  766. ;
  767. ;  Aucun
  768. ;
  769. ;
  770. ; Sortie
  771. ; ======
  772. ;
  773. ;  Registre détruit BX, CX, DX, SI, DI, ES
  774. ;
  775. ;
  776. ; Retour
  777. ; ======
  778. ;
  779. ;  AL       = Code de caractère
  780. ;  AH       = Scan Code
  781.  
  782. ReadKey Proc Near
  783.  XOR AX,AX
  784.  INT 16h
  785. EndProc
  786.  
  787. ;+----------------------------------------------------------------------
  788. ;|                           Procédure ErrMsg                          |
  789. ;+---------------------------------------------------------------------|
  790. ;
  791. ;
  792. ; Description
  793. ; ===========
  794. ;
  795. ;  Cette procédure permet d'afficher un message d'erreur sur la dernière
  796. ; ligne de couleur rouge.
  797. ;
  798. ;
  799. ; Entrée
  800. ; ======
  801. ;
  802. ;  DS       = Segment du message d'erreur (Format String Pascal)
  803. ;  SI       = Offset du message d'erreur (Format String Pascal)
  804.  
  805. ErrMsg Proc Near
  806.  MOV BL,MaxYTxts
  807.  MOV DX,0+(79 shl 8)
  808.  MOV AX,04F20h
  809.  CALL BarTxtHor
  810.  MOV AH,4Eh
  811.  MOV BX,(2 shl 8)+24
  812.  CALL PutTxtXY
  813. EndProc
  814.  
  815. ;+-------------------------------------------------------------------
  816. ;|                            Procédure Msg                         |
  817. ;+------------------------------------------------------------------|
  818. ;
  819. ;
  820. ; Description
  821. ; ===========
  822. ;
  823. ;  Cette procédure permet d'afficher un message sur la ligne réservée
  824. ; au message utilisateur.
  825. ;
  826. ;
  827. ; Entrée
  828. ; ======
  829. ;
  830. ;  DS       = Segment du message (Format String Pascal)
  831. ;  SI       = Offset du message (Format String Pascal)
  832.  
  833. Msg Proc Near
  834.  MOV BL,MaxYTxts
  835.  DEC BL
  836.  MOV DX,0+(79 shl 8)
  837.  MOV AX,02F20h
  838.  CALL BarTxtHor
  839.  MOV AH,2Eh
  840.  MOV BX,(2 shl 8)+24-1
  841.  CALL PutTxtXY
  842.  MOV DH,MaxYTxts
  843.  DEC DH
  844.  MOV DL,2
  845.  ADD DL,CS:[SI]
  846.  CALL SetCurPos
  847. EndProc
  848.  
  849. ;+-----------------------------------------------------------------
  850. ;|                     Procédure CLireChaine                      |
  851. ;+----------------------------------------------------------------|
  852. ;
  853. ;
  854. ; Description
  855. ; ===========
  856. ;
  857. ;  Cette procédure permet  d'interroger l'utilisateur  en acceptant
  858. ; n'importe quel caractère mettant le contenu de sa réponse dans le
  859. ; segment de code.
  860. ;
  861. ;
  862. ; Entrée
  863. ; ======
  864. ;
  865. ;  CS       = Segment du message de l'usager (Format String Pascal)
  866. ;  SI       = Offset du message de l'usager (Format String Pascal)
  867. ;  CL       = Longueur maximal de la chaîne entrable par l'utilisateur
  868. ;  DL       = Position X de départ
  869. ;  DH       = Position Y de départ
  870.  
  871. CLireChaine Proc Near
  872.  MOV DI,Offset AccepteTous
  873. endp
  874.  
  875. ;+-----------------------------------------------------------------
  876. ;|                     Procédure CLireChaine                      |
  877. ;+----------------------------------------------------------------|
  878. ;
  879. ;
  880. ; Description
  881. ; ===========
  882. ;
  883. ;  Cette procédure permet  d'interroger l'utilisateur  en acceptant
  884. ; que  les caractères  conforme au tuteur  mettant le contenu de sa
  885. ; réponse dans le segment de code.
  886. ;
  887. ;
  888. ; Entrée
  889. ; ======
  890. ;
  891. ;* CS       = Segment du message de l'usager (Format String Pascal)
  892. ;  SI       = Offset du message de l'usager (Format String Pascal)
  893. ;* CS       = Segment du tuteur
  894. ;  DI       = Offset du tuteur
  895. ;  CL       = Longueur maximal de la chaîne entrable par l'utilisateur
  896. ;  DL       = Position X de départ
  897. ;  DH       = Position Y de départ
  898.  
  899. _CLireChaine Proc Near
  900.  PUSH DS
  901.   _MOV_DS_CS
  902.   CALL _LireChaine
  903.  POP DS
  904. EndProc
  905.  
  906. ;+-----------------------------------------------------------------
  907. ;|                      Procédure LireChaine                      |
  908. ;+----------------------------------------------------------------|
  909. ;
  910. ;
  911. ; Description
  912. ; ===========
  913. ;
  914. ;  Cette procédure permet  d'interroger l'utilisateur  en acceptant
  915. ; n'importe quel caractère mettant le contenu de sa réponse dans le
  916. ; segment de donnée.
  917. ;
  918. ;
  919. ; Entrée
  920. ; ======
  921. ;
  922. ;  DS       = Segment du message de l'usager (Format String Pascal)
  923. ;  SI       = Offset du message de l'usager (Format String Pascal)
  924. ;  CL       = Longueur maximal de la chaîne entrable par l'utilisateur
  925. ;  DL       = Position X de départ
  926. ;  DH       = Position Y de départ
  927.  
  928. LireChaine Proc Near
  929.  MOV DI,Offset AccepteTous
  930. endp
  931.  
  932. ;+-----------------------------------------------------------------
  933. ;|                     Procédure _LireChaine                      |
  934. ;+----------------------------------------------------------------|
  935. ;
  936. ;
  937. ; Description
  938. ; ===========
  939. ;
  940. ;  Cette procédure permet  d'interroger l'utilisateur  en acceptant
  941. ; que  les caractères  conforme au tuteur  mettant le contenu de sa
  942. ; réponse dans le segment de donnée.
  943. ;
  944. ;
  945. ; Entrée
  946. ; ======
  947. ;
  948. ;  DS       = Segment du message de l'usager (Format String Pascal)
  949. ;  SI       = Offset du message de l'usager (Format String Pascal)
  950. ;  CS       = Segment du tuteur
  951. ;  DI       = Offset du tuteur
  952. ;  CL       = Longueur maximal de la chaîne entrable par l'utilisateur
  953. ;  DL       = Position X de départ
  954. ;  DH       = Position Y de départ
  955.  
  956. _LireChaine Proc Near
  957. Local OldPos:Word,Buffer:Word,Max:Byte,Tuteur:Word
  958.  MOV Buffer,SI
  959.  MOV Tuteur,DI
  960.  DEC CL
  961.  MOV Max,CL
  962.  MOV Byte Ptr DS:[SI],0   ; Initialise le tampon
  963.  MOV OldPos,DX
  964.  DEC DL
  965.  PUSH DX
  966.   MOV BL,DH
  967.   MOV DH,DL
  968.   ADD DH,Max
  969.   MOV AX,07F20h
  970.   CALL BarTxtHor
  971.  POP DX
  972. ReLire:
  973.  CALL SetCurPos
  974.  CALL ReadKey
  975.  CMP  AL,13
  976.  JE   FinLecture
  977.  CMP  AL,8
  978.  JE   BackCaract
  979.  CMP  AL,' '
  980.  JB   Relire
  981.  JMP  InsereCaract
  982. BackCaract:
  983.  MOV BX,Buffer
  984.  CMP Byte Ptr DS:[BX],0
  985.  JE  Relire
  986.  DEC Byte Ptr DS:[BX]
  987.  MOV DX,OldPos
  988.  ADD DL,DS:[BX]
  989.  DEC DL
  990.  MOV AL,' '
  991.  CALL SetChr
  992.  JMP ReLire
  993. FinLecture:
  994.  MOV SI,Buffer
  995.  RET
  996. InsereCaract:
  997.  MOV DI,Tuteur
  998.  MOV DX,OldPos
  999.  MOV BX,Buffer
  1000.  MOV CL,DS:[BX]
  1001.  CMP CL,Max
  1002.  JA  ChainePleine
  1003.  CMP Byte Ptr CS:[DI],'þ'
  1004.  JE  Tous
  1005.  XCHG DI,AX
  1006.  ADD AL,DS:[BX]
  1007.  ADC AH,0
  1008.  XCHG DI,AX
  1009.  CMP Byte Ptr CS:[DI],'A'
  1010.  JE  TestLettre
  1011.  CMP Byte Ptr CS:[DI],'9'
  1012.  JE  TestChiffre
  1013.  JMP Tous
  1014. TestChiffre:
  1015.  CMP AL,'0'
  1016.  JB  ChiffreAttendu
  1017.  CMP AL,'9'
  1018.  JA  ChiffreAttendu
  1019.  JMP Tous
  1020. TestLettre:
  1021.  AND AL,NOT 020h
  1022.  CMP AL,'A'
  1023.  JB  LettreAttendu
  1024.  CMP AL,'Z'
  1025.  JA  LettreAttendu
  1026. Tous:
  1027.  ADD DL,DS:[BX]
  1028.  INC Byte Ptr DS:[BX]
  1029.  ADD BL,DS:[BX]
  1030.  ADC BH,0
  1031.  MOV DS:[BX],AL
  1032.  PUSH DX
  1033.   DEC DL
  1034.   CALL SetChr
  1035.  POP DX
  1036.  JMP ReLire
  1037. ChiffreAttendu:
  1038.  MOV SI,Offset StrChiffreAttendu
  1039.  JMP @LEM
  1040. LettreAttendu:
  1041.  MOV SI,Offset StrLettreAttendu
  1042.  JMP @LEM
  1043. ChainePleine:
  1044.  MOV SI,Offset StrFull
  1045. @LEM:
  1046.  CALL ErrMsg
  1047. ResetLire:
  1048.  MOV DX,OldPos
  1049.  DEC DL
  1050.  MOV BX,Buffer
  1051.  ADD DL,DS:[BX]
  1052.  JMP Relire
  1053. endp
  1054.  
  1055. ;+----------------------------------------------------------
  1056. ;|                     Procédure InitTitre                 |
  1057. ;+---------------------------------------------------------|
  1058. ;
  1059. ;
  1060. ; Description
  1061. ; ===========
  1062. ;
  1063. ;  Cette procédure initialise l'écran comme avec «ClrScr» et
  1064. ; affiche un titre à la ligne spécifier par le registre BL.
  1065. ;
  1066. ;
  1067. ; Entrée
  1068. ; ======
  1069. ;
  1070. ;  BL       = Position vertical du titre
  1071. ;  CS       = Segment du Titre
  1072. ;  SI       = Offset du Titre
  1073.  
  1074. InitTitre Proc Near
  1075.  MOV AH,017h
  1076.  CALL ClrScr
  1077.  PUSH AX
  1078.   MOV AX,0720h
  1079.   MOV DX,0+(79 shl 8)
  1080.   MOV BL,24
  1081.   CALL BarTxtHor
  1082.  POP AX
  1083.  MOV AH,01Eh
  1084.  CALL PutTxtY
  1085. EndProc
  1086.  
  1087. ;+-----------------------------------------------------------------
  1088. ;|                     Procédure RBGetCurrAuto                    |
  1089. ;+----------------------------------------------------------------|
  1090. ;
  1091. ;
  1092. ; Propriétaire: RBuf
  1093. ;
  1094. ;
  1095. ; Description
  1096. ; ===========
  1097. ;
  1098. ;  Cette procédure permet de charger dans le segment de donnée
  1099. ; la voiture courante d'une liste symétrique.
  1100. ;
  1101. ;
  1102. ; Entrée
  1103. ; ======
  1104. ;
  1105. ;  ES:DI    = Adresse de la structure «RBuf»
  1106.  
  1107. RBGetCurrAuto Proc Near
  1108.  PUSH DS
  1109.   PUSH ES
  1110.    PUSH DI
  1111.     CALL RBGetCurrBuf
  1112.     CMP CX,TYPE InfoAuto
  1113.     JNE @CorruptionMemoire
  1114.     _MOV_ES_DS
  1115.     MOV DI,Offset TempAuto
  1116.     MOV DS,DX
  1117.     XCHG SI,AX
  1118.     CLD
  1119.     REP MOVSB
  1120. @CorruptionMemoire:
  1121.    POP DI
  1122.   POP ES
  1123.  POP DS
  1124. EndProc
  1125.  
  1126. ;+-------------------------------------------------------------------
  1127. ;|                          Fonction ICompare                       |
  1128. ;+------------------------------------------------------------------|
  1129. ;
  1130. ;
  1131. ; Description
  1132. ; ===========
  1133. ;
  1134. ;  Cette fonction compare deux chaînes de caractères en ne tenant pas
  1135. ; compte des majuscules/minuscules et indique si elles sont identique
  1136. ; (1) ou différente (0).
  1137. ;
  1138. ;
  1139. ; Entrée
  1140. ; ======
  1141. ;
  1142. ;  DS:SI    = Source
  1143. ;  ES:DI    = Destination
  1144. ;  CX       = Longueur
  1145. ;
  1146. ;
  1147. ; Sortie
  1148. ; ======
  1149. ;
  1150. ;  Registre détruit AX, BX, CX, DX et les registres drapeaux
  1151. ;
  1152. ;
  1153. ; Retour
  1154. ; ======
  1155. ;
  1156. ;  AX       = 0 pour des chaînes de caractères différente
  1157. ;           = 1 pour des chaînes de caractères identique
  1158.  
  1159. ICompare Proc Near
  1160.  PUSH SI
  1161.   PUSH DI
  1162.    JCXZ @@97
  1163.    CLD
  1164. @@99:
  1165.    CMPSB
  1166.    JNE @@98
  1167.    LOOP @@99
  1168.    JMP @@100
  1169. @@98:
  1170.    DEC SI
  1171.    LODSB
  1172.    MOV AH,ES:[DI-1]
  1173.    OR  AX,2020h
  1174.    CMP AH,'a'
  1175.    JB  @@97
  1176.    CMP AH,'z'
  1177.    JA  @@97
  1178.    CMP AL,'a'
  1179.    JB  @@97
  1180.    CMP AL,'z'
  1181.    JA  @@97
  1182.    SUB AL,AH
  1183.    OR  AL,AL
  1184.    JNZ @@97
  1185.    LOOP @@99
  1186.    JMP @@0
  1187. @@100:
  1188.    JZ  @@0
  1189. @@97:
  1190.    MOV CL,1
  1191. @@0:
  1192.    XCHG AX,CX
  1193.    XOR AL,1
  1194.    MOV AH,0
  1195.   POP DI
  1196.  POP SI
  1197. EndProc
  1198.  
  1199. ;+------------------------------------------------------------------
  1200. ;|                        Fonction RBSearchAuto                    |
  1201. ;+-----------------------------------------------------------------|
  1202. ;
  1203. ;
  1204. ; Description
  1205. ; ===========
  1206. ;
  1207. ;  Cette  fonction  recherche  dans  une liste symétrique  de format
  1208. ; «RBuf» l'immatriculation de la voiture spécifiée par les registres
  1209. ; d'adressages DS:SI.
  1210. ;
  1211. ;
  1212. ; Entrée
  1213. ; ======
  1214. ;
  1215. ;  DS:SI    = Adresse de l'immatriculation
  1216. ;  ES:DI    = Adresse de la structure «RBuf»
  1217. ;
  1218. ;
  1219. ; Sortie
  1220. ; ======
  1221. ;
  1222. ;  Registre détruit AX, BX, CX, DX, SI et DI et les registres drapeaux
  1223. ;
  1224. ;
  1225. ; Retour
  1226. ; ======
  1227. ;
  1228. ;  AX       = 0 voiture introuvable
  1229. ;           > 0 position dans la liste
  1230.  
  1231. RBSearchAuto Proc Near
  1232.  XOR AX,AX
  1233.  MOV CX,ES:[DI].RBuf.NB
  1234.  JCXZ @FinSearch
  1235.  CALL RBSetPtrHome
  1236. @Next:
  1237.  PUSH CX
  1238.   PUSH ES
  1239.    PUSH DI
  1240.     CALL RBGetCurrBuf
  1241.     XCHG DI,AX
  1242.     ADD DI,Offset InfoAuto.Immat
  1243.     MOV ES,DX
  1244.     MOV CL,ES:[DI]
  1245.     XOR CH,CH
  1246.     XOR AX,AX
  1247.     CMP CL,DS:[SI]
  1248.     JNE @SkipCompare
  1249.     INC CX
  1250.     CALL ICompare
  1251. @SkipCompare:
  1252.    POP DI
  1253.   POP ES
  1254.   OR AX,AX
  1255.   JNZ @FinTrouve
  1256.   CALL RBNext
  1257.  POP CX
  1258.  LOOP @Next
  1259.  XOR AX,AX
  1260.  JMP @FinSearch
  1261. @FinTrouve:
  1262.  POP AX
  1263. @FinSearch:
  1264. EndProc
  1265.  
  1266. ;+------------------------------------------------------------------
  1267. ;|                          Fonction Menu                          |
  1268. ;+-----------------------------------------------------------------|
  1269. ;
  1270. ;
  1271. ; Description
  1272. ; ===========
  1273. ;
  1274. ;  Cette  procédure  affiche  un  menu  avec 5  options  et permet à
  1275. ; l'utilisateur de choisir un des options. Il retourne ensuite comme
  1276. ; valeur de retour cette option sous forme de lettre '1' à '5'.
  1277. ;
  1278. ;
  1279. ; Entrée
  1280. ; ======
  1281. ;
  1282. ;  DS:SI    = Adresse de l'immatriculation
  1283. ;  ES:DI    = Adresse de la structure «RBuf»
  1284. ;
  1285. ;
  1286. ; Sortie
  1287. ; ======
  1288. ;
  1289. ;  Registre détruit AX, BX, CX, DX, SI et DI et les registres drapeaux
  1290. ;
  1291. ;
  1292. ; Retour
  1293. ; ======
  1294. ;
  1295. ;  AL       = Caractère correspondant à l'option
  1296.  
  1297. Menu Proc Near
  1298.  MOV SI,Offset Titre
  1299.  MOV BL,0
  1300.  CALL InitTitre
  1301.  MOV SI,Offset Item1
  1302.  MOV BX,(5 shl 8)+5
  1303.  MOV AH,01Bh
  1304.  CALL PutTxtXY
  1305.  MOV SI,Offset Item2
  1306.  INC BX
  1307.  INC BX
  1308.  CALL PutTxtXY
  1309.  MOV SI,Offset Item3
  1310.  INC BX
  1311.  INC BX
  1312.  CALL PutTxtXY
  1313.  MOV SI,Offset Item4
  1314.  INC BX
  1315.  INC BX
  1316.  CALL PutTxtXY
  1317.  MOV SI,Offset Item5
  1318.  INC BX
  1319.  INC BX
  1320.  CALL PutTxtXY
  1321.  MOV SI,Offset QuesPrinc
  1322.  MOV BX,17
  1323.  MOV AH,01Fh
  1324.  CALL PutTxtXY
  1325. @MenuRestart:
  1326.  MOV DX,(17 shl 8)+15
  1327.  CALL SetCurPos
  1328.  CALL ReadKey
  1329.  CMP AL,'1'
  1330.  JB  @MenuErr
  1331.  CMP AL,'5'
  1332.  JA  @MenuErr
  1333.  RET
  1334. @MenuErr:
  1335.  MOV SI,Offset ChoixInvalid
  1336.  CALL ErrMsg
  1337.  JMP @MenuRestart
  1338. endp
  1339.  
  1340. ;+--------------------------------------------------------------------
  1341. ;|                             Fonction Val                          |
  1342. ;+-------------------------------------------------------------------|
  1343. ;
  1344. ;
  1345. ; Description
  1346. ; ===========
  1347. ;
  1348. ;  Cette fonction retourne la valeur entière d'une chaîne de caractère
  1349. ; de format numérique.
  1350. ;
  1351. ;
  1352. ; Remarque
  1353. ; ========
  1354. ;
  1355. ;  þ S'il les caractères contenu dans la chaîne ne sont pas des lettres
  1356. ;    aussi bien dire qu'il retournera n'importe quel valeur...
  1357. ;
  1358. ;
  1359. ; Entrée
  1360. ; ======
  1361. ;
  1362. ;  DS:SI    = Chaîne de caractères contenant les nombres
  1363. ;
  1364. ;
  1365. ; Retour
  1366. ; ======
  1367. ;
  1368. ;  AX       = Valeur numérique contenu dans la chaîne
  1369.  
  1370. ValTab10 DW 1, 10, 100, 1000, 10000
  1371.  
  1372. Val Proc Near
  1373.  PUSH DI
  1374.   XOR DI,DI
  1375.   MOV CL,DS:[SI]
  1376.   XOR CH,CH
  1377.   ADD SI,CX
  1378.   STD
  1379.   XOR BX,BX
  1380. @Val:
  1381.   LODSB
  1382.   SUB AL,'0'
  1383.   XOR AH,AH
  1384.   MUL ValTab10[BX]
  1385.   ADD DI,AX
  1386.   INC BX
  1387.   INC BX
  1388.   LOOP @Val
  1389.   XCHG AX,DI
  1390.  POP DI
  1391. EndProc
  1392.  
  1393. ;+----------------------------------------------------------------------
  1394. ;|                          Fonction LireOuiNon                        |
  1395. ;+---------------------------------------------------------------------|
  1396. ;
  1397. ;
  1398. ; Description
  1399. ; ===========
  1400. ;
  1401. ;  Cette fonction demande  à l'utilisateur  de répondre par une lettre O
  1402. ; ou N  en  majuscule  ou  minuscule  il  ne  fait  pas  la  différence.
  1403. ; Toutefois si vous répondez  une autre lettre que ces 2 alors il repose
  1404. ; la question à l'utilisateur en lui affichant un message pour lui faire
  1405. ; comprendre sa grossière erreur de concentration.
  1406. ;
  1407. ;
  1408. ; Entrée
  1409. ; ======
  1410. ;
  1411. ;  Aucun
  1412. ;
  1413. ;
  1414. ; Retour
  1415. ; ======
  1416. ;
  1417. ;  AL       = Caractère correspondant à O ou N seulement
  1418.  
  1419. LireOuiNon Proc Near
  1420. @ReLireOuiNon:
  1421.  CALL ReadKey
  1422.  AND  AL,NOT 20h
  1423.  CMP  AL,'O'
  1424.  JE   @FinOuiNon
  1425.  CMP  AL,'N'
  1426.  JE   @FinOuiNon
  1427.  MOV  SI,Offset PrendDessin
  1428.  CALL ErrMsg
  1429.  JMP  @ReLireOuiNon
  1430. @FinOuiNon:
  1431. EndProc
  1432.  
  1433. ;+--------------------------------------------------------------------
  1434. ;|                        Procédure ArriveeAuto                      |
  1435. ;+-------------------------------------------------------------------|
  1436. ;
  1437. ;
  1438. ; Description
  1439. ; ===========
  1440. ;
  1441. ;  Cette procédure demande  à l'utilisateur d'entrée  une voiture s'il
  1442. ; existe  de la  place  dans le  parc  ou la  rue  et vérifie  que son
  1443. ; immatriculation ne corresponde pas déjà à une voiture existante dans
  1444. ; le parc.
  1445. ;
  1446. ;
  1447. ; Entrée
  1448. ; ======
  1449. ;
  1450. ;  Aucun
  1451. ;
  1452. ;
  1453. ; Sortie
  1454. ; ======
  1455. ;
  1456. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  1457.  
  1458. ArriveeAuto Proc Near
  1459. @ArriveeAuto:
  1460.  MOV SI,Offset TitreArriveeAuto
  1461.  MOV BL,0
  1462.  CALL InitTitre
  1463.  MOV SI,Offset QuestionMat
  1464.  MOV BX,5
  1465.  MOV AH,01Bh
  1466.  CALL PutTxtXY
  1467.  MOV AX,InfoParc.NB
  1468.  ADD AX,InfoRue.NB
  1469.  CMP AX,MaximumVoitureParc+MaximumVoitureRue
  1470.  JAE @ParcEtRuePlein
  1471.  MOV DX,37+(5 shl 8)
  1472.  MOV CL,15
  1473.  MOV SI,Offset TempAuto.Immat
  1474.  CALL LireChaine
  1475.  CMP InfoParc.NB,0
  1476.  JE  @LectureDonnee
  1477.  MOV DI,Offset InfoParc
  1478.  MOV SI,Offset TempAuto.Immat
  1479.  _MOV_ES_DS
  1480.  CALL RBSearchAuto
  1481.  OR  AX,AX
  1482.  JZ  @LectureDonnee
  1483.  MOV SI,Offset VoitureExistante
  1484.  CALL ErrMsg
  1485.  JMP @ArriveeAutre
  1486. @ParcEtRuePlein:
  1487.  MOV SI,Offset ParcEtRuePlein
  1488.  CALL ErrMsg
  1489.  MOV SI,Offset PresseUneTouche
  1490.  CALL Msg
  1491.  CALL ReadKey
  1492.  RET
  1493. @LectureDonnee:
  1494.  MOV SI,Offset QuestionMarque
  1495.  MOV BX,7
  1496.  MOV AH,01Bh
  1497.  CALL PutTxtXY
  1498.  MOV DX,37+(7 shl 8)
  1499.  MOV CL,25
  1500.  MOV SI,Offset TempAuto.Marque
  1501.  CALL LireChaine
  1502.  MOV SI,Offset QuestionCouleur
  1503.  MOV BX,8
  1504.  MOV AH,01Bh
  1505.  CALL PutTxtXY
  1506.  MOV DX,37+(8 shl 8)
  1507.  MOV CL,15
  1508.  MOV SI,Offset TempAuto.Couleur
  1509.  CALL LireChaine
  1510.  MOV SI,Offset QuestionAnnee
  1511.  MOV BX,9
  1512.  MOV AH,01Bh
  1513.  CALL PutTxtXY
  1514. @RelireAnnee:
  1515.  MOV DX,37+(9 shl 8)
  1516.  MOV CL,4
  1517.  MOV SI,Offset String
  1518.  MOV DI,Offset TuteurAnnee
  1519.  CALL _LireChaine
  1520.  CALL Val
  1521.  CMP AX,1900
  1522.  JB  @MauvaiseAnnee
  1523.  CMP AX,1999
  1524.  JNA @AnneeValide
  1525. @MauvaiseAnnee:
  1526.  MOV SI,Offset AnneeInvalid
  1527.  CALL ErrMsg
  1528.  JMP @RelireAnnee
  1529. @AnneeValide:
  1530.  MOV TempAuto.Annee,AX
  1531.  MOV CX,TYPE InfoAuto
  1532.  _MOV_ES_DS
  1533.  CMP InfoParc.NB,MaximumVoitureParc
  1534.  JNE @Parc
  1535.  MOV DI,Offset InfoRue
  1536.  JMP @SkipParc
  1537. @Parc:
  1538.  MOV DI,Offset InfoParc
  1539. @SkipParc:
  1540.  MOV SI,Offset TempAuto
  1541.  CALL RBAdd
  1542. @ArriveeAutre:
  1543.  MOV SI,Offset QuesNewVoiture
  1544.  CALL Msg
  1545.  CALL LireOuiNon
  1546.  CMP AL,'N'
  1547.  JE  @FinArrivee
  1548.  JMP @ArriveeAuto
  1549. @FinArrivee:
  1550. EndProc
  1551.  
  1552. ;+--------------------------------------------------------------------
  1553. ;|                           Fonction AChiffre                       |
  1554. ;+-------------------------------------------------------------------|
  1555. ;
  1556. ;
  1557. ; Description
  1558. ; ===========
  1559. ;
  1560. ;  Cette fonction retourne une valeur numérique contenu par le registre
  1561. ; BX dans une chaîne de caractères nommé «String».
  1562. ;
  1563. ;
  1564. ; Entrée
  1565. ; ======
  1566. ;
  1567. ;  BL       = Valeur
  1568. ;
  1569. ;
  1570. ; Sortie
  1571. ; ======
  1572. ;
  1573. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  1574. ;
  1575. ;
  1576. ; Retour
  1577. ; ======
  1578. ;
  1579. ;  String   = Contient une chaîne de caractères numérique contenant la valeur
  1580. ;             du registre BX
  1581.  
  1582. AChiffre Proc Near
  1583.  CLD
  1584.  MOV DI,Offset String
  1585.  PUSH DS
  1586.  POP ES
  1587.  CMP BX,10000
  1588.  JAE @10000
  1589.  CMP BX,1000
  1590.  JAE @1000
  1591.  CMP BX,100
  1592.  JAE @100
  1593.  CMP BX,10
  1594.  JAE @10
  1595.  MOV AL,1
  1596.  MOV AH,BL
  1597.  ADD AH,'0'
  1598.  STOSW
  1599.  JMP @FinChiffre
  1600. @10:
  1601.  MOV AL,2
  1602.  STOSB
  1603.  XCHG AX,BX
  1604. @Dump10:
  1605.  MOV DL,10
  1606.  DIV DL
  1607.  ADD AL,'0'
  1608.  ADD AH,'0'
  1609.  STOSW
  1610.  JMP @FinChiffre
  1611. @100:
  1612.  MOV AL,3
  1613.  STOSB
  1614.  XCHG AX,BX
  1615. @Dump100:
  1616.  MOV DL,100
  1617.  DIV DL
  1618.  ADD AL,'0'
  1619.  STOSB
  1620.  MOV AL,AH
  1621.  MOV AH,0
  1622.  JMP @Dump10
  1623. @1000:
  1624.  MOV AL,4
  1625.  STOSB
  1626.  XCHG AX,BX
  1627. @Dump1000:
  1628.  XOR DX,DX
  1629.  MOV CX,1000
  1630.  DIV CX
  1631.  ADD AL,'0'
  1632.  STOSB
  1633.  XCHG AX,DX
  1634.  JMP @Dump100
  1635. @10000:
  1636.  MOV AL,5
  1637.  STOSB
  1638.  XCHG AX,BX
  1639.  XOR DX,DX
  1640.  MOV CX,10000
  1641.  DIV CX
  1642.  ADD AL,'0'
  1643.  STOSB
  1644.  XCHG AX,DX
  1645.  JMP @Dump1000
  1646. @FinChiffre:
  1647. EndProc
  1648.  
  1649. ;+----------------------------------------------------------------
  1650. ;|                     Procédure Information                     |
  1651. ;+---------------------------------------------------------------|
  1652. ;
  1653. ;
  1654. ; Description
  1655. ; ===========
  1656. ;
  1657. ;  Cette procédure informe l'utilisateur sur l'état global du parc
  1658. ; ainsi que les nombres de place prise dans le parc et la rue.
  1659. ;
  1660. ;
  1661. ; Entrée
  1662. ; ======
  1663. ;
  1664. ;  Aucun
  1665. ;
  1666. ;
  1667. ; Sortie
  1668. ; ======
  1669. ;
  1670. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  1671.  
  1672. Information Proc Near
  1673.  MOV SI,Offset TitreInformation
  1674.  MOV BL,0
  1675.  CALL InitTitre
  1676.  MOV SI,Offset InfoParcUsed
  1677.  MOV BX,(4 shl 8)+3
  1678.  MOV AH,01Fh
  1679.  CALL PutTxtXY
  1680.  MOV SI,Offset InfoParcFree
  1681.  INC BX
  1682.  CALL PutTxtXY
  1683.  MOV SI,Offset InfoRueUsed
  1684.  INC BX
  1685.  CALL PutTxtXY
  1686.  MOV SI,Offset InfoRueFree
  1687.  INC BX
  1688.  CALL PutTxtXY
  1689.  MOV BX,InfoParc.NB
  1690.  CALL AChiffre
  1691.  MOV SI,Offset String
  1692.  MOV BX,(45 shl 8)+3
  1693.  MOV AH,1Bh
  1694.  CALL _PutTxtXY
  1695.  MOV BX,MaximumVoitureParc
  1696.  SUB BX,InfoParc.NB
  1697.  CALL AChiffre
  1698.  MOV SI,Offset String
  1699.  MOV BX,(45 shl 8)+4
  1700.  MOV AH,1Bh
  1701.  CALL _PutTxtXY
  1702.  MOV BX,InfoRue.NB
  1703.  CALL AChiffre
  1704.  MOV SI,Offset String
  1705.  MOV BX,(45 shl 8)+5
  1706.  MOV AH,1Bh
  1707.  CALL _PutTxtXY
  1708.  MOV BX,MaximumVoitureRue
  1709.  SUB BX,InfoRue.NB
  1710.  CALL AChiffre
  1711.  MOV SI,Offset String
  1712.  MOV BX,(45 shl 8)+6
  1713.  MOV AH,1Bh
  1714.  CALL _PutTxtXY
  1715.  MOV SI,Offset PresseUneTouche
  1716.  CALL Msg
  1717.  CMP InfoParc.NB,0
  1718.  JE  @PersonneDansParc
  1719.  MOV SI,Offset InfoVoitureParc
  1720.  MOV BX,(0 shl 8)+8
  1721.  MOV AH,01Fh
  1722.  CALL PutTxtXY
  1723.  MOV SI,Offset EnteteParc1
  1724.  MOV BX,(0 shl 8)+10
  1725.  MOV AH,01Fh
  1726.  CALL PutTxtXY
  1727.  MOV SI,Offset EnteteParc2
  1728.  MOV BX,(0 shl 8)+11
  1729.  MOV AH,01Fh
  1730.  CALL PutTxtXY
  1731.  _MOV_ES_DS
  1732.  MOV DI,Offset InfoParc
  1733.  CALL RBSetPtrHome
  1734.  MOV CX,InfoParc.NB
  1735.  MOV BL,12
  1736. @AfficheLigne:
  1737.  PUSH CX
  1738.   CALL RBGetCurrAuto
  1739.   MOV SI,Offset TempAuto.Marque
  1740.   MOV BH,0
  1741.   MOV AH,01Bh
  1742.   CALL _PutTxtXY
  1743.   MOV SI,Offset TempAuto.Couleur
  1744.   MOV BH,26
  1745.   MOV AH,01Bh
  1746.   CALL _PutTxtXY
  1747.   PUSH BX
  1748.    MOV BX,TempAuto.Annee
  1749.    CALL AChiffre
  1750.   POP BX
  1751.   MOV SI,Offset String
  1752.   MOV BH,42
  1753.   MOV AH,01Bh
  1754.   CALL _PutTxtXY
  1755.   MOV SI,Offset TempAuto.Immat
  1756.   MOV BH,48
  1757.   MOV AH,01Bh
  1758.   CALL _PutTxtXY
  1759.   _MOV_ES_DS
  1760.   MOV DI,Offset InfoParc
  1761.   CALL RBNext
  1762.   INC BX
  1763.  POP CX
  1764.  LOOP @AfficheLigne
  1765. @PersonneDansParc:
  1766.  CALL ReadKey
  1767. EndProc
  1768.  
  1769. ;+--------------------------------------------------------------------
  1770. ;|                        Procédure DepartVoiture                    |
  1771. ;+-------------------------------------------------------------------|
  1772. ;
  1773. ;
  1774. ; Description
  1775. ; ===========
  1776. ;
  1777. ;  Cette  procédure  permet  à  l'utilisateur  de  faire  quitter  une
  1778. ; voiture du parc de voiture. Pour se faire il demande à l'utilisateur
  1779. ; d'entrée le numéro  d'immatriculation  et si la voiture  est trouvée
  1780. ; alors il l'efface de la liste symétrique.
  1781. ;
  1782. ;
  1783. ; Entrée
  1784. ; ======
  1785. ;
  1786. ;  Aucun
  1787. ;
  1788. ;
  1789. ; Sortie
  1790. ; ======
  1791. ;
  1792. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  1793.  
  1794. DepartVoiture Proc Near
  1795. @Depart:
  1796.  MOV SI,Offset TitreDepartAuto
  1797.  MOV BL,0
  1798.  CALL InitTitre
  1799.  CMP InfoParc.NB,0
  1800.  JE  @DVoitureExistePas
  1801.  MOV SI,Offset QuestionMat
  1802.  MOV BX,5
  1803.  MOV AH,01Bh
  1804.  CALL PutTxtXY
  1805.  MOV DX,37+(5 shl 8)
  1806.  MOV CL,15
  1807.  MOV SI,Offset TempAuto.Immat
  1808.  CALL LireChaine
  1809.  MOV DI,Offset InfoParc
  1810.  MOV SI,Offset TempAuto.Immat
  1811.  _MOV_ES_DS
  1812.  CALL RBSearchAuto
  1813.  OR  AX,AX
  1814.  JNZ @DVoiturePresent
  1815.  MOV SI,Offset VoitureIntrouvable
  1816.  CALL ErrMsg
  1817.  JMP @DepartAutre
  1818. @DVoitureExistePas:
  1819.  MOV SI,Offset VoitureExistePas
  1820.  CALL ErrMsg
  1821.  MOV SI,Offset PresseUneTouche
  1822.  CALL Msg
  1823.  CALL ReadKey
  1824.  RET
  1825. @DVoiturePresent:
  1826.  CALL RBGetCurrAuto
  1827.  MOV SI,Offset StrMarque
  1828.  MOV BX,7
  1829.  MOV AH,01Bh
  1830.  CALL PutTxtXY
  1831.  MOV BH,37
  1832.  MOV SI,Offset TempAuto.Marque
  1833.  CALL _PutTxtXY
  1834.  MOV SI,Offset StrCouleur
  1835.  MOV BX,8
  1836.  MOV AH,01Bh
  1837.  CALL PutTxtXY
  1838.  MOV BH,37
  1839.  MOV SI,Offset TempAuto.Couleur
  1840.  CALL _PutTxtXY
  1841.  MOV SI,Offset StrAnnee
  1842.  MOV BX,9
  1843.  MOV AH,01Bh
  1844.  CALL PutTxtXY
  1845.  MOV BX,TempAuto.Annee
  1846.  CALL AChiffre
  1847.  MOV SI,Offset String
  1848.  MOV AH,01Bh
  1849.  MOV BX,(37 shl 8)+9
  1850.  CALL _PutTxtXY
  1851.  MOV DI,Offset InfoParc
  1852.  _MOV_ES_DS
  1853.  CALL RBDelCurrBuf
  1854.  CMP InfoRue.NB,0
  1855.  JE  @DepartAutre
  1856.  CMP InfoParc.NB,MaximumVoitureParc
  1857.  JNB @DepartAutre
  1858.  _MOV_ES_DS
  1859.  MOV DI,Offset InfoRue
  1860.  CALL RBSetPtrHome
  1861.  CALL RBGetCurrAuto
  1862.  CALL RBDelCurrBuf
  1863.  MOV DI,Offset InfoParc
  1864.  MOV SI,Offset TempAuto
  1865.  MOV CX,TYPE InfoAuto
  1866.  CALL RBAdd
  1867. @DepartAutre:
  1868.  MOV SI,Offset QuesDepartNewVoiture
  1869.  CALL Msg
  1870.  CALL LireOuiNon
  1871.  CMP AL,'N'
  1872.  JE  @FinDepart
  1873.  JMP @Depart
  1874. @FinDepart:
  1875. EndProc
  1876.  
  1877. ;+-------------------------------------------------------------------
  1878. ;|                       Procédure Consultation                     |
  1879. ;+------------------------------------------------------------------|
  1880. ;
  1881. ;
  1882. ; Description
  1883. ; ===========
  1884. ;
  1885. ;  Cette procédure permet à l'utilisateur de consulter une voiture du
  1886. ; parc de voiture.  Pour se faire il demande à l'utilisateur d'entrée
  1887. ; le numéro d'immatriculation  et si la voiture  est trouvée alors il
  1888. ; l'efface de la liste symétrique.
  1889. ;
  1890. ;
  1891. ; Entrée
  1892. ; ======
  1893. ;
  1894. ;  Aucun
  1895. ;
  1896. ;
  1897. ; Sortie
  1898. ; ======
  1899. ;
  1900. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  1901.  
  1902. Consultation Proc Near
  1903. @Consultation:
  1904.  MOV SI,Offset TitreConsultationAuto
  1905.  MOV BL,0
  1906.  CALL InitTitre
  1907.  CMP InfoParc.NB,0
  1908.  JE  @VoitureExistePas
  1909.  MOV SI,Offset QuestionMat
  1910.  MOV BX,5
  1911.  MOV AH,01Bh
  1912.  CALL PutTxtXY
  1913.  MOV DX,37+(5 shl 8)
  1914.  MOV CL,15
  1915.  MOV SI,Offset TempAuto.Immat
  1916.  CALL LireChaine
  1917.  MOV DI,Offset InfoParc
  1918.  MOV SI,Offset TempAuto.Immat
  1919.  _MOV_ES_DS
  1920.  CALL RBSearchAuto
  1921.  OR  AX,AX
  1922.  JNZ @VoiturePresent
  1923. @VoitureExistePas:
  1924.  MOV SI,Offset VoitureExistePas
  1925.  CALL ErrMsg
  1926.  MOV SI,Offset PresseUneTouche
  1927.  CALL Msg
  1928.  CALL ReadKey
  1929.  RET
  1930. @VoiturePresent:
  1931.  CALL RBGetCurrAuto
  1932.  MOV SI,Offset StrMarque
  1933.  MOV BX,7
  1934.  MOV AH,01Bh
  1935.  CALL PutTxtXY
  1936.  MOV BH,37
  1937.  MOV SI,Offset TempAuto.Marque
  1938.  CALL _PutTxtXY
  1939.  MOV SI,Offset StrCouleur
  1940.  MOV BX,8
  1941.  MOV AH,01Bh
  1942.  CALL PutTxtXY
  1943.  MOV BH,37
  1944.  MOV SI,Offset TempAuto.Couleur
  1945.  CALL _PutTxtXY
  1946.  MOV SI,Offset StrAnnee
  1947.  MOV BX,9
  1948.  MOV AH,01Bh
  1949.  CALL PutTxtXY
  1950.  MOV BX,TempAuto.Annee
  1951.  CALL AChiffre
  1952.  MOV SI,Offset String
  1953.  MOV AH,01Bh
  1954.  MOV BX,(37 shl 8)+9
  1955.  CALL _PutTxtXY
  1956. @ConsultationAutre:
  1957.  MOV SI,Offset QuesConsultNewVoiture
  1958.  CALL Msg
  1959.  CALL LireOuiNon
  1960.  CMP AL,'N'
  1961.  JE  @FinConsultation
  1962.  JMP @Consultation
  1963. @FinConsultation:
  1964. EndProc
  1965.  
  1966. ;+-------------------------------------------------------------------
  1967. ;|                       Procédure FinJournee                       |
  1968. ;+------------------------------------------------------------------|
  1969. ;
  1970. ;
  1971. ; Description
  1972. ; ===========
  1973. ;
  1974. ;  Cette procédure permet de sauvegarder les voitures contenu dans le
  1975. ; parc de voiture et d'en faire par à l'utilisateur.
  1976. ;
  1977. ;
  1978. ; Entrée
  1979. ; ======
  1980. ;
  1981. ;  Aucun
  1982. ;
  1983. ;
  1984. ; Sortie
  1985. ; ======
  1986. ;
  1987. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  1988.  
  1989. FinJournee Proc Near
  1990. Local Handle:Byte
  1991.  MOV SI,Offset FinJourneeStr
  1992.  MOV BL,0
  1993.  CALL InitTitre
  1994.  MOV SI,Offset SauveMsg
  1995.  MOV BX,5
  1996.  MOV AH,01Bh
  1997.  CALL PutTxtXY
  1998.  MOV DI,Offset NomFichier
  1999.  CALL DelFile
  2000.  CALL NewFile
  2001.  CMP AL,errHdl
  2002.  JNE @FichierOuvert
  2003.  MOV SI,Offset ImpossibleCree
  2004.  CALL ErrMsg
  2005.  JMP @FinJournee
  2006. @FichierOuvert:
  2007.  MOV Handle,AL
  2008.  _MOV_ES_DS
  2009.  MOV DI,Offset InfoParc
  2010.  CALL RBSetPtrHome
  2011.  MOV CX,InfoParc.NB
  2012. @SauveEnreg:
  2013.  PUSH CX
  2014.   CALL RBGetCurrAuto
  2015.   MOV CX,TYPE InfoAuto
  2016.   MOV BL,Handle
  2017.   MOV SI,Offset TempAuto
  2018.   CALL _SetRec
  2019.   CALL RBNext
  2020.  POP CX
  2021.  LOOP @SauveEnreg
  2022.  MOV BL,Handle
  2023.  CALL CloseFile
  2024. @FinJournee:
  2025.  MOV SI,Offset PresseUneTouche
  2026.  CALL Msg
  2027.  CALL ReadKey
  2028. EndProc
  2029.  
  2030. ;+-------------------------------------------------------------------
  2031. ;|                         Fonction Presentation                    |
  2032. ;+------------------------------------------------------------------|
  2033. ;
  2034. ;
  2035. ; Description
  2036. ; ===========
  2037. ;
  2038. ;  Cette affiche un message de présentation à l'utilisateur et lui
  2039. ; demande s'il veut continuer. Lorsque l'usager a pris sa décision
  2040. ; alors la fonction retourne une lettre O ou N.
  2041. ;
  2042. ;
  2043. ; Entrée
  2044. ; ======
  2045. ;
  2046. ;  Aucun
  2047. ;
  2048. ;
  2049. ; Sortie
  2050. ; ======
  2051. ;
  2052. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  2053. ;
  2054. ;
  2055. ; Retour
  2056. ; ======
  2057. ;
  2058. ;  AL     = O s'il veut continuer le processus
  2059. ;           N s'il ne veut pas continuer le processus
  2060.  
  2061. Presentation Proc Far
  2062.  MOV AH,17h
  2063.  CALL ClrScr
  2064.  MOV AX,0720h
  2065.  MOV DX,0+(79 shl 8)
  2066.  MOV BL,24
  2067.  CALL BarTxtHor
  2068.  MOV BL,3
  2069.  MOV AH,01Eh
  2070.  MOV SI,Offset Pres1
  2071.  CALL PutTxtY
  2072.  MOV BL,5
  2073.  MOV AH,01Fh
  2074.  MOV SI,Offset Pres2
  2075.  CALL PutTxtY
  2076.  MOV BL,7
  2077.  MOV SI,Offset Pres3
  2078.  CALL PutTxtY
  2079.  MOV BL,10
  2080.  MOV AH,01Ch
  2081.  MOV SI,Offset Pres4
  2082.  CALL PutTxtY
  2083.  MOV BL,12
  2084.  MOV AH,01Fh
  2085.  MOV SI,Offset Pres5
  2086.  CALL PutTxtY
  2087.  MOV BX,15+(2 shl 8)
  2088.  MOV SI,Offset Pres6
  2089.  CALL PutTxtXY
  2090.  INC BX
  2091.  MOV SI,Offset Pres7
  2092.  CALL PutTxtXY
  2093.  INC BX
  2094.  INC BX
  2095.  MOV SI,Offset Pres8
  2096.  CALL PutTxtXY
  2097.  INC BX
  2098.  MOV SI,Offset Pres9
  2099.  CALL PutTxtXY
  2100.  MOV SI,Offset Pres10
  2101.  CALL Msg
  2102.  CALL LireOuiNon
  2103. EndProc
  2104.  
  2105. ;+------------------------------------------------------------------
  2106. ;|                      Procédure LectureFichier                   |
  2107. ;+-----------------------------------------------------------------|
  2108. ;
  2109. ;
  2110. ; Description
  2111. ; ===========
  2112. ;
  2113. ;  Cette procédure permet de lire à partir d'un fichier et de mettre
  2114. ; le contenu lu dans une liste symétrique.
  2115. ;
  2116. ;
  2117. ; Entrée
  2118. ; ======
  2119. ;
  2120. ;  Aucun
  2121. ;
  2122. ;
  2123. ; Sortie
  2124. ; ======
  2125. ;
  2126. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  2127.  
  2128. LectureFichier Proc Near
  2129. Local Handle:Byte
  2130.  MOV SI,Offset SaisieDonnee
  2131.  MOV BL,0
  2132.  CALL InitTitre
  2133.  MOV SI,Offset EntrezNom
  2134.  MOV BX,4
  2135.  CALL PutTxtXY
  2136. @RedemandeFichier:
  2137.  MOV DX,(5 shl 8)+1
  2138.  MOV CL,80
  2139.  MOV SI,Offset NomFichier
  2140.  CALL LireChaine
  2141.  CMP Byte Ptr NomFichier,0
  2142.  JE  @Continue
  2143.  MOV BL,fmRead
  2144.  MOV DI,Offset NomFichier
  2145.  CALL OpenFile
  2146.  CMP AL,errHdl
  2147.  JNE @FichierPret
  2148.  CALL DelFile
  2149.  CALL NewFile
  2150.  CMP AL,errHdl
  2151.  JNE @FichierPret
  2152.  MOV SI,Offset ImpossibleCree
  2153.  CALL ErrMsg
  2154.  JMP @RedemandeFichier
  2155. @FichierPret:
  2156.  MOV Handle,AL
  2157.  MOV BL,AL
  2158.  CALL FileSize
  2159.  OR  AX,AX
  2160.  JE  @EndFile
  2161.  MOV BX,TYPE InfoAuto
  2162.  DIV BX
  2163.  XCHG AX,CX
  2164.  MOV BL,Handle
  2165.  CALL Rewind
  2166. @ReadAuto:
  2167.  PUSH CX
  2168.   _MOV_ES_DS
  2169.   MOV BL,Handle
  2170.   MOV DI,Offset TempAuto
  2171.   MOV CX,TYPE InfoAuto
  2172.   CALL _GetRec
  2173.   _MOV_ES_DS
  2174.   MOV DI,Offset InfoParc
  2175.   MOV SI,Offset TempAuto
  2176.   CALL RBAdd
  2177.  POP CX
  2178.  LOOP @ReadAuto
  2179. @EndFile:
  2180.  MOV BL,Handle
  2181.  CALL CloseFile
  2182. @Continue:
  2183. EndProc
  2184.  
  2185. ;+----------------------------------------------------------------------
  2186. ;|                           Procédure AvosRisque                      |
  2187. ;+---------------------------------------------------------------------|
  2188. ;
  2189. ;
  2190. ; Description
  2191. ; ===========
  2192. ;
  2193. ;  Cette procédure lance le programme lui-même. Il s'agit d'un programme
  2194. ; de gestion de parc de voiture dans le font du rue *perdue.
  2195. ;
  2196. ;
  2197. ; Entrée
  2198. ; ======
  2199. ;
  2200. ;  Aucun
  2201. ;
  2202. ;
  2203. ; Sortie
  2204. ; ======
  2205. ;
  2206. ;  Registre détruit AX, BX, CX, DX, SI, DI et les drapeaux
  2207.  
  2208. @Choix:
  2209. DW Offset ArriveeAuto, Offset DepartVoiture, Offset Consultation
  2210. DW Offset Information, Offset FinJournee
  2211.  
  2212. AvosRisque Proc Far
  2213.  MOV AX,3
  2214.  INT 10h
  2215.  _MOV_ES_DS
  2216.  MOV DI,Offset InfoParc
  2217.  CALL RBInit
  2218.  MOV DI,Offset InfoRue
  2219.  CALL RBInit
  2220.  CALL Presentation
  2221.  CMP  AL,'N'
  2222.  JE   @FinAR
  2223. @AutreFichier:
  2224.  CALL LectureFichier
  2225. @AR:
  2226.  CALL Menu
  2227.  PUSH AX
  2228.   XCHG AX,BX
  2229.   XOR BH,BH
  2230.   SUB BL,'1'
  2231.   SHL BX,1
  2232.   CALL Word Ptr @Choix[BX]
  2233.  POP AX
  2234.  CMP AL,'5'
  2235.  JNE @AR
  2236.  _MOV_ES_DS
  2237.  MOV DI,Offset InfoParc
  2238.  CALL RBDone
  2239.  MOV DI,Offset InfoRue
  2240.  CALL RBDone
  2241.  MOV SI,Offset AutreFichier
  2242.  CALL Msg
  2243.  CALL LireOuiNon
  2244.  CMP AL,'O'
  2245.  JE  @AutreFichier
  2246. @FinAR:
  2247.  MOV AX,3
  2248.  INT 10h
  2249. EndProc
  2250.  
  2251. code ends
  2252. end

Dernière mise à jour : Samedi, le 21 décembre 2013