Changeset 31 for trunk/BOOTCODE/REGULAR


Ignore:
Timestamp:
Jan 13, 2013, 8:15:35 AM (13 years ago)
Author:
Ben Rietbroek
Message:

Bumped code-version to v1.0.8 [2011-11-11]

Fixes

o Fixed the drive-letter feature that was broken in v1.07
o Corrected release date in signature which was not updated with v1.07

Changes

o Bumped code-version in signature to v1.0.8

The extra dot is cosmetic only, the version in the signature
is BCD-coded and did not change format.

o Reworked MBR code to contain two I13X signatures

These signatures are actually MOV EAX,'X31I' in the original eCS
LVM MBR-code. However, they are at different offsets in the v1.x
and v2.x versions of the LVM MBR-code. (v1.x->0d5h -- v2.x->0d0h)
Other code might depend on their existence so we put both in
the AiR-BOOT MBR. (See eCS bugtracker issue #3002)

Note

This commit and all following commits upto and including the RC3
commit [2012-09-09] are delayed commits from a local repository.
Also, the RC (Release Candidate) naming of the corresponding commits
is a bit misleading. One would label a revision with RC when near to
a final release. Since many things have changed between RC1,RC2 & RC3,
these RC's should be interpreted as mile-stones.

WARNING!!

All commits upto and including the commit of [2012-05-13] contain
a severe bug!! Building from these sources and then disabling
the 'force LBA' feature while also using the drive-letter feature or
editing the label can destroy the MBR on all attached disks!!
DO NOT DISABLE 'FORCE LBA USAGE' WHEN BUILT FROM THE ABOVE COMMITS!!

Location:
trunk/BOOTCODE/REGULAR
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/BOOTCODE/REGULAR/AUXIO.ASM

    r30 r31  
    2525; -----------------------
    2626; Output some stuff to the serial port.
    27 ; Word at 1B0h in MBR must be initialized for this.
     27; The aux parameters in the MBR must be initialized for this.
    2828; Lower byte is com-port, 0=disabled, 1=com1, etc.
    2929; High byte is initialization; see below. (0e3h)
  • trunk/BOOTCODE/REGULAR/BOOTMENU.ASM

    r30 r31  
    190190   mov     cx, CLR_INFO_WINDOW_BM
    191191   ;mov     cx, 0C06h ; brown, main background
    192    call    VideoIO_Color                                                         ; Rousseau: color info window
     192   call    VideoIO_Color                                                         ; Ccolor info window
    193193
    194194   mov     bx, 1401h
     
    211211
    212212   mov     cx, CLR_INFO_TEXT_BM                   ; Info text
    213    call    VideoIO_Color                                                         ; Rousseau: color info text
     213   call    VideoIO_Color                                                         ; Color info text
    214214
    215215   mov     si, offset TXT_BootMenuHelpText1
  • trunk/BOOTCODE/REGULAR/DRIVEIO.ASM

    r30 r31  
    6161   mov     si, offset Configuration      ; Calculate new checksum
    6262   xor     bx, bx
    63    mov     cx, 5                         ; Total of 5 Config-Sectors
     63
     64   ; Changed from 5 to calculated
     65   ; Fixes issue: #2987 -- "air-boot doesn't remember drive letter"
     66   mov     cx, (MBR_BackUpMBR - Configuration) / 2   ; Size of the ab-configuration
     67   ; TASM does not evaluate expression above corrrectly.
     68   ; Listing shows correct opcode but generated opcode has imm. word byteswapped.
     69   ; Casting to byte also does not work (overflow).
     70   ; So we swap back here -- must be removed in JWasm version !!
     71      xchg  ch,cl
     72
    6473   mov     dx, [CFG_CheckConfig]
    6574   mov     [CFG_CheckConfig], bx
     
    7382   mov     dx, 0080h                     ; First harddrive, Sector 55...
    7483   mov     cx, 0037h
    75    mov     ax, 0305h                     ; Function 03, 5 sectors to write
     84
     85   ; Changed from 5 to calculated
     86   ; Fixes issue: #2987 -- "air-boot doesn't remember drive letter"
     87   mov     ax, (MBR_BackUpMBR - Configuration) / 2  ; sizeof(ab-configuration) to write
     88   ; TASM does not evaluate expression above corrrectly.
     89   ; Listing shows correct opcode but generated opcode has imm. word byteswapped.
     90   ; Casting to byte also does not work (overflow).
     91   ; So we swap back here -- must be removed in JWasm version !!
     92      xchg  ah,al
     93   mov     ah,03h
     94
    7695   int     13h
    7796   jnc     DIOSC_NoError
     
    147166;  This is calculated by Sector*Heads. Comparing will get done with Bit 25-10
    148167;  on LBA sectors, so we actually divide sector number by 1024.
    149 DriveIO_InitLBASwitchTable      Proc Near   Uses es di                           ; Rousseau: LBA !
     168DriveIO_InitLBASwitchTable      Proc Near   Uses es di
    150169   mov     di, offset LBASwitchTable
    151170   mov     dh, TotalHarddiscs
     
    166185         mov   ah,0
    167186
    168          mov     bl, dh         ; DH -> head count                               ; Rousseau: nope, it's max head number !
     187         mov     bl, dh         ; DH -> max head number
    169188         mul     bl             ; AX = Sectors*Heads
    170189         shl     ah, 1
     
    188207; Rousseau: Enhanced to handle sector-numbers 127 and 255 besides 63 for LVM-info sectors.
    189208;           Ugly, need to cleanup.
    190 DriveIO_LVMAdjustToInfoSector   Proc Near   Uses                                 ; Rousseau: LVM stuff !
     209DriveIO_LVMAdjustToInfoSector   Proc Near   Uses
    191210
    192211
     
    555574   mov     cx, wptr cs:[CurPartition_Location+6] ; Gets cur. partition location
    556575
    557    call    DriveIO_LVMAdjustToInfoSector                                         ; Rousseau: LVM stuff !
     576   call    DriveIO_LVMAdjustToInfoSector
    558577
    559578   mov     si, offset LVMSector
     
    593612   ;popf
    594613
    595    call    LVM_CheckSectorSignature                                              ; Rousseau: LVM stuff !
     614   call    LVM_CheckSectorSignature
    596615   jnc     DIOLLVMS_NoLVMSector
    597    call    LVM_CheckSectorCRC                                                    ; Rousseau: LVM stuff !
     616   call    LVM_CheckSectorCRC
    598617   jnc     DIOLLVMS_NoLVMSector
    599618   ret
     
    662681; Preserve: all registers
    663682; #########################################################################
    664 DriveIO_LoadSector              Proc Near  Uses ax bx ds si es di                ; Rousseau: Disk IO
     683DriveIO_LoadSector              Proc Near  Uses ax bx ds si es di
    665684   test     cs:[CurIO_UseExtension], 1
    666685   jz       DIOLS_UseNormal
    667    ; Are we forced do use LBA via Setting?
    668    test     cs:[CFG_ForceLBAUsage], 1                                            ; Rousseau: LBA
     686   ; Are we forced do use LBA via Setting? ; Rousseau: LBA
    669687   jnz      DIOLS_UseExtension
    670688   ; Is the drive not a harddrive?
     
    685703         pop      es
    686704         mov      bx, si                     ; ES:BX - Destination
    687          mov      ax, 0201h                  ; Function 2 - Load Sector          ; Rousseau: Disk IO -- legacy BIOS call
     705         mov      ax, 0201h                  ; Function 2 - Load Sector
    688706         int      13h
    689707         jnc      DIOLS_Success
     
    704722      pop     ds
    705723      mov     si, offset DriveIO_DAP
    706       mov     ah, 42h                        ; Extended Read                     ; Rousseau: Disk IO -- extended BIOS call
     724      mov     ah, 42h                        ; Extended Read
    707725      int     13h
    708726   pop     cx
     
    728746   jz       DIOSS_UseNormal
    729747   ; Are we forced do use LBA via Setting?
    730    test     cs:[CFG_ForceLBAUsage], 1                                            ; Rousseau: LBA
     748   test     cs:[CFG_ForceLBAUsage], 1
    731749   jnz      DIOSS_UseExtension
    732750   ; Is the drive not a harddrive?
  • trunk/BOOTCODE/REGULAR/OTHER.ASM

    r30 r31  
    363363   mov     si, offset Configuration
    364364   xor     bx, bx
    365    mov     cx, 5                   ; Total of 5 Sectors
     365
     366   ; Changed from 5 to calculated
     367   ; Fixes issue: #2987 -- "air-boot doesn't remember drive letter"
     368   mov     cx, (MBR_BackUpMBR - Configuration) / 2   ; Size of the ab-configuration
     369   ; TASM does not evaluate expression above corrrectly.
     370   ; Listing shows correct opcode but generated opcode has imm. word byteswapped.
     371   ; Casting to byte also does not work (overflow).
     372   ; So we swap back here -- must be removed in JWasm version !!
     373      xchg  ch,cl
     374
    366375   mov     dx, CFG_CheckConfig
    367376   mov     CFG_CheckConfig, bx
  • trunk/BOOTCODE/REGULAR/PARTMAIN.ASM

    r30 r31  
    435435   ret
    436436PART_FillOutSizeElement         EndP
     437
     438
     439
     440
     441
     442
     443
     444
     445
     446
     447
     448; This routine is called to hide a partition
     449;        In: DL - Partition to hide
     450; Destroyed: None
     451PART_HidePartition              Proc Near   Uses ax bx cx dx si di
     452   call    PART_GetPartitionPointer      ; Pointer to partition (DL) -> SI
     453
     454   ; First load the partition table of that partition...
     455   mov     ax, wptr [si+LocIPT_AbsolutePartTable+0]
     456   mov     bx, wptr [si+LocIPT_AbsolutePartTable+2]
     457   mov     cx, wptr [si+LocIPT_LocationPartTable+1]
     458   mov     dh, bptr [si+LocIPT_LocationPartTable+0]
     459   mov     dl, [si+LocIPT_Drive]
     460   call    DriveIO_LoadPartition
     461   ; Partition-Table now LOADED
     462   mov     di, offset PartitionSector+446 ; ES:DI - 1st partitionentry...
     463
     464   ; Put our partition's location into registers...
     465   mov     ax, wptr [si+LocIPT_AbsoluteBegin+0]
     466   mov     bx, wptr [si+LocIPT_AbsoluteBegin+2]
     467   sub     ax, wptr [si+LocIPT_AbsolutePartTable+0]
     468   sbb     bx, wptr [si+LocIPT_AbsolutePartTable+2]
     469   ; BX:AX - absolute position of partition relative to partition table
     470   ; ...and search for it...
     471  PHP_SearchLoop:
     472      cmp     ax, wptr es:[di+LocBRPT_RelativeBegin]
     473      jne     PHP_SearchMismatch
     474      cmp     bx, wptr es:[di+LocBRPT_RelativeBegin+2]
     475      jne     PHP_SearchMismatch
     476      jmp     PHP_SearchMatch
     477     PHP_SearchMismatch:
     478      add     di, LocBRPT_LenOfEntry     ; 16 Bytes per partition entry
     479   cmp     di, 500+offset PartitionSector
     480   jb      PHP_SearchLoop
     481   jmp     MBR_HaltSystem                ; not found, something is wrong here
     482
     483   ; Found entry...
     484  PHP_SearchMatch:
     485   mov     al, bptr es:[di+LocBRPT_SystemID] ; Partition-ID into AL
     486   call    PART_SearchFileSysHiddenID    ; Put on =STEALTH=
     487   mov     bptr es:[di+LocBRPT_SystemID], al
     488   IFDEF ReleaseCode
     489      call    DriveIO_SavePartition      ; Saves Partition-Table
     490   ENDIF
     491   ret
     492PART_HidePartition              EndP
     493
     494; This here is for marking the first "good" non-hidden partition as being
     495;  active. It requires the partition table at EXECBASE.
     496;  Some BIOSes have problems with no primary marked active. Actually this is
     497;  a buggy implementation, because the MBR-code should normally check,
     498;  *not* the BIOS. This one *could* cause havoc to some systems, but I can't
     499;  do anything else.
     500PART_MarkFirstGoodPrimary       Proc Near   Uses ax si di
     501   mov     di, offset PartitionSector+446 ; DS:SI - 1st partitionentry
     502   ; First action to do: Remove the active flag from every partition
     503   push    di
     504      mov     cl, 4
     505     PMPP_RemoveActiveFlagLoop:
     506         and     bptr es:[di+LocBRPT_Flags], 7Fh
     507         add     di, LocBRPT_LenOfEntry
     508      dec     cl
     509      jnz     PMPP_RemoveActiveFlagLoop
     510   pop     di
     511   ; First Search, will hit on any PartitionID that is:
     512   ; a) not 0
     513   ; b) not hidden
     514   ; c) not extended partition (05h or 0Fh)
     515  PMPP_Search1Loop:
     516      mov     al, bptr es:[di+LocBRPT_SystemID]
     517      or      al, al
     518      jz      PMPP_Search1NoHit
     519      cmp     al, 05h
     520      je      PMPP_Search1NoHit
     521      cmp     al, 0Fh
     522      je      PMPP_Search1NoHit
     523      mov     bl, al                     ; BL == AL == PartitionID
     524      push    si
     525         call    PART_SearchFileSysName
     526      pop     si                         ; AL == UnhiddenPartitionID
     527      cmp     al, bl                     ; if ID is unhidden...
     528      je      PMPP_SearchHit
     529     PMPP_Search1NoHit:
     530      add     di, LocBRPT_LenOfEntry     ; 16 Bytes per Partition-Entry
     531   cmp     di, 500+offset PartitionSector
     532   jb      PMPP_Search1Loop
     533
     534   mov     di, offset PartitionSector+446 ; DS:SI - 1st Partition-Entry
     535   ; Second Search, hit on anything that is not an extended partition
     536   ;  (05 or 0Fh)
     537  PMPP_Search2Loop:
     538      mov     al, bptr es:[di+LocBRPT_SystemID]
     539      or      al, al
     540      jz      PMPP_Search2NoHit
     541      cmp     al, 05h
     542      je      PMPP_Search2NoHit
     543      cmp     al, 0Fh
     544      jne     PMPP_SearchHit
     545     PMPP_Search2NoHit:
     546      add     di, LocBRPT_LenOfEntry     ; 16 Bytes per Partition-Entry
     547   cmp     di, 500+offset PartitionSector
     548   jb      PMPP_Search2Loop
     549   jmp     PMPP_SearchFailed
     550
     551  PMPP_SearchHit:
     552   or      bptr es:[di], 80h             ; SET ACTIVE PARTITION
     553  PMPP_SearchFailed:
     554   ret
     555PART_MarkFirstGoodPrimary       EndP
     556
     557; Searches the Name and Flags to a FileSysID (PartitionID)
     558;        In: AL - FileSysID
     559;       Out: AL - Unhidden File-System-ID, AH - Flags for this File-System
     560;            SI - Pointer to Name (8char)
     561; Destroyed: *none*
     562PART_SearchFileSysName          Proc Near  Uses bx dx
     563   ;movzx   bx, al
     564   mov   bl,al
     565   mov   bh,0
     566
     567   mov     si, offset FileSysIDs
     568  PSFSN_SearchLoop:
     569      lodsw                              ; AL - NormalID, AH-HiddenID
     570      mov     dl, ds:[si]                ; DL - File-System-Flags
     571      inc     si
     572      cmp     al, bl                     ; Check, if Unhidden-ID matches...
     573      je      PSFSN_Match
     574      cmp     ah, bl                     ; Check, if Hidden-ID matches...
     575      je      PSFSN_Match
     576      mov     al, bl                     ; So Unhidden-ID will be Original-ID
     577      cmp     ah, 0                      ; Unknown (last ID in table)
     578      je      PSFSN_Match
     579      inc     bh
     580      jmp     PSFSN_SearchLoop
     581
     582  PSFSN_Match:
     583   ; AL is already Unhidden-ID
     584   mov     ah, dl
     585   ; AH is now the FileSystem-Flag
     586   ;movzx   bx, bh
     587   mov   bl,bh
     588   mov   bh,0
     589
     590   shl     bx, 3   ; Offsets * 8
     591   mov     si, offset FileSysNames
     592   add     si, bx
     593   ret
     594PART_SearchFileSysName          EndP
     595
     596; Searches the Hidden ID corresponding to a FileSysID (PartitionID)
     597;        In: AL - FileSysID
     598;       Out: AL - Hidden File-System-ID
     599PART_SearchFileSysHiddenID      Proc Near  Uses bx
     600   ;movzx   bx, al
     601   mov   bl,al
     602   mov   bh,0
     603
     604   mov     si, offset FileSysIDs
     605  PSFSHI_SearchLoop:
     606      lodsw                              ; AL - NormalID, AH-HiddenID
     607      inc     si
     608      cmp     al, bl                     ; Check, if Unhidden-ID matches...
     609      je      PSFSHI_Match
     610      cmp     ah, bl                     ; Check, if Hidden-ID matches...
     611      je      PSFSHI_Match
     612      mov     ah, bl                     ; So Unhidden-ID will get replied...
     613      cmp     ah, 0                      ; Unknown (last ID in table)
     614      je      PSFSHI_Match
     615      inc     bh
     616      jmp     PSFSHI_SearchLoop
     617
     618  PSFSHI_Match:
     619   mov     al, ah                        ; AL = Hidden ID
     620   ret
     621PART_SearchFileSysHiddenID      EndP
     622
     623;        In: DS:SI - Partition-Name, CX - Maximum/Total Length
     624;       Out: Carry-Flag set, if valid Partition-Name
     625; Destroyed: None
     626PART_CheckForValidPartName      Proc Near   Uses ax cx dx si
     627   ; Our logic is as follows:
     628   ;  If all chars are U -> Invalid (due reformated signature)
     629   ;  If anything below 32, but 0 -> Invalid (due invalid chars)
     630   ;  If anything above 165 -> Invalid (due invalid chars)
     631   ;  If anything between 123-128 -> Invalid (due invalid chars)
     632   ;  DX - holds count of 'U's
     633   push    cx
     634      or      cx, cx
     635      jz      PCFVPN_InvalidName
     636      xor     dx, dx
     637     PCFVPN_CheckLoop:
     638         lodsb
     639         cmp     al, 0
     640         je      PCFVPN_ValidChar
     641         cmp     al, 32
     642         jb      PCFVPN_InvalidName
     643         cmp     al, 165
     644         ja      PCFVPN_InvalidName
     645         cmp     al, 123
     646         jb      PCFVPN_ValidChar
     647         cmp     al, 128
     648         jbe     PCFVPN_InvalidName
     649        PCFVPN_ValidChar:
     650         cmp     al, 'U'
     651         jne     PCFVPN_NoMagic
     652         inc     dx
     653        PCFVPN_NoMagic:
     654      dec     cx
     655      jnz     PCFVPN_CheckLoop
     656   pop     cx
     657   cmp     cx, dx
     658   clc
     659   je      PCFVPN_WasMagic
     660   stc
     661  PCFVPN_WasMagic:
     662   ret
     663  PCFVPN_InvalidName:
     664   pop     cx
     665   clc
     666   ret
     667PART_CheckForValidPartName      EndP
     668
     669
     670; Rousseau: added
     671; Compare a volume-label in the IPT to the install-volume
     672; SI holds pointer to entry in IPT
     673; CY set if this entry is also the install-volume
     674PART_IsInstallVolume            Proc Near   Uses ax cx dx si di
     675      cld                                    ; Advance upwards with lodsb
     676      mov   di, offset eCS_InstallVolume     ; Address of install-volume label (max. 11 chars)
     677
     678      mov   cx, 11                           ; Maximum length of label
     679      xor   dl, dl                           ; Not found yet
     680
     681    ; Compare next character
     682    PART_IsInstallVolumeNext:
     683      lodsb                                  ; Load byte from SI (IPT-entry)
     684      ;cmp      al,' '                        ; If space then use zero
     685      ;jne      PART_IsInstallVolume_skip1
     686      ;xor      al,al
     687   PART_IsInstallVolume_skip1:
     688      xchg     ah,al                         ; Save char to AH
     689      xchg     si,di                         ; Exchange pointers
     690      lodsb                                  ; Load byte from SI (install-volume label)
     691      ;cmp      al,' '                        ; If space then use zero
     692      ;jne      PART_IsInstallVolume_skip2
     693      ;xor      al,al
     694   PART_IsInstallVolume_skip2:
     695      xchg     si,di                         ; Reexchange pointers
     696      call     AuxIO_Teletype
     697      call     CONV_ToUpper
     698      call     AuxIO_Teletype
     699      xchg     al,ah
     700      call     AuxIO_Teletype
     701      call     CONV_ToUpper
     702      call     AuxIO_Teletype
     703      call     AuxIO_TeletypeNL
     704
     705      ; Are both of them zero ?
     706      ; Then the names could be the same, but cx must not equal 11
     707      ; because that would indicate a null-string.
     708      mov      dh,al
     709      or       dh,ah
     710      jz       PART_IsInstallVolumeFound
     711
     712      cmp      ah,al                         ; Are the the same ?
     713      jnz      PART_IsInstallVolumeNotFound  ; Nope, compare ended
     714      loop     PART_IsInstallVolumeNext      ; Yep, Compare next character
     715
     716   PART_IsInstallVolumeFound:
     717      ; If CX is still 11 this was a zero string
     718      ; and thus not a valid volume-name.
     719      ; This should not occur as this function is only called when the first
     720      ; byte is non-zero.
     721      cmp      cx,11
     722      je       PART_IsInstallVolumeNotFound
     723      ; Found !
     724      mov      dl,1                          ; Found
     725      jmp      PART_IsInstallVolumeEnd
     726
     727
     728   PART_IsInstallVolumeNotFound:
     729      mov      dl,0
     730      jmp      PART_IsInstallVolumeEnd
     731
     732
     733   PART_IsInstallVolumeEnd:
     734      ; Set the status in CY
     735      mov      al,dl
     736      add      al,'0'
     737      call     AuxIO_TeletypeHexByte
     738      call     AuxIO_TeletypeNL
     739      rcr      dl,1                          ; Put found-flag in CY
     740      ret
     741PART_IsInstallVolume            EndP
    437742
    438743
     
    525830   mov     dh, bptr [si+LocIPT_LocationPartTable+0]
    526831   mov     dl, [si+LocIPT_Drive]
    527    call    DriveIO_LoadPartition         ; Load Table...                         ; Rousseau: LOAD PARTITION !
     832
     833   call    DriveIO_LoadPartition         ; Load Table...                [LOAD]
     834
    528835   ; --------------------------------------------------- MODIFY PARTITION TABLE
    529836   push    cs
     
    565872   or      byte ptr es:[di+LocBRPT_Flags], 80h ; set ACTIVE partition
    566873   IFDEF ReleaseCode
    567       call    DriveIO_SavePartition      ; Saves the Partition-Table             ; Rousseau: SAVE PARTITION !
     874      call    DriveIO_SavePartition      ; Saves the Partition-Table    [SAVE]
    568875   ENDIF
    569876
     
    578885   ; BX:AX -> Absolute End-Position of Partition
    579886
    580    test    CFG_ForceLBAUsage, 1                                                  ; Rousseau: LBA
     887   test    CFG_ForceLBAUsage, 1
    581888   jnz     PSP_ForceI13X
    582889   ; LBA-boundary at 16450560 (FB0400h) (16320x16x63)
     
    641948      mov     cx, 0001h                  ; Cylinder 0, Sector 1
    642949      mov     dx, 0080h                  ; First HD, Head 0
    643       call    DriveIO_LoadPartition      ; Load Primary Partition Table          ; Rousseau: LOAD MBR !
     950                                                                     ; Load MBR
     951      call    DriveIO_LoadPartition      ; Load Primary Partition Table
    644952      call    PART_MarkFirstGoodPrimary
    645953      IFDEF ReleaseCode
    646          call    DriveIO_SavePartition   ; Saves the Partition-Table             ; Rousseau: SAVE MBR !
     954                                                                     ; Save MBR
     955         call    DriveIO_SavePartition   ; Saves the Partition-Table
    647956      ENDIF
    648957     PSP_NoHideAdjustPrimaryMark:
     
    7161025   mov     dh, [si+LocIPT_LocationBegin+0]
    7171026   mov     dl, [si+LocIPT_Drive]
    718    call    DriveIO_LoadPartition         ; Loads boot-sector...                  ; Rousseau: LOAD PART BOOT-SECTOR !!
     1027   call    DriveIO_LoadPartition         ; Loads boot-sector...   [PARTBOOTSEC]
    7191028
    7201029   test    CFG_DetectVIBR, 1
     
    8061115
    8071116      ; Rousseau: # Boot Logical Partitions)
    808       ; FreeDOS and eCS on extpart on non-huge needs special support. (old ja jump)
    809       ; PC-DOS7 on huge pri fat16 2G works with both (XP too) when at start of disk. (also when offset at 20MiB)
    810       ; PCD7 bonkt vast als in 2GiB log at start of space. "Starting PC DOS..." verschijnt. PCD Loader probleem.
     1117      ; FreeDOS and eCS on extpart on non-huge needs special support.
     1118      ; (old ja jump)
     1119      ; PC-DOS7 on huge pri fat16 2G works with both (XP too) when at start of disk.
     1120      ; (also when offset at 20MiB)
     1121      ; PCD7 bonkt vast als in 2GiB log at start of space.
     1122      ; "Starting PC DOS..." verschijnt. PCD Loader probleem.
    8111123      ; Offset van start-of-disk bij PCD7 niet meer dan 2GiB maken.
    8121124      ; Special is needed to boot ECS-CXXVAC (log-part) on Douwskie Box with 40G disk.
     
    8191131      ; Laatste 63 is MBR.
    8201132      ;
    821       ; It seems PRI's already get special treatment in that they get their hidden secs updated.
    822       ; (100MB HD, moved 50MB PRI-DOS part UP, DFSee complains about wrong hidden, but AiR-BOOT corrects it before booting)
     1133      ; It seems PRI's already get special treatment in that they get their
     1134      ; hidden secs updated.
     1135      ; (100MB HD, moved 50MB PRI-DOS part UP, DFSee complains about wrong hidden,
     1136      ; but AiR-BOOT corrects it before booting)
    8231137
    8241138      ; FreeDOS zet 63 in SPT in BPB op 255/255 geo !!!!
     
    8291143
    8301144      ; Display volume-name
     1145      ; Just before booting the selected partition
    8311146      pushf
     1147      pusha
    8321148      push     si
    8331149      add      si, LocIPT_Name
    8341150      call     MBR_TeletypeVolName
    8351151      xor      si,si
    836       call     MBR_TeletypeNL                                                    ; Rousseau: Just before booting the selected partition
     1152      call     MBR_TeletypeNL
    8371153      pop      si
     1154      popa
    8381155      popf
    8391156
    8401157
    8411158
    842       jmp     special                                                            ; Rousseau: GOT IT !!! (LOG-BOOT) (alleen op huge disks !)
    843       ;jmp      PSP_NoSpecialSupport
    844       ;ja      PSP_NoSpecialSupport                                              ; Rousseau: original M. Kiewitz...
    845       ;jbe     PSP_NoSpecialSupport                                               ;   had to change to opposite !
     1159
     1160
     1161
     1162      ;
     1163      ; This section will be sanitized in the JWasm version.
     1164      ;
     1165
     1166      jmp     special
     1167      ;jmp     PSP_NoSpecialSupport
     1168
     1169      ;ja      PSP_NoSpecialSupport
     1170      ;jbe     PSP_NoSpecialSupport
    8461171
    8471172
     
    8551180      ; Special Support needed
    8561181special:
    857       ; Write actual drive-letter to partition boot-record.
    858       ; This is according to BPB.
     1182      ; Write actual drive-letter to partition boot-record in memory.
    8591183      mov     al, bptr [si+LocIPT_Drive]
     1184
    8601185      ; Also an influence with FreeDOS !
    8611186      ; Generates JFS ERROR when not set correctly !!!
    862       mov     bptr es:[di+36], al               ; Write Actual Drive-Letter (80h id first drive)        !!!!!!!!!!!!!!!!!!!!!!!
     1187      mov     bptr es:[di+36], al              ; Write Actual Drive-Letter to
     1188                                                ; PBR in RAM. (BIOS notation)
     1189
     1190      ;
     1191      ; Display drive info (debug)
     1192      ;
     1193      push     ax
     1194      mov      al,' '
     1195      call     VideoIO_PrintSingleChar
     1196      pop      ax
     1197      call     VideoIO_PrintHexByte
     1198      mov      al,'-'
     1199      call     VideoIO_PrintSingleChar
     1200
     1201      ;
     1202      ; Absolute offset of volume
     1203      ;
     1204      mov      ax, [si+LocIPT_AbsoluteBegin+2]
     1205      call     VideoIO_PrintHexWord
     1206      mov      ax, [si+LocIPT_AbsoluteBegin]
     1207      call     VideoIO_PrintHexWord
     1208      mov      al,'-'
     1209      call     VideoIO_PrintSingleChar
     1210
     1211      ;
     1212      ; Relative offset (3fh/63 with logicals)
     1213      ;
     1214      mov      ax,es:[di+30]
     1215      call     VideoIO_PrintHexWord
     1216      mov      ax,es:[di+28]
     1217      call     VideoIO_PrintHexWord
    8631218
    8641219      ; This could be incorrect when a partition is moved,
    8651220      ; or the system installer puts the wrong value here.
    866       ; FreeDOS (log-part) i.e. puts 03fH (63d) here, eventhough it is not a the start of the disk.
     1221      ; FreeDOS (log-part) i.e. puts 03fH (63d) here, eventhough it is not
     1222      ; at the start of the disk.
    8671223      ; This fixing is done by OS/2 BM as well, according to Martin.
    8681224      mov     ax, [si+LocIPT_AbsoluteBegin]
     
    8761232;jmp   PSP_NoLogicalSupport
    8771233
     1234
     1235   ;
     1236   ; Test if the drive-letter feature is active for this partition.
     1237   ; If so, then the drive that the user defined will be placed at
     1238   ; byte 25h (37d) of the in-ram PartitionSector (BPB).
     1239   ; (BIOS 80h notation: 80h=C, 81h=D, etc.)
     1240   ; This is a remedy for when the corresponding field (25h) in the BPB on
     1241   ; disk is zero.
     1242   ;
    8781243   test    byte ptr [si+LocIPT_Flags], Flags_DriveLetter
    8791244   jz      PSP_NoLogicalSupport
     
    8861251      mov     bptr es:[di+37], al        ; Write Drive Letter (OS/2 only)
    8871252
     1253      ; Display dl-feature drive if active
     1254      push     ax
     1255      mov      al,'-'
     1256      call     VideoIO_PrintSingleChar
     1257      pop      ax
     1258      call     VideoIO_PrintHexByte
     1259
    8881260   ; -------------------------------------------- COPY BOOT-RECORD TO STARTBASE
    8891261  PSP_NoLogicalSupport:
     1262
     1263
     1264      mov      al,'-'
     1265      call     VideoIO_PrintSingleChar
     1266      mov      al,[ExtendedAbsPosSet]
     1267      call     VideoIO_PrintHexByte
     1268
     1269
    8901270   push    si
    8911271      mov     ax, StartBaseSeg
     
    8961276      rep     movsw
    8971277   pop     si
    898    ; ---------------------------------------------------- NOW START BOOT-RECORD  ; Rousseau: START PARTITION BOOT-RECORD !!
     1278   ; ---------------------------------------------------- NOW START BOOT-RECORD
     1279
     1280
    8991281
    9001282
     
    9031285ENDIF
    9041286
    905                ;
    906                ; ########################### WAIT FOR KEY ################################
    907                ;
    908 
    909    ; Rousseau:
    910    ; Wait for key so we can see which volume is going to be started.
    911    ;xor     ax, ax
    912    ;int     16h
    913    ;cmp     al, 1bh                        ; is escape-key ?
    914    ;jne   skip_reenter
    915 
    916    ;jmp      MBR_Main_ReEnterBootMenuPre   ; yep, re-enter boot-menu
    917 
    918 skip_reenter:
    919 
    920 
    921 
    922 
    923 
    924 
    925 
     1287
     1288
     1289
     1290;
     1291; ################################## BYE BYE ##################################
     1292;
     1293
     1294   ;
     1295   ; Wait for keypress
     1296   ;
     1297   xor     ax, ax
     1298   int     16h
     1299
     1300   ; Is escape-key ?
     1301   cmp     al, 1bh
     1302
     1303   ; Nope, Go activate PBR loader
     1304   jne      start_pbr
     1305
     1306   ; Yep, Reenter bootmenu
     1307   jmp      MBR_Main_ReEnterBootMenuPre
     1308
     1309
     1310
     1311;
     1312; Transfer control to the PBR
     1313;
     1314start_pbr:
    9261315
    9271316   ;
     
    9361325   mov     dl, cs:[si+LocIPT_Drive]      ; Drive Physical No
    9371326
     1327   ;
     1328   ; JUMP TO PBR loader
     1329   ;
    9381330   IFDEF ReleaseCode
    939       db      0EAh                       ; JUMP TO Entry Point...Bye Bye
     1331      db      0EAh
    9401332      dw      StartBasePtr
    9411333      dw      StartBaseSeg
    9421334   ENDIF
     1335
     1336
    9431337PART_StartPartition             EndP
    9441338
    9451339
    946 
    947 
    948 
    949 
    950 
    951 
    952 
    953 
    954 
    955 ; This routine is called to hide a partition
    956 ;        In: DL - Partition to hide
    957 ; Destroyed: None
    958 PART_HidePartition              Proc Near   Uses ax bx cx dx si di
    959    call    PART_GetPartitionPointer      ; Pointer to partition (DL) -> SI
    960 
    961    ; First load the partition table of that partition...
    962    mov     ax, wptr [si+LocIPT_AbsolutePartTable+0]
    963    mov     bx, wptr [si+LocIPT_AbsolutePartTable+2]
    964    mov     cx, wptr [si+LocIPT_LocationPartTable+1]
    965    mov     dh, bptr [si+LocIPT_LocationPartTable+0]
    966    mov     dl, [si+LocIPT_Drive]
    967    call    DriveIO_LoadPartition
    968    ; Partition-Table now LOADED
    969    mov     di, offset PartitionSector+446 ; ES:DI - 1st partitionentry...
    970 
    971    ; Put our partition's location into registers...
    972    mov     ax, wptr [si+LocIPT_AbsoluteBegin+0]
    973    mov     bx, wptr [si+LocIPT_AbsoluteBegin+2]
    974    sub     ax, wptr [si+LocIPT_AbsolutePartTable+0]
    975    sbb     bx, wptr [si+LocIPT_AbsolutePartTable+2]
    976    ; BX:AX - absolute position of partition relative to partition table
    977    ; ...and search for it...
    978   PHP_SearchLoop:
    979       cmp     ax, wptr es:[di+LocBRPT_RelativeBegin]
    980       jne     PHP_SearchMismatch
    981       cmp     bx, wptr es:[di+LocBRPT_RelativeBegin+2]
    982       jne     PHP_SearchMismatch
    983       jmp     PHP_SearchMatch
    984      PHP_SearchMismatch:
    985       add     di, LocBRPT_LenOfEntry     ; 16 Bytes per partition entry
    986    cmp     di, 500+offset PartitionSector
    987    jb      PHP_SearchLoop
    988    jmp     MBR_HaltSystem                ; not found, something is wrong here
    989 
    990    ; Found entry...
    991   PHP_SearchMatch:
    992    mov     al, bptr es:[di+LocBRPT_SystemID] ; Partition-ID into AL
    993    call    PART_SearchFileSysHiddenID    ; Put on =STEALTH=
    994    mov     bptr es:[di+LocBRPT_SystemID], al
    995    IFDEF ReleaseCode
    996       call    DriveIO_SavePartition      ; Saves Partition-Table
    997    ENDIF
    998    ret
    999 PART_HidePartition              EndP
    1000 
    1001 ; This here is for marking the first "good" non-hidden partition as being
    1002 ;  active. It requires the partition table at EXECBASE.
    1003 ;  Some BIOSes have problems with no primary marked active. Actually this is
    1004 ;  a buggy implementation, because the MBR-code should normally check,
    1005 ;  *not* the BIOS. This one *could* cause havoc to some systems, but I can't
    1006 ;  do anything else.
    1007 PART_MarkFirstGoodPrimary       Proc Near   Uses ax si di
    1008    mov     di, offset PartitionSector+446 ; DS:SI - 1st partitionentry
    1009    ; First action to do: Remove the active flag from every partition
    1010    push    di
    1011       mov     cl, 4
    1012      PMPP_RemoveActiveFlagLoop:
    1013          and     bptr es:[di+LocBRPT_Flags], 7Fh
    1014          add     di, LocBRPT_LenOfEntry
    1015       dec     cl
    1016       jnz     PMPP_RemoveActiveFlagLoop
    1017    pop     di
    1018    ; First Search, will hit on any PartitionID that is:
    1019    ; a) not 0
    1020    ; b) not hidden
    1021    ; c) not extended partition (05h or 0Fh)
    1022   PMPP_Search1Loop:
    1023       mov     al, bptr es:[di+LocBRPT_SystemID]
    1024       or      al, al
    1025       jz      PMPP_Search1NoHit
    1026       cmp     al, 05h
    1027       je      PMPP_Search1NoHit
    1028       cmp     al, 0Fh
    1029       je      PMPP_Search1NoHit
    1030       mov     bl, al                     ; BL == AL == PartitionID
    1031       push    si
    1032          call    PART_SearchFileSysName
    1033       pop     si                         ; AL == UnhiddenPartitionID
    1034       cmp     al, bl                     ; if ID is unhidden...
    1035       je      PMPP_SearchHit
    1036      PMPP_Search1NoHit:
    1037       add     di, LocBRPT_LenOfEntry     ; 16 Bytes per Partition-Entry
    1038    cmp     di, 500+offset PartitionSector
    1039    jb      PMPP_Search1Loop
    1040 
    1041    mov     di, offset PartitionSector+446 ; DS:SI - 1st Partition-Entry
    1042    ; Second Search, hit on anything that is not an extended partition
    1043    ;  (05 or 0Fh)
    1044   PMPP_Search2Loop:
    1045       mov     al, bptr es:[di+LocBRPT_SystemID]
    1046       or      al, al
    1047       jz      PMPP_Search2NoHit
    1048       cmp     al, 05h
    1049       je      PMPP_Search2NoHit
    1050       cmp     al, 0Fh
    1051       jne     PMPP_SearchHit
    1052      PMPP_Search2NoHit:
    1053       add     di, LocBRPT_LenOfEntry     ; 16 Bytes per Partition-Entry
    1054    cmp     di, 500+offset PartitionSector
    1055    jb      PMPP_Search2Loop
    1056    jmp     PMPP_SearchFailed
    1057 
    1058   PMPP_SearchHit:
    1059    or      bptr es:[di], 80h             ; SET ACTIVE PARTITION
    1060   PMPP_SearchFailed:
    1061    ret
    1062 PART_MarkFirstGoodPrimary       EndP
    1063 
    1064 ; Searches the Name and Flags to a FileSysID (PartitionID)
    1065 ;        In: AL - FileSysID
    1066 ;       Out: AL - Unhidden File-System-ID, AH - Flags for this File-System
    1067 ;            SI - Pointer to Name (8char)
    1068 ; Destroyed: *none*
    1069 PART_SearchFileSysName          Proc Near  Uses bx dx
    1070    ;movzx   bx, al
    1071    mov   bl,al
    1072    mov   bh,0
    1073 
    1074    mov     si, offset FileSysIDs
    1075   PSFSN_SearchLoop:
    1076       lodsw                              ; AL - NormalID, AH-HiddenID
    1077       mov     dl, ds:[si]                ; DL - File-System-Flags
    1078       inc     si
    1079       cmp     al, bl                     ; Check, if Unhidden-ID matches...
    1080       je      PSFSN_Match
    1081       cmp     ah, bl                     ; Check, if Hidden-ID matches...
    1082       je      PSFSN_Match
    1083       mov     al, bl                     ; So Unhidden-ID will be Original-ID
    1084       cmp     ah, 0                      ; Unknown (last ID in table)
    1085       je      PSFSN_Match
    1086       inc     bh
    1087       jmp     PSFSN_SearchLoop
    1088 
    1089   PSFSN_Match:
    1090    ; AL is already Unhidden-ID
    1091    mov     ah, dl
    1092    ; AH is now the FileSystem-Flag
    1093    ;movzx   bx, bh
    1094    mov   bl,bh
    1095    mov   bh,0
    1096 
    1097    shl     bx, 3   ; Offsets * 8
    1098    mov     si, offset FileSysNames
    1099    add     si, bx
    1100    ret
    1101 PART_SearchFileSysName          EndP
    1102 
    1103 ; Searches the Hidden ID corresponding to a FileSysID (PartitionID)
    1104 ;        In: AL - FileSysID
    1105 ;       Out: AL - Hidden File-System-ID
    1106 PART_SearchFileSysHiddenID      Proc Near  Uses bx
    1107    ;movzx   bx, al
    1108    mov   bl,al
    1109    mov   bh,0
    1110 
    1111    mov     si, offset FileSysIDs
    1112   PSFSHI_SearchLoop:
    1113       lodsw                              ; AL - NormalID, AH-HiddenID
    1114       inc     si
    1115       cmp     al, bl                     ; Check, if Unhidden-ID matches...
    1116       je      PSFSHI_Match
    1117       cmp     ah, bl                     ; Check, if Hidden-ID matches...
    1118       je      PSFSHI_Match
    1119       mov     ah, bl                     ; So Unhidden-ID will get replied...
    1120       cmp     ah, 0                      ; Unknown (last ID in table)
    1121       je      PSFSHI_Match
    1122       inc     bh
    1123       jmp     PSFSHI_SearchLoop
    1124 
    1125   PSFSHI_Match:
    1126    mov     al, ah                        ; AL = Hidden ID
    1127    ret
    1128 PART_SearchFileSysHiddenID      EndP
    1129 
    1130 ;        In: DS:SI - Partition-Name, CX - Maximum/Total Length
    1131 ;       Out: Carry-Flag set, if valid Partition-Name
    1132 ; Destroyed: None
    1133 PART_CheckForValidPartName      Proc Near   Uses ax cx dx si
    1134    ; Our logic is as follows:
    1135    ;  If all chars are U -> Invalid (due reformated signature)
    1136    ;  If anything below 32, but 0 -> Invalid (due invalid chars)
    1137    ;  If anything above 165 -> Invalid (due invalid chars)
    1138    ;  If anything between 123-128 -> Invalid (due invalid chars)
    1139    ;  DX - holds count of 'U's
    1140    push    cx
    1141       or      cx, cx
    1142       jz      PCFVPN_InvalidName
    1143       xor     dx, dx
    1144      PCFVPN_CheckLoop:
    1145          lodsb
    1146          cmp     al, 0
    1147          je      PCFVPN_ValidChar
    1148          cmp     al, 32
    1149          jb      PCFVPN_InvalidName
    1150          cmp     al, 165
    1151          ja      PCFVPN_InvalidName
    1152          cmp     al, 123
    1153          jb      PCFVPN_ValidChar
    1154          cmp     al, 128
    1155          jbe     PCFVPN_InvalidName
    1156         PCFVPN_ValidChar:
    1157          cmp     al, 'U'
    1158          jne     PCFVPN_NoMagic
    1159          inc     dx
    1160         PCFVPN_NoMagic:
    1161       dec     cx
    1162       jnz     PCFVPN_CheckLoop
    1163    pop     cx
    1164    cmp     cx, dx
    1165    clc
    1166    je      PCFVPN_WasMagic
    1167    stc
    1168   PCFVPN_WasMagic:
    1169    ret
    1170   PCFVPN_InvalidName:
    1171    pop     cx
    1172    clc
    1173    ret
    1174 PART_CheckForValidPartName      EndP
    1175 
    1176 
    1177 ; Rousseau: added
    1178 ; Compare a volume-label in the IPT to the install-volume
    1179 ; SI holds pointer to entry in IPT
    1180 ; CY set if this entry is also the install-volume
    1181 PART_IsInstallVolume            Proc Near   Uses ax cx dx si di
    1182       cld                                    ; Advance upwards with lodsb
    1183       mov   di, offset eCS_InstallVolume     ; Address of install-volume label (max. 11 chars)
    1184 
    1185       mov   cx, 11                           ; Maximum length of label
    1186       xor   dl, dl                           ; Not found yet
    1187 
    1188     ; Compare next character
    1189     PART_IsInstallVolumeNext:
    1190       lodsb                                  ; Load byte from SI (IPT-entry)
    1191       ;cmp      al,' '                        ; If space then use zero
    1192       ;jne      PART_IsInstallVolume_skip1
    1193       ;xor      al,al
    1194    PART_IsInstallVolume_skip1:
    1195       xchg     ah,al                         ; Save char to AH
    1196       xchg     si,di                         ; Exchange pointers
    1197       lodsb                                  ; Load byte from SI (install-volume label)
    1198       ;cmp      al,' '                        ; If space then use zero
    1199       ;jne      PART_IsInstallVolume_skip2
    1200       ;xor      al,al
    1201    PART_IsInstallVolume_skip2:
    1202       xchg     si,di                         ; Reexchange pointers
    1203       call     AuxIO_Teletype
    1204       call     CONV_ToUpper
    1205       call     AuxIO_Teletype
    1206       xchg     al,ah
    1207       call     AuxIO_Teletype
    1208       call     CONV_ToUpper
    1209       call     AuxIO_Teletype
    1210       call     AuxIO_TeletypeNL
    1211 
    1212       ; Are both of them zero ?
    1213       ; Then the names could be the same, but cx must not equal 11
    1214       ; because that would indicate a null-string.
    1215       mov      dh,al
    1216       or       dh,ah
    1217       jz       PART_IsInstallVolumeFound
    1218 
    1219       cmp      ah,al                         ; Are the the same ?
    1220       jnz      PART_IsInstallVolumeNotFound  ; Nope, compare ended
    1221       loop     PART_IsInstallVolumeNext      ; Yep, Compare next character
    1222 
    1223    PART_IsInstallVolumeFound:
    1224       ; If CX is still 11 this was a zero string
    1225       ; and thus not a valid volume-name.
    1226       ; This should not occur as this function is only called when the first
    1227       ; byte is non-zero.
    1228       cmp      cx,11
    1229       je       PART_IsInstallVolumeNotFound
    1230       ; Found !
    1231       mov      dl,1                          ; Found
    1232       jmp      PART_IsInstallVolumeEnd
    1233 
    1234 
    1235    PART_IsInstallVolumeNotFound:
    1236       mov      dl,0
    1237       jmp      PART_IsInstallVolumeEnd
    1238 
    1239 
    1240    PART_IsInstallVolumeEnd:
    1241       ; Set the status in CY
    1242       mov      al,dl
    1243       add      al,'0'
    1244       call     AuxIO_TeletypeHexByte
    1245       call     AuxIO_TeletypeNL
    1246       rcr      dl,1                          ; Put found-flag in CY
    1247       ret
    1248 PART_IsInstallVolume            EndP
  • trunk/BOOTCODE/REGULAR/STD_TEXT.ASM

    r30 r31  
    2929CopyrightVersionLen   equ   6
    3030;Copyright             db ' AiR-BOOT v1.06 - (c) 1998-2009 M. Kiewitz, Dedicated to Gerd Kiewitz', 0
    31 Copyright             db ' AiR-BOOT v1.07 - (c) 1998-2011 M. Kiewitz, Dedicated to Gerd Kiewitz', 0
    3231;Copyright             db ' AiR-BOOT v1.07 - (c) 2011 M. Kiewitz - Rousseau test-version >502G (build: #24)', 0
    3332;Copyright             db ' AiR-BOOT v1.07 - (c) 2011 M. Kiewitz   -  Release Candidate 1  -  (build: #25)', 0
     
    3635;Copyright             db ' AiR-BOOT v1.07 - (c) 1998-2011 M. Kiewitz, Dedicated to Gerd Kiewitz (rc4-b33)', 0
    3736;Copyright             db ' AiR-BOOT v1.07 - (c) 1998-2011 M. Kiewitz, Dedicated to Gerd Kiewitz (rc5-b35)', 0
    38 
    39 ;BootEndMsg            db 'Free usage allowed, as long as you dont or have not worked for US government', 0
     37;Copyright             db ' AiR-BOOT v1.07 - (c) 1998-2011 M. Kiewitz, Dedicated to Gerd Kiewitz', 0
     38Copyright             db ' AiR-BOOT v1.08 - (c) 1998-2011 M. Kiewitz, Dedicated to Gerd Kiewitz', 0
    4039
    4140; Rousseau: switch around
    42 BootEndMsg           db 'This is GPLv3+ software. Please visit http://AiR-BOOT.sourceforge.net', 0
    43 BootEndMsg2            db 'http://www.gnu.org/licenses/gpl.txt', 0
     41BootEndMsg           db 'This is GPLv3+ software. Please visit http://svn.netlabs.org/air-boot', 0
     42BootEndMsg2          db 'http://www.gnu.org/licenses/gpl.txt', 0
    4443
    4544AuxInitMsg           db 'Initializing Serial Communications on COM',0
    4645
    47 CheckID_MBR           db 'AiRBOOT'
    48 BrokenHDD             db ' (HDDx)', 0
     46CheckID_MBR          db 'AiRBOOT'
     47BrokenHDD            db ' (HDDx)', 0
    4948
    5049; Colors for special words hard-coded. Keep all 0s.
    5150TXT_SETUP_LowerMessage      db 'This software is released under ', 0, 'GPLv3+.', 0
    52 ;                            db 'It may not be used by US government', 0
    5351                            db 'http://www.gnu.org/licenses/gpl.txt', 0
    5452                            db 'For more information and source, please visit', 0
    55                             db 'http://AiR-BOOT.sourceforge.net', 0
    56 ;                            db 'Contact via e-mail: ', 0, 'm_kiewitz [AT] users.sourceforge.net', 0
     53                            db 'http://svn.netlabs.org/air-boot', 0
    5754                            db 'Contact via e-mail: ', 0, 'airboot@ecomstation.com', 0
    5855
Note: See TracChangeset for help on using the changeset viewer.