Signetics 2650 & 2636 programming/Tutorial code - sync to object completion
Appearance
Tutorial code - Sync to object completion
[edit | edit source]This 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