💾 Archived View for mirrors.apple2.org.za › archive › apple.cabi.net › Languages.Programming › OMF ›… captured on 2023-03-20 at 23:24:42.

View Raw

More Information

⬅️ Previous capture (2023-01-29)

-=-=-=-=-=-=-

Subject:  v001SRC071:  coff (OMF Disassembler) 06/09
Newsgroups: comp.sources.apple2
Approved: jac@paul.rutgers.edu


Submitted-by: Albert Chin-A-Young (26285659t@servax.fiu.edu)
Posting-number: Volume 1, Source:71
Archive-name: utility/gs/disassem/coff/part06
Architecture: ONLY_2gs
Version-number: 1.1


=omf.s
- lst off
-
-* UNIX coff utility
-* OMF parser
-*
-* 1990-1992, tao Developer Project
-
- rel
- xc
- xc
- mx %00
-
- put coff.h ;global defines
- put x.data ;data externals
- put x.general ;general externals
- put x.gsos ;GS/OS i/o externals
- put x.output ;output externals
- put x.structure ;data structure externals
- put x.asm ;65816 OMF disassembler externals
-
- put 4/gsos.h ;GS/OS defines
- put 4/memory.h ;memory manager defines
- put 4/resource.h ;resouce manager defines
- put 4/texttool.h ;text tool defines
- put 4/env.h ;run-time environment settings
-
- use coff.mac ;macro definitions
- use 4/datatype.mac ;HLL data types
- use 4/env.mac ;run-time environment macros
-
-
-* dp $40-$80 taken
-
-**************************************************
-* read header of OMF file into @omf structure.   *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - LOW of length of file.                    *
-*  y - HOW of length of file.                    *
-**************************************************
-read_header ent
-]segname_handle = $80 ;handle to segment name
-]segname_ptr = $84
-]file_len = $88 ;length of OMF file
-
- stx ]file_len
- sty ]file_len+2
- jsr GSOSget_mark
- clc
- tya
- adc #HEADER_LEN
- tay
- txa
- adc #0
- cmp ]file_len+2
- blt :read_header
- cpy ]file_len
- blt :read_header
- lda #MORE_DATA
- ldx #0
- txy
- jmp error
-
-:read_header read_long @omf+`bytecnt
- read_long @omf+`resspc
- read_long @omf+`length
- lda @omf+`length+2 ;OMF length of segment must be
- beq :read_kind ;<= $10000
- cmp #2
- bge :length_error
- lda @omf+`length
- beq :read_kind
-:length_error lda #INVALID_LENGTH
- ldx @omf+`length
- ldy @omf+`length+2
- jmp error
-:read_kind read_char @omf+`kind
- read_char @omf+`lablen
- read_char @omf+`numlen
- read_char @omf+`version
- lda @omf+`version
- cmp #3
- blt :read_bank
- lda #OMF_VERSION
- ldx @omf+`version
- ldy #0
- jmp error
-:read_bank stz @omf+`revision ;default value of revision
- read_long @omf+`banksize
-
- lda @omf+`version
- cmp #1
- beq :0
- read_short @omf+`kind
- read_short :tmp
- bra :1
-:0 read_long :tmp
-:1 read_long @omf+`org
- read_long @omf+`align
- read_char @omf+`numsex
- read_char @omf+`lcbank
- read_short @omf+`segnum
- read_long @omf+`entry
- read_short @omf+`dispname
- read_short @omf+`dispdata
-
- lda @omf+`version
- cmp #1
- beq :2
- read_long @omf+`temporg
-:2 clc
- lda @omf+`offset
- adc @omf+`dispname
- tay
- lda @omf+`offset+2
- adc #0
- tax
- jsr GSOSset_mark
- lda #LOADNAME_LEN
- ldx #@omf+`loadname
- ldy #^@omf+`loadname
- jsr GSOSread
- lda @omf+`lablen
- beq :3
- sta :lablen
- bra :4
-:3 read_char :lablen
-:4 lda @omf+`segname ;if handle already created, just
- ora @omf+`segname+2 ;resize it
- beq :5
- ldx @omf+`segname
- ldy @omf+`segname+2
- stx ]segname_handle
- sty ]segname_handle+2
- lda :lablen ;long - new size of handle
- inc
- inc
- pea #0
- pha
- pei ]segname_handle+2 ;long - handle to resize
- pei ]segname_handle
- _SetHandleSize
- bra :6
-:5 pha ;long - result
- pha
- lda :lablen ;long - size of block
- inc
- inc
- pea #0
- pha
- lda userID ;word - user ID associated with block
- pha
- pea #attrNoCross ;word - attributes of block
- pha ;long - where block is to begin
- pha
- _NewHandle
- plx
- ply
- stx @omf+`segname
- sty @omf+`segname+2
- stx ]segname_handle
- sty ]segname_handle+2
-:6 lda []segname_handle]
- sta ]segname_ptr
- ldy #2
- lda []segname_handle],y
- sta ]segname_ptr+2
-
- clc
- lda ]segname_ptr
- adc #2
- tax
- lda ]segname_ptr+2
- adc #0
- tay
- lda :lablen
- jsr GSOSread
- lda :lablen ;length of segment name
- sta []segname_ptr]
- rts
-
-:tmp ds 4 ;temp location
-:lablen ds 2 ;length of name or record in segment
-
-
-**************************************************
-* parse segment for +hex option.                 *
-**************************************************
-parse_segment_hex ent
-]end_offset = $20 ;offset to end hex disassembly
-]num_read = $24 ;number of bytes read
-
- ldx @omf+`offset ;make duplicate of offset
- ldy @omf+`offset+2
- stx ]end_offset
- sty ]end_offset+2
-
- lda @omf+`version
- cmp #1
- bne :0
- lda @omf+`library
- bne :0
- lda @omf+`bytecnt
- asl ;each block is 512 bytes
- asl
- asl
- asl
- asl
- asl
- asl
- asl
- asl
- clc
- adc ]end_offset
- sta ]end_offset
- tya
- adc #0
- sta ]end_offset+2
- bra :loop
-:0 clc
- txa
- adc @omf+`bytecnt
- sta ]end_offset
- tya
- adc @omf+`bytecnt+2
- sta ]end_offset+2
-
-:loop lda @omf+`displacement+2
- cmp ]end_offset+2
- blt :1
- lda @omf+`displacement
- cmp ]end_offset
- blt :1
- beq :1
- brl :end
-:1 lda #15
- ldx #:hex
- ldy #^:hex
- jsr GSOSread
- stx ]num_read
- bcc :2
- brl :end
-:2 bne :3
- brl :end
-:3 lda #6
- ldx @omf+`displacement
- ldy @omf+`displacement+2
- jsr print_fix_long_hex
- pea #^vert_separator+1
- pea #vert_separator+1
- _WriteCString
- incr ]num_read;@omf+`displacement
-
- ldx #0 ;output bytes just read
-:print_byte phx
- lda :hex,x ;word - char to convert
- and #$ff
- tax
- jsr print_fix_char_hex
- pea #' '
- _WriteChar
- plx
- inx
- cpx ]num_read
- blt :print_byte
-
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- sec ;word - number of characters to print
- lda #15 ;3 * (15 - ]num_read)
- sbc ]num_read
- tax
- asl
- pha
- clc
- txa
- adc 1,s
- sta 1,s
- _TextWriteBlock
- pea #^:dash_separator
- pea #:dash_separator
- _WriteCString
-
- ldx #0
-:print_char phx
- lda :hex,x
- and #$ff
- jsr isprint
- bcs :print_period
- pha
- _WriteChar
- bra :end_loop
-:print_period pea #'.'
- _WriteChar
-:end_loop plx
- inx
- cpx ]num_read
- blt :print_char
- put_cr
- brl :loop
-
-:end put_cr
- rts
-
-:hex ds 16 ;read 15 bytes at a time
-:dash_separator cStr '- ' ;separate bytes/ascii
-
-
-**************************************************
-* parse current OMF segment.                     *
-**************************************************
-parse_segment ent
-]record = $20 ;record to parse
-]offset = $22
-
- ldx #TRUE_OFFSET
- stx ]offset
- stz ]record
- lda }assembly ;display header for assembly parsing
- beq :0
- jsr display_header_asm
-:0 ldx @omf+`displacement+2
- ldy @omf+`displacement
- jsr GSOSset_mark
-
-:loop read_char ]record
- lda ]record
- cmp #END
- beq :4
- cmp #cRELOC
- beq :1
- cmp #RELOC
- beq :1
- cmp #SUPER
- bne :2
-:1 lda }assembly
- bne :3
-
-:2 lda }nooffset
- bne :3
- ldx ]offset
- cpx #TRUE_OFFSET
- bne :3
- jsr print_offset
-
-:3 incr @omf+`displacement
- lda ]record
- ldx #0
- ldy #TRUE
- jsr parse_record
- stx ]offset
- cpx #FALSE_OFFSET
- beq :loop
- ldx #TRUE_OFFSET
- stx ]offset
- bra :loop
-
-:4 lda }assembly
- beq :6
- lda @omf+`resspc ;append DS to end of assembly listing
- ora @omf+`resspc+2 ;if resspc not zero
- beq :5
- jsr print_offset
- pea #^space_12
- pea #space_12
- _WriteCString
- pea #^DS_asm
- pea #DS_asm
- _WriteCString
- ldx @omf+`resspc
- ldy @omf+`resspc+2
- jsr print_long_dec
- put_cr
-:5 lda ~assembler
- cmp #MERLIN
- beq :end
- jsr print_offset
- pea #^space_12
- pea #space_12
- _WriteCString
- pea #^:end_str
- pea #:end_str
- _WriteCString
- bra :cr
-:6 jsr print_offset
- pea #^:END_str
- pea #:END_str
- _WriteCString
-
-:cr put_cr
-:end put_cr
- lda #LOCAL ;remove local labels
- jsr delete_labels
- rts
-
-:END_str cStr 'END       (00)' ;END record name
-:end_str cStr 'end'
-
-
-**************************************************
-* parse current OMF record.                      *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record to parse.                          *
-*  x - offset into current line.                 *
-*  y - prepend spaces to output?                 *
-* (output)                                       *
-*  x - offset into current line.                 *
-**************************************************
-parse_record ent
-]record = $40 ;record to parse
-]space = $42 ;prepend spaces to output?
-]offset = $44
-]truncate_size = $46 ;truncate expression to x bytes
-
- sta ]record
- stx ]offset
- sty ]space
- stz ]truncate_size
-
- cmp #END
- bne :align
- brl :end
-
-:align cmp #ALIGN
- bne :org
- ldx ]record
- jsr parse_ALIGN
- brl :end
-
-:org cmp #ORG
- bne :entry
- ldx ]record
- jsr parse_ORG
- brl :end
-
-:entry cmp #ENTRY
- bne :general
- ldx ]record
- jsr parse_ENTRY
- brl :end
-
-:general cmp #GENERAL
- bne :using
- ldx ]record
- jsr parse_GENERAL
- brl :end
-
-:using cmp #USING
- bne :strong
- jsr parse_USING
- brl :end
-
-:strong cmp #STRONG
- bne :global
- lda }assembly
- beq :parse
- lda ]space
- beq :parse
- pea #^space_12
- pea #space_12
- _WriteCString
-:parse jsr parse_STRONG
- brl :end
-
-:global cmp #GLOBAL
- bne :local
- jsr parse_GLOBAL_LOCAL
- brl :end
-
-:local cmp #LOCAL
- bne :gequ
- jsr parse_GLOBAL_LOCAL
- brl :end
-
-:gequ cmp #GEQU
- bne :equ
- ldx ]offset
- jsr parse_GEQU_EQU
- stx ]offset
- brl :end
-
-:equ cmp #EQU
- bne :mem
- ldx ]offset
- jsr parse_GEQU_EQU
- stx ]offset
- brl :end
-
-:mem cmp #MEM
- bne :expr
- ldx ]offset
- jsr parse_MEM
- stx ]offset
- brl :end
-
-:expr cmp #EXPR
- beq :parse_expr
-:bexpr cmp #BEXPR
- beq :parse_expr
-:lexpr cmp #LEXPR
- beq :parse_expr
-:relexpr cmp #RELEXPR
- bne :ds
-:parse_expr ldy ]space
- ldx ]offset
- jsr parse_expression
- stx ]offset
- brl :end
-
-:ds cmp #DS
- bne :lconst
- lda }assembly
- beq :ds_0
- pea #^space_12
- pea #space_12
- _WriteCString
-:ds_0 lda ]record
- jsr parse_DS
- bra :end
-:lconst cmp #LCONST
- bne :creloc
- ldx }assembly
- beq :lconst_0
- jsr parse_CONST_asm
- bra :end
-:lconst_0 jsr parse_CONST
- bra :end
-:creloc cmp #cRELOC
- bne :reloc
- jsr parse_cRELOC
- stx ]offset
- bra :end
-:reloc cmp #RELOC
- bne :interseg
- jsr parse_RELOC
- stx ]offset
- bra :end
-:interseg cmp #INTERSEG
- bne :cinterseg
- jsr parse_INTERSEG
- stx ]offset
- bra :end
-:cinterseg cmp #cINTERSEG
- bne :super
- jsr parse_cINTERSEG
- stx ]offset
- bra :end
-:super cmp #SUPER
- bne :default
- jsr parse_SUPER
- stx ]offset
- bra :end
-:default lda }assembly
- beq :10
- lda ]record
- jsr parse_CONST_asm
- bra :end
-:10 lda ]record
- jsr parse_CONST
-
-:end ldx ]offset
- rts
-
-
-**************************************************
-* parse CONST record.                            *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-**************************************************
-parse_CONST equ *
-]count = $50 ;number of bytes to read
-]edge = $54 ;right margin for output
-]record = $56 ;record number
-]num_read = $58 ;number of bytes read
-
- sta ]record
- sta ]count
- stz ]count+2
- cmp #LCONST
- bne :const
-
- pea #^:LCONST_str
- pea #:LCONST_str
- _WriteCString
- read_long ]count
- clc
- lda @omf+`displacement
- adc #4
- sta @omf+`displacement
- bcc :0
- inc @omf+`displacement+2
- bra :0
-:const pea #^:CONST_str
- pea #:CONST_str
- _WriteCString
- lda ]record
- sta ]count
- stz ]count+2
-
-:0 ldx ]record
- jsr print_fix_char_hex
- pea #^vert_separator
- pea #vert_separator
- _WriteCString
-
- pea #^:length_str
- pea #:length_str
- _WriteCString
- ldx ]count
- ldy ]count+2
- jsr print_long_dec
- pea #^:hex_length_str
- pea #:hex_length_str
- _WriteCString
- ldx ]count
- ldy ]count+2
- jsr print_long_hex
- pea #')'
- _WriteChar
- pea #^:byte_str
- pea #:byte_str
- _WriteCString
- lda ]count
- ora ]count+2
- cmp #1
- beq :1
- pea #'s'
- _WriteChar
-:1 put_cr
- lda }compress
- beq :parse_CONST
- clc
- lda @omf+`counter
- adc ]count
- sta @omf+`counter
- lda @omf+`counter+2
- adc ]count+2
- sta @omf+`counter+2
- clc
- lda @omf+`displacement
- adc ]count
- sta @omf+`displacement
- lda @omf+`displacement+2
- adc ]count+2
- sta @omf+`displacement+2
- ldx ]count
- ldy ]count+2
- jsr GSOSset_mark_plus
- rts
-
-:parse_CONST jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
-
- lda #0
- ldx }nooffset
- beq :2
- lda #5
-:2 clc
- adc #CONST_EDGE
- sta ]edge
-
-:loop lda ]count+2 ;if number of bytes to read is less
- bne :3 ;than the default, output only
- lda ]count ;default many bytes
- cmp ]edge
- blt :4
-:3 lda ]edge ;read in default number of characters
-:4 ldx #:hex
- ldy #^:hex
- jsr GSOSread
- stx ]num_read
-
- ldx #0 ;output bytes just read
-:print_byte phx
- lda :hex,x
- and #$ff
- tax
- jsr print_fix_char_hex
- pea #' '
- _WriteChar
- plx
- inx
- cpx ]num_read
- blt :print_byte
-
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- sec ;word - number of characters to print
- lda ]edge ;3 * (]edge - ]num_read)
- sbc ]num_read
- tax
- asl
- pha
- clc
- txa
- adc 1,s
- sta 1,s
- _TextWriteBlock
- pea #^:dash_separator
- pea #:dash_separator
- _WriteCString
-
- ldx #0
-:print_char phx
- lda :hex,x
- and #$ff
- jsr isprint
- bcs :print_period
- pha
- _WriteChar
- bra :end_loop
-:print_period pea #'.'
- _WriteChar
-:end_loop plx
- inx
- cpx ]num_read
- blt :print_char
- put_cr
-
- decr ]num_read;]count
- incr ]num_read;@omf+`counter ;update counter
- incr ]num_read;@omf+`displacement ;update offse into OMF file
-
- lda ]count
- ora ]count+2
- beq :end
- lda }nooffset
- bne :5
- jsr print_offset
-:5 pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
- brl :loop
-:end rts
-
-:hex ds CONST_EDGE+6 ;space for input string
-:CONST_str cStr 'CONST     (' ;CONST record name
-:LCONST_str cStr 'LCONST    (' ;LCONST record name
-:dash_separator cStr '- ' ;separate bytes/ascii
-:length_str cStr 'Length: ' ;length of LCONST record
-:hex_length_str cStr ' (



-:byte_str cStr ' byte'
-
-
-**************************************************
-* parse ALIGN record.                            *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - record number.                            *
-**************************************************
-parse_ALIGN equ *
-
- ldy #0
- jsr cannot_parse_msg
- rts
-
-
-**************************************************
-* parse ORG record.                              *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - record number.                            *
-**************************************************
-parse_ORG equ *
-
- ldy #0
- jsr cannot_parse_msg
- rts
-
-
-**************************************************
-* parse ENTRY record.                            *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - record number.                            *
-**************************************************
-parse_ENTRY equ *
-
- ldy #0
- jsr cannot_parse_msg
- rts
-
-
-**************************************************
-* parse GENERAL record.                          *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - record number.                            *
-**************************************************
-parse_GENERAL equ *
-
- ldy #0
- jsr cannot_parse_msg
- rts
-
-
-**************************************************
-* parse USING record.                            *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a -  record number.                           *
-**************************************************
-parse_USING equ *
-]record = $50 ;record number
-]length = $52 ;label length
-]label_handle = $54 ;handle to label
-]label_ptr = $58
-
- sta ]record
- stz ]length
- read_char ]length
-
- pha ;long - result
- pha
- pea #0 ;long - size of block
- pei ]length
- lda userID ;word - userID associated with block
- pha
- pea #attrNoCross+attrLocked ;word - attributes of block
- pha ;long - where block is to begin
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
-
- lda ]length ;read in label name
- ldx ]label_ptr
- ldy ]label_ptr+2
- jsr GSOSread
-
- lda }assembly
- bne :0
- pea #^:USING_str
- pea #:USING_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^vert_separator
- pea #vert_separator
- _WriteCString
- bra :end
-:0 pea #^:USING_asm
- pea #:USING_asm
- _WriteCString
-
-:end pei ]label_ptr+2
- pei ]label_ptr
- pea #0
- pei ]length
- _TextWriteBlock
- put_cr
- _DisposeHandle
- sec ;add ]lenth + 1
- lda @omf+`displacement ;update offset into file
- adc ]length
- sta @omf+`displacement
- bcc :rts
- inc @omf+`displacement+2
-:rts rts
-
-:USING_str cStr 'USING     (' ;USING record name (OMF)
-:USING_asm cStr '            using  ' ;USING record name (assembly)
-
-
-**************************************************
-* this record contains the name of a segment     *
-* that must be included during linking, even if  *
-* no external reference is made to it.           *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-**************************************************
-parse_STRONG ent
-]record = $50 ;record number
-]length = $52 ;length of segment name
-]segname_handle = $54 ;handle to referenced segment name
-]segname_ptr = $58
-
- sta ]record
-
- read_char ]length
- pha ;long - result
- pha
- pea #0 ;long - size of block
- pei ]length
- lda userID ;word - user ID associated with block
- pha
- pea #attrNoCross+attrLocked ;word - attributes of block
- pha ;long - where block is to begin
- pha
- _NewHandle
- lda 1,s
- sta ]segname_handle
- lda 3,s
- sta ]segname_handle+2
- lda []segname_handle]
- sta ]segname_ptr
- tax
- ldy #2
- lda []segname_handle],y
- sta ]segname_ptr+2
- tay
- lda ]length
- jsr GSOSread
-
- lda }assembly
- bne :asm
- pea #^:STRONG_str
- pea #:STRONG_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^vert_separator
- pea #vert_separator
- _WriteCString
- pei ]segname_ptr+2
- pei ]segname_ptr
- pea #0
- pei ]length
- _TextWriteBlock
- bra :update
-:asm pea #^:STRONG_asm
- pea #:STRONG_asm
- _WriteCString
- pei ]segname_ptr+2
- pei ]segname_ptr
- pea #0
- pei ]length
- _TextWriteBlock
- pea #'''
- _WriteChar
-
-:update _DisposeHandle
- put_cr
- incr ]length;@omf+`displacement
- rts
-
-:STRONG_str cStr 'STRONG    (' ;STRONG record name (OMF)
-:STRONG_asm asc !dc     r'!,00 ;STRONG directive
-
-
-**************************************************
-* parse GLOBAL and LOCAL labels.                 *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-**************************************************
-parse_GLOBAL_LOCAL equ *
-]length = $50 ;length of label
-]private = $52 ;if label is private
-]label_ptr = $54
-]segname_handle = $58 ;handle to current segment name
-]segname_ptr = $5c
-]segname_len = $60 ;length of segment name
-]expr_ptr = $62
-]record = $66 ;record number
-]type = $68 ;type of label
-]label_handle = $6a ;handle to label name
-]expr_handle = $6e ;expression label evaluates to
-
- sta ]record
- stz ]length
- stz ]type
- stz ]private
-
- read_char ]length
- pha ;long - result
- pha
- lda ]length ;long - size of block
- inc
- inc
- pea #0
- pha
- lda userID ;word - user ID associated with block
- pha
- pea #attrNoCross+attrLocked ;word - attributes of block
- pha ;long - where block is to begin
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- tax
- inx
- inx
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
- tay
- lda ]length ;read label name
- jsr GSOSread
- lda ]length
- sta []label_ptr]
- incr ]length;@omf+`displacement
-
- lda }label
- bne :add_label
- brl :read
-:add_label ldx @omf+`segname
- ldy @omf+`segname+2
- stx ]segname_handle
- sty ]segname_handle+2
- phy
- phx
- phy
- phx
- _HLock
- lda []segname_handle]
- sta ]segname_ptr
- ldy #2
- lda []segname_handle],y
- sta ]segname_ptr+2
- lda []segname_ptr]
- sta ]segname_len
-
- pha ;long - result
- pha
- clc  ;long - block size
- lda ]segname_len
- adc #14
- pea #0
- pha
- lda userID ;word - user ID of block
- pha
- pea #attrNoSpec+attrLocked ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- lda 1,s
- sta ]expr_handle
- lda 3,s
- sta ]expr_handle+2
- lda []expr_handle]
- sta ]expr_ptr
- ldy #2
- lda []expr_handle],y
- sta ]expr_ptr+2
-
- ldy #2
- lda #'('
- sta []expr_ptr],y
-
- ldy #2
- ldx #3
- shorta
-:copy_segname lda []segname_ptr],y
- phy
- txy
- sta []expr_ptr],y
- ply
- inx
- iny
- dec ]segname_len
- bne :copy_segname
- txy
- lda #'+'
- sta []expr_ptr],y
- iny
- lda #'



