-; Offsets into the o65 header structure (6502 format)
-O65_HDR_MARKER = 0 ; Non-C64 marker
-O65_HDR_MAGIC = 2 ; o65 magic
-O65_HDR_VERSION = 5 ; Version number
-O65_HDR_MODE = 6 ; Mode word
-O65_HDR_TBASE = 8 ; Original text (code) segment address
-O65_HDR_TLEN = 10 ; Size of text (code) segment
-O65_HDR_DBASE = 12 ; Original data segment address
-O65_HDR_DLEN = 14 ; Size of data segment
-O65_HDR_BBASE = 16 ; Original bss segment address
-O65_HDR_BLEN = 18 ; Size of bss segment
-O65_HDR_ZBASE = 20 ; Original zp segment address
-O65_HDR_ZLEN = 22 ; Size of zp segment
-O65_HDR_STACK = 24 ; Stacksize needed
-O65_HDR_SIZE = 26 ; Size of header structure
+; The o65 header structure (6502 format)
+.struct O65_HDR
+ MARKER .byte 2 ; Non-C64 marker: $01 $00
+ MAGIC .byte 3 ; o65 magic: "o65"
+ VERSION .byte 1 ; Version number
+ MODE .word ; Mode word
+ TBASE .word ; Original text (code) segment address
+ TLEN .word ; Size of text (code) segment
+ DBASE .word ; Original data segment address
+ DLEN .word ; Size of data segment
+ BBASE .word ; Original bss segment address
+ BLEN .word ; Size of bss segment
+ ZBASE .word ; Original zp segment address
+ ZLEN .word ; Size of zp segment
+ STACK .word ; Stacksize needed
+.endstruct
; Marker, magic and version number
O65_MARKER_0 = $01
; The header of the o65 file. Since we don't need the first 8 bytes any
; longer, once we've checked them, we will overlay them with other data to
; save a few bytes.
-Header: .res O65_HDR_SIZE ; The o65 header
+Header: .tag O65_HDR ; The o65 header
; Input
InputByte = Header ; Byte read from input
lda #<Header
ldx #>Header
jsr pushax
- lda #O65_HDR_SIZE
+ lda #.sizeof(O65_HDR)
ldx #0 ; Always less than 256
jsr ReadAndCheckError ; Bails out in case of errors
; caller
CalcSizes:
- lda Header + O65_HDR_TLEN
- add Header + O65_HDR_DLEN
+ lda Header + O65_HDR::TLEN
+ add Header + O65_HDR::DLEN
sta TPtr
- lda Header + O65_HDR_TLEN + 1
- adc Header + O65_HDR_DLEN + 1
+ lda Header + O65_HDR::TLEN + 1
+ adc Header + O65_HDR::DLEN + 1
sta TPtr+1
lda TPtr
- add Header + O65_HDR_BLEN
+ add Header + O65_HDR::BLEN
pha ; Save low byte of total size
ldy #MOD_CTRL::MODULE_SIZE
sta (Ctrl),y
lda TPtr+1
- adc Header + O65_HDR_BLEN + 1
+ adc Header + O65_HDR::BLEN + 1
iny
sta (Ctrl),y
tax
tax
pla
jsr pushax
- lda Header + O65_HDR_BLEN
- ldx Header + O65_HDR_BLEN+1
+ lda Header + O65_HDR::BLEN
+ ldx Header + O65_HDR::BLEN+1
jsr _bzero ; bzero (bss, bss_size);
; Load code and data segment into memory. The sum of the sizes of
; Relocate the data segment
lda Module
- add Header + O65_HDR_TLEN
+ add Header + O65_HDR::TLEN
pha
lda Module + 1
- adc Header + O65_HDR_TLEN + 1
+ adc Header + O65_HDR::TLEN + 1
tax
pla ; Data segment address in a/x
jsr RelocSeg