home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
noyau
/
horloge.lst
< prev
next >
Wrap
File List
|
1994-05-25
|
20KB
|
528 lines
Microsoft (R) Macro Assembler Version 6.00 05/26/94 03:29:45
HORLOGE.ASM Page 1 - 1
.286
.MODEL SMALL,OS_DOS
;
; GESTION DU TEMPS SYSTEME
;
; Traitement de l'interruption de type 08 = horloge temps-réel du système
; Définition du processus HORLOGE de traitement du temps
;
; HORLOGE.ASM
;
; ART OF CODE 1994
;
;
EXTERNDEF AFFDEC : NEAR
INCLUDE dos.inc
C ; DOS.INC
C
C MsDos MACRO
C int 21h
C ENDM
C
INCLUDE types.inc
C ; Types.inc
C ;
C ;............ Définition des types d'objets ................
C ;
C
= 0003 C TypeSemaphore EQU 00000011b ; sémaphore sans delta-liste (DIJKSTRA)
C
= 0004 C TypeTampon EQU 00000100b ; tampon circulaire de communication
C
= 000C C TypeQueue EQU 00001100b ; cellule de garde d'une liste chainée
C
= 001C C TypeProcTPU EQU 00011100b ; processus utilisateur temps partagé
= 001D C TypeProcTRU EQU 00011101b ; processus utilisateur temps réel
= 001E C TypeProcTPS EQU 00011110b ; processus système temps partagé
= 001F C TypeProcTRS EQU 00011111b ; processus système temps réel
= 001C C TypeProcessus EQU TypeProcTPU ; type générique pour les processus
C
INCLUDE const.inc
C ;
C ; const.inc
C ;
C
= 0020 C EOI EQU 20h ; octet d'acquittement d'interruption au pic 8259A
= 0020 C PortCTRLpic EQU 20h ; port de controle du PIC
= 03F2 C PortCTRLfdc EQU 03F2h ; port de controle du controleur de disquette
= FFFF C NIL EQU 0FFFFh
= 0001 C ENCORE EQU 1 ; marque suite execution du noyau
=-0002 C FIN EQU NOT ENCORE ; marque la fin
= 0100 C DimPile EQU 256 ; nombre de mots d'une pile privée
= 000C C NbRegs EQU 12 ; nombre de registres du contexte initial
= F202 C ETAT_INITIAL EQU 1111001000000010b ; valeur initiale du registre d'état
C
INCLUDE etats.inc
C ;
C ; fichier des etats d'un processus ou d'un descripteur d'objet
C ;
C ; Etats.inc
C ;
C
= 0000 C nEtat = 0
C FOR EtatProc,<NON_EXISTANT,ACTIF,PRET,BLOQUE,EN_ATTENTE,SUSPENDU>
C &EtatProc EQU nEtat+0
C nEtat = nEtat + 1
C ENDM
= 0000 1C NON_EXISTANT EQU nEtat+0
= 0001 1C nEtat = nEtat + 1
= 0001 1C ACTIF EQU nEtat+0
= 0002 1C nEtat = nEtat + 1
= 0002 1C PRET EQU nEtat+0
= 0003 1C nEtat = nEtat + 1
= 0003 1C BLOQUE EQU nEtat+0
= 0004 1C nEtat = nEtat + 1
= 0004 1C EN_ATTENTE EQU nEtat+0
= 0005 1C nEtat = nEtat + 1
= 0005 1C SUSPENDU EQU nEtat+0
= 0006 1C nEtat = nEtat + 1
C
= 0000 C TERMINE EQU NON_EXISTANT
= 0000 C LIBRE EQU NON_EXISTANT
=-0001 C OCCUPE EQU (NOT LIBRE)+0
=-0001 C INFINI EQU (NOT LIBRE)+0
C
INCLUDE descript.inc
C ; descript.inc
C ;
C ; Description d'un objet du noyau
C ;
C ;
C
0009 C DESCRIPTEUR STRUCT
0000 0000 C precedent WORD ? ; lien de chainage sur le descripteur précédent
0002 0000 C suivant WORD ? ; lien de chainage sur le descripteur suivant
0004 0000 C identite WORD ? ; n° de poste dans la table des descripteurs de l'objet
0006 00 C TypeObjet BYTE ? ; type de l'objet référencé par le descripteur
0007 00 C etat BYTE ? ; état actuel du descripteur ou de l'objet
0008 00 C priorite BYTE ? ; clé d'ordonnancement des descripteurs
C DESCRIPTEUR ENDS
C
= WORD PTR identite C identification EQU <WORD PTR identite> ; identification de l'objet
= 0009 C DimDescripteur EQU SIZEOF DESCRIPTEUR ; nombre d'octets du descripteur
C
INCLUDE semphor.inc
C ; SEMPHOR.INC
C ; Definition du type semaphore
C ;
C
000A C SEMAPHORE STRUCT
0000 0000 0000 0000 03 C DESCRIPTEUR <,,,TypeSemaphore,LIBRE,INFINI>
00 FF
0009 00 C compteur BYTE ?
C SEMAPHORE ENDS
C
INCLUDE process.inc
C ; Process.inc : descripteurs de processus
000F C PROCESSUS STRUCT
0000 0000 0000 0000 1C C DESCRIPTEUR <,,,TypeProcessus,LIBRE,>
00 00
0009 0000 C Reg_SP WORD ?
000B 0000 C Reg_SS WORD ?
000D 0000 C file WORD ?
C PROCESSUS ENDS
C
INCLUDE gestlist.inc
C ; Gestlist.inc
C ;
C ;....... Importation des fonctions de gestion de liste ..............
C ;
C
C EXTERNDEF insere : NEAR
C EXTERNDEF recherche : NEAR
C EXTERNDEF InsereItem : NEAR
C
C EXTERNDEF extrait : NEAR
C EXTERNDEF PremierDeListe : NEAR
C EXTERNDEF DernierDeListe : NEAR
C
C EXTERNDEF FileVide : NEAR
C EXTERNDEF InitVide : NEAR
C
C EXTERNDEF empiler : NEAR
C EXTERNDEF Depiler : NEAR
C
INCLUDE donnees.inc
C ;
C ; Segment des données du noyau
C ;
C ; donnees.inc
C
C EXTERNDEF EnCours : WORD ; pointeur sur descripteur processus ACTIF
C EXTERNDEF QueueExp : WORD ; pointeur sur liste des descripteurs procs PRETs
C EXTERNDEF NonPreemptif : BYTE ; état d'execution du noyau
C EXTERNDEF FinNoyau : BYTE ; marque le noyau terminé
C EXTERNDEF NoyauFini : BYTE ; marque la tâche horloge terminée
C EXTERNDEF pHorloge : PROCESSUS ; descripteur du processus HORLOGE
C EXTERNDEF pPrincipal : PROCESSUS ; descripteur du processus PRINCIPAL
C
INCLUDE code.inc
C ;
C ; CODE.INC
C ; Import/export des fonctions du noyau
C ;
C
C EXTERNDEF eligible : NEAR
C EXTERNDEF dispatcher : NEAR
C EXTERNDEF P : NEAR
C EXTERNDEF V : NEAR
C
; Pile privée du processus HORLOGE
0000 PileHorloge SEGMENT WORD 'STACK' ; pile privée du processus
0000 00F4 [ WORD (DimPile-NbRegs) DUP (?)
0000
]
01E8 SP_PileHorloge LABEL WORD ; sommet actuel de la pile privée
01E8 000A [ WORD (NbRegs - 2) DUP (?) ; valeur initiale des registres du µp
0000
]
01FC F202 WORD ETAT_INITIAL ; valeur initiale du mot d'état
01FE 0065 R WORD OFFSET horloge ; point d'entrée
0200 PileHorloge ENDS
; Segment de données du BIOS
0000 donnees_bios SEGMENT AT 0040h
org 003Fh
003F 00 MOTOR_STATUS BYTE ?
0040 00 MOTOR_COUNT BYTE ?
org 006Ch
006C 0000 TIMER_LOW WORD ?
006E 0000 TIMER_HIGH WORD ?
0070 00 TIMER_OFL BYTE ?
0071 donnees_bios ENDS
0000 .DATA
0000 0000 0000 0000 1C pHorloge PROCESSUS <{,,,TypeProcessus,OCCUPE,0},OFFSET SP_PileHorloge,PileHorloge,NIL>
FF 00 01E8 R ---- R
FFFF
000F 0000 0000 0000 03 SemHorloge SEMAPHORE <> ; sémaphore de synchro sur int timer
00 FF 00
EXTERNDEF sHorloge : SEMAPHORE
0019 00000000 EX_INT08h DWORD ? ; sauvegarde vecteur int timer DOS
001D ---- 0000 R INT08h DWORD timer ; pointeur service int timer
0000 .CODE
; Traitement de l'interruption du timer
;
; Cette procédure est déclenchée par l'interruption de type 8.
; Elle débloque la tache HORLOGE apres avoir acquitté l'interruption au controleur.
;
0000 timer PROC FAR
0000 1E push ds
0001 50 push ax
0002 B8 ---- R mov ax,@data
0005 8E D8 mov ds,ax
ASSUME ds:@data
0007 FB STI ; démasquage effectif qu'apres l'instruction suivante
0008 FE 06 0000 E inc [NonPreemptif] ; le noyau n'est plus preemptif
; ---------------- Acquitte l'interruption au controleur -------------------
000C B0 20 mov al,EOI ; (al) := octet d'acquittement
000E E6 20 out PortCtrlpic,al ; .... Envoyé au PIC 8259A
; Débloque le processus Horloge
0010 56 push si
0011 BE 000F R lea si,SemHorloge ; (si) ---> sémaphore de synchronisation
0014 E8 0000 E call V ; débloque le processus
0017 5E pop si
; Termine et force la commutation
0018 FE 0E 0000 E dec [NonPreemptif]
001C 58 pop ax
001D E8 0000 E call dispatcher
0020 1F pop ds
ASSUME ds:NOTHING
0021 CF IRET
0022 timer ENDP
; Code de la tache d'horloge
0022 TempsDos PROC
0022 9C pushf
0023 50 push ax
ASSUME ds:donnees_bios
0024 FF 06 006C R inc [TIMER_LOW] ; actualise l'heure
0028 75 04 jnz TD1 ; dépassement ?
002A FF 06 006E R inc [TIMER_HIGH] ; oui ! ajuste les poids forts
002E TD1:
002E 83 3E 006E R 18 cmp [TIMER_HIGH],24 ; 24 heures écoulées ?
0033 75 15 jnz TD2
0035 81 3E 006C R 00B0 cmp [TIMER_LOW],0B0h
003B 75 0D jnz TD2
003D 33 C0 xor ax,ax ; change le jour
003F A3 006C R mov [TIMER_LOW],ax
0042 A3 006E R mov [TIMER_HIGH],ax
0045 C6 06 0070 R 01 mov [TIMER_OFL],1
004A TD2:
004A 58 pop ax
004B 9D popf
004C C3 RET
004D TempsDos ENDP
004D MoteurDsk PROC
004D 9C pushf
004E 50 push ax
004F 52 push dx
ASSUME ds:donnees_bios
0050 FE 0E 0040 R dec [MOTOR_COUNT]
0054 75 0B jnz FinMtDSK
0056 80 26 003F R F0 and [MOTOR_STATUS],0F0h
005B B0 0C mov al,0Ch
005D BA 03F2 mov dx,PortCTRLfdc
0060 EE out dx,al
0061 FinMtDSK:
0061 5A pop dx
0062 58 pop ax
0063 9D popf
0064 C3 RET
0065 MoteurDsk ENDP
0065 Horloge PROC
ASSUME DS:@data
0065 B8 ---- R mov ax,@data
0068 8E D8 mov ds,ax
; initialisation du sémaphore SemHorloge
006A BE 000F R lea si,SemHorloge ; (si) ---> sémaphore de synchronisation
006D C6 44 09 00 mov (SEMAPHORE PTR [si]).Compteur,0 ; sémaphore : val = 0
0071 E8 0000 E call InitVide ; On initialise les pointeurs de la file
; initialisation du vecteur d'interruption
0074 FC cld
0075 33 C0 xor ax,ax ; On sauvegarde l'ancien vecteur
0077 8E D8 mov ds,ax ; d'interruption 08h
0079 B8 ---- R mov ax,@data
007C 8E C0 mov es,ax
007E BE 0020 mov si,20h
0081 BF 0019 R lea di,Ex_Int08h
0084 A5 movsw
0085 A5 movsw
0086 B8 ---- R mov ax,@data ; On place le nouveau vecteur
0089 8E D8 mov ds,ax
008B 33 C0 xor ax,ax
008D 8E C0 mov es,ax
008F BF 0020 mov di,20h
0092 BE 001D R lea si,Int08h
0095 9C pushf
0096 FA cli ; pas d'interruptions durant le transfert
0097 A5 movsw
0098 A5 movsw
0099 9D popf ; retablissement des interruptions si il y a lieu
009A repeter:
009A BE 000F R lea si,SemHorloge ; (si) ---> sémaphore de synchronisation
009D E8 0000 E Call P ; WAIT (SemHorloge)
00A0 B8 ---- R mov ax,donnees_bios
00A3 8E D8 mov ds,ax
00A5 E8 FF7A Call TempsDos ; on met à jour l'horloge
00A8 E8 FFA2 Call MoteurDsk ; on arrete le moteur de disquette
00AB B8 ---- R mov ax,@data
00AE 8E D8 mov ds,ax
00B0 BE 0000 E lea si,sHorloge ; on active le processus d'affichage de
00B3 E8 0000 E call v ; l'horloge à l'écran
00B6 BE 0000 E mov si,offset FinNoyau ; on teste si on a fini
00B9 80 3C FE cmp BYTE PTR [si],FIN
00BC 75 DC Jne repeter ; non, on continue
00BE BF 0020 mov di,20h ; on rétablit l'ancien vecteur d'interruption
00C1 BE 0019 R lea si,Ex_Int08h
00C4 9C pushf
00C5 FA cli ; pas d'interruptions pendant ce traitement
00C6 A5 movsw
00C7 A5 movsw
00C8 9D popf ; interruptions rétablies
00C9 BE 0000 E mov si,offset NoyauFini
00CC C6 04 FE mov BYTE PTR [si],FIN ; on signale à pNoyau que c'est fait !
00CF 8B 36 0000 E mov si,[EnCours]
00D3 C6 44 07 00 mov (DESCRIPTEUR PTR [si]).Etat,TERMINE
00D7 E8 0000 E call DISPATCHER ; On termine le processus Horloge
; Le dipatcher commutera sur pNoyau
; qui terminera proprement.
; il ne faut surtout pas terminer par un 'RET'
; sinon, plantage !!! ( La pile ne contient pas d'adresse de retour ).
00DA Horloge ENDP
END
Microsoft (R) Macro Assembler Version 6.00 05/26/94 03:29:45
HORLOGE.ASM Symbols 2 - 1
Macros:
N a m e Type
MsDos . . . . . . . . . . . . . Proc
Structures and Unions:
N a m e Size
Offset Type
DESCRIPTEUR . . . . . . . . . . 0009
precedent . . . . . . . . . . 0000 Word
suivant . . . . . . . . . . . 0002 Word
identite . . . . . . . . . . . 0004 Word
TypeObjet . . . . . . . . . . 0006 Byte
etat . . . . . . . . . . . . . 0007 Byte
priorite . . . . . . . . . . . 0008 Byte
PROCESSUS . . . . . . . . . . . 000F
precedent . . . . . . . . . . 0000 Word
suivant . . . . . . . . . . . 0002 Word
identite . . . . . . . . . . . 0004 Word
TypeObjet . . . . . . . . . . 0006 Byte
etat . . . . . . . . . . . . . 0007 Byte
priorite . . . . . . . . . . . 0008 Byte
Reg_SP . . . . . . . . . . . . 0009 Word
Reg_SS . . . . . . . . . . . . 000B Word
file . . . . . . . . . . . . . 000D Word
SEMAPHORE . . . . . . . . . . . 000A
precedent . . . . . . . . . . 0000 Word
suivant . . . . . . . . . . . 0002 Word
identite . . . . . . . . . . . 0004 Word
TypeObjet . . . . . . . . . . 0006 Byte
etat . . . . . . . . . . . . . 0007 Byte
priorite . . . . . . . . . . . 0008 Byte
compteur . . . . . . . . . . . 0009 Byte
Segments and Groups:
N a m e Size Length Align Combine Class
DGROUP . . . . . . . . . . . . . GROUP
_DATA . . . . . . . . . . . . . 16 Bit 0021 Word Public 'DATA'
PileHorloge . . . . . . . . . . 16 Bit 0200 Word Private 'STACK'
_TEXT . . . . . . . . . . . . . 16 Bit 00DA Word Public 'CODE'
donnees_bios . . . . . . . . . . 16 Bit 0071 Abs Private
Procedures, parameters and locals:
N a m e Type Value Attr
Horloge . . . . . . . . . . . . P Near 0065 _TEXT Length= 0075 Public
repeter . . . . . . . . . . . L Near 009A _TEXT
MoteurDsk . . . . . . . . . . . P Near 004D _TEXT Length= 0018 Public
FinMtDSK . . . . . . . . . . . L Near 0061 _TEXT
TempsDos . . . . . . . . . . . . P Near 0022 _TEXT Length= 002B Public
TD1 . . . . . . . . . . . . . L Near 002E _TEXT
TD2 . . . . . . . . . . . . . L Near 004A _TEXT
timer . . . . . . . . . . . . . P Far 0000 _TEXT Length= 0022 Public
Symbols:
N a m e Type Value Attr
@CodeSize . . . . . . . . . . . Number 0000h
@DataSize . . . . . . . . . . . Number 0000h
@Interface . . . . . . . . . . . Number 0000h
@Model . . . . . . . . . . . . . Number 0002h
@code . . . . . . . . . . . . . Text _TEXT
@data . . . . . . . . . . . . . Text DGROUP
@fardata? . . . . . . . . . . . Text FAR_BSS
@fardata . . . . . . . . . . . . Text FAR_DATA
@stack . . . . . . . . . . . . . Text DGROUP
ACTIF . . . . . . . . . . . . . Number 0001h
AFFDEC . . . . . . . . . . . . . L Near 0000 External
BLOQUE . . . . . . . . . . . . . Number 0003h
Depiler . . . . . . . . . . . . L Near 0000 External
DernierDeListe . . . . . . . . . L Near 0000 External
DimDescripteur . . . . . . . . . Number 0009h
DimPile . . . . . . . . . . . . Number 0100h
ENCORE . . . . . . . . . . . . . Number 0001h
EN_ATTENTE . . . . . . . . . . . Number 0004h
EOI . . . . . . . . . . . . . . Number 0020h
ETAT_INITIAL . . . . . . . . . . Number F202h
EX_INT08h . . . . . . . . . . . DWord 0019 _DATA
EnCours . . . . . . . . . . . . Word 0000 External
FIN . . . . . . . . . . . . . . Number -0002h
FileVide . . . . . . . . . . . . L Near 0000 External
FinNoyau . . . . . . . . . . . . Byte 0000 External
INFINI . . . . . . . . . . . . . Number -0001h
INT08h . . . . . . . . . . . . . DWord 001D _DATA
InitVide . . . . . . . . . . . . L Near 0000 External
InsereItem . . . . . . . . . . . L Near 0000 External
LIBRE . . . . . . . . . . . . . Number 0000h
MOTOR_COUNT . . . . . . . . . . Byte 0040 donnees_bios
MOTOR_STATUS . . . . . . . . . . Byte 003F donnees_bios
NIL . . . . . . . . . . . . . . Number FFFFh
NON_EXISTANT . . . . . . . . . . Number 0000h
NbRegs . . . . . . . . . . . . . Number 000Ch
NonPreemptif . . . . . . . . . . Byte 0000 External
NoyauFini . . . . . . . . . . . Byte 0000 External
OCCUPE . . . . . . . . . . . . . Number -0001h
PRET . . . . . . . . . . . . . . Number 0002h
PortCTRLfdc . . . . . . . . . . Number 03F2h
PortCTRLpic . . . . . . . . . . Number 0020h
PremierDeListe . . . . . . . . . L Near 0000 External
P . . . . . . . . . . . . . . . L Near 0000 External
QueueExp . . . . . . . . . . . . Word 0000 External
SP_PileHorloge . . . . . . . . . Word 01E8 PileHorloge
SUSPENDU . . . . . . . . . . . . Number 0005h
SemHorloge . . . . . . . . . . . SEMAPHORE 000F _DATA
TERMINE . . . . . . . . . . . . Number 0000h
TIMER_HIGH . . . . . . . . . . . Word 006E donnees_bios
TIMER_LOW . . . . . . . . . . . Word 006C donnees_bios
TIMER_OFL . . . . . . . . . . . Byte 0070 donnees_bios
TypeProcTPS . . . . . . . . . . Number 001Eh
TypeProcTPU . . . . . . . . . . Number 001Ch
TypeProcTRS . . . . . . . . . . Number 001Fh
TypeProcTRU . . . . . . . . . . Number 001Dh
TypeProcessus . . . . . . . . . Number 001Ch
TypeQueue . . . . . . . . . . . Number 000Ch
TypeSemaphore . . . . . . . . . Number 0003h
TypeTampon . . . . . . . . . . . Number 0004h
V . . . . . . . . . . . . . . . L Near 0000 External
dispatcher . . . . . . . . . . . L Near 0000 External
eligible . . . . . . . . . . . . L Near 0000 External
empiler . . . . . . . . . . . . L Near 0000 External
extrait . . . . . . . . . . . . L Near 0000 External
identification . . . . . . . . . Text WORD PTR identite
insere . . . . . . . . . . . . . L Near 0000 External
nEtat . . . . . . . . . . . . . Number 0006h
pHorloge . . . . . . . . . . . . PROCESSUS 0000 _DATA Public
pPrincipal . . . . . . . . . . . PROCESSUS 0000 External
recherche . . . . . . . . . . . L Near 0000 External
sHorloge . . . . . . . . . . . . SEMAPHORE 0000 _DATA External
0 Warnings
0 Errors