- sta []expr_ptr],y
- iny
- longa
- phy
-
- ldx @omf+`counter ;long - longint to convert
- ldy @omf+`counter+2
- phy
- phx
- pea #^long_hex_str ;long - pointer to output string
- pea #long_hex_str
- pea #8 ;word - length of string
- _Long2Hex
- ldx #7
- lda @omf+`counter ;special case value of 0
- ora @omf+`counter+2
- beq :1
- lda #8
- ldx #long_hex_str ;make hex alpha lowercase
- ldy #^long_hex_str
- jsr lowercase_hex
- ldx #$ffff
-:0 inx
- lda long_hex_str,x
- and #$ff
- cmp #'0'
- beq :0
-:1 ply
- shorta
-:copy_value lda long_hex_str,x
- sta []expr_ptr],y
- inx
- iny
- cpx #8
- blt :copy_value
- lda #')'
- sta []expr_ptr],y
- longa
- tya  ;y holds length of label string - 1
- dec
- sta []expr_ptr]
- _HUnlock
- _HUnlock
-
- pei ]label_handle+2
- pei ]label_handle
- pei ]expr_handle+2
- pei ]expr_handle
- pei ]type
- jsr add_label
-
-:read read_char ]length
- read_char ]type
- read_char ]private
-
- lda }assembly
- beq :2
- brl :asm
-:2 lda ]record
- cmp #GLOBAL
- bne :local
- pea #^:GLOBAL_str
- pea #:GLOBAL_str
- bra :print
-:local pea #^:LOCAL_str
- pea #:LOCAL_str
-:print _WriteCString
- lda #2
- ldx ]record
- jsr print_fix_char_dec
- pea #^vert_separator
- pea #vert_separator
- _WriteCString
- pei ]label_ptr+2
- pei ]label_ptr
- pea #2
- lda []label_ptr]
- pha
- _TextWriteBlock
- put_cr
- jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
- pea #^:len_str
- pea #:len_str
- _WriteCString
- ldx ]length
- jsr print_fix_char_hex
- pea #^:type_str
- pea #:type_str
- _WriteCString
- pei ]type
- _WriteChar
- lda ]type
- jsr label_type_str
- lda ]private
- beq :return
- pea #^:private_str
- pea #:private_str
- _WriteCString
-:return put_cr
- bra :end
-:asm lda ]type
- xba
- ora ]length
- ldx ]label_handle
- ldy ]label_handle+2
- jsr parse_type_attribute
-
-:end _HUnlock
- lda }label
- bne :update
- pei ]label_handle+2
- pei ]label_handle
- _DisposeHandle
-:update incr #4;@omf+`displacement
- rts
-
-:GLOBAL_str cStr 'GLOBAL    (' ;GLOBAL record name
-:LOCAL_str cStr 'LOCAL     (' ;LOCAL record name
-:len_str cStr 'len: '
-:type_str cStr ', type: '
-:private_str cStr ' private'
-
-
-**************************************************
-* output string representation of label type.    *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - label type.                               *
-**************************************************
-label_type_str equ *
-
- pha
- pea #' '
- _WriteChar
- pla
- cmp #'A' ;type 'A'
- bne :boolean
- pea #^:address_str
- pea #:address_str
- brl :print
-:boolean cmp #'B' ;type 'B'
- bne :character
- pea #^:boolean_str
- pea #:boolean_str
- brl :print
-:character cmp #'C' ;type 'C'
- bne :double
- pea #^:character_str
- pea #:character_str
- brl :print
-:double cmp #'D' ;type 'D'
- bne :float
- pea #^:double_str
- pea #:double_str
- brl :print
-:float cmp #'F' ;type 'F'
- bne :G
- pea #^:float_str
- pea #:float_str
- brl :print
-:G cmp #'G'
- bne :hex
- pea #^:G_str
- pea #:G_str
- brl :print
-:hex cmp #'H'
- bne :int
- pea #^:hex_str
- pea #:hex_str
- brl :print
-:int cmp #'I'
- bne :K
- pea #^:integer_str
- pea #:integer_str
- brl :print
-:K cmp #'K'
- bne :L
- pea #^:K_str
- pea #:K_str
- brl :print
-:L cmp #'L'
- bne :M
- pea #^:L_str
- pea #:L_str
- brl :print
-:M cmp #'M'
- bne :N
- pea #^:M_str
- pea #:M_str
- brl :print
-:N cmp #'N'
- bne :org
- pea #^:N_str
- pea #:N_str
- brl :print
-:org cmp #'O'
- bne :align
- pea #^:org_str
- pea #:org_str
- brl :print
-:align cmp #'P'
- bne :ds
- pea #^:align_str
- pea #:align_str
- brl :print
-:ds cmp #'S'
- bne :X
- pea #^:ds_str
- pea #:ds_str
- brl :print
-:X cmp #'X'
- bne :Y
- pea #^:X_str
- pea #:X_str
- brl :print
-:Y cmp #'Y'
- bne :Z
- pea #^:Y_str
- pea #:Y_str
- brl :print
-:Z cmp #'Z'
- bne :rts
- pea #^:Z_str
- pea #:Z_str
-:print _WriteCString
-:rts rts
-
-:address_str cStr '"address"'
-:boolean_str cStr '"boolean"'
-:character_str cStr '"character"'
-:double_str cStr '"double-precision"'
-:float_str cStr '"floating-point"'
-:G_str cStr '"EQU or GEQU"'
-:hex_str cStr '"hexadecimal"'
-:integer_str cStr '"integer"'
-:K_str cStr '"reference-address"'
-:L_str cStr '"soft-reference"'
-:M_str cStr '"instruction"'
-:N_str cStr '"assembler directive"'
-:org_str cStr '"ORG"'
-:align_str cStr '"ALIGN"'
-:ds_str cStr '"DS"'
-:X_str cStr '"arithmetic symbol"'
-:Y_str cStr '"boolean symbolic"'
-:Z_str cStr '"character symbolic"'
-
-
-**************************************************
-* parse global and local equates.                *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-*  x - current offset into line.                 *
-* (output)                                       *
-*  x - current offset into line.                 *
-**************************************************
-parse_GEQU_EQU equ *
-]record = $50 ;record number
-]offset = $52 ;current offset into line
-]length = $54 ;length of label
-]type = $56 ;label type
-]private = $58 ;if label is private
-]tmp_asm = $5a ;copy of assembler
-]label_handle = $5a ;handle to label name
-]label_ptr = $5e
-
- sta ]record
- stx ]offset
- stz ]length
- stz ]type
- stz ]private
-
- read_char ]length
- pha ;long - result
- pha
- lda ]length ;long - size of block
- inc
- inc
- pea #0
- pha
- lda userID ;word - user ID associated with block
- pha
- pea #attrNoCross+attrLocked ;word - attributes of block
- pha ;long - where block is to begin
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- tax
- inx
- inx
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
- tay
- lda ]length ;read label name
- jsr GSOSread
- lda ]length
- sta []label_ptr]
-
- read_char ]length
- read_char ]type
- read_char ]private
-
- lda }assembly
- beq :0
- brl :asm
-:0 lda ]record
- cmp #GEQU
- bne :equ
- pea #^:GEQU_str
- pea #:GEQU_str
- bra :print
-:equ pea #^:EQU_str
- pea #:EQU_str
-:print _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^vert_separator
- pea #vert_separator
- _WriteCString
- pei ]label_ptr+2
- pei ]label_ptr
- pea #2
- lda []label_ptr]
- pha
- _TextWriteBlock
- put_cr
- jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
- pea #^:len_str
- pea #:len_str
- _WriteCString
- lda #2
- ldx ]length
- jsr print_fix_char_dec
- pea #^:type_str
- pea #:type_str
- _WriteCString
- pei ]type
- _WriteChar
- lda ]type
- jsr label_type_str
- lda ]private
- beq :return
- pea #^:private_str
- pea #:private_str
- _WriteCString
-:return put_cr
- lda ]record
- ldx ]offset
- jsr parse_expr
- stx ]offset
- brl :end
-
-:asm pei ]label_ptr+2
- pei ]label_ptr
- pea #2
- lda []label_ptr]
- pha
- _TextWriteBlock
- lda []label_ptr]
- cmp #12
- blt :1
- pea #' '
- _WriteChar
- bra :2
-:1 pea #^blank_str
- pea #blank_str
- pea #0
- sec
- lda #12
- sbc []label_ptr]
- pha
- _TextWriteBlock
-:2 ldx #^GEQU_asm
- ldy #GEQU_asm
- lda ]record
- cmp #GLOBAL
- beq :print_asm
- ldx #^EQU_asm
- ldy #EQU_asm
-:print_asm phx
- phy
- _WriteCString
- incr @omf+`displacement
- lda ~assembler
- sta ]tmp_asm
- lda ]record
- ldx ]offset
- jsr parse_expr
- stx ]offset
- cpx #0
- beq :3
- put_cr
-:3 lda ]tmp_asm
- sta ~assembler
-
-:end clc
- lda @omf+`displacement
- adc ]length
- bcc :4
- inc @omf+`displacement+2
-:4 clc
- adc #4
- sta @omf+`displacement
- bcc :rts
- inc @omf+`displacement+2
-:rts _DisposeHandle
- ldx ]offset
- rts
-
-
-:EQU_str cStr 'EQU       (' ;EQU record name
-:GEQU_str cStr 'GEQU      (' ;GEQU record name
-:len_str cStr 'len: '
-:type_str cStr ', type: '
-:private_str cStr ', private'
-:tmp_asm UnsignedShort
-
-
-**************************************************
-* reserve memory area.                           *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-*  x - offset into line.                         *
-* (output)                                       *
-*  x - offset into line.                         *
-**************************************************
-parse_MEM equ *
-]record = $50 ;record number
-]offset = $52 ;offset into line
-]adr_begin = $54 ;address to begin reserving
-]adr_end = $58 ;address to end reserving
-
- sta ]record
- stx ]offset
-
- read_long ]adr_begin
- read_long ]adr_end
-
- lda }assembly
- bne :0
- pea #^:MEM_str
- pea #:MEM_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:reserve_str
- pea #:reserve_str
- _WriteCString
- lda ]adr_begin+2
- and #$ff
- tax
- jsr print_fix_char_hex
- pea #'/'
- _WriteChar
- lda #4
- ldx ]adr_begin
- jsr print_fix_short_hex
- pea #^:dash_str
- pea #:dash_str
- _WriteCString
- lda ]adr_end+2
- and #$ff
- tax
- jsr print_fix_char_hex
- pea #'/'
- _WriteChar
- lda #4
- ldx ]adr_end
- jsr print_fix_short_hex
- put_cr
- bra :1
-
-:0 pea #^:MEM_asm
- pea #:MEM_asm
- _WriteCString
- pea #^:blank_str
- pea #:blank_str
- _WriteCString
- ldx ]adr_begin
- ldy ]adr_begin+2
- jsr print_long_hex
- pea #','
- _WriteChar
- pea #'



- _WriteChar
- ldx ]adr_end
- ldy ]adr_end+2
- jsr print_long_hex
- put_cr
-
-:1 incr #8;@omf+`displacement
- ldx ]offset
- rts
-
-:MEM_str cStr 'MEM       (' ;MEM record name
-:MEM_asm cStr '           mem' ;MEM directive
-:reserve_str cStr ') | reserve: 



