Signetics 2650 & 2636 programming/Tutorial code - Interrupts

Tutorial code - Interrupts
This is the code for the tutorial Interrupts

Reg0     equ   $1F0E           ;save r0 here during interrupts StatusL  equ   $1F0F           ;save the program status word lower here during interrupts Obj1dup  equ   $1F1E           ;tracks which duplicates have been output
 * Tutorial - Interrupts

org    0 reset_vector:                  ; the microprocessor starts here when the reset button is pressed bcta,un reset org    3 interrupt_vector: ;Save state of processor when interrupt occured: stra,r0 Reg0        ;preserve r0        ppsl    $10          ;bank 1,  logical compare spsl stra,r0 StatusL     ;save PSL with bank 1 already selected! loda,r0 collisions tmi,r0 vrle         ;case bcfr,eq IVdup1      ;    interrupt caused by VRLE bsta,un Object1A    ;        set initial state of object 1 bcta,un IVend       ;        quit interrupt routine

IVdup1:                     ; loda,r0 Obj1dup     ; comi,r0 1           ;    next duplicate is the first bcfr,eq IVdup2 bsta,un Object1B    ;        set first duplicate of object 1 bcta,un IVend       ;        quit interrupt routine

IVdup2:                     ; loda,r0 Obj1dup     ; comi,r0 2           ;    next duplicate is the second bcfr,eq IVend bsta,un Object1C    ;        set second duplicate of object 1

IVend:                      ;Restore processor to state it was in before interrupt: loda,r0 StatusL strz   r4           ;put a copy of PSL in r4                                        lpsl                 ;restores psl (but with bank 1 still selected) loda,r0 Reg0        ;restore r0 (but probably changes the condition code) andi,r4 $C0         ;this restores the condition code! cpsl   $10          ;switch to bank 0 rete,un             ;exit interrupt routine reset: lodi,r0 intinhibit     ; initialise program status word lpsu                   ;   inhibit interrupts, stack pointer=0 lpsl                   ;   register bank 0, without carry, arithmetic compare eorz   r0        stra,r0 effects         ; initialise the 74LS378 bsta,un DefineUnused   ; push all unused objects offscreen lodi,r0 $AA            ; blank the score digits stra,r0 score12 stra,r0 score34 lodi,r0 %00000000      ;  X / 000              /   0     / 000 stra,r0 backgnd        ;    / black background / disabled / black screen spsl   compare         ; logical compares cpsu   intinhibit      ; enable interrupts endless: nop                    ; this is the main program loop nop                    ; the processor is free to perform other tasks nop                    ; in between servicing PVI interrupts bctr,un endless


 * subroutine -  Primary object
 * set initial state of object 1: shape, colour, size, HC,VC
 * and HCB,VCB for first duplicate, B
 * and HCB,VCB for first duplicate, B

Object1A: lodi,r3 10 lodi,r0 $FF loop1A: stra,r0 shape1,r3-     ; rectangle shape brnr,r3 loop1A

stra,r3 objectsize     ;  size 0

lodi,r0 $07            ;  white stra,r0 colours12

lodi,r0 10 stra,r0 vc1            ; vc = 10 rrl,r0 stra,r0 vcb1           ; vcb = 20 rrl,r0 stra,r0 hc1            ; hc = 40 rrl,r0 stra,r0 hcb1           ; vcb = 80 lodi,r0 1 stra,r0 Obj1dup        ;next to draw is the first duplicate retc,un
 * subroutine -  First duplicate
 * set: shape, colour, size
 * and VCB for second duplicate
 * and VCB for second duplicate

Object1B: lodi,r3 10 lodi,r0 $FF ppsl   withcarry       ; include carry in rotate instructions loop1B: stra,r0 shape1,r3-     ; triangle shape cpsl   carrybit rrr,r0                 ; shift right with 0 from the carry bit brnr,r3 loop1B

lodi,r3 1 stra,r3 objectsize     ;  size 1

lodi,r0 $08            ;  yellow stra,r0 colours12

lodi,r0 80 stra,r0 vcb1           ; vcb = 80 lodi,r0 2 stra,r0 Obj1dup        ;next to draw is the second duplicate retc,un
 * subroutine -  Second duplicate
 * set: shape, colour, size, HCB
 * and VCB to push next duplicate off screen
 * and VCB to push next duplicate off screen

Object1C: lodi,r3 10 lodi,r0 $FF ppsl   withcarry       ; include carry in rotate instructions loop1C: stra,r0 shape1,r3-     ; triangle shape cpsl   carrybit rrl,r0                 ; shift left with 0 from the carry bit brnr,r3 loop1C

lodi,r3 2 stra,r3 objectsize     ;  size 2

lodi,r0 $28            ;  green stra,r0 colours12

lodi,r0 250 stra,r0 vcb1           ; make sure there are no more duplicates lodi,r0 60 stra,r0 hcb1           ; hcb = 60 lodi,r0 0 stra,r0 Obj1dup        ;next to draw is the primary object retc,un

DefineUnused: lodi,r0 254 stra,r0 vc2        ; push unused objects offscreen stra,r0 vc3 stra,r0 vc4
 * subroutine -  define position of unused objects
 * subroutine -  define position of unused objects

lodi,r0 $FF        ; set all objects black stra,r0 colours12 stra,r0 colours34 retc,un