💾 Archived View for mirrors.apple2.org.za › archive › apple.cabi.net › Languages.Programming › OMF ›… captured on 2023-01-29 at 08:23:25.

View Raw

More Information

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

Subject:  v001SRC072:  coff (OMF Disassembler) 07/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:72
Archive-name: utility/gs/disassem/coff/part07
Architecture: ONLY_2gs
Version-number: 1.1


=output.s
- lst off
-
-* UNIX coff utility
-* output routines
-*
-* 1990-1992, tao Developer Project
-
- rel
- xc
- xc
- mx %00
-
- put coff.h ;global defines
- put x.data ;external data definitions
- put x.general ;external general definitions
- put x.gsos ;external GS/OS i/o definitions
- put x.structure ;external data structure definitions
-
- 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/getopt.h ;getopt command-line option 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
-
-
-long_header mac
- pea #^]1
- pea #]1
- _WriteCString
- lda #8
- ldx @omf+`]2
- ldy @omf+`]2+2
- jsr print_fix_long_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- pea #25 ;word - number of characters to print
- _TextWriteBlock
- lda #10
- ldx @omf+`]2
- ldy @omf+`]2+2
- jsr print_fix_long_dec
- put_cr
- eom
-short_header mac
- pea #^]1
- pea #]1
- _WriteCString
- lda #4
- ldx @omf+`]2
- jsr print_fix_short_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- pea #34 ;word - number of characters to print
- _TextWriteBlock
- lda #5
- ldx @omf+`]2
- jsr print_fix_short_dec
- put_cr
- eom
-char_header mac
- pea #^]1
- pea #]1
- _WriteCString
- ldx @omf+`]2
- jsr print_fix_char_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- pea #38 ;word - number of characters to print
- _TextWriteBlock
- lda #3
- ldx @omf+`]2
- jsr print_fix_char_dec
- put_cr
- eom
-
-
-**************************************************
-* print OMF header.                              *
-**************************************************
-print_header ent
-]segname_handle = $20 ;handle of @omf+`segname
-]segname_ptr = $24
-]count = $28 ;number of bytes in header
-]edge = $2c ;rightmost edge
-]num_read = $2e ;number of characters read
-]offset = $30 ;current offset into file
-
- lda }hex ;print hex of header?
- bne :test_header
- brl :print_header
-:test_header lda }header
- bne :hex_header
- brl :print_header
-
-:hex_header jsr GSOSget_mark
- phx
- phy
- sec
- tya
- sbc @omf+`offset
- sta ]count
- txa
- sbc @omf+`offset+2
- sta ]count+2
-
- ldx @omf+`offset
- ldy @omf+`offset+2
- stx ]offset
- sty ]offset+2
- tya
- ora ]offset
- beq :set_mark
- put_cr
-
-:set_mark ldy @omf+`offset ;reset file pointer to beginning
- ldx @omf+`offset+2 ;of header
- jsr GSOSset_mark
-
- lda #HEADER_EDGE
- sta ]edge
-
-:loop lda #6
- ldx ]offset
- ldy ]offset+2
- jsr print_fix_long_hex
- pea #^vert_separator+1
- pea #vert_separator+1
- _WriteCString
-
- lda ]count+2 ;if number of bytes to read is less
- bne :0 ;than the default, output only
- lda ]count ;default many bytes
- cmp ]edge
- blt :1
-:0 lda ]edge ;read in default number of characters
-:1 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 #^:horz_separator
- pea #:horz_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;]offset
-
- lda ]count
- ora ]count+2
- beq :end
- brl :loop
-
-:end ply
- plx
- jsr GSOSset_mark
- rts
-
-:print_header lda @omf+`version
- cmp #1
- bne :omf_2
- pea #^:block_count
- pea #:block_count
- _WriteCString
- bra :2
-:omf_2 pea #^:byte_count
- pea #:byte_count
- _WriteCString
-:2 lda #8
- ldx @omf+`bytecnt
- ldy @omf+`bytecnt+2
- jsr print_fix_long_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- pea #25 ;word - number of characters to print
- _TextWriteBlock
- lda #10
- ldx @omf+`bytecnt
- ldy @omf+`bytecnt+2
- jsr print_fix_long_dec
- put_cr
-
- long_header :reserved_space;resspc
- long_header :length;length
- char_header :label_length;lablen
- char_header :number_length;numlen
- char_header :version;version
-
- lda @omf+`revision
- bne :print_revision
- brl :print_bank_size
-:print_revision char_header :revision;revision
-:print_bank_size long_header :bank_size;banksize
-
- lda @omf+`version
- cmp #1
- bne :print_kind_2
- jsr print_kind_1
- bra :3
-:print_kind_2 jsr print_kind_2
-
-:3 long_header :org;org
- long_header :alignment;align
- char_header :number_sex;numsex
- short_header :segment_number;segnum
- long_header :entry;entry
- short_header :disp_to_names;dispname
- short_header :disp_to_data;dispdata
-
- pea #^:load_name
- pea #:load_name
- _WriteCString
- pea #^@omf+`loadname ;long - pointer to string
- pea #@omf+`loadname
- pea #0 ;word - offset into text
- pea #LOADNAME_LEN ;word - number of characters to print
- _TextWriteBlock
- put_cr
-
- 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
- pea #^:segment_name
- pea #:segment_name
- _WriteCString
- pei ]segname_ptr+2 ;long - pointer to string
- pei ]segname_ptr
- pea #2 ;word - offset into text
- lda []segname_ptr] ;word - number of characters to print
- pha
- _TextWriteBlock
- put_cr
- _HUnlock
-
- put_cr
- rts
-
-:byte_count cStr 'byte count    : 



-:block_count cStr 'block count   : 



-:reserved_space cStr 'reserved space: 



-:length cStr 'length        : 



-:label_length cStr 'label length  : 



-:number_length cStr 'number length : 



-:version cStr 'version       : 



-:revision cStr 'revision      : 



-:bank_size cStr 'bank size     : 



-:org cStr 'org           : 



-:alignment cStr 'alignment     : 



-:number_sex cStr 'number sex    : 



-:segment_number cStr 'segment number: 



-:entry cStr 'entry         : 



-:disp_to_names cStr 'disp to names : 



-:disp_to_data cStr 'disp to data  : 



-:load_name cStr 'load name     : '
-:segment_name cStr 'segment name  : '
-:horz_separator cStr '- '
-:hex ds HEADER_EDGE+6
-
-
-**************************************************
-* print kind string for OMF 1.0.                 *
-**************************************************
-print_kind_1 equ *
-]space = $80
-]kind_str = $82
-
- jsr parse_kind_1
- lda kind_str
- cmp #32
- bge :0
- pea #^:kind
- pea #:kind
- _WriteCString
- ldx @omf+`kind
- jsr print_fix_char_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- sec ;word - number of characters to print
- lda #41
- sbc kind_str
- pha
- _TextWriteBlock
- pea #^kind_str ;long - pointer to string
- pea #kind_str
- pea #2 ;word - offset into text
- lda kind_str ;word - number of characters to print
- pha
- _TextWriteBlock
- put_cr
- rts
-
-:0 lda #kind_str+2
- sta ]kind_str
-:loop lda #' ' ;find next occurrence of space
- ldx ]kind_str ;character
- jsr strchr
- stx ]space
- bne :1
- clc
- lda #kind_str
- adc kind_str
- sta ]space
-:1 sec
- lda ]space
- sbc #kind_str+2
- cmp #32
- bge :2
- brl :3
-:2 pea #^:kind
- pea #:kind
- _WriteCString
- ldx @omf+`kind
- jsr print_fix_char_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- sec ;word - number of characters to print
- lda ]kind_str
- sbc #kind_str+2
- dec
- pha
- sec
- lda #41
- sbc 1,s
- sta 1,s
- _TextWriteBlock
- pea #^kind_str ;long - pointer to string
- pea #kind_str
- pea #2 ;word - offset into text
- sec ;word - number of characters to print
- lda ]kind_str
- sbc #kind_str+2
- dec
- pha
- _TextWriteBlock
- put_cr
- bra :4
-:3 lda ]space
- inc
- sta ]kind_str
- brl :loop
-
-:4 pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- clc ;word - number of characters to print
- lda #kind_str+2
- adc kind_str
- sec
- sbc ]kind_str
- pha
- sec
- lda #60
- sbc 1,s
- sta 1,s
- _TextWriteBlock
- phb ;long - pointer to string
- phb
- pla
- and #$ff
- pha
- pei ]kind_str
- _WriteCString
- put_cr
- rts
-
-:kind cStr 'kind          : 