-:dash_str cStr ' - 



-:blank_str cStr '    



-
-
-**************************************************
-* parse expressions.                             *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-* (output)                                       *
-*  a - how many bytes to truncate expression to. *
-**************************************************
-parse_EXPR_BEXPR_LEXPR equ *
-]record = $60 ;record number
-]truncate_size = $62 ;number of bytes to truncate expression to
-
- sta ]record
- stz ]truncate_size
-
- read_char ]truncate_size
- lda }assembly
- bne :end
- lda ]record
- cmp #EXPR
- bne :bexpr_str
- pea #^:EXPR_str
- pea #:EXPR_str
- bra :print
-:bexpr_str cmp #BEXPR
- bne :lexpr_str
- pea #^:BEXPR_str
- pea #:BEXPR_str
- bra :print
-:lexpr_str pea #^:LEXPR_str
- pea #:LEXPR_str
-:print _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:truncate_str
- pea #:truncate_str
- _WriteCString
- ldx ]truncate_size
- jsr print_char_dec
- pea #^:byte_str
- pea #:byte_str
- _WriteCString
- lda ]truncate_size
- cmp #1
- beq :1
- pea #'s'
- _WriteChar
-:1 put_cr
-:end incr @omf+`displacement
- lda ]truncate_size
- rts
-
-:EXPR_str cStr 'EXPR      (' ;EXPR record name
-:LEXPR_str cStr 'LEXPR     (' ;LEXPR record name
-:BEXPR_str cStr 'BEXPR     (' ;BEXPR record name
-:truncate_str cStr ') | truncate result to '
-:byte_str cStr ' byte'
-
-
-**************************************************
-* parse relative branches.                       *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-* (output)                                       *
-*  a - how many bytes to truncate expression to. *
-**************************************************
-parse_RELEXPR equ *
-]record = $60 ;record number
-]truncate_size = $62 ;number of bytes to truncate expression to
-]offset = $64
-
- sta ]record
- stz ]truncate_size
-
- read_char ]truncate_size
- lda }assembly
- bne :1
- pea #^:RELEXPR_str
- pea #:RELEXPR_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:truncate_str
- pea #:truncate_str
- _WriteCString
- ldx ]truncate_size
- jsr print_char_dec
- pea #^:byte_str
- pea #:byte_str
- _WriteCString
- lda ]truncate_size
- dec
- beq :0
- pea #'s'
- _WriteChar
-:0 put_cr
-
-:1 read_long ]offset
- incr #5;@omf+`displacement
-
- lda }assembly
- bne :end
- jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
- pea #^:offset_str
- pea #:offset_str
- _WriteCString
- lda #8
- ldx ]offset
- ldy ]offset+2
- jsr print_fix_long_hex
- put_cr
-
-:end lda ]truncate_size
- rts
-
-:RELEXPR_str cStr 'RELEXPR   (' ;RELEXPR record name
-:truncate_str cStr ') | truncate result to '
-:byte_str cStr ' byte'
-:offset_str cStr 'offset: 



