Signetics 2650 & 2636 programming/Tutorial code - sync to object completion
Tutorial code - Sync to object completion
editThis is the code for the tutorial Sync to Object completion
This code block must be merged with the standard 'Hardware definitions' code before it can be assembled |
; 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 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 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 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 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 ;=================================================================== ; subroutine - define position of unused objects DefineUnused: lodi,r0 254 stra,r0 vc2 ; push unused objects offscreen stra,r0 vc3 stra,r0 vc4 lodi,r0 $FF ; set all objects black stra,r0 colours12 stra,r0 colours34 retc,un ;================================================================= ; subroutine - wait for vertical reset to clear ; (see Tutorial......) Vsync0: tpsu sense bctr,eq Vsync0 ; wait for Sense bit to clear retc,un ;================================================================= ; subroutine - wait for vertical reset to set Vsync1: tpsu sense ; wait for Sense bit to be set bctr,lt Vsync1 retc,un ;================================================================= ;subroutine - wait for object to finish ; enter with r1=mask for bit to be tested: ; obj1=$08, obj2=$04, obj3=$02, obj4=$01 WaitObj: loda,r0 objectstatus andz r1 bctr,eq waitobj retc,un