본문 바로가기
어셈블리어 공부용/x86 어셈블리어(ASSEMBLY)

emu8086으로 어셈블리어연습 [비디오램에 직접 접근 하여 테트리스 미노 그리기]

by Redoutable 2019. 8. 18.
반응형
BLUE EQU 11h   ;EQU 어셈블리어 명령어는 고급언어에서 변수선언이랑 비슷하다고 보시면 됩니다.
GREEN EQU 22h  ;즉 GREEN 을 오퍼랜드 자리에두면 실제로는 22h가 입력되는겁니다.
CYAN EQU 33h
RED EQU 44h
PINK EQU 55h
ORGE EQU 66h
GARAY EQU 77h
BLOCK EQU 20h 

.MODEL SMALL
.CODE
ORG 100h

PROG:
              ;메인루틴
    CALL MAIN ;이건 메인프로시저        
    CALL DISPCLR      
    
    MOV CORTYPE,BLUE   ;(J미노)
    MOV SI,0          
    MOV CX,2          
    CALL BLOCK        
    
    MOV SI,160
    MOV CX,6
    CALL BLOCK
    
    MOV CORTYPE,ORGE   ;(L미노)
    MOV SI,176
    MOV CX,6
    CALL BLOCK
    
    MOV SI,24
    MOV CX,2
    CALL BLOCK
    
    MOV CORTYPE,PINK   ;(T미노)
    MOV SI,36
    MOV CX,2
    CALL BLOCK
    
    MOV SI,192
    MOV CX,6
    CALL BLOCK
     
    MOV CORTYPE,RED   ;(Z미노)
    MOV SI,48
    MOV CX,4
    CALL BLOCK
    
    MOV SI,212
    MOV CX,4
    CALL BLOCK
    
    MOV CORTYPE,GREEN  ;(S미노)
    MOV SI,68
    MOV CX,4
    CALL BLOCK
    
    MOV SI,224
    MOV CX,4
    CALL BLOCK
    
    MOV CORTYPE,CYAN   ;(O미노)
    MOV SI,80
    MOV CX,4
    CALL BLOCK
         
    MOV SI,240
    MOV CX,4
    CALL BLOCK
    
    MOV CORTYPE,GARAY ;(I미노)
    MOV SI,252
    MOV CX,8
    CALL BLOCK
   
    INT 20h            ;도스로 돌아가기

;--------------------------
MAIN PROC NEAR         ;MAIN 프로시저. (컴퓨터가 흑백인지 컬러인지 구분. 사실상 필요는없음.)
    
    MOV AX,0                      
    MOV ES,AX
    MOV AL,ES:[449h]
    
    CMP AL,7 ;NOT COR
    JE HERC
    
VGA:
    MOV AX,0B800h
    MOV ES,AX
    JMP ENND
    
HERC:
    MOV AX,0B000h
    MOV ES,AX
    
ENND:
    RET                  ;메인루틴으로 돌아가기    
    
MAIN ENDP 

;--------------------
DISPCLR PROC NEAR       ;DISPCLR 프로시저 (화면을 싹 다지움.)

    ;CLR DISP    
    MOV AH,6
    MOV AL,0
    
    MOV CH,0
    MOV CL,0
    
    MOV DH,25
    MOV DL,80
    
    MOV BH,0
    INT 10h
     
    RET                    ;메인루틴으로 돌아가기
    
DISPCLR ENDP
      
;--------------------
        
BLOCK PROC NEAR            ;BLOCK프로시저 (미노 출력하는곳)
    
    MOV BL,CORTYPE
            
BLOCKDRAW1:
    MOV BYTE PTR ES:[SI],BLOCK
    INC SI
    MOV BYTE PTR ES:[SI],BL
    INC SI
    
    LOOP BLOCKDRAW1
    
    RET                     ;메인루틴으로 돌아가기
BLOCK ENDP

CORTYPE DB 0

END PROG

 

 

비디오램에 직접 접근해서 미노들을 출력했습니다.

주석으로 설명을 하자니 코드가 상당히 난잡해질까봐 그냥 적지않았습니다. (관련내용이 복잡해서...)

어셈블리어로 그래픽하지 말라는 이유를 몸소 깨닫는 좋은(?) 시간이었습니다.

코드에 대해서 간략하게 설명해보자면,

메인루틴에서 그리고자하는 도형의 데이터를 입력한다음에

BLOCK 프로시저를 불러서 그리게 하는 겁니다.

이렇게하면 메인루틴에 BLOCK 프로시저에 인도할 데이터만 추가하고

BLOCK프로시저를 부르기만 하면 되니까 보기 더 깔끔한것 같습니다.

반응형

댓글