-
-
-**************************************************
-* parse recording indicating number of zeros to  *
-* insert at current location.                    *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-**************************************************
-parse_DS ent
-]record = $50 ;DS record number
-]num_zeros = $52 ;number of zeros to insert
-
- sta ]record
-
- read_long ]num_zeros
-
- lda }assembly
- bne :1
- pea #^:DS_str
- pea #:DS_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:insert
- pea #:insert
- _WriteCString
- ldx ]num_zeros
- ldy ]num_zeros+2
- jsr print_long_dec
- pea #^:zero
- pea #:zero
- _WriteCString
- lda ]num_zeros+2
- bne :0
- lda ]num_zeros
- cmp #2
- blt :update
-:0 pea #'s'
- _WriteChar
- bra :update
-
-:1 pea #^DS_asm
- pea #DS_asm
- _WriteCString
- ldx ]num_zeros
- ldy ]num_zeros+2
- jsr print_long_dec
-
-:update put_cr
- incr #5;@omf+`displacement
- clc
- lda @omf+`counter
- adc ]num_zeros
- sta @omf+`counter
- lda @omf+`counter+2
- adc ]num_zeros+2
- sta @omf+`counter+2
- rts
-
-:DS_str cStr 'DS        (' ;DS record name
-:insert cStr ') | insert '
-:zero cStr ' zero'
-
-
-**************************************************
-* parse relocation record.                       *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-* (output)                                       *
-*  x - if displacement, counter offset printed.  *
-**************************************************
-parse_RELOC equ *
-]record = $50 ;record number
-]num_bytes = $52 ;number of bytes to be relocated
-]bit_shift = $54 ;bit-shift bytes left or right?
-]offset = $56 ;location of first byte to relocate
-]value = $5a ;location of reference relative to start of segment
-
- sta ]record
- stz ]num_bytes
- stz ]bit_shift
-
- read_char ]num_bytes
- read_char ]bit_shift
- read_long ]offset
- read_long ]value
-
- lda }assembly
- beq :parse_RELOC
- incr #10;@omf+`displacement ;move past RELOC record
- ldx #FALSE_OFFSET ;for asm disassembly
- rts
-
-:parse_RELOC pea #^:RELOC_str
- pea #:RELOC_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:bytes_str
- pea #:bytes_str
- _WriteCString
- ldx ]num_bytes
- jsr print_char_dec
- pea #^:shift_str
- pea #:shift_str
- _WriteCString
- lda ]bit_shift
- cmp #$80
- bge :right
- pea #^left_str
- pea #left_str
-
- bra :0
-:right pea #^right_str
- pea #right_str
-:0 _WriteCString
- lda ]bit_shift
- cmp #$80
- blt :1
- sec
- lda #$100
- sbc ]bit_shift
- sta ]bit_shift
-:1 tax
- jsr print_char_dec
- put_cr
- jsr print_offset
- pea #^offset_str
- pea #offset_str
- _WriteCString
- lda #6
- ldx ]offset
- ldy ]offset+2
- jsr print_fix_long_hex
- pea #^:value_str
- pea #:value_str
- _WriteCString
- lda #6
- ldx ]value
- ldy ]value+2
- jsr print_fix_long_hex
- put_cr
- incr #10;@omf+`displacement
- ldx #TRUE_OFFSET
- rts
-
-:RELOC_str cStr 'RELOC     (' ;RELOC record name
-:bytes_str cStr ') | bytes: '
-:shift_str cStr ', shift '
-:value_str cStr ', value: 



