411 REFERENCE · Wikibooks
Signetics 2650 & 2636 programming/Tutorial code - sync to object completion
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
Tutorial code - Sync to object completion
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
0%