V7/usr/src/games/chess/wmove.s
.globl _wmove, _wremove
.globl _board, _pval, _amp, _flag, _eppos, _value, _wkpos
.globl _game
_wmove:
mov _amp,r4
movb 2(sp),r3 / to
movb 3(sp),r2 / from
mov _value,(r4)+
mov _flag,(r4)+
mov _eppos,(r4)+
mov r2,(r4)+
mov r3,(r4)+
asl r2 / from as a word index
asl r3 / to as word index
mov _board(r3),r0
mov r0,(r4)+
beq 1f
asl r0
sub _pval+12.(r0),_value
1:
mov _board(r2),r0
mov r0,_board(r3)
clr _board(r2)
mov $-1,_eppos
asl r0
bge error
jmp *0f(r0) / type of man
kmove
qmove
rmove
bmove
nmove
pmove
0:
error:
3
pmove:
sub r3,r2
bge 1f
neg r2
1:
cmp r2,$2*1 / ep capture
bne 1f
clr _board(r3)
mov $-1,_board-16.(r3)
mov $4,(r4)+
mov r4,_amp
rts pc
1:
cmp r2,$2*16. / double move
bne 1f
movb 3(sp),r2
sub $8,r2
mov r2,_eppos
br move
1:
cmp r3,$24.*2
bge move
sub $25.,_value
cmp r3,$16.*2
bge move
sub $50.,_value
cmp r3,$8.*2 / queen promotion
bge move
sub $625.,_value
mov $-5,_board(r3)
mov $5,(r4)+
mov r4,_amp
rts pc
rmove:
cmp r2,$2*63.
bne 1f
bic $1,_flag
br move
1:
cmp r2,$2*56.
bne move
bic $2,_flag
br move
kmove:
asr r3
mov r3,_wkpos
bic $3,_flag
cmp r2,$2*60.
bne 2f
cmp r3,$62. / kingside castle
bne 1f
dec _value
mov $-4,_board+[2*61.]
clr _board+[2*63.]
mov $2,(r4)+
mov r4,_amp
rts pc
1:
cmp r3,$58. / queenside castle
bne 2f
dec _value
mov $-4,_board+[2*59.]
clr _board+[2*56.]
mov $3,(r4)+
mov r4,_amp
rts pc
2: / king move
tst _game
bne 1f
add $2,_value
1:
clr (r4)+
mov r4,_amp
rts pc
qmove:
tst _game
bne move
inc _value
br move
nmove:
bmove:
move:
mov $1,(r4)+
mov r4,_amp
rts pc
_wremove:
mov _amp,r4
mov -(r4),r0
mov -(r4),r1
mov -(r4),r3
mov -(r4),r2
mov -(r4),_eppos
mov -(r4),_flag
mov -(r4),_value
mov r4,_amp
asl r2
asl r3
mov _board(r3),_board(r2)
mov r1,_board(r3)
asl r0
jmp *0f(r0)
0:
movek
movex
moveo
moveoo
movep
moveq
movek:
asr r2
mov r2,_wkpos
movex:
rts pc
moveo:
mov $-4,_board+[2*63.]
clr _board+[2*61.]
mov $60.,_wkpos
rts pc
moveoo:
mov $-4,_board+[2*56.]
clr _board+[2*59.]
mov $60.,_wkpos;
rts pc
movep:
mov $-1,_board(r2)
clr _board-[2*8.](r3)
rts pc
moveq:
mov $-1,_board(r2)
rts pc