-
-
-**************************************************
-* parse compressed relocation record.            *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-* (output)                                       *
-*  x - if displacement, counter offset printed.  *
-**************************************************
-parse_cRELOC equ *
-]record = $50 ;record number
-]num_bytes = $52 ;number of bytes to be relocated
-]bit_shift = $54 ;bit-shift bytes left or right?
-]offset = $56 ;location of first byte to relocate
-]value = $58 ;location of reference relative to start of segment
-
- sta ]record
- stz ]num_bytes
- stz ]bit_shift
-
- read_char ]num_bytes
- read_char ]bit_shift
- read_short ]offset
- read_short ]value
-
- lda }assembly
- beq :parse_cRELOC
- incr #6;@omf+`displacement ;move past cRELOC record for
- ldx #FALSE_OFFSET ;asm disassembly
- rts
-
-:parse_cRELOC pea #^:cRELOC_str
- pea #:cRELOC_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:bytes_str
- pea #:bytes_str
- _WriteCString
- ldx ]num_bytes
- jsr print_char_dec
- pea #^:shift_str
- pea #:shift_str
- _WriteCString
- lda ]bit_shift
- cmp #$80
- bge :right
- pea #^left_str
- pea #left_str
- bra :0
-:right pea #^right_str
- pea #right_str
-:0 _WriteCString
- lda ]bit_shift
- cmp #$80
- blt :1
- sec
- lda #$100
- sbc ]bit_shift
- sta ]bit_shift
-:1 tax
- jsr print_char_dec
- put_cr
- jsr print_offset
- pea #^offset_str
- pea #offset_str
- _WriteCString
- lda #4
- ldx ]offset
- jsr print_fix_short_hex
- pea #^:value_str
- pea #:value_str
- _WriteCString
- lda #4
- ldx ]value
- jsr print_fix_short_hex
- put_cr
- incr #6;@omf+`displacement
- ldx #TRUE_OFFSET
- rts
-
-:cRELOC_str cStr 'cRELOC    (' ;cRELOC record name
-:bytes_str cStr ') | bytes: '
-:shift_str cStr ', shift '
-:value_str cStr ', value: 



