Re: A83: Re: "Maximum Number of args exceeded"...?
[Prev][Next][Index][Thread]
Re: A83: Re: "Maximum Number of args exceeded"...?
My guess is that mathwiz loads the word from the external file into hl
and makes a
jp (hl)
for example
.dw _zeroop1 ;the word now contains the adress for the
call _zeroop1
mathwiz just looks up the program and start calling all words
/Stefan
On Sat, 5 Dec 1998, Justin Karneges wrote:
>
> >Hey, they is exactly what I needed to know, thanks a lot... =) Also, I'd
> like
> >to talk about that off-topic subject you said... I was recently looking
> >through the source to MathWiz v1.0 and noticed that the external files are
> >entirely made up of instructions in this fashion...
>
> they are probably precompiled and then turned back into text again so that
> it could be included again the program OR, it's not instructions at all. it
> may be a bunch of graphics or something. but i don't know anything about
> mathwiz, so i dunno. =)
>
> >I was just confused for a
> >little bit that you could address something by referencing it as a databyte
> or
> >dataword... So what does this mean exactly...? It would run it like an
> >instruction, as a call or a jump? So if in your program sequence, it came
> >across say a " .db 1" how would it interpret that? jump to the memory
> location
> >of $0001?
>
> nonono. when you put ".db X, X, X, X ..." it puts that string of bytes
> right in the program right there. which means if you want to do something
> like a "JP $0001" then you need to find out what the machin code equivalent
> is for that. A reference book on Z80 would tell you all of the instructions
> and their hex equivalents. if you put an instruction like RET, then TASM
> puts a $C9 in the file since RET is $C9 in machine code. as an example of
> this stuff, one really dumb thing to do is accidentally go like this:
>
> data .db 0, 0, 0, 0, 0
>
> .org 9327h
>
> ld hl, data
> ...
> ret
>
> seems like a normal asm program, and in fact it will work fine, but only
> because you would be lucky if you wrote that since a NOP in machine code is
> $00 which does absolutely nothing. See, if you ran this program, the Z80
> would execute from the top! which means it would start executing your data!
> the z80 does not differentiate between data and code. To the z80, it's
> simply bytes. So the above program is the same as:
>
> nop
> nop
> nop
> nop
> nop
>
> .org 9327h
>
> ld hl, data
> ...
> ret
>
> get it? if you type an instruction (like "ld a, 10") then it gets turned
> into the appropriate machine code. if you type in a .db statement, then the
> bytes that you specify are put directly into the program right there "as
> is."
>
> now see how that could have screwed up? what if when declaring the .db
> string at the top i had used something other than 0. like what if i put
> something like $AF which wound up to be exactly what "push hl" was in
> machine code (i don't know what $AF really is, but for the sake of
> argument). Well, the program would die a horrible death. it would execute
> a push followed by a ret which will send the PC register off to lala land.
>
> moral: make sure you never accidentally execute data!
>
> >I had just never heard of this thing before, can this method be
> >benefitted off of somehow? =P
>
> not really. RET is a lot easier to read than $C9
>
> also, you don't need to put a .db to be able to write to that spot either.
> you could use this stuff to dynamically make code but it has nothing to do
> w/ the .db stuff. check this:
>
> .org 9327h
>
> ld hl, label
> ld a, $c9
> ld (hl), a
> label:
> push af
>
> looking at that, you might think that since there's no RET that the program
> will execute forever. but actually, the "push af" statement gets
> overwritten with a RET. cool eh?
>
> -Justin Karneges [Infiniti]
>
>
References: