Subject: v001SRC068: coff (OMF Disassembler) 03/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:68 Archive-name: utility/gs/disassem/coff/part03 Architecture: ONLY_2gs Version-number: 1.1 =coff.s - lst off - -* UNIX coff utility -* startup code -* -* 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 x.omf ;OMF parser 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/getopt.h ;getopt command-line option defines - put 4/env.h ;run-time environment settings - put 4/signal.h ;signal defines - - use coff.mac ;macro definitions - use 4/datatype.mac ;HLL data types - use 4/env.mac ;run-time environment macros - use 4/signal.mac ;signal macros - - -************************************************** -* start of program * -************************************************** - - phk ;program bank is data bank - plb - - jsr init_tool ;startup tools - jsr init_default ;init default values - do ENV&GNO_ENV - jsr init_signal ;setup signal handlers - fin - pea #0 ;flag indicating next address is return - jsr start ;address - jsr end_tool - - jsr GSOSclose ;close input file - - _GSOS Quit;@Quit - - -************************************************** -* startup tools * -************************************************** -init_tool equ * - - sta userID ;acc contains userID - stx command_line+2 ;save pointers to command-line - sty command_line - - lda userID - pha - _ResourceStartUp - rts - - -************************************************** -* initialize default values of variables. * -************************************************** -init_default equ * -]label_handle = $f0 ;handle to linked list of labels -]label_ptr = $f4 - - stz }version - stz }tool - stz }assembly - stz }shorta - stz }shorti - stz }label - stz }infix - stz }hex - stz }header - stz }noheader - stz }nooffset - stz }help - stz }compress - stz }exact - stz @omf+`library - stz segname_found - stz segname_found+2 - - lda #TRUE - sta }postfix ;output expressions in postfix form - sta }default_opt ;read in default options - - stz @omf+`offset ;zero offset into OMF file - stz @omf+`offset+2 - - stz @label+`label_name ;initialize @label linked list - stz @label+`label_name+2 - stz @label+`expr_name - stz @label+`expr_name+2 - stz @label+`type - stz @label+`next - stz @label+`next+2 - stz @label+`prev - stz @label+`prev+2 - stz @label+`last - stz @label+`last+2 - rts - - do ENV&GNO_ENV -************************************************** -* initialize signal handlers for GNO * -* environment. * -************************************************** -init_signal equ * - - signal SIGINT;stop_signal;:errno ;set up ctrl-c signal handler - rts - -:errno dw 0 ;signal call error number - -************************************************** -* ctrl-c signal handler. * -************************************************** -stop_signal equ * -]rtl = $01 -]signal_num = $04 -]code = $06 - - phk - plb - - jsr end_tool - jsr GSOSclose ;close input file - - _GSOS Quit;@Quit - rtl - fin - - -************************************************** -* end program * -************************************************** -end_tool equ * - - lda segname_found - tax - ora segname_found+2 - beq :0 - ldy segname_found+2 - phy - phx - _DisposeHandle - -:0 lda resourceID - pha - _CloseResourceFile - lda userID - pha ;word - user ID - _DisposeAll - _ResourceShutDown - rts - - -************************************************** -* parse command-line arguments. * -************************************************** -decode_switches equ * -]ret_value = $20 ;value returned by getopt -]longind = $22 ;index into long options -]long_option = $24 ;option currently examining -]argv_lo = $28 ;pointer to first argument in command-line -]argv_hi = $2c - -:get_options pha ;word - result - pea #^:cl_options ;longword - pointer to command-line - pea #:cl_options ; short options - pea #^~long_options ;longword - pointer to program long - pea #~long_options options - clc ;long - pointer to variable holding - tdc ; option index - adc #]longind - pea #0 - pha - jsl getopt_long - pla - cmp #EOF - beq :end - - sta ]ret_value - bne :test_opt - lda ]longind - asl - tax - lda ~long_options,x - sta ]long_option - ldy #`val - lda (]long_option),y - sta ]ret_value - -:test_opt lda ]ret_value - cmp #'D' - bne :default - stz }default_opt - bra :get_options -:default lda #]argv_lo - jsr dp_argv - lda []argv_lo] ;first argument on command-line is - tax ;program name - lda []argv_hi] - tay - lda ]ret_value - jsr set_option - bra :get_options - -:end rts - -:cl_options str 'vDdTxltpmoaisnfceh' ;command-line options - - -************************************************** -* return short-option of C-string based option * -* name (short/long). * -* ---------------------------------------------- * -* (input) * -* x - LOW of cstring. * -* y - HOW of cstring. * -* (output) * -* a - option value. * -************************************************** -get_option equ * -]option_str = $80 ;option string to search -]option_offset = $84 ;index into long-options -]option_struct = $86 ;pointer to individual long-option structures -]long_option_name = $88 ;long-option name -]option_name_len = $8a ;length of option name - - stx ]option_str - sty ]option_str+2 - stz ]option_offset - stz ]option_name_len - -:loop lda ]option_offset - asl - tax - lda ~long_options,x - sta ]option_struct - clc - adc #`name - sta ]long_option_name - shorta - lda (]long_option_name) - sta ]option_name_len - longa - beq :error ;error if at end of long-options - ldy #`val - lda (]option_struct),y - beq :2 - tax ;save short-option value - shorta ;if option string has short-option - ldy #1 ;as second character (i.e. '-x'), then - cmp []option_str],y ;test for '-' character; else test - bne :0 ;for long-option - lda []option_str] - cmp #'-' - bne :0 - longa - txa ;return short-option value - rts - -:0 ldy #1 - shorta -:1 lda (]long_option_name),y - cmp []option_str],y - bne :2 - iny - cpy ]option_name_len - blt :1 - beq :1 - longa - ldy #`val ;return short-option of default - lda (]option_struct),y ;long-option or short-option - rts -:2 longa - inc ]option_offset - bra :loop - -:error lda #ERROR - rts - - -************************************************** -* set command-line option. * -* ---------------------------------------------- * -* (input) * -* a - option to set. * -* x - LOW of program name ("coff"). * -* y - HOW of program name ("coff"). * -************************************************** -set_option equ * -]str_handle = $80 ;handle to string in resource fork -]str_ptr = $84 -]option = $88 ;option to set -]progname = $8a ;name of program - - sta ]option - stx ]progname - sty ]progname+2 - - ldx #TRUE ;set options -:version cmp #'v' ;test 'version' option - bne :asm - pha ;long - result - pha - pea #rText ;word - type of resource - pea #^VERSION ;long - ID Of resource - pea #VERSION - _LoadResource - plx - ply - stx ]str_handle - sty ]str_handle+2 - ldy #2 - lda []str_handle],y - pha - lda []str_handle] - pha - pei ]progname+2 - pei ]progname - _WriteCString - pea #' ' - _WriteChar - _WriteCString - rts -:asm cmp #'d' ;test 'asm' option - bne :tool - lda #MERLIN_16 - sta ~assembler - stx }assembly - stz }compress - rts -:tool cmp #'T' ;test 'tool' option - bne :hex - stx }tool - rts -:hex cmp #'x' ;test 'hex' option - bne :label - stx }hex - rts -:label cmp #'l' ;test 'label' option - bne :infix - stx }label - rts -:infix cmp #'t' ;test 'infix' option - bne :postfix - stx }infix - stz }postfix - rts -:postfix cmp #'p' ;test 'postfix' option - bne :merlin - stx }postfix - stz }infix - rts -:merlin cmp #'m' ;test 'merlin' option - bne :orca - lda #MERLIN_16 - sta ~assembler - stx }assembly - stz }compress - rts -:orca cmp #'o' ;test 'orca' option - bne :shorta - lda #ORCA_M - sta ~assembler - stx }assembly - stz }compress - rts -:shorta cmp #'a' ;test 'shorta' option - bne :shorti - stx }shorta - rts -:shorti cmp #'i' ;test 'shorti' option - bne :header - stx }shorti - rts -:header cmp #'s' ;test 'header' option - bne :noheader - stx }header - stz }noheader - rts -:noheader cmp #'n' ;test 'noheader' option - bne :nooffset - stx }noheader - stz }header - rts -:nooffset cmp #'f' ;test 'nooffset' option - bne :compress - stx }nooffset - rts -:compress cmp #'c' ;test 'compress' option - bne :exact - stx }compress - rts -:exact cmp #'e' ;test 'exact' option - bne :help - stx }exact - rts -:help cmp #'h' ;test 'help' option - bne :thanks - ldx ]progname - ldy ]progname+2 - jmp usage_verbose -:thanks cmp #1 ;test 'thanks' option - bne :default - pha ;long - result - pha - pea #rText ;word - type of resource - pea #^THANKS ;long - ID Of resource - pea #THANKS - _LoadResource - plx - ply - stx ]str_handle - sty ]str_handle+2 - ldy #2 - lda []str_handle],y - pha - lda []str_handle] - pha - _WriteCString - rts -:default ldx ]progname - ldy ]progname+2 - jmp usage - - -************************************************** -* read default options from resource fork. * -************************************************** -read_default equ * -]argv_lo = $20 ;pointer to first argument in command-line -]argv_hi = $24 -]default_handle = $28 ;handle to DEFAULT option text -]default_ptr = $2c -]option = $30 ;default short-option -]progname = $32 ;program name - - lda }default_opt ;end if not to read default options - bne :read_default - rts - -:read_default lda #]argv_lo - jsr dp_argv - lda []argv_lo] ;first argument on command-line is - tax ;program name - lda []argv_hi] - tay - stx ]progname - sty ]progname+2 - - pha ;long - result - pha - pea #rText ;word - type of resource - pea #^DEFAULT ;long - ID Of resource - pea #DEFAULT - _LoadResource - plx - ply - stx ]default_handle - sty ]default_handle+2 - phy - phx - phy - phx - _HLock - lda []default_handle] - sta ]default_ptr - ldy #2 - lda []default_handle],y - sta ]default_ptr+2 - - pha ;long - space for result - pha - pea #rText ;word - type of resource - pea #^DEFAULT ;long - ID of resource - pea #DEFAULT - _GetResourceSize - plx - pla - -:loop cpx #0 ;parse default options until no more - beq :end - phx -:0 ldx ]default_ptr - ldy ]default_ptr+2 - jsr get_option - sta ]option - cmp #ERROR - beq :1 - ldx ]progname - ldy ]progname+2 - jsr set_option -:1 plx - lda #0 - ldy #0 -:2 shorta - lda []default_ptr] - longa - dex - inc ]default_ptr - bne :3 - inc ]default_ptr+2 -:3 cmp #0 - bne :2 - bra :loop -:end _HUnlock - rts - - -************************************************** -* main entry point of coff. * -************************************************** -start equ * -]argv_lo = $00 ;pointer to first argument in -]argv_hi = $04 ;command-line -]seg_name = $08 ;display segment or loadsegments in file? -]filename = $0a ;offset into argv of OMF filename -]file_len = $0c ;length of OMF file -]omf_bytecnt = $10 ;temp @omf+`bytecnt -]segname_found = $14 ;pointer of handle 'name_found' -]invalid_name_msg = $18 ;if 'invalid name ...' message printed -]progname = $1a ;program name -]offset = $1e ;current offset into printing segment names not found - - plx - ply - phx - phy - - pha ;long - result - pha - lda userID ;word - userID to find - pha - pea #1 ;word - find current file - _LGetPathname2 - plx - ply - pha ;word - result - pea #readEnable ;word - file access - pea #NULL ;long - pointer to resource map - pea #NULL - phy - phx - _OpenResourceFile - pla - sta resourceID - - ldx command_line - ldy command_line+2 - lda userID - phy - phx - pha - jsl init_getopt ;init command-line arguments - jsr decode_switches ;interpret command-line arguments - lda optind - sta ]filename - cmp argc ;error if no filename given - bne :0 - lda #NO_FILENAME - ldx #0 - txy - jmp error - -:0 lda }default_opt - beq :1 - jsr read_default ;read in default options -:1 lda #]argv_lo - jsr dp_argv - lda optind ;open OMF file - asl - tay - lda []argv_lo],y - tax - lda []argv_hi],y - tay - jsr GSOSopen - bcc :2 - lda optind - asl - tay - lda []argv_lo],y - tax - lda []argv_hi],y - tay - lda #INVALID_FILENAME - jmp error - -:2 stx ]file_len - sty ]file_len+2 - inc optind ;point to next filename - stz ]seg_name ;default is no segment/loadsegment names - lda optind ;on command-line - cmp argc - beq :3 - sta ]seg_name - -:3 sec - lda argc - sbc optind - beq :4 - pha ;long - result - pha - lda argc - pea #0 ;long - block size - pha - lda userID ;word - user ID of block - pha - pea #attrNoSpec+attrFixed ;word - block attributes - pha ;long - start of block - pha - _NewHandle - plx - ply - stx segname_found - sty segname_found+2 - stx ]segname_found - sty ]segname_found+2 - ldy #2 - lda []segname_found],y - tax - lda []segname_found] - sta ]segname_found - stx ]segname_found+2 - shorta - ldy argc - lda #0 -:zero_segname dey - sta []segname_found],y - bne :zero_segname - longa - lda optind ;save optind value - sta []segname_found] - -:4 do ENV&{MERLIN_ENV.ORCA_ENV} - jsr test_key - fin - - ldx @omf+`offset+2 - ldy @omf+`offset - jsr GSOSset_mark ;move to segment in file to disassemble - bcc :read_header ;error means end of file - brl :end -:read_header ldx ]file_len - ldy ]file_len+2 - jsr read_header ;read header of OMF file - clc ;update displacement into OMF file - lda @omf+`offset - adc @omf+`dispdata - sta @omf+`displacement - lda @omf+`offset+2 - adc #0 - sta @omf+`displacement+2 - stz @omf+`counter ;initialize counter - stz @omf+`counter+2 - - lda ]seg_name - beq :5 - jsr parse_segname - lda optind ;if no more segments to parse, end - cmp argc - blt :6 - bra :end -:5 jsr parse_OMF - -:6 lda @omf+`version - cmp #1 - bne :inc_offset_2 ;update offset for OMF 2.0 - lda @omf+`library ;library files have byte offsets even - bne :inc_offset_2 ;though they might be OMF 1.0 -:inc_offset_1 lda @omf+`bytecnt - ldx @omf+`bytecnt+2 - stx ]omf_bytecnt+2 - asl ;each block is 512 bytes - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - asl - rol ]omf_bytecnt+2 - clc - adc @omf+`offset - tax - lda ]omf_bytecnt+2 - adc @omf+`offset+2 - bra :test_eof -:inc_offset_2 clc - lda @omf+`offset - adc @omf+`bytecnt - tax - lda @omf+`offset+2 - adc @omf+`bytecnt+2 -:test_eof sta @omf+`offset+2 - stx @omf+`offset - cmp ]file_len+2 - beq :8 - bge :end - brl :4 -:8 cpx ]file_len - bge :end - brl :4 - -:end lda segname_found - ora segname_found+2 - beq :11 - stz ]invalid_name_msg - lda []segname_found] - tay -:loop shorta -:9 lda []segname_found],y - beq :error - iny - cpy argc - bne :9 - longa -:10 lda ]invalid_name_msg - beq :11 - brl :15 -:11 pla - rts - -:error longa - phy - ldx ]invalid_name_msg - bne :12 - jsr get_progname - stx ]progname - sty ]progname+2 - sty ]invalid_name_msg - - phy ;long - pointer to C-string - phx - _WriteCString - pea #^:invalid_name - pea #:invalid_name - _WriteCString - lda #36 - sta ]offset - -:12 lda 1,s - asl - tay - lda []argv_lo],y ;get length of string - tax - lda []argv_hi],y - tay - phy - phx - jsr strlen - phy ;save length of string - clc - tya - adc ]offset - sta ]offset - cmp #INVALID_NAME_EDGE - blt :13 - put_cr - pei ]progname+2 - pei ]progname - _WriteCString - pea #':' - _WriteChar - pea #' ' - _WriteChar - lda 1,s - sta ]offset - -:13 pla - _WriteCString - ply - shorta -:14 iny - cpy argc - bge :15 - lda []segname_found],y - bne :14 - phy - longa - pea #',' - _WriteChar - pea #' ' - _WriteChar - inc ]offset - inc ]offset - ply - brl :loop - -:15 longa - put_cr - lda []argv_lo] ;first argument on command-line is - tax ;program name - lda []argv_hi] - tay - jmp usage - -:invalid_name cStr ': segment/loadsegment name not found: ' - - -************************************************** -* disassemble segment or loadsegment names on * -* command-line. * -************************************************** -parse_segname equ * -]name_found = $18 ;if segment or loadsegment name found -]argv_name = $1a -]segname = $1e -]segname_len = $22 ;length of segment name -]optind = $24 - - stz ]name_found ;default is false - - ldx @omf+`segname - ldy @omf+`segname+2 - stx ]segname - sty ]segname+2 - ldy #2 - lda []segname],y - tay - lda []segname] - sta ]segname - sty ]segname+2 - lda []segname] - sta ]segname_len - incr #2;]segname - - ldx optind -:loop txa - asl - tay - lda []argv_lo],y - sta ]argv_name - lda []argv_hi],y - sta ]argv_name+2 - - lda }exact ;compare command-line name against - beq :test_partial ;current segment name. must be -:test_exact shorta ;exact match. - ldy #0 -:segname_exact lda []argv_name],y - beq :0 - cmp []segname],y - bne :0 - iny - cpy ]segname_len - blt :segname_exact - lda []argv_name],y - beq :parse - -:0 ldy #0 ;compare command-line name against -:loadname_exact lda []argv_name],y ;current loadsegment name. must be - beq :next_argv ;exact match. - cmp @omf+`loadname,y - bne :next_argv - iny - cpy #LOADNAME_LEN - blt :loadname_exact - bra :parse - -:next_argv inx - cpx argc - blt :loop - longa - rts - -:test_partial shorta - ldy #0 -:segname_part lda []argv_name],y ;parse if at end of command-line - beq :parse ;name - cmp []segname],y - bne :1 - iny - cpy ]segname_len - blt :segname_part - lda []argv_name],y - beq :parse - -:1 ldy #0 -:loadname_part lda []argv_name],y - beq :parse - cmp @omf+`loadname,y - bne :next_argv - iny - cpy #LOADNAME_LEN - blt :loadname_part - bra :next_argv - -:parse txa - txy - sta []segname_found],y - longa - stx ]optind - lda }noheader ;display header? - bne :2 - jsr print_header -:2 lda }header ;display only headers? - bne :end - lda }assembly - bne :parse_segment - lda }hex - beq :parse_segment - jsr parse_segment_hex - bra :end -:parse_segment jsr parse_segment -:end lda optind - cmp ]optind - beq :3 - asl - tay - lda []argv_lo],y - tax - lda []argv_hi],y - pha - lda ]optind - asl - tay - pla - sta []argv_hi],y - txa - sta []argv_lo],y -:3 lda }exact - beq :rts - inc optind -:rts rts - - -************************************************** -* disassemble segment. * -************************************************** -parse_OMF equ * - - lda }noheader ;display header? - bne :0 - jsr print_header -:0 lda }header ;display only headers? - bne :end - lda }assembly - bne :parse_segment - lda }hex - beq :parse_segment - jsr parse_segment_hex - bra :end -:parse_segment jsr parse_segment -:end rts - - -************************************************** -startstop_rec adrl 0 ;reference to StartStop record -command_line adrl 0 ;pointer to command-line -segname_found adrl 0 ;if segment/loadsegment name found -resourceID dw 0 ;file ID of resource file - - -************************************************** - sav coff.l =data.s - lst off - -* UNIX coff utility -* variables -* -* 1990-1992, tao Developer Project - - rel - xc - xc - mx %00 - - put coff.h ;coff defines - put 4/getopt.h ;getopt command-line library definitions - - use coff.mac ;macro file - use 4/datatype.mac ;data-type definitions - use 4/getopt.mac - -* variables -* -coff ent - str 'coff' -userID ent ;userID returned by MMStartUp - dw 0 -long_hex_str ent ;string hex representation of long value -short_hex_str ent ;string hex representation of short value -char_hex_str ent ;string hex representation of char value -long_dec_str ent ;string decimal representation of long value -short_dec_str ent ;string decimal representation of short value -char_dec_str ent ;string decimal representation of char value - ds 11 -blank_str ent ;blank string - ds 80,' ' -vert_separator ent ;separate displacement/bytes - cStr ') | ' -space_vert_bar ent ;spaced vertical bar - cStr ' | ' -space_12 ent ;space between left edge and operand - cStr ' ' - -;assembly record names -DS_asm ent ;DS directive - cStr 'ds ' -GEQU_asm ent ;GEQU directive - cStr 'gequ ' -EQU_asm ent ;EQU directive - cStr 'equ ' -hex_asm ent ;merlin hex directive - cStr 'hex ' -db_asm ent ;merlin db directive - cStr 'db ' -dw_asm ent ;merlin dw directive - cStr 'dw ' -adr_asm ent ;merlin adr directive - cStr 'adr ' -adrl_asm ent ;merlin adrl directive - cStr 'adrl ' -dc_a_asm ent ;orca address directive - cStr 'dc a' -dc_h_asm ent ;orca hex directive - asc !dc h'!,00 -dc_i_asm ent ;orca integer directive - cStr 'dc i' -dc_d_asm ent ;orca double directive - asc !dc d'!,00 -dc_e_asm ent ;orca extended directive - asc !dc e'!,00 -dc_f_asm ent ;orca float directive - asc !dc f'!,00 - - -* boolean bariables -* -}version ent ;display version number - Boolean -}tool ent ;interpret ToolBox, GS/OS, ProDOS, ROM calls - Boolean -}assembly ent ;dump in asm format - Boolean -}label ent ;print expressions with labels, not offsets - Boolean -}infix ent ;display expressions in infix (default for +asm) - Boolean -}postfix ent ;display expressions in postfix (default) - Boolean -}hex ent ;nonzero means dump in hex format - Boolean -}header ent ;nonzero means dump - Boolean -}noheader ent ;nonzero does not display segment headers - Boolean -}nooffset ent ;nonzero means don't print offset into file - Boolean -}help ent ;nonzero means print switch descriptions - Boolean -}shorta ent ;8-bit accumulator - Boolean -}shorti ent ;8-bit index registers - Boolean -}compress ent ;compress OMF listing - Boolean -}exact ent ;match segment, loadsegment names exactly - Boolean -}default_opt ent ;disable default options - Boolean - -* constant variables -* -~assembler ent ;output code for which assembler - dw 0 ;00000001 - Merlin 16 -;00000010 - Orca/M -~error_msg ent ;error messages - dw :no_filename,:invalid_filename - dw :premature_end,:omf_version - dw :invalid_length,:more_data -:no_filename cStr 'object filename not specified' -:invalid_filename cStr 'error opening OMF file: ' -:premature_end cStr 'premature end of file' -:omf_version cStr 'OMF v1.0 and v2.0 supported. received: v' -:invalid_length cStr 'segment length must be less than 64k. received: $' -:more_data cStr 'data left in file but not enough to make sense of' - -;format of ~opcodes -;word - number of bytes opcode generates -;word - if 16-bit mode accumulator -;word - if 16-bit mode index register -;word - addressing mode -;string - opcode name -;cstring - operand format -~opcodes ent ;65816 opcodes - dw :00,:01,:02,:03,:04,:05,:06,:07,:08,:09,:0a - dw :0b,:0c,:0d,:0e,:0f,:10,:11,:12,:13,:14,:15 - dw :16,:17,:18,:19,:1a,:1b,:1c,:1d,:1e,:1f,:20 - dw :21,:22,:23,:24,:25,:26,:27,:28,:29,:2a,:2b - dw :2c,:2d,:2e,:2f,:30,:31,:32,:33,:34,:35,:36 - dw :37,:38,:39,:3a,:3b,:3c,:3d,:3e,:3f,:40,:41 - dw :42,:43,:44,:45,:46,:47,:48,:49,:4a,:4b,:4c - dw :4d,:4e,:4f,:50,:51,:52,:53,:54,:55,:56,:57 - dw :58,:59,:5a,:5b,:5c,:5d,:5e,:5f,:60,:61,:62 - dw :63,:64,:65,:66,:67,:68,:69,:6a,:6b,:6c,:6d - dw :6e,:6f,:70,:71,:72,:73,:74,:75,:76,:77,:78 - dw :79,:7a,:7b,:7c,:7d,:7e,:7f,:80,:81,:82,:83 - dw :84,:85,:86,:87,:88,:89,:8a,:8b,:8c,:8d,:8e - dw :8f,:90,:91,:92,:93,:94,:95,:96,:97,:98,:99 - dw :9a,:9b,:9c,:9d,:9e,:9f,:a0,:a1,:a2,:a3,:a4 - dw :a5,:a6,:a7,:a8,:a9,:aa,:ab,:ac,:ad,:ae,:af - dw :b0,:b1,:b2,:b3,:b4,:b5,:b6,:b7,:b8,:b9,:ba - dw :bb,:bc,:bd,:be,:bf,:c0,:c1,:c2,:c3,:c4,:c5 - dw :c6,:c7,:c8,:c9,:ca,:cb,:cc,:cd,:ce,:cf,:d0 - dw :d1,:d2,:d3,:d4,:d5,:d6,:d7,:d8,:d9,:da,:db - dw :dc,:dd,:de,:df,:e0,:e1,:e2,:e3,:e4,:e5,:e6 - dw :e7,:e8,:e9,:ea,:eb,:ec,:ed,:ee,:ef,:f0,:f1 - dw :f2,:f3,:f4,:f5,:f6,:f7,:f8,:f9,:fa,:fb,:fc - dw :fd,:fe,:ff -:00 stack_interrupt 'brk' ;$00 -:01 dp_index_indirect_x 'ora' ;$01 -:02 stack_interrupt 'cop' ;$02 -:03 sr 'ora' ;$03 -:04 dp 'tsb' ;$04 -:05 dp 'ora' ;$05 -:06 dp 'asl' ;$06 -:07 dp_indirect_long 'ora' ;$07 -:08 stack_push 'php' ;$08 -:09 immediate_m 'ora' ;$09 -:0a accumulator 'asl' ;$0a -:0b stack_push 'phd' ;$0b -:0c absolute 'tsb' ;$0c -:0d absolute 'ora' ;$0d -:0e absolute 'asl' ;$0e -:0f absolute_long 'asl' ;$0f -:10 pc_relative 'bpl' ;$10 -:11 dp_indirect_index_y 'ora' ;$11 -:12 dp_indirect 'ora' ;$12 -:13 sr_indirect_index_y 'ora' ;$13 -:14 dp 'trb' ;$14 -:15 dp_index_x 'ora' ;$15 -:16 dp_index_x 'asl' ;$16 -:17 dp_indirect_long_index_y 'ora' ;$17 -:18 implied 'clc' ;$18 -:19 absolute_index_y 'ora' ;$19 -:1a accumulator 'inc' ;$1a -:1b implied 'tcs' ;$1b -:1c absolute 'trb' ;$1c -:1d absolute_index_x 'ora' ;$1d -:1e absolute_index_x 'asl' ;$1e -:1f absolute_long_index_x 'ora' ;$1f -:20 absolute 'jsr' ;$20 -:21 dp_index_indirect_x 'and' ;$21 -:22 absolute_long 'jsl' ;$22 -:23 sr 'and' ;$23 -:24 dp 'bit' ;$24 -:25 dp 'and' ;$25 -:26 dp 'rol' ;$26 -:27 dp_indirect_long 'and' ;$27 -:28 stack_pull 'plp' ;$28 -:29 immediate_m 'and' ;$29 -:2a accumulator 'rol' ;$2a -:2b stack_pull 'pld' ;$2b -:2c absolute 'bit' ;$2c -:2d absolute 'and' ;$2d -:2e absolute 'rol' ;$2e -:2f absolute_long 'and' ;$2f -:30 pc_relative 'bmi' ;$30 -:31 dp_indirect_index_y 'and' ;$31 -:32 dp_indirect 'and' ;$32 -:33 sr_indirect_index_y 'and' ;$33 -:34 dp_index_x 'bit' ;$34 -:35 dp_index_x 'and' ;$35 -:36 dp_index_x 'rol' ;$36 -:37 dp_indirect_long_index_y 'and' ;$37 -:38 implied 'sec' ;$38 -:39 absolute_index_y 'and' ;$39 -:3a accumulator 'dec' ;$3a -:3b implied 'tsc' ;$3b -:3c absolute_index_x 'bit' ;$3c -:3d absolute_index_x 'and' ;$3d -:3e absolute_index_x 'rol' ;$3e -:3f absolute_long_index_x 'and' ;$3f -:40 stack_rti 'rti' ;$40 -:41 dp_index_indirect_x 'eor' ;$41 -:42 wdm_ 'wdm' ;$42 -:43 sr 'eor' ;$43 -:44 block_move 'mvp' ;$44 -:45 dp 'eor' ;$45 -:46 dp 'lsr' ;$46 -:47 dp_indirect_long 'eor' ;$47 -:48 stack_push 'pha' ;$48 -:49 immediate_m 'eor' ;$49 -:4a accumulator 'lsr' ;$4a -:4b stack_push 'phk' ;$4b -:4c absolute 'jmp' ;$4c -:4d absolute 'eor' ;$4d -:4e absolute 'lsr' ;$4e -:4f absolute_long 'eor' ;$4f -:50 pc_relative 'bvc' ;$50 -:51 dp_indirect_index_y 'eor' ;$51 -:52 dp_indirect 'eor' ;$52 -:53 sr_indirect_index_y 'eor' ;$53 -:54 block_move 'mvn' ;$54 -:55 dp_index_x 'eor' ;$55 -:56 dp_index_x 'lsr' ;$56 -:57 dp_indirect_long_index_y 'eor' ;$57 -:58 implied 'cli' ;$58 -:59 absolute_index_y 'eor' ;$59 -:5a stack_push 'phy' ;$5a -:5b implied 'tcd' ;$5b -:5c absolute_long 'jmp' ;$5c -:5d absolute_index_x 'eor' ;$5d -:5e absolute_index_x 'lsr' ;$5e -:5f absolute_long_index_x 'eor' ;$5f -:60 stack_rts 'rts' ;$60 -:61 dp_index_indirect_x 'adc' ;$61 -:62 stack_pc_relative 'per' ;$62 -:63 sr 'adc' ;$63 -:64 dp 'stz' ;$64 -:65 dp 'adc' ;$65 -:66 dp 'ror' ;$66 -:67 dp_indirect_long 'adc' ;$67 -:68 stack_pull 'pla' ;$68 -:69 immediate_m 'adc' ;$69 -:6a accumulator 'ror' ;$6a -:6b stack_rtl 'rtl' ;$6b -:6c absolute_indirect 'jmp' ;$6c -:6d absolute 'adc' ;$6d -:6e absolute 'ror' ;$6e -:6f absolute_long 'adc' ;$6f -:70 pc_relative 'bvs' ;$70 -:71 dp_indirect_index_y 'adc' ;$71 -:72 dp_indirect 'adc' ;$72 -:73 sr_indirect_index_y 'adc' ;$73 -:74 dp_index_x 'stz' ;$74 -:75 dp_index_x 'adc' ;$75 -:76 dp_index_x 'ror' ;$76 -:77 dp_indirect_long_index_y 'adc' ;$77 -:78 implied 'sei' ;$78 -:79 absolute_index_y 'adc' ;$79 -:7a stack_pull 'ply' ;$7a -:7b implied 'tdc' ;$7b -:7c absolute_index_indirect 'jmp' ;$7c -:7d absolute_index_x 'adc' ;$7d -:7e absolute_index_x 'ror' ;$7e -:7f absolute_long_index_x 'adc' ;$7f -:80 pc_relative 'bra' ;$80 -:81 dp_index_indirect_x 'sta' ;$81 -:82 pc_relative_long 'brl' ;$82 -:83 sr 'sta' ;$83 -:84 dp 'sty' ;$84 -:85 dp 'sta' ;$85 -:86 dp 'stx' ;$86 -:87 dp_indirect_long 'sta' ;$87 -:88 implied 'dey' ;$88 -:89 immediate_m 'bit' ;$89 -:8a implied 'txa' ;$8a -:8b stack_push 'phb' ;$8b -:8c absolute 'sty' ;$8c -:8d absolute 'sta' ;$8d -:8e absolute 'stx' ;$8e -:8f absolute_long 'sta' ;$8f -:90 pc_relative 'bcc' ;$90 -:91 dp_indirect_index_y 'sta' ;$91 -:92 dp_indirect 'sta' ;$92 -:93 sr_indirect_index_y 'sta' ;$93 -:94 dp_index_x 'sty' ;$94 -:95 dp_index_x 'sta' ;$95 -:96 dp_index_y 'stx' ;$96 -:97 dp_indirect_long_index_y 'sta' ;$97 -:98 implied 'tya' ;$98 -:99 absolute_index_y 'sta' ;$99 -:9a implied 'txs' ;$9a -:9b implied 'txy' ;$9b -:9c absolute 'stz' ;$9c -:9d absolute_index_x 'sta' ;$9d -:9e absolute_index_x 'stz' ;$9e -:9f absolute_long_index_x 'sta' ;$9f -:a0 immediate_i 'ldy' ;$a0 -:a1 dp_index_indirect_x 'lda' ;$a1 -:a2 immediate_i 'ldx' ;$a2 -:a3 sr 'lda' ;$a3 -:a4 dp 'ldy' ;$a4 -:a5 dp 'lda' ;$a5 -:a6 dp 'ldx' ;$a6 -:a7 dp_indirect_long 'lda' ;$a7 -:a8 implied 'tay' ;$a8 -:a9 immediate_m 'lda' ;$a9 -:aa implied 'tax' ;$aa -:ab stack_pull 'plb' ;$ab -:ac absolute 'ldy' ;$ac -:ad absolute 'lda' ;$ad -:ae absolute 'ldx' ;$ae -:af absolute_long 'lda' ;$af -:b0 pc_relative 'bcs' ;$b0 -:b1 dp_indirect_index_y 'lda' ;$b1 -:b2 dp_indirect 'lda' ;$b2 -:b3 sr_indirect_index_y 'lda' ;$b3 -:b4 dp_index_x 'ldy' ;$b4 -:b5 dp_index_x 'lda' ;$b5 -:b6 dp_index_y 'ldx' ;$b6 -:b7 dp_indirect_long_index_y 'lda' ;$b7 -:b8 implied 'clv' ;$b8 -:b9 absolute_index_y 'lda' ;$b9 -:ba implied 'tsx' ;$ba -:bb implied 'tyx' ;$bb -:bc absolute_index_x 'ldy' ;$bc -:bd absolute_index_x 'lda' ;$bd -:be absolute_index_y 'ldx' ;$be -:bf absolute_long_index_x 'lda' ;$bf -:c0 immediate_i 'cpy' ;$c0 -:c1 dp_index_indirect_x 'cmp' ;$c1 -:c2 immediate_rep 'rep' ;$c2 -:c3 sr 'cmp' ;$c3 -:c4 dp 'cpy' ;$c4 -:c5 dp 'cmp' ;$c5 -:c6 dp 'dec' ;$c6 -:c7 dp_indirect_long 'cmp' ;$c7 -:c8 implied 'iny' ;$c8 -:c9 immediate_m 'cmp' ;$c9 -:ca implied 'dex' ;$ca -:cb implied 'wait' ;$cb -:cc absolute 'cpy' ;$cc -:cd absolute 'cmp' ;$cd -:ce absolute 'dec' ;$ce -:cf absolute_long 'cmp' ;$cf -:d0 pc_relative 'bne' ;$d0 -:d1 dp_indirect_index_y 'cmp' ;$d1 -:d2 dp_indirect 'cmp' ;$d2 -:d3 sr_indirect_index_y 'cmp' ;$d3 -:d4 stack_dp_indirect 'pei' ;$d4 -:d5 dp_index_x 'cmp' ;$d5 -:d6 dp_index_x 'dec' ;$d6 -:d7 dp_indirect_long_index_y 'cmp' ;$d7 -:d8 implied 'cld' ;$d8 -:d9 absolute_index_y 'cmp' ;$d9 -:da stack_push 'phx' ;$da -:db implied 'stp' ;$db -:dc absolute_indirect_long 'jmp' ;$dc -:dd absolute_index_x 'cmp' ;$dd -:de absolute_index_x 'dec' ;$de -:df absolute_long_index_x 'cmp' ;$df -:e0 immediate_i 'cpx' ;$e0 -:e1 dp_index_indirect_x 'sbc' ;$e1 -:e2 immediate_sep 'sep' ;$e2 -:e3 sr 'sbc' ;$e3 -:e4 dp 'cpx' ;$e4 -:e5 dp 'sbc' ;$e5 -:e6 dp 'inc' ;$e6 -:e7 dp_indirect_long 'sbc' ;$e7 -:e8 implied 'inx' ;$e8 -:e9 immediate_m 'sbc' ;$e9 -:ea implied 'nop' ;$ea -:eb implied 'xba' ;$eb -:ec absolute 'cpx' ;$ec -:ed absolute 'sbc' ;$ed -:ee absolute 'inc' ;$ee -:ef absolute_long 'sbc' ;$ef -:f0 pc_relative 'beq' ;$f0 -:f1 dp_indirect_index_y 'sbc' ;$f1 -:f2 dp_indirect 'sbc' ;$f2 -:f3 sr_indirect_index_y 'sbc' ;$f3 -:f4 stack_absolute 'pea' ;$f4 -:f5 dp_index_x 'sbc' ;$f5 -:f6 dp_index_x 'inc' ;$f6 -:f7 dp_indirect_long_index_y 'sbc' ;$f7 -:f8 implied 'sed' ;$f8 -:f9 absolute_index_y 'sbc' ;$f9 -:fa stack_pull 'plx' ;$fa -:fb implied 'xce' ;$fb -:fc absolute_index_indirect 'jsr';$fc -:fd absolute_index_x 'sbc' ;$fb -:fe absolute_index_x 'inc' ;$fe -:ff absolute_long_index_x 'sbc' ;$ff - -~operator ent ;operator precedence - operator 0;0 ;no operator of value $00 - operator 3;LEFT_RIGHT ;addition - operator 3;LEFT ;subtraction - operator 2;LEFT_RIGHT ;multiplication - operator 2;LEFT ;division - operator 2;LEFT ;modulus - operator 1;LEFT_RIGHT ;negation - operator 4;LEFT ;bit shift - operator 10;LEFT ;and - operator 11;LEFT ;or - operator 12;LEFT ;eor - operator 1;LEFT_RIGHT ;not - operator 5;LEFT ;less than or equal - operator 5;LEFT ;greater than or equal - operator 6;LEFT ;not equal - operator 5;LEFT ;less than - operator 5;LEFT ;greater than - operator 6;LEFT ;equal - operator 7;LEFT ;logical and - operator 9;LEFT ;inclusive or - operator 8;LEFT ;exculsive or - operator 1;LEFT_RIGHT ;complement - -~long_options ent ;command-line options accepted by coff - dw :version,:nodefault,:asm,:tool - dw :hex,:label,:infix,:postfix - dw :merlin,:orca,:shorta,:shorti - dw :header,:noheader,:nooffset - dw :help,:thanks,:compress,:exact - dw :NULL -:version option 'version';0;NULL;'v' -:nodefault option 'nodefault';0;NULL;'D' -:asm option 'asm';0;NULL;'d' -:tool option 'tool';0;NULL;'T' -:hex option 'hex';0;NULL;'x' -:label option 'label';0;NULL;'l' -:infix option 'infix';0;NULL;'t' -:postfix option 'postfix';0;NULL;'p' -:merlin option 'merlin';0;NULL;'m' -:orca option 'orca';0;NULL;'o' -:shorta option 'shorta';0;NULL;'a' -:shorti option 'shorti';0;NULL;'i' -:header option 'header';0;NULL;'s' -:noheader option 'noheader';0;NULL;'n' -:nooffset option 'nooffset';0;NULL;'f' -:help option 'help';0;NULL;'h' -:thanks option 'thanks';0;NULL;1 -:compress option 'compress';0;NULL;'c' -:exact option 'exact';0;NULL;'e' -:NULL option NULL;0;NULL;0 - -* data structure variables -* -@omf ent ;OMF header structure -:offset UnsignedLong ;offset from beginning of file for this segment -:bytecnt UnsignedLong ;number of bytes in file that segment requires -:resspc UnsignedLong ;number of bytes of zeros to add to end of segment -:length UnsignedLong ;memory size of segment -:kind UnsignedShort ;type and attributes of segment -:lablen UnsignedShort ;length of each name or label record in segment -:numlen UnsignedShort ;length of each number field in segment body -:version UnsignedShort ;version number of OMF segment is compatible with -:revision UnsignedShort ;revision number of OMF v2.0 segment is compatible with -:banksize UnsignedLong ;maximum memory-bank size for segment -:org UnsignedLong ;absolute address at which to load segment -:align UnsignedLong ;boundary on which to align segment -:numsex UnsignedShort ;order of bytes in a number field -:lcbank UnsignedShort ;load segment into language card -:segnum UnsignedShort ;segment number -:entry UnsignedLong ;offset into segment that corresponds to entry point -:dispname UnsignedShort ;displacement of the loadname field within segment header -:dispdata UnsignedShort ;displacement from start of segment header to start of segment body -:temporg UnsignedLong ;temporary origin of object segment for OMF v2.0 -:loadname Char LOADNAME_LEN ;name of load segment -:segname CharPtr ;name of segment -:displacement UnsignedLong -:counter UnsignedLong -:library UnsignedShort ;if file is a library -:refNum Word ;reference number associated with file - -@parse_data ent ;global/local data parsing structure -:on Boolean ;test if parsing on -:data_type Boolean ;type of data to parse -:count UnsignedShort ;number of records to parse -:edge UnsignedShort ;right margin for output of data - -@label ent ;label references -:label_name Handle ;name of label -:expr_name Handle ;expression label evaluates to -:type UnsignedShort ;GLOBAL or LOCAL label -:next Handle ;next label reference -:prev Handle ;previous label reference -:last Handle ;last label reference - -@expr_list ent ;expression list -:lo Handle ;handle to array of expressions -:hi Handle -:size UnsignedShort ;number of elements in list - -@btree ent ;binary-tree structure -:ptr dw :0,:1,:2,:3,:4,:5,:6,:7,:8,:9 ;elements in binary tree array - dw :10,:11,:12,:13,:14,:15,:16,:17,:18,:19 - dw :20,:21,:22,:23,:24,:25,:26,:27,:28,:29 - dw :30,:31,:32,:33,:34,:35,:36,:37,:38,:39 - dw :40,:41,:42,:43,:44,:45,:46,:47,:48,:49 -:0 ds 10 -:1 ds 10 -:2 ds 10 -:3 ds 10 -:4 ds 10 -:5 ds 10 -:6 ds 10 -:7 ds 10 -:8 ds 10 -:9 ds 10 -:10 ds 10 -:11 ds 10 -:12 ds 10 -:13 ds 10 -:14 ds 10 -:15 ds 10 -:16 ds 10 -:17 ds 10 -:18 ds 10 -:19 ds 10 -:20 ds 10 -:21 ds 10 -:22 ds 10 -:23 ds 10 -:24 ds 10 -:25 ds 10 -:26 ds 10 -:27 ds 10 -:28 ds 10 -:29 ds 10 -:30 ds 10 -:31 ds 10 -:32 ds 10 -:33 ds 10 -:34 ds 10 -:35 ds 10 -:36 ds 10 -:37 ds 10 -:38 ds 10 -:39 ds 10 -:40 ds 10 -:41 ds 10 -:42 ds 10 -:43 ds 10 -:44 ds 10 -:45 ds 10 -:46 ds 10 -:47 ds 10 -:48 ds 10 -:49 ds 10 - -@stack ent ;stack structure -:lo Handle ;array of handles containing stack -:hi Handle ;elements -:size UnsignedShort ;number of elements in stack - -* gs/os data structures -* -@Close ent -:pCount ds 2 -:refNum ds 2 - -@Open ent -:pCount ds 2 -:refNum ds 2 -:pathname ds 4 -:requestAccess ds 2 -:resourceNumber ds 2 -:access ds 2 -:fileType ds 2 -:auxType ds 4 -:storageType ds 4 -:createDateTime ds 8 -:modDateTime ds 8 -:optionList ds 4 -:eof ds 4 -:blocksUsed ds 4 -:resourceEOF ds 4 -:resourceBlocks ds 4 - -@GetMark ent -:pCount ds 2 -:refNum ds 2 -:position ds 4 - -@SetMark ent -:pCount ds 2 -:refNum ds 2 -:base ds 2 -:displacement ds 4 - -@Quit ent -:pCount ds 2 -:pathname ds 4 -:flags ds 2 - -@Read ent -:pCount ds 2 -:refNum ds 2 -:dataBuffer ds 4 -:requestCount ds 4 -:transferCount ds 4 -:cachePriority ds 2 - - -************************************************** - sav data.l + END OF ARCHIVE