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

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

Reworked the pre-MENU display stuff [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: 16.7 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]
366 mov [CFG_CheckConfig], bx
367 PCCC_Loop:
368 call MBR_GetCheckOfSector
369 loop PCCC_Loop
370 cmp bx, dx
371 jne PCCC_Failed
372 mov CFG_CheckConfig, dx
373 ret
374 PCCC_Failed:
375 mov si, offset TXT_ERROR_CheckConfig
376 call MBR_Teletype
377 mov si, offset TXT_ERROR_CheckFailed
378 call MBR_Teletype
379 jmp MBR_HaltSystem
380PRECRAP_CheckConfiguration EndP
381
382
383; Rousseau: added
384; In: SI - Pointer to begin of string (EOS is 0)
385; Destroyed: SI
386; Fixme: Uses double writes to use attribute with teletype-function.
387MBR_TeletypeBold Proc Near Uses ax bx cx
388 MBRT_LoopBold:
389 lodsb
390 or al, al
391 jz MBRT_EndBold
392 push ax
393 mov ah,09h
394 mov bx,15
395 mov cx,1
396 int 10h
397 pop ax
398 mov ah,0eh
399 mov bx,7 ; Does not do anything in text-modus
400 mov cx,1
401 int 10h
402 jmp MBRT_LoopBold
403 MBRT_EndBold:
404 ret
405MBR_TeletypeBold EndP
406
407
408; In: SI - Pointer to begin of string (EOS is 0)
409; Destroyed: SI
410; Fixme: Uses double writes to use attribute with teletype-function.
411MBR_TeletypeVolName Proc Near Uses ax bx cx
412 mov cx, 11
413 MBRT_LoopVolName:
414 mov dx,cx ; Backup counter
415 lodsb
416 or al, al
417 jz MBRT_EndVolName
418 push ax
419 mov ah,09h
420 mov bx,15
421 mov cx,1
422 int 10h ; DX is preserved
423 pop ax
424 mov ah,0eh
425 mov bx,7 ; Does not do anything in text-modus
426 mov cx,1
427 int 10h ; DX is preserved
428 mov cx,dx ; Restore counter
429 loop MBRT_LoopVolName
430 MBRT_EndVolName:
431 ret
432MBR_TeletypeVolName EndP
433
434; Rousseau: added
435; Move cursor to next line
436; Just do a new-line if SI==0
437MBR_TeletypeNL Proc Near Uses ax bx cx
438 test si,si
439 jz MBR_TeletypeNL_NL
440 call MBR_Teletype
441 MBR_TeletypeNL_NL:
442 push si
443 mov si, offset NL
444 call MBR_Teletype
445 pop si
446 ret
447MBR_TeletypeNL EndP
448
449; Sync teletype position to VideoIO
450MBR_TeletypeSyncPos Proc Near Uses ax bx cx dx
451 pushf
452 mov bh, 0
453 mov ah, 02h
454 mov dh,byte ptr [TextPosY]
455 mov dl,byte ptr [TextPosX]
456 int 10h
457 popf
458 ret
459MBR_TeletypeSyncPos EndP
460
461;------------------------------------------------------------------------------
462; Check if a memory block is all zeros
463;------------------------------------------------------------------------------
464; IN : BX pointer to memblock
465; : CX length to check, zero length is interpreted as block is zero
466; OUT : ZF=1 block if all zeros
467; NOTE : Segment used is DS, which should be the same as ES
468;------------------------------------------------------------------------------
469IsMemBlockZero Proc Near Uses ax di es
470 push ds ; Segment to use
471 pop es ; Pop in ES because ES is required for scasb
472 mov di, bx ; Pointer to memblock
473 xor al, al ; Compare to zero
474 cld ; Direction upwards
475 repe scasb ; Scan the block, will leave ZF=1 if all zeros
476 ret
477IsMemBlockZero EndP
478
479;------------------------------------------------------------------------------
480; Check if a loaded sector is all zeros
481;------------------------------------------------------------------------------
482; IN : SI pointer to sector buffer
483; OUT : ZF=1 block if all zeros
484; NOTE : Segment used is DS
485;------------------------------------------------------------------------------
486IsSectorBufferZero Proc Near Uses bx cx
487 mov bx, si ; Address of sector buffer
488 mov cx, sector_size ; Normal size of a sector (512 bytes)
489 call IsMemBlockZero ; Check the memory block
490 ret
491IsSectorBufferZero EndP
492
493;------------------------------------------------------------------------------
494; Fill a memory block with a specific value
495;------------------------------------------------------------------------------
496; IN : AL value to fill block with
497; : BX pointer to memblock
498; : CX length to fill, 0 fills nothing
499; OUT : ZF=1 if fill value was 0
500; NOTE : Segment used is DS
501;------------------------------------------------------------------------------
502FillMemBlock Proc Near Uses cx di es
503 push ds ; Segment to use
504 pop es ; Pop in ES because ES is required for scasb
505 mov di, bx ; Pointer to memblock
506 cld ; Direction upwards
507 rep stosb ; Fill the memory block with value in AL
508 test al, al ; Set ZR if fill value used is 0
509 ret
510FillMemBlock EndP
511
512;------------------------------------------------------------------------------
513; Fill a memory block with zeros
514;------------------------------------------------------------------------------
515; IN : BX pointer to memblock
516; : CX length to fill, 0 fills nothing
517; OUT : Nothing
518; NOTE : Segment used is DS
519;------------------------------------------------------------------------------
520ClearMemBlock Proc Near Uses ax
521 xor al, al ; Fill value
522 call FillMemBlock ; Fill the memory block
523 ret
524ClearMemBlock EndP
525
526;------------------------------------------------------------------------------
527; Clears a sector buffer
528;------------------------------------------------------------------------------
529; IN : SI pointer to sector buffer
530; OUT : Nothing
531; NOTE : Segment used is DS
532;------------------------------------------------------------------------------
533ClearSectorBuffer Proc Near Uses bx cx
534 mov bx, si ; Address of sector buffer
535 mov cx, sector_size ; Normal size of a sector (512 bytes)
536 call ClearMemBlock ; Clear the sector buffer
537 ret
538ClearSectorBuffer EndP
539
Note: See TracBrowser for help on using the repository browser.