Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .file "src/game/game.s"
- .global gameInit
- .global gameLoop
- .section .game.data
- pressedStr: .asciz "A key was pressed!"
- world: .ascii "################################################################################################################################################################################################### ###### ###### ###### M M ###### ###### M ###### ###### #################################################### ###### # # ###### # M # ###### # # ###### # M # M ###### # # M ###### # M # ###### # # ###### # M # ###### # M # ########## ################### # # # ###### # # # ###### ##################### # M # M ###### # # ###### M # # M ###### M # # ###### # M # ###### ##################### # # ###### # # # ###### # M M M # ################ ###### # # # ###### # M M M # # ###### # # # ###### ##################### # # M ###### # ############# ###### # # ###### # M M M M M # ###### # # ###### ################# ###### # ###### # M ###### # ###### # ##################### # ###### ###### ############# #### ################## # # # ###### # # M # ###### M # # # ###### #### # M # ###### M # # # ###### # ####### M # ###### # # # # ###### # # M # M # ###### ####### M # # # # ###### M # # # # ###### # # # # ###### # M # # # ###### # ########### M # ###### X # # ###### M # M M # ###### # # ###################################################################################################################################################################################################"
- worldSize: .quad 4096
- worldWidth: .quad 64
- worldHeight: .quad 64
- cameraSize: .quad 1125
- cameraWidth: .quad 45
- cameraHeight: .quad 25
- playerX: .quad 0
- playerY: .quad 0
- pointerX: .quad 0
- pointerY: .quad 0
- killcounter: .quad 0
- .section .game.text
- printString: #take %rdi as string address
- pushq %r13
- pushq %r14
- movq %rdi, %r13
- movq $0, %r14
- printStringLoop:
- cmpb $0, (%r13)
- je printStringExit
- movb (%r13), %dl
- movq %r14, %rdi
- movq $0, %rsi
- movb $0xf0, %cl
- call putChar
- incq %r13
- incq %r14
- jmp printStringLoop
- printStringExit:
- popq %r14
- popq %r13
- movq %rbp, %rsp
- popq %rbp
- ret
- printInteger: #rdi is gonna be the quad we are gonna print.
- pushq %rbp
- movq %rsp, %rbp
- pushq %r12
- pushq %r13
- pushq %r14
- #here we insert the code
- movq %rdi, %rax
- movq $0, %r13
- movq $10, %r12 #divisor register
- movq $1, %r14 #Digit counter register
- printIntegerPushLoop:
- xor %rdx, %rdx
- div %r12
- incq %r14
- pushq %rdx
- cmpq $0, %rax
- je printIntegerPopLoop
- jmp printIntegerPushLoop
- printIntegerPopLoop:
- decq %r14
- cmpq $0, %r14
- je printIntegerExit
- popq %rdx
- addq $48, %rdx
- #output the character somehow
- movq %r13, %rdi
- movq $0, %rsi
- #movb $64, %dl
- movb $0x0f, %cl
- call putChar
- #####
- incq %r13
- jmp printIntegerPopLoop
- printIntegerExit:
- popq %r14
- popq %r13
- popq %r12
- movq %rbp, %rsp
- popq %rbp
- ret
- genWorld:
- pushq %rbp
- movq %rsp, %rbp
- pushq %r12
- pushq %r13
- pushq %r14
- pushq %r15
- movq $world, %r13
- movq $0, %r14
- movq worldWidth, %r15
- genWorldLoop:
- #cmpq $worldSize,%r13
- #jge drawWorldLoopExit
- cmpq worldSize,%r14
- jge genWorldExit
- xor %rdx,%rdx
- movq %r14, %rax
- divq %r15
- movq %rax, %rsi
- movq %rdx, %rdi
- pushq %rdi
- pushq %rsi
- call getWrldPtr
- popq %rsi
- popq %rdi
- cmpq $2, %rdi
- jle genWorldLoopWall
- cmpq $2, %rsi
- jle genWorldLoopWall
- movq worldWidth, %r12
- subq $3, %r12
- cmpq %r12, %rdi
- jge genWorldLoopWall
- movq worldHeight, %r12
- subq $3, %r12
- cmpq %r12, %rsi
- jge genWorldLoopWall
- movb $' ',(%rax)
- jmp genWorldLoopEnd
- genWorldLoopWall:
- movb $0x23,(%rax)
- genWorldLoopEnd:
- incq %r13
- incq %r14
- jmp genWorldLoop
- genWorldExit:
- popq %r15
- popq %r14
- popq %r13
- popq %r12
- movq %rbp, %rsp
- popq %rbp
- ret
- drawWorld:
- pushq %rbp
- movq %rsp, %rbp
- pushq %r14
- pushq %r15
- movq $0, %r14
- movq cameraWidth, %r15
- drawWorldLoop:
- #cmpq $worldSize,%r13
- #jge drawWorldLoopExit
- cmpq cameraSize,%r14
- jge drawWorldLoopExit
- xor %rdx,%rdx
- movq %r14, %rax
- divq %r15
- movq %rax, %rsi
- movq %rdx, %rdi
- pushq %rdi
- pushq %rsi
- movq $playerX,%r12
- addq (%r12), %rdi
- movq cameraWidth,%r12
- shrq $1,%r12
- subq %r12, %rdi
- decq %rdi
- movq $playerY,%r12
- addq (%r12), %rsi
- movq cameraHeight,%r12
- shrq $1,%r12
- subq %r12, %rsi
- call getWrldPtr
- popq %rsi
- popq %rdi
- addq $35, %rdi
- movb (%rax), %dl
- movb $0xf0, %cl
- call putChar
- incq %r14
- jmp drawWorldLoop
- drawWorldLoopExit:
- popq %r15
- popq %r14
- movq %rbp, %rsp
- popq %rbp
- ret
- getWrldPtr: #let %rdi be the x and %rsi be the y
- pushq %rbp
- movq %rsp, %rbp
- cmpq $0, %rdi
- jl getWrldPtrInvalid
- cmpq $0, %rsi
- jl getWrldPtrInvalid
- cmpq worldWidth, %rdi
- jge getWrldPtrInvalid
- cmpq worldHeight, %rsi
- jge getWrldPtrInvalid
- movq %rsi, %rax
- movq worldWidth, %rsi
- mulq %rsi
- addq $world, %rax
- addq %rdi, %rax
- movq %rbp, %rsp
- popq %rbp
- ret
- getWrldPtrInvalid:
- movq $world, %rax
- movq %rbp, %rsp
- popq %rbp
- ret
- clearScreen: #let %rdi be the clear color (only the lower 8 bits are relevant) and %rsi be the min and max x (low and high byte respectively)
- pushq %rbp
- movq %rsp, %rbp
- pushq %r13
- movq $0xB8000, %r13
- clearScreenLoop:
- cmpq $0xB8FA0,%r13
- jge clearScreenLoopExit
- movb $0, (%r13)
- movb %dil, 1(%r13)
- addq $2, %r13
- jmp clearScreenLoop
- clearScreenLoopExit:
- popq %r13
- movq %rbp, %rsp
- popq %rbp
- ret
- gameInit:
- pushq %rbp
- movq %rsp, %rbp
- pushq %r12
- movq $39773, %rdi #sets the game loop to 30hz
- call setTimer
- #call genWorld
- movb $0x0f, %dil
- call clearScreen
- movq $playerX,%r12
- movq $58, (%r12)
- movq $playerY,%r12
- movq $58, (%r12)
- popq %r12
- movq %rbp, %rsp
- popq %rbp
- ret
- gameLoop:
- pushq %rbp
- movq %rsp, %rbp
- call inputs
- call drawWorld
- movq $1234, %rdi
- call printInteger
- movq $58, %rdi
- movq $12, %rsi
- movb $64, %dl
- movb $0xf0, %cl
- call putChar
- movq %rbp, %rsp
- popq %rbp
- ret
- inputs:
- call readKeyCode
- cmpb $0x11, %al
- je wpress
- cmpb $0x1F, %al
- je spress
- cmpb $0x1E, %al
- je apress
- cmpb $0x20, %al
- je dpress
- cmpb $0x17, %al
- je ipress
- cmpb $0x25, %al
- je kpress
- cmpb $0x24, %al
- je jpress
- cmpb $0x26, %al
- je lpress
- ret
- wpress:
- movq playerX, %rdi
- movq playerY, %rsi
- decq %rsi
- call getWrldPtr
- cmpb $'X', (%rax)
- je endgame
- cmpb $0x23, (%rax)
- jne wmove
- ret
- wmove:
- decq playerY
- ret
- spress:
- movq playerX, %rdi
- movq playerY, %rsi
- incq %rsi
- call getWrldPtr
- cmpb $'X', (%rax)
- je endgame
- cmpb $0x23, (%rax)
- jne smove
- ret
- smove:
- incq playerY
- ret
- apress:
- movq playerX, %rdi
- movq playerY, %rsi
- decq %rdi
- call getWrldPtr
- cmpb $'X', (%rax)
- je endgame
- cmpb $0x23, (%rax)
- jne amove
- ret
- amove:
- decq playerX
- ret
- dpress:
- movq playerX, %rdi
- movq playerY, %rsi
- incq %rdi
- call getWrldPtr
- cmpb $'X', (%rax)
- je endgame
- cmpb $0x23, (%rax)
- jne dmove
- ret
- dmove:
- incq playerX
- ret
- ipress:
- movq playerX, %rdi
- movq playerY, %rsi
- decq %rsi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attacki1
- decq %rsi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attacki2
- decq %rsi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attacki3
- ret
- kpress:
- movq playerX, %rdi
- movq playerY, %rsi
- incq %rsi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackk1
- incq %rsi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackk2
- incq %rsi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackk3
- ret
- jpress:
- movq playerX, %rdi
- movq playerY, %rsi
- decq %rdi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackj1
- decq %rdi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackj2
- decq %rdi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackj3
- ret
- lpress:
- movq playerX, %rdi
- movq playerY, %rsi
- incq %rdi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackl1
- incq %rdi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackl2
- incq %rdi
- call getWrldPtr
- cmpb $0x23, (%rax)
- je stopattack
- call attackl3
- ret
- stopattack:
- ret
- attacki1:
- movq playerX, %rdi
- movq playerY, %rsi
- decq %rsi
- call getWrldPtr
- cmpb $0x4D, (%rax)
- je kill
- ret
- attacki2:
- #movq playerX, %rdi
- # movq playerY, %rsi
- # decq %rsi
- # decq %rsi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- attacki3:
- #movq playerX, %rdi
- #movq playerY, %rsi
- # decq %rsi
- # decq %rsi
- # decq %rsi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- attackk1:
- movq playerX, %rdi
- movq playerY, %rsi
- incq %rsi
- call getWrldPtr
- cmpb $0x4D, (%rax)
- je kill
- ret
- attackk2:
- #movq playerX, %rdi
- # movq playerY, %rsi
- # incq %rsi
- # incq %rsi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- attackk3:
- #movq playerX, %rdi
- #movq playerY, %rsi
- # incq %rsi
- # incq %rsi
- # incq %rsi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- attackj1:
- movq playerX, %rdi
- movq playerY, %rsi
- decq %rdi
- call getWrldPtr
- cmpb $0x4D, (%rax)
- je kill
- ret
- attackj2:
- #movq playerX, %rdi
- # movq playerY, %rsi
- # decq %rdi
- # decq %rdi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- attackj3:
- #movq playerX, %rdi
- #movq playerY, %rsi
- # decq %rdi
- # decq %rdi
- # decq %rdi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- attackl1:
- movq playerX, %rdi
- movq playerY, %rsi
- incq %rdi
- call getWrldPtr
- cmpb $0x4D, (%rax)
- je kill
- ret
- attackl2:
- #movq playerX, %rdi
- # movq playerY, %rsi
- # incq %rdi
- # incq %rdi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- attackl3:
- #movq playerX, %rdi
- #movq playerY, %rsi
- # incq %rdi
- # incq %rdi
- # incq %rdi
- # call getWrldPtr
- # cmpb $0x4D, (%rax)
- # je kill
- ret
- kill:
- movb $'$', (%rax)
- incq killcounter
- ret
- endgame:
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement