?? 積木.asm
字號:
data SEGMENT
partbc = 0100b;
partfc = 0000b;
poolfc = 0111b;
poolbc = 0000b;
spoolbc = 0100b;
spoolfc = 0111b
rectw = 9
poolh = 20;
poolw = 10;
spart STRUC
k DB -1
rs DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
x DB 0
y DB 0
spart ENDS
;---------------------
part0 spart <-1>
part1 spart <-1>
part2 spart <-1>
part3 spart <-1>
parts spart <0, 1,0, 0,1, 1,1, 4,0>
parts1 spart <1, -1,0, 1,0, 0,1, 4,0>
parts2 spart <2, -1,0, 1,0, 1,1, 4,0>
parts3 spart <3, -1,0, 1,0,1,1, 4,0>
parts4 spart <4, -1,0, 0,1, 1,1, 4,0>
parts5 spart <5, -1,0, 0,1, 1,1, 4,0>
parts6 spart <6, -1,0, 1,0, 2,0, 4,0>
parts7 spart <7, 0,1, 0,2, 0,3, 4,0>
map DW poolh DUP(0),0
count DB 0
hints DB 11,24,'=rotate ',25,'=rotate ',26,'=right ',27,'=left'
DB ' SPACE=speedup ESC=exit$'
;noteadd DW ?
ess DW ?
bxx DW ?
lowest DB 0 ;no.of map
nrandax DB ?
stepval DB 19
key DB -1
DB -1
_px = 245 ;
_py = 100 ;
_spx = 432 ;
_spy = 99;
_lpx = 179
_lpy = 100
data ENDS
;**********************************************
code SEGMENT
;--------------------------------------
ptos MACRO ppx,ppy,ssx,ssy
PUSH AX
PUSH BX
MOV AL, ppx
MOV BL, rectw
IMUL BL
ADD AX, _px
MOV ssx, AX
MOV AL, ppy
MOV BL, rectw
IMUL BL
ADD AX, _py
MOV ssy, AX
POP BX
POP AX
ENDM
;--------------------------------------
initg MACRO mode
MOV AH,0
MOV AL,mode
INT 10h
;-----------
MOV AH,0bh
MOV BH,0
MOV BL,poolbc
INT 10h
;--------------
MOV AH,0bh
MOV BX,0100h
INT 10h
ENDM
;--------------------------------------
drawbar MACRO ww,hh,col
LOCAL verte,horie
MOV AX,col
MOV AH,0ch
SUB BX,BX
DEC CX
DEC DX
verte: INC BX
INC DX
PUSH BX
SUB BX,BX
horie: INC BX
INC CX
INT 10h
CMP BX,ww
JB horie
POP BX
SUB CX,ww
CMP BX,hh
JB verte
ENDM
;--------------------------------------
drawfra MACRO ww,hh,col
LOCAL htop,hbot,vrig,vlef
PUSH SI
PUSH DI
MOV SI,ww
MOV DI,hh
DEC SI
DEC DI
MOV AH, 0ch
MOV AL, col
SUB BX, BX
htop:INC BX
INC CX
INT 10h
CMP BX, SI
JB htop
SUB BX, BX
vrig:MOV AH,0ch
MOV AL,col
INC BX
INC DX
INT 10h
CMP BX, DI
JB vrig
SUB BX, BX
hbot:INC BX
DEC CX
INT 10h
CMP BX, SI
JB hbot
SUB BX, BX
vlef:INC BX
DEC DX
INT 10h
CMP BX, DI
JB vlef
POP DI
POP SI
ENDM
;------------------------------------------
modmapm MACRO nnn
LOCAL hamp1, hamp2, jmpadd3, jmpadd4, modmap, hampn
MOV DI, 0
MOV SI, 1
hamp2:MOV CL, BYTE PTR part&nnn[SI] ; x :col
CMP SI, 7
JE jmpadd3
ADD CL, part&nnn.x
jmpadd3:MOV BH, BYTE PTR part&nnn[SI+1] ; y :row
CMP SI, 7
JE jmpadd4
ADD BH, part&nnn.y
jmpadd4:MOV BL, poolh-1
SUB BL, BH
SUB BH, BH
SHL BL, 1
CMP BL, lowest
JNL modmap
MOV lowest, BL
modmap:
MOV AX, 1
SHL AX, CL
OR AX, map[BX]
MOV map[BX], AX
hampn:ADD SI, 2
CMP SI, 9
JL hamp2
ENDM
;mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
main PROC FAR
ASSUME CS:code, DS:data, ES:data
start:
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, data
MOV DS, AX
MOV ES, AX
initg 12H
CALL setirq
resta:CLI
MOV CX, _spx
MOV DX, _spy
CALL drawspo
MOV CX, _px
MOV DX, _py
CALL drawscr
CMP key[1], 1
JE endmain
;init data
MOV count, 0
SUB SI, SI
mapnt:MOV map[SI], 0 ;0 => map[]
ADD SI, 2
CMP SI, poolh*2
JNE mapnt
nostart:
CALL wreadk
MOV key, -1
MOV key[1], -1
MOV SI, OFFSET hints
CALL shownote
CALL pdnew
while1:
STI
CMP key, -1
JNE stepkey
MOV DL, count ;no key
CMP DL, stepval
JBE while1 ;not to time
MOV count, 0
stepkey:
CMP key, 1bh
JE endmain
CALL dealkey
CALL check
MOV AX, map[2*poolh-2]
MOV CL, 4
SHR AX, CL
JNC while1
JMP resta
endmain:
CALL quit
RET
main ENDP
;mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
setirq PROC NEAR
MOV AL, 1ch ;get irt vector
MOV AH, 35h
INT 21h
MOV ess, ES ;save irt vector
MOV bxx, BX
PUSH DS
MOV DX, OFFSET scankey ;irq function
MOV AX, SEG scankey
MOV DS, AX
MOV AL, 1ch
MOV AH, 25h
INT 21h
CLI
POP DS
IN AL, 21h ;set irq
AND AL, 0feh
OUT 21h,AL
RET
setirq ENDP
;-----------------------------
scankey PROC NEAR
PUSH AX
PUSH DS
MOV AX, data
MOV DS, AX
STI
rekeyy:ADD count, 1
CALL nwreadk
CMP key, -1
JE ireturn
ireturn:
CLI
MOV AL, 20h ;EOI
OUT 20h,AL
POP DS
POP AX
IRET
scankey ENDP
;-------------------------------------
wreadk PROC NEAR
MOV AH, 0
INT 16h
MOV key, AL ;ascii
MOV key[1], AH ;scan code
MOV AX, 0c00h
INT 21h
RET
wreadk ENDP
;-------------------------------------
nwreadk PROC NEAR
MOV AH, 1
INT 16h
JZ nokeyin
MOV key, AL ;ascii
MOV key[1], AH ;scan code
MOV AX, 0c00h
INT 21h
JMP endnwreadk
nokeyin:
MOV key, -1
MOV key[1], -1
endnwreadk:
RET
nwreadk ENDP
;-----------------------------------
shownote PROC NEAR
;coeff: si: str addr
;string must be end by '$'
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BH, 0
; MOV DX, noteadd
MOV CX, 1
MOV BL, [SI]
INC SI
ntcharr:MOV AH, 2
INC DX
INT 10h
;----------show str
MOV AH, 9
MOV AL, [SI]
CMP AL, '$'
JE endshnote
INT 10h
INC SI
JMP ntcharr
endshnote:
POP DX
POP CX
POP BX
POP AX
RET
shownote ENDP
;-----------------------------------
drawscr PROC NEAR
MOV CX, _px
MOV DX, _py
drawbar poolw*rectw,poolh*rectw,poolfc
MOV CX, _px-2
MOV DX, _py-2
MOV SI, poolw*rectw
MOV DI, poolh*rectw
dsag: ADD SI, 4
ADD DI, 4
drawfra SI,DI,partbc
SUB CX, 2
SUB DX, 2
CMP SI, poolw*rectw+20
JNE dsag
MOV CX,_lpx
MOV DX,_lpy
;;;;;drawbar rectw+6,rectw*poolh,poolfc
MOV CX, _lpx-1
MOV DX, _lpy-1
MOV SI, rectw+6
MOV DI, rectw*poolh
dlpool:ADD SI, 2
ADD DI, 2
;drawfra si,di,spoolbc
SUB CX, 1
SUB DX, 1
CMP SI, rectw+10
JNE dlpool
RET
drawscr ENDP
;--------------------------------------
drawspo PROC NEAR
MOV CX, _spx
MOV DX, _spy
drawbar 4*rectw+5,4*rectw+5,spoolfc
MOV CX, _spx-1
MOV DX, _spy-1
MOV SI, 4*rectw+5
MOV DI, 4*rectw+5
dssag: ADD SI, 2
ADD DI, 2
drawfra SI,DI,spoolbc
SUB CX, 1
SUB DX, 1
CMP SI, 4*rectw+11
JNE dssag
RET
drawspo ENDP
;--------------------------------------
drawrect PROC NEAR
PUSH CX
PUSH DX
PUSH BX
MOV BX, AX
ptos BL,BH,CX,DX
POP BX
PUSH BX
CMP BL, 0
JE erase
drawfra rectw,rectw,partbc
INC CX
INC DX
drawbar rectw-2,rectw-2,partfc
JMP enddr
erase:drawbar rectw,rectw,poolfc
enddr:POP BX
POP DX
POP CX
RET
drawrect ENDP
;--------------------------------------
drawpart PROC NEAR
PUSH AX
PUSH SI
MOV AL, part0.k
CMP AL, -1
JE drawp2
MOV SI, 0
MOV BL, 0
dp11:MOV AL, part0.rs[SI]
MOV AH, part0.rs[SI+1]
ADD AL, part0.x
ADD AH, part0.y
CALL drawrect
ADD SI, 2
CMP SI, 6
JB dp11
MOV AL, part0.rs[SI]
MOV AH, part0.rs[SI+1]
CALL drawrect
;-----------show part1
drawp2:MOV AL,part3.k
CMP AL,-1
JE drawp3
SUB SI, SI
MOV BL, 0
dp44:MOV AL, part3.rs[SI]
MOV AH, part3.rs[SI+1]
ADD AL, poolw+12
ADD AH, 0
CALL drawrect
ADD SI, 2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -