diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DOS/SEGCHECK.ASM | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/DOS/SEGCHECK.ASM')
| -rw-r--r-- | v4.0/src/DOS/SEGCHECK.ASM | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/v4.0/src/DOS/SEGCHECK.ASM b/v4.0/src/DOS/SEGCHECK.ASM new file mode 100644 index 0000000..992eac2 --- /dev/null +++ b/v4.0/src/DOS/SEGCHECK.ASM | |||
| @@ -0,0 +1,288 @@ | |||
| 1 | ; SCCSID = @(#)segcheck.asm 1.2 85/07/24 | ||
| 2 | TITLE SegCheck - internal consistency check | ||
| 3 | NAME SegCheck | ||
| 4 | |||
| 5 | .xlist | ||
| 6 | INCLUDE DOSSYM.INC | ||
| 7 | INCLUDE DEVSYM.INC | ||
| 8 | |||
| 9 | ShareF = FALSE | ||
| 10 | |||
| 11 | IF NOT SHAREF | ||
| 12 | include dosseg.asm | ||
| 13 | ENDIF | ||
| 14 | .list | ||
| 15 | |||
| 16 | AsmVars <NET, DEBUG> | ||
| 17 | |||
| 18 | DEBUG = FALSE | ||
| 19 | |||
| 20 | IF NOT SHAREF | ||
| 21 | CODE SEGMENT BYTE PUBLIC 'CODE' | ||
| 22 | ASSUME CS:DOSGroup | ||
| 23 | ELSE | ||
| 24 | SHARE SEGMENT BYTE PUBLIC 'SHARE' | ||
| 25 | ASSUME CS:SHARE | ||
| 26 | ENDIF | ||
| 27 | |||
| 28 | DEBUG = FALSE | ||
| 29 | |||
| 30 | BREAK <SegCheck - validate segments in MSDOS> | ||
| 31 | |||
| 32 | Off Macro reg,var | ||
| 33 | IF SHAREF | ||
| 34 | mov reg,offset var | ||
| 35 | else | ||
| 36 | mov reg,offset DOSGroup:var | ||
| 37 | endif | ||
| 38 | endm | ||
| 39 | |||
| 40 | zfmt MACRO fmts,args | ||
| 41 | local a,b | ||
| 42 | PUSHF | ||
| 43 | PUSH AX | ||
| 44 | PUSH BP | ||
| 45 | MOV BP,SP | ||
| 46 | If (not sharef) and (not redirector) | ||
| 47 | Table segment | ||
| 48 | a db fmts,0 | ||
| 49 | Table ends | ||
| 50 | MOV AX,OFFSET DOSGROUP:a | ||
| 51 | else | ||
| 52 | jmp short b | ||
| 53 | a db fmts,0 | ||
| 54 | if sharef | ||
| 55 | b: mov ax,offset share:a | ||
| 56 | else | ||
| 57 | b: mov ax,offset netwrk:a | ||
| 58 | endif | ||
| 59 | endif | ||
| 60 | PUSH AX | ||
| 61 | cargs = 2 | ||
| 62 | IRP item,<args> | ||
| 63 | IFIDN <AX>,<item> | ||
| 64 | MOV AX,[BP+2] | ||
| 65 | ELSE | ||
| 66 | MOV AX,item | ||
| 67 | ENDIF | ||
| 68 | PUSH AX | ||
| 69 | cargs = cargs + 2 | ||
| 70 | ENDM | ||
| 71 | invoke PFMT | ||
| 72 | ADD SP,Cargs | ||
| 73 | POP BP | ||
| 74 | POP AX | ||
| 75 | POPF | ||
| 76 | ENDM | ||
| 77 | |||
| 78 | segFrame Struc | ||
| 79 | segbp DW ? | ||
| 80 | segip DW ? | ||
| 81 | segmes dw ? | ||
| 82 | segtemp DW ? | ||
| 83 | segFrame ENDS | ||
| 84 | ; | ||
| 85 | ; SegCheck - assure that segments are correctly set up | ||
| 86 | ; | ||
| 87 | ; Inputs: top of stack points to: | ||
| 88 | ; 2-byte jump | ||
| 89 | ; byte flags 04h is ES 02h is DS 01 is CS/SS | ||
| 90 | ; offset asciz message | ||
| 91 | ; | ||
| 92 | ; Outputs: message to screen (via INT 29h) | ||
| 93 | ; Nothing modified (flags too) | ||
| 94 | |||
| 95 | Procedure SegCheck,NEAR | ||
| 96 | ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING | ||
| 97 | SaveReg <BP> | ||
| 98 | MOV BP,SP ; set up addressing | ||
| 99 | PUSHF | ||
| 100 | SaveReg <AX,BX,CX,DX> | ||
| 101 | MOV AL,BYTE PTR [BP].segtemp; get flags | ||
| 102 | MOV CX,SS | ||
| 103 | TEST AL,1 ; shall we use CS or SS? | ||
| 104 | JZ SegUseSS ; use SS | ||
| 105 | MOV CX,CS ; use CS instead | ||
| 106 | SegUseSS: | ||
| 107 | TEST AL,2 ; do we check DS? | ||
| 108 | JZ SegTestES ; no, go check ES | ||
| 109 | MOV DX,DS | ||
| 110 | CMP CX,DX | ||
| 111 | JZ SegTestES ; DS is valid, go check ES | ||
| 112 | MOV AX,[BP].segmes | ||
| 113 | zfmt <"Assumed DS invalid $s\n">,<AX> | ||
| 114 | SegTestES: | ||
| 115 | TEST AL,4 ; do we check ES? | ||
| 116 | JZ SegTestDone ; no, all done | ||
| 117 | MOV DX,ES | ||
| 118 | CMP CX,DX | ||
| 119 | JZ SegTestDone ; ES is valid, all done | ||
| 120 | MOV AX,[BP].segmes | ||
| 121 | zfmt <"Assumed ES invalid $s\n">,<AX> | ||
| 122 | SegTestDone: | ||
| 123 | RestoreReg <DX,CX,BX,AX> | ||
| 124 | POPF | ||
| 125 | RestoreReg <BP> | ||
| 126 | ret 4 ; release message, temp | ||
| 127 | EndProc SegCheck | ||
| 128 | |||
| 129 | |||
| 130 | IF NOT SHAREF | ||
| 131 | I_need DPBHead,DWORD | ||
| 132 | I_need BuffHead,DWORD | ||
| 133 | I_need sftFCB,DWORD | ||
| 134 | I_need AuxStack,BYTE | ||
| 135 | I_need IOStack,BYTE | ||
| 136 | I_need renbuf,byte | ||
| 137 | I_need CurrentPDB,WORD | ||
| 138 | I_need User_In_AX,WORD | ||
| 139 | |||
| 140 | extrn ECritDisk:NEAR | ||
| 141 | |||
| 142 | CritNOP label byte | ||
| 143 | RET | ||
| 144 | |||
| 145 | AstFrame STRUC | ||
| 146 | Astbp dw ? | ||
| 147 | Astip dw ? | ||
| 148 | Astmes dw ? | ||
| 149 | Astarg dd ? | ||
| 150 | AstFrame ENDS | ||
| 151 | |||
| 152 | Public SGCHK001S,SGCHK001E | ||
| 153 | SGCHK001S label byte | ||
| 154 | DPBMes DB "DPB assertion failed: ",0 | ||
| 155 | BUFMes DB "BUF assertion failed: ",0 | ||
| 156 | SFTMes DB "SFT assertion failed: ",0 | ||
| 157 | BlankSp DB " ",0 | ||
| 158 | Colon DB ":",0 | ||
| 159 | |||
| 160 | Msg DW ? | ||
| 161 | |||
| 162 | SGCHK001E label byte | ||
| 163 | |||
| 164 | Table segment | ||
| 165 | Extrn SectPDB:WORD, SectRef:WORD | ||
| 166 | Table ends | ||
| 167 | |||
| 168 | ; DPBCheck - validate a supposed DPB pointer | ||
| 169 | ; Inputs: Pushed arguments | ||
| 170 | ; Outputs: Message to screen | ||
| 171 | ; Registers modified: none | ||
| 172 | |||
| 173 | Procedure DPBCheck,NEAR | ||
| 174 | MOV Msg,OFFSET DOSGroup:DPBMes | ||
| 175 | SaveReg <BP> | ||
| 176 | MOV BP,SP | ||
| 177 | PUSHF | ||
| 178 | SaveReg <AX,BX,DS,SI,ES,DI> | ||
| 179 | LES DI,DPBHead | ||
| 180 | LDS SI,[BP].Astarg | ||
| 181 | DPBLoop:CMP DI,-1 | ||
| 182 | JZ DPBNotFound | ||
| 183 | invoke PointComp | ||
| 184 | JZ DPBRet | ||
| 185 | LES DI,ES:[DI.dpb_next_dpb] | ||
| 186 | JMP DPBLoop | ||
| 187 | DPBNotFound: | ||
| 188 | MOV AX,[BP].Astmes | ||
| 189 | zfmt <"$s$x:$x $s\n">,<msg,ds,si,AX> | ||
| 190 | CLI | ||
| 191 | a: JMP a ; slam the door. | ||
| 192 | DPBRet: RestoreReg <DI,ES,SI,DS,BX,AX> ; Done: | ||
| 193 | POPF | ||
| 194 | RestoreReg <BP> | ||
| 195 | RET 6 | ||
| 196 | EndProc DPBCheck | ||
| 197 | |||
| 198 | ; SFTCheck - validate a supposed SFT pointer | ||
| 199 | ; Inputs: Pushed arguments | ||
| 200 | ; Outputs: Message to screen | ||
| 201 | ; Registers modified: none | ||
| 202 | |||
| 203 | Procedure SFTCheck,NEAR | ||
| 204 | MOV Msg,OFFSET DOSGroup:SFTMes | ||
| 205 | SaveReg <BP> | ||
| 206 | MOV BP,SP | ||
| 207 | PUSHF | ||
| 208 | SaveReg <AX,BX,DS,SI,ES,DI> | ||
| 209 | LDS SI,[BP].Astarg | ||
| 210 | XOR BX,BX ; i = 0; | ||
| 211 | SFTLoop: | ||
| 212 | SaveReg <BX> | ||
| 213 | invoke SFFromSFN ; while ((d=SF(i)) != NULL) | ||
| 214 | RestoreReg <BX> | ||
| 215 | JC Sft1 | ||
| 216 | invoke PointComp | ||
| 217 | JZ DPBRet ; goto Done; | ||
| 218 | SFTNext:INC BX ; else | ||
| 219 | JMP SFTLoop ; i++; | ||
| 220 | SFT1: LES DI,sftFCB | ||
| 221 | MOV BX,ES:[DI.sfCount] | ||
| 222 | LEA DI,[DI.sfTable] | ||
| 223 | SFT2: | ||
| 224 | invoke PointComp | ||
| 225 | DPBRETJ:JZ DPBRet | ||
| 226 | ADD DI,SIZE sf_entry | ||
| 227 | DEC BX | ||
| 228 | JNZ SFT2 | ||
| 229 | ; | ||
| 230 | ; The SFT is not in the allocated tables. See if it is one of the static | ||
| 231 | ; areas. | ||
| 232 | ; | ||
| 233 | Context ES | ||
| 234 | MOV DI,OFFSET DOSGROUP:AUXSTACK - SIZE SF_ENTRY | ||
| 235 | Invoke PointComp | ||
| 236 | JZ DPBRet | ||
| 237 | MOV DI,OFFSET DOSGROUP:RenBuf | ||
| 238 | Invoke PointComp | ||
| 239 | JZ DPBRetj | ||
| 240 | DPBNotFoundJ: | ||
| 241 | JMP DPBNotFound | ||
| 242 | EndProc SFTCheck | ||
| 243 | |||
| 244 | ; BUFCheck - validate a supposed BUF pointer | ||
| 245 | ; Inputs: Pushed arguments | ||
| 246 | ; Outputs: Message to screen | ||
| 247 | ; Registers modified: none | ||
| 248 | |||
| 249 | Procedure BUFCheck,NEAR | ||
| 250 | MOV Msg,OFFSET DOSGroup:BUFMes | ||
| 251 | SaveReg <BP> | ||
| 252 | MOV BP,SP | ||
| 253 | PUSHF | ||
| 254 | SaveReg <AX,BX,DS,SI,ES,DI> | ||
| 255 | ; | ||
| 256 | ; CheckDisk - make sure that we are in the disk critical section... | ||
| 257 | ; | ||
| 258 | MOV AL,BYTE PTR ECritDisk | ||
| 259 | CMP AL,CritNOP | ||
| 260 | JZ CheckDone | ||
| 261 | MOV AX,CurrentPDB | ||
| 262 | CMP SectPDB + 2 * critDisk,AX | ||
| 263 | MOV AX,[BP].astmes | ||
| 264 | JZ CheckRef | ||
| 265 | zfmt <"$p: $x $s critDisk owned by $x\n">,<User_In_AX,AX,SectPDB+2*critDisk> | ||
| 266 | CheckRef: | ||
| 267 | CMP SectRef + 2 * critDisk,0 | ||
| 268 | JNZ CheckDone | ||
| 269 | zfmt <"$p: $x $s critDisk ref count is 0\n">,<User_In_AX,AX> | ||
| 270 | CheckDone: | ||
| 271 | |||
| 272 | LDS SI,[BP].Astarg | ||
| 273 | LES DI,BUFFHead | ||
| 274 | BUFLoop:CMP DI,-1 | ||
| 275 | JZ DPBNotFoundJ | ||
| 276 | invoke PointComp | ||
| 277 | JNZ BufNext | ||
| 278 | JMP DPBRet | ||
| 279 | BufNext: | ||
| 280 | LES DI,ES:[DI.buf_link] | ||
| 281 | JMP BUFLoop | ||
| 282 | EndProc BUFCheck | ||
| 283 | |||
| 284 | CODE ENDS | ||
| 285 | ELSE | ||
| 286 | SHARE ENDS | ||
| 287 | ENDIF | ||
| 288 | END | ||