-
-
-**************************************************
-* print kind string for OMF 2.0.                 *
-**************************************************
-print_kind_2 equ *
-]space = $80
-]kind_str = $82
-
- jsr parse_kind_2
- lda kind_str
- cmp #30
- bge :0
- pea #^:kind
- pea #:kind
- _WriteCString
- lda #4
- ldx @omf+`kind
- jsr print_fix_short_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- sec ;word - number of characters to print
- lda #39
- sbc kind_str
- pha
- _TextWriteBlock
- pea #^kind_str ;long - pointer to string
- pea #kind_str
- pea #2 ;word - offset into text
- lda kind_str ;word - number of characters to print
- pha
- _TextWriteBlock
- put_cr
- rts
-
-:0 lda #kind_str+2
- sta ]kind_str
-:loop lda #' ' ;find next occurrence of space
- ldx ]kind_str ;character
- jsr strchr
- stx ]space
- bne :1
- clc
- lda #kind_str+2
- adc kind_str
- sta ]space
-:1 sec
- lda ]space
- sbc #kind_str+2
- cmp #30
- bge :2
- brl :3
-:2 pea #^:kind
- pea #:kind
- _WriteCString
- lda #4
- ldx @omf+`kind
- jsr print_fix_short_hex
- pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- sec ;word - number of characters to print
- lda ]kind_str
- sbc #kind_str+2
- dec
- pha
- sec
- lda #39
- sbc 1,s
- sta 1,s
- _TextWriteBlock
- pea #^kind_str ;long - pointer to string
- pea #kind_str
- pea #2 ;word - offset into text
- sec ;word - number of characters to print
- lda ]kind_str
- sbc #kind_str+2
- dec
- pha
- _TextWriteBlock
- put_cr
- bra :4
-:3 lda ]space
- inc
- sta ]kind_str
- brl :loop
-
-:4 pea #^blank_str ;long - pointer to string
- pea #blank_str
- pea #0 ;word - offset into text
- clc ;word - number of characters to print
- lda #kind_str+2
- adc kind_str
- sec
- sbc ]kind_str
- pha
- sec
- lda #60
- sbc 1,s
- sta 1,s
- _TextWriteBlock
- phb ;long - pointer to string
- phb
- pla
- and #$ff
- pha
- pei ]kind_str
- _WriteCString
- put_cr
- rts
-
-:kind cStr 'kind          : 



