home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / programming / msdos / xa214f.lzh / xa214f / doc / fileformat.txt < prev    next >
Text File  |  1998-04-20  |  24KB  |  583 lines

  1.  
  2.                          6502 BINARY RELOCATION FORMAT
  3.                                        
  4. v1.2 AS OF 26JAN1998
  5.  
  6.   (C) aNDR{$e9} fACHAT (A.FACHAT@PHYSIK.TU-CHEMNITZ.DE)
  7.      _________________________________________________________________
  8.    
  9.   cHANGES FROM v1.1
  10.   
  11.    tHE ORDER FOR SAVING THE UNDEFINED REFERENCE AND THE LOW BYTE OF A
  12.    HIGH BYTE RELOCATION ENTRY HAS CHANGED. tHIS MAKES THE os/a65 LIB6502
  13.    IMPLEMENTATION EASIER. hOW MANY OTHER PEOPLE USE THIS FORMAT
  14.    ANYWAY...?
  15.      _________________________________________________________________
  16.    
  17.   0) pREFACE
  18.   
  19.    wITH SOME NEW 6502/c64/c128 OPERATING SYSTEMS COMES THE NEED FOR A NEW
  20.    BINARY FORMAT. iN MULTITASKING OPERATING SYSTEMS LIKE lUNIX, smos, OR
  21.    os/a65, A BINARY FILE CANNOT BE LOADED TO A FIXED LOCATION THAT MIGHT
  22.    ALREADY BE USED BY ANOTHER PROGRAM. tHEREFORE IT MUST BE POSSIBLE TO
  23.    RELOCATE THE PROGRAM TO AN ARBITRARY ADDRESS AT LEAST AT LOAD TIME. iN
  24.    ADDITION TO THAT, MORE SPECIFIC INFORMATION MIGHT BE STORED IN A
  25.    BINARY EXECUTABLE FILE, LIKE INTERRUPT VECTORS FOR EXAMPLE.
  26.    
  27.    tHIS TEXT GIVES A GOOD SOLUTION TO THIS PROBLEM FOR THE 6502 cpu AND
  28.    AN ASSEMBLER SOURCE FORMAT TO USE THIS FORMAT IN A GENERAL MANNER. tHE
  29.    FILE FORMAT CAN EVEN BE USED AS AN OBJECT FILE FORMAT, I.E. A FORMAT A
  30.    LINKER CAN USE AS AN INPUT FILE. iT IS ALSO USABLE AS A 65816 FILE
  31.    FORMAT. iNSTEAD OF ZEROPAGE ADDRESSING MODES, THE 65816 HAS DIRECT
  32.    ADDRESSING MODES, THAT ADD THE CONTENTS OF THE DIRECT REGISTER TO THE
  33.    ZEROPAGE ADDRESS IN THE OPCODE.
  34.    
  35.   1) 6502/65816 SPECIFICS
  36.   
  37.    tHE 6502 HAS THE SPECIAL FEATURE OF A 'ZEROPAGE', I.E. A VERY LIMITED
  38.    MEMORY ADDRESS RANGE USED FOR SPECIAL ADDRESSING MODES. sO THE FORMAT
  39.    SHOULD NOT ONLY PROVIDE A MEANS TO RELOCATE ABSOLUTE ADDRESSES BUT
  40.    ALSO ZEROPAGE ADDRESSES. tHE 65816 REPLACES ZEROPAGE ADDRESSING WITH
  41.    DIRECT ADDRESSING MODES.
  42.    
  43.    tHE STACK SPACE IS ALSO VERY LIMITED. a BINARY FORMAT HAS TO PROVIDE A
  44.    MEASURE OF HOW MUCH STACK SPACE IS NEEDED FOR THE APPLICATION.
  45.    
  46.    sUCH LIMITS SHOULD BE DEFINED AS 2 BYTE VALUES, EVEN IF THE 6502 ONLY
  47.    HAS A RANGE OF 8 ADDRESS BITS FOR ZEROPAGE AND STACK. bUT THE 65816
  48.    BEHAVES DIFFERENTLY, IT HAS A 16 BIT STACK POINTER FOR EXAMPLE. fOR
  49.    FURTHER EXPANDABILITY, A 32 BIT FORMAT SHOULD BE PROVIDED, ALTHOUGH
  50.    THE 16 BIT FORMAT SUFFICES FOR THE 65816 ALREADY.
  51.    
  52.    aNOTHER PROBLEM IS, THAT AN ADDRESS CAN BE 'SPLIT', I.E. YOU CAN JUST
  53.    USE THE HIGH BYTE OR THE LOW BYTE SEPARATELY IN AN OPCODE. tHIS GIVES
  54.    NEED TO A SPECIAL RELOCATION TABLE FORMAT, THAT CAN COPE WITH
  55.    HALF-ADDRESS REFERENCES. tHE 65816 CAN EVEN HAVE THREE BYTE ADDRESSES,
  56.    I.E. ADDRESS IN A SEGMENT AND SEGMENT NUMBER.
  57.    
  58.   2) BINARY FORMAT
  59.   
  60.     2.1) gENERAL
  61.     
  62.    tHE FILE DIFFERS FROM THE KNOWN cOMMODORE FILE FORMATS, IN THAT A LOT
  63.    MORE INFORMATION IS STORED IN THE FILE. fIRST THE DATA IS STRUCTURED
  64.    IN SEPARATE SEGMENTS TO ALLOW DIFFERENT HANDLING OF TEXT (PROGRAM
  65.    CODE), DATA (LIKE TABLES) AND BSS (UNINITIALIZED DATA).
  66.    
  67.    aLSO TABLES ARE INCLUDED TO ALLOW LATE BINDING, I.E. LINKING THE FILE
  68.    WITH OTHER FILES AT LOAD TIME, AND RELOCATION, I.E. EXECUTING THE FILE
  69.    AT DIFFERENT ADDRESSES IN 6502 ADDRESS SPACE.
  70.    
  71.     2.2) sEGMENTS
  72.     
  73.    aS ALREADY USED IN OTHER FORMATS, THE ASSEMBLER USES THREE DIFFERENT
  74.    SEGMENT TYPES, I.E. TEXT (THE ACTUAL PROGRAM CODE), DATA (INITIALIZED
  75.    VARIABLES), AND BSS (UNINITIALIZED VARIABLES). tO HAVE THESE DIFFERENT
  76.    SEGMENTS SEEMS TO BE 'OVERDESIGNED', BUT THEY ACTUALLY MAKE MEMORY
  77.    HANDLING EASIER IN MORE COMPLEX OPERATING SYSTEMS ON SYSTEMS WITH
  78.    VIRTUAL ADDRESSES (os/a65, FOR EXAMPLE).
  79.    
  80.    tHE TEXT SEGMENT IS DEFINED TO BE READ-ONLY MEMORY. tHIS DOESN'T ALLOW
  81.    SELF-MODIFYING CODE IN THIS SEGMENT, BUT ALLOWS MEMORY SHARING IN
  82.    VIRTUAL MEMORY ARCHITECTURES. tHE DATA SEGMENT ACTUALLY IS LIKE THE
  83.    TEXT SEGMENT, ONLY IT IS ALLOCATED WRITABLE. tHIS SEGMENT MIGHT NOT BE
  84.    SHARED BETWEEN DIFFERENT PROCESSES. tHE CONTENTS OF THESE TWO SEGMENTS
  85.    ARE LOADED FROM THE FILE. tHE BSS SEGMENT IS UNINITIALIZED DATA, I.E.
  86.    UPON PROGRAM START, IT IS NOT DEFINED - AND NOT LOADED FROM THE FILE.
  87.    tHIS AREA IS READ-WRITE AND CAN BE USED DURING PROGRAM EXECUTION. iT
  88.    IS ALSO NOT SHARED BETWEEN PROCESSES. iN ADDITION TO THESE SEGMENTS,
  89.    THE 6502 FORMAT ALSO INCLUDES A ZEROPAGE SEGMENT TYPE, TO ALLOW
  90.    ZEROPAGE VARIABLES TO BE RELOCATED. tHIS ZEROPAGE SEGMENT IS LIKE A
  91.    BSS SEGMENT, IN THAT ONLY THE LENGTH, BUT NOT THE DATA IS SAVED. fOR
  92.    THE 65816 THE ZEROPAGE SEGMENT CHANGES ITS MEANING TO A BANK ZERO
  93.    SEGMENT.
  94.    
  95.    tHE DIFFERENT SEGMENTS HOLD DIFFERENT TYPE OF DATA AND CAN BE LOCATED
  96.    ANYWHERE IN MEMORY (EXCEPT ZERO SEGMENT, WHICH HAS TO BE IN THE
  97.    ZEROPAGE RESP. BANK ZERO). tHE PROGRAM MUST THEREFORE NOT ASSUME
  98.    ANYTHING ABOUT THE RELATIVE ADDRESSES BETWEEN DIFFERENT SEGMENTS.
  99.    
  100.     2.3) rELOCATION
  101.     
  102.    iN GENERAL, THERE ARE THREE WAYS TO HANDLE THE RELOCATION PROBLEM SO
  103.    FAR:
  104.  
  105. - tABLES: HAVE A RELOCATION TABLE FOR A TEXT SEGMENT
  106.   IF THE RELOCATION TABLE IS PUT IN FRONT OF CODE
  107.   YOU HAVE TO SAVE THE TABLE IN A SIDE-STORAGE
  108.   IF TABLE IS BEHIND, YOU STILL CANNOT RELOCATE 'ON THE FLY'.
  109.  
  110. - dEASSEMBLING: GO THROUGH THE CODE, DEASSEMBLE IT AND CHANGE ALL ABSOLUTE
  111.   ADDRESSES. pROBLEM: NEEDS TO KNOW OR HAVE HINTS ABOUT WHERE SOME
  112.   DATA IS IN THE CODE.
  113.  
  114. - rELOCATION INFO IN THE CODE: HERE EACH ADDRESS IS PRECEEDED WITH AN
  115.   'ESCAPE' CODE AND IS RELOCATED WHEN LOADING. bUT THIS DISALLOWS BLOCK
  116.   ORIENTED TRANSFER FROM STORAGE MEDIA TO MEMORY.
  117.  
  118.    tHIS BINARY FORMAT USES THE FIRST METHOD, WITH THE TABLE AFTER THE
  119.    CODE/DATA. tHIS WAY BLOCK ORIENTED TRANSFER FOR THE TEXT/DATA SEGMENT
  120.    CAN BE USED. aND WHILE READING THE RELOCATION TABLES BYTEWISE, THE
  121.    RELOCATION CAN BE DONE WITHOUT THE NEED TO SAVE THE TABLE SOMEWHERE.
  122.    
  123.     2.4) eXTERNAL rEFERENCES & eXPORTED gLOBALS
  124.     
  125.    aS THIS FILE FORMAT SHOULD NOT ONLY BE USED AS AN EXECUTABLE FORMAT,
  126.    BUT ALSO AS OBJECT FILE FORMAT, IT MUST PROVIDE A WAY TO DEFINE
  127.    REFERENCES - REFERENCES EXPORTED FROM THIS OBJECT AND LABELS
  128.    REFERENCED IN THIS OBJECT. tHE EXTERNAL REFERENCES LIST (ALSO CALLED
  129.    'UNDEFINED LIST') LISTS THE ADDRESSES WHERE LABELS NOT DEFINED IN THIS
  130.    OBJECT ARE REFERENCED. tHE EXPORTED GLOBALS LIST LISTS THE ADDRESSES
  131.    THAT ARE AVAILABLE FOR OTHER OBJECTS. tHE LABELS ARE NAMED BY
  132.    NULL-TERMINATED ascii STRINGS.
  133.    
  134.    eVEN AN EXECUTABLE FILE CAN HAVE NON-EMPTY GLOBALS AND EXTERNALS
  135.    LISTS, BUT ONLY IF THE OPERATING SYSTEM ALLOWS THIS. iN THIS CASE, SO
  136.    CALLED 'LATE BINDING' IS USED TO LINK THE OBJECT WITH SOME GLOBAL
  137.    LIBRARIES AT LINK TIME.
  138.    
  139.     2.5) fILE EXTENSION
  140.     
  141.    tHE PROPOSED STANDARD EXTENSION FOR THE DESCRIBED FORMAT IS ".O65"
  142.    WHEN USED AS AN OBJECT FILE.
  143.    
  144.     2.6) fORMAT DESCRIPTION
  145.     
  146.    tHE BINARY FORMAT IS THE FOLLOWING:
  147.    (
  148.         HEADER
  149.  
  150.         TEXT SEGMENT
  151.  
  152.         DATA SEGMENT
  153.  
  154.         EXTERNAL REFERENCES LIST
  155.  
  156.         RELOCATION TABLE FOR TEXT SEGMENT
  157.  
  158.         RELOCATION TABLE FOR DATA SEGMENT
  159.  
  160.         EXPORTED GLOBALS LIST
  161.    )
  162.  
  163.    tHE DESCRIPTION OF THE PARTS FOLLOWS:
  164.    
  165.       2.6.1) hEADER
  166.       
  167.    tHE HEADER CONTAINS THE MINIMUM NEEDED DATA IN A FIXED STRUCT. tHE
  168.    REST OF THE NECESSARY INFORMATION IS PUT INTO THE HEADER OPTIONS.
  169.    [nOTE: .WORD IS A 16 BIT VALUE, LOW BYTE FIRST, .BYT IS A SIMPLE BYTE.
  170.    .LONG IS A 32 BIT VALUE, LOW BYTE FIRST. .SIZE IS A 16 OR 32 BIT VALUE
  171.    ACCORDING TO .WORD AND .LONG, DEPENDING ON THE SIZE BIT IN THE MODE
  172.    FIELD ]
  173.    
  174.    tHIS IS THE FIXED STRUCT:
  175.    (
  176.         .BYT $01,$00            ; NON-c64 MARKER
  177.  
  178.         .ASC "O65"              ; O65 magic!
  179.         .BYT 0                  ; VERSION
  180.  
  181.         .WORD MODE              ; MODE WORD
  182.  
  183.         .SIZE TBASE             ; ADDRESS TO WHICH TEXT IS ASSEMBLED TO
  184.                                 ; ORIGINALLY
  185.         .SIZE TLEN              ; LENGTH OF TEXT SEGMENT
  186.         .SIZE DBASE             ; ORIGINATING ADDRESS FOR DATA SEGMENT
  187.         .SIZE DLEN              ; LENGTH OF DATA SEGMENT
  188.         .SIZE BBASE             ; ORIGINATING ADDRESS FOR BSS SEGMENT
  189.         .SIZE BLEN              ; LENGTH OF BSS SEGMENT
  190.         .SIZE ZBASE             ; ORIGINATING ADDRESS FOR ZERO SEGMENT
  191.         .SIZE ZLEN              ; LENGTH OF ZERO SEGMENT
  192.         .SIZE STACK             ; MINIMUM NEEDED STACK SIZE, 0= NOT KNOWN.
  193.                                 ; THE os SHOULD ADD REASONABLE VALUES FOR
  194.                                 ; INTERRUPT HANDLING BEFORE ALLOCATING
  195.                                 ; STACK SPACE
  196.    )
  197.  
  198.    tHE MODE WORD CURRENTLY HAS THESE DEFINED BITS:
  199.         MODE.15 :       cpu     0= 6502         1= 65816
  200.         MODE.14 :       RELOC   0= BYTEWISE...  1= PAGE(256BYTE)WISE RELOCATION
  201.                                                    ALLOWED
  202.         MODE.13 :       SIZE    0= SIZE=16 BIT, 1= SIZE=32 BIT
  203.         MODE.12 :       OBJ     0= EXECUTABLE   1= OBJECT FILE
  204.  
  205.         MODE.0-1:       ALIGN   0= BYTE ALIGN,
  206.                                 1= WORD (I.E. 2 BYTE) ALIGN
  207.                                 2= LONG (4 BYTE) ALIGN
  208.                                 3= BLOCK (256 BYTE) ALIGN
  209.  
  210.    tHE cpu BIT TELLS THE LOADER FOR WHICH cpu THE FILE WAS MADE. tHIS HAS
  211.    IMPLICATIONS ON THE ZERO SEGMENT, FOR EXAMPLE. aLSO A SYSTEM CAN CHECK
  212.    IF THE PROGRAM WILL RUN AT ALL (ON A 6502 THAT IS). tHE RELOC BIT
  213.    DEFINES IF AN OBJECT FILE CAN BE RELOCATED BYTEWISE, OR IF IT MUST BE
  214.    PAGE-ALIGNED. a PAGE HAS 256 BYTES. tHE RESTRICTION TO PAGEWISE
  215.    RELOCATION SIMPLIFIES THE RELOCATION TABLE AND ALSO ALLOWS SIMPLER
  216.    COMPILERS/ASSEMBLERS. tHE SIZE BIT DETERMINES THE SIZE OF THE SEGMENT
  217.    BASE ADDRESS AND LENGTH ENTRIES. cURRENTLY THE 16 BIT SIZE (SIZE BIT =
  218.    0) WORKS FOR 6502 AND 65816 cpuS.
  219.    
  220.    tHE OBJ BIT DISTINGUISHES BETWEEN OBJECT FILES AND EXECUTABLES. aN
  221.    OBJECT FILE IS USED AS ASSEMBLER OUTPUT THAT CAN BE LINKED WITH OTHER
  222.    OBJECT FILES TO BUILD AN EXECUTABLE OR AN OBJECT LIBRARY. tHE TWO
  223.    ALIGN BITS GIVE THE ADDRESS BOUNDARY THE SEGMENTS CAN BE PLACED. eVEN
  224.    THE 6502 NEEDS THIS, AS, FOR EXAMPLE, "JMP ($XXff)" IS BROKEN. tHE
  225.    ALIGN BITS ARE VALID FOR ALL OF THE SEGMENTS. [nOTE: IF RELOC=1, THEN
  226.    ALIGN SHOULD BE 3. bUT IF ALIGN=3, RELOC NEED NOT BE 1, BECAUSE RELOC
  227.    SWITCHES TO A SIMPLER VERSION OF THE RELOCATION TABLE. tHE RELOC BIT
  228.    MIGHT BE OBSOLETED IN NEWER VERSIONS OF THIS FORMAT. tHOUGH IT SHOULD
  229.    BE SET, IF NECESSARY.]
  230.    
  231.    aLL UNUSED BITS IN THE MODE FIELD MUST BE ZERO.
  232.    
  233.    nOTE THAT THE HEADER SIZE IS 26 IF THE SIZE BIT IS ZERO AND 44 IF THE
  234.    SIZE BIT IS ONE.
  235.    
  236.    tHE FIXED SIZED STRUCT IS IMMEDIATELY FOLLOWED BY A LIST OF HEADER
  237.    OPTIONS. eACH HEADER OPTION CONSISTS OF A SINGLE BYTE TOTAL LENGTH, A
  238.    TYPE BYTE AND SOME DATA BYTES IF NEEDED. a SINGLE LENGTH BYTE OF $00
  239.    ENDS THE HEADER OPTION LIST.
  240.  
  241.    (
  242.         {$7b}                       ; OPTIONAL OPTIONS, MORE THAN ONE ALLOWED
  243.            .BYT OLEN            ; OVERALL LENGTH (INCLUDING LENGTH AND TYPE
  244.                                 ; BYTE
  245.            .BYT OTYPE           ; OPTION TYPE
  246.            [ .BYT OPTION_BYTES ]
  247.         {$7d}
  248.         .BYT $00                ; END OF OPTIONS MARKER (I.E. OPTION LEN=0)
  249.    )
  250.  
  251.    tHE HEADER OPTIONS CURRENTLY DEFINED/PROPOSED ARE:
  252. - fILENAME:
  253.   TYPE=0; LEN=STRLEN(FILENAME_IN_ASCII)+3; CONTENT="FILENAME_IN_ASCII",0
  254.   tHE STRING CONTAINS THE NAME OF THE OBJECT.
  255.  
  256. - oPERATING sYSTEM hEADER
  257.   TYPE=1; LEN=?
  258.   THE FIRST DATA BYTE IS THE os TYPE:
  259.         1       osa/65 HEADER SUPPLEMENT
  260.         2       lUNIX HEADER SUPPLEMENT
  261.         [OTHERS TO FOLLOW?]
  262.   THE FOLLOWING DATA CONTAINS os SPECIFIC INFORMATION.
  263.   a SUGGESTED DATA BYTE IS THE os VERSION AS SECOND BYTE.
  264.  
  265. - aSSEMBLERPROGRAM:
  266.   TYPE=2; LEN=STRLEN(ASS)+3; CONTENT="ASS",0
  267.   tHE STRING CONTAINS THE NAME OF THE ASSEMBLER RESP. LINKER THAT PRODUCED
  268.   THIS FILE/OBJECT.
  269.   fOR EXAMPLE (SYNTAX SEE BELOW)
  270.      .FOPT 2, "XA 2.1.1G",0
  271.   BECOMES
  272.      0C 02 78 61 20 32 2E 31 2E 31 67 00
  273.   IN THE FILE.
  274.  
  275. - aUTHOR:
  276.   TYPE=3; LEN=STRLEN(AUTHOR)+3; CONTENT="AUTHOR",0
  277.   tHE STRING CONTAINS THE AUTHOR OF THE FILE.
  278.  
  279. - cREATION DATA:
  280.   TYPE=4; LEN=STRLEN(DATE)+3; CONTENT="DATE_STRING",0
  281.   tHE STRING CONTAINS THE CREATION DATE IN FORMAT LIKE:
  282.   "sAT dEC 21 14:00:23 met 1996", WHERE WE HAVE THE DAY, mONTH, DATE,
  283.   TIME, TIMEZONE AND YEAR. sEE OUTPUT OF {$60}DATE{$60}...
  284.  
  285.       2.6.2) TEXT AND DATA SEGMENTS
  286.       
  287.    tHE TEXT AND DATA SEGMENTS ARE JUST THE ASSEMBLED CODE. tHE ONLY
  288.    DIFFERENCE BETWEEN TEXT AND DATA SEGMENTS IS THE READ/WRITE MODE OF
  289.    THE TWO SEGMENTS. tHEREFORE, TO BE COMPLIANT TO THIS FILE FORMAT,
  290.    SELF-MODIFYING CODE GOES INTO THE DATA SEGMENT.
  291.    
  292.       2.6.3) uNDEFINED REFERENCES LIST
  293.       
  294.    tHE NEXT LIST IS AN ascii LIST OF LABELS THAT ARE REFERENCED IN THIS
  295.    FILE BUT NOT DEFINED. tHE LISTS IS PRECEEDED WITH THE NUMBER OF
  296.    UNDEFINED LABELS (16 OR 32 BITS, ACCORDING TO THE MODE.SIZE BIT).
  297.  
  298. UNDEF_LIST:     NUMBER_OF_UNDEFINED_LABELS.S
  299.                 "UNDEFINED_LABEL1",0
  300.                 "UNDEFINED_LABEL2",0
  301.                 ...
  302.  
  303.       2.6.4) rELOCATION TABLES
  304.       
  305.    tHE RELOCATION TABLES ARE THE SAME FORMAT FOR THE TWO SEGMENTS, TEXT
  306.    AND DATA. iN GENERAL A RELOCATION ENTRY CONSISTS OF THE OFFSET FROM
  307.    THE PREVIOUS RELOCATION ADDRESS TO THE NEXT ONE, THE TYPE OF THE
  308.    RELOCATION AND ADDITIONAL INFO. rELOCATION NOT ONLY DEFINES THE
  309.    RELOCATION WHEN MOVING OBJECT CODE TO A DIFFERENT ADDRESS, BUT ALSO
  310.    FILLING IN THE UNDEFINED REFERENCES.
  311.    
  312.    eACH TABLE STARTS AT RELOCATION ADDRESS = SEGMENT BASE ADDRESS -1.
  313.    i.E. IF THE SEGMENT BASE ADDRESS IS $1000 FOR EXAMPLE, THE FIRST ENTRY
  314.    HAS AN OFFSET COMPUTED FROM BASE ADDRESS-1 = $0FFF. tHE OFFSET TO THE
  315.    NEXT RELOCATION ADDRESS IS THE FIRST BYTE OF EACH ENTRY. iF THE OFFSET
  316.    IS LARGER THAN 254 (I.E. 255 OR ABOVE), THAN A 255 IS SET AS OFFSET
  317.    BYTE, THE OFFSET IS DECREMENTED BY 254 (NOTE THE DIFFERENCE) AND THE
  318.    ENTRY IS STARTED AGAIN.
  319.  
  320. {$7b} [255,...,255,] OFFSET OF NEXT RELOCATION (B), TYPEBYTE{$7c}SEGMENTid [, LOW_BYTE]
  321.  {$7d}+
  322.  
  323.    WHERE TYPEBYTE HAS THE BITS 5, 6 AND 7 AND IS ONE OF
  324. word    $80     2 BYTE ADDRESS
  325. high    $40     HIGH BYTE OF AN ADDRESS
  326. low     $20     LOW BYTE OF AN ADDRESS
  327. segadr  $C0     3 BYTE ADDRESS (65816)
  328. seg     $A0     SEGMENT BYTE OF 3 BYTE ADDRESS
  329.  
  330.    tHE SEGMENTid STANDS FOR THE SEGMENT THE REFERENCE POINTS TO:
  331. 0               UNDEFINED
  332. 1               ABSOLUTE VALUE
  333. 2               TEXT SEGMENT
  334. 3               DATA SEGMENT
  335. 4               BSS SEGMENT
  336. 5               ZERO SEGMENT
  337.  
  338.    (oF COURSE THE ABSOLUTE VALUE WILL NEVER APPEAR IN A RELOCATION TABLE,
  339.    BUT THIS VALUE IS NECESSARY FOR THE EXPORTED LIST)
  340.    
  341.    iF THE TYPE IS high, THE LOW BYTE OF THE VALUE IS STORED BEHIND THE
  342.    RELOCATION TABLE ENTRY, IF BYTEWISE RELOCATION IS ALLOWED (HEADER MODE
  343.    FIELD BIT 14). iF ONLY PAGEWISE RELOCATION IS ALLOWED, THEN ONLY high
  344.    RELOCATION ENTRIES CAN OCCUR, AND THE LOW BYTE IS IMPLICITELY SET ZERO
  345.    (I.E. IT IS _NOT_ SAVED IN THE RELOCATION TABLE).
  346.    
  347.    iF THE TYPE IS seg, THEN THE TWO LOWER BYTES OF THE THREE BYTE SEGMENT
  348.    ADDRESS ARE STORED BEHIND THE ENTRY IN THE RELOCATION TABLE, LOWER
  349.    BYTE FIRST.
  350.    
  351.    iF THE SEGMENT IS "UNDEFINED", THE TYPEBYTE IS IMMEDIATELY FOLLOWED BY
  352.    THE TWO (MODE SIZE=0) OR FOUR (MODE SIZE=1) BYTE VALUE INDEX IN THE
  353.    UNDEFINED REFERENCES LIST. iF IT IS A HIGH BYTE RELOCATION, THE LOW
  354.    BYTE IS SAVED BEHIND THE INDEX VALUE. tHE INDEX VALUE DETERMINES THE
  355.    UNDEFINED REFERENCE, WHICH MUST BE LOOKED UP BY THE LOADER.
  356.    
  357.    tHE VALUE TAKEN FROM THE RELOCATION ADDRESS IN THE SEGMENT, TOGETHER
  358.    WITH THE LOW BYTE FROM THE RELOCATION TABLE (IF high ENTRY) FORM THE
  359.    ADDRESS USED IF THE SEGMENT WOULD BE USED UNRELOCATED. tO RELOCATE THE
  360.    SEGMENT, THE DIFFERENCE BETWEEN THE RELOCATED SEGMENT BASE ADDRESS AND
  361.    THE SEGMENT BASE ADDRESS FROM THE FILE IS THEN ADDED TO THE ABOVE
  362.    ADDRESS. tHE RESULT IS AGAIN SAVED IN THE SEGMENT.
  363.    
  364.    a ZERO OFFSET BYTE ENDS THE RELOCATION TABLE. tHE FIRST OFFSET IS
  365.    COMPUTED FROM THE SEGMENT BASE ADDRESS-1, TO AVOID A 0 VALUE IN THE
  366.    FIRST ENTRY.
  367.    
  368.    nOTE THAT DIRECT ADDRESSING MODES DO NOT GENERATE ENTRIES IN THE
  369.    RELOCATION TABLE. INSTEAD IT IS ASSUMED THAT THE 65816 DIRECT REGISTER
  370.    HOLDS THE CORRECT VALUE (I.E. ZERO SEGMENT BASE ADDRESS) WHEN RUNNING
  371.    THIS PROGRAM.
  372.    
  373.    eXAMPLE:
  374.    
  375.    sEGMENT bASE ADDRESS IN FILE (HEADER.TBASE) IS $1000. tHE START
  376.    ADDRESS OF THE TEXT SEGMENT AFTER RELOCATION IS REAL.TBASE = $1234.
  377.    
  378.    nOW THE FIRST (UNRELOCATED) ADDRESS AT WHICH A RELOCATION SHOULD TAKE
  379.    PLACE IS HERE:
  380.  
  381. $1222   a9 23           LDA #>VECTOR
  382.  
  383.    tHIS GENERATES THE OFFSET: $1222-($1000-1) = $223. tHIS IS LARGER THAN
  384.    254 ($FE), SO THE FIRST BYTE IS 255 ($FF). tHE OFFSET IS DECREMENTED
  385.    BY $FE, AND GIVES $125. tHIS AGAIN IS LARGER THAN $FE, SO THE NEXT
  386.    BYTE IS $FF AGAIN. aFTER SUBSTRACTING $FE AGAIN, WE HAVE $27. bUT THIS
  387.    IS THE ADDRESS OF THE OPCODE. tO GET THE ADDRESS OF THE ADDRESS BYTE,
  388.    WE HAVE TO ADD 1 TO GET $28, WHICH BECOMES THE THIRD BYTE. tHE NEXT
  389.    OFFSET IS THEN COMPUTED FROM $1223, BECAUSE THIS IS THE LAST
  390.    RELOCATION ADDRESS.
  391.    
  392.    nOW WE REFERENCE THE HIGH BYTE OF AN ADDRESS, LETS SAY VECTOR=$23D0
  393.    (NOT RELOCATED), IN THE TEXT SEGMENT. tHEREFORE THE RELOCATION TYPE
  394.    BECOMES 'high {$7c} TEXT_SEGMENTid = $42', WHICH IS THE NEXT BYTE. bECAUSE
  395.    WE ARE REFERENCING A HIGH BYTE OF AN ADDRESS, THE LOW BYTE OF THE
  396.    UNRELOCATED ADDRESS IS SAVED BEHIND THE TYPEBYTE IN THE RELOCATION
  397.    ENTRY. tHIS BYTE IS MISSING WHEN REFERENCING A LOW BYTE OR ADDRESS.
  398.    
  399.    tHE RELOCATION TABLE ENTRY IS NOW:
  400. $FF, $FF, $28, $42, $D0.
  401.  
  402.    wHEN ACTUALLY DOING THE RELOCATION, THE RELOCATION POINTER IS
  403.    INITIALIZED TO REAL.TBASE-1 = $1233. tHEN WE COMPUTE THE OFFSET TO
  404.    $224, WHICH BRINGS US TO $1457, WHERE THE ADDRESS BYTE OF THE ABOVE
  405.    OPCODE IS AFTER LOADING THE FILE TO $1234. wE NOW HAVE TO COMPUTE THE
  406.    NEW ADDRESS, WHERE VECTOR IS AFTER RELOCATION. sO WE TAKE THE
  407.    UNRELOCATED LOW BYTE FROM THE RELOCATION TABLE ($D0) AND THE HIGH BYTE
  408.    FROM $1457 ($23).
  409.  
  410. VECTOR_FILE = ($23
  411. tO THIS VALUE WE ADD
  412. THE DIFFERENCE BETWEEN THE ADDRESS THE PROGRAM IS ASSEMBLED TO AND THE
  413. REAL LOAD ADDRESS:
  414.  
  415. VECTOR_RELOCATED = VECTOR_FILE + (REAL.TBASE - HEADER.TBASE)
  416.                  = $23D0 + ($1234 - $1000)
  417.                  = $23D0 + $234
  418.                  = $2604
  419.  
  420. fROM THIS VALUE THE HIGH BYTE IS THEN WRITTEN BACK TO THE ADDRESS $1457.
  421. hAD WE NOT SAVED THE LOW BYTE IN THE RELOCATION TABLE, AND ONLY ADDED
  422. THE HIGH BYTES, WE WOULD HAVE MISSED THE CARRY BIT THAT INCREMENTS
  423. THE HIGH BYTE IN THIS CASE!
  424.  
  425. hAD "VECTOR" NOW BEEN AN UNDEFINED REFERENCE, AND "VECTOR" WOULD BE
  426. THE SECOND LABEL IN THE UNDEFINED REFERENCES LIST, WE WOULD GET THE
  427. FOLLOWING RELOCATION TABLE ENTRY (ASSUMING MODE.SIZE=0):
  428.  
  429. $FF, $FF, $28, $40, $00, $02, $00
  430.  
  431. tHE VALUE COMPUTED WITH THE ABOVE FORMULA FOR VECTOR_FILE IS NOW ADDED
  432. TO THE ADDRESS THE LABEL "VECTOR" NOW REALLY HAS (tHIS MUST OF COURSE
  433. BE LOOKED UP INTO AN EXTERNAL TABLE OR LIST).
  434. hAD THE OPCODE BEEN "lda #>VECTOR+$567", THEN THE LOW BYTE IN THE RELOCATION
  435. TABLE WOULD BE $67, WHILE THE HIGH BYTE IN THE OPCODE WOULD BE $05.
  436. tHIS VALUE WOULD RESULT IN VECTOR_FILE AND THE REAL ADDRESS OF "VECTOR"
  437. WOULD BE ADDED BEFORE WRTING BACK THE HIGH BYTE TO THE OPCODE.
  438.  
  439.  
  440.       2.6.5) EXPORTED GLOBALS LIST
  441.  
  442.  
  443. tHE GLOBAL LIST IS A LIST OF NAMES, TOGETHER WITH THE TARGET SEGMENT
  444. AND THE OFFSET IN THE SEGMENT FOR EACH NAME. iT IS PRECEEDED WITH THE
  445. NUMBER OF EXPORTED LABELS. tHIS ALLOWS THE LOADER TO ALLOCATE A TABLE
  446. LARGE ENOUGH, IF NEEDED. tHE NUMBER OF LABELS AND THE OFFSET VALUE
  447. ARE 16 BIT OR 32 BIT VALUES ACCORDING TO THE SIZE BIT IN THE HEADER MODE
  448. FIELD. tHE SEGMENTid IS A BYTE VALUE AND THE SAME AS IN THE RELOCATION
  449. TABLE ENTRY (SEE SECTION 2.6.3).
  450.  
  451.         NUMBER_OF_EXPORTED_LABELS.S
  452.         "GLOBAL_LABEL_NAME_IN_ASC1",0, SEGMENTid.B, VALUE.S
  453.         ...
  454.  
  455.  
  456.   3) ASSEMBLER SOURCE FORMAT
  457.  
  458.  
  459. tHE ASSEMBLER SOURCE FORMAT IS A SUGGESTION ONLY. iT WILL BE IMPLEMENTED
  460. IN XA65, A CROSS ASSEMBLER FOR 6502 cpuS RUNNING ON uNIX/aTARI st/aMIGA
  461. AS A REFERENCE PLATFORM.
  462.  
  463. tHE ASSEMBLER PROVIDES A WAY TO EMBED ABSOLUTE ADDRESS CODE IN RELOCATABLE
  464. CODE. tHIS IS NEEDED WHEN CODE SHOULD BE COPIED TO A SPECIFIC LOCATION
  465. KNOWN AT ASSEMBLE TIME.
  466. tHERE ALSO IS A WAY TO MAKE A FILE 'ROMABLE'. yOU CAN GIVE THE START
  467. ADDRESS OF THE _FILE_ IN rom, AND THE ASSEMBLER AUTOMATICALLY SETS
  468. THE TEXT SEGMENT START ADDRESS TO WHERE THE CODE WILL BE IN THE rom.
  469. oF COURSE, THE OTHER SEGMENTS MUST BE TAKEN CARE OF WITH -B? COMMAND
  470. LINE PARAMETER, THAT SET THE SEGMENT START ADDRESS.
  471.  
  472.     3.1) EMBED ABSOLUTE CODE IN RELOCATABLE FILES
  473.  
  474.  
  475. wHEN THE ASSEMBLER IS STARTED IN RELOCATABLE MODE, EVERYTHING IS PUT INTO
  476. A .O65 RELOCATABLE FILE. aLL ADDRESS REFERENCES GENERATE RELOCATION TABLE
  477. ENTRIES. iF A "*= VALUE" PSEUDO OPCODE IS ENCOUNTERED,
  478. THEN THE ASSEMBLER SWITCHES TO ABSOLUTE MODE. tHE FOLLOWING OPCODES DON'T
  479. GENERATE RELOCATION TABLE ENTRIES. iF A "*=" WITHOUT A VALUE IS READ,
  480. THEN THE ASSEMBLER SWITCHES BACK TO RELOCATABLE MODE. tHE RELOCATION
  481. PROGRAM COUNTER IS INCREASED WITH THE LENGTH OF THE ABSOLUTE PART AND
  482. THE ABSOLUTE CODE IS EMBEDDED BETWEEN THE RELOCATABLE PARTS.
  483.  
  484.     3.2) EMBED RELOCATABLE CODE IN ABSOLUTE FILES
  485.  
  486.  
  487. tHIS IS DROPPED - TOO COMPLICATED. sHOULD BETTER BE DONE WITH SOME
  488. OBJDUMP OR LINKER PROGRAMS OR SO.
  489.  
  490.     3.2) hEADER OPTIONS
  491.  
  492.  
  493. bEFORE ANY OPCODE (AFTER STARTING IN RELOCATABLE MODE, OR AFTER A .RELOC
  494. OPCODE), A HEADER OPTION CAN BE SET BY:
  495.  
  496.         .FOPT BYTE1, BYTE2, ...
  497.  
  498. tHE HEADER OPTION LENGTH IS AUTOMATICALLY SET BY THE ASSEMBLER.
  499. aN EXAMPLE FOR AN FILE AUTHOR ENTRY:
  500.  
  501.         .FOPT 3, "aNDRE fACHAT",0
  502.  
  503. tHE 3 IS THE TYPE BYTE FOR THE AUTHOR HEADER OPTION. tHE LAST ZERO ENDS
  504. THE NAME.  tHE ASSEMBLER CAN BE CONFIGURED TO AUTOMATICALLY INCLUDE AN
  505. ASSEMBLER HEADER OPTION INTO A FILE HEADER.
  506.  
  507.     3.3) ALLOCATION OF DATA SEGMENT/ZEROPAGE SEGMENT ADDRESS SPACE
  508.  
  509.  
  510. tHE ASSEMBLER SWITCHES BETWEEN THE DIFFERENT SEGMENTS BY THE MEANS OF
  511. ".TEXT", ".DATA", ".BSS" AND ".ZERO" PSEUDO OPCODES. aFTER STARTING IN
  512. RELOCATABLE MODE, THE ASSEMBLER IS IN THE TEXT SEGMENT.
  513.  
  514. tHE TEXT SEGMENT CONTAINS THE PROGRAM CODE. dATA HOLDS THE INITIALIZED DATA,
  515. WHILE BSS AND ZERO SEGMENTS CONTAIN UNINITIALIZED DATA FOR NORMAL/ZEROPAGE
  516. ADDRESS SPACE.
  517. eVERYTHING THAT IS BETWEEN ONE OF THESE SEGMENT OPCODES AND THE NEXT SEGMENT
  518. OPCODE GETS INTO THE CORRESPONDING SEGMENT, I.E. LABELS, ASSEMBLED CODE ETC.
  519. tHE TEXT AND DATA SEGMENTS ARE SAVED IN THE FILE, WHILE FOR THE BSS AND
  520. ZERO SEGMENTS ONLY THE LENGTH IS SAVED IN THE FILE.
  521.  
  522. tHE ASSEMBLER SHOULD ISSUE A WARNING WHEN A DIRECT ADDRESSING MODE
  523. IS USED WITHOUT A ZERO SEGMENT ADDRESS AND VICE VERSA FOR 65816 cpuS.
  524.  
  525.     3.4) REFERENCING DATA/BSS/ZEROPAGE ADDRESSES
  526.  
  527.  
  528. oNE PROBLEM WITH THE 6502 IS, THAT IT CANNOT LOAD AN ADDRESS WITHIN ONE
  529. STEP OR ASSEMBLER OPCODE. sO AN ADDRESS IS LOADED WITH STANDARD BYTE
  530. OPCODES, LIKE "LDA #
  531. tHE ASSEMBLER IS NOW INTELLIGENT ENOUGH TO EVALUATE SUCH EXPRESSIONS
  532. AND CHECK FOR:
  533.  
  534. - NO ADDRESS LABEL                      : OK, ABSOLUTE
  535. - ONE ADDRESS LABEL, ONLY ADD TO LABEL  : OK, RELOCATE
  536. - DIFFERENCE BETWEEN TWO ADDRESSES      : iF ADDRESSES IN SAME SEGMENT, COMPUTE
  537.                                           DIFF AND SET ABSOLUTE, OTHERWISE BAIL
  538. - EVERYTHING ELSE                       : WARNING
  539.  
  540. tHIS WAY THERE IS NO CHANGE IN SYNTAX. aDDRESS LABELS ARE DISTINGUISHED
  541. BY USING THE "LABEL:" SYNTAX, AS OPPOSED TO "LABEL = VALUE".
  542. aLSO, IF THE ASSEMBLER IS CAPABLE OF DOING SO, AN ADDRESS LABEL MAY BE
  543. DEFINED BY "LABEL OPCODE", I.E. WITHOUT A COLON.
  544.  
  545.     3.5) ALIGNING CODE
  546.  
  547.  
  548. tHE 6502 HAS THE PROBLEM THAT SOME OPCODES (E.G. "jmp ($XXff)" ARE
  549. BROKEN, IF THE ADDRESS GIVEN IS AT SOME (ODD) ADDRESS. bUT WHEN LOADING
  550. A RELOCATABLE FILE, ONE CANNOT KNOW IF AN ADDRESS WILL BE ODD OR EVEN.
  551. tHEREFORE THERE IS A NEW OPCODE,
  552.  
  553.         .ALIGN 2
  554.  
  555. THAT ALIGNS THE NEXT ADDRESS AT THE GIVEN ADDRESS BOUNDARY. vALID
  556. VALUES ARE 2, 4, AND 256.
  557.  
  558.   4) cLEARANCE
  559.  
  560.  
  561. tHIS FILE IS SURELY NOT THE OPTIMUM AND COULD BE IMPROVED. aLSO THE
  562. HEADER OPTION "ASSIGNED NUMBERS" SHOULD BE ADDED HERE.
  563.  
  564. fOR THIS REASON THE AUTHOR, aNDR{$e9} fACHAT, WILL FUNCTION AS A
  565. CLEARING POINT, WHERE PROBLEMS CAN BE DISCUSSED AND NUMBER CAN BE ASSIGNED.
  566.  
  567.  
  568. dEC. 22, 1996,
  569.  
  570. aNDR{$e9} fACHAT
  571.  
  572. (FACHAT@PHYSIK.TU-CHEMNITZ.DE)
  573.  
  574.  
  575. aPPENDIX
  576.  
  577.  
  578.  
  579.   a) fILE EXAMPLES
  580.  
  581.  
  582. (TO BE DONE WITH REFERENCE ASSEMBLER)
  583.