; ; 1kB roguelike using an arduino and 0.96" OLED ; ; Author : Radoslaw Sadowski ; .include "m328Pdef.inc" .equ speed = 19200 .equ cpu = 16000000 .equ rst = 0 .equ dc =1 .equ cs = 2 .equ bittimer = (cpu/speed/16)-1 .macro mcommand ldi r20, @0 rcall command .endmacro ;;;;;;;;; variables ;;;;;;;;;;; .dseg buffer: .byte (64*128/8) map: .byte 8 ; 8bit x 8bit ;;;;;;;;;; main ;;;;;;;;;;;;;;; .cseg .org 0x0000 rjmp reset reset: ldi r16, LOW(RAMEND) ldi r17, HIGH(RAMEND) sts SPL, r16 sts SPH, r17 rcall setup_uart rcall setup_spi rcall OLED_init rcall clear_buffer rcall draw_map rcall draw_player rcall display loop: rjmp loop ;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;; ; Display routine from adafruit1306 library display: mcommand 0x21 mcommand 0x00 mcommand 127 mcommand 0x22 mcommand 0x0 mcommand 0x7 sbi PORTB, 2 ;cs high sbi PORTB, 1 ;dc low cbi PORTB, 2 ;cs high ldi r23,4 ldi r22,0 ldi r21,0 ldi YL, low(buffer) ldi YH, high(buffer) send_buffer: ld r20, Y+ rcall spi_send inc r21 brne send_buffer inc r22 cpse r22,r23 brne send_buffer sbi PORTB, 2 ;cs ret ;;;;;;;;;;;;;;;;;;;;;;; spi_send: out spdr, r20 wait_sprs: in r16, SPSR sbrs r16, SPIF rjmp wait_sprs ret ;;;;;;;;;;;;;;;;;;;;;; setup_spi: ldi r16, (1<<5)|(1<<3)|(1<