Reader Experiments

This page is dedicated to Reader Feedback in the form of experiments and ideas. 
The first program was sent in by Miroslav Kostecki of elabtronics (www.labtron.com.au)  the designers of Icon Assembler. 
I asked him for a program that incremented the 7-segment display. I expected a program similar to Experiment 4: Counting on the 7-segment display.  I actually asked for a program in Icon Assembler so I could compare the ease of understanding the Icon Assembler approach. I received the Icon program and loaded it into Icon Assembler but it was so over-the-top that I closed the program and realised it was not for me. 
The Icon program was spread over 3 pages and was filled with circles and triangles and half-finished words that made the concept 10 times more complex than the hand-assembly approach I am advocating. 
I don't mind if someone comes up with something that makes writing a program easier and more understandable, but to add to the complexity by 1,000% and attempt to hood-wink me with the suggestion that the new approach is the way to go, I think not. 
However, here's the first readers program. Copy it, put it into a text editor, burn it into a PIC chip, and put it in the PIC LAB-1 project. 
This program serves as a very good example of how other people work and think. Miroslav Kostecki is a brilliant programmer and operates at a very high level of thought. Even a simple program such as the one below uses a higher level of thought than we have provided in our set of experiments, and is more complex than expected.  
But this is very important. When you see a combination of reasoning from different minds, you can combine the common points and see how to tackle a specific problem from different stand-points. 
The first thing you will notice is the layout. 
It is different to our recommended format and the inclusion of the interrupt vector adds to the complexity. The interrupt instructions are not functional as the interrupt has not been set up, and maybe this program is left-over from a larger example.
All programs naturally starts at address "000" where it sees the instruction GOTO 5. The instruction ORG 0, does not have to be included as the assembler naturally starts programming at this address. This causes the micro to jump over the instruction GOTO Interrupt, at location 4, and operate on the instruction __CONFIG 0Bh, at address 5.  This configuration turns off the watchdog timer, invokes the external RC oscillator mode, and turns on code-protect.
The instruction: MOVLW  B'10000000'   OPTION    puts the value 80h into the OPTION register to disable the pull-ups on port B. This feature only applies when any of port B lines are INPUT, and does not apply to this program - another unnecessary instruction. 
The programmer has used the TRIS operation to determine which lines of each port will be input or output. 
The micro then continues directly to Start, where it clears the count file (file 12h) and then goes to Main1.
The output port is initially cleared and so the program starts with a blank display. 
The program basically consists of two loops. The "button not pressed" loop is in dloop, where the last value placed in file 06 will appear on the screen. The "button pressed" loop is Main1 and this includes CALL display
If the button is NOT pressed, the micro carries out the first and third instructions of Main1 and then goes to dloop where it carries out the first and second instructions, in a continuous loop. The screen will display the last value placed in file 06.
When the button is pressed, the first instruction
in dloop gets the micro out of the loop and back to Main1, where the micro goes to display. The instruction incf count,f in display increments the "jump value" for the table, performs a SUB and  looks in the STATUS file to see if the zero flag has been set. If this flag is SET, the 'end of table' has been reached and the jump value is zeroed. 
A display value is obtained from the table and passed to port B for outputting to the display. This action is repeated and the display is changed very rapidly to produce a "figure-8." 
As soon as the button is released, the micro goes to the above-mentioned routine with the last display-value appearing on the 7-segment display. 
This is not what I requested and the program should be called RANDOM NUMBER or DICE
By changing the values in the table to include only the numbers 1 to 6, and limiting the jump value to 6, a DICE program can be produced.  
GOTO $ is also not used (it is a BASIC language instruction meaning GOTO String Data) and is only included to confuse you. All these misleading instructions from a pioneer of a program designed to help beginners understand programming!  If someone can convince me that Icon Assembler is easier to understand than hand-assembly, I will offer a $10,000 prize! 
My challenge to Icon Assembly is a program similar to Expt1 test  but with lines of code that can be changed on the screen. It can have circles and triangles to make the program colourful and fancy but really only needs each instruction to be taken from a library and dragged into place. This concept will make a superb assembly program where you can see the whole program at a glance and the endless page allows you to scroll down the whole program.
The 7-segment program supplied by elabtronics is already 3 pages long in Icon Assembly and trying to follow the flow of the program is absolutely impossible. 
The program below is already more complex than our layout, so you can imagine adding 1,000% more complexity to this is going to make it an Archimedean entanglement! 

			;Reader1.asm
			;Project: Button increments 7-seg
