我用网上的解密软件打开了标准库里的FC95(功能为把十六进制数转换为相应的ASCII),可是前面一些地方实在不明白,请高手指教,程序如下:
TAR2 #TEMP_AR2 // Save Address register 2 contents
// If length to be converted is 0, return immediately
L #N
L 0
==I
JC DONE
// Open DB of ptr to hex input digits
L P##IN
LAR1 // Addr.Reg1 = Ptr to Src. Table
L W [AR1,P#0.0] // load Block No. into accum 1
T #BLKNO // scrblk = Block No.
OPN DB [#BLKNO] // opens 1st Block, DB
L D [AR1,P#2.0] // load Block Area Reference
LAR1 // load Block Addr.(area ref.)into Addr.Reg1
//---------------------------------------------------------------------------
// Open ptr to output Ascii Locations as a DI
L P##OUT
LAR2 // Addr.Reg2 = Ptr to Output
L W [AR2,P#0.0] // load Block No. into accum 1
L 0 // CORRECTION ADDED BY STEVE LOVELL 5/98
==I
JZ BEGN
L W [AR2,P#0.0] // CORRECTION ADDED BY STEVE LOVELL 5/98
T #BLKNO // scrblk = Block No.
OPN DI [#BLKNO] // opens DI Block
//
// START OF CORRECTION ADDED BY STEVE LOVELL 5/98
//
L DW#16#5000000 // OR mask for DIX memory area in ptr
L D [AR2,P#2.0] // load Block Area Reference; start addr.
OD // Force memory area to DIX
LAR2 // Save into AR2
JU BEG2 // Jump to label BEG2
//
// END OF CORRECTION
//
BEGN: L D [AR2,P#2.0] // start addr.
LAR2 // load Block Addr.(area ref.)into Addr.Reg1
BEG2: NOP 0 // CORRECTION ADDED BY STEVE LOVELL 5/98
//---------------------------------------------------------------------------
L #N // Load length of HEX table
BYTS: T #N
L B [AR1,P#0.0] // Load byte from table
T #TMP1 // and write it into TMP1 word
T #SAVTMP1 // save a copy of the table's org. value
L 2 // number of hex input digits extracted
DIGT: T #INDX_D // 1 byte (2 hex digits); 1 byte=2 nibbles
//-------------
L #SAVTMP1 // save a copy of the table's org. value
T #TMP1
L 2
L #INDX_D
<>I
JC MASK
L #TMP1
SRW 4
T #TMP1
//-------------
MASK: L #TMP1 // Accum 2
L W#16#F // Accum 1
AW // TMP1 AW 0x000F (mask off all but lower nibble)
T #ABYTE // convert from WORD to BYTE
L B#16#A // Load 0x0A
JC A030 // Jump to Add 0x30
JU A037 // Jump to Add 0x37
// Add 0x30
A030: L B#16#30
L #ABYTE
+I // 0x30 + ABYTE
T #ABYTE
JU CONT // Jump to continue
// Add 0x37
A037: L B#16#37
L #ABYTE
+I // 0x37 + ABYTE
T #ABYTE
//---------------------------------------------------------------------------
// Continue
CONT: L #ABYTE
T B [AR2,P#0.0] // Write BYTE to ouput
+AR2 P#1.0 // Increment pointer to output (by 1 byte)
//---------------------------------------------------------------------------
L #SAVTMP1 // Copy original table's BYTE value into TMP1
T #TMP1
L #INDX_D
LOOP DIGT // }while (INDX_D <= 2)
//---------------------------------------------------------------------------
+AR1 P#1.0
L 0 // Clear out TMP1 WORD
T #TMP1 // before reading next byte from table
L #N
LOOP BYTS // }while (N > 0)
JU DONE
//---------------------------------------------------------------------------
DONE: SET
SAVE
LAR2 #TEMP_AR2 // Restore Address Register 2 Contents
这是一个FC,怎么程序的开头还要用到OPN DB [#BLKNO] 和 OPN DI [#BLKNO] ?而且这两个数据块号是怎么来的?要是我的调用程序里没有这两个数据块呢?