source: trunk/bootcode/setup/part_set.asm@ 231

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

Corrected check for successful LVM sector load [v1.1.1-testing]

The 'DriveIO_LoadLVMSector' function now uses disk i/o semantics,
meaning CY indicates failure and NC indicates success.

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: 59.1 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 SETUP / PARTITION SETUP
20;---------------------------------------------------------------------------
21
22IFDEF MODULE_NAMES
23DB 'PART_SET',0
24ENDIF
25
26; This here is called from Menu in AIR-BSET.asm
27PARTSETUP_Main Proc Near
28 ; Build Fixed Content...
29 call PARTSETUP_DrawMenuBase
30 ; Build Dynamic Content...
31 mov dl, PartSetup_ActivePart
32 mov dh, dl ; DL - Current Active, DH - New Active
33 call PARTSETUP_RefreshPartitions
34 ; Show Choice-Bar at DH...
35 call PARTSETUP_BuildChoiceBar
36
37 ; Now we got everything on-the-screen
38 PSM_MainLoop:
39 push dx
40 mov ah, 0
41 int 16h
42 pop dx
43
44 ;
45 ; INSERT DEBUG KEYHANDLER HERE ?
46 ;
47
48 cmp ah, Keys_Up
49 je PSM_KeyUp
50 cmp ah, Keys_Down
51 je PSM_KeyDown
52 cmp ah, Keys_Left
53 je PSM_KeyLeft
54 cmp ah, Keys_Right
55 je PSM_KeyRight
56 cmp ah, Keys_ESC
57 je PSM_KeyESC
58 cmp ah, Keys_F1
59 je PSM_KeyF1
60 cmp ah, Keys_ENTER
61 je PSM_KeyENTER
62 ; Flags-Change
63 and al, 0DFh ; Upper-Case Input
64 cmp al, TXT_SETUP_FlagLetterBootable
65 je PSM_KeyBootAble
66 cmp al, TXT_SETUP_FlagLetterVIBR
67 je PSM_KeyVIBRdetection
68 cmp al, TXT_SETUP_FlagLetterHide
69
70 jne skip_x
71 jmp PSM_KeyHiddenSetup
72 skip_x:
73 cmp al, TXT_SETUP_FlagLetterDrvLetter
74
75 jne skip_y
76 jmp PSM_KeyDriveLetterForceSetup
77 skip_y:
78
79 cmp al, TXT_SETUP_FlagLetterExtMShack
80 jne skip_z
81 jmp PSM_KeyDriveLetterExtMShack
82 skip_z:
83 jmp PSM_MainLoop
84
85 PSM_KeyESC:
86 ; Simpy exit this menu...
87 mov PartSetup_ActivePart, dl
88 ret
89
90 PSM_KeyUp:
91 cmp dh, 1
92 jbe PSM_MainLoop
93 sub dh, 2
94 call PARTSETUP_BuildChoiceBar
95 jmp PSM_MainLoop
96
97 PSM_KeyDown:
98 add dh, 2
99 call PARTSETUP_BuildChoiceBar
100 jmp PSM_MainLoop
101
102 PSM_KeyLeft:
103 xor dh, 1
104 call PARTSETUP_BuildChoiceBar
105 jmp PSM_MainLoop
106
107 PSM_KeyRight:
108 xor dh, 1
109 call PARTSETUP_BuildChoiceBar
110 jmp PSM_MainLoop
111
112 PSM_KeyF1:
113 mov bx, offset TXT_SETUPHELP_InPartitionSetup
114 call SETUP_ShowHelp ; Shows help
115 jmp PSM_MainLoop
116
117 ; Disabling editing for type 0x35 is currently implemented
118 ; in PARTSETUP_ChangePartitionName.
119 PSM_KeyENTER:
120 call PARTSETUP_ChangePartitionName
121 ; Rebuild Menu...
122 call PARTSETUP_DrawMenuBase
123 call PARTSETUP_RefreshPartitions
124 call PARTSETUP_BuildChoiceBar
125 jmp PSM_MainLoop
126
127 PSM_KeyBootAble:
128 call PART_GetPartitionPointer ; Gets Partition (DL) Pointer -> SI
129 ; See if this is an OS/2 LVM Volume.
130 ; In that case, we don't allow it to be made bootable.
131 ; We also show a popup to inform the user.
132 call PARTSETUP_IsType35
133 je PSM_KeyBootAble_istype35
134
135 PSM_KeyBootAble_notype35:
136 mov al, [si+LocIPT_Flags]
137 xor al, Flags_Bootable
138 mov [si+LocIPT_Flags], al
139 call PARTSETUP_DrawPartitionInfo
140 call PARTSETUP_BuildChoiceBar
141 PSM_KeyBootAble_istype35:
142 jmp PSM_MainLoop
143
144 PSM_KeyVIBRdetection:
145 call PART_GetPartitionPointer ; Gets Partition (DL) Pointer -> SI
146 mov al, [si+LocIPT_Flags]
147 xor al, Flags_VIBR_Detection
148 mov [si+LocIPT_Flags], al
149 xor ax, ax
150 mov word ptr [si+LocIPT_BootRecordCRC], ax
151 call PARTSETUP_DrawPartitionInfo
152 call PARTSETUP_BuildChoiceBar
153 jmp PSM_MainLoop
154
155 PSM_KeyHiddenSetup:
156 call PARTHIDESETUP_Main
157 ; Rebuild Menu...
158 call PARTSETUP_DrawMenuBase
159 call PARTSETUP_RefreshPartitions
160 call PARTSETUP_BuildChoiceBar
161 jmp PSM_MainLoop
162
163 PSM_KeyDriveLetterForceSetup:
164 call PARTSETUP_DriveLetterSetup
165 ; Rebuild Menu...
166 call PARTSETUP_DrawMenuBase
167 call PARTSETUP_RefreshPartitions
168 call PARTSETUP_BuildChoiceBar
169 jmp PSM_MainLoop
170
171 PSM_KeyDriveLetterExtMShack:
172 call PART_GetPartitionPointer ; Gets Partition (DL) Pointer -> SI
173 mov al, [si+LocIPT_Flags]
174 xor al, Flags_ExtPartMShack
175 mov [si+LocIPT_Flags], al
176 call PARTSETUP_DrawPartitionInfo
177 call PARTSETUP_BuildChoiceBar
178 jmp PSM_MainLoop
179PARTSETUP_Main EndP
180
181
182; See if this is a partition of type 0x35 and display error
183; when user tries to set it as bootable.
184; IN: SI = Pointer to partition
185; OUT: ZF = Set if 0x35, clear otherwise
186PARTSETUP_IsType35 Proc Near
187 mov al, [si+LocIPT_SystemID]
188 cmp al, 35h
189 jne PARTSETUP_IsType35_end
190 pushf
191 pusha
192 ; Cannot boot LVM-Data partitions
193 mov cx, 0C04h
194 mov si, offset TXT_SETUP_NoBootType35
195 call SETUP_ShowErrorBox
196 popa
197 call PARTSETUP_DrawMenuBase
198 call PARTSETUP_RefreshPartitions
199 call PARTSETUP_BuildChoiceBar
200 popf
201 PARTSETUP_IsType35_end:
202 ret
203PARTSETUP_IsType35 EndP
204
205
206
207CLR_SETUP_PARTITION_LABELS_CLASSIC = 0b01h
208CLR_SETUP_PARTITION_LABELS_BM = 0b01h
209CLR_SETUP_PARTITION_LABELS_TB = 0b08h
210IFDEF TESTBUILD
211CLR_SETUP_PARTITION_LABELS = CLR_SETUP_PARTITION_LABELS_TB
212ELSE
213CLR_SETUP_PARTITION_LABELS = CLR_SETUP_PARTITION_LABELS_BM
214ENDIF
215
216; Draw all standard-things for Partition Setup, dynamic content not included.
217PARTSETUP_DrawMenuBase Proc Near Uses dx
218 call SETUP_DrawMenuWindow ; Standard Windows
219
220 ; 1st No Hd [09] Name [15] Flags [1D] Type
221 ; 2nd No Hd [31] Name [3D] Flags [45] Type
222
223 mov cx, 0508h
224 call VideoIO_Locate
225 inc TextPosX
226 mov al, TextChar_WinLineDown
227 mov cl, 9
228 call VideoIO_Internal_MakeWinDown ; Line between 1st No Hd and Name
229 mov cx, 0515h
230 call VideoIO_Locate
231 mov al, TextChar_WinLineDown
232 mov cl, 9
233 call VideoIO_Internal_MakeWinDown ; Line between 1st Name and Flags
234 mov cx, 051Dh
235 call VideoIO_Locate
236 mov al, TextChar_WinLineDown
237 mov cl, 9
238 call VideoIO_Internal_MakeWinDown ; Line between 1st Flags and Type
239
240 mov cx, 0531h ; Line between 2nd No Hd and Name
241 call VideoIO_Locate
242 mov al, TextChar_WinLineDown
243 mov cl, 9
244 call VideoIO_Internal_MakeWinDown
245 mov cx, 053Dh ; Line between 2nd Name and Flags
246 call VideoIO_Locate
247 mov al, TextChar_WinLineDown
248 mov cl, 9
249 call VideoIO_Internal_MakeWinDown
250 mov cx, 0545h ; Line between 2nd Flags and Type
251 call VideoIO_Locate
252 mov al, TextChar_WinLineDown
253 mov cl, 9
254 call VideoIO_Internal_MakeWinDown
255
256 mov cx, CLR_SETUP_PARTITION_LABELS ; F10-SETUP-PARTITION-SETUP labels bg
257 call VideoIO_Color
258
259 ; ------------------------------------- 1st Part
260 mov cx, 0503h
261 call VideoIO_Locate
262 mov si, offset TXT_TopInfos_No ; "No Hd"
263 mov cl, 5
264 call VideoIO_FixedPrint
265 mov cx, 050Bh
266 call VideoIO_Locate
267 mov si, offset TXT_TopInfos_Label ; "Label"
268 mov cl, 5
269 call VideoIO_FixedPrint
270 mov cx, 0517h
271 call VideoIO_Locate
272 mov si, offset TXT_TopInfos_Flags ; "Flags"
273 mov cl, 5
274 call VideoIO_FixedPrint
275 mov cx, 051Fh
276 call VideoIO_Locate
277 mov si, offset TXT_TopInfos_Type ; "Type"
278 mov cl, 4
279 call VideoIO_FixedPrint
280
281 ; ------------------------------------- 2nd Part
282 mov cx, 052Bh
283 call VideoIO_Locate
284 mov si, offset TXT_TopInfos_No ; "No Hd"
285 mov cl, 5
286 call VideoIO_FixedPrint
287 mov cx, 0533h
288 call VideoIO_Locate
289 mov si, offset TXT_TopInfos_Label ; "Label"
290 mov cl, 5
291 call VideoIO_FixedPrint
292 mov cx, 053Fh
293 call VideoIO_Locate
294 mov si, offset TXT_TopInfos_Flags ; "Flags"
295 mov cl, 5
296 call VideoIO_FixedPrint
297 mov cx, 0547h
298 call VideoIO_Locate
299 mov si, offset TXT_TopInfos_Type ; "Type"
300 mov cl, 4
301 call VideoIO_FixedPrint
302
303 mov si, offset TXT_SETUPHELP_PartSetup
304 call SETUP_DrawMenuHelp
305 ret
306PARTSETUP_DrawMenuBase EndP
307
308; Displays all partitions into Partition Setup Menu
309; aka displays dynamic content.
310PARTSETUP_RefreshPartitions Proc Near Uses cx dx
311 mov dl, PartSetup_UpperPart
312 mov dh, 12
313 PSRP_Loop:
314 call PARTSETUP_DrawPartitionInfo
315 inc dl
316 dec dh
317 jnz PSRP_Loop
318 ; At last calculate Scroll-Markers
319IFDEF TESTBUILD
320 mov cx, 0908h
321ELSE
322 mov cx, 0901h
323ENDIF
324 call VideoIO_Color
325 mov cx, 0603h ; 6, 3
326 mov dl, PartSetup_UpperPart
327 call PARTSETUP_UpperScrollMarker
328 mov cl, 37 ; 6, 37
329 call PARTSETUP_UpperScrollMarker
330 mov cl, 43 ; 6, 43
331 call PARTSETUP_UpperScrollMarker
332 mov cl, 76 ; 6, 76
333 call PARTSETUP_UpperScrollMarker
334 mov cx, 0D03h ; 13, 3
335 add dl, 12 ; add 12 -> points to last partition
336 mov dh, CFG_Partitions ; Limit
337 call PARTSETUP_LowerScrollMarker
338 mov cl, 37 ; 6, 37
339 call PARTSETUP_LowerScrollMarker
340 inc dl ; add 1 -> cool way ;-)
341 mov cl, 43 ; 6, 43
342 call PARTSETUP_LowerScrollMarker
343 mov cl, 76 ; 6, 76
344 call PARTSETUP_LowerScrollMarker
345 ret
346PARTSETUP_RefreshPartitions EndP
347
348; Writes Partition-Information to Screen (Partition-Setup)
349; In: DL - Number of Partition (Base=0)
350; Destroyed: None
351PARTSETUP_DrawPartitionInfo Proc Near Uses ax bx cx dx si
352 local NoOfPart :byte
353 mov ch, dl
354 sub ch, PartSetup_UpperPart
355 mov cl, 3 ; 3 - first Position
356 shr ch, 1
357 jnc PSDPI_LeftPos
358 mov cl, 43 ; 43 - second Position
359 PSDPI_LeftPos:
360 add ch, 7 ; CH - Line Location for PartInfo
361 ; We got location
362 mov NoOfPart, dl
363 call VideoIO_Locate
364
365 cmp dl, CFG_Partitions
366 jb PSDPI_GotPartitionData
367 push cx
368 mov al, ' '
369 mov cl, 5
370 call VideoIO_PrintSingleMultiChar
371 pop cx
372 add cl, 7
373 call VideoIO_Locate
374 push cx
375 mov al, ' '
376 mov cl, 11
377 call VideoIO_PrintSingleMultiChar
378 pop cx
379 add cl, 13
380 call VideoIO_Locate
381 push cx
382 mov al, ' '
383 mov cl, 5
384 call VideoIO_PrintSingleMultiChar
385 pop cx
386 add cl, 7
387 call VideoIO_Locate
388 push cx
389 mov al, ' '
390 mov cl, 8
391 call VideoIO_PrintSingleMultiChar
392 pop cx
393 ret
394
395 PSDPI_GotPartitionData:
396 call PART_GetPartitionPointer ; Gets Pointer to Partition (DL) -> SI
397 mov al, NoOfPart
398 inc al
399 call VideoIO_PrintByteNumber
400
401 ; Display "No Hd" field aka "01/01"
402 call VideoIO_Locate
403 push cx
404IFDEF TESTBUILD
405 mov cx, 0F08h
406ELSE
407 mov cx, 0F01h
408ENDIF
409 call VideoIO_Color ; Bright White, Blue
410 pop cx
411 mov al, NoOfPart
412 inc al
413 call VideoIO_PrintByteNumber
414 mov al, '/'
415 call VideoIO_PrintSingleChar
416 mov al, [si+LocIPT_Drive]
417 sub al, 7Fh
418 call VideoIO_PrintByteNumber
419
420 ; Display "Label" field e.g. "OS2 " (fixed 11 bytes)
421 add cl, 7
422 call VideoIO_Locate
423 push cx
424IFDEF TESTBUILD
425 mov cx, 0E08h
426ELSE
427 mov cx, 0E01h
428ENDIF
429 call VideoIO_Color ; Yellow, Blue
430 push si
431 add si, LocIPT_Name
432 mov cl, 11
433 call VideoIO_FixedPrint
434 pop si
435 pop cx
436
437 ; Display "Flags" field aka "BVHL"
438 add cl, 13
439 call VideoIO_Locate
440 ; This is using a sub-routine for each flag. Is better that way.
441 mov bl, [si+LocIPT_Flags]
442 mov bh, bl
443 mov al, TXT_SETUP_FlagLetterBootable
444 and bl, Flags_Bootable
445 call PARTSETUP_DrawOneFlag
446 mov bl, bh
447 mov al, TXT_SETUP_FlagLetterVIBR
448 and bl, Flags_VIBR_Detection
449 call PARTSETUP_DrawOneFlag
450 mov bl, bh
451 mov al, TXT_SETUP_FlagLetterHide
452 and bl, Flags_HideFeature
453 call PARTSETUP_DrawOneFlag
454 mov bl, bh
455 mov al, TXT_SETUP_FlagLetterDrvLetter
456 and bl, Flags_DriveLetter
457 call PARTSETUP_DrawOneFlag
458 mov bl, bh
459 mov al, TXT_SETUP_FlagLetterExtMShack
460 and bl, Flags_ExtPartMShack
461 call PARTSETUP_DrawOneFlag
462
463 ; Display "Type" field aka "FAT16Big"
464 add cl, 7
465 call VideoIO_Locate
466 push cx
467IFDEF TESTBUILD
468 mov cx, 0C08h
469ELSE
470 mov cx, 0C01h
471ENDIF
472 call VideoIO_Color ; Bright Red, Blue
473 pop cx
474 mov al, [si+LocIPT_SystemID]
475 call PART_SearchFileSysName
476 mov cl, 8
477 call VideoIO_FixedPrint
478 ret
479PARTSETUP_DrawPartitionInfo EndP
480
481; In: AL - Flag-Letter
482; BL - ==0 -> Flag not set, =!0 -> Flag set
483; Destroyed: None
484PARTSETUP_DrawOneFlag Proc Near Uses cx
485IFDEF TESTBUILD
486 mov cx, 0A08h ; Bright Green
487ELSE
488 mov cx, 0A01h ; Bright Green
489ENDIF
490 or bl, bl
491 jnz PSDOF_FlagSet
492 mov ch, 09h ; Bright Blue
493 PSDOF_FlagSet:
494 call VideoIO_Color
495 call VideoIO_PrintSingleChar
496 ret
497PARTSETUP_DrawOneFlag EndP
498
499; F10-SETUP
500CLR_SETUP_SELECTION_BAR_CLASSIC = 10h
501CLR_SETUP_SELECTION_BAR_BM = 10h
502CLR_SETUP_SELECTION_BAR_TB = 80h
503IFDEF TESTBUILD
504CLR_SETUP_SELECTION_BAR = CLR_SETUP_SELECTION_BAR_TB
505ELSE
506CLR_SETUP_SELECTION_BAR = CLR_SETUP_SELECTION_BAR_BM
507ENDIF
508
509; In: DL - Current Active (to be inactivated)
510; DH - New Active (to be activated)
511; Destroyed: None
512PARTSETUP_BuildChoiceBar Proc Near
513 cmp dl, dh
514 je PSBCB_SkipRetrace
515 call VideoIO_WaitRetrace
516 PSBCB_SkipRetrace:
517
518 ; Deactivate current active bar
519 mov cl, CLR_SETUP_SELECTION_BAR
520 call PARTSETUP_ReColorPart
521
522 ; Running Fixing
523 cmp dh, 0FFh
524 jne PSBCB_NoUnderflow
525 xor dh, dh
526 PSBCB_NoUnderflow:
527 cmp dh, CFG_Partitions
528 jb PSBCB_NoOverflow
529 mov dh, CFG_Partitions
530 dec dh
531 PSBCB_NoOverflow:
532 mov dl, dh
533
534 ; Do we need to scroll ?
535 mov al, PartSetup_UpperPart
536 cmp dl, al
537 jb PSBCB_YesScrolling
538 add al, 12
539 cmp dl, al
540 jb PSBCB_NoScrolling
541 mov al, dl
542 and al, 0FEh ; UpperPart is never 1/3/5/7/etc.
543 sub al, 10
544 mov PartSetup_UpperPart, al
545 call PARTSETUP_RefreshPartitions
546 jmp PSBCB_NoScrolling
547 PSBCB_YesScrolling:
548 mov al, dl
549 and al, 0FEh ; UpperPart is never 1/3/5/7/etc.
550 mov PartSetup_UpperPart, al
551 call PARTSETUP_RefreshPartitions
552 PSBCB_NoScrolling:
553
554 ; Activate fresh active bar
555 mov cl, 40h ; F10-SETUP SelectionBar Active bg
556 call PARTSETUP_ReColorPart
557 ; Now DL==DH
558 ret
559PARTSETUP_BuildChoiceBar EndP
560
561; In: CL - Color, DL - Partition
562; Destroyed: None, but Locate-Pointer
563PARTSETUP_ReColorPart Proc Near Uses bx cx es di
564 mov bh, cl ; Color to BH
565 ; First calculate location of bar
566 cmp dl, PartSetup_UpperPart
567 jb PSRCP_NotInWindowView
568 mov ch, dl
569 sub ch, PartSetup_UpperPart ; CH - Position relative to UpperPart
570 cmp ch, 12 ; 12 - Maximum Total in Window
571 jae PSRCP_NotInWindowView
572 mov cl, 2 ; 2 - first Position
573 mov bl, 39 ; Length of Bar is 39
574 shr ch, 1
575 jnc PSRCP_LeftPos
576 mov cl, 42 ; 42 - second Position
577 dec bl ; Length of Bar is 38
578 PSRCP_LeftPos:
579 add ch, 7 ; Y-Position add-on fixed 7
580 call VideoIO_Locate ; geht zu CX
581 call VideoIO_Internal_SetRegs
582 inc di ; DI - Destination+1 -> Color-Byte
583 mov cl, bl ; Length of Bar is always 39
584 PSRCP_ClearLoop:
585 mov al, es:[di]
586 and al, 0Fh
587 or al, bh ; setzt den Hintergrund (BH)
588 mov es:[di], al
589 add di, 2
590 dec cl
591 jnz PSRCP_ClearLoop
592 PSRCP_NotInWindowView:
593 ret
594PARTSETUP_ReColorPart EndP
595
596; In: CX - Location, DL - UpperPartNo
597; Destroyed: None, but Locate-Pointer
598PARTSETUP_UpperScrollMarker Proc Near Uses ax cx
599 call VideoIO_Locate
600 mov al, ' '
601 or dl, dl
602 jz PSUSM_NoMarker
603 mov al, 1Eh
604 PSUSM_NoMarker:
605 mov cl, 3
606 call VideoIO_PrintSingleMultiChar
607 ret
608PARTSETUP_UpperScrollMarker EndP
609
610; In: CX - Location, DL - UpperPartNo, DH - Limit
611; Destroyed: None, cx dx
612PARTSETUP_LowerScrollMarker Proc Near Uses ax cx
613 call VideoIO_Locate
614 mov al, ' '
615 cmp dl, dh
616 jae PSLSM_NoMarker
617 mov al, 1Fh
618 PSLSM_NoMarker:
619 mov cl, 3
620 call VideoIO_PrintSingleMultiChar
621 ret
622PARTSETUP_LowerScrollMarker EndP
623
624; =============================================================================
625
626; This is called from MBRS_Routines_PartitionSetup
627; In: DL - Partition to ChangeName
628; Destroyed: ax bx cx
629PARTSETUP_ChangePartitionName Proc Near Uses dx ds si di
630 push ds
631 pop es ; we need DS==ES in here for MOVSB etc.
632 call PART_GetPartitionPointer ; Gets the PartitionPointer for DL in SI
633
634 ; First deactivate current active bar
635 mov cl, 10h
636 call PARTSETUP_ReColorPart
637
638 ; Calculate where the Partition-Name is located...
639 mov ch, dl
640 sub ch, PartSetup_UpperPart ; CH - Position relative to UpperPart
641 mov cl, 10 ; 10 - first Position
642 shr ch, 1
643 jnc PSCPN_LeftPos
644 mov cl, 50 ; 50 - second Position
645 PSCPN_LeftPos:
646 add ch, 7 ; Y-Position add-on fixed 7
647 call VideoIO_Locate ; Goes to CX
648
649 mov byte ptr [ChangePartNameSave], 0 ; Don't save to BR / LVM Sector
650
651 ; We compare, if our IPT contains the same partition name as in BR or LVM
652 ; This is done for security purposes, because if they match, we will update
653 ; the name in both - IPT and BR/LVM.
654
655 ;movzx bx, dl
656 mov bl,dl
657 mov bh,0
658
659 cmp byte ptr [PartitionVolumeLetters+bx], 0 ; ==0 means not supported by LVM
660 je PSCPN_NotLVMSupported
661
662 ;
663 ; BOOKMARK: LVM Label Manipulations
664 ;
665
666 ; ------------------------------------------------------------[LVM CHECK]---
667 ; Load LVM-Sector here and seek to PartitionName
668 ; Set CurPartition_Location information of destination partition
669 mov ax, [si+LocIPT_AbsolutePartTable]
670 mov [CurPartition_Location+0], ax
671 mov ax, [si+LocIPT_AbsolutePartTable+2]
672 mov [CurPartition_Location+2], ax
673 mov ah, byte ptr [si+LocIPT_LocationPartTable+0]
674 mov al, byte ptr [si+LocIPT_Drive]
675 mov [CurPartition_Location+4], ax
676 mov ax, [si+LocIPT_LocationPartTable+1]
677 mov [CurPartition_Location+6], ax
678 mov di, si ; Put SI into DI
679 call DriveIO_LoadLVMSector
680 jc PSCPN_LVMGotError ; Security again, if problem -> halt
681 push dx
682 mov ax, [di+LocIPT_AbsoluteBegin]
683 mov dx, [di+LocIPT_AbsoluteBegin+2]
684 call LVM_SearchForPartition
685 pop dx
686 jnc PSCPN_LVMGotError ; Not Found? -> display error and halt
687
688
689 ; Point to LVM VolumeName
690 add si, LocLVM_VolumeName
691
692
693 xchg si, di ; SI-IPTEntry, DI-LVM PartName
694 jmp PSCPN_CheckPartName ; Check, if match...
695
696
697
698 PSCPN_LVMGotError:
699 jmp MBR_LoadError
700
701
702
703 ; mov si, di ; Restore SI and bootrecord fall-back
704 PSCPN_NotLVMSupported:
705 ; ----------------------------------------------------[BOOT-RECORD CHECK]---
706 ; Load Boot-Record...
707 ; BOOKMARK: Load Boot Record
708 push dx
709 mov ax, [si+LocIPT_AbsoluteBegin+0]
710 mov bx, [si+LocIPT_AbsoluteBegin+2]
711 mov cx, [si+LocIPT_LocationBegin+1]
712 mov dh, [si+LocIPT_LocationBegin+0]
713 mov dl, [si+LocIPT_Drive]
714 call DriveIO_LoadPartition
715 pop dx
716
717 ; We seek to Partition Label within boot-record here
718 mov di, offset PartitionSector
719
720 push si
721 mov al, [si+LocIPT_SystemID]
722 call PART_SearchFileSysName
723 ; Replies AH - FileSysFlags, AL - UnhiddenID, SI - FileSysNamePtr
724 pop si
725
726 test ah, FileSysFlags_NoName ; If NoName by FileSysFlag
727 jnz PSCPN_LetUserEditPartName ; -> don't put it into BR at anytime
728 test ah, FileSysFlags_FAT32 ; FAT32 specific name getting
729 jz PSCPN_ResumeNormal
730 add di, 1Ch ; Fix for FAT 32, shit
731 PSCPN_ResumeNormal:
732 add di, 2Bh ; ES:DI - Name of Partition
733
734
735
736
737
738 ; This code is used for BR and LVM checking
739 ; Rousseau: Because AiR-BOOT v1.0.8+ uses the LVM_VolumeName, which is copied
740 ; to the IPT, this compare fails when the LVM_PartitionName is not
741 ; the same as the LVM_VolumeName. In that case, only the LVM_VolumeName
742 ; is updated. If they are the same, both are upated so they are the same
743 ; again after the edit.
744
745 PSCPN_CheckPartName:
746
747 ; Do no synchronization initially.
748 mov byte ptr [SyncLvmLabels],0
749
750 ; SI = IPT_Enty, DI points to LVM VolumeName.
751
752 ; If the partition is an LVM partition then disable editing completely.
753 cmp byte ptr [si+LocIPT_SystemID], 035h
754 jnz no_type_35h
755
756 ; Cannot boot LVM-Data partitions
757 pusha
758 mov cx, 0C04h
759 mov si, offset TXT_SETUP_NoEditType35
760 call SETUP_ShowErrorBox
761 popa
762
763
764 jmp PSCPN_AllDone
765
766 ; SI = IPT_Enty, DI points to LVM VolumeName.
767 no_type_35h:
768
769 ;
770 ; Compare LVM VolumeName and PartitionName and
771 ; set flag if they are the same and need to be synced after user edit.
772 ;
773 push si
774 push di
775 mov si,di ; Pointer to LVM V-name in SI
776 add di,LocLVM_LabelLen ; Pointer to LVM P-name in DI
777 mov cx,LocLVM_LabelLen ; Length of LVM label
778 cld
779 repe cmpsb ; Compare V and P labels
780 jnz LVM_Labels_not_equal
781 mov byte ptr [SyncLvmLabels],1 ; Same so set flag for later
782 LVM_Labels_not_equal:
783 pop di
784 pop si
785
786
787 mov cx, 11 ; Partition-Name-Length = 11 Bytes
788 push si
789 push di
790 add si, LocIPT_Name ; DS:SI -> Partition-Name
791 repz cmpsb
792 pop di
793 pop si
794 jne PSCPN_LetUserEditPartName ; -> No BR/LVM Changing/Saving
795
796 mov byte ptr [ChangePartNameSave], 1 ; Remember, so we will save to BR
797
798 ; SI = IPT_Enty, DI points to LVM PartitionName.
799 PSCPN_LetUserEditPartName:
800 ; User will now edit the volume label...
801 mov cx, 11
802 add si, LocIPT_Name ; DS:SI -> Partition-Name
803 call VideoIO_LetUserEditString ; -> does actual editing
804 jnc PSCPN_AllDone ; Did user abort ?
805
806 test byte ptr [ChangePartNameSave], 1
807 jz PSCPN_AllDone ; Actually we just skip BR/LVM-Save
808
809 ; Check, where to save 2nd destination to...
810
811 ;movzx bx, dl
812 mov bl,dl
813 mov bh,0
814
815 cmp byte ptr [PartitionVolumeLetters+bx], 0 ; ==0 means not supported by LVM
816 je PSCPN_SaveBootRecord
817
818
819 ; Make DI point to LVM VolumeName in LVM-entry
820 ;~ sub di,20
821
822 ; Points to LVM VolumeName.
823 push di
824
825 ; -------------------------------------------------[LVM SAVE VOLUME NAME]---
826 ; Copy 11 bytes from IPT into LVM VolumeName, back-padd with zero's
827 mov cx, 11
828 push si
829 rep movsb
830 pop si
831
832 ; Padd with zero's, but the editor still might have left spaces
833 ; at the end of the 11-byte part. We correct that below.
834 xor al, al
835 mov cx, 9
836 rep stosb
837
838
839 ;
840 ; The AiR-BOOT Label Editor inserts spaces when a label is edited
841 ; and characters are backspaced.
842 ; This is fine for filesystem labels, which are space padded,
843 ; but the LVM VolumeName and PartitionName need to be zero padded.
844 ; So, below we replace all trailing spaces with zero's.
845 ;
846 ; Correct LVM VolumeName
847 ;
848 mov cx,20
849 vn_padd_next:
850 jcxz vn_padded
851 dec di
852 dec cx
853 mov al,[di]
854 test al,al
855 jz vn_padd_next
856 cmp al,' '
857 jnz vn_padded
858 mov byte ptr [di],0
859 jmp vn_padd_next
860 vn_padded:
861
862 ; Points to LVM VolumeName
863 pop di
864
865 ; See if LVM-labels need to be synced.
866 test byte ptr [SyncLvmLabels],1
867 jz LVM_no_sync_labels
868
869 ; Sync LVM-labels.
870 mov si,di
871 add di,LocLVM_LabelLen
872 mov cx,LocLVM_LabelLen
873 cld
874 rep movsb
875
876
877 LVM_no_sync_labels:
878 ; Update LVM-CRC now...
879 mov si, offset LVMSector
880 call LVM_UpdateSectorCRC
881
882 call DriveIO_SaveLVMSector ; Save sector
883
884 jmp PSCPN_AllDone
885
886 ; -----------------------------------------------------[BOOT-RECORD SAVE]---
887 ; BOOKMARK: Save Boot Record (After change from Setup Menu)
888 PSCPN_SaveBootRecord:
889 ; Copy 11 bytes from IPT to Boot-Record
890 mov cx, 11
891 push si
892 rep movsb ; Copy IPT-name to Boot-Record
893 pop si
894
895 call DriveIO_SavePartition ; Saves Boot-Record
896
897 ; And reset VIBR-CRC, otherwise virus-warning and system-halt
898 ; BOOKMARK: Update CRC on Partition Sector
899 sub si, LocIPT_Name ; Now pointer points to base again...
900 mov bx, offset [PartitionSector]
901 call PART_UpdateBootRecordCRC
902
903 PSCPN_AllDone:
904 ; This here is done for safety, because we misused CurPartition_Location
905 xor ax, ax
906 mov di, offset CurPartition_Location
907 mov cx, 4
908 rep stosw ; NUL out CurPartition_Location
909 ret
910PARTSETUP_ChangePartitionName EndP
911
912; =============================================================================
913; This is called from MBRS_Routines_PartitionSetup
914; In: DL - Partition to HiddenSetup
915; Destroyed: ax
916PARTHIDESETUP_Main Proc Near Uses dx
917 ; Spread Special-Marker from Hide-Config
918 call PARTHIDESETUP_GetHideConfigAndSpread
919 ; Calculate Position of Window.
920 ; If Partition Selected Left-Side -> go Right-Sided Window
921 ; otherwise Left-Sided.
922 mov [PartSetup_ActivePart], dl
923 mov ax, 0102h
924 and dl, 1
925 jnz PHSM_FirstStep
926 mov ax, 002Ah
927 PHSM_FirstStep:
928 mov [PartSetup_HiddenX], al
929 mov [PartSetup_HiddenAdd], ah
930
931 ; Draw Menu...
932 xor dx, dx
933 mov [PartSetup_HiddenUpper], dl
934 call PARTHIDESETUP_DrawMenuBase
935 call PARTHIDESETUP_RefreshPartitions
936 ; Show Choice-Bar at DH...
937 call PARTHIDESETUP_BuildChoiceBar
938
939 ; Now we got everything on-the-screen
940 PHSM_MainLoop:
941 mov ah, 0
942 int 16h
943 cmp ah, Keys_Up
944 je PHSM_KeyUp
945 cmp ah, Keys_Down
946 je PHSM_KeyDown
947 cmp ah, Keys_ESC
948 je PHSM_KeyESC
949 cmp ah, Keys_F1
950 je PHSM_KeyF1
951 cmp ah, Keys_ENTER
952 je PHSM_KeyToogle
953 cmp ah, Keys_Plus
954 je PHSM_KeyToogle
955 cmp ah, Keys_Minus
956 je PHSM_KeyToogle
957 cmp ah, Keys_GrayPlus
958 je PHSM_KeyToogle
959 cmp ah, Keys_GrayMinus
960 je PHSM_KeyToogle
961 cmp ah, Keys_PageDown
962 je PHSM_KeyToogle
963 cmp ah, Keys_PageUp
964 je PHSM_KeyToogle
965 ; ASCII values...
966 cmp al, Keys_Space
967 je PHSM_KeyToogle
968 jmp PHSM_MainLoop
969
970 PHSM_KeyESC:
971 ; Collect Hide-Partition-Config and put it into Hide-Table
972 mov dl, [PartSetup_ActivePart]
973
974IFDEF AUX_DEBUG
975 IF 0
976 pushf
977 pusha
978 mov al,dl ; Partition the hiding is set for.
979 call AuxIO_TeletypeHexByte
980 call AuxIO_TeletypeNL
981 popa
982 popf
983 ENDIF
984ENDIF
985
986 call PARTHIDESETUP_CollectHideConfigAndPutToTable
987 ; Simply return to Partition Setup
988 ret
989
990 PHSM_KeyUp:
991 dec dh
992 call PARTHIDESETUP_BuildChoiceBar
993 jmp PHSM_MainLoop
994
995 PHSM_KeyDown:
996 inc dh
997 call PARTHIDESETUP_BuildChoiceBar
998 jmp PHSM_MainLoop
999
1000 PHSM_KeyToogle:
1001
1002IFDEF AUX_DEBUG
1003 IF 0
1004 pushf
1005 pusha
1006 mov al,dl ; Index of partition to set Special Marker on.
1007 call AuxIO_TeletypeHexByte
1008 call AuxIO_TeletypeNL
1009 popa
1010 popf
1011 ENDIF
1012ENDIF
1013
1014 call PART_GetPartitionPointer ; Holt den Pointer der Partition (DL) nach SI
1015 mov al, [si+LocIPT_Flags]
1016 xor al, Flags_SpecialMarker
1017 mov [si+LocIPT_Flags], al
1018 call PARTHIDESETUP_DrawPartitionInfo
1019 call PARTHIDESETUP_BuildChoiceBar
1020 jmp PHSM_MainLoop
1021
1022 PHSM_KeyF1:
1023 mov bx, offset TXT_SETUPHELP_HideSetup
1024 call SETUP_ShowHelp ; Shows help
1025 jmp PHSM_MainLoop
1026PARTHIDESETUP_Main EndP
1027
1028; Draw all standard-things for HiddenSetup, dynamic content not included.
1029PARTHIDESETUP_DrawMenuBase Proc Near Uses dx
1030 ; PartSetup_HiddenX1
1031
1032
1033
1034CLR_PART_HIDE_WINDOW_BASE_CLASSIC = 0d05h
1035CLR_PART_HIDE_WINDOW_BASE_BM = 0a02h
1036CLR_PART_HIDE_WINDOW_BASE_TB = 0a02h
1037IFDEF TESTBUILD
1038CLR_PART_HIDE_WINDOW_BASE = CLR_PART_HIDE_WINDOW_BASE_TB
1039ELSE
1040CLR_PART_HIDE_WINDOW_BASE = CLR_PART_HIDE_WINDOW_BASE_BM
1041ENDIF
1042
1043 mov cx, CLR_PART_HIDE_WINDOW_BASE ; Lila on lila
1044 call VideoIO_Color
1045 mov bh, 05h
1046 mov bl, [PartSetup_HiddenX]
1047 mov dh, 10h
1048 mov dl, bl
1049 add dl, 25h
1050 add dl, [PartSetup_HiddenAdd]
1051 push bx
1052 call VideoIO_MakeWindow
1053 pop bx
1054 ; --- Make Window-Header - "Hide Feature" at top frame-line
1055 inc bl
1056 mov cx, bx
1057 call VideoIO_Locate
1058 mov al, 0b5h
1059 call VideoIO_PrintSingleChar
1060
1061
1062
1063CLR_PART_HIDE_WINDOW_LABEL_CLASSIC = 0e05h
1064CLR_PART_HIDE_WINDOW_LABEL_BM = 0e02h
1065CLR_PART_HIDE_WINDOW_LABEL_TB = 0e02h
1066IFDEF TESTBUILD
1067CLR_PART_HIDE_WINDOW_LABEL = CLR_PART_HIDE_WINDOW_LABEL_TB
1068ELSE
1069CLR_PART_HIDE_WINDOW_LABEL = CLR_PART_HIDE_WINDOW_LABEL_BM
1070ENDIF
1071
1072 mov cx, CLR_PART_HIDE_WINDOW_LABEL ; Yellow on Lila
1073 call VideoIO_Color
1074 mov si, offset TXT_SETUP_HideFeature
1075 call VideoIO_Print
1076
1077
1078
1079CLR_PART_HIDE_WINDOW_BORDER_CLASSIC = 0d05h
1080CLR_PART_HIDE_WINDOW_BORDER_BM = 0d02h
1081CLR_PART_HIDE_WINDOW_BORDER_TB = 0d02h
1082IFDEF TESTBUILD
1083CLR_PART_HIDE_WINDOW_BORDER = CLR_PART_HIDE_WINDOW_BORDER_TB
1084ELSE
1085CLR_PART_HIDE_WINDOW_BORDER = CLR_PART_HIDE_WINDOW_BORDER_BM
1086ENDIF
1087
1088 mov cx, CLR_PART_HIDE_WINDOW_BASE ; Lila on lila
1089 call VideoIO_Color
1090 mov al, 0c6h
1091 call VideoIO_PrintSingleChar
1092 ; --- Make Window-Footer - "State when booting..." at bottom right frame-line
1093 mov cx, CLR_PART_HIDE_WINDOW_BORDER ; Lila on lila
1094 call VideoIO_Color
1095 mov dh, 10h
1096 mov dl, [PartSetup_HiddenX]
1097 add dl, 25h
1098 add dl, [PartSetup_HiddenAdd] ; Location 16, HiddenX->right aligned
1099 mov si, offset TXT_SETUP_HideFeature2
1100 call GetLenOfString ; CX - Length of HideFeature2
1101 sub dl, cl ; Adjust Position
1102 push dx
1103 mov dl, [PartSetup_ActivePart]
1104 call PART_GetPartitionPointer ; Holt den Pointer der Partition (DL) nach SI
1105 pop dx
1106 ; Display "Label" field without ending NULs/Spaces
1107 add si, LocIPT_Name
1108 mov cx, 11
1109 call GetLenOfName
1110 sub dl, cl ; Adjust position
1111 sub dl, 2
1112 push cx
1113 push si ; SI == Label Field
1114 mov cx, dx
1115 call VideoIO_Locate
1116 mov al, '<'
1117 call VideoIO_PrintSingleChar
1118 mov si, offset TXT_SETUP_HideFeature2
1119 call VideoIO_Print
1120 pop si
1121 pop cx
1122 call VideoIO_FixedPrint
1123 mov al, '>'
1124 call VideoIO_PrintSingleChar
1125
1126; inc cl
1127; call MBR_Locate ; Location 16, HiddenX
1128; mov al, 0b5h
1129; call MBR_PrintSingleChar
1130; mov cx, 0E05h ; Yellow on Lila
1131; call MBR_Color
1132; mov si, offset TXT_SETUP_HideFeature2
1133; call MBR_Print
1134; mov dl, PartSetup_ActivePart
1135; call MBR_Part_GetPartitionPointer ; Holt den Pointer der Partition (DL) nach SI
1136; ; Display "Label" field without ending NULs/Spaces
1137; add si, LocIPT_Name
1138; mov cx, 11
1139; call MBR_GetLenOfName
1140; call MBR_FixedPrint
1141; mov cx, 0D05h ; Lila on lila
1142; call MBR_Color
1143; mov al, 0c6h
1144; call MBR_PrintSingleChar
1145
1146 ; --- Make ':' Line down
1147
1148
1149
1150CLR_PART_HIDE_MENU_BASE_CLASSIC = 0f05h
1151CLR_PART_HIDE_MENU_BASE_BM = 0f02h
1152CLR_PART_HIDE_MENU_BASE_TB = 0f02h
1153IFDEF TESTBUILD
1154CLR_PART_HIDE_MENU_BASE = CLR_PART_HIDE_MENU_BASE_TB
1155ELSE
1156CLR_PART_HIDE_MENU_BASE = CLR_PART_HIDE_MENU_BASE_BM
1157ENDIF
1158
1159 mov cx, CLR_PART_HIDE_MENU_BASE ; Yellow on Lila
1160 call VideoIO_Color
1161 mov ch, 07h
1162 mov cl, PartSetup_HiddenX
1163 add cl, 24
1164 add cl, PartSetup_HiddenAdd
1165 call VideoIO_Locate
1166 mov al, ':'
1167 mov cl, 8
1168 call VideoIO_Internal_MakeWinDown
1169 ret
1170PARTHIDESETUP_DrawMenuBase EndP
1171
1172; Draw all partitions to Hidden-Setup aka Dynamic Content-Draw
1173PARTHIDESETUP_RefreshPartitions Proc Near Uses dx
1174 mov dl, [PartSetup_HiddenUpper]
1175 mov dh, 8
1176 PHSRP_Loop:
1177 call PARTHIDESETUP_DrawPartitionInfo
1178 inc dl
1179 dec dh
1180 jnz PHSRP_Loop
1181
1182
1183
1184CLR_PART_HIDE_MENU_MARKERS_CLASSIC = 0d05h
1185CLR_PART_HIDE_MENU_MARKERS_BM = 0a02h
1186CLR_PART_HIDE_MENU_MARKERS_TB = 0a02h
1187IFDEF TESTBUILD
1188CLR_PART_HIDE_MENU_MARKERS = CLR_PART_HIDE_MENU_MARKERS_TB
1189ELSE
1190CLR_PART_HIDE_MENU_MARKERS = CLR_PART_HIDE_MENU_MARKERS_BM
1191ENDIF
1192
1193 ; At last calculate Scroll-Markers
1194 mov cx, CLR_PART_HIDE_MENU_MARKERS ; Lila on lila ; Hide Feature Markers
1195 call VideoIO_Color
1196 mov cx, 0603h ; 6, +3
1197 add cl, [PartSetup_HiddenX]
1198 mov dl, [PartSetup_HiddenUpper]
1199 call PARTSETUP_UpperScrollMarker
1200 add cl, 29
1201 add cl, [PartSetup_HiddenAdd] ; 6, +29
1202 call PARTSETUP_UpperScrollMarker
1203 mov cx, 0F03h ; 15, +3
1204 add cl, [PartSetup_HiddenX]
1205 add dl, 8 ; add 8 -> points to last partition
1206 mov dh, [CFG_Partitions] ; Limit
1207 call PARTSETUP_LowerScrollMarker
1208 add cl, 29
1209 add cl, [PartSetup_HiddenAdd] ; 6, +29
1210 call PARTSETUP_LowerScrollMarker
1211 ret
1212PARTHIDESETUP_RefreshPartitions EndP
1213
1214PARTHIDESETUP_DrawPartitionInfo Proc Near Uses dx
1215 local NoOfPart :byte
1216 mov ch, dl
1217 sub ch, [PartSetup_HiddenUpper]
1218 add ch, 7
1219 mov cl, 2
1220 add cl, [PartSetup_HiddenX]
1221 ; We got location
1222 mov NoOfPart, dl
1223 call VideoIO_Locate
1224
1225 ; Clean data-area...
1226 push cx
1227 mov al, ' '
1228 mov cl, 22
1229 call VideoIO_PrintSingleMultiChar
1230 pop cx
1231
1232 cmp dl, [CFG_Partitions]
1233 jae PHSDPI_NoData
1234
1235 call PART_GetPartitionPointer ; Holt den Pointer der Partition (DL) nach SI
1236 call VideoIO_Locate
1237 push cx
1238 ; Display "Label" field aka "OS2" without ending NULs/Spaces
1239
1240
1241
1242CLR_PART_HIDE_LABEL_CLASSIC = 0f05h
1243CLR_PART_HIDE_LABEL_BM = 0f02h
1244CLR_PART_HIDE_LABEL_TB = 0f02h
1245IFDEF TESTBUILD
1246CLR_PART_HIDE_LABEL = CLR_PART_HIDE_LABEL_TB
1247ELSE
1248CLR_PART_HIDE_LABEL = CLR_PART_HIDE_LABEL_BM
1249ENDIF
1250
1251 mov cx, CLR_PART_HIDE_LABEL
1252 call VideoIO_Color ; Bright White on Lila
1253 push si
1254 add si, LocIPT_Name
1255 mov cx, 11
1256 call GetLenOfName
1257 call VideoIO_FixedPrint
1258 pop si
1259
1260
1261
1262CLR_PART_HIDE_WINDOW_FS_CLASSIC = 0d05h
1263CLR_PART_HIDE_WINDOW_FS_BM = 0a02h
1264CLR_PART_HIDE_WINDOW_FS_TB = 0a02h
1265IFDEF TESTBUILD
1266CLR_PART_HIDE_WINDOW_FS = CLR_PART_HIDE_WINDOW_FS_TB
1267ELSE
1268CLR_PART_HIDE_WINDOW_FS = CLR_PART_HIDE_WINDOW_FS_BM
1269ENDIF
1270
1271 mov cx, CLR_PART_HIDE_WINDOW_FS
1272 call VideoIO_Color ; Bright Lila on Lila
1273 mov al, ' '
1274 call VideoIO_PrintSingleChar
1275 mov al, '['
1276 call VideoIO_PrintSingleChar
1277 ; Display "Type" field aka "HPFS" without ending NULs/Spaces
1278 push si
1279 mov al, [si+LocIPT_SystemID]
1280 call PART_SearchFileSysName
1281 mov cx, 8
1282 call GetLenOfName
1283 call VideoIO_FixedPrint
1284 pop si
1285 mov al, ']'
1286 call VideoIO_PrintSingleChar
1287 pop cx
1288 add cl, 24
1289 add cl, PartSetup_HiddenAdd
1290 call VideoIO_Locate
1291 push cx
1292
1293
1294
1295CLR_PART_HIDE_WINDOW_CHOISES_CLASSIC = 0e05h
1296CLR_PART_HIDE_WINDOW_CHOISES_BM = 0e02h
1297CLR_PART_HIDE_WINDOW_CHOISES_TB = 0e02h
1298IFDEF TESTBUILD
1299CLR_PART_HIDE_WINDOW_CHOISES = CLR_PART_HIDE_WINDOW_CHOISES_TB
1300ELSE
1301CLR_PART_HIDE_WINDOW_CHOISES = CLR_PART_HIDE_WINDOW_CHOISES_BM
1302ENDIF
1303
1304 mov cx, CLR_PART_HIDE_WINDOW_CHOISES
1305 call VideoIO_Color ; Yellow on Lila
1306 mov al, ' '
1307 mov cl, 10
1308 call VideoIO_PrintSingleMultiChar ; Fill up area with spaces
1309 ; Finally draw Hidden/Unhidden
1310 mov bl, [si+LocIPT_Flags]
1311 mov si, offset TXT_SETUP_MAGIC_Unhidden
1312 and bl, Flags_SpecialMarker
1313 jz PHSDPI_IsNotHidden
1314 mov si, offset TXT_SETUP_MAGIC_Hidden
1315 PHSDPI_IsNotHidden:
1316 call GetLenOfString
1317 mov dx, cx
1318 pop cx
1319 add cx, 10
1320 sub cx, dx
1321 call VideoIO_Locate
1322 call VideoIO_Print
1323 PHSDPI_NoData:
1324 ret
1325PARTHIDESETUP_DrawPartitionInfo EndP
1326
1327; In: DL - Current Active (to be inactivated)
1328; DH - New Active (to be activated)
1329; Destroyed: None
1330PARTHIDESETUP_BuildChoiceBar Proc Near
1331 cmp dl, dh
1332 je PHSBCB_SkipRetrace
1333 call VideoIO_WaitRetrace
1334 PHSBCB_SkipRetrace:
1335
1336
1337
1338CLR_PART_HIDE_WINDOW_MENU_BAR_CLASSIC = 5eh
1339CLR_PART_HIDE_WINDOW_MENU_BAR_BM = 2eh
1340CLR_PART_HIDE_WINDOW_MENU_BAR_TB = 2eh
1341IFDEF TESTBUILD
1342CLR_PART_HIDE_WINDOW_MENU_BAR = CLR_PART_HIDE_WINDOW_MENU_BAR_TB
1343ELSE
1344CLR_PART_HIDE_WINDOW_MENU_BAR = CLR_PART_HIDE_WINDOW_MENU_BAR_BM
1345ENDIF
1346
1347 ; Deactivate current active bar
1348 mov cl, CLR_PART_HIDE_WINDOW_MENU_BAR ; Yellow on Lila
1349 call PARTHIDESETUP_ReColorPart
1350
1351 ; Running Fixing
1352 cmp dh, 0FFh
1353 jne PHSBCB_NoUnderflow
1354 xor dh, dh
1355 PHSBCB_NoUnderflow:
1356 cmp dh, [CFG_Partitions]
1357 jb PHSBCB_NoOverflow
1358 mov dh, [CFG_Partitions]
1359 dec dh
1360 PHSBCB_NoOverflow:
1361 mov dl, dh
1362
1363 ; Do we need to scroll ?
1364 mov al, [PartSetup_HiddenUpper]
1365 cmp dl, al
1366 jb PHSBCB_YesScrolling
1367 add al, 8
1368 cmp dl, al
1369 jb PHSBCB_NoScrolling
1370 mov al, dl
1371 sub al, 7
1372 mov [PartSetup_HiddenUpper], al
1373 call PARTHIDESETUP_RefreshPartitions
1374 jmp PHSBCB_NoScrolling
1375 PHSBCB_YesScrolling:
1376 mov al, dl
1377 mov [PartSetup_HiddenUpper], al
1378 call PARTHIDESETUP_RefreshPartitions
1379 PHSBCB_NoScrolling:
1380
1381
1382
1383; Activate fresh active bar
1384CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR_CLASSIC = 1fh
1385CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR_BM = 1fh
1386CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR_TB = 1fh
1387IFDEF TESTBUILD
1388CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR = CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR_TB
1389ELSE
1390CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR = CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR_BM
1391ENDIF
1392
1393 mov cl, CLR_PART_HIDE_WINDOW_MENU_ACTIVE_BAR ; Bright White on Blue
1394 call PARTHIDESETUP_ReColorPart
1395 ; Now DL==DH
1396 ret
1397PARTHIDESETUP_BuildChoiceBar EndP
1398
1399; In: CL - Color, DL - Partition
1400; Destroyed: None, but Locate-Pointer
1401PARTHIDESETUP_ReColorPart Proc Near Uses bx cx es di
1402 mov bh, cl ; Color to BH
1403 ; First calculate location of bar
1404 cmp dl, [PartSetup_HiddenUpper]
1405 jb PHSRCP_NotInWindowView
1406 mov ch, dl
1407 sub ch, [PartSetup_HiddenUpper] ; CH - Position relative to HiddenUpper
1408 cmp ch, 8 ; 8 - Maximum Total in Window
1409 jae PHSRCP_NotInWindowView
1410 add ch, 7
1411 mov cl, 26
1412 add cl, [PartSetup_HiddenX]
1413 add cl, [PartSetup_HiddenAdd]
1414
1415 mov bl, 10 ; Length of Bar is 10
1416 call VideoIO_Locate ; geht zu CX
1417 call VideoIO_Internal_SetRegs
1418 inc di ; DI - Destination+1 -> Color-Byte
1419 mov cl, bl ; Length of Bar is always 39
1420 PHSRCP_ClearLoop:
1421 mov es:[di], bh
1422 add di, 2
1423 dec cl
1424 jnz PHSRCP_ClearLoop
1425 PHSRCP_NotInWindowView:
1426 ret
1427PARTHIDESETUP_ReColorPart EndP
1428
1429; =============================================================================
1430
1431
1432;
1433; Rousseau: Adjusted for packed hidden-part-table !
1434; Needs to be re-written.
1435;
1436; This is called by MBRS_PS_HiddenSetup
1437; In: DL - Partition, where to save Hide-Config
1438; Destroyed: None, but Locate-Pointer
1439PARTHIDESETUP_GetHideConfigAndSpread Proc Near Uses ax bx dx si di
1440 ; First check HideFeature-Flag on selected partition.
1441 ; if it's not set, don't do anything...
1442 call PART_GetPartitionPointer ; Holt den Pointer der Partition (DL) nach SI
1443 mov al, [si+LocIPT_Flags]
1444 test al, Flags_HideFeature
1445 jz PHSGHCAS_EndOfEntries
1446 PHSGHCAS_SomethingHidden:
1447 ; Calculate, where to get Hide-Config
1448 mov ax, LocHPT_LenOfHPT ; Size of a hidden-part-table entry.
1449 mul dl ; Multiply by partition-index.
1450 mov di, offset HidePartitionTable
1451 add di, ax ; We got the pointer
1452
1453 ; So process Hide-Config. Read out Bitfield-Entries,
1454 ; each points to a partition.
1455 ; 3Fh is end-marker / maximum entries = CFG_Partitions
1456 mov cl, [CFG_Partitions]
1457 mov bx,di ; Pointer to hidden-parts entry for this partition.
1458 mov ch,0 ; Start index in hidden-parts entry for this partition.
1459 mov dh,6 ; Bitfields are 6 bits wide.
1460 PHSGHCAS_SpreadLoop:
1461 mov dl,ch ; Load bitfield index from CH.
1462 call CONV_GetBitfieldValue ; Get value of bitfield.
1463 mov dl,al ; Partition index in DL.
1464 ;~ mov dl, [di]
1465 ;~ inc di
1466 ;~ cmp dl, 0FFh
1467 cmp dl,3fh ; Max value for 6-bits field.
1468 je PHSGHCAS_EndOfEntries
1469 call PART_GetPartitionPointer ; Pointer for partition DL to SI
1470 mov al, [si+LocIPT_Flags]
1471 or al, Flags_SpecialMarker ; Set marker
1472 mov [si+LocIPT_Flags], al
1473 inc ch ; Next bitfield.
1474 dec cl
1475 jnz PHSGHCAS_SpreadLoop
1476 PHSGHCAS_EndOfEntries:
1477 ret
1478PARTHIDESETUP_GetHideConfigAndSpread EndP
1479
1480
1481;
1482; Rousseau: Adjusted for packed hidden-part-table !
1483; Needs to be re-written.
1484;
1485; This is called by MBRS_PS_HiddenSetup
1486; In: DL - Partition, where to save Hide-Config
1487; Destroyed: None, but Locate-Pointer
1488PARTHIDESETUP_CollectHideConfigAndPutToTable Proc Near Uses ax si es di
1489 ; First calculate, where to put Hide-Config
1490 ;~ mov ax, LocIPT_MaxPartitions
1491 mov ax, LocHPT_LenOfHPT ; Length of an HPT-entry.
1492 mul dl ; Partition to store info for.
1493 push cs
1494 pop es
1495 mov di, offset HidePartitionTable ; Packed hideparttable.
1496 add di, ax ; We got the pointer in DI.
1497
1498 ;~ push di
1499
1500 ; Fill hide-part-table entry with 'unused' marker.
1501 ; Note that the entry is actually an array of 45 6-bit bitfields.
1502 ; Below fills 34 bytes = 45 6-bit bitfields.
1503 push di
1504 mov cx, LocHPT_LenOfHPT
1505 mov al, 0FFh
1506 rep stosb ; Fill up with FFh
1507 pop di
1508
1509 ;~ mov bp,di
1510
1511 ; Now walk through the IPT collecting all SpecialMarkers.
1512 ; For each do a bitfield-entry containing the number of the partition.
1513 mov si, offset PartitionTable
1514 xor ch, ch ; Partition index
1515 mov cl, [CFG_Partitions] ; Nr. of partitions in IPT
1516 mov ah,0 ; Next hide-index to write.
1517
1518 ;
1519 ; Collect all partitions that have the special marker set.
1520 ; This marker was set by toggling the hide/unhide option in the setup menu.
1521 ;
1522 PHSCHCAPTT_CollectLoop:
1523
1524 ; Get marker and test it.
1525 mov bl, [si+LocIPT_Flags]
1526 test bl, Flags_SpecialMarker
1527
1528 ; No marker.
1529 jz PHSCHCAPTT_NoMarker
1530
1531 ; Setup stuff for bitfield operation.
1532 push dx ; Save partition pointer.
1533 push bx ; Save marker.
1534 mov bx,di ; Get pointer to HPT-entry.
1535 mov dl,ah ; Index in entry.
1536 mov dh,6 ; Bitfield width.
1537 push ax ; Save index.
1538 mov al,ch ; Partition index to store.
1539
1540
1541 IFDEF AUX_DEBUG
1542 ;~ pushf
1543 ;~ pusha
1544 ;~ push ax
1545 ;~ mov al,dl
1546 ;~ call AuxIO_TeletypeHexByte
1547 ;~ mov al,':'
1548 ;~ call AuxIO_Teletype
1549 ;~ mov ax,bx
1550 ;~ call AuxIO_TeletypeHexWord
1551 ;~ mov al,':'
1552 ;~ call AuxIO_Teletype
1553 ;~ mov ax,bp
1554 ;~ call AuxIO_TeletypeHexWord
1555 ;~ mov al,':'
1556 ;~ call AuxIO_Teletype
1557 ;~ mov ax,sp
1558 ;~ call AuxIO_TeletypeHexWord
1559 ;~ mov al,':'
1560 ;~ call AuxIO_Teletype
1561 ;~ pop ax
1562 ;~ call AuxIO_TeletypeHexByte
1563 ;~ call AuxIO_TeletypeNL
1564 ;~ popa
1565 ;~ popf
1566 ENDIF
1567
1568 call CONV_SetBitfieldValue ; Store bitfield.
1569 pop ax ; Restore index.
1570 pop bx ; Restore marker.
1571 pop dx ; Restore partition pointer.
1572
1573 inc ah ; Advance to next index.
1574
1575 ;~ mov ds:[di], ch ; Write byte-Entry
1576 ;~ inc di
1577 xor bl, Flags_SpecialMarker ; Reset Flag
1578 mov [si+LocIPT_Flags], bl ; Store it in IPT
1579
1580
1581 PHSCHCAPTT_NoMarker:
1582 add si, LocIPT_LenOfIPT ; Advance to next partition in IPT.
1583 inc ch ; Next partition-index.
1584 dec cl ; Decrement partitions to process.
1585 jnz PHSCHCAPTT_CollectLoop ; Are we done yet ?
1586
1587 ;~ pop si ; Original Hide-Config Pointer -> SI
1588 ; Now check, if we have written anything
1589 ;~ cmp si, di
1590 test ah,ah ; See if we had to store anything.
1591 jne PHSCHCAPTT_SomethingToHide ; Yep, go to write end-marker.
1592
1593 ; Nothing to hide...so UNSET the Hidden-Feature Flag
1594 call PART_GetPartitionPointer ; Use DL to get part-pointer in SI.
1595 mov al, [si+LocIPT_Flags] ; Get flags.
1596 mov ah, Flags_HideFeature ; Hide mask.
1597 not ah ; Complement.
1598 and al, ah ; Clear hide-flag.
1599 mov [si+LocIPT_Flags], al ; Store it.
1600 ;~ pop bp
1601 ret ; Return to caller.
1602
1603 PHSCHCAPTT_SomethingToHide:
1604 cmp ah, LocIPT_MaxPartitions ; See if index is at end.
1605 jae PHSCHCAPTT_AllUsed ; Yep, no need to store end-marker.
1606
1607 ; Write end-marker.
1608 push dx ; Save partition pointer.
1609 mov al,3fh ; End marker (6-bit)
1610 mov dl,ah ; Index in HPT-entry.
1611 mov dh,6 ; Bitfield width.
1612 mov bx,di ; Get pointer to HPT-entry.
1613 call CONV_SetBitfieldValue ; Store end-marker.
1614 pop dx ; Restore partition pointer.
1615
1616 ;~ mov ax, si
1617 ;~ add ax, LocIPT_MaxPartitions
1618 ;~ cmp di, ax
1619 ;~ jae PHSCHCAPTT_AllUsed
1620 ; Set END-marker
1621 ;~ mov al, 0FFh
1622 ;~ stosb ; Write byte-Entry
1623 PHSCHCAPTT_AllUsed:
1624
1625 ; Something to hide...so SET the Hidden-Feature Flag
1626 call PART_GetPartitionPointer ; Use DL to get part-pointer in SI.
1627 mov al, [si+LocIPT_Flags] ; Get flags.
1628 or al, Flags_HideFeature ; Set hide-flag.
1629 mov [si+LocIPT_Flags], al ; Store it.
1630 ;~ pop bp
1631 ret ; Return to caller.
1632PARTHIDESETUP_CollectHideConfigAndPutToTable EndP
1633
1634; =============================================================================
1635
1636; This is called from MBRS_Routines_PartitionSetup
1637; In: DL - Partition to LogicalDriveLetter-Setup
1638; Destroyed: ax
1639PARTSETUP_DriveLetterSetup Proc Near Uses dx si es di
1640 call PART_GetPartitionPointer ; Gets the PartitionPointer for DL in SI
1641 ; SystemID must support DriveLetter feature (FAT16, HPFS, JFS)
1642 mov al, bptr [si+LocIPT_SystemID]
1643 push si
1644 call PART_SearchFileSysName
1645 pop si
1646 test ah, FileSysFlags_DriveLetter
1647 jnz PSDLS_GotLDLP
1648
1649 ; Drive-Letter feature only possible on HPFS/FAT16 (OS/2) systems
1650 mov cx, 0C04h
1651 mov si, offset TXT_SETUP_NoLDLpartition
1652 call SETUP_ShowErrorBox
1653 ret
1654
1655 PSDLS_GotLDLP:
1656 ; First build up menu and display current setting...
1657 call PARTSETUPDL_DrawMenuBase ; DL - partition-no
1658
1659 ; Now get the Logical-Drive-Letter for that partition...
1660 ;movzx bx, dl
1661 mov bl,dl
1662 mov bh,0
1663
1664 mov dl, byte ptr [DriveLetters+bx]
1665
1666 push bx
1667 ; DS:SI - IPT Entry of Partition, DL - LogicalDriveLetter
1668 call PARTSETUPDL_DrawDriveLetter
1669
1670 ; Now we got everything on-the-screen
1671 PSDLS_MainLoop:
1672 mov ah, 0
1673 int 16h
1674 cmp ah, Keys_Backspace
1675 je PSDLS_BackSpace
1676 cmp ah, Keys_Up
1677 je PSDLS_KeyUp
1678 cmp ah, Keys_Down
1679 je PSDLS_KeyDown
1680 cmp ah, Keys_ESC
1681 je PSDLS_KeyDONE
1682 cmp ah, Keys_ENTER
1683 je PSDLS_KeyDONE
1684 ; Direct-Letter-Input
1685 or al, 20h ; Lower-Case Input
1686 cmp al, 'c'
1687 jb PSDLS_MainLoop
1688 cmp al, 'z'
1689 ja PSDLS_MainLoop
1690 mov dl, al
1691 add dl, 1Dh ; -> Convert to used logic
1692 call PARTSETUPDL_DrawDriveLetter
1693 jmp PSDLS_MainLoop
1694
1695
1696 ; Clear drive-letter with backspace
1697 PSDLS_BackSpace:
1698 xor dl,dl
1699 call PARTSETUPDL_DrawDriveLetter
1700 jmp PSDLS_MainLoop
1701
1702 PSDLS_KeyUp:
1703 dec dl
1704 cmp dl, 7Fh
1705 jne PSDLS_KeyUpFix1
1706 xor dl, dl
1707 PSDLS_KeyUpFix1:
1708 cmp dl, 97h
1709 jbe PSDLS_KeyUpFix2
1710 mov dl, 97h
1711 PSDLS_KeyUpFix2:
1712 call PARTSETUPDL_DrawDriveLetter
1713 jmp PSDLS_MainLoop
1714
1715 PSDLS_KeyDown:
1716 inc dl
1717 cmp dl, 97h
1718 jbe PSDLS_KeyDownFix1
1719 xor dl, dl
1720 PSDLS_KeyDownFix1:
1721 cmp dl, 01h
1722 jne PSDLS_KeyDownFix2
1723 mov dl, 80h
1724 PSDLS_KeyDownFix2:
1725 call PARTSETUPDL_DrawDriveLetter
1726 jmp PSDLS_MainLoop
1727
1728
1729 PSDLS_KeyDONE:
1730 ; Write Drive-Letter into DriveLetter-Table
1731 pop bx
1732 mov bptr [DriveLetters+bx], dl
1733 mov al, ds:[si+LocIPT_Flags]
1734 mov ah, Flags_DriveLetter
1735 not ah
1736 and al, ah
1737 or dl, dl
1738 jz PSDLS_NoFlag
1739 or al, Flags_DriveLetter
1740 PSDLS_NoFlag:
1741 mov ds:[si+LocIPT_Flags], al
1742 ret
1743PARTSETUP_DriveLetterSetup EndP
1744
1745; Draw all standard-things for DriveLetterSetup, dynamic content not included.
1746PARTSETUPDL_DrawMenuBase Proc Near Uses dx si
1747 ; Calculate Position of Window.
1748 ; If Partition Selected Left-Side -> go Right-Sided Window
1749 ; otherwise Left-Sided.
1750 mov PartSetup_ActivePart, dl
1751 mov al, 8 ; X-Pos = 8
1752 and dl, 1
1753 jnz PSDLDMB_FirstStep
1754 mov al, 30h ; X-Pos = 48
1755 PSDLDMB_FirstStep:
1756 mov PartSetup_HiddenX, al
1757
1758
1759
1760; Draw base-window
1761CLR_PART_DL_XX_CLASSIC = 0d05h
1762CLR_PART_DL_XX_BM = 0a02h
1763CLR_PART_DL_XX_TB = 0a02h
1764IFDEF TESTBUILD
1765CLR_PART_DL_XX = CLR_PART_DL_XX_TB
1766ELSE
1767CLR_PART_DL_XX = CLR_PART_DL_XX_BM
1768ENDIF
1769
1770 mov cx, CLR_PART_DL_XX ; Lila on lila
1771 call VideoIO_Color
1772 mov bh, 06h
1773 mov bl, [PartSetup_HiddenX]
1774 mov dh, 0Ah
1775 mov dl, bl
1776 add dl, 16h
1777 push bx
1778 call VideoIO_MakeWindow
1779 pop bx
1780 ; Make Window-Header
1781 inc bl
1782 push bx
1783 mov cx, bx
1784 call VideoIO_Locate
1785 mov al, 0b5h
1786 call VideoIO_PrintSingleChar
1787
1788
1789
1790CLR_PART_DL_WINDOW_TITLE_CLASSIC = 0e05h
1791CLR_PART_DL_WINDOW_TITLE_BM = 0e02h
1792CLR_PART_DL_WINDOW_TITLE_TB = 0e02h
1793IFDEF TESTBUILD
1794CLR_PART_DL_WINDOW_TITLE = CLR_PART_DL_WINDOW_TITLE_TB
1795ELSE
1796CLR_PART_DL_WINDOW_TITLE = CLR_PART_DL_WINDOW_TITLE_BM
1797ENDIF
1798
1799 mov cx, CLR_PART_DL_WINDOW_TITLE ; Yellow on Lila
1800 call VideoIO_Color
1801 mov si, offset TXT_SETUP_DriveLetter
1802 call VideoIO_Print
1803
1804
1805
1806CLR_PART_DL_WINDOW_BORDER2_CLASSIC = 0d05h
1807CLR_PART_DL_WINDOW_BORDER2_BM = 0a02h
1808CLR_PART_DL_WINDOW_BORDER2_TB = 0a02h
1809IFDEF TESTBUILD
1810CLR_PART_DL_WINDOW_BORDER2 = CLR_PART_DL_WINDOW_BORDER2_TB
1811ELSE
1812CLR_PART_DL_WINDOW_BORDER2 = CLR_PART_DL_WINDOW_BORDER2_BM
1813ENDIF
1814
1815 mov cx, CLR_PART_DL_WINDOW_BORDER2 ; Lila on lila
1816 call VideoIO_Color
1817 mov al, 0c6h
1818 call VideoIO_PrintSingleChar
1819 pop bx
1820 ; Display help-information
1821 mov si, offset TXT_SETUPHELP_DriveLetter
1822
1823
1824
1825CLR_PART_DL_SETUP_HELP_CLASSIC = 0d05h
1826CLR_PART_DL_SETUP_HELP_BM = 0a02h
1827CLR_PART_DL_SETUP_HELP_TB = 0a02h
1828IFDEF TESTBUILD
1829CLR_PART_DL_SETUP_HELP = CLR_PART_DL_SETUP_HELP_TB
1830ELSE
1831CLR_PART_DL_SETUP_HELP = CLR_PART_DL_SETUP_HELP_BM
1832ENDIF
1833
1834 mov cx, CLR_PART_DL_SETUP_HELP ; Lila on lila
1835 call VideoIO_Color
1836
1837 call GetLenOfString ; CX - Len of string
1838 mov dx, cx
1839 mov cx, bx
1840 add cx, 0413h
1841 sub cl, dl
1842 call VideoIO_Locate
1843 mov al, '<'
1844 call VideoIO_PrintSingleChar
1845 call VideoIO_Print
1846 mov al, '>'
1847 call VideoIO_PrintSingleChar
1848 ;
1849 mov cx, 0F01h ; Bright White on Blue
1850 call VideoIO_Color
1851 mov cx, 0805h ; Position 8, 5
1852 add cl, PartSetup_HiddenX
1853 call VideoIO_Locate
1854 mov al, ' '
1855 mov cl, 12
1856 call VideoIO_PrintSingleMultiChar
1857 ret
1858PARTSETUPDL_DrawMenuBase EndP
1859
1860; Writes Logical Drive-Letter to Screen (Logical-Drive-Letter-Setup)
1861; In: DL - Logical Drive-Letter Byte
1862; Destroyed: None
1863PARTSETUPDL_DrawDriveLetter Proc Near Uses si
1864 ; 00h -> standard drive letter
1865 ; 80h -> use C: as drive letter
1866 ; 97h -> use Z: as drive letter
1867 push dx
1868 mov cx, 0805h ; Position 8, 5
1869 add cl, [PartSetup_HiddenX]
1870 call VideoIO_Locate
1871 add cl, 6 ; Everything centered (12/2)
1872 push cx
1873 mov al, ' '
1874 mov cl, 12
1875 call VideoIO_PrintSingleMultiChar ; Fill up area with spaces
1876
1877 or dl, dl
1878 jnz PSDLDDL_Letter
1879 mov si, offset TXT_SETUP_MAGIC_Disabled
1880 call GetLenOfString
1881 mov dx, cx
1882 pop cx
1883 call VideoIO_LocateToCenter ; LocateToCenter using TotalLen
1884 call VideoIO_Print
1885 pop dx
1886 ret
1887
1888 PSDLDDL_Letter:
1889 mov si, offset TXT_SETUP_MAGIC_Set
1890 call GetLenOfString
1891 mov dx, cx
1892 add dx, 2
1893 pop cx
1894 call VideoIO_LocateToCenter ; LocateToCenter using TotalLen
1895 call VideoIO_Print
1896 pop dx
1897 mov al, dl
1898 sub al, 3Dh
1899 call VideoIO_PrintSingleChar
1900 mov al, ':'
1901 call VideoIO_PrintSingleChar
1902 ret
1903PARTSETUPDL_DrawDriveLetter EndP
Note: See TracBrowser for help on using the repository browser.