source: trunk/bootcode/regular/other.asm@ 216

Last change on this file since 216 was 200, checked in by Ben Rietbroek, 8 years ago

Also apply 'CRC_IGNORE' build option to configuration [v1.1.1-testing]

CAUTION:
This is a testbuild !
AirBoot uses the BIOS to access disks and a small coding error can trash
partition tables or other vital disk structures. You are advised to make
backups of TRACK0 and EBRs before using this testbuild. More info at:
https://rousseaux.github.io/netlabs.air-boot/pdf/AirBoot-v1.1.0-manual.pdf

File size: 17.5 KB
Line 
1; AiR-BOOT (c) Copyright 1998-2008 M. Kiewitz
2;
3; This file is part of AiR-BOOT
4;
5; AiR-BOOT is free software: you can redistribute it and/or modify it under
6; the terms of the GNU General Public License as published by the Free
7; Software Foundation, either version 3 of the License, or (at your option)
8; any later version.
9;
10; AiR-BOOT is distributed in the hope that it will be useful, but WITHOUT ANY
11; WARRANTY: without even the implied warranty of MERCHANTABILITY or FITNESS
12; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13; details.
14;
15; You should have received a copy of the GNU General Public License along with
16; AiR-BOOT. If not, see <http://www.gnu.org/licenses/>.
17;
18;---------------------------------------------------------------------------
19; AiR-BOOT / OTHER ROUTINES
20;---------------------------------------------------------------------------
21
22IFDEF MODULE_NAMES
23DB 'OTHER',0
24ENDIF
25
26; In: DS:SI - Pointer to begin of string
27; CX - Len of string
28; Out: CX - Supposed real len of string
29; Zero Flag set if nul string
30; Destroyed: None
31GetLenOfName Proc Near Uses ax si
32 add si, cx
33 dec si
34 GLON_NameLoop:
35 mov al, ds:[si]
36 dec si
37 cmp al, 32
38 ja GLON_EndLoop
39 dec cx
40 jnz GLON_NameLoop
41 GLON_EndLoop:
42 or cx, cx
43 ret ; return supposed len
44GetLenOfName EndP
45
46; In: DS:SI - Pointer to NUL-terminated string
47; Out: CX - Length of string
48; Zero Flag set if nul string
49; Destroyed: None
50GetLenOfString Proc Near Uses ax si
51 xor cx, cx
52 GLOS_StringLoop:
53 lodsb
54 or al, al
55 jz GLOS_EndOfString
56 inc cx
57 jmp GLOS_StringLoop
58
59 GLOS_EndOfString:
60 or cx, cx
61 ret
62GetLenOfString EndP
63
64; In: DS:SI - Pointer to NUL-terminated strings
65; CL - Counter, how many strings to count
66; Out: CX - Length of strings
67; Destroyed: None
68GetLenOfStrings Proc Near Uses bx dx si
69 mov dh, cl
70 xor dl, dl
71 GLOSS_StringsLoop:
72 call GetLenOfString
73 add dl, cl
74 add si, cx
75 inc si
76 dec dh
77 jnz GLOSS_StringsLoop
78 ;movzx cx, dl
79 mov cl,dl
80 mov ch,0
81 ret
82GetLenOfStrings EndP
83
84
85
86;
87; DO PREPARING STUFF.
88;
89PRECRAP_Main Proc Near
90
91IFDEF AUX_DEBUG
92 IF 0
93 DBG_TEXT_OUT_AUX 'PRECRAP_Main:'
94 PUSHRF
95 ;~ call DEBUG_DumpRegisters
96 ;~ call AuxIO_DumpParagraph
97 ;~ call AuxIO_TeletypeNL
98 POPRF
99 ENDIF
100ENDIF
101
102 ;
103 ; Tasm needs .386 to handle 32-bit constants so we push the current
104 ; operating state and switch temporarily to handle
105 ; InitialFreeDriveletterMap.
106 ;
107 IFDEF TASM
108 pushstate
109 .386
110 ENDIF
111 ; Initialize the FreeDriveletterMap.
112 ; This is used by driveletter reassignment functions.
113 mov di, offset [FreeDriveletterMap]
114 mov ax, InitialFreeDriveletterMap AND 0ffffh
115 cld
116 stosw
117 mov ax, InitialFreeDriveletterMap SHR 16
118 stosw
119 ;
120 ; Restore Tasm operating state.
121 ;
122 IFDEF TASM
123 popstate
124 ENDIF
125
126
127 ; Use video page 0 for screen output
128 mov word ptr [VideoIO_Segment], VideoIO_Page0
129
130 ; Don't use blinking attribute
131 call VideoIO_NoBlinking
132
133 ; Get HardDriveCount
134 call DriveIO_GetHardDriveCount
135
136
137 ; Rousseau: added
138 call VideoIO_ClearScreen
139
140 ; Cursor to upper-left
141 mov byte ptr [TextPosX], 0
142 mov byte ptr [TextPosY], 0
143 call VideoIO_CursorSet
144
145 ;~ mov ax, VideoIO_Page1
146 ;~ call VideoIO_BackUpTo ; Copy BIOS POST to Second Page
147
148 ; Copyright
149 mov si, [offset Copyright]
150 call VideoIO_Print
151 inc [TextPosY]
152 mov [TextPosX], 0
153 call MBR_TeletypeSyncPos
154
155 ;call SOUND_Beep
156
157 ; Show build info
158 call VideoIO_PrintBuildInfo
159
160 ; Let user know we started scanning...
161IFDEF AUX_DEBUG
162 xor si, si
163 call MBR_TeletypeNL
164ENDIF
165 mov si, offset [scanning_txt]
166 call MBR_TeletypeBold
167
168; Show message if com-port debugging is active
169IFDEF AUX_DEBUG
170 ; Don't show message if com-port debugging is not active
171 mov dx, [BIOS_AuxParms]
172 test dl, dl
173 jz @F
174
175 ; Show initialization message
176 mov ah, [TextPosY]
177 mov [TextPosY], 2
178 mov si, offset AuxInitMsg
179 ;~ call MBR_Teletype
180 call VideoIO_Print
181
182 ; Sync output position
183 ;~ call VideoIO_SyncPos
184
185 ; Show port number
186 mov al, dl
187 call VideoIO_PrintByteDynamicNumber
188 mov [TextPosY], ah
189 @@:
190ENDIF
191
192 ; Calculate Cooper-Bar Tables
193 IFDEF FX_ENABLED
194 call FX_CalculateTables
195 ENDIF
196
197 ; Calculate LVM-CRC-Table
198 call LVM_InitCRCTable
199
200 ; Get HardDriveCount
201 call DriveIO_GetHardDriveCount
202
203 ; Calculate CHS/LBA Switch Table
204 call DriveIO_InitLBASwitchTable
205
206 ; Setup PartitionPointers-Table
207 call PART_CalculateStraightPartPointers
208
209 ; Setup Cyrillic Charset, if needed
210 IFDEF TXT_IncludeCyrillic
211 call CHARSET_IncludeCyrillic
212 ENDIF
213
214
215 ; This sets [CurIO_UseExtension] flag.
216 call DriveIO_CheckFor13extensions
217 mov al,[CurIO_UseExtension]
218 test al,al
219 jnz INT13X_Supported
220
221 ;
222 ; Show Message that BIOS INT13X is not supported
223 ; and Halt the System.
224 ;
225 mov cx, 0C04h
226 mov si, offset TXT_NoINT13XSupport
227 call SETUP_ShowErrorBox
228
229 ; Halt the system.
230 jmp HaltSystem
231
232
233 ;
234 ; INT13X Supported so continue.
235 ;
236 INT13X_Supported:
237
238
239 ;
240 ; Setup the size of the INT13X Disk Address Packet
241 ;
242 mov [INT13X_DAP], INT13X_DAP_Size
243
244 ;
245 ; Check valididy of the AiR-BOOT Configuration.
246 ;
247 call PRECRAP_CheckConfiguration
248
249
250 ; =======================================
251 ; Checks for MBR Virii :) I love that job
252 ; =======================================
253 test byte ptr [CFG_DetectStealth], 1
254 jz PCM_NoStealthDetection
255 call VIRUS_CheckForStealth
256 PCM_NoStealthDetection:
257 test byte ptr [CFG_DetectVirus], 1
258 jz PCM_NoVirusDetection
259 call VIRUS_CheckForVirus
260 PCM_NoVirusDetection:
261
262
263 ; ============================================
264 ; Delay for some time and get Strg/Alt State
265 ; ============================================
266 test byte ptr [CFG_CooperBars], 1
267 jnz PCM_ShortDelay
268 mov al, 27 ; About 1.5 seconds
269 test byte ptr [CFG_FloppyBootGetName], 1
270 jz PCM_LongDelay
271 PCM_ShortDelay:
272
273 mov al, 13 ; shorten delay,if floppy gets accessed
274 PCM_LongDelay:
275
276 call TIMER_WaitTicCount
277
278 ; First check, if any normal key got pressed...
279 mov ah, 1
280 int 16h
281 jz PCM_NoNormalKeyPressed
282 ; User doesn't know what to do...or he is crazy <g> so display message
283 mov si, offset TXT_HowEnterSetup
284 call MBR_Teletype
285 mov al, 54 ; about 3 seconds, delay again
286
287 call TIMER_WaitTicCount
288
289 PCM_NoNormalKeyPressed:
290 ; Now get keyboard Strg/Alt State
291 mov ah, 02h
292 int 16h
293 mov [SETUP_KeysOnEntry], al
294
295 ; Copy device-name to the ContBIOSbootSeq-IPT entry
296 ; We may not do this before PRECRAP_CheckConfiguration, because otherwise
297 ; this check will fail.
298 call PART_UpdateResumeBIOSName
299 ret
300PRECRAP_Main EndP
301
302
303
304
305AFTERCRAP_Main Proc Near
306
307IFDEF AUX_DEBUG
308 IF 0
309 DBG_TEXT_OUT_AUX 'AFTERCRAP_Main:'
310 PUSHRF
311 ;~ call DEBUG_DumpRegisters
312 ;~ call AuxIO_DumpParagraph
313 ;~ call AuxIO_TeletypeNL
314 POPRF
315 ENDIF
316ENDIF
317
318 ; ===================================================
319 ; Now get volume label of FloppyDrive, if wanted...
320 ; ===================================================
321 test byte ptr [CFG_FloppyBootGetName], 1
322 jz ACM_NoFloppyGetName
323 call DriveIO_UpdateFloppyName
324 or ax, ax
325 jnz ACM_NoFloppyGetName
326 ; Try a second time, if it failed to detect the Floppy
327 call DriveIO_UpdateFloppyName
328 ACM_NoFloppyGetName:
329 ret
330AFTERCRAP_Main EndP
331
332
333; Checks Configuration CheckSum...Displays message, if failed.
334PRECRAP_CheckConfiguration Proc Near Uses ds si es di
335
336IFDEF AUX_DEBUG
337 IF 0
338 DBG_TEXT_OUT_AUX 'PRECRAP_CheckConfiguration:'
339 PUSHRF
340 ;~ call DEBUG_DumpRegisters
341 ;~ call AuxIO_DumpParagraph
342 ;~ call AuxIO_TeletypeNL
343 POPRF
344 ENDIF
345ENDIF
346
347 mov si, offset Configuration
348 xor bx, bx
349
350 ; Changed from 5 to calculated value (not here, see compat. issue below)
351 ; Fixes issue: #2987 -- "air-boot doesn't remember drive letter"
352 ; Size of the ab-configuration in 512 byte sectors
353 ; mov cx, (MBR_BackUpMBR - Configuration) / 200h
354
355 ; AB v1.07 stores a 5 sector configuration with a 5 sector checksum.
356 ; AB v1.0.8+ *should* stores a 7 sector configuration with a
357 ; 7 sector checksum.
358 ; Because 5 was hardcoded here, SET(A)BOOT v1.07 will see see an AB v1.0.8+
359 ; config as corrupted, while this is not the case.
360 ; So, for compatibility reasons, in v1.0.8+, the checksum stored is over
361 ; 5 sectors, to be compatible with v1.07.
362 ; This may change (be corrected) in future versions !
363 mov cx,5
364
365 mov dx, [CFG_CheckConfig] ; Get current CRC for configuration
366 mov [CFG_CheckConfig], bx ; Mark it as invalid
367 PCCC_Loop:
368 call MBR_GetCheckOfSector ; Calculate CRC
369 loop PCCC_Loop
370 cmp bx, dx ; Validate CRC
371
372 ;
373 ; The CRC is calculated and inserted in the loader image when
374 ; AiR-BOOT is installed. Ignoring the CRC enables manually
375 ; merging the loader without using the installer. This is used
376 ; for debugging in virtual machines, where it is easy to
377 ; merge the loader to the disk image of the VM.
378 ;
379IFNDEF CRC_IGNORE
380 jne PCCC_Failed ; Validation failed, halt AiR-BOOT
381ENDIF
382
383 mov CFG_CheckConfig, dx ; Restore the valid CRC
384 ret
385
386 ;
387 ; CRC validation for the configuration failed.
388 ; Inform the user of this and halt the system.
389 ;
390 PCCC_Failed:
391 mov si, offset TXT_ERROR_CheckConfig
392 call MBR_Teletype
393 mov si, offset TXT_ERROR_CheckFailed
394 call MBR_Teletype
395 jmp MBR_HaltSystem
396PRECRAP_CheckConfiguration EndP
397
398
399; Rousseau: added
400; In: SI - Pointer to begin of string (EOS is 0)
401; Destroyed: SI
402; Fixme: Uses double writes to use attribute with teletype-function.
403MBR_TeletypeBold Proc Near Uses ax bx cx
404 MBRT_LoopBold:
405 lodsb
406 or al, al
407 jz MBRT_EndBold
408 push ax
409 mov ah,09h
410 mov bx,15
411 mov cx,1
412 int 10h
413 pop ax
414 mov ah,0eh
415 mov bx,7 ; Does not do anything in text-modus
416 mov cx,1
417 int 10h
418 jmp MBRT_LoopBold
419 MBRT_EndBold:
420 ret
421MBR_TeletypeBold EndP
422
423
424; In: SI - Pointer to begin of string (EOS is 0)
425; Destroyed: SI
426; Fixme: Uses double writes to use attribute with teletype-function.
427MBR_TeletypeVolName Proc Near Uses ax bx cx
428 mov cx, 11
429 MBRT_LoopVolName:
430 mov dx,cx ; Backup counter
431 lodsb
432 or al, al
433 jz MBRT_EndVolName
434 push ax
435 mov ah,09h
436 mov bx,15
437 mov cx,1
438 int 10h ; DX is preserved
439 pop ax
440 mov ah,0eh
441 mov bx,7 ; Does not do anything in text-modus
442 mov cx,1
443 int 10h ; DX is preserved
444 mov cx,dx ; Restore counter
445 loop MBRT_LoopVolName
446 MBRT_EndVolName:
447 ret
448MBR_TeletypeVolName EndP
449
450; Rousseau: added
451; Move cursor to next line
452; Just do a new-line if SI==0
453MBR_TeletypeNL Proc Near Uses ax bx cx
454 test si,si
455 jz MBR_TeletypeNL_NL
456 call MBR_Teletype
457 MBR_TeletypeNL_NL:
458 push si
459 mov si, offset NL
460 call MBR_Teletype
461 pop si
462 ret
463MBR_TeletypeNL EndP
464
465; Sync teletype position to VideoIO
466MBR_TeletypeSyncPos Proc Near Uses ax bx cx dx
467 pushf
468 mov bh, 0
469 mov ah, 02h
470 mov dh,byte ptr [TextPosY]
471 mov dl,byte ptr [TextPosX]
472 int 10h
473 popf
474 ret
475MBR_TeletypeSyncPos EndP
476
477;------------------------------------------------------------------------------
478; Check if a memory block is all zeros
479;------------------------------------------------------------------------------
480; IN : BX pointer to memblock
481; : CX length to check, zero length is interpreted as block is zero
482; OUT : ZF=1 block if all zeros
483; NOTE : Segment used is DS, which should be the same as ES
484;------------------------------------------------------------------------------
485IsMemBlockZero Proc Near Uses ax di es
486 push ds ; Segment to use
487 pop es ; Pop in ES because ES is required for scasb
488 mov di, bx ; Pointer to memblock
489 xor al, al ; Compare to zero
490 cld ; Direction upwards
491 repe scasb ; Scan the block, will leave ZF=1 if all zeros
492 ret
493IsMemBlockZero EndP
494
495;------------------------------------------------------------------------------
496; Check if a loaded sector is all zeros
497;------------------------------------------------------------------------------
498; IN : SI pointer to sector buffer
499; OUT : ZF=1 block if all zeros
500; NOTE : Segment used is DS
501;------------------------------------------------------------------------------
502IsSectorBufferZero Proc Near Uses bx cx
503 mov bx, si ; Address of sector buffer
504 mov cx, sector_size ; Normal size of a sector (512 bytes)
505 call IsMemBlockZero ; Check the memory block
506 ret
507IsSectorBufferZero EndP
508
509;------------------------------------------------------------------------------
510; Fill a memory block with a specific value
511;------------------------------------------------------------------------------
512; IN : AL value to fill block with
513; : BX pointer to memblock
514; : CX length to fill, 0 fills nothing
515; OUT : ZF=1 if fill value was 0
516; NOTE : Segment used is DS
517;------------------------------------------------------------------------------
518FillMemBlock Proc Near Uses cx di es
519 push ds ; Segment to use
520 pop es ; Pop in ES because ES is required for scasb
521 mov di, bx ; Pointer to memblock
522 cld ; Direction upwards
523 rep stosb ; Fill the memory block with value in AL
524 test al, al ; Set ZR if fill value used is 0
525 ret
526FillMemBlock EndP
527
528;------------------------------------------------------------------------------
529; Fill a memory block with zeros
530;------------------------------------------------------------------------------
531; IN : BX pointer to memblock
532; : CX length to fill, 0 fills nothing
533; OUT : Nothing
534; NOTE : Segment used is DS
535;------------------------------------------------------------------------------
536ClearMemBlock Proc Near Uses ax
537 xor al, al ; Fill value
538 call FillMemBlock ; Fill the memory block
539 ret
540ClearMemBlock EndP
541
542;------------------------------------------------------------------------------
543; Clears a sector buffer
544;------------------------------------------------------------------------------
545; IN : SI pointer to sector buffer
546; OUT : Nothing
547; NOTE : Segment used is DS
548;------------------------------------------------------------------------------
549ClearSectorBuffer Proc Near Uses bx cx
550 mov bx, si ; Address of sector buffer
551 mov cx, sector_size ; Normal size of a sector (512 bytes)
552 call ClearMemBlock ; Clear the sector buffer
553 ret
554ClearSectorBuffer EndP
555
Note: See TracBrowser for help on using the repository browser.