anchor.diff:  \ This word returns true if the currently loaded block has _NO_ GPT partition id
   : no-gpt? ( -- true|false )
      0 read-sector
  -   1 partition>part-entry part-entry>id c@ ee <>
  +   1 partition>part-entry part-entry>id c@ ee <> IF true EXIT THEN
  +   block mbr>magic w@-le aa55 <>
   ;
   
   : pc-extended-partition? ( part-entry-addr -- true|false )
  
positive.code: 
  : try-partitions ( -- found? )
     try-dos-partition IF try-files EXIT THEN
     \ try-iso9660-partition IF try-files EXIT THEN
     \ ... more partition types here...
     false
  
negative.code:        8 + x@    GPT-PREP-PARTITION-4 =
  ;
  
  \ Check for GPT MSFT BASIC DATA GUID - fat based
  EBD0A0A2            CONSTANT GPT-BASIC-DATA-PARTITION-1
  B9E5                CONSTANT GPT-BASIC-DATA-PARTITION-2
  4433                CONSTANT GPT-BASIC-DATA-PARTITION-3
  87C068B6B72699C7    CONSTANT GPT-BASIC-DATA-PARTITION-4
  
  : gpt-basic-data-partition? ( -- true|false )
     block gpt-part-entry>part-type-guid
     dup l@-le     GPT-BASIC-DATA-PARTITION-1 <> IF drop false EXIT THEN
     dup 4 + w@-le GPT-BASIC-DATA-PARTITION-2 <> IF drop false EXIT THEN
     dup 6 + w@-le GPT-BASIC-DATA-PARTITION-3 <> IF drop false EXIT THEN
         8 + x@    GPT-BASIC-DATA-PARTITION-4 =
  ;
  
  \
  \ GPT Signature
  \ ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h)
  \
  4546492050415254 CONSTANT GPT-SIGNATURE
  
  \ The routine checks whether the protective MBR has GPT ID and then
  \ reads the gpt data from the sector. Also set the seek position and
  \ the partition size used in caller routines.
  
  : get-gpt-partition ( -- true|false )
     no-gpt? IF false EXIT THEN
     debug-disk-label? IF cr ." GPT partition found " cr  THEN
     1 read-sector
     block gpt>part-entry-lba x@-le
     block-size * to seek-pos
     block gpt>part-entry-size l@-le to gpt-part-size
     gpt-part-size block-array-size > IF
        cr ." GPT part size exceeds buffer allocated " cr
        false exit
     THEN
     block gpt>signature x@ GPT-SIGNATURE =
  ;
  
  : load-from-gpt-prep-partition ( addr -- size )
     get-gpt-partition 0= IF false EXIT THEN
     block gpt>num-part-entry l@-le dup 0= IF false exit THEN
     1+ 1 ?DO
        seek-pos 0 seek drop
        block gpt-part-size read drop gpt-prep-partition? IF
           debug-disk-label? IF  ." GPT PReP partition found " cr THEN
           block gpt-part-entry>first-lba x@-le ( addr first-lba )
           block gpt-part-entry>last-lba x@-le  ( addr first-lba last-lba)
           over - 1+                            ( addr first-lba blocks )
           swap                                 ( addr blocks first-lba )
           block-size * to part-offset          ( addr blocks )
           0 0 seek drop                        ( addr blocks )
           block-size * read                    ( size )
           UNLOOP EXIT
       THEN
       seek-pos gpt-part-size + to seek-pos
     LOOP
     false
  ;
  
  : try-gpt-dos-partition ( -- true|false )
     get-gpt-partition 0= IF false EXIT THEN
     block gpt>num-part-entry l@-le dup 0= IF false EXIT THEN
     1+ 1 ?DO
        seek-pos 0 seek drop
        block gpt-part-size read drop
        gpt-basic-data-partition? IF
           debug-disk-label? IF ." GPT BASIC DATA partition found " cr THEN
           block gpt-part-entry>first-lba x@-le       ( first-lba )
           dup to part-start                          ( first-lba )
           block gpt-part-entry>last-lba x@-le        ( first-lba last-lba )
           over - 1+                                  ( first-lba s1 )
           block-size * to part-size                  ( first-lba )
           block-size * to part-offset                ( )
           0 0 seek drop
           block block-size read drop
           block fat-bootblock?                    ( true|false )
           UNLOOP EXIT
        THEN
        seek-pos gpt-part-size + to seek-pos
     LOOP
     false
  ;
  