-
-
-**************************************************
-* convert kind value to string equivalents for   *
-* OMF 1.0.                                       *
-**************************************************
-parse_kind_1 equ *
-
- stz kind_str ;0 length of string
- lda @omf+`kind
- and #DYNAMIC
- beq :static
- ldx #dynamic
- jsr append_kind_str
- bra :0
-:static ldx #static
- jsr append_kind_str
-
-:0 ldx #0
-:loop lda @omf+`kind
- asl
- asl
- asl
- asl
- asl
- asl
- asl
- asl
- phx
- and :type,x
- cmp #POSITION_INDEPENDENT
- bne :private
- ldx #position_independent
- jsr append_kind_str
- bra :end_loop
-:private cmp #PRIVATE
- bne :end_loop
- ldx #private
- jsr append_kind_str
-:end_loop plx
- inx
- inx
- cpx #4
- blt :loop
-
- lda @omf+`kind
- and #$1f
-:check_code cmp #CODE
- bne :data
- ldx #code
- jsr append_kind_str
- rts
-:data cmp #DATA
- bne :jump_table
- ldx #data
- jsr append_kind_str
- rts
-:jump_table cmp #JUMP_TABLE
- bne :pathname
- ldx #jump_table
- jsr append_kind_str
- rts
-:pathname cmp #PATHNAME
- bne :library_dictionary
- ldx #pathname
- jsr append_kind_str
- rts
-:library_dictionary cmp #LIBRARY_DICTIONARY
- bne :initialization
- ldx #library_dictionary
- jsr append_kind_str
- rts
-:initialization cmp #INITIALIZATION
- bne :absolute_bank_seg
- ldx #initialization
- jsr append_kind_str
- rts
-:absolute_bank_seg cmp #ABSOLUTE_BANK_SEG
- bne :direct_page
- ldx #absolute_bank
- jsr append_kind_str
- rts
-:direct_page cmp #DIRECT_PAGE
- bne :end
- ldx #dp_stack
- jsr append_kind_str
-:end rts
-
-:type dw POSITION_INDEPENDENT
- dw PRIVATE
-
-
-**************************************************
-* convert kind value to string equivalents for   *
-* OMF 2.0.                                       *
-**************************************************
-parse_kind_2 equ *
-
- stz kind_str ;0 length of string
- lda @omf+`kind
- and #DYNAMIC
- beq :static
- ldx #dynamic
- jsr append_kind_str
- bra :0
-:static ldx #static
- jsr append_kind_str
-
-:0 ldx #0
-:loop lda @omf+`kind
- phx
- and :type,x
- cmp #BANK_RELATIVE
- bne :skip
- ldx #bank_relative
- jsr append_kind_str
- bra :end_loop
-:skip cmp #SKIP
- bne :reload
- ldx #skip
- jsr append_kind_str
- bra :end_loop
-:reload cmp #RELOAD
- bne :absolute_bank
- ldx #reload
- jsr append_kind_str
- bra :end_loop
-:absolute_bank cmp #ABSOLUTE_BANK
- bne :position_independent
- ldx #absolute_bank
- jsr append_kind_str
- bra :end_loop
-:position_independent cmp #POSITION_INDEPENDENT
- bne :private
- ldx #position_independent
- jsr append_kind_str
- bra :end_loop
-:private cmp #PRIVATE
- bne :end_loop
- ldx #private
- jsr append_kind_str
-:end_loop plx
- inx
- inx
- cpx #12
- blt :loop
-
- lda @omf+`kind
- and #$1f
-:check_code cmp #CODE
- bne :data
- ldx #code
- jsr append_kind_str
- rts
-:data cmp #DATA
- bne :jump_table
- ldx #data
- jsr append_kind_str
- rts
-:jump_table cmp #JUMP_TABLE
- bne :pathname
- ldx #jump_table
- jsr append_kind_str
- rts
-:pathname cmp #PATHNAME
- bne :library_dictionary
- ldx #pathname
- jsr append_kind_str
- rts
-:library_dictionary cmp #LIBRARY_DICTIONARY
- bne :initialization
- ldx #library_dictionary
- jsr append_kind_str
- rts
-:initialization cmp #INITIALIZATION
- bne :absolute_bank_seg
- ldx #initialization
- jsr append_kind_str
- rts
-:absolute_bank_seg cmp #ABSOLUTE_BANK_SEG
- bne :direct_page
- ldx #absolute_bank
- jsr append_kind_str
- rts
-:direct_page cmp #DIRECT_PAGE
- bne :end
- ldx #dp_stack
- jsr append_kind_str
-:end rts
-
-:type dw PRIVATE
- dw POSITION_INDEPENDENT
- dw ABSOLUTE_BANK
- dw RELOAD
- dw SKIP
- dw BANK_RELATIVE
-
-
-**************************************************
-* output expression list stack as infix          *
-* expression.                                    *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - offset into current line.                 *
-* (output)                                       *
-*  x - offset into current line.                 *
-**************************************************
-print_stack_infix ent
-]offset = $d0 ;offset into line
-]btree_ptr = $d2 ;pointer to binary tree
-]size = $d4 ;size of stack
-]list_lo_handle = $d6 ;handle to @expr_list stack
-]list_lo_ptr = $da
-]list_hi_handle = $de
-]list_hi_ptr = $e2
-]list_offset = $e6 ;offset into @expr_list for current expression
-]element_handle = $e8 ;current list element
-]element_ptr = $ec
-]count = $f0
-
- stx ]offset
-
- ldx @expr_list+`lo
- ldy @expr_list+`lo+2
- stx ]list_lo_handle
- sty ]list_lo_handle+2
- phy
- phx
- phy
- phx
- _HLock
- ldx @expr_list+`hi
- ldy @expr_list+`hi+2
- stx ]list_hi_handle
- sty ]list_hi_handle+2
- phy
- phx
- phy
- phx
- _HLock
- lda []list_lo_handle]
- sta ]list_lo_ptr
- ldy #2
- lda []list_lo_handle],y
- sta ]list_lo_ptr+2
- lda []list_hi_handle]
- sta ]list_hi_ptr
- ldy #2
- lda []list_hi_handle],y
- sta ]list_hi_ptr+2
- stz ]list_offset
- stz ]size
- stz ]count
-
-:loop lda ]list_offset
- asl
- tay
- lda []list_lo_ptr],y
- sta ]element_handle
- lda []list_hi_ptr],y
- sta ]element_handle+2
- lda []element_handle]
- sta ]element_ptr
- ldy #2
- lda []element_handle],y
- sta ]element_ptr+2
-
- lda ]size
- asl
- tay
- lda ]count
- asl
- tax
- lda @btree+`ptr,x
- sta ]btree_ptr
- sta :order,y
-
- ldy #`str ;store handle to expression string
- lda ]element_handle
- sta (]btree_ptr),y
- ldy #`str+2
- lda ]element_handle+2
- sta (]btree_ptr),y
- ldy #`left
- lda #NULL
- sta (]btree_ptr),y
- ldy #`oper ;store operation code
- lda []element_ptr]
- sta (]btree_ptr),y
- beq :string
- cmp #LABEL_LENGTH
- beq :string
- tax
- lda #NULL ;zero out string (won't be used)
- ldy #`str
- sta (]btree_ptr),y
- ldy #`str+2
- sta (]btree_ptr),y
- dec ]size ;make right node last known expression
- lda ]size
- asl
- tay
- lda :order,y
- ldy #`right
- sta (]btree_ptr),y
- cpx #NEGATION ;special case unary operators
- beq :update_order
- cpx #NOT
- beq :update_order
- cpx #COMPLEMENT
- beq :update_order
- cpx #LABEL_LENGTH
- beq :update_order
- dec ]size ;make left node second last known
- lda ]size ;expression
- asl
- tay
- lda :order,y
- ldy #`left
- sta (]btree_ptr),y
- bra :update_order
-:string lda #NULL
- ldy #`right
- sta (]btree_ptr),y
- ldy #`left
- sta (]btree_ptr),y
-
-:update_order lda ]size
- asl
- tax
- lda ]btree_ptr
- sta :order,x
- inc ]size
- inc ]count
- inc ]list_offset
- lda ]list_offset
- cmp @expr_list+`size
- beq :print_offset
- brl :loop
-
-:print_offset _HUnlock
- _HUnlock
- lda }assembly
- bne :print_inorder
- jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
-
-:print_inorder pei ]btree_ptr
- pei ]offset
- ldy #`oper
- lda (]btree_ptr),y
- beq :0
- cmp #LABEL_LENGTH
- beq :0
- asl
- asl
- tax
- lda ~operator+`prec,x
- inc
-:0 pha
- jsr print_inorder
- stx ]offset
- cpx #0
- beq :end
- lda }assembly
- bne :end
- put_cr
-
-:end ldx ]offset
- rts
-
-:order ds 50*2 ;order in which trees are allocated
-
-
-**************************************************
-* print binary tree 'inorder'.                   *
-* ---------------------------------------------- *
-* (input)                                        *
-*  word - pointer to binary tree.                *
-*  word - offset into line.                      *
-*  word - operator precedence.                   *
-* (output)                                       *
-*  x - current offset into line.                 *
-**************************************************
-print_inorder equ *
-]oper = $01 ;operator
-]oper_str = ]oper+2 ;string representation of operator
-]expr_str = ]oper_str+4 ;expression string
-]db = ]expr_str+4
-]dp = ]db+1
-]rts = ]dp+1
-]precedence = ]rts+2 ;operator precedence
-]offset = ]precedence+2 ;current offset into line
-]btree_ptr = ]offset+2 ;pointer to binary tree
-
- phd ;save direct page
- tdc ;save copy of dp for calls that access
- sta :dp ;dp space in coff
-
- sec
- tsc
- sbc #]dp-2 ;make local dp space
- tcs
- tcd
-
- lda ]btree_ptr
- bne :print
- ldx ]offset
-
-:end lda ]rts,s ;move return address to position
- sta ]btree_ptr,s ;of last parameter
-
- clc
- tsc
- adc #]dp-2
- tcs
-
- pld
-
- clc
- tsc
- adc #]btree_ptr-]rts
- tcs
- rts
-
-
-:print ldy #`str ;if no string for expression,
- lda (]btree_ptr),y ;parse operator token
- sta ]oper_str
- ldy #`str+2
- lda (]btree_ptr),y
- sta ]oper_str+2
- ora ]oper_str
- bne :print_str
- brl :operator
-
-:print_str pei ]oper_str+2 ;output string representation of
- pei ]oper_str ;expression
- pei ]oper_str+2
- pei ]oper_str
- _HLock
- ldy #2
- lda []oper_str],y
- tay
- lda []oper_str]
- sta ]oper_str
- tax
- inx
- inx
- sty ]oper_str+2
-
- phd
- lda :dp
- tcd
- jsr match_label
- pld
- stx ]expr_str
- sty ]expr_str+2
- txa
- ora ]expr_str+2
- beq :0
- lda }label
- bne :1
-:0 ldx ]oper_str
- inx
- inx
- ldy ]oper_str+2
- stx ]expr_str
- sty ]expr_str+2
-:1 ldx #0
- lda []oper_str]  ;update offset into line by length
- pha
- cmp #LABEL_LENGTH
- bne :2
- ldx #9
-:2 clc
- txa
- adc []expr_str] ;of string to print
- adc ]offset
- sta ]offset
- tax
- phd
- lda :dp
- tcd
- jsr newline
- pld
- stx ]offset
- pla
- cmp #LABEL_LENGTH
- bne :3
- pea #^:length
- pea #:length
- _WriteCString
- pei ]expr_str+2 ;output expression string
- pei ]expr_str
- pea #2
- lda []expr_str]
- pha
- _TextWriteBlock
- pea #')'
- _WriteChar
- bra :4
-:3 pei ]expr_str+2 ;output expression string
- pei ]expr_str
- pea #2
- lda []expr_str]
- pha
- _TextWriteBlock
-:4 lda ]offset
- bne :unlock
- lda []expr_str]
- sta ]offset
-
-:unlock _HUnlock
- ldx ]offset
- brl :end
-
-:operator ldy #`oper ;minimize output of parentheses
- lda (]btree_ptr),y ;in expressions by considering
- sta ]oper ;precedence of operators
- asl
- asl
- tax
- lda ]precedence
- cmp ~operator+`prec,x
- blt :5
- bne :6
- lda #LEFT
- cmp ~operator+`assoc,x
- bne :6
-:5 pea #'('
- _WriteChar
- inc ]offset
-:6 ldy #`left
- lda (]btree_ptr),y
- pha
- pei ]offset
- lda ]oper
- asl
- asl
- tax
- lda ~operator+`prec,x
- pha
- jsr print_inorder
- stx ]offset
-
- lda ]oper
- jsr find_operator ;uses no dp space
- stx ]oper_str+2
- sty ]oper_str
-
- clc ;test if at right margin
- lda []oper_str]
- adc ]offset
- adc #2
- sta ]offset
- tax
- phd
- lda :dp
- tcd
- jsr newline
- pld
- stx ]offset
- cpx #0 ;if at left margin, don't prepend space
- beq :7 ;to separate operator from expression
- cpx #3
- beq :7
- pea #' '
- _WriteChar
-:7 pei ]oper_str+2
- pei ]oper_str
- pea #2
- lda []oper_str]
- pha
- _TextWriteBlock
- ldx ]oper ;don't append space to unary operators
- cpx #NEGATION ;special case unary operators
- beq :8
- cpx #NOT
- beq :8
- cpx #COMPLEMENT
- beq :8
- pea #' '
- _WriteChar
-:8 lda ]offset
- bne :9
- lda []oper_str]
- sta ]offset
-
-:9 ldy #`right
- lda (]btree_ptr),y
- pha
- pei ]offset
- lda ]oper
- asl
- asl
- tax
- lda ~operator+`prec,x
- pha
- jsr print_inorder
- stx ]offset
-
- lda ]oper
- asl
- asl
- tax
- lda ]precedence
- cmp ~operator+`prec,x
- blt :10
- bne :11
- lda #LEFT
- cmp ~operator+`assoc,x
- bne :11
-:10 pea #')'
- _WriteChar
- inc ]offset
-
-:11 ldx ]offset
- brl :end
-
-:dp dw 0 ;direct page register
-:length cStr 'length ('
-
-
-**************************************************
-* check to output newline in current expression  *
-* output.                                        *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - offset into line.                         *
-* (output)                                       *
-*  x - offset into line.                         *
-**************************************************
-newline equ *
-]offset = $f0
-]edge = $f2
-
- stx ]offset
-
- lda #0
- ldx }nooffset
- beq :0
- lda #16
-:0 clc
- adc #INFIX_EDGE
- sta ]edge
-
- lda ]edge ;if past right boundary for
- cmp ]offset ;INFIX expressions, move to next
- bge :end ;line and output rest of
- put_cr ;expression
- jsr print_offset
- stz ]offset
- lda }assembly
- beq :1
- pea #^blank_str ;19 blank spaces indents assembly
- pea #blank_str ;output
- pea #0
- pea #19
- _TextWriteBlock
- bra :end
-:1 pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
-
-:end ldx ]offset
- rts
-
-
-**************************************************
-* output expression list stack as postfix        *
-* expression.                                    *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - offset into line.                         *
-* (output)                                       *
-*  x - offset into line.                         *
-**************************************************
-print_stack_postfix ent
-]offset = $d0 ;offset into line
-]edge = $d2
-]list_lo_handle = $d4
-]list_hi_handle = $d8
-]list_lo_ptr = $dc
-]list_hi_ptr = $e0
-]list_offset = $e4 ;offset into @expr_list for current expression
-]list = $e6 ;current list element
-]expr_str = $ea ;expression string
-
- stx ]offset
- stz ]list_offset
-
- ldx @expr_list+`lo
- ldy @expr_list+`lo+2
- stx ]list_lo_handle
- sty ]list_lo_handle+2
- phy
- phx
- phy
- phx
- _HLock
- ldx @expr_list+`hi
- ldy @expr_list+`hi+2
- stx ]list_hi_handle
- sty ]list_hi_handle+2
- phy
- phx
- phy
- phx
- _HLock
- lda []list_lo_handle]
- sta ]list_lo_ptr
- ldy #2
- lda []list_lo_handle],y
- sta ]list_lo_ptr+2
- lda []list_hi_handle]
- sta ]list_hi_ptr
- ldy #2
- lda []list_hi_handle],y
- sta ]list_hi_ptr+2
-
- lda #0
- ldx }nooffset
- beq :0
- lda #16
-:0 clc
- adc #POSTFIX_EDGE
- sta ]edge
-
- lda }assembly
- bne :loop
- jsr print_offset
- pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
-
-:loop lda ]list_offset
- cmp @expr_list+`size
- bne :print_postfix
- brl :end
-:print_postfix lda ]list_offset
- asl
- tay
- lda []list_lo_ptr],y
- sta ]list
- lda []list_hi_ptr],y
- sta ]list+2
- ldy #2
- lda []list],y
- tay
- lda []list]
- sta ]list
- tax
- sty ]list+2
-
- lda []list]
- bne :find_operator
- inx
- inx
- jsr match_label
- stx ]expr_str
- sty ]expr_str+2
- txa
- ora ]expr_str+2
- beq :1
- lda }label
- bne :print_expr
-:1 ldx ]list
- inx
- inx
- ldy ]list+2
- stx ]expr_str
- sty ]expr_str+2
- bra :print_expr
-:find_operator jsr find_operator
- stx ]expr_str+2
- sty ]expr_str
-
-:print_expr clc
- lda ]offset
- adc []expr_str]
- sta ]offset
- pei ]expr_str+2
- pei ]expr_str
- pea #2
- lda []expr_str]
- pha
- _TextWriteBlock
- lda []list] ;special case EXPR sub-type $84 (label length)
- cmp #LABEL_LENGTH
- bne :2
- pei ]list+2
- pei ]list
- pea #4
- clc
- ldy #2
- lda []list],y
- pha
- adc ]offset
- inc
- sta ]offset
- _TextWriteBlock
- pea #')'
- _WriteChar
-
-:2 inc ]list_offset
- lda ]list_offset
- cmp @expr_list+`size
- beq :end
- lda ]offset
- cmp ]edge
- bge :end_print
- pea #' '
- _WriteChar
- inc ]offset
-:end_print lda ]offset
- dec
- cmp ]edge
- bge :3
- brl :print_postfix
-
-:3 put_cr
- lda }nooffset
- bne :4
- jsr print_offset
-:4 lda }assembly
- beq :5
- pea #^:vert_separator
- pea #:vert_separator
- _WriteCString
- bra :6
-:5 pea #^space_vert_bar
- pea #space_vert_bar
- _WriteCString
-:6 stz ]offset
- brl :loop
-
-:end _HUnlock
- _HUnlock
- lda }assembly
- bne :return
- put_cr
-:return ldx ]offset
- rts
-
-:vert_separator cStr '                   |'
-
-
-**************************************************
-* append string to kind_str.                     *
-* ---------------------------------------------- *
-* (input)                                        *
-*  x - LOW of string in current bank.            *
-**************************************************
-append_kind_str equ *
-]append_str = $f0 ;address of C-string to append
-
- stx ]append_str
-
- ldy #0
- ldx kind_str
- shorta
-:loop lda (]append_str),y
- sta kind_str+2,x
- iny
- inx
- cmp #0
- bne :loop
-:end longa
- dex
- stx kind_str ;update length of kind string
- rts
-
-
-**************************************************
-kind_str ds KIND_LEN+2
-
-code cStr ' code'
-data cStr ' data'
-jump_table cStr ' jump-table'
-pathname cStr ' pathname'
-library_dictionary cStr ' library-dictionary'
-initialization cStr ' initialization'
-absolute_bank cStr ' absolute-bank'
-dp_stack cStr ' direct-page/stack'
-
-bank_relative cStr ' bank-relative'
-skip cStr ' skip'
-reload cStr ' reload'
-position_independent cStr ' position-independent'
-private cStr ' private'
-
-dynamic cStr 'dynamic'
-static cStr 'static'
-
-
-**************************************************
- sav output.l
+ END OF ARCHIVE