-
-
-**************************************************
-* parse INTERSEG record.                         *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-* (output)                                       *
-*  x - if displacement, counter offset printed.  *
-**************************************************
-parse_INTERSEG equ *
-]record = $50 ;record number
-]num_bytes = $52 ;number of bytes to be relocated
-]bit_shift = $54 ;bit-shift bytes left or right?
-]offset = $56 ;location of first byte to relocate
-]segnum = $5a ;segment number to relocate
-]filenum = $5c ;file number
-]sub_offset = $5e ;offset of subroutine referenced
-
- sta ]record
- stz ]num_bytes
- stz ]bit_shift
-
- read_char ]num_bytes
- read_char ]bit_shift
- read_long ]offset
- read_short ]filenum
- read_short ]segnum
- read_long ]sub_offset
-
- lda }assembly
- beq :parse_INTERSEG
- incr #7;@omf+`displacement ;move past cRELOC record for
- ldx #FALSE_OFFSET ;asm disassembly
- rts
-
-:parse_INTERSEG pea #^:INTERSEG_str
- pea #:INTERSEG_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:bytes_str
- pea #:bytes_str
- _WriteCString
- ldx ]num_bytes
- jsr print_char_dec
- pea #^:shift_str
- pea #:shift_str
- _WriteCString
- lda ]bit_shift
- cmp #$80
- bge :right
- pea #^left_str
- pea #left_str
- bra :0
-:right pea #^right_str
- pea #right_str
-:0 _WriteCString
- lda ]bit_shift
- cmp #$80
- blt :1
- sec
- lda #$100
- sbc ]bit_shift
- sta ]bit_shift
-:1 tax
- jsr print_char_dec
- put_cr
- jsr print_offset
- pea #^offset_str
- pea #offset_str
- _WriteCString
- lda #8
- ldx ]offset
- ldy ]offset+2
- jsr print_fix_long_hex
- pea #^:filenum_str
- pea #:filenum_str
- _WriteCString
- lda #4
- ldx ]filenum
- jsr print_fix_short_hex
- put_cr
- jsr print_offset
- pea #^:segnum_str
- pea #:segnum_str
- _WriteCString
- lda #4
- ldx ]segnum
- jsr print_fix_short_hex
- put_cr
- jsr print_offset
- pea #^:sub_offset_str
- pea #:sub_offset_str
- _WriteCString
- lda #8
- ldx ]sub_offset
- ldy ]sub_offset+2
- jsr print_fix_long_hex
- put_cr
- incr #7;@omf+`displacement
- ldx #TRUE_OFFSET
- rts
-
-:INTERSEG_str cStr 'INTERSEG  (' ;INTERSEG record name
-:bytes_str cStr ') | bytes: '
-:shift_str cStr ', shift '
-:filenum_str cStr ', file number: 



-:segnum_str cStr '               | segment number: 



-:sub_offset_str cStr '               | offset of subroutine referenced: 



-
-
-**************************************************
-* parse cINTERSEG record.                        *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-* (output)                                       *
-*  x - if displacement, counter offset printed.  *
-**************************************************
-parse_cINTERSEG equ *
-]record = $50 ;record number
-]num_bytes = $52 ;number of bytes to be relocated
-]bit_shift = $54 ;bit-shift bytes left or right?
-]offset = $56 ;location of first byte to relocate
-]segnum = $58 ;segment number to relocate
-]sub_offset = $5a ;offset of subroutine referenced
-
- sta ]record
- stz ]num_bytes
- stz ]bit_shift
- stz ]segnum
-
- read_char ]num_bytes
- read_char ]bit_shift
- read_short ]offset
- read_char ]segnum
- read_short ]sub_offset
-
- lda }assembly
- beq :parse_cINTERSEG
- incr #7;@omf+`displacement ;move past cRELOC record for
- ldx #FALSE_OFFSET ;asm disassembly
- rts
-
-:parse_cINTERSEG pea #^:cINTERSEG_str
- pea #:cINTERSEG_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:bytes_str
- pea #:bytes_str
- _WriteCString
- ldx ]num_bytes
- jsr print_char_dec
- pea #^:shift_str
- pea #:shift_str
- _WriteCString
- lda ]bit_shift
- cmp #$80
- bge :right
- pea #^left_str
- pea #left_str
- bra :0
-:right pea #^right_str
- pea #right_str
-:0 _WriteCString
- lda ]bit_shift
- cmp #$80
- blt :1
- sec
- lda #$100
- sbc ]bit_shift
- sta ]bit_shift
-:1 tax
- jsr print_char_dec
- put_cr
- jsr print_offset
- pea #^offset_str
- pea #offset_str
- _WriteCString
- lda #4
- ldx ]offset
- jsr print_fix_short_hex
- pea #^:segnum_str
- pea #:segnum_str
- _WriteCString
- lda #2
- ldx ]segnum
- jsr print_fix_char_hex
- put_cr
- jsr print_offset
- pea #^:sub_offset_str
- pea #:sub_offset_str
- _WriteCString
- lda #4
- ldx ]sub_offset
- jsr print_fix_short_hex
- put_cr
- incr #7;@omf+`displacement
- ldx #TRUE_OFFSET
- rts
-
-:cINTERSEG_str cStr 'cINTERSEG (' ;cINTERSEG record name
-:bytes_str cStr ') | bytes: '
-:shift_str cStr ', shift '
-:segnum_str cStr ', segment number: 



-:sub_offset_str cStr '               | offset of subroutine referenced: 



-
-
-**************************************************
-* parse supercompressed relocation-dictionary    *
-* record.                                        *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-* (output)                                       *
-*  x - if displacement, counter offset printed.  *
-**************************************************
-parse_SUPER equ *
-]record = $50 ;record number
-]length = $52 ;number of bytes left in record
-]type = $56 ;record type
-]count = $58 ;subrecord count
-]file_mark = $5a ;current position in file
-]num_read = $5e ;number of bytes read
-]edge = $60
-]length_count = $62 ;count of ]length
-
- sta ]record
- stz ]count ;zero hi-byte
- stz ]type
- stz ]length_count
-
- read_long ]length
- read_char ]type
- lda }assembly
- beq :parse_super
- jsr GSOSget_mark ;skip SUPER record if disassembling
- decr ]length
- clc
- tya
- adc ]length
- tay
- txa
- adc ]length+2
- tax
- jsr GSOSset_mark
- clc
- lda @omf+`displacement
- adc ]length
- tax
- lda @omf+`displacement+2
- adc ]length+2
- tay
- clc
- txa
- adc #5
- sta @omf+`displacement
- tya
- adc #0
- sta @omf+`displacement+2
- ldx #FALSE_OFFSET
- rts
-
-:parse_super pea #^:SUPER_str ;output SUPER header
- pea #:SUPER_str
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- pea #^:length_str
- pea #:length_str
- _WriteCString
- ldx ]length
- ldy ]length+2
- jsr print_long_dec
- pea #^:hex_str
- pea #:hex_str
- _WriteCString
- ldx ]length
- ldy ]length+2
- jsr print_long_hex
- pea #')'
- _WriteChar
- pea #^:type_str
- pea #:type_str
- _WriteCString
- ldx ]type
- jsr print_char_dec
- lda ]type ;output type of super record
- cmp #SUPER_RELOC2
- bne :reloc3
- pea #^:super_reloc2
- pea #:super_reloc2
- _WriteCString
- bra :print_data
-:reloc3 cmp #SUPER_RELOC3
- bne :interseg
- pea #^:super_reloc3
- pea #:super_reloc3
- _WriteCString
- bra :print_data
-:interseg pea #^:super_interseg
- pea #:super_interseg
- _WriteCString
- ldx ]type
- jsr print_char_dec
- pea #'"'
- _WriteChar
-:print_data put_cr
-
- decr ]length
- incr #5;@omf+`displacement
- lda #0
- ldx }nooffset
- beq :0
- lda #5
-:0 clc
- adc #SUPER_EDGE
- sta ]edge
-
-:loop lda ]length ;continue parsing SUPER until no more
- ora ]length+2 ;data to parse
- bne :1
- ldx #TRUE_OFFSET
- rts
-:1 read_char ]count
- jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
- incr @omf+`displacement
- decr ]length
- lda #4
- ldx ]length_count
- jsr print_fix_short_hex
- pea #':'
- _WriteChar
- pea #' '
- _WriteChar
- inc ]length_count
- lda ]count
- cmp #$81
- blt :2
- sec
- sbc #$81
-:2 inc
- tax
- lda #3
- jsr print_fix_char_dec
- pea #^:dash_separator
- pea #:dash_separator
- _WriteCString
- lda ]count
- cmp #$81
- blt :4
- pea #^:skip_next_str
- pea #:skip_next_str
- _WriteCString
- sec
- lda ]count
- sbc #$80
- tax
- jsr print_short_dec
- pea #^:256_byte_str
- pea #:256_byte_str
- _WriteCString
- lda ]count
- cmp #$81
- beq :3
- pea #'s'
- _WriteChar
-:3 put_cr
- brl :loop
-
-:4 inc ]count
- decr ]count;]length
- clc
- lda ]length_count
- adc ]count
- sta ]length_count
-:read_data lda ]count ;if number of bytes to read is less
- cmp ]edge ;than the default, output only
- blt :read_hex ;default many bytes
- lda ]edge ;read in default number of characters
-:read_hex ldx #:hex
- ldy #^:hex
- jsr GSOSread
- stx ]num_read
-
- ldx #0 ;output bytes just read
-:print_byte phx
- lda :hex,x
- and #$ff
- tax
- jsr print_fix_char_hex
- pea #' '
- _WriteChar
- plx
- inx
- cpx ]num_read
- blt :print_byte
- put_cr
-
- incr ]num_read;@omf+`displacement
- sec
- lda ]count
- sbc ]num_read
- sta ]count
- bne :5
- brl :loop
-:5 jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
- pea #^blank_str
- pea #blank_str
- pea #0
- pea #12
- _TextWriteBlock
- brl :read_data
-
-:hex ds 17
-:SUPER_str cStr 'SUPER     (' ;SUPER record name
-:length_str cStr ') | length: '
-:hex_str cStr ' (



