ダンプ

今回はファイルダンプソフトを作ります。
といっても簡単なものなので実用になるかどうかは別ですが…
今回は、コンソールプログラムです。もちろん、できる人はウインドウバージョンでもかまいません。
ファイルはコマンドラインで入力させます。
早速コードです。
'dump.abpで保存すること
#console
#include<vcrt71.sbp>

'コマンドライン分析
Dim cmd As *Byte
Dim cmdlen As Long
Dim fnam[MAX_PATH] As Byte
Dim n As Long,m As Long

cmd = GetCommandLine()
cmdlen = strlen(cmd)
cmd[cmdlen+1] = &h20'番人
For n=0 To cmdlen
    'スペースを探す
    If cmd[n-1] = &h20 Then
        '次のスペースまでをfnamにコピー
        While cmd[n] = &h20
            n=n+1
        Wend
        While(cmd[n] <> &h20)
            fnam[m] = cmd[n]
            n=n+1
            m=m+1
        Wend
        Exit For
    End If
Next

'ファイルを開きます。
Dim fp As *FILE
Dim fsiz As Long
Dim buf As *Byte
fp = fopen(fnam , "rb")
If fp = NULL Then
    printf("%sを開けません" , fnam)
    exit(0)
EndIf

fseek(fp , 0 , SEEK_END)
fsiz = ftell(fp)
fseek(fp , 0 , SEEK_SET)
    
buf = malloc(fsiz + 16)
fread(buf , 1 , fsiz , fp)
fclose(fp)
'ダンプ
For n=0 To fsiz Step 16
    '16進数表示
    For m=n To n+15
        If m >=fsiz Then buf[m] = 0
        printf("%02x " , buf[m])
    Next
    '文字なら表示
    For m=n To n+15
        If buf[m] >= &h20 And buf[m] <= &h7F Then
            printf("%c" , buf[m])
        Else
            printf(".")
        End If
    Next        
    '改行
    printf(Ex"\r\n")
Next
free(buf)
exit(0)
以下のように使います。
dump ファイル
自分自身をダンプすると以下のようになります。
dumpの実行結果

少しバージョンアップ

アドレス指定できるようにすると使いやすくなるでしょう。
#console
#include<vcrt71.sbp>

'コマンドライン分析
Sub USAGE()
    printf(Ex"DUMPER for AB Version 1.1\ndump ファイル [開始 終了]\n")        
    exit(0)
End Sub

Function GetCmd(cnt As Long,buf As *Byte) As Long
    Dim cmd As *Byte
    Dim cmdlen As Long
    Dim cidx As Long
    Dim ctmp[MAX_PATH] As Byte
    cmd = GetCommandLine()
    cmdlen = strlen(cmd)
    cmd[cmdlen] = &h20
    
    buf[0] = 0'初期化

    'スペースを圧縮
    For n=0 To cmdlen
        If cmd[n] = &h20 And  cmd[n+1] = &h20 Then
            memcpy(VarPtr(cmd[n]) , VarPtr(cmd[n+1]) , cmdlen - n)
            n=n-1
            cmdlen=cmdlen-1
        End If
    Next
    
    For n=0 To cmdlen
        While cmd[n]<>&h20
            ctmp[m]=cmd[n]
            m=m+1
            n=n+1
        Wend
        ctmp[m]=0
        m=0
        If cidx = cnt Then
            strcpy(buf , ctmp)
            Exit For
        End If
        cidx = cidx+1
    Next

End Function
Dim fnam[MAX_PATH] As Byte
Dim tmp[MAX_PATH] As Byte
Dim dstart As Long , dend As Long
Dim n As Long,m As Long

GetCmd(1 , fnam)
GetCmd(2 , tmp)
dstart = atoi(tmp)
GetCmd(3 , tmp)
dend = atoi(tmp)

'printf(Ex"[%s] : %d -> %d\n" , fnam , start , end)

'ファイルを開きます。
Dim fp As *FILE
Dim fsiz As Long
Dim buf As *Byte
fp = fopen(fnam , "rb")
If fp = NULL Then USAGE()

fseek(fp , 0 , SEEK_END)
fsiz = ftell(fp)
fseek(fp , 0 , SEEK_SET)
buf = malloc(fsiz + 16)
fread(buf , 1 , fsiz , fp)
fclose(fp)

'位置を設定
If dstart < 0 or dstart > dend  or  dstart > fsiz Then dstart = 0
If dend <= 0 or dend > fsiz Then dend = fsiz

printf(Ex"dump : %s : %d -> %d\n------------------------------------\n", _
    fnam , dstart , dend)

'ダンプ
For n=dstart To dend Step 16
    'アドレス
    printf("%6d : " , n)
    '16進数表示
    For m=n To n+15
        If m > dend Then
            printf("   ")
        Else
            printf("%02x " , buf[m])
        End If
    Next
    '文字なら表示
    For m=n To n+15
        If m =>dend Then Exit For
        If buf[m] >= &h20 And buf[m] <= &h7F Then
            printf("%c" , buf[m])
        Else
            printf(".")
        End If
    Next        
    '改行
    printf(Ex"\r\n")
Next
free(buf)
exit(0)
使い方は下記の通りです。
dump ファイル [開始 終了]
私の書き方が悪いため、読みにくいと思いますが、勘弁してください。
そんなに難しいところは無いと思います。
今回のプログラムは冗長なので、すっきりさせると大変読みやすくなると思います。
特にコマンドライン解析は、もっと簡単になると思います。