Signetics 2650 & 2636 programming/Tutorial code - sync to object completion

Tutorial code - Sync to object completion
This is the code for the tutorial Sync to Object completion

org    0 reset_vector:                  ; the microprocessor starts here when the reset button is pressed bcta,un reset org    3 interrupt_vector:              ; interrupts shouldn't happen, but set this just in case retc,un reset: lodi,r0 $20	       ; initialise program status word lpsu                   ; inhibit interrupts, stack pointer=0 lpsl                   ; register bank 0, without carry, arithmetic compare
 * Tutorial - Sync to object completion

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

bsta,un Vsync0         ; make sure VRST hasn't started endless: bsta,un Vsync1         ; wait for VRST to start

bsta,un Object1A	; set initial state of object 1: ; shape, colour, size, HC,VC ; and HCB,VCB for first duplicate, B

bsta,un Vsync0         ; wait for VRST to end

lodi,r1 $08 bsta,un WaitObj        ; wait for object 1 to complete

bsta,un Object1B	; set first duplicate of object 1: ; shape, colour, size ; and VCB for second duplicate, C

lodi,r1 $08 bsta,un WaitObj        ; wait for object 1 to complete (first duplicate, B)

bsta,un Object1C	; set second duplicate of object 1: ; shape, colour, size, HCB ; and VCB to push next duplicate offscreen

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 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

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 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

; (see Tutorial......) Vsync0: tpsu   sense bctr,eq Vsync0         ; wait for Sense bit to clear retc,un Vsync1: tpsu   sense           ; wait for Sense bit to be set bctr,lt Vsync1 retc,un WaitObj: loda,r0 objectstatus andz   r1        bctr,eq waitobj retc,un
 * subroutine - wait for vertical reset to clear
 * subroutine - wait for vertical reset to clear
 * subroutine - wait for vertical reset to set
 * subroutine - wait for vertical reset to set
 * subroutine - wait for object to finish
 * subroutine - wait for object to finish
 * enter with r1=mask for bit to be tested:
 * obj1=$08, obj2=$04, obj3=$02, obj4=$01