; --- lab4_skal . asm .equ VMEM_SZ = 5 ; # rows on display .equ AD_CHAN_X = 0 ; ADC0 = PA0 , PORTA bit 0 X - led .equ AD_CHAN_Y = 1 ; ADC1 = PA1 , PORTA bit 1 Y - led .equ GAME_SPEED = 70 ; inter - run delay .equ PRESCALE = 3 ; AD - prescaler value ( clk /8) .equ BEEP_PITCH = 5 ; Victory beep pitch .equ BEEP_LENGTH = 100 ; Victory beep length ; --------------------------------------- ; --- Memory layout in SRAM .dseg .org SRAM_START POSX: .byte 1 ; Own position POSY: .byte 1 TPOSX: .byte 1 ; Target position TPOSY: .byte 1 LINE: .byte 1 ; Current line VMEM: .byte VMEM_SZ ; Video MEMory SEED: .byte 1 ; Seed for Random ; --------------------------------------- ; --- Macros for inc / dec - rementing ; --- a byte in SRAM .macro INCSRAM ; inc byte in SRAM lds r16 , @0 inc r16 sts @0 , r16 .endmacro .macro DECSRAM ; dec byte in SRAM lds r16 , @0 dec r16 sts @0 , r16 .endmacro ; --------------------------------------- ; --- Code .cseg .org $0 jmp START .org INT0addr jmp MUX /* Koppling LED-matris: 1-7 -> PORTB0-6 A-C -> PORTD4-6 E->U Tidbasmodul: 1kHz->PORTD2 Joystick: X->PORTA0 Y->PORTA1 H gtalare Ut->PORTA7 */ START: ; s tt stackpekaren ldi r16, LOW(RAMEND) out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 call HW_INIT call WARM RUN: call JOYSTICK call ERASE call UPDATE // *** Vanta en stund sa inte spelet gar for fort *** ldi r16, $FF call DELAY // *** Avgor om traff *** call IS_HIT brne NO_HIT ldi r16, BEEP_LENGTH call BEEP call WARM NO_HIT: jmp RUN IS_HIT: lds r16, POSX lds r17, TPOSX cp r16, r17 brne IS_HIT_END lds r16, POSY lds r17, TPOSY cp r16, r17 IS_HIT_END: ret ; --------------------------------------- ; --- Multiplex display ; --- Uses : r16 MUX: //*** skriv rutin som handhar multiplexningen och *** //*** utskriften till diodmatrisen . Oka SEED . *** push r16 in r16, SREG push r16 push r17 push ZH push ZL INCSRAM SEED ldi r16, 0 out PORTB, r16 lds r16, LINE swap r16 out PORTD, r16 swap r16 ldi ZH, HIGH(VMEM) ldi ZL, LOW(VMEM) add ZL, r16 clr r0 adc ZH, r0 ld r17, Z out PORTB, r17 inc r16 cpi r16, 5 brne NO_RESET clr r16 NO_RESET: sts LINE, r16 pop ZL pop ZH pop r17 pop r16 out SREG, r16 pop r16 reti ; --------------------------------------- ; --- JOYSTICK Sense stick and update POSX , POSY ; --- Uses : JOYSTICK: //*** skriv kod som okar eller minskar POSX beroende *** //*** pa insignalen fran A/D - omvandlaren i X - led ... *** //*** ... och samma for Y - led *** ldi r18, 0 ; X - 0; Y - 1 ADC8: out ADMUX,r18 ; set by X_END ldi r17,(1 << ADEN) out ADCSRA, r17 CONVERT: sbi ADCSRA,ADSC ; starta en omvandling WAIT: sbic ADCSRA,ADSC ; om nollst lld r vi klara rjmp WAIT ; annars testa busy-biten igen in r17,ADCH ; Hoppa till CHANGE_Y om r16 är på andra kanalen cpi r18, 1 breq CHANGE_Y ; Om 3: inc, om 0: dec cpi r17, 3 breq INC_X cpi r17, 0 brne X_END DECSRAM POSX rjmp X_END INC_X: INCSRAM POSX X_END: ldi r18, 1 ; byt till andra kanalen rjmp ADC8 CHANGE_Y: cpi r17, 3 breq INC_Y cpi r17, 0 brne JOY_LIM DECSRAM POSY rjmp JOY_LIM INC_Y: INCSRAM POSY JOY_LIM: call LIMITS ; don t fall off world ! ret ; --------------------------------------- ; --- LIMITS Limit POSX , POSY coordinates ; --- Uses : r16 , r17 LIMITS: lds r16 , POSX ; variable ldi r17 ,7 ; upper limit +1 call POS_LIM ; actual work sts POSX , r16 lds r16 , POSY ; variable ldi r17 ,5 ; upper limit +1 call POS_LIM ; actual work sts POSY , r16 ret POS_LIM: ori r16 ,0 ; negative ? brmi POS_LESS ; POSX neg = > add 1 cp r16 , r17 ; past edge brne POS_OK subi r16 ,2 POS_LESS: inc r16 POS_OK: ret ; --------------------------------------- ; --- UPDATE VMEM ; --- with POSX /Y , TPOSX /Y ; --- Uses : r16 , r17 , Z UPDATE: clr ZH ldi ZL, LOW ( POSX ) call SETPOS clr ZH ldi ZL, LOW ( TPOSX ) call SETPOS ret ; --- SETPOS Set bit pattern of r16 into * Z ; --- Uses : r16 , r17 , Z ; --- 1 st call Z points to POSX at entry and POSY at exit ; --- 2 nd call Z points to TPOSX at entry and TPOSY at exit SETPOS: ld r17, Z+ ; r17 = POSX call SETBIT ; r16 = bitpattern for VMEM + POSY ld r17, Z ; r17 = POSY Z to POSY ldi ZL, LOW ( VMEM ) add ZL, r17 ; Z= VMEM + POSY , ZL = VMEM +0..4 ld r17, Z ; current line in VMEM or r17, r16 ; OR on place st Z, r17 ; put back into VMEM ret ; --- SETBIT Set bit r17 on r16 ; --- Uses : r16 , r17 SETBIT: ldi r16, $01 ; bit to shift SETBIT_LOOP: dec r17 brmi SETBIT_END ; til done lsl r16 ; shift jmp SETBIT_LOOP SETBIT_END: ret ; --------------------------------------- ; --- Hardware init ; --- Uses : HW_INIT: //*** Konfigurera hardvara och MUX - avbrott enligt *** //*** ditt elektriska schema . Konfigurera *** //*** flanktriggat avbrott pa INT0 ( PD2 ). *** ; S tter fallande flank p avbrotten ldi r16, (1<