-:type_str cStr ', type: '
-:super_reloc2 cStr ' "super reloc2"'
-:super_reloc3 cStr ' "super reloc3"'
-:super_interseg cStr ' "super interseg'
-:skip_next_str cStr 'skip next '
-:256_byte_str cStr ' 256-byte page'
-:dash_separator cStr ' - '
-
-
-**************************************************
-* parse expressions EXPR, BEXPR, LEXPR, RELEXPR. *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record number.                            *
-*  x - offset into current line.                 *
-*  y - prepend spaces to output?                 *
-* (output)                                       *
-*  x - offset into current line.                 *
-**************************************************
-parse_expression equ *
-]truncate_size = $50 ;number of bytes to truncate expression to
-]space = $52 ;prepend spaces to output?
-]offset = $54 ;offset into current line
-
- sta ]record
- stx ]offset
- sty ]space
-
- cmp #RELEXPR
- beq :parse_relexpr
- jsr parse_EXPR_BEXPR_LEXPR
- bra :0
-:parse_relexpr jsr parse_RELEXPR
-:0 sta ]truncate_size
- lda @parse_data+`on ;if parsing data, dec number of bytes
- beq :1 ;to parse by number of bytes to
- sec ;truncate expression to
- lda @parse_data+`count
- sbc ]truncate_size
- sta @parse_data+`count
- ldx ]truncate_size
- jsr print_data_type
- bra :2
-:1 lda }assembly
- beq :2
- lda ]space
- beq :2
- pea #^space_12
- pea #space_12
- _WriteCString
- lda #'I'
- sta @parse_data+`data_type
- ldx ]truncate_size
- jsr print_data_type
-:2 lda ]record
- ldx ]offset
- jsr parse_expr
- stx ]offset
- beq :4
- lda @parse_data+`on
- bne :4
- lda ]space
- beq :4
- lda }assembly
- beq :4
- ldx #'''
- lda ~assembler
- cmp #MERLIN
- beq :3
- phx
- _WriteChar
-:3 put_cr
-:4 incr ]truncate_size;@omf+`counter
- ldx ]offset
- rts
-
-
-**************************************************
-* output prefix of assembler statement.          *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - number of bytes expression evalutes to.   *
-**************************************************
-print_data_type equ *
-
- lda ~assembler
- cmp #ORCA
- beq :orca
- cpx #1
- bne :dw
- pea #^db_asm
- pea #db_asm
- _WriteCString
- rts
-:dw cpx #2
- bne :adr
- pea #^dw_asm
- pea #dw_asm
- _WriteCString
- rts
-:adr cpx #3
- bne :adrl
- pea #^adr_asm
- pea #adr_asm
- _WriteCString
- rts
-:adrl cpx #4
- bne :orca
- pea #^adrl_asm
- pea #adrl_asm
- _WriteCString
- rts
-
-:orca lda @parse_data+`data_type
- cmp #'I'
- bne :address
- phx
- pea #^dc_i_asm
- pea #dc_i_asm
- _WriteCString
- plx
- jsr print_char_dec
- pea #'''
- _WriteChar
- rts
-:address cmp #'A'
- bne :soft
- phx
- pea #^dc_a_asm
- pea #dc_a_asm
- _WriteCString
- plx
- jsr print_char_dec
- pea #'''
- _WriteChar
- rts
-:soft cmp #'L'
- bne :end
- pea #^:REFERENCE_asm
- pea #:REFERENCE_asm
- _WriteCString
- pea #'''
- _WriteChar
-:end rts
-
-:REFERENCE_asm cStr 'dc     s' ;reference-address-type DC directive
-
-
-**************************************************
-* parse text of EXPR, BEXPR, LEXPR, RELEXPR.     *
-* ---------------------------------------------- *
-* (input)                                        *
-*  a - record being parsed.                      *
-*  x - current offset into line.                 *
-* (output)                                       *
-*  x - current offset into line.                 *
-**************************************************
-parse_expr equ *
-]offset = $60 ;offset into line
-]expr = $62 ;expression
-
- stx ]offset
- stz ]expr
-
-;init expression list stack
- pha ;long - result
- pha
- pea #0 ;long - size of block
- pea #0
- lda userID ;word - user ID of block
- pha
- pea #attrNoSpec ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- plx
- ply
- stx @expr_list+`lo
- sty @expr_list+`lo+2
- pha ;long - result
- pha
- pea #0 ;long - size of block
- pea #0
- lda userID ;word - user ID of block
- pha
- pea #attrNoSpec ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- plx
- ply
- stx @expr_list+`hi
- sty @expr_list+`hi+2
- stz @expr_list+`size
-
-:loop read_char ]expr
- inc @omf+`displacement
- bne :0
- inc @omf+`displacement+2
-:0 lda ]expr
- cmp #LABEL_WEAK
- bne :label_value
- jsr parse_weak_reference
- brl :end_loop
-:label_value cmp #LABEL_VALUE
- bne :label_length
- jsr parse_label_value
- brl :end_loop
-:label_length cmp #LABEL_LENGTH
- bne :label_type
- jsr parse_label_length
- brl :end_loop
-:label_type cmp #LABEL_TYPE
- bne :label_count
- ldx ]record
- jsr parse_label_type
- brl :end_loop
-:label_count cmp #LABEL_COUNT
- bne :relative_offset
- ldx ]record
- jsr parse_label_count
- brl :end_loop
-:relative_offset cmp #RELATIVE_OFFSET
- bne :constant_operand
- jsr parse_relative_offset
- bra :end_loop
-:constant_operand cmp #CONSTANT_OPERAND
- bne :add
- jsr parse_constant_operand
- bra :end_loop
-:add cmp #ADD ;push arithmetic operators on stack
- beq :push
-:sub cmp #SUB
- beq :push
-:mul cmp #MUL
- beq :push
-:div cmp #DIV
- beq :push
-:mod cmp #MOD
- beq :push
-:negation cmp #NEGATION
- beq :push
-:bit_shift cmp #BIT_SHIFT
- beq :push
-:and cmp #AND
- beq :push
-:or cmp #OR
- beq :push
-:eor cmp #EOR
- beq :push
-:not cmp #NOT
- beq :push
-:less_equal cmp #LESS_EQUAL
- beq :push
-:greater_equal cmp #GREATER_EQUAL
- beq :push
-:not_equal cmp #NOT_EQUAL
- beq :push
-:less cmp #LESS
- beq :push
-:greater cmp #GREATER
- beq :push
-:equal cmp #EQUAL
- beq :push
-:logical_and cmp #LOGICAL_AND
- beq :push
-:inclusive_or cmp #INCLUSIVE_OR
- beq :push
-:exclusive_or cmp #EXCLUSIVE_OR
- beq :push
-:complement cmp #COMPLEMENT
- bne :end_loop
-:push lda ]expr
- ldx #0
- ldy #0
- jsr push_expr_list
-:end_loop lda ]expr
- cmp #END
- beq :print_expr
- brl :loop
-:print_expr lda }infix
- beq :postfix
- ldx ]offset
- jsr print_stack_infix
- stx ]offset
- bra :end
-:postfix ldx ]offset
- jsr print_stack_postfix
- stx ]offset
-
-:end jsr delete_expr_list
- ldx ]offset
- rts
-
-
-**************************************************
-* parse weak-reference label-reference operand.  *
-**************************************************
-parse_weak_reference equ *
-]label_value = $70 ;value of label
-]label_handle = $72 ;label name
-]label_ptr = $76
-]weak_handle = $7a ;weak-reference label name
-]weak_ptr = $7e
-
- stz ]label_value
-
- read_char ]label_value
- incr ]label_value;@omf+`displacement
- pha ;long - result
- pha
- lda ]label_value ;long - block length
- inc
- inc
- inc
- inc
- pea #0
- pha
- lda userID ;word - user ID of block
- pha
- pea #attrNoCross+attrNoSpec+attrLocked ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- tax
- inx
- inx
- inx
- inx
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
- tay
-
- lda ]label_value ;read in label name
- jsr GSOSread
- lda ]label_value ;make label name word-length GS/OS string
- ldy #2
- sta []label_ptr],y
-
- lda }assembly
- beq :0
- _HUnlock
- lda #0 ;add label name to stack
- ldx ]label_handle
- ldy ]label_handle+2
- jsr push_expr_list
- rts
-:0 pha ;long - result
- pha
- clc ;long - block length
- lda ]label_value
- adc #$0b
- pea #0
- pha
- lda userID ;word - user ID of block
- pha
- pea #attrNoCross+attrNoSpec ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- plx
- ply
- stx ]weak_handle
- sty ]weak_handle+2
- lda []weak_handle]
- sta ]weak_ptr
- ldy #2
- lda []weak_handle],y
- sta ]weak_ptr+2
-
- ldy #4 ;copy 'weak (' string to weak label
- lda :weak ;reference
- sta []weak_ptr],y
- ldy #6
- lda :weak+2
- sta []weak_ptr],y
- ldy #8
- lda :weak+4
- sta []weak_ptr],y
-
- ldx #$0a ;copy label name to weak label
- ldy #4 ;reference
- inc ]label_value
- inc ]label_value
- inc ]label_value
- inc ]label_value
- shorta
-:copy_label lda []label_ptr],y
- phy
- txy
- sta []weak_ptr],y
- ply
- inx
- iny
- cpy ]label_value
- bne :copy_label
-:end_copy txy
- lda #')'
- sta []weak_ptr],y
- longa
- inx
- txa
- dec
- dec
- dec
- dec
- ldy #2
- sta []weak_ptr],y
- _HUnlock
-
- lda #0
- ldx ]weak_handle
- ldy ]weak_handle+2
- jsr push_expr_list
- pei ]label_ptr+2
- pei ]label_ptr
- _DisposeHandle
- rts
-
-:weak cStr 'weak ('
-
-
-**************************************************
-* push value assigned to label on stack.         *
-**************************************************
-parse_label_value equ *
-]label_value = $70 ;value of label
-]label_handle = $72 ;label name
-]label_ptr = $76
-
- stz ]label_value
-
- read_char ]label_value
- sec ;add length of label + 1 (pStr)
- lda @omf+`displacement
- adc ]label_value
- sta @omf+`displacement
- bcc :0
- inc @omf+`displacement+2
-
-:0 pha ;long - result
- pha
- clc  ;long - block size
- lda ]label_value
- adc #4
- pea #0
- pha
- lda userID ;word - user ID of block
- pha
- pea #attrNoCross+attrNoSpec+attrLocked ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- tax
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
- tay
-
- lda ]label_value ;read label name
- inx
- inx
- inx
- inx
- jsr GSOSread
- _HUnlock
-
- lda ]label_value
- ldy #2
- sta []label_ptr],y
- lda #0
- ldx ]label_handle
- ldy ]label_handle+2
- jsr push_expr_list
- rts
-
-
-**************************************************
-* push length attribute of label on stack.       *
-**************************************************
-parse_label_length equ *
-]label_length = $70 ;length of label
-]label_handle = $72 ;label name
-]label_ptr = $76
-
- stz ]label_length
-
- read_char ]label_length
- sec ;add length of label + 1 (pStr)
- lda @omf+`displacement
- adc ]label_value
- sta @omf+`displacement
- bcc :0
- inc @omf+`displacement+2
-
-:0 pha ;long - result
- pha
- clc  ;long - block size
- lda ]label_length
- adc #4
- pea #0
- pha
- lda userID ;word - user ID of block
- pha
- pea #attrNoCross+attrNoSpec+attrLocked ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- tax
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
- tay
-
- lda ]label_length ;read label name
- inx
- inx
- inx
- inx
- jsr GSOSread
- _HUnlock
-
- lda ]label_value
- ldy #2
- sta []label_ptr],y
- lda #LABEL_LENGTH
- ldx ]label_handle
- ldy ]label_handle+2
- jsr push_expr_list
- rts
-
-
-**************************************************
-* push type attribute of label on stack.         *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - record being parsed.                      *
-**************************************************
-parse_label_type equ *
-
- ldy #LABEL_TYPE
- jmp cannot_parse_msg
-
-
-**************************************************
-* push count attribute on stack.                 *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - record being parsed.                      *
-**************************************************
-parse_label_count equ *
-
- ldy #LABEL_COUNT
- jmp cannot_parse_msg
-
-
-**************************************************
-* push length attribute of label on stack.       *
-**************************************************
-parse_relative_offset equ *
-]label_value = $70 ;value of label
-]label_handle = $74 ;label name
-]label_ptr = $78
-]segname_handle = $7c ;handle to segment name
-]segname_ptr = $80
-]segname_len = $84
-
- read_long ]label_value
- ldx @omf+`segname
- ldy @omf+`segname+2
- stx ]segname_handle
- sty ]segname_handle+2
- phy
- phx
- phy
- phx
- _HLock
- lda []segname_handle]
- sta ]segname_ptr
- ldy #2
- lda []segname_handle],y
- sta ]segname_ptr+2
- lda []segname_ptr]
- sta ]segname_len
-
- pha ;long - result
- pha
- clc  ;long - block size
- lda ]segname_len
- adc #16
- pea #0
- pha
- lda userID ;word - user ID of block
- pha
- pea #attrNoCross+attrNoSpec+attrLocked ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
-
- ldy #4
- lda #'('
- sta []label_ptr],y
-
- ldy #2
- ldx #5
- shorta
-:copy_segname lda []segname_ptr],y
- phy
- txy
- sta []label_ptr],y
- ply
- inx
- iny
- dec ]segname_len
- bne :copy_segname
- txy
- lda #'+'
- sta []label_ptr],y
- iny
- lda #'



- sta []label_ptr],y
- iny
- longa
- phy
-
- pei ]label_value+2 ;long - longint to convert
- pei ]label_value
- pea #^long_hex_str ;long - pointer to output string
- pea #long_hex_str
- pea #8 ;word - length of string
- _Long2Hex
- ldx #7
- lda ]label_value
- ora ]label_value+2
- beq :1
- lda #8
- ldx #long_hex_str ;make hex alpha lowercase
- ldy #^long_hex_str
- jsr lowercase_hex
- ldx #$ffff
-:0 inx
- lda long_hex_str,x
- and #$ff
- cmp #'0'
- beq :0
-:1 ply
- shorta
-:copy_value lda long_hex_str,x
- sta []label_ptr],y
- inx
- iny
- cpx #8
- blt :copy_value
- lda #')'
- sta []label_ptr],y
- longa
- tya  ;y holds length of label string
- dec
- dec
- dec
- ldy #2
- sta []label_ptr],y
- _HUnlock
- _HUnlock
-
- lda #0
- ldx ]label_handle
- ldy ]label_handle+2
- jsr push_expr_list
-
- incr @omf+`numlen;@omf+`displacement
- rts
-
-
-**************************************************
-* push constant onto stack.                      *
-**************************************************
-parse_constant_operand equ *
-]label_value = $70 ;value of label
-]label_handle = $74 ;label name
-]label_ptr = $78
-
- read_long ]label_value
- pha ;long - result
- pha
- pea #0  ;long - block size
- pea #13
- lda userID ;word - user ID of block
- pha
- pea #attrNoCross+attrNoSpec+attrLocked ;word - block attributes
- pha ;long - start of block
- pha
- _NewHandle
- lda 1,s
- sta ]label_handle
- lda 3,s
- sta ]label_handle+2
- lda []label_handle]
- sta ]label_ptr
- ldy #2
- lda []label_handle],y
- sta ]label_ptr+2
-
- ldy #4
- lda #'



- sta []label_ptr],y
-
- pei ]label_value+2 ;long - longint to convert
- pei ]label_value
- pea #^long_hex_str ;long - pointer to output string
- pea #long_hex_str
- pea #8 ;word - length of string
- _Long2Hex
- ldx #7
- lda ]label_value
- ora ]label_value+2
- beq :1
- lda #8
- ldx #long_hex_str ;make hex alpha lowercase
- ldy #^long_hex_str
- jsr lowercase_hex
- ldx #$ffff
-:0 inx
- lda long_hex_str,x
- and #$ff
- cmp #'0'
- beq :0
-
-:1 ldy #5
- shorta
-:copy_value lda long_hex_str,x
- sta []label_ptr],y
- inx
- iny
- cpx #8
- blt :copy_value
- longa
- tya  ;y holds length of label string - 3
- dec
- dec
- dec
- dec
- ldy #2
- sta []label_ptr],y
- _HUnlock
-
- lda #0
- ldx ]label_handle
- ldy ]label_handle+2
- jsr push_expr_list
-
- incr @omf+`numlen;@omf+`displacement
- rts
-
-
-**************************************************
-* display message that coff cannot parse current *
-* OMF record.                                    *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - record that cannot be parsed.             *
-*  y - subrecord that cannot be parsed.          *
-**************************************************
-cannot_parse_msg equ *
-]record = $e0 ;record that cannot be parsed
-]subrecord = $e2 ;subrecord that cannot be parsed
-
- stx ]record
- sty ]subrecord
-
- put_cr
- jsr get_progname
- phy
- phx
- phy
- phx
- _WriteCString
- pea #^:cannot_parse
- pea #:cannot_parse
- _WriteCString
- ldx ]record
- jsr print_fix_char_hex
- lda ]subrecord
- beq :0
- pea #'.'
- _WriteChar
- ldx ]subrecord
- jsr print_fix_char_hex
-:0 put_cr
- _WriteCString
- pea #^:contact_author
- pea #:contact_author
- _WriteCString
- put_cr
-
-:1 pla
- bne :1
- rts
-
-:cannot_parse cStr ': cannot parse OMF record 



-:contact_author cStr ': please inform the author'
-
-
-**************************************************
-bit cStr 'bit'
-left_str cStr 'left '
-right_str cStr 'right '
-offset_str cStr '               | offset: 



-
-
-**************************************************
- sav omf.l
+ END OF ARCHIVE