LIST p=16C84,r=DEC	; Put assembler into PIC16C84 mode.
			; r=DEC means decimal numbers are
			; assumed if 'B' or 'h' not specified
     			;include "p16f84.inc"

   ;**************Declare Variables************************
   	count		equ	12
	x		equ	13      
   ;**************Initialise interrupt subroutine**********
     	goto 5
	ORG 4
	goto interrupt
	ORG 5     
  ;**************Initialise Ports*************************
   	__CONFIG  0Bh
    	MOVLW	B'10000000'
	OPTION
	CLRF	5
	MOVLW	B'00011111'
	TRIS	5
	CLRF	6
	MOVLW	B'00000000'
	TRIS	6  

  ;**************Start Of Main Program********************
  Start		; Button Increments a Seven Segment Display
		; PORTA,0 is connected to the button
		; PORTB to display, format=gfedcba0

	clrf	count	;count  =  0
 Main1	btfsc	5,0	;If PORTA Bit 0 OFF Skip Next
	call	display
	call	Delay
	goto	Main1
	goto	$	;Safety Caching Loop

   ;**************Subroutines******************************

 interrupt
	retfie		;Interrupt    

 Delay
 dloop	btfss	5,0	;If PORTA Bit 0 ON Skip Next
	goto	dloop
	decfsz	x,f	;x  =  x -1 , Skip Next If Zero
	goto	dloop
	return		;Return

display
	incf	count,f		;count  =  count + 1
	movlw	0Ah		;w  =  10
	subwf	count,w		;w  =  count - w
	btfsc	3,2		;If STATUS Bit2 OFF Skip Next
	clrf	count		;count  =  0
	movf	count,w		;w  =  count
	call	table
	movwf	6		;PORTB  =  w
	return			;Return  

table	addwf	2,f		;PCL  =  PCL + w
	retlw	H'3F'		;w = H'3F'
	retlw	H'06'		;w = H'06'
	retlw	H'5B'		;w = H'5B'
	retlw	H'4F'		;w = H'4F'
	retlw	H'66'		;w = H'66'
	retlw	H'6D'		;w = H'6D'
	retlw	H'7D'		;w = H'7D'
	retlw	H'07'		;w = H'07'
	retlw	H'7F'		;w = H'7F'
	retlw	H'6F'		;w = H'6F' 
 
	End

		;Reader 2.asm
             		 ;Project: To come
 List P = 16F84
 #include <p16F84.inc>
  __CONFIG 1Bh    ;_CP_OFF & _PWRTE_ON  _WDT_OFF & _RC_OSC

SetUp








Delay






Delay2




Sw





















Main





ORG 0
BSF 03,5
CLRF 06
MOVLW 01
MOVLW 05
BCF 03,5
CLRF 1F
CLRF 06
GOTO Main

NOP
DECFSZ 1A,1
GOTO Delay
DECFSZ 1B,1
GOTO Delay
RETURN

NOP
DECFSZ 1A,1
GOTO Delay2
RETURN

BTFSS 05,0
GOTO Sw3
BTFSC 1F,2
RETURN
BTFSC 1F,0
RETLW 00
BTFSS 1F,1
GOTO Sw2
BSF 06,0
CALL Delay
CALL Delay
BCF 1F,1
BSF 1F,2
BCF 06,0
RETURN
BSF 1F,1
BSF 1F,0
RETURN
BCF 1F,0
BCF 1F,2
RETURN

CALL Sw
CALL Delay2
other instructions
other instructions
BCF 1F,0
GOTO Main

END
;This is the start of memory for the program.
;Go to Bank 1
;Make all port B output
;Load W with 0000 0001
;Make RA0 input
;Go to Bank 0 - the program memory area.
;Clear the button-press file
;Blank the display


;Create approx 250mS delay






;Create 1mS debounce delay




;Test the push button
;Button not pressed
;Test end-of-flash flag

;First pass?
;No
;Test first-press flag
;First press
;Button has been pressed twice. Illuminate LED
;Keep LED on
;Keep LED on
;Clear second-push flag bit
;Set end-of-flash flag
;Turn LED off

;Set the first-press flag
;Set button pass flag bit

;Clear button pass flag bit
;Clear end-of-flash flag




;Carry out other instructions

;Clear first-push flag bit


;Tells assembler end of program