Annotation of gforth/arch/alpha/disasm.fs, revision 1.1

1.1     ! anton       1: 
        !             2: \ bernd thallner 9725890 e881
        !             3: \ disassembler in forth for alpha
        !             4: 
        !             5: \ format
        !             6: 
        !             7: 0 constant cOpc
        !             8: 1 constant cBra
        !             9: 2 constant cF-P
        !            10: 3 constant cMem
        !            11: 4 constant cMfc
        !            12: 5 constant cMbr
        !            13: 6 constant cOpr
        !            14: 7 constant cPcd
        !            15: 
        !            16: \ util
        !            17: 
        !            18: : right_shift ( a n -- a>>=n )
        !            19: 0
        !            20: ?do
        !            21:   2/
        !            22: loop
        !            23: ;
        !            24: 
        !            25: : left_shift ( a n -- a<<=n )
        !            26: 0
        !            27: ?do
        !            28:   2*
        !            29: loop
        !            30: ;
        !            31: 
        !            32: : h@ ( addr -- n )  \ 32 bit fetch
        !            33: dup dup aligned = if
        !            34:   @
        !            35:   $00000000ffffffff and
        !            36: else
        !            37:   4 - @
        !            38:   $20 right_shift
        !            39: endif
        !            40: ;
        !            41: 
        !            42: create string_table
        !            43: 1000 allot
        !            44: 
        !            45: \ makes an table entry with following data structure
        !            46: \ 64 start address in string_table 48 strlen 32 format (cOpc, cBra, cF-P, cMem, cMfc, cMbr, cOpr, cPcd) 0
        !            47: 
        !            48: : mktbentry, { start format straddr strlen -- start }  \ make table entry
        !            49:   straddr string_table start + strlen cmove
        !            50:   start 48 left_shift
        !            51:   strlen 32 left_shift or
        !            52:   format or
        !            53:   ,
        !            54:   start strlen +
        !            55: ;
        !            56: 
        !            57: \ prints the string from stringtable
        !            58: \ table_entry = 64 start address in string_table 48 strlen 32 unused 0
        !            59: 
        !            60: : print_string ( table_entry -- )  \ print string entry
        !            61:   dup
        !            62:   48 right_shift string_table +
        !            63:   swap
        !            64:   32 right_shift $000000000000ffff and
        !            65:   type
        !            66: ;
        !            67: 
        !            68: \ Opr tab0 opcode 10.xxx
        !            69: \ Opr tab1 opcode 11.xxx
        !            70: \ Opr tab2 opcode 12.xxx
        !            71: \ Opr tab3 opcode 13.xxx
        !            72: 
        !            73: \ F-P tab0 opcode 15.xxx
        !            74: \ F-P tab1 opcode 16.xxx
        !            75: \ F-P tab2 opcode 17.xxx
        !            76: 
        !            77: : tab0 2* 2* ;
        !            78: : tab1 2* 2* 1 + ;
        !            79: : tab2 2* 2* 2 + ;
        !            80: : tab3 2* 2* 3 + ;
        !            81: 
        !            82: 0 \ string_table offset
        !            83: 
        !            84: create opcode_table
        !            85: 
        !            86: ( 00 ) cPcd s" call_pal"    mktbentry,
        !            87: ( 01 ) cOpc s" opc01"       mktbentry,
        !            88: ( 02 ) cOpc s" opc02"       mktbentry,
        !            89: ( 03 ) cOpc s" opc03"       mktbentry,
        !            90: ( 04 ) cOpc s" opc04"       mktbentry,
        !            91: ( 05 ) cOpc s" opc05"       mktbentry,
        !            92: ( 06 ) cOpc s" opc06"       mktbentry,
        !            93: ( 07 ) cOpc s" opc07"       mktbentry,
        !            94: ( 08 ) cMem s" lda"         mktbentry,
        !            95: ( 09 ) cMem s" ldah"        mktbentry,
        !            96: ( 0a ) cOpc s" opc0a"       mktbentry,
        !            97: ( 0b ) cMem s" ldq_u"       mktbentry,
        !            98: ( 0c ) cOpc s" opc0c"       mktbentry,
        !            99: ( 0d ) cOpc s" opc0d"       mktbentry,
        !           100: ( 0e ) cOpc s" opc0e"       mktbentry,
        !           101: ( 0f ) cMem s" stq_u"       mktbentry,
        !           102: ( 10 ) cOpr s" "            mktbentry,
        !           103: ( 11 ) cOpr s" "            mktbentry,
        !           104: ( 12 ) cOpr s" "            mktbentry,
        !           105: ( 13 ) cOpr s" "            mktbentry,
        !           106: ( 14 ) cOpc s" opc14"       mktbentry,
        !           107: ( 15 ) cF-P s" "            mktbentry,
        !           108: ( 16 ) cF-P s" "            mktbentry,
        !           109: ( 17 ) cF-P s" "            mktbentry,
        !           110: ( 18 ) cMfc s" "            mktbentry,
        !           111: ( 19 ) cOpc s" pal19"       mktbentry,
        !           112: ( 1a ) cMbr s" "            mktbentry,
        !           113: ( 1b ) cOpc s" pal1b"       mktbentry,
        !           114: ( 1c ) cOpc s" opc1c"       mktbentry,
        !           115: ( 1d ) cOpc s" pal1d"       mktbentry,
        !           116: ( 1e ) cOpc s" pal1e"       mktbentry,
        !           117: ( 1f ) cOpc s" pal1f"       mktbentry,
        !           118: ( 20 ) cMem s" ldf"         mktbentry,
        !           119: ( 21 ) cMem s" ldg"         mktbentry,
        !           120: ( 22 ) cMem s" lds"         mktbentry,
        !           121: ( 23 ) cMem s" ldt"         mktbentry,
        !           122: ( 24 ) cMem s" stf"         mktbentry,
        !           123: ( 25 ) cMem s" stg"         mktbentry,
        !           124: ( 26 ) cMem s" sts"         mktbentry,
        !           125: ( 27 ) cMem s" stt"         mktbentry,
        !           126: ( 28 ) cMem s" ldl"         mktbentry,
        !           127: ( 29 ) cMem s" ldq"         mktbentry,
        !           128: ( 2a ) cMem s" ldl_l"       mktbentry,
        !           129: ( 2b ) cMem s" ldq_l"       mktbentry,
        !           130: ( 2c ) cMem s" stl"         mktbentry,
        !           131: ( 2d ) cMem s" stq"         mktbentry,
        !           132: ( 2e ) cMem s" stl_c"       mktbentry,
        !           133: ( 2f ) cMem s" stq_c"       mktbentry,
        !           134: ( 30 ) cBra s" br"          mktbentry,
        !           135: ( 31 ) cBra s" fbeq"        mktbentry,
        !           136: ( 32 ) cBra s" fblt"        mktbentry,
        !           137: ( 33 ) cBra s" fble"        mktbentry,
        !           138: ( 34 ) cBra s" bsr"         mktbentry,
        !           139: ( 35 ) cBra s" fbne"        mktbentry,
        !           140: ( 36 ) cBra s" fbge"        mktbentry,
        !           141: ( 37 ) cBra s" fbgt"        mktbentry,
        !           142: ( 38 ) cBra s" blbc"        mktbentry,
        !           143: ( 39 ) cBra s" beq"         mktbentry,
        !           144: ( 3a ) cBra s" blt"         mktbentry,
        !           145: ( 3b ) cBra s" ble"         mktbentry,
        !           146: ( 3c ) cBra s" blbs"        mktbentry,
        !           147: ( 3d ) cBra s" bne"         mktbentry,
        !           148: ( 3e ) cBra s" bge"         mktbentry,
        !           149: ( 3f ) cBra s" bgt"         mktbentry,
        !           150: 
        !           151: create Opr_list
        !           152: 
        !           153: $00 tab0 s" addl"          mktbentry,
        !           154: $40 tab0 s" addlv"         mktbentry,
        !           155: $20 tab0 s" addq"          mktbentry,
        !           156: $60 tab0 s" addqv"         mktbentry,
        !           157: $0f tab0 s" cmpbge"        mktbentry,
        !           158: $2d tab0 s" cmpeq"         mktbentry,
        !           159: $6d tab0 s" cmple"         mktbentry,
        !           160: $4d tab0 s" cmplt"         mktbentry,
        !           161: $3d tab0 s" cmpule"        mktbentry,
        !           162: $1d tab0 s" cmpult"        mktbentry,
        !           163: $02 tab0 s" s4addl"        mktbentry,
        !           164: $22 tab0 s" s4addq"        mktbentry,
        !           165: $0b tab0 s" s4subl"        mktbentry,
        !           166: $2b tab0 s" s4subq"        mktbentry,
        !           167: $12 tab0 s" s8addl"        mktbentry,
        !           168: $32 tab0 s" s8addq"        mktbentry,
        !           169: $1b tab0 s" s8ubl"         mktbentry,
        !           170: $3b tab0 s" s8ubq"         mktbentry,
        !           171: $09 tab0 s" subl"          mktbentry,
        !           172: $49 tab0 s" sublv"         mktbentry,
        !           173: $29 tab0 s" subq"          mktbentry,
        !           174: $69 tab0 s" subqv"         mktbentry,
        !           175: 
        !           176: $00 tab1 s" and"           mktbentry,
        !           177: $08 tab1 s" bic"           mktbentry,
        !           178: $20 tab1 s" bis"           mktbentry,
        !           179: $24 tab1 s" cmoveq"        mktbentry,
        !           180: $46 tab1 s" cmovge"        mktbentry,
        !           181: $66 tab1 s" cmovgt"        mktbentry,
        !           182: $16 tab1 s" cmovlbc"       mktbentry,
        !           183: $14 tab1 s" cmovlbs"       mktbentry,
        !           184: $64 tab1 s" cmovle"        mktbentry,
        !           185: $44 tab1 s" cmovlt"        mktbentry,
        !           186: $26 tab1 s" cmovne"        mktbentry,
        !           187: $48 tab1 s" eqv"           mktbentry,
        !           188: $28 tab1 s" ornot"         mktbentry,
        !           189: $40 tab1 s" xor"           mktbentry,
        !           190: 
        !           191: $06 tab2 s" extbl"         mktbentry,
        !           192: $6a tab2 s" extlh"         mktbentry,
        !           193: $26 tab2 s" extll"         mktbentry,
        !           194: $7a tab2 s" extqh"         mktbentry,
        !           195: $36 tab2 s" extql"         mktbentry,
        !           196: $5a tab2 s" extwh"         mktbentry,
        !           197: $16 tab2 s" extwl"         mktbentry,
        !           198: $0b tab2 s" insbl"         mktbentry,
        !           199: $67 tab2 s" inslh"         mktbentry,
        !           200: $2b tab2 s" insll"         mktbentry,
        !           201: $77 tab2 s" insqh"         mktbentry,
        !           202: $3b tab2 s" insql"         mktbentry,
        !           203: $57 tab2 s" inswh"         mktbentry,
        !           204: $1b tab2 s" inswl"         mktbentry,
        !           205: $02 tab2 s" mskbl"         mktbentry,
        !           206: $62 tab2 s" msklh"         mktbentry,
        !           207: $22 tab2 s" mskll"         mktbentry,
        !           208: $72 tab2 s" mskqh"         mktbentry,
        !           209: $32 tab2 s" mskql"         mktbentry,
        !           210: $52 tab2 s" mskwh"         mktbentry,
        !           211: $12 tab2 s" mskwl"         mktbentry,
        !           212: $39 tab2 s" sll"           mktbentry,
        !           213: $3c tab2 s" sra"           mktbentry,
        !           214: $34 tab2 s" srl"           mktbentry,
        !           215: $30 tab2 s" zap"           mktbentry,
        !           216: $31 tab2 s" zapnot"        mktbentry,
        !           217: 
        !           218: $00 tab3 s" mull"          mktbentry,
        !           219: $20 tab3 s" mullq"         mktbentry,
        !           220: $30 tab3 s" umulh"         mktbentry,
        !           221: $40 tab3 s" mullv"         mktbentry,
        !           222: $60 tab3 s" mullqv"        mktbentry,
        !           223: 
        !           224: create Mfc_list
        !           225: 
        !           226: $0000 s" trapb"            mktbentry,
        !           227: $0400 s" excb"             mktbentry,
        !           228: $4000 s" mb"               mktbentry,
        !           229: $4400 s" wmb"              mktbentry,
        !           230: $8000 s" fetch"            mktbentry,
        !           231: $a000 s" fetch_m"          mktbentry,
        !           232: $c000 s" rpcc"             mktbentry,
        !           233: $e000 s" rc"               mktbentry,
        !           234: $f000 s" rs"               mktbentry,
        !           235: 
        !           236: create Mbr_table
        !           237: 
        !           238: ( 00 ) 0 s" jmp"           mktbentry, 
        !           239: ( 01 ) 0 s" jsr"           mktbentry,
        !           240: ( 02 ) 0 s" ret"           mktbentry,
        !           241: ( 03 ) 0 s" jsr_coroutine" mktbentry,
        !           242: 
        !           243: create F-P_list
        !           244: 
        !           245: $080 tab0 s" addf"         mktbentry,
        !           246: $081 tab0 s" subf"         mktbentry,
        !           247: $082 tab0 s" mulf"         mktbentry,
        !           248: $083 tab0 s" divf"         mktbentry,
        !           249: $09e tab0 s" cvtdg"        mktbentry,
        !           250: $0a0 tab0 s" addg"         mktbentry,
        !           251: $0a1 tab0 s" subg"         mktbentry,
        !           252: $0a2 tab0 s" mulg"         mktbentry,
        !           253: $0a3 tab0 s" divg"         mktbentry,
        !           254: $0a5 tab0 s" cmpgeq"       mktbentry,
        !           255: $0a6 tab0 s" cmpglt"       mktbentry,
        !           256: $0a7 tab0 s" cmpgle"       mktbentry,
        !           257: $0ac tab0 s" cvtgf"        mktbentry,
        !           258: $0ad tab0 s" cvtgd"        mktbentry,
        !           259: $0af tab0 s" cvtgq"        mktbentry,
        !           260: $0bc tab0 s" cvtqf"        mktbentry,
        !           261: $0be tab0 s" cvtqg"        mktbentry,
        !           262: 
        !           263: $080 tab1 s" adds"         mktbentry,
        !           264: $081 tab1 s" subs"         mktbentry,
        !           265: $082 tab1 s" mulls"        mktbentry,
        !           266: $083 tab1 s" divs"         mktbentry,
        !           267: $0a0 tab1 s" addt"         mktbentry,
        !           268: $0a1 tab1 s" subt"         mktbentry,
        !           269: $0a2 tab1 s" mullt"        mktbentry,
        !           270: $0a3 tab1 s" divt"         mktbentry,
        !           271: $0a4 tab1 s" cmptun"       mktbentry,
        !           272: $0a5 tab1 s" cmpteq"       mktbentry,
        !           273: $0a6 tab1 s" cmptlt"       mktbentry,
        !           274: $0a7 tab1 s" cmptle"       mktbentry,
        !           275: $0ac tab1 s" cvtts"        mktbentry,
        !           276: $0af tab1 s" cvttq"        mktbentry,
        !           277: $0bc tab1 s" cvtqs"        mktbentry,
        !           278: $0be tab1 s" cvtqt"        mktbentry,
        !           279: $2ac tab1 s" cvtst"        mktbentry,
        !           280: 
        !           281: $010 tab2 s" cvtlq"        mktbentry,
        !           282: $020 tab2 s" cpys"         mktbentry,
        !           283: $021 tab2 s" cpysn"        mktbentry,
        !           284: $022 tab2 s" cpyse"        mktbentry,
        !           285: $024 tab2 s" mt_fpcr"      mktbentry,
        !           286: $025 tab2 s" mf_fpcr"      mktbentry,
        !           287: $02a tab2 s" fcmoveq"      mktbentry,
        !           288: $02b tab2 s" fcmovne"      mktbentry,
        !           289: $02c tab2 s" fcmovlt"      mktbentry,
        !           290: $02d tab2 s" fcmovge"      mktbentry,
        !           291: $02e tab2 s" fcmovle"      mktbentry,
        !           292: $02f tab2 s" fcmovgt"      mktbentry,
        !           293: $030 tab2 s" cvtql"        mktbentry,
        !           294: $130 tab2 s" cvtqlv"       mktbentry,
        !           295: $530 tab2 s" cvtqlsv"      mktbentry,
        !           296: 
        !           297: create register_table
        !           298: 
        !           299: ( 00 ) 0 s" v0"           mktbentry,
        !           300: ( 01 ) 0 s" t0"           mktbentry,
        !           301: ( 02 ) 0 s" t1"           mktbentry,
        !           302: ( 03 ) 0 s" t2"           mktbentry,
        !           303: ( 04 ) 0 s" t3"           mktbentry,
        !           304: ( 05 ) 0 s" t4"           mktbentry,
        !           305: ( 06 ) 0 s" t5"           mktbentry,
        !           306: ( 07 ) 0 s" t6"           mktbentry,
        !           307: ( 08 ) 0 s" t7"           mktbentry,
        !           308: ( 09 ) 0 s" s0"           mktbentry,
        !           309: ( 0a ) 0 s" s1"           mktbentry,
        !           310: ( 0b ) 0 s" s2"           mktbentry,
        !           311: ( 0c ) 0 s" s3"           mktbentry,
        !           312: ( 0d ) 0 s" s4"           mktbentry,
        !           313: ( 0e ) 0 s" s5"           mktbentry,
        !           314: ( 0f ) 0 s" fp"           mktbentry,
        !           315: ( 10 ) 0 s" a0"           mktbentry,
        !           316: ( 11 ) 0 s" a1"           mktbentry,
        !           317: ( 12 ) 0 s" a2"           mktbentry,
        !           318: ( 13 ) 0 s" a3"           mktbentry,
        !           319: ( 14 ) 0 s" a4"           mktbentry,
        !           320: ( 15 ) 0 s" a5"           mktbentry,
        !           321: ( 16 ) 0 s" t8"           mktbentry,
        !           322: ( 17 ) 0 s" t9"           mktbentry,
        !           323: ( 18 ) 0 s" t10"          mktbentry,
        !           324: ( 19 ) 0 s" t11"          mktbentry,
        !           325: ( 1a ) 0 s" ra"           mktbentry,
        !           326: ( 1b ) 0 s" t12"          mktbentry,
        !           327: ( 1c ) 0 s" at"           mktbentry,
        !           328: ( 1d ) 0 s" gp"           mktbentry,
        !           329: ( 1e ) 0 s" sp"           mktbentry,
        !           330: ( 1f ) 0 s" zero"         mktbentry,
        !           331: 
        !           332: drop \ string_table end
        !           333: 
        !           334: defer decode_register
        !           335: 
        !           336: : decode_register_symb ( register -- )
        !           337:   cells register_table +
        !           338:   @ print_string $20 emit
        !           339: ;
        !           340: 
        !           341: : decode_register_number ( register -- )
        !           342:   .
        !           343: ;
        !           344: 
        !           345: ' decode_register_number is decode_register
        !           346: \ ' decode_register_symb is decode_register
        !           347: 
        !           348: : decode_Opc ( instruction tbentry -- )
        !           349:   print_string drop
        !           350: ;
        !           351: 
        !           352: : decode_Bra ( instruction tbentry -- )
        !           353:   swap
        !           354:   dup $03e00000 and 21 right_shift decode_register
        !           355:   $001fffff and .
        !           356:   print_string
        !           357: ;
        !           358: 
        !           359: : decode_F-P ( instruction tbentry -- )
        !           360:   drop
        !           361:   dup $03e00000 and 21 right_shift decode_register
        !           362:   dup $001f0000 and 16 right_shift decode_register
        !           363:   dup $0000001f and decode_register
        !           364:   dup 26 right_shift $15 -
        !           365:   swap $0000fff0 and 3 right_shift or F-P_list
        !           366:   begin
        !           367:     dup @ rot swap over over $00000000ffffffff and
        !           368:     = if print_string swap drop register_table swap else drop endif
        !           369:     swap 1 cells + dup register_table >
        !           370:   until
        !           371:   drop drop
        !           372: ;
        !           373: 
        !           374: : decode_Mem ( instruction tbentry -- )
        !           375:   swap
        !           376:   dup $03e00000 and 21 right_shift decode_register
        !           377:   dup $0000ffff and .
        !           378:   $001f0000 and 16 right_shift decode_register
        !           379:   print_string
        !           380: ;
        !           381: 
        !           382: : decode_Mfc ( instruction tbentry -- )
        !           383:   drop
        !           384:   dup $03e00000 and 21 right_shift decode_register
        !           385:   dup $001f0000 and 16 right_shift decode_register
        !           386:   $0000ffff and Mfc_list
        !           387:   begin
        !           388:     dup @ rot swap over over $00000000ffffffff and
        !           389:     = if print_string drop drop register_table 1 else drop endif
        !           390:     swap 1 cells + dup F-P_list >
        !           391:   until
        !           392:   drop drop
        !           393: ;
        !           394: 
        !           395: : decode_Mbr ( instruction tbentry -- )
        !           396:   drop
        !           397:   dup $03e00000 and 21 right_shift decode_register
        !           398:   dup $001f0000 and 16 right_shift decode_register
        !           399:   dup $00003fff and decode_register
        !           400:   $0000c000 and 14 right_shift cells Mbr_table +
        !           401:   @ print_string
        !           402: ;
        !           403: 
        !           404: : decode_Opr ( instruction tbentry -- )
        !           405:   drop
        !           406:   dup $03e00000 and 21 right_shift decode_register
        !           407:   dup dup $00001000 and $00001000
        !           408:   = if
        !           409:     $001fe000 and 13 right_shift . -1
        !           410:   else
        !           411:     $001f0000 and 16 right_shift decode_register 0
        !           412:   endif
        !           413:   swap dup $0000001f and decode_register
        !           414:   dup 26 right_shift $10 -
        !           415:   swap $00000fe0 and 3 right_shift or Opr_list
        !           416:   begin
        !           417:     dup @ rot swap over over $00000000ffffffff and
        !           418:     = if print_string swap drop register_table swap else drop endif
        !           419:     swap 1 cells + dup Mfc_list >
        !           420:   until
        !           421:   drop drop if $23 emit endif
        !           422: ;
        !           423: 
        !           424: : decode_Pcd ( instruction tbentry -- )
        !           425:   swap
        !           426:   $0000000003ffffff and .
        !           427:   print_string
        !           428: ;
        !           429: 
        !           430: : decode_inst ( n -- )  \ instruction decoder
        !           431:   dup $fc000000 and
        !           432:   26 right_shift cells
        !           433:   opcode_table +
        !           434:   @ dup
        !           435:   $000000000000ffff and
        !           436:   dup cOpc = if drop decode_Opc 
        !           437:     else dup cF-P = if drop decode_F-P
        !           438:       else dup cOpr = if drop decode_Opr
        !           439:         else dup cMfc = if drop decode_Mfc
        !           440:           else dup cMbr = if drop decode_Mbr
        !           441:             else dup cMem = if drop decode_Mem
        !           442:               else dup cBra = if drop decode_Bra
        !           443:                 else dup cPcd = if drop decode_Pcd
        !           444:                                endif
        !           445:                              endif
        !           446:                            endif
        !           447:                          endif
        !           448:                        endif
        !           449:                      endif
        !           450:                    endif
        !           451:                  endif
        !           452:   $2c emit $a emit
        !           453: ;
        !           454: 
        !           455: : disasm ( addr n -- )  \ disassembler
        !           456: $a emit 0
        !           457: ?do
        !           458:   dup h@
        !           459:   over $28 emit $20 emit . $29 emit $20 emit
        !           460:   decode_inst
        !           461:   4 +
        !           462: loop
        !           463: drop $a emit
        !           464: ;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>