mineassembly/mine.asm

186 lines
5.3 KiB
NASM

format MZ ;Specify the .EXE format
entry MainSeg:start
org 0100h
stack $3000
;org 100h ;specify origin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Constants
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COLUMNS = 8
LINES = 8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
segment MainSeg
use16
start:
mov al,13h ;AX=0000 at program start
int 10h ;init mode 13h
push word 0A000h ;Requires 80186 or higher to PUSH IMMED
pop es ;ES now points to mode 13h screen segment
mov ax, DataSeg
mov ds, ax ;DS now points to our data segment
; Test draw a box
mov cx, 00h ;Y is 0
mov ax, 00h ;X is 0
mov bx, covercell
call drawbox ;Draw a box with this data
jmp mainloop
;This is thought to pick up from the registers the address of what we need to draw
;Draw it, and return. The params are:
;- AX -> X position
;- CX -> Y position
;- BX -> base memory address of the bitmap
drawbox:
push ax ;Save the X value for later
mov ax, cx ;Prepare for multiplications
mov cl, 8
mul cl ;This routine maintains the 8x8 positions
mov cx, 320 ;
mul cl ;And now we count whole lines for the address
mov cx, ax ;Retrieve the line into CX
pop ax ;Retrieve the X value into AX register
mov dl, 8
mul dl ;We multiply the X value too for the 8x8
add cx, ax ;Now we've put in AX the pointer value
mov si, cx ;Set SI to the correct address we'll draw
mov cx, 00
mov ax, 00
mov dx, 00
drawloop:
mov al, byte [ds:bx] ;Current address in BX
mov byte [es:si], al ;Put the pixel into RAM
inc bx
inc cx
inc dx
cmp dx, 08h ;Sort of modulo
je jumplinedraw ;Time to increment SI in a more complex way
inc si
continuecomp:
cmp cx, 040h ;Compare CX to hex 64 (8x8)
jne drawloop ;Continue
ret ;Return
jumplinedraw:
mov dx, 00h
add si, 313 ;Jump a whole line
jmp continuecomp ;Continue the routine
mainloop:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;This is where you do your mega-amazing tiny program.
;Write 8-bit values to A000:0000 to draw some pixels.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Check for user input or wanting to leave by pressing ESC
in al,60h ;read whatever is at keyboard port; looking for ESC which is #1
; cmp al,48h
; je upkey
; cmp al,4bh
; je leftkey
; cmp al,4dh
; je rightkey
; cmp al,50h
; je downkey
; cmp al,39h
; je space
; cmp al,38h
; je lalt
; mov word [lastkeypressed], 0h ;Reset the current key as it is not one we are checking
dec al ;if ESC, AL now 0
jnz mainloop ;fall through if 0, jump otherwise
exit:
mov al,03 ;AX=0000 due to mainloop exit condition
int 10h ;Switch back to text mode as a convenience
mov ah,4Ch ;Function to exit, now we are an EXE, do it correctly
mov al,00 ;Exit code as 0, everything went well
int 21h
upkey:
cmp ax, [lastkeypressed]
je mainloop
mov [lastkeypressed], ax
mov ah,02
mov dl,31h
int 21h
jmp mainloop
leftkey:
cmp ax, [lastkeypressed]
je mainloop
mov [lastkeypressed], ax
mov ah,02
mov dl,32h
int 21h
jmp mainloop
rightkey:
cmp ax, [lastkeypressed]
je mainloop
mov [lastkeypressed], ax
mov ah,02
mov dl,33h
int 21h
jmp mainloop
downkey:
cmp ax, [lastkeypressed]
je mainloop
mov [lastkeypressed], ax
mov ah,02
mov dl,34h
int 21h
jmp mainloop
space:
cmp ax, [lastkeypressed]
je mainloop
mov [lastkeypressed], ax
mov ah,02
mov dl,39h
int 21h
jmp mainloop
lalt:
cmp ax, [lastkeypressed]
je mainloop
mov [lastkeypressed], ax
mov ah,02
mov dl,38h
int 21h
jmp mainloop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Data segment
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
segment DataSeg
use16
lastkeypressed: db 0
;Game map. First 8 bytes are for the cell status
;the last 8 bytes are for the cell contents.
;
;Cell status: 0 covered, 1 uncovered, 2 flagged
;Cell content: 0 empty, 1-8 number, 9 mine
map: dw COLUMNS * LINES dup ?
covercell: db 0fh, 0fh, 0fh, 0fh, 0fh, 0fh, 0fh, 0fh
db 0fh, 17h, 17h, 17h, 17h, 17h, 17h, 14h
db 0fh, 17h, 17h, 17h, 17h, 17h, 17h, 14h
db 0fh, 17h, 17h, 17h, 17h, 17h, 17h, 14h
db 0fh, 17h, 17h, 17h, 17h, 17h, 17h, 14h
db 0fh, 17h, 17h, 17h, 17h, 17h, 17h, 14h
db 0fh, 17h, 17h, 17h, 17h, 17h, 17h, 14h
db 14h, 14h, 14h, 14h, 14h, 14h, 14h, 14h