[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]

    { SWAG NOTE :  The code for this material is attached below and encoded
      using XX3402 }

    FLAT REAL / REAL BIG / UNREAL MODE (v1.2)

    Flat Real mode, Real Big mode and UnReal mode are three names with the very
    same meaning, I will call it FLAT in this text.

    Since the  first PC-XT, people have  searched for methods to  get access to
    more and more memory for their DOS programs: EMS, UMBs, XMS, DPMI. With the
    i386, Intel has  given 32-bit power to the PC's.  Here's an example to take
    advantage of  the 32-bit capabilities  of the i386  and compatibles without
    the need  of protected mode,  DOS-extenders and/or special  interfaces like
    VCPI & DPMI.

    FLAT simply  allows you to  use 32-bit access  on top of  the normal 16-bit
    addressing.  32-bit access  is possible  as the  well-known 64KB limits are
    just registers  on the i386  and can be  altered to almost  any value up to
    4GB. FLAT is not new, Microsoft's  HIMEM.SYS already uses it since 1988 for
    its 'Move Extended Memory Block' service.

    To understand  how FLAT works, you  have to understand how  the i386 works.
    The  i386  is  not  made  as  one  but  several  seperate units; an ALU, an
    INSTRUCTION PREFETCHER,  a SEGMENTATION UNIT,  a PAGING UNIT,  etc. Most of
    these units  have no clue  about the  state  of the CPU;  Real or Protected
    Mode.

    The SEGMENTATION UNIT only holds the BASE, the LIMIT and some attributes of
    the segment registers. These values are used for addressing rather than the
    value  of the  segment registers.  When a  segment register  is assigned  a
    value, in Real Mode and in a V86 task the BASE is loaded with 16 times this
    value  so the  addressing is  compatible with  the 8086.  Most of the other
    fields, including LIMIT, are unaffected. In normal Protected Mode operation
    this value is  used as an index for the  GLOBAL/LOCAL DESCRIPTOR TABLE from
    where all fields  BASE, LIMIT and attributes are fetched.  So, to alter the
    LIMITs, we have to be in Protected Mode.

    The SEGMENTATION UNIT will report a  fault when an instruction is trying to
    address beyond a  LIMIT, or when an instruction is  trying to do an illegal
    access like writing to a read-only segment. This fault will raise interrupt
    number 13. In Protected Mode there's  an exception handler that will handle
    this. In normal DOS operation (Real Mode), there is _no_ exception handler.
    In fact, in the PC design interrupt  #13 is used for handling IRQ number 5.
    This is  the reason DOS  will hang the  system when 32-bit  access is used.
    While the IRQ  #5 handler expects the address of  the _next_ instruction is
    pushed onto the stack, exception #13 will push the instruction which caused
    the  exception. When  the IRQ  #5 handler  does an  IRET, the  CPU tries to
    execute the very  same instruction, resulting in an  exception #13 (again),
    etc, etc..

    After a RESET or a switch to a V86 task, all segment LIMITs have a value of
    64KB, this  to be compatible  with the  8086  and the 80286.  As the LIMITs
    can't be altered from within a V86 task, FLAT will never work here. FLAT is
    thus incompatible  with environments/programs where  a V86 task  is used to
    simulate DOS, including:  - MS-Windows 3.x in 'Enhanced  Mode' - MS-Windows
    NT - OS/2 2.x, Warp - Emm386, Qemm, etc.. simulating UMBs

    Some environments/programs have an option to disable the DOS simulation:
     - MS-Windows'95; check the 'MS-DOS Mode' option
     - Emm386 simulating EMS; enter 'Emm386 OFF' at the DOS prompt

    Due to a bug in Qemm (7.02),  its simulation cannot be disabled after being
    enabled.  As  long  Qemm  stays  disabled  FLAT  will  work.  I do not have
    experience with other EMS simulators (e.g 386max)

    FLAT is fully compatible with:
     - DOS 2.0 and above
     - MS-Windows 3.x in 'Real Mode' and 'Standard Mode'
     - DesqView
     - Himem/XMS/UMB drivers
     - EMS drivers

    All FLAT actually does it jump  to Protected Mode, alter the segment LIMITs
    using a DESCRIPTOR with  a 4GB LIMIT, and jump back to  Real Mode. As other
    programs/TSRs may  enter Protected Mode,  there's the possibility  that the
    LIMITs are altered to 64KB again. This is why I have implemented FLAT as an
    exception handler.  To allow IRQ  #5 to be  handled, the exception  handler
    first checks the Interrupt Controller if IRQ  #5 is 'In Service'. If so, it
    calls the IRQ #5 handler. FLAT will  terminate the program if it detects an
    instruction  that is  causing an  exception #13,  even when  the LIMITs are
    (re)set to 4GB.

    To activate  FLAT, just call  the FLAT_install routine,  to remove/deactive
    it, call  FLAT_destall. As FLAT must  be installed on top  of the interrupt
    #13 handler,  FLAT has to be  deactivated first before any  changes to this
    interrupt vector can  take place. As said above,  interrupt #13 is normally
    used for IRQ #5.

    FLAT is called FLAT because with  32-bit access the whole 4GB address space
    of the 386  can be accessed with only using  offsets. But as the addressing
    mechanism needs a segment the format [0000:<32-bit offset>] is used.

    Using XMS, when an  EMB is locked, the physical base address  of the EMB is
    returned. This base address can be used as base for access to the EMB:

            mov ah,09h                      ; Allocate EMB
            mov dx,256                      ; 256KB
            call XMS_driver                 ; Do it!
            test ax,ax                      ; Error?
            jz alloc_error
            mov ah,0Ch                      ; Lock EMB
            call XMS_driver                 ; Do it!
            test ax,ax                      ; Error?
            jz lock_error
            mov di,dx                       ; DX has high word of 256KB chunk
            shl edi,16
            mov di,bx                       ; BX has low word of 256KB chunk
            xor eax,eax                     ; Clear EAX
            mov es,ax                       ; ES:EDI now points to first address of 256KB chunk
            mov ecx,10000h                  ; 256KB equals 64K dwords
            rep stos dword ptr es:[edi]     ; Clear 256KB chunk

    32-bit access is not specially meant for extended memory, it can be used for conventional memory as well. DOS allows memory allocations larger than 64KB which now is addressable as one big chunk rather than separate chunks of 64KB and/or less:

            mov ah,48h                      ; Allocate Memory
            mov bx,4000h                    ; 256KB (16K paragraphs)
            int 21h                         ; Do it!
            jc alloc_error                  ; Out of memory?
            mov es,ax                       ; 256KB can be accessed using es:00000000 through es:0003FFFFh
            xor eax,eax                     ; Clear EAX
            xor edi,edi                     ; ES:EDI now points to first address of 256KB chunk
            mov ecx,10000h                  ; 256KB equals 64K dwords
            rep stos dword ptr es:[edi]     ; Clear 256KB chunk

    With the new VESA VBE Core Standard  2.0, the entire video memory of a SVGA
    or other video adapter that  support linear/flat addressing can be accessed
    as one large  chunk of memory somewhere in the  4GB(/16MB) address space of
    the 386(sx):

            mov ax,4F01h                    ; Get VBE Mode Information
            mov cx,100h                     ; Mode : 640x400, 256 colours
            les di,ModeInfoBlockPtr         ; ES:DI now points to ModeInfoBlock structure
            int 10h                         ; Do it!
            cmp ax,4Fh                      ; Error?
            jne VBE_error
            mov ax,4F02h                    ; Set VBE Mode
            mov bx,0C100h                   ; Mode : 640x400, 256 colours, linear/flat, don't clear display
            int 10h                         ; Do it!
            cmp ax,4Fh                      ; Error?
            jne VBE_error
            xor eax,eax                     ; Clear EAX
            mov edi,dword ptr es:di[28h]    ; ModeInfoBlock[28h] = 'PhysBasePtr'
            mov es,ax                       ; ES:EDI now points to first address of 256KB video buffer
            mov ecx,10000h                  ; 640 x 400 bytes equals 256000 bytes equals about 64K dwords
            rep stos dword ptr es:[edi]     ; Clear 256KB video buffer

    Accessing video memory  without the need of bankswitching  really speeds up
    video  performance. In  terms of  pixels per  second, drawing  lines in the
    1600x1200,256 colours graphics mode is now  faster than in the 320x200, 256
    colours mode.

    The only limitation of FLAT is your imagination. And you'll need that as no
    high-level language DOS compiler I've seen (yet) supports 32-bit addressing
    without  the need  of some  kind of  DOS-extender. However,  FLAT will link
    smoothly with  almost any 16-bit DOS  compiler. I use Turbo  Pascal 5.5 and
    6.0 myself for the body of the  programs I'm writing, and use some assembly
    at  the places  I need  the 32-bit   addressing. See  EX2 for  a very  nice
    example.

            Herman Dullink
            Groningen (the emulator city; CPC, MSX, ZX :-)
            the Netherlands
            +31-50-132829
            csg669@wing.rug.nl (fast)
            herman.dullink@prgbbs.idn.nl (1 day slower)

    { ---------------------------   CUT  ----------------------- }
    { cut this out, name it flat.xx to create flat.zip :
               xx3402 d flat.xx
    }

    *XX3402-011730-281096--72--85-57319--------FLAT.ZIP--1-OF--3
    I2g1--E++U+6+6+8+FyMIbnt-k2++2E0+++5++++FJUm9Y3HHKpFjIv1A-1S6zYRPUEF3PLE
    eUcHG1+l6BGhWd-X5ooYCvNwGJjS5Xid2uCGkSTvziuGDA5sj0bSkGRmRFwCS4YCc6p2ZYL-
    utZfel-KArHnPFnoV5-eiVdqjOgAT5+GrfxSf64r2bVZXbX9AdM7blNAV+SBPESqfpEX+bB7
    +ovIOuwFJ6VVR0HaqqXmqvszvvu2gHz-DnJFt6nsOqDNsa4vGKCc1fKmAuPB2IMg7rghZHFX
    Gh7EYNeQeBVLxavtK0MwLbUtwRjmSV88QuFHBxJicZQnvB-4Bs2w4GT-RgvjICnxb18LsI7B
    2aHBu2VLXpXutUuvcGsrzrpBP8JBztzjYnnTgSkLI2g1--E++U+6+6E8+FwzkeFbV+I++8gH
    +++6++++FYl-J0t-IoqpK4pjqYUEzcv2TtWHeWNJLEs1XJ9m6KcVXG9paZvUqUxFVFNvgDSu
    hgbiah1yyhjp4qhvHOueuYUEvwiwD1Dvv+kLY1zj4N3kVsHxeHzU5EoUGbm2otov49rcxzcx
    HvyeFq+EMGlVausNxTFA6E8624aYpbVWeVSPIzZWdSP1qyK8lY6GldnwnQTgHOwqNvBRDD5+
    wZn+HPt6t08Ys+RJdZ6FPe1viM-NWBsrq0EQDWtTPHE2dobAjYAGkzXwvCK9VWnXBRba9iwD
    MrgZ7Vg9bQYkf4xhfZLvBow8LrRiw87heKdhODcrnW62QP9uiCnr-ge59HnxLA1WfwILc+86
    Udni82AzE-xo75XeGNf2dtQ43W6GXvZ1HyD8RHN3KHNcQkt0d+dv7cEtfib-Xpl3a5+7bwoB
    HoRnELM68ce-UCQkLmXR+FIGSHgIjX0kN9EREmFv-mryLQ+pGfWtyzgpvB0HOjJnK8WFRVd4
    mEtmJMsNy56Mprj53xDvwGHwqdvpl1FVzYffQL-hqTuMQ-yqYYAdkoYq4r5I2CKF7qnq8E3b
    Gc-ddEVN-QD2WjKvZ16TfZamJj4Rcz+srKcsZaHBo8+2rwypJ+MfpuvbmzjFJspjCyRxoFLR
    ClF8+Ne-JS-bsSsu7VmZddLgC2kB727by0OouTX0eIG6I+UGc+KfTEZn7b6JWO0RKtukSLIM
    cr4Kxn-mEqiE7fCV4vNBKm8DO2mISMxIVc0Q8vEnHbMvN-SCOmi9OLyRTtwgEmcoikOQF+eZ
    VtFm32+YA0F0+ca-XgzDlDuD2wQRCWTDHfGonyRbotehjkuX2jbPE-nx36WXHV+94mgd3MUn
    2gS7-7seh46Ug8BQdcE-liez7BOLN+qztiq4gPyhlchPwDWhBwTKfKTXheDwOCL3uifOCpNG
    DtmyVDYazTpzjgjcdq8p1VvGFDPfhB+WU0P07T6JGn2OlCfvjByvbWxf0jn5zBhxrJHwUINI
    keZv-ijj2cJlDnPr3gaiF1j1TCxhDe8HYAPUdNnfWeecf+O1EPSgmlM+zwGdEBxooqjg4KvI
    2pdgLuiDsK1UjfMNLuHtdODyuhFD-3NvFyAXSxwoni+3jDIw3+6s1I6diXQCjIpMrzW7-+U-
    7r5808TmCvnAbJ1s8kTS55CUTLRJ1ckaUw5MTJ4-7t0Jmz+VnEjX0hFLCc7uOPxLdb4Zmmzg
    vjQM2L7phTRKvfUtdLSgx6LJx9PG9kLDXfyNb4KVt6Zd7Q-lHLyIBhne8epAeAmoYAEyErvN
    JJnZBhf8p8uXxZNwUowrAu0PL+AJQ59nwRLWuivnnSnel292n-ayAkUuGEha5MMCMMNVFHbv
    v4KBVgj1uMnAQhcc54jXhd9wrlxUwHWDl9FSPrJUCxCIIN3SUKZbtSsJ-3AfRvctfuNqO9VS
    w3Niw9E81LP2de-qsbZdZ18GwP8RUcKMchXSHvuqOZfWypkTnKE1WxifRehF25UnjHDRYR6h
    E2y-d-4O8MRa+4e01F+AcHbxNtr9MGY9z0nY1soeoW0oVDXuSA7RuktcNrUUM0A+VPtJpjgK
    XCIp6fd+bBoNgGdinemDgQTa8hOZuWSSGDEYyYIrp-GgVCOyKsx3FxXTAyqGoOS-XpYtwt-W
    WXMAGbLfjRBYD-D8mTIOaCNLOwTUq3cGh+xjvAB-DanQkP3TseWf8hTGQV1j4wUYytLW8F-p
    +ZYGc4egRSUlGsB+q8c76kSOavgDMPatRUvBAkpkf5qR7r5qawbWxadeYYanSX2J8gTlKAwL
    CgCBhIGTAGEQVAQFsrPdukt1in-nzAb3jxUQ8-lyKrAkzvYCOxnN5FF4hfi1FT2nqSpC0IfX
    kmLRvUbofJyKdCKjPCfRw2WxxLjz+J-9+kEI++6+0+030U2TkwUy71g0++0K+U++0++++2NA
    EJEiHo78HN79O-BF46Lz4yCoXOZHW-E2GKt0E2Euc+Z-J0GVWG-42wUUUGtYKaSGE18dwuXR
    39fGO2jkFF4NE-uPi0a8EIc3WKqgrMFYoIKZas9WUqn3VEjXDl483vvVrAAQvjoDRx24kp7K
    o9VEshdOUE9+0JtLdjAod8dWPXcf8dHS2-IpYtSdXnjnj1+4kFzKtJ5LESd1sF-OoFI9EBeI
    ZOQf13UbMy36tBYEd-S6VN+v1lo+l5st4i7jLfaSs2DF87voyXwr5-asek0CUVK0JT8cj+22
    k10GWny1wN6lJHfzHHz9YjouoKwNnhyGfpbQZNOQTd0sywsiT4Hww+aKhqg-YBvjKmKCA-jU
    8aoqFhNXQBHJReyFOBjBdnAebJLm8IL6IIKwfKQIIOK0FfCWc4dIY4b4RmuUnfhhLUkKzUIh
    47kIN1ajIIL5DqEeo9aAciZ0ZccmefmQ2qIBAwv-dPV83uGO5pmPswNlO7rYGKg0iMW2YELY
    1IxKewS+jAAN9SOQECsBjbiSgUp62pVcsbP9C+kh0oz0NEP6BjHvHonFVgSRoyJLE9dkg9VT
    n0sErFpzSSEfvQ2LKeR7nQ3haOv-xP4UUMOC37RGGq2j3bG-qE2h654p5S-MActbphYmsomk
    h4Ybf8TNUvT1IBkfPVMz3rjSDyVAiMPM0jh0GbOynzEPP5ig+QX6iY+4DMpWHkYlNLN-MrCW
    MdMJaNwFNnJwDRWCMfWVNQTdDQUdV2Ai6F5Y8b8L7xI5y6uojp-9+kEI++6+0+040U2TP7Oc
    rWU1++0A0E++-k+++2JMAWtEEJDBJapjaoUEzav7Ty+yXFF9EClMU7q+mvZG9eaHecbGGdKG
    8cdCj0m4Cw7Og2t-JTxvNrQ-UoCWxAjdJd4+qKSSbLZaRdlBFhSNykWYA-rMtWE5DqDCQ1+Q
    y1HB4TUoULTkbKM-943YK9eCam-KF+fQQfDA9SzpuREsTU+OUVyt4I6JrH-bwyAHmpuQzbJq
    za4Z0B6brDHQb8-XEhBpb988nczEl5qfPqwPxd-v7GAJ62u10Nf08ff8yVE5PHTPK-X0IGHU
    SXZBhcn+m9BpzJqRGR28-Yfwe2sN1buAfW-AL1OZrXwzVkDImWT-BWCkiXfxybSAyfV7se-q
    X4GdanXD6+3t1d4oe5QzeowrdNfbN3ob-fbAgejLzUfO5g3PD-8GfZaoUqaR81q0BivMHNIV
    t724F1qvgLIMksean0tgx3pHFchGBGS47d62KNkZG7Z1aj4G0EAk0dSlScjTpquVMPXE50SF
    NMCn3goq9ysxYXvkHNxWB55eeqXEU8Gh-i0M6ogLg73VnIuRlXeTppPnbCCZ5ryHHJZ5at2B
    QNZYPB9UXP6IE4QLuRhmUZNhxMYwP0lw1w2saE+KHzKqcQMvCezSX-CheRmS7dmxGaZg5tKp
    62W7tJQXIhmf-SFF-ae7XkFAHEAL1lih5ZvWB6uTVRm6CHPAgLacQivmjOKBGznfCFD1jYQv
    DrTSCeR3AzgBaaTlvbVCNVp5uR1URfo+cY288KLR9-BPpyHq1gW5nl89vUPzYh6-btQ5PHGg
    SEtoDVOusg0PD7iZL0X6QI2NjThKrt7xm0K5-AFLSMBoCq+5yfUDCanpLNz17ysEVr+PYMnQ
    kLgkUIIYfKDNN0FEtNsq2QxjTGnLLNMzkSukt3jTTkD9HIi2FPw6bwJ-uSgWTBY5jGc0JfdX
    OPS6cWjHeP7ELWWkLC8Se+gseh9Lt9Lebunp8-3DrgMdNKcpNBLFGjeKKjxI3ahQnqFlKTmc
    jfqJOzyljpSP5ceC8eRQZNImOEkiBsHzItYKpTns1uJeNUVzqOMgHjX3Lw8-OJIz8QpjNS9a
    sYK4NeoodzDTkL0+9BDVs6xTI2g1--E++U+6+6k8+FxP5REDs+2++3s2+++5++++FJUl9Y3H
    HLpIoKvHA-FxfxFzC5pV1uGEA6Ge3Vsq8BCYwP6VxX-Bm53i4oiC5RYi0rzDRNAquNNVeL3x
    vzL7CQTLKO2RrvI6i0KVrwQ59hIKZGpcCXYIf-hFpNeEHGTHWSFI15fOJaE0uZqiZMmNfVf0
    ypr3BR6jtFvbYCXzIFCQWOyyiTXtKlYTVBN9Ew6ZPOWUDXGqrvfhTgvGh6mjdWPPfqhbNNlL
    FwujAN+AXqQAA-WAM2HC+-yjQcWWQCExT0oY1OJKxYwfiIbCAH7Ky4eprHY2JhmtSgUdBezJ
    k-9SbGwyxOb4iUCgO2NV9sIbfCzkSMsoHFzsZnt4bCT2m1D00BwmmHPZTzVykLqd+g2Ot5d5
    9l4wGilassZJgHBWCp70VIeMJvvUFrZevPTfm1nM4dcq+Jsu6bCkyGKGP773Cif1jKhN2fEm
    YMDCZapCqw9bS4qgQALI-KEtP10K3Ok5bekfI+T5xWoTKAPXQRRRg6vqiz+K6UGbwbuvhWkc
    nhakFosufKjgImdglGxmTr3RpRM3MQ7gBVgWC+dlqFaBcdBp-jncEYxgEq+5RpuN9EfZG-tR
    XHaCbUqOjoRsUzADwpk3h6TdcEliplQrwxWfgpag4RsjAYIxz+XkSb-QjCdiBljk1p-9+kEI
    ++6+0+0D0U2TXg6Rq-sB+++m6E++0++++2NAEJEiJ3VIpJfzPxisYjxt0zFzaAA1nUZCQKmb
    nOLdrPqp2nQpBavmseHPiwKWc0LOsYMWxIX8LxtTTnB1mNORy5Pj8r+-ifN3QXXnaSyXzLHP
    TsG5MTwKHgD5M5G1Ltyyw6zlrTIEXVPRRizsvNirPntZkgC13-bY7d3Fy1dEQzs7EWTkd1T9
    68k2bpcdEMhQCZUeby610Ehdpy1k4SFGO8Lb2MlkBQgU3jUTtM4tIVdr8kRSfbmPfdwc5Iia
    A3DKSPWzCjbq422VHN37GAJ0UdD0leZAM4MgIjSdGN0+UPbo6C7MCjuJ4ljMtGytl6wpbo1O
    mg9prEE8OyNKtCsGViB7-2zXUMjU4rqxjVyDqj-n9MkuinV5zfKL4P9UM8sKIgBNvqG8QVFa
    8GrRG1jjfpei1NyZZGq5hsBQWNkMdqLlX+kZ0u4xa2gkAntE2MZ36OMeIpsVWBIGrQcGl0Mj
    V3THf+9MZ7srO6YUs4OIkwjMmuFG4QdqUbV8bIV9L0Gb89MfN8lEPEeZg1C-A24aY8CjJzQX
    yDgUASiTpC6IQfo4p7FNCZWPYUEcrMPR0aO1qXB3nOwqBgQ9iiRVGt7Mr6COPyyREbIL-ZRE
    5Y+kuSVGNhb7gnN91STjTVcUNvbmXerfhx7tg58ib0RduAcRP-1Y8R97Q-I-E1N3ZVgw6jEO
    3W6f7NE3DLtrAqVLBiSEJMzc9GAMexUONqMSpTJtB-uCqtBzbG+78oKm7cYRaOdXcylyi9VU
    0m9KKaCnY1+A80Qk1jMpm2nwr+6bvI93Yj3wFC-M2NvMHQomA92oxhZ310oPhLylPGAaPqr1
    MzqvsXwL0SBbh6FdWIn8VPG6jtA3TbeIKmCX5wY8yvRD2LqCjYkS5tui5YRrLy1yMTVdy5Xp
    STW+Gn+Nrcm5LlvvjDHoNTF61yzvBuAjBxJDuSAqX+bNc4tLLF1MpkNWkZdAOyB2ETn4mezi
    bnu4G69krKzARKmG0WHQws63Z0lP6lFN2clYo7wA6ztqClfXAU5ZH6uLSawJEf-p5GTbiREB
    ***** END OF BLOCK 1 *****

    *XX3402-011730-281096--72--85-32747--------FLAT.ZIP--2-OF--3
    iq5sY4KqW4-MeBkEEfOK0cVPGguQWa-akM+C2zotZFe-qZwV3EaYCBRsVEVI6cdp1A4s1eG8
    nbt3XLfVbXQWoi5A096eXeNRL3QIKnZE-ctQW1MBnb3d4mOqMTWWQr4ycnMk9C3AGMGJS28p
    7IG+AMo0AZfANemVBclovRSvOUD1JeOAPj83LlVKkQ3DuIGiudU9BvRrUzvhuSrRJTwKfcSH
    esTFzSDR+nnq-vR1a3aHkl7N6pzC8jseZKzJrR+oAHeHbV7-4mMa0evjdRpO0AerZ-jraYc0
    z+wP5yQe8khXDKdd7gfA2rwu0COw9KCKbd8LLFC0l2-E0BupBgFiXGd0w9hb2wD9KGPbW5MJ
    8nZ29urmxEJ+YSa2DOCmCX7h73Flm3k9tKE6x9MgDCUmbm6irHBKttsSmFkqmGeK-HCK6hVN
    Q6G8NbX0iasO-OLFfGIQPSnvC+e2GQHjqblzGNidn2Hgcp+2ICu2F79HB3XzIzRgMpFYG5mM
    g-Uxz8KKurq3U+dV+U3mS+plJbAy1zuvRZvaEF2jAV9REDuggZ-x2DozjRw+6JQ3MiOOLZQv
    p5QhJzvvjZu9oZ47MbFJ41UjsiSc+EB7ljnFnV1g4lGKeMdHW+I9HciPUpLESML5l2VKsyVV
    y-XJMFSwdN60iN+f4NRSvZJbXIgXVAuJ4NiOofg4ERkSWPZEydVHEQU5v1vx4HaRU6TVNDV6
    ZWv+9NJ5xhZSuzUKgJzLYH9sNz-BgEqnZDmXeW7YXnoIonUOV-wxWb-xpr-v8UdOjZYKVCW0
    -5N0PZGZMh80din7eFP6PfSZUYx9Fq3mXl4d3wcOHQ8soveEf+DMBeXLhcjGC7KL4SL2uvh7
    6z-Sjbo17n0SbDmgR29JpZZvFT0rVVcJ4pRiqhfTxSKFbxlBHbjEOuwWy3bMUVwBwtn9pPz6
    D8zIJBxBaeIeZkhhmdmjGl4ocg22rJBgIYtA8wwUlufd4PrDTij1yswEdn6C0Oq38rG+NOU6
    BfVgAXMQHnsWEqFAfKfpvhCb3UWziFMtn+hDr3yLAdXLh4FX7K5Vu-zPbRtllDLNZYCm-eeL
    df6K6k5-BXiJR8zIz6lh81DsU4Yt9xNiSq-f84EWPFVFi0OeX-J3-ugY3MZg5055cY+p4wMu
    C79hCO-IiJURPkdh0hlZZerr1Hr+GX9rqdqEyeNa6EzNmWPihbVjOo7Jd9-BqvaKvexTZJnm
    XwweZzbdhz5Yx4YwUAGeVPEiu+KNrjlyyuOD2XCX6jOZ62MtmWUDjtItpxKvuGFetC+xLmyt
    HV5BpAxU0GfBByI5QgyIds6gm4kf7hND+9MqpBD5mMC1L8kfgxZbdIthl2ncC8X1KcSgpUUL
    kiso2Bm-Q8nP7dNZiYORgv8dBN6YK4oKsjLYWMRBu81eE-p0KZVCchqkjcbWcSpZ1keQXnP7
    wAdcPop4ixGg7cfAhIMO7e5ZO9JVB+Bbm+asorOjN6dqktmFReuoeD70VGmFlzC7x7noxecK
    VczeHJ4dR0xFF00dDJvKOOe-wd4JlovuiVyfyWC-R-T2+f2JVMuDdkFoadtxdyjdUHKZJpdm
    gKRZPVPmB73w5DLWcr08HmGGHv1Jg9EtINq4V6Q9b7iPrShinJ2VJKI6uja1wefP-0YzO4ce
    Nq5Gg2OZ0HoDmNNHq7PY+b2oZdhJ5UAIaMW1FHiV8hyCLdMxcQX8phju7mWmrMkTQN04TosZ
    Zkn-gLNf54unItB7RfSuVb23Af8NFJmQPzddDZGr63li-aKPqEkJuBck85rRjHTOY3kG0AfZ
    D7lkXRu6FncYXsRTCjVryIwJTs5WjzmueQ76i0SalfCMib+SXUSVBMeTOywdofJH81xAVLhF
    ZpLvfTGZpFHTqNRrRZP0pWo9fr35i7YWJMEiWOQTQfA+YIOR1mawyjQFyVamFtOANuc1mGfe
    jHwzR+0LTe8RP9UcvjQESpzNSKp+yPz1fJvGR4AJWRIVcYBfXTonPjrhPlm+siyGbXEYi1cc
    kGr0Kr5zjwMHeL05dIF3mM4HRAgrRg-InJD8jXnmMhkUHYjxX1FQac326hrn9Q5dMM81E7+W
    wyjoJgO0F55Y+LYykZIaVMJVzphpcLE5NGTV7tT1ul3cj9+kGbgqfF+y4YOvmkBHXJRFZtkZ
    DKUv6DxOWglFoc82d53spgc0b1QiD650cnXiwVS2uBQRzbRiTDjaFJB2-IspBwnKDAXpv-ym
    5bi3gKeJP9OyF5hWclRGIouUKL2MXm5cBCZfQq3H1FTfdS+ti-oJ6ymwbg7kAUvR2A35UtK+
    a8X4VnnyIjAUlQs+lwZ0w00AZpnRLxE1oEm7vDXpisjTxygktujCH3TFixSJgpLDITTw7m+y
    tZMIeHj4ckdFv5IDr9LfJvz3HERyPShRmNCRUC8Tzt+pJZfT0zEVj2hrqObyO8tjmbZODHjv
    V5zdTxctS5SW6jnrzxgtBWw1h3n0py4Y1pw5EvWWr9ydhbjhHZLKOOxkMO2GOKc9Fm22H9vS
    x8Z51cJgK-S785kxP53ZkGCbH4ZYsbF4PqAOyLJTOtI1gARI9f0l-VuCVcuoaf0wilYQbLPD
    lsDXUkL+YJgRBvlW3PrvpCYSgD+PuFY2bWCBRAXirC1lsO0Tx61OyR+ZeeOnShR-q0V7lWMn
    7HISDx0fXYF3h6Y6wpnxrhhRgrZVBHjP6JGgdNKJnrIvTwXbsfk6QeSzbwgESUFUBvomN9o1
    Y2oOY4qXGCTe+31z6IlFooUWG+kBDK8qrIGt6VDfznD-zkg7Yr7yok2HxIjj6jpp8zJ4YS5t
    DoDfDZqvUL1mrhjKzrXS1Pss9KQnOTxEV24Jk+dE8H-Roo0uWXJ6fPDz99kJyKx2cJrarfvd
    gzxHEBU7AOyx57k8zFnaQTm0Er6eRkJLtqJFbGyYNSzJp7KAB5S3X2qVJV63k5JkAXMuWG0l
    MYaYmDVQ5Jau8DGeqyhoccO-+iQw3PjkfdU9WWLAVDBpWetCbzIuexuSRTCNnLmSCl-y8lVa
    CgVOrTygQHScLAmdXSI-OJwbx9H3MnqSbkfiJPHV6j6YYkiNEGPoj8ErgJGAoDV3IKAxOj2P
    NebVO0rxQFqDrOOPqgPWpx1axp5DGjCDtbjMBbkqGtclBcSC0C2niBkMbqPfOVemTLhNjIVh
    gYS17yfj5YgvBL+j51IzvxjjSKtmrit+jbMmaqrSiIlBgeu1yqOwBqfZxGi3A5+VWi33abAm
    bx89rm+JhuZsc6NFjYGV1FAdMTWh3lebA3bK8dPpeqxKsRgrDrmKN3xkLKMYBHusgMPyjk-0
    aZBaBGW1KDbpFvWujsdUDDYKkPxxUwgHedhcplR7WFBJlovo1qTRYzSRYytNvu9rUG8MatyT
    TzWFn9BhmrZPNr-2tYObIvuzbMHvTmngT1dpPNJcrhK3F8n-NTEi5rTzCp-9+kEI++6+0+0G
    0U2Ty4vfpO2+++0c++++-k+++2JMAWtDEYdfs4FUHuokobAAxUreI4-UM7+78Gp8mZRk90tC
    nIr8GGpGI+V99GfCnAxHABMnbBL-ny1kIe4DJluamP414GXWAsq7UG21l3ksNFcP+sinjsif
    uklqVUlN-WN4lVgH--UM41bRT-l1sdrx+m8-hYnhM43kKAEsQM2W+mA1EqXr4vaocqJwOITe
    CB8uzJXG1ftYydmKjZEyxd++kxgicBYZ+3-9+kEI++6+0+0H0U2TJqD2yQA-++1x+E++-k++
    +2JMAGt1HopBYHpc322MVaR4KOC7HY0krDpK1vhgYHgCoSPwGFRlAJSQd3fjNhO3r4mQaMpd
    V5EWYGqgxw-knMYK3ZR2-HotI7jXKW3Bz22DfVI9-QzNgoWyMjVsVlSSVqxo5yoSEMDtMWzh
    RNortn-zWvNaoIgTDEyTTTYnagBxUChAeG-YQ2x4KXA-WMd206p6gfc4JNTANDZTbdu5si90
    vIV1n9ZWKY2YsCPGtSK3NhlUfUg+uD-YKKrfNwJjNOihWnyGFMfrCnVdNDNjPcUywKqvV9Xr
    oDP7-ui2Pd355xhZlBzh5yIShesEdxLj5bwpl8SQUPi9ZkRixIuYM3r4cEmO6BbRl1+e01Gg
    gI-d0+F2lEhZhSaS87XW17YKWGZS1MG6BQV2tA+-P2FG7w2OA44qK1GNo8NXHu4w5NzkRUYt
    zERv33J6vX4NaCTlw21AyqLJ02tQzwLgRlWXPx0-aXvhjQzHn7gMcyaCVhnbsTOpUX4uN3K7
    9bCjLGISlKQeV5Pc2whScR0PkzFgPslSnu-o9yqbLxBlsOx7JdpXR6QytPLVe1vdog3wptnG
    W5ry9rPGW8qkA6S54lhAtbN9arKqfeBM47pzI2g1--E++U+6+7Q8+Fyv04CgD+o++7+G+++5
    ++++FJUm9YJMFOpMTpFHRtOzvmQVE69G6jJ52UeacpMKW8IhF9EUoheVF-F3LCeU7KfLcUoj
    EKSelX6xBbaIbSvCv7Zmx-kkvFlbwMxUQrOTgBg4UY17EG5g5ZVdCtOuxYhXbLPgG2TRNCxv
    +MhnSiPgvhaQQzDxtbvjjRzDzRvvvjqyZ3Lz+hFUV2Hs2TiXRogcK+z8NmYGUuF0Kcmo52Z5
    +Pl2+nWEF8ESd04Y2B62oiR6Bt0yFPe1Z6+4BW27G09GPt5C6rIVyN2yFJ8n+CZ6ut0SFP6U
    PIAuU5E2OF5gVdJ6iRFic8+DDY4OzqY3NC1LPeVozKTH1NfgMmK4gfGyUj7Sqi93uQDoPgXl
    SzN-qwwUytdfMmH5Lv+lojUHXlL0P7GrEXxT1nWBsB-CUpWs1oOzy+0YZbuXWsjmyw-NK+zZ
    xejhyq1pFV0zapgQsD6LmPn55y0hLhFi-PFjTkzrh60b6fNr5qy-tZvDmy-8DT+U2+QnrIfR
    lt9Xhu1y-FP4fiO243F8GOq+0YjnV2LO-XaV0ciIf+nYjxVtgBjeoS+34dLS2ET38rrwmvVN
    umzdDZWiVFBHSDnTiRxUIMPVoQ3-FJkQET0Q0ZPpTUzTZGHv4aTjy5DPgjsqSEw2FVskBV3P
    bvCdu1SmLUXHLifLHCzcpRUyWQ1oAXrnRZcqnquaBXPvrldByYh4Tw1NRGXztwte-KNuIPE7
    Hmmt0IA1HFVkGmm2iD6rYRN2NXSQqEdhKw4AaHnR1zAtdLPBj0mPzUqMbvIbBKJNo7Wi+a1u
    Jq-ynjuk2awZdiygk7+yUW2BjqNyretfTEOpn9EXFNZ2-WqhNHX4X6KfnKJn2ee4KEbz+l7D
    aQjhGRvsyzi55nBPv6ZBj9kxvU5VFSPBxdFtipCsh+-LdjKICPi-aLs1n2xXzVo1lPdwH36w
    7cGGGKRaEtwHYZA8bNKXZ-BePQCgef1AKt8oAAiS4NY7NS+K4PX3XdpAHwcMDU2izD4Lj7Xy
    Sn+zMqDB4loOQmpWyXaMfMXduDwM2lQDvzmzcr6KPcIZ4CtbvfI9gDksl0c8YQ-pcmP5rne-
    JSTIeGfbhyghdozhD7rzVHpLGpoxGxZTCeKvMnLtKmOgcasBK9BQiiSt+LsBPCKO-nptMCqt
    mZen85shdnwRwAJr1P2OzL0uFDpsC5rfjjoBVYCqUrhhhOwMP5KjqjTPuVcAhM9VE3phUq0c
    fHTgBnqJpr+sLNq7WUmb8B8cK3lPLrxEABXg833je1Isxhg2Syo-EpoxnUvKjp7L9u0CHU4J
    pTswNzKg+LrUt8EK0XU+4e7FLVntiwjQzNeORNjTkZ5qR6grsPcV1BQANkpJEYdKjwkxZFJ3
    XtEtL9NOf5j31NbcIE3TnUZtpWlDCNSZdJ69CCpNPFijqu6py-AdvODyA5Gfc4Km7R1mSIgs
    As8QbTcsPPjqhxOemqFDp8QRHjM-IbnLln55Yh0l9LJvNT04QYSRHTOitD0SiYD0zcDpu2uZ
    S2BbjSXEKDiCeOnW0umpNteyNRrvbfuaBrZyTw0iE3P0Vnw5rLMBoHD8d5IJosQgGaMZAgeY
    BFhN4BeUHoj4C5CQc1Mn1ZtWU4k1oUsyJKuIR5DijgnXNtlklU2aztZLsQk7CDAuf1xn08Hp
    ***** END OF BLOCK 2 *****

    *XX3402-011730-281096--72--85-48760--------FLAT.ZIP--3-OF--3
    oC9zw++MrNklblDisbUV4WLfOCZ7S5hal-GOyQPn4iUoyeuzceEZmsTHxM2iJCYpCcob6M9P
    wKPKFbgNWkz6Jet8TIpM9GpQw1uEIYv8Lj1DQ-v6KgttNuIxpSXIb+F8+ic0w4E3tpjsjc2w
    mUIExZ9CAWSvU8je-5L6fXeTNaMOuIv8zETrjoK4TC0Ad1Zc5yIFADyDkNiO-ilxBe-ATgxV
    tDkI+VORZ2OpH1U91q5Ptjftps5GJppq3fsCM8Q0wazkIQCd+czFGUpzurqFd15SMd90Y5Va
    C2DwC2wgNIZ4ZBF5qtFnkig-AhrPpLbiFZKSitnDQlxYwoQP5wjzMqB4NCWkDb9dw796FzaO
    Mx0M2VbCnncCXEaiJ2GXyGbun+mdE+9SLSU+ILAMF6F6pf+WfdBo7YVGaPb36PSwx+UPZ8Ws
    A0BVbGBzcejY7HTeiKz8ajYrvLGibrn9--J608KFXEnFOAmq8-zL4lR29h3tFw+KbtzrAqVY
    m+To2+iYYrPrfiEDMro6YjRcRzx8zcUwZqqIgaSz3hVAPO9HOLH+6FJzry3GBXCiYkpRZTZz
    CwiLtnB-dwM-ea1gR4EXsbMq6GGYa86h+tUpcisp26C2Vorqvp+3YwZCHzod6AjhMeJDpbEh
    V68lVgInhwG7OvJb4PgeYPZSuzqbuwLikDIWxw1p6ZGuJdhtvrdho3Zs+cCaYgDZ-E2PNv1h
    -6MPaKezTK5ihS3I5BJj4Yy+ydcRQsyYFF0D9izWQLOUVDOC1tGkHbXf1GSsGV8POnE17QYv
    aCOmVToZqO15QtYJZRtaiUymMj12IPdnL30XtjZleN+J7pkZ1nKLdPdeodf93fj8ZXOLME4G
    xT1-vHj44wJ8RhAacqVL4TiC7dca3JkOwhTF0lFKN44BCIL6BfD0ViTAGsH5n7GEMSO37wq9
    VMra785QP9-R9fUW-6pjIgLYpp1keQAjrUfzGw8Y65ZJt0Fs1SFpkBZFS5vemz0v-Nw8PIMr
    VJfjY7SVSCfrsPSRVOxWTfhZ+q2pSE4A+pGGifUMUNbwFZS7miWeIRQcHiPp5KSBMdb8i87A
    xTYXAZVbcErDBE41FNN0uRFAa04bU2nSAzZFETbm7V2OjCchamgk1KpEVQzrGbFeBK6raRL0
    2vtshws-iP8j3OGCecvomibbA9Ul3QC9T-emaEebtCAD6GYm36tLq+lF+JYBQRIvRUMWzL80
    Ch6WZnNLM8czw5GYIhIv+XsaBneRGDZc51V87pSb0H5J+bflWXW1k-3ECU7uL+O1c7sibIJU
    7US-h2KJ1FwbSk1BlqZ6+8drV7SGfO-+GY36KZ68t5+o52TKUGlQ8gu6JuNyEr6UhdQ9xr9r
    rnNiUhnPSCAO33DrU3RnAkniWoLsjQafZSQxFHTpUM6NMQzaWiouLfmwud6vhE5QSEuZb2us
    -lE1IGO+pvrj21YOOSfZ7N0QVQzV5NLqSLZxWzySSZ76DSSSi65BxysRz-PiWc4CipArkfnv
    WrARIzTWx9jkG9NhfyG5YyBeRfoMSC1xcEj9rNJaTUCMjV9vi-HcNAR6QsXdxGk3XksMDVIw
    -j0g-2wK4D5ZM1IYSr8lRx+TT27RK+Wzi7RpnjT2Q9dfKLA7rHH+HbohpzV9K9CklbTxCoUN
    wbUOd2ltv+RdbJnv7Kl03dp3saaBFICSd1L2EojMVPvbNG1jZrHkPZATLxLoVTv2k1y+wxvH
    1Qm5oSVqrxPVRD44wsJIeafbXicLRxLcsmt96s0WKDU4wMMHXdCWMDf6B8bsRhRH047DEY1E
    hnw80LtVEMjTK8-9-c2rhXw2sOyO+uho4u+dbCnGf+SLfUXuRDbEv2S334k9yS+lUyRNY-NG
    4Uiz7OV+pt+Tlz-eG15xs3Ygpppw41qIXy8PxjKEk-S-g89vxlHqsDN069bE5O461he9U8k5
    Pnud-7EWHo+rEtAsKQG5THz95OTq0nlt0cf1hk8R9y38dlcTeH0PSyrqBqmq-GpIiTg03bQT
    cO18UcKK2+OeAfJghXbTFfBlvV2TDtkS+5d7FiOO7z8STCfdz+9nqg7pxUdvjP1zZHc1LWUC
    qUkULuwU8oYBwcpFz3ewAzCNdI9gbzZQb-+5NXsH-uifa13aB3UdHWS2VNwYH7sucdsNbFZf
    ue4OlW+V7Dz2qmJ5EJA6l4z2iz8lzqguX6uCXequhCFr1Gln8SJrTlkR4EqJqPwwTIHvjT9d
    6pksuTFwzNdU1QNjSaqYuHCxk6xyCHclRGQMapwR1S2w6LFobfVGfDiCez6iBf7MT1cYvrW5
    t6ECb5Noj3IWR1EXPsHdO-t2pUIBrCcsNmtroBtmxq1iJvTSnTLzcluvep9Vp59Plff5sgXX
    a6UXpg+GnJkp932DeO4fQnmguXcz5aOurVyTeskZx3egykjLbVwLYhNulsLY+TtNk7TNn+cS
    PpSNI0qPe8Hbn5Eb+xYYttvGMiFOePnHnJe9BN2oSIFv8hbILUWbKPcT+j6EJ43G75Mj-F6D
    xxLtvTlqMzEFn4g4grFLL40q9NYyQWJ7g1NaAAZ9FnaQjXwio1unwqUq0D3jJKMDdxj8LNlo
    1cL3zsV7fV0LGP--jd-nsa-nw5Ojovt+IPEnl+XGlsecoiBaqphNaehawI17obHiTcAnVJ-c
    aIEL1OSjRY9H3KVUHLtHG-kGFqHfm5vfJouss+FlaKzRQ5c1XOiH-FC0kMawlE7H5Du1C9Ne
    -CyDgpNYQvvpaAulU9D4WtK7q79kw-I1haHtMD4M-ofknlcN+QvIyD7rQtuwuGDXGKlWAICq
    i3Ix+WDJrSzXDmV2lxmN0zGmdfigUzQJlZNksTtbILNCfWbqZ1pHJ9mVN0Dwbnwoz1REGk20
    3++I++6+0+0+0U2Ta37wyEQ-++-2+U++-k+++++++++-+0++++++++++FJUm9Y3HHJ-9+E6I
    +-E++U+6+6E8+FwzkeFbV+I++8gH+++6++++++++++2+6++++0k-++-4H23I9Y3HHJ-9+E6I
    +-E++U+6+6I8+Fz1m1sYCk6++7M0+++6++++++++++++6++++BM4++-4H23I9Yx0GZ-9+E6I
    +-E++U+6+6M8+FxgZeXS8+A++6k7+++5++++++++++2+6++++1Q7++-3K16iI23HI2g-+VE+
    3++0++U+X+c-5pgRp+zU+E++LUE+++Q++++++++++E+U++++V+k++2JMAGt-IopEGk203++I
    ++6+0+0D0U2TXg6Rq-sB+++m6E++0++++++++++-+0++++071U++FYl-J0tIK3FEGk203++I
    ++6+0+0G0U2Ty4vfpO2+++0c++++-k+++++++++-+0++++1B4k++FJUm9Yx0GZ-9+E6I+-E+
    +U+6+7A8+FxLMwHtkk2++Do-+++5++++++++++2+6++++7AQ++-3K12iEoxBI2g-+VE+3++0
    ++U+Zkc-5vg6Mukw1E++Y-6+++Q++++++++++++U++++Sls++2JMAWt3K2JEGkI4++++++Y+
    0E1U+E++r0g+++++
    ***** END OF BLOCK 3 *****

[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]