ちょっと重いです。
これをE3dなどに応用すればCPUへの負荷が少なく実装できるかもしれません。
d3moduleのパーティクルで炎を再現してみた
2010年8月29日日曜日
2010年8月8日日曜日
2010年7月25日日曜日
2010年7月6日火曜日
2010年6月28日月曜日
HSPでOpenGL その2
2010年6月27日日曜日
2010年4月11日日曜日
repeat~loop foreach~loop をマクロで実装
repeat~loop foreach~loopをマクロで実装しました。
gotoでループを脱出してもスタックオーバーフローになりません
ちゃんと システム変数cnt もオリジナルと同じ挙動をします。
foreachも対応しました。拡張機能として
配列変数の各次元にも対応しました。
foreach
foreach2
foreach3
foreach4
といったように
foreachをモジュール型変数で使うときもオリジナルと同じ挙動するようになりました。
詳しくは それとなくHSPで
gotoでループを脱出してもスタックオーバーフローになりません
ちゃんと システム変数cnt もオリジナルと同じ挙動をします。
foreachも対応しました。拡張機能として
配列変数の各次元にも対応しました。
foreach
foreach2
foreach3
foreach4
といったように
foreachをモジュール型変数で使うときもオリジナルと同じ挙動するようになりました。
詳しくは それとなくHSPで
ケン○ッキーフライドチキン作ってみた その2
また挑戦してみました。
今回は大成功です!!!(自分なりには)
レシピのほうは私のホムペ“それとなくHSP”で公開しました。
たぶん私が初の試みでしょう。揚げ粉にコーヒーの粉ミルク(?)を配合したのは!
今回は大成功です!!!(自分なりには)
レシピのほうは私のホムペ“それとなくHSP”で公開しました。
たぶん私が初の試みでしょう。揚げ粉にコーヒーの粉ミルク(?)を配合したのは!
2010年3月29日月曜日
IRCボット改良版
; Character Codepage Encode module
#ifndef __ENCODE_AS__
#define global __ENCODE_AS__
#module "mod_encode"
#const global CODEPAGE_S_JIS 932 ; Shift-JIS
#const global CODEPAGE_EUC_JP 51932 ; EUC-JP
#const global CODEPAGE_JIS 50220 ; iso-2022-jp(JIS)
#const global CODEPAGE_UTF_7 65000 ; utf-7
#const global CODEPAGE_UTF_8 65001 ; utf-8
#const global CODEPAGE_UNICODE 1200 ; Unicode
#const global CODEPAGE_UNICODE_BE 1201 ; Unicode(Big-Endian)
#const global CODEPAGE_AUTODET_ALL 50001 ; auto detect all
#const global CODEPAGE_AUTODET 50932 ; auto detect
#usecom IMultiLanguage@mod_encode "{275c23e1-3747-11d0-9fea-00aa003f8646}" \
"{275c23e2-3747-11d0-9fea-00aa003f8646}"
#comfunc MuLang_ConvertString 9 var, int, int, var, var, var, var
#deffunc _encode_init
newcom ml, IMultiLanguage
return
#deffunc _encode_term onexit
delcom ml
return
#deffunc __FromSJIS@mod_encode str _src, int srcCodepage, var dest, int destCodepage, local src, local srcSize, local destSize, local pdwMode
pdwMode = 0
srcSize = -1
destSize= 0
src = _src
sdim dest
MuLang_ConvertString ml, pdwMode, srcCodepage, destCodepage, src, srcSize, dest, destSize
sdim dest, destSize + 1
MuLang_ConvertString ml, pdwMode, srcCodepage, destCodepage, src, srcSize, dest, destSize
return destSize
#defcfunc _ToSJIS@mod_encode var src, int srcCodepage, int destCodepage, local dest
__FromSJIS src, srcCodepage, dest, destCodepage
return dest
#define _FromSJIS __FromSJIS@mod_encode
#global
_encode_init
; SJIS -> other char code
#define sjis2eucjp(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_EUC_JP
#define sjis2jis(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_JIS
#define sjis2utf7n(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_UTF_7
#define sjis2utf8n(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_UTF_8
; other char code -> SJIS
#define ctype eucjp2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_EUC_JP, CODEPAGE_S_JIS)
#define ctype jis2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_JIS, CODEPAGE_S_JIS)
#define ctype utf7n2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_UTF_7, CODEPAGE_S_JIS)
#define ctype utf8n2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_UTF_8, CODEPAGE_S_JIS)
////////////////////////////////match
#uselib"kernel32.dll"
#cfunc global IsDBCSLeadByteEx "IsDBCSLeadByteEx" int,int
#define global ctype MB1(%1) IsDBCSLeadByteEx(0,%1)
#module
#defcfunc match str buf1_,str buf2_
buf1=buf1_
buf2=buf2_
buf3=""
hyoka=0
index=0
count=0
data_(3)=0
data_(2)=0
data_(1)=0
data_(0)=0
while(1)
while(1)
data=peek(buf1,index)
if(MB1(data)){
pre_index=index
data_(count)=peek(buf1,index)
index+
count+
data_(count)=peek(buf1,index)
index+
count+
}else{
pre_index=index
data_(count)=peek(buf1,index)
index+
count+
}
if(count>=3||data=0){
buf3=strf("%c",data_(0))+strf("%c",data_(1))+strf("%c",data_(2))+strf("%c",data_(3))
data_(3)=0
data_(2)=0
data_(1)=0
data_(0)=0
count=0
_break
}
wend
index=pre_index
// mes buf3
if(instr(buf2,0,buf3)>=0){
hyoka+
}
if peek(buf1,index)=0:_break
wend
return hyoka
#global
//////////////////////////match
#include "hspsock.as"
onexit *exit
goto *hi
*exit
sockclose SockId
end
*hi
/////定数/////////////////////////////
ServerName="irc.freenode.net"
Port=6667
NickName=""
ChannelName="#hspDwiki_TEST"
CloseMessage="Leaving..."
MainWindowSize=400+6+21
/////変数初期化///////////////////////
Command=""
InputData=""
Message=""
SockId=0
sdim StringsData,65536
sdim GetData,1024
sdim send_data,1024
sdim aidata_,1024*1024*16
sdim aidata,1024*1024*16
sdim aidata_load,1024*1024*16
sdim nowgetdata,1024
sdim gyodata,1024
savefile="aigakushu.txt"
loadfile="aigakushu_load.txt"
/////ウィンドウ・オブジェクト配置/////
screen 3,300,12+21+19+6+21+12,2
syscolor 15
boxf
color
sysfont 17
pos 12,12
mes "チャンネル名"
pos ,12+21
objsize 300-24,19
input ChannelName
pos 300-12-88,12+21+19+6
objsize 88,21
button gosub "OK",*join
screen 4,300,12+21+19+6+21+12,2
syscolor 15
boxf
color
sysfont 17
pos 12,12
mes "切断メッセージ"
pos ,12+21
objsize 300-24,19
input CloseMessage
pos 300-12-88,12+21+19+6
objsize 88,21
button gosub "OK",*part
screen 5,300,12+21+19+6+21+19+6+21+21+6+21+12+21+6,2
syscolor 15
boxf
color
sysfont 17
pos 12,12
mes "接続サーバ"
pos ,12+21
objsize 300-24,19
input ServerName
pos ,12+21+19+6
mes "ポート"
pos ,12+21+19+6+21
objsize 300-24,19
input Port
pos ,12+21+19+6+21+19+6
mes "ユーザー名"
pos ,12+21+19+6+21+19+6+21
objsize 300-24,19
input NickName
pos 300-12-88,12+21+19+6+21+19+6+21+21+6
objsize 88,21
button "OK",*session
screen 0,640,MainWindowSize+6+21+6+21
syscolor 15
boxf
color
sysfont 17
pos 12,12
objsize 88,21
button gosub "LOGIN",*session_req
pos 12+88+6,12
objsize 88,21
button gosub "JOIN",*join_req
pos 12+88+6+88+6,12
objsize 88,21
button gosub "PART",*part_req
pos 12,12+21+6
objsize 640-24,MainWindowSize-12-21-6-6-21-12
mesbox StringsData,,,4
Hmesbox=stat
pos 12,MainWindowSize-12-21
objsize 640-88-24-6,21
input InputData
Hinput=stat
pos 640-88-12,MainWindowSize-12-21
objsize 88,21
button gosub "OK",*talk
pos 640-88-12,MainWindowSize-12-21+6+21
objsize 88,21
button gosub "学習OFF",*gaku
gakuid=stat
pos 640-88-12-6-88,MainWindowSize-12-21+6+21
objsize 88,21
button gosub "発言OFF",*hatu
hatuid=stat
pos 12,MainWindowSize-12-21+6+21+3
color
mes "読書込ファイル"
pos 12+6+88,MainWindowSize-12-21+6+21
objsize 88,21
input savefile
pos 12+88+6+88+6,MainWindowSize-12-21+6+21+3
color
mes "読込ファイル"
pos 12+88+6+88+6+6+88,MainWindowSize-12-21+6+21
objsize 88,21
input loadfile
pos 640-88-12-6-88,MainWindowSize-12-21+6+21+6+21
objsize 88,21
button gosub "UTF-8",*moji
mojiid=stat
stop
*moji
mojic xor 1
if mojic :objprm mojiid,"JIS":else:objprm mojiid,"UTF-8"
return
*gaku
ai xor 1
if ai:objprm gakuid,"学習ON":else:objprm gakuid,"学習OFF"
return
*hatu
ht xor 1
if ht:objprm hatuid,"発言ON":else:objprm hatuid,"発言OFF"
return
/////データチェック///////////////////
*main
repeat
sockcheck SockID
stat_=stat
if stat_=0{
gsel 0
sockget GetData,1024,SockID
if(mojic==0){
get_data=utf8n2sjis(GetData)
}else{
get_data=jis2sjis(GetData)
}
StringsData+=get_data+"\n"
objprm Hmesbox,StringsData
sendmsg objinfo(Hmesbox,2),0xb6,0,65536
if(instr(get_data,0,"PRIVMSG")>=0){
if(ai){
notesel aidata_load
noteload loadfile
if(1){
nowgetdata=strmid(get_data,instr(get_data,instr(get_data,0,"PRIVMSG"),":")+instr(get_data,0,"PRIVMSG")+1,strlen(get_data)-instr(get_data,instr(get_data,0,"PRIVMSG"),":")-instr(get_data,0,"PRIVMSG")-1)
if(ht){
aidata_=aidata_load+aidata
notesel aidata_
count=0
maxmatch=0
countmax=notemax*5/6-1
while(1)
if(count>=countmax):_break
noteget gyodata,count
// dialog "1: "+gyodata
// dialog "2: "+nowgetdata
// dialog "3: "+match(gyodata,nowgetdata)
if match(gyodata,nowgetdata)>=maxmatch{
maxmatch=match(gyodata,nowgetdata)
maxmatchgyo=count
}
count+
wend
// dialog "4: "+maxmatch
if (1.0*maxmatch/strlen(nowgetdata)>=0.13||(strlen(nowgetdata)>=8&&maxmatch>=4)) && strlen(nowgetdata)>=4:noteget gyodata,maxmatchgyo+1:{
if(rnd(100)>82){
gosub *aitalk
}
}
}
aidata+=nowgetdata
notesel aidata
notesave savefile
}
}
}
if(instr(get_data,0,"PING")=0)||(instr(get_data,0,"ping")=0){
gosub *pong
}
}
wait 1
loop
/////コマンド送信////////////////////
*enter
send_buf=""+Message+""+Command+"\n"
if(mojic==0){
sjis2utf8n send_data,send_buf
}else{
sjis2jis send_data,send_buf
}
sockput send_data,SockId
StringsData+=""+Message+""+Command+"\n\n"
objprm Hmesbox,StringsData
sendmsg objinfo(Hmesbox,2),0xb6,0,65536
Message=""
return
*talk
Message="PRIVMSG "+ChannelName+" :"
Command=InputData
gosub *enter
objprm Hinput,""
return
*aitalk
Message="PRIVMSG "+ChannelName+" :"
Command=gyodata
gosub *enter
return
*pong
Message="PONG"
Command=""
gosub *enter
return
*join_req
gsel 3,1
return
*join
gsel 3,-1
gsel 0
Message="JOIN "+ChannelName
Command=""
gosub *enter
objprm Hinput,""
return
*part_req
gsel 4,1
return
*part
gsel 4,-1
gsel 0
Message="PART "+ChannelName+" :"
Command=CloseMessage
gosub *enter
objprm Hinput,""
return
*session_req
gsel 5,1
return
*session
gsel 5,-1
gsel 0
if once:sockclose SockId
sockopen SockId,ServerName,Port
sockput "USER username host server real\n",SockId
sockput "NICK "+NickName+"\n",SockId
once=1
notesel aidata
exist savefile
if strsize=-1{
notesave savefile
}
noteload savefile
notesel aidata_load
exist loadfile
if strsize=-1{
notesave loadfile
}
noteload loadfile
goto *main
2010年3月28日日曜日
IRC 人工無能
糞アルゴリズムによるボット
; Character Codepage Encode module
#ifndef __ENCODE_AS__
#define global __ENCODE_AS__
#module "mod_encode"
#const global CODEPAGE_S_JIS 932 ; Shift-JIS
#const global CODEPAGE_EUC_JP 51932 ; EUC-JP
#const global CODEPAGE_JIS 50220 ; iso-2022-jp(JIS)
#const global CODEPAGE_UTF_7 65000 ; utf-7
#const global CODEPAGE_UTF_8 65001 ; utf-8
#const global CODEPAGE_UNICODE 1200 ; Unicode
#const global CODEPAGE_UNICODE_BE 1201 ; Unicode(Big-Endian)
#const global CODEPAGE_AUTODET_ALL 50001 ; auto detect all
#const global CODEPAGE_AUTODET 50932 ; auto detect
#usecom IMultiLanguage@mod_encode "{275c23e1-3747-11d0-9fea-00aa003f8646}" \
"{275c23e2-3747-11d0-9fea-00aa003f8646}"
#comfunc MuLang_ConvertString 9 var, int, int, var, var, var, var
#deffunc _encode_init
newcom ml, IMultiLanguage
return
#deffunc _encode_term onexit
delcom ml
return
#deffunc __FromSJIS@mod_encode str _src, int srcCodepage, var dest, int destCodepage, local src, local srcSize, local destSize, local pdwMode
pdwMode = 0
srcSize = -1
destSize= 0
src = _src
sdim dest
MuLang_ConvertString ml, pdwMode, srcCodepage, destCodepage, src, srcSize, dest, destSize
sdim dest, destSize + 1
MuLang_ConvertString ml, pdwMode, srcCodepage, destCodepage, src, srcSize, dest, destSize
return destSize
#defcfunc _ToSJIS@mod_encode var src, int srcCodepage, int destCodepage, local dest
__FromSJIS src, srcCodepage, dest, destCodepage
return dest
#define _FromSJIS __FromSJIS@mod_encode
#global
_encode_init
; SJIS -> other char code
#define sjis2eucjp(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_EUC_JP
#define sjis2jis(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_JIS
#define sjis2utf7n(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_UTF_7
#define sjis2utf8n(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_UTF_8
; other char code -> SJIS
#define ctype eucjp2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_EUC_JP, CODEPAGE_S_JIS)
#define ctype jis2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_JIS, CODEPAGE_S_JIS)
#define ctype utf7n2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_UTF_7, CODEPAGE_S_JIS)
#define ctype utf8n2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_UTF_8, CODEPAGE_S_JIS)
////////////////////////////////match
#uselib"kernel32.dll"
#cfunc global IsDBCSLeadByteEx "IsDBCSLeadByteEx" int,int
#define global ctype MB1(%1) IsDBCSLeadByteEx(0,%1)
#module
#defcfunc match str buf1_,str buf2_
buf1=buf1_
buf2=buf2_
buf3=""
hyoka=0
index=0
count=0
data_(3)=0
data_(2)=0
data_(1)=0
data_(0)=0
while(1)
while(1)
data=peek(buf1,index)
if(MB1(data)){
pre_index=index
data_(count)=peek(buf1,index)
index+
count+
data_(count)=peek(buf1,index)
index+
count+
}else{
pre_index=index
data_(count)=peek(buf1,index)
index+
count+
}
if(count>=3){
buf3=strf("%c",data_(0))+strf("%c",data_(1))+strf("%c",data_(2))+strf("%c",data_(3))
data_(3)=0
data_(2)=0
data_(1)=0
data_(0)=0
count=0
_break
}
wend
index=pre_index
// mes buf3
if(instr(buf2,0,buf3)>=0){
hyoka+
}
if peek(buf1,index)=0:_break
wend
return hyoka
#global
//////////////////////////match
#include "hspsock.as"
onexit *exit
goto *hi
*exit
sockclose SockId
end
*hi
/////定数/////////////////////////////
ServerName="irc.freenode.net"
Port=6667
NickName=""
ChannelName="#hspDwiki_TEST"
CloseMessage="Leaving..."
MainWindowSize=400+6+21
/////変数初期化///////////////////////
Command=""
InputData=""
Message=""
SockId=0
sdim StringsData,65536
sdim GetData,1024
sdim send_data,1024
sdim aidata,256*256
sdim nowgetdata,1024
sdim gyodata,1024
notesel aidata
exist "aigakushu.txt"
if strsize=-1{
notesave "aigakushu.txt"
}
noteload "aigakushu.txt"
/////ウィンドウ・オブジェクト配置/////
screen 3,300,12+21+19+6+21+12,2
syscolor 15
boxf
color
sysfont 17
pos 12,12
mes "チャンネル名"
pos ,12+21
objsize 300-24,19
input ChannelName
pos 300-12-88,12+21+19+6
objsize 88,21
button gosub "OK",*join
screen 4,300,12+21+19+6+21+12,2
syscolor 15
boxf
color
sysfont 17
pos 12,12
mes "切断メッセージ"
pos ,12+21
objsize 300-24,19
input CloseMessage
pos 300-12-88,12+21+19+6
objsize 88,21
button gosub "OK",*part
screen 5,300,12+21+19+6+21+19+6+21+21+6+21+12+21+6,2
syscolor 15
boxf
color
sysfont 17
pos 12,12
mes "接続サーバ"
pos ,12+21
objsize 300-24,19
input ServerName
pos ,12+21+19+6
mes "ポート"
pos ,12+21+19+6+21
objsize 300-24,19
input Port
pos ,12+21+19+6+21+19+6
mes "ユーザー名"
pos ,12+21+19+6+21+19+6+21
objsize 300-24,19
input NickName
pos 300-12-88,12+21+19+6+21+19+6+21+21+6
objsize 88,21
button "OK",*session
screen 0,640,MainWindowSize+6+21
syscolor 15
boxf
color
sysfont 17
pos 12,12
objsize 88,21
button gosub "LOGIN",*session_req
pos 12+88+6,12
objsize 88,21
button gosub "JOIN",*join_req
pos 12+88+6+88+6,12
objsize 88,21
button gosub "PART",*part_req
pos 12,12+21+6
objsize 640-24,MainWindowSize-12-21-6-6-21-12
mesbox StringsData,,,4
Hmesbox=stat
pos 12,MainWindowSize-12-21
objsize 640-88-24-6,21
input InputData
Hinput=stat
pos 640-88-12,MainWindowSize-12-21
objsize 88,21
button gosub "OK",*talk
pos 640-88-12,MainWindowSize-12-21+6+21
objsize 88,21
button gosub "学習OFF",*gaku
gakuid=stat
pos 640-88-12-6-88,MainWindowSize-12-21+6+21
objsize 88,21
button gosub "発言OFF",*hatu
hatuid=stat
stop
*gaku
ai xor 1
if ai:objprm gakuid,"学習ON":else:objprm gakuid,"学習OFF"
return
*hatu
ht xor 1
if ht:objprm hatuid,"発言ON":else:objprm hatuid,"発言OFF"
return
/////データチェック///////////////////
*main
repeat
sockcheck SockID
stat_=stat
if stat_=0{
gsel 0
sockget GetData,1024,SockID
get_data=utf8n2sjis(GetData)
StringsData+=get_data+"\n"
objprm Hmesbox,StringsData
sendmsg objinfo(Hmesbox,2),0xb6,0,65536
if(instr(get_data,0,"PRIVMSG")>=0){
if(ai){
if(1){
nowgetdata=strmid(get_data,instr(get_data,instr(get_data,0,"PRIVMSG"),":")+instr(get_data,0,"PRIVMSG")+1,strlen(get_data)-instr(get_data,instr(get_data,0,"PRIVMSG"),":")-instr(get_data,0,"PRIVMSG")-1)
if(ht){
notesel aidata
count=0
maxmatch=0
while(1)
if(count>=notemax-1):_break
noteget gyodata,count
// dialog "1: "+gyodata
// dialog "2: "+nowgetdata
// dialog "3: "+match(gyodata,nowgetdata)
if match(gyodata,nowgetdata)>=maxmatch{
maxmatch=match(gyodata,nowgetdata)
maxmatchgyo=count
}
count+
wend
// dialog "4: "+maxmatch
if 1.0*maxmatch/strlen(nowgetdata)>=0.3:noteget gyodata,maxmatchgyo+1:{
if(rnd(100)>60){
gosub *aitalk
}
}
}
aidata+=nowgetdata
notesel aidata
notesave "aigakushu.txt"
}
}
}
}
wait 1
loop
/////コマンド送信////////////////////
*enter
send_buf=""+Message+""+Command+"\n"
sjis2utf8n send_data,send_buf
sockput send_data,SockId
StringsData+=""+Message+""+Command+"\n\n"
objprm Hmesbox,StringsData
sendmsg objinfo(Hmesbox,2),0xb6,0,65536
Message=""
return
*talk
Message="PRIVMSG "+ChannelName+" :"
Command=InputData
gosub *enter
objprm Hinput,""
return
*aitalk
Message="NOTICE "+ChannelName+" :"
Command=gyodata
gosub *enter
return
*join_req
gsel 3,1
return
*join
gsel 3,-1
gsel 0
Message="JOIN "+ChannelName
Command=""
gosub *enter
objprm Hinput,""
return
*part_req
gsel 4,1
return
*part
gsel 4,-1
gsel 0
Message="PART "+ChannelName+" :"
Command=CloseMessage
gosub *enter
objprm Hinput,""
return
*session_req
gsel 5,1
return
*session
gsel 5,-1
gsel 0
if once:sockclose SockId
sockopen SockId,ServerName,Port
sockput "USER username host server real\n",SockId
sockput "NICK "+NickName+"\n",SockId
once=1
goto *main
機械語をそのまま打ち込むプログラミング言語
uselib "user32.dll"
efunc MessageBoxA
func main{
38 A8 B2 6D
F3 C1 79 DG
[loop_start] //ラベル
5b 75 82 c1
75 05 [@loop_start]
// 75 05 ・・・ JNZ [@loop_start] loop_startにある一定の条件でジャンプ
FF 25(@MessageBoxA)
//間接絶対naerコール
E8(@kkk)
//普通のnearコール
}
func kkk{
4b cc 48 a2
}
こんな感じの言語ってどうだろうか。言語としての機能はAPIのサポート。関数。ラベル
コンパイラというよりはEXEのデータ構造に準拠したファイルを生成する訓練にはなるかなー
efunc MessageBoxA
func main{
38 A8 B2 6D
F3 C1 79 DG
[loop_start] //ラベル
5b 75 82 c1
75 05 [@loop_start]
// 75 05 ・・・ JNZ [@loop_start] loop_startにある一定の条件でジャンプ
FF 25(@MessageBoxA)
//間接絶対naerコール
E8(@kkk)
//普通のnearコール
}
func kkk{
4b cc 48 a2
}
こんな感じの言語ってどうだろうか。言語としての機能はAPIのサポート。関数。ラベル
コンパイラというよりはEXEのデータ構造に準拠したファイルを生成する訓練にはなるかなー
2010年3月27日土曜日
IRCリーバシ改良版
一気に文字列を送りつけると送信元と受信側で表示にラグが発生するので
間隔をあけて送信するようにしました。
あと色付けするとその分送る文字数が増えるので 軽くするために色はありません。
間隔をあけて送信するようにしました。
あと色付けするとその分送る文字数が増えるので 軽くするために色はありません。
var turn=0;//0黒 1 白 ターン
var data = new Array(8*8);
var data2 = new Array(8*8);
var channel_g;
var end=0;
var timer_id;
function event::onChannelText(prefix, channel, text){
channel_g=channel;
if(text.match(/^#/i)){
cmd=""+text.match(/[a-z]+$/i);
var ddd=text.match(/(\d)/g);
if(ddd!=null){
x=ddd[0];
y=ddd[1];
if(end==1){
send(channel,"<color navy,silver><ゲームを再開してください>");
return(0);
}
if(x>8||x==0||y>8||y==0){
send(channel,"<color navy,silver><不正な入力です>");
}else{
if(putable(x-1,y-1)==0){
send(channel,"<color navy,silver><そこには打てません>");
}else{
copyArr12();
put(x-1,y-1);
turnChange()
if(numberOfPutable()==0){
turnChange()
if(numberOfPutable()==0){
if(black_n()>white_n()){
send(channel,"<color navy,silver><黒の勝ち>");
}
if(black_n()<white_n()){
send(channel,"<color navy,silver><白の勝ち>");
}
if(black_n()==white_n()){
send(channel,"<color navy,silver><引き分け>");
}
draw();
end=1;
return(0);
}else{
send(channel,"<color navy,silver><打つ手がないのでパス>");
}
}
draw();
}
}
}
if(cmd!=null){
if(cmd.search(/^new$/i)!=-1){
send(channel,"<color navy,silver><ゲームを開始します>");
newGame();
draw();
end=0;
}
if(cmd.search(/^debug$/i)!=-1){
send(channel,"<color navy,silver><デバッグを開始します>");
newGame();
debug();
draw();
end=0;
}
if(cmd.search(/^matta$/i)!=-1){
if(matta_ok==1){
send(channel,"<color navy,silver><\"待った\"しました>");
copyArr21();
turnChange()
draw();
end=0;
matta_ok=0;
}else{
send(channel,"<color navy,silver><\"待った\"できません>");
}
}
}
}
}
function newGame(){
turn=0;
for(ix=0;ix<8;ix++){
for(iy=0;iy<8;iy++){
data[(ix)*8+(iy)] = 0;
}
}
data[(3)*8+(3)]=1; //1黒?
data[(4)*8+(4)]=1; //2白
data[(4)*8+(3)]=2;
data[(3)*8+(4)]=2;
}
var strbuf = new Array(8);
function draw(){
send(channel_g,"<color>....1..2..3..4..5..6..7..8 ←X Y↓ 書式 #X Y");
for(iy=0;iy<8;iy++){
str="";
str+=""+(iy+1);
for(ix=0;ix<8;ix++){
if(data[(ix)*8+(iy)]==0){
if(putable(ix,iy)==0){
str+=""+"..・";
}else{
str+=""+"*"
}
}
if(data[(ix)*8+(iy)]==1){
str+=""+"●";
}
if(data[(ix)*8+(iy)]==2){
str+=""+"○";
}
}
if(iy==5){
str+=" balck "+black_n();
}
if(iy==6){
str+=" white "+white_n();
}
if(iy==7){
if(turn==0){
str+=" 黒の番です";
}else{
str+=" 白の番です";
}
}
//send(channel_g,str);
strbuf[iy]=str;
}
timer_id=setTimeout(myTimer,2200);
}
var ixxx=0;
function myTimer(){
send(channel_g,strbuf[ixxx]);
ixxx++;
if(ixxx==9){
ixxx=0;
}else{
timer_id=setTimeout(myTimer,2200);
}
}
function black_n(){
amount=0;
for(i=0;i<64;i++){
if(data[i]==1){
amount++;
}
}
return(amount);
}
function white_n(){
amount=0;
for(i=0;i<64;i++){
if(data[i]==2){
amount++;
}
}
return(amount);
}
function putable(x,y){
rr=0;
if(data[(x)*8+(y)]==0){
if(turn==0){
a1=2;
a2=1;
}else{
a1=1;
a2=2;
}
if(x!=0&&y!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y-m)]==a1){
a=1;
}
if(data[(x-m)*8+(y-m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x-m)*8+(y-m)]==0){
break;
}
if(x-m==0||y-m==0){
break;
}
m++;
}
}
if(y!=0){
m=1;
a=0;
while(1){
if(data[(x)*8+(y-m)]==a1){
a=1;
}
if(data[(x)*8+(y-m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x)*8+(y-m)]==0){
break;
}
if(y-m==0){
break;
}
m++;
}
}
if(x!=7&&y!=0){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y-m)]==a1){
a=1;
}
if(data[(x+m)*8+(y-m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x+m)*8+(y-m)]==0){
break;
}
if(x+m==7||y-m==0){
break;
}
m++;
}
}
if(x!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y)]==a1){
a=1;
}
if(data[(x+m)*8+(y)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x+m)*8+(y)]==0){
break;
}
if(x+m==7){
break;
}
m++;
}
}
if(x!=7&&y!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y+m)]==a1){
a=1;
}
if(data[(x+m)*8+(y+m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x+m)*8+(y+m)]==0){
break;
}
if(x+m==7||y+m==7){
break;
}
m++;
}
}
if(y!=7){
m=1;
a=0;
while(1){
if(data[(x)*8+(y+m)]==a1){
a=1;
}
if(data[(x)*8+(y+m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x)*8+(y+m)]==0){
break;
}
if(y+m==7){
break;
}
m++;
}
}
if(x!=0&&y!=7){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y+m)]==a1){
a=1;
}
if(data[(x-m)*8+(y+m)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x-m)*8+(y+m)]==0){
break;
}
if(x-m==0||y+m==7){
break;
}
m++;
}
}
if(x!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y)]==a1){
a=1;
}
if(data[(x-m)*8+(y)]==a2){
if(a==1){rr=1;}
break;
}
if(data[(x-m)*8+(y)]==0){
break;
}
if(x-m==0){
break;
}
m++;
}
}
}
return(rr);
}
function put(x,y){
if(turn==0){
a1=2;
a2=1;
}else{
a1=1;
a2=2;
}
if(x!=0&&y!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y-m)]==a1){
a=1;
}
if(data[(x-m)*8+(y-m)]==a2){
if(a==1){lineChange(x,y,x-m,y-m);}
break;
}
if(data[(x-m)*8+(y-m)]==0){
break;
}
if(x-m==0||y-m==0){
break;
}
m++;
}
}
if(y!=0){
m=1;
a=0;
while(1){
if(data[(x)*8+(y-m)]==a1){
a=1;
}
if(data[(x)*8+(y-m)]==a2){
if(a==1){lineChange(x,y,x,y-m);}
break;
}
if(data[(x)*8+(y-m)]==0){
break;
}
if(y-m==0){
break;
}
m++;
}
}
if(x!=7&&y!=0){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y-m)]==a1){
a=1;
}
if(data[(x+m)*8+(y-m)]==a2){
if(a==1){lineChange(x,y,x+m,y-m);}
break;
}
if(data[(x+m)*8+(y-m)]==0){
break;
}
if(x+m==7||y-m==0){
break;
}
m++;
}
}
if(x!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y)]==a1){
a=1;
}
if(data[(x+m)*8+(y)]==a2){
if(a==1){lineChange(x,y,x+m,y);}
break;
}
if(data[(x+m)*8+(y)]==0){
break;
}
if(x+m==7){
break;
}
m++;
}
}
if(x!=7&&y!=7){
m=1;
a=0;
while(1){
if(data[(x+m)*8+(y+m)]==a1){
a=1;
}
if(data[(x+m)*8+(y+m)]==a2){
if(a==1){lineChange(x,y,x+m,y+m);}
break;
}
if(data[(x+m)*8+(y+m)]==0){
break;
}
if(x+m==7||y+m==7){
break;
}
m++;
}
}
if(y!=7){
m=1;
a=0;
while(1){
if(data[(x)*8+(y+m)]==a1){
a=1;
}
if(data[(x)*8+(y+m)]==a2){
if(a==1){lineChange(x,y,x,y+m);}
break;
}
if(data[(x)*8+(y+m)]==0){
break;
}
if(y+m==7){
break;
}
m++;
}
}
if(x!=0&&y!=7){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y+m)]==a1){
a=1;
}
if(data[(x-m)*8+(y+m)]==a2){
if(a==1){lineChange(x,y,x-m,y+m);}
break;
}
if(data[(x-m)*8+(y+m)]==0){
break;
}
if(x-m==0||y+m==7){
break;
}
m++;
}
}
if(x!=0){
m=1;
a=0;
while(1){
if(data[(x-m)*8+(y)]==a1){
a=1;
}
if(data[(x-m)*8+(y)]==a2){
if(a==1){lineChange(x,y,x-m,y);}
break;
}
if(data[(x-m)*8+(y)]==0){
break;
}
if(x-m==0){
break;
}
m++;
}
}
}
function lineChange(x1,y1,x2,y2){
if(turn==0){
a=1;
}else{
a=2;
}
mx=0
my=0
while(1){
data[(x1+mx)*8+(y1+my)]=a;
if(x2==x1+mx&&y2==y1+my){break;}
if(x2-x1>0){mx++;}
if(x2-x1<0){mx--;}
if(y2-y1>0){my++;}
if(y2-y1<0){my--;}
}
}
function numberOfPutable(){
amount=0;
for(ix=0;ix<8;ix++){
for(iy=0;iy<8;iy++){
if(putable(ix,iy)==1){amount++;}
}
}
//send(channel_g,""+amount);
return(amount);
}
function turnChange(){
if(turn==0){
turn=1;
}else{
turn=0;
}
}
matta_ok=0;
function copyArr12(){
matta_ok=1;
for(i=0;i<64;i++){
data2[i]=data[i];
}
}
function copyArr21(){
for(i=0;i<64;i++){
data[i]=data2[i];
}
}
function debug(){
data[0]=2;
data[1]=2;
data[2]=2;
data[3]=2;
data[4]=2;
data[5]=2;
data[6]=2;
data[7]=2;
data[8]=1;
data[9]=2;
data[10]=1;
data[11]=2;
data[12]=2;
data[13]=1;
data[14]=0;
data[15]=0;
data[16]=1;
data[17]=1;
data[18]=2;
data[19]=1;
data[20]=1;
data[21]=1;
data[22]=1;
data[23]=1;
data[24]=1;
data[25]=1;
data[26]=1;
data[27]=2;
data[28]=1;
data[29]=2;
data[30]=2;
data[31]=2;
data[32]=1;
data[33]=1;
data[34]=2;
data[35]=1;
data[36]=2;
data[37]=2;
data[38]=2;
data[39]=2;
data[40]=1;
data[41]=1;
data[42]=1;
data[43]=1;
data[44]=1;
data[45]=2;
data[46]=2;
data[47]=1;
data[48]=1;
data[49]=1;
data[50]=2;
data[51]=2;
data[52]=2;
data[53]=2;
data[54]=2;
data[55]=0;
data[56]=1;
data[57]=1;
data[58]=1;
data[59]=1;
data[60]=1;
data[61]=1;
data[62]=1;
data[63]=0;
}
2010年3月22日月曜日
ケン○ッキーフライドチキンを作ってみた。
http://blog.livedoor.jp/knjymmt/archives/14568371.html
http://2chcopipe.blog122.fc2.com/blog-entry-3752.html
http://www.lifehacker.jp/2009/07/090728kfc.html
以上のサイトを参考にしてケン○ッキーフライドチキンを作ってみました。
ショートニングは使いませんでした。油を捨てたくなかったので。
香辛料をそろえるが面倒でした。
バジル オレガノは粉末が手に入らなくてみじん切り(?)程度のと
ガーリックはあらびきでした。
香辛料は
黒コショウ
ナツメグ
オールスパイス
バジル
オレガノ
パプリカ
チリペッパー
ガーリック
ジンジャー
タイム
を使ってみました。
しかしうまくいかず。。。
ただのから揚げになってしまいました
何かしらの香辛料の匂いはするんですが ケン○ッキーとは程遠く。。。
パウダー じゃなかったのが原因でしょうか・・・?
http://2chcopipe.blog122.fc2.com/blog-entry-3752.html
http://www.lifehacker.jp/2009/07/090728kfc.html
以上のサイトを参考にしてケン○ッキーフライドチキンを作ってみました。
ショートニングは使いませんでした。油を捨てたくなかったので。
香辛料をそろえるが面倒でした。
バジル オレガノは粉末が手に入らなくてみじん切り(?)程度のと
ガーリックはあらびきでした。
香辛料は
黒コショウ
ナツメグ
オールスパイス
バジル
オレガノ
パプリカ
チリペッパー
ガーリック
ジンジャー
タイム
を使ってみました。
しかしうまくいかず。。。
ただのから揚げになってしまいました
何かしらの香辛料の匂いはするんですが ケン○ッキーとは程遠く。。。
パウダー じゃなかったのが原因でしょうか・・・?
2010年2月7日日曜日
IRCのfreenodeにおけるNickServ ChanServ について
● 登録したいニックネームでIRCに接続
● NICKへ登録
/nickserv register ログインパス 自分のメールアドレス
するとメールが送られてきてその指示に従う
● ログイン
/nickserv identify ログインパス
● チャンネルに入ります。(自分が作った 誰かが既に作ったのは無理)
そこでチャンネルを登録
/chanserv register #チャンネル名
● ChanServを常駐させたいとき
/chanserv set #チャンネル名 guard on
● ChanServを常駐を解除させたいとき
/chanserv set #チャンネル名 guard off
● 管理ユーザーを増やす(チャンネルを作った人は最初から管理ユーザー)
/chanserv access #チャンネル名 add [追加したいメンバ] [権限]
例
/chanserv access #aaa add takahashi +votsriRfAF
+votsriRfAFは最高権限
● 管理ユーザーから消す
/chanserv access #チャンネル名 del [追加したいメンバ] [権限]
● 管理ユーザーの一覧を表示する
/chanserv access #チャンネル名 list
● オペレータになる
/chanserv op #チャンネル名
● NICKへ登録
/nickserv register ログインパス 自分のメールアドレス
するとメールが送られてきてその指示に従う
● ログイン
/nickserv identify ログインパス
● チャンネルに入ります。(自分が作った 誰かが既に作ったのは無理)
そこでチャンネルを登録
/chanserv register #チャンネル名
● ChanServを常駐させたいとき
/chanserv set #チャンネル名 guard on
● ChanServを常駐を解除させたいとき
/chanserv set #チャンネル名 guard off
● 管理ユーザーを増やす(チャンネルを作った人は最初から管理ユーザー)
/chanserv access #チャンネル名 add [追加したいメンバ] [権限]
例
/chanserv access #aaa add takahashi +votsriRfAF
+votsriRfAFは最高権限
● 管理ユーザーから消す
/chanserv access #チャンネル名 del [追加したいメンバ] [権限]
● 管理ユーザーの一覧を表示する
/chanserv access #チャンネル名 list
● オペレータになる
/chanserv op #チャンネル名
2010年1月4日月曜日
コマンドライン引数の取得について
実行形式には
IMAGE_SUBSYSTEM_UNKNOWN 未知のサブシステム
IMAGE_SUBSYSTEM_NATIVE デバイスドライバとからしい
IMAGE_SUBSYSTEM_WINDOWS_GUI GUI
IMAGE_SUBSYSTEM_WINDOWS_CUI CUI
IMAGE_SUBSYSTEM_POSIX_CUI PosixのCUI(?)
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI Windows CEのGUI
があるわけですが
まぁ
EXEはコマンドライン引数を取得することができます。
C言語では
CUI
int main(int argc,char *argv[])
{
return 0;
}
GUI
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, //コマンドライン文字列
int nCmdShow
) {
return 0;
}
とまぁ なっているわけですよね
メイン関数の引数としてコマンドライン引数が取得できるわけなんですが、
ただメイン関数の引数は 普通の関数の引数とは仕組みがちょいと違うんですわな(たぶん)
普通の関数はスタックに積まれているデータを引数として使うんですが、
メインの引数はスタックにあるわけでなくてちょっと違った場所にあるらしい、、、
MS-DOS時代は PSP(program segment prefix)というとこにあったらしい。
Win32ではどのようになっているのか良くわからなかったのだが、PSPはまだ健在らしい・・・?
http://yasu.asuka.net/docs/tsr/
ここによると健在のような。。。
私が持っている書籍によると(高級言語プログラマのためのアセンブラ入門 ソフトバンククリエイティブ株式会社 http://www.amazon.co.jp/%E9%AB%98%E7%B4%9A%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9%E5%85%A5%E9%96%80-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797332816 p424~425)
起動直後のDSレジスタにPSPの領域の先頭アドレスがあるとかないとか。。。
GetCommandLine()という関数で取得も可能なのだが。。。
まぁ要するに アセンブラレベルで CUI GUI ともに コマンドラインとかインスタンスとか取得するにはどうすればいいのかーー!! と格闘してます っよっと
IMAGE_SUBSYSTEM_UNKNOWN 未知のサブシステム
IMAGE_SUBSYSTEM_NATIVE デバイスドライバとからしい
IMAGE_SUBSYSTEM_WINDOWS_GUI GUI
IMAGE_SUBSYSTEM_WINDOWS_CUI CUI
IMAGE_SUBSYSTEM_POSIX_CUI PosixのCUI(?)
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI Windows CEのGUI
があるわけですが
まぁ
EXEはコマンドライン引数を取得することができます。
C言語では
CUI
int main(int argc,char *argv[])
{
return 0;
}
GUI
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, //コマンドライン文字列
int nCmdShow
) {
return 0;
}
とまぁ なっているわけですよね
メイン関数の引数としてコマンドライン引数が取得できるわけなんですが、
ただメイン関数の引数は 普通の関数の引数とは仕組みがちょいと違うんですわな(たぶん)
普通の関数はスタックに積まれているデータを引数として使うんですが、
メインの引数はスタックにあるわけでなくてちょっと違った場所にあるらしい、、、
MS-DOS時代は PSP(program segment prefix)というとこにあったらしい。
Win32ではどのようになっているのか良くわからなかったのだが、PSPはまだ健在らしい・・・?
http://yasu.asuka.net/docs/tsr/
ここによると健在のような。。。
私が持っている書籍によると(高級言語プログラマのためのアセンブラ入門 ソフトバンククリエイティブ株式会社 http://www.amazon.co.jp/%E9%AB%98%E7%B4%9A%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9%E5%85%A5%E9%96%80-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797332816 p424~425)
起動直後のDSレジスタにPSPの領域の先頭アドレスがあるとかないとか。。。
GetCommandLine()という関数で取得も可能なのだが。。。
まぁ要するに アセンブラレベルで CUI GUI ともに コマンドラインとかインスタンスとか取得するにはどうすればいいのかーー!! と格闘してます っよっと
登録:
投稿 (Atom)