75 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
                ; get tetromino block
 | 
						|
getTetrisBlock  LD      xx              ; xx * 4
 | 
						|
                LSLW
 | 
						|
                LSLW
 | 
						|
                ADDI    xOffset         ; add origin
 | 
						|
                ST      xx
 | 
						|
 | 
						|
                LD      yy              ; yy * 4
 | 
						|
                LSLW
 | 
						|
                LSLW
 | 
						|
                ADDI    yOffset         ; add origin
 | 
						|
                ST      yy
 | 
						|
 | 
						|
                LDW     vbase           ; vram address
 | 
						|
                ADDW    xx
 | 
						|
                PEEK
 | 
						|
                STW     result          ; return pixel
 | 
						|
 | 
						|
                PUSH
 | 
						|
                CALL    playMidi
 | 
						|
                POP
 | 
						|
 | 
						|
                RET
 | 
						|
 | 
						|
 | 
						|
                ; checks a complete tetromino, result returns with 0x00 if no blocks are occupied or 0xFF if any blocks are occupied
 | 
						|
checkTetromino  GetTetrominoBase index rotation
 | 
						|
                ADDI    0x05            ; skip w, h, xo, yo
 | 
						|
                STW     tetrominoBase
 | 
						|
 | 
						|
                LDWI    0x00            ; reset result
 | 
						|
                STW     result          
 | 
						|
 | 
						|
                LDI     0x04
 | 
						|
                ST      ii
 | 
						|
                
 | 
						|
checkT_loop     LDW     tetrominoBase   ; x position
 | 
						|
                ADDI    0x01
 | 
						|
                STW     tetrominoBase
 | 
						|
                PEEK
 | 
						|
                ADDW    tx
 | 
						|
                ST      xx
 | 
						|
                BLT     checkT_skip     ; < 0 skip
 | 
						|
                SUBI    xTetris
 | 
						|
                BGE     checkT_skip     ; >= xTetris skip
 | 
						|
 | 
						|
                LDW     tetrominoBase   ; y position
 | 
						|
                ADDI    0x01
 | 
						|
                STW     tetrominoBase
 | 
						|
                PEEK
 | 
						|
                ADDW    ty
 | 
						|
                SUBW    tv              ; yy = ty - tv, (offset within tetromino)
 | 
						|
                ST      yy
 | 
						|
                BLT     checkT_skip     ; < 0 skip
 | 
						|
                SUBI    yTetris
 | 
						|
                BGE     checkT_skip     ; >= yTetris skip
 | 
						|
 | 
						|
                PUSH                    ; save return address, (this is needed if you nest CALL's)
 | 
						|
                CALL    getTetrisBlock
 | 
						|
                POP                     ; restore return address
 | 
						|
 | 
						|
                LDW     result          ; check result, continue if empty
 | 
						|
                BEQ     checkT_skip
 | 
						|
 | 
						|
                LDW     ty              ; blocked, check for game over, if(ty - tv == 0)
 | 
						|
                SUBW    tv
 | 
						|
                BNE     checkT_blocked
 | 
						|
 | 
						|
                LDWI    0x01            ; game over returns 1, (blocks can never be equal to 1)
 | 
						|
                STW     result
 | 
						|
checkT_blocked  RET
 | 
						|
 | 
						|
checkT_skip     LoopCounter ii checkT_loop
 | 
						|
                RET
 |