Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in 
CSDb User Forums


Forums > C64 Coding > Kick Assembler Thread 2
2009-07-21 19:20
Slammer

Registered: Feb 2004
Posts: 400
Kick Assembler Thread 2

The previous thread took a little long to load, so this is a new fresh one..
 
... 525 posts hidden. Click here to view all posts....
 
2016-03-09 06:57
Agemixer

Registered: Dec 2002
Posts: 33
I couldn't just reproduce it same way but this does the same:

.for (var i=0; i<=10; i=i+0.1) { .if (i>5) .eval i=5 .print "i="+i }

...and the error:

parsing
flex pass 1
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3210)
	at java.util.Arrays.copyOf(Arrays.java:3181)
...


Anyway, not sure if this helps, but something like this triggered it, and IIRC the pow[] was in .for loop comparison though. But that example is gone. (perhaps integer .var comparison vs float .var failed? Even if i<=x, just an assumption..)

.var x = pow(2,fractionbits)   // generate some LUT...
.var diffi  .var wanha=0 
.for(var i=0;i<=x;i++)
   {.eval freq = round(Base_Freq * pow(2,[i/x/12]))
   .eval diffi = myfreq - wanha   .eval wanha = freq
   // ..sorry not everything revealed here.. =)
   }


Anyway i think it could just have been human error :)
2016-03-09 07:25
Agemixer

Registered: Dec 2002
Posts: 33
Then an another little puzzle, which could ease up the programming a bit for sure... (atleast if you branch a lot =)

When a relative branch exceeds its short branch limits in multiple places in the code, it could get annoying to replace it with long jumps, but optimize back a bit later if not needed... So i wanted to automate some long branch generation a bit, instead of several compile time complaints. BUT! Is this possible to do properly in kickassembler? As i know kick can do multiple passes depending on your code, until all variables are known and all code generated properly? :)

What do you think? How this should be done? My idea is this (and it halfway works already!)


.const BEQ=$f0 .const BNE=BEQ^$20
.const BMI=$30 .const BPL=BMI^$20
.const BCC=$90 .const BCS=BCC^$20

.pseudocommand far OPCODE;OPERAND {
  .var PC = *
  .var branch = OPERAND.getValue()-PC
//.if (branch ?? InvalidNumber) { .print "label not found yet" } //...should this work?
  .if ( branch < -126 || branch > 129 ) {
  .byte OPCODE.getValue()^$20, 3 // [BEQ] *+5, jmp long_branch
  jmp OPERAND
  .print"FAR BRANCH at location $"+toHexString(PC)
  } else {
  .byte OPCODE.getValue(), branch-2 // [BNE] short_branch
  // For the above .byte code, is there possible to feed OPCODE for pseudocommand like those argument types for operand?
  }
}

   .pc=$2000  // some testing...

before:
     .fill 127,[NOP]
     :far BNE; before // this branch works
     :far BCC; after  // this branch gives "Error: the condition must be able to evaluate in first parse)"
     .fill 128,[NOP]
after:
2016-03-13 15:08
Slammer

Registered: Feb 2004
Posts: 400
Quote:
.for (var i=0; i<=10; i=i+0.1) { .if (i>5) .eval i=5 .print "i="+i }

The error in the above example is happening due to an endless loop (but I guess you knew thats why you made the example). I dont think i have alot to go on but if you get the error againg let me know. (NB. all numbers in KickAss is pratically doubles, so I dont think it got anything todo with int vs float comparison)

Regarding the branch thing. I had the same thouht once but concluded that this kind of functionality have to be implemented in a 'trial and error' kind of way. When deciding if the branch is a short or a long one you should know the target address of the branch. But the target address of the branch could depend on wether its a short or a long branch, so this is a problem. Further more several branches could be dependand on each others decitions (short vs far) so this makes it more complicated. This is a thing for the assembler to support by first assuming short jumps and then reassemble with long jumps until all branches fits. I have a note on the which list for implementing this as jne, jeq, jmi, jpl, etc but this is a biggie so it wont be this year.
2016-03-13 15:16
Jammer

Registered: Nov 2002
Posts: 565
Question about functions/macros. There's clear division which does what in manual. How about piece of code that is mix of assembler and script conditions/variables - should I define the one below as macro or function?

	.if(usefreqtable1)
	{
		.if(usefreqlo1)
		{
			ldx #$00
		checkch1freq:
			lda ch1freq, x
			cmp #$fe
			bne updatech1freq
			ldx #$00
			stx checkch1freq - 1
			jmp checkch1freq
		updatech1freq:
			sta $d401
			
			.if([usefreqhisweeptable1] || [constfreqhisweep1 != $00])
			{
				sta dofreqhisweep1 + 1
			}
			
			inx
			lda ch1freq, x
			sta $d400
			
			.if([usefreqlosweeptable1] || [constfreqlosweep1 != $00])
			{
				sta dofreqlosweep1 + 1
			}
			
			inx
			stx checkch1freq - 1
		}
		else
		{
			ldx #$00
		checkch1freq:
			lda ch1freq, x
			cmp #$fe
			bne updatech1freq
			ldx #$00
			stx checkch1freq - 1
			jmp checkch1freq
		updatech1freq:
			sta $d401
			
			.if([usefreqhisweeptable1] || [constfreqhisweep1 != $00])
			{
				sta dofreqhisweep1 + 1
			}
			
			inc checkch1freq - 1

			.if([usefreqlosweeptable1] || [constfreqlosweep1 != $00])
			{
				lda #$00
				sta dofreqlosweep1 + 1
			}
		}
	}
2016-03-13 16:49
Slammer

Registered: Feb 2004
Posts: 400
It would have to be a macro (or pseudo command). Commands that produces bytes to the resulting .prg file (like mnemonics and .byte/.word etc) can't be in functions.

Edit: Otherwise you could make some really tricky stuff like:
lda #myByteProducingFunc(27)
2016-03-13 16:58
Jammer

Registered: Nov 2002
Posts: 565
I've tried to define that portion of code both as macro and function. Macro resulted in error due to non-assembly instructions. Function compiled without error but most probably as regular assembly that's not really a subroutine. Ok, I see that it has to be totally reorganized ;)
2016-03-13 17:36
Slammer

Registered: Feb 2004
Posts: 400
If you are reporting error please post complete examples. When you post cutout pieces of code I have no chance of verifying if its an error or not.

I dont think I understand what you are writing. Are you sure its not when you put it in a function you get an error for using asm directives? ( = directives that produce bytes to the output)
2016-03-13 18:31
Jammer

Registered: Nov 2002
Posts: 565
Sorry about that :) Macro seems to work fine - it was just enclosed within .if directive that I didn't catch somehow. No error report whatsoever and thank you for the tip ;)
2016-03-13 21:04
Hoogo

Registered: Jun 2002
Posts: 76
I guess there are situations where automatic long branches are difficult:
---> Dest 1
|    ...
| -<Branch 2
| |  ...
--+<Branch 1
  |  ...
  -->Dest 2
Branch2 cannot be decided until Branch 1 was decided, and the other way around the same.
But such a situation can already be created with an .if (futureLabelFormual)FillSomeBytesFormula. How do you treat that? Forbid .if with unknown labels? Or some check if passes get out of sync?
2016-03-14 07:31
Slammer

Registered: Feb 2004
Posts: 400
You guessed it , using if's on yet unknown values gives an error since the memlocation of labels have to be resolved in first pass.
Previous - 1 | ... | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
Mike
Alakran_64
Pantaloon/Fairlight
Urban Space Cowboy
Guests online: 38
Top Demos
1 Uncensored  (9.7)
2 Coma Light 13  (9.7)
3 Edge of Disgrace  (9.7)
4 Comaland  (9.6)
5 Comaland 100%  (9.6)
6 Wonderland XII  (9.5)
7 Fantasmolytic  (9.5)
8 Nothing but PETSCII  (9.5)
9 Rocketry  (9.4)
10 We Are Demo  (9.4)
Top onefile Demos
1 Treu Love [reu]  (9.5)
2 Daah, Those Acid Pil..  (9.4)
3 Dawnfall  (9.4)
4 Led Board  (9.3)
5 One-Der  (9.2)
6 Hardware Accelerated..  (9.2)
7 Safe VSP  (9.1)
8 Ächzzeit  (9.1)
9 Goatbeard  (9.1)
10 Black Magic  (9.0)
Top Groups
1 Censor Design  (9.4)
2 Booze Design  (9.4)
3 Oxyron  (9.4)
4 Crest  (9.3)
5 Nostalgia  (9.2)
Top Swappers
1 Jerry  (10)
2 Zyron  (10)
3 Derbyshire Ram  (10)
4 Splatterhead  (9.8)
5 Walker  (9.7)

Home - Disclaimer
Copyright © No Name 2001-2016
Page generated in: 0.192 sec.