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>