[Coco] Assembler Help
William Astle
lost at l-w.ca
Sun Aug 17 03:23:46 EDT 2008
Robert Gault wrote:
> Charles Shrader wrote:
>> Hi all! I thought I'd break into something other than the recent
>> copyright
>> discussion and ask for some help with an odd Assembler language question.
>>
>> I'm using EDTASM++.BIN. I've written a very simple program that
>> clears the
>> screen, then waits for the user to type in eight characters. Once eight
>> characters have been typed in, the program outputs to the screen a space,
>> then outputs a repeat of the string. Very simple.
>>
>> When I assemble and run this in the Z-Debugger, it runs fine, although
>> the
>> RTS at the end of the code causes unusual results. But I can see
>> before the
>> system goes hay-wire that on the top line, my entry is repeated:
>>
>> ABCDEFGH ABCDEFGH.
>>
>> This runs fine also if I change the RTS line to a line that just
>> brances to
>> itself over and over. This keeps the system from going nuts.
>>
>> Now if I compile the program to disk and execute the .BIN file, my output
>> is:
>>
>> ABCDEFGH BCDEFGH
>>
>> (Where did the first A go in the echoed second string??)
>>
>> I'm totally perplexed as to why this is happening. It's like my x
>> index is
>> not pointing to the correct start byte of STMP. (See below)
>>
>> I'll include the code below; perhaps someone here more knowledgeable
>> than I
>> may be able to figure out what's going on. I'm doing this in the
>> David Keil
>> emulator for the Coco3 with 128K RAM:
>>
>> 00100 ORG $3F00 ;Start location of code
>> 00110 START JSR 43304 ;Clear Screen
>> 00120 LDB #0 ;Initialize register B
>> 00130 LDA #0 ;Initialize Accumulator
>> 00135 STA DEVNUM ;Output to screen
>> 00140 LDX STMP ;Load start address of
>> storage
>> location STMP
>> 00150 LOOP JSR $A1C1 ;Poll for keypress
>> 00160 CMPA #0 ;Compare vs 0. If 0, no key
>> was pressed.
>> 00170 BEQ LOOP ;No keypress so keep polling
>> 00180 STA ,X+ ;Store keypress in STMP and
>> move byte pointer
>> 00190 JSR [40962] ;Output keypress to screen
>> 00192 INCB ;Increment counter
>> 00194 CMPB #8 ;See if 8 keys have been
>> pressed
>> 00200 BNE LOOP ;Keep polling until 8
>> keys have
>> been pressed
>> 00210 LDX STMP ;Point to start of STMP
>> so we
>> can echo output
>> 00220 LDA #32 ;Load A with ASCII code for
>> 'Space'
>> 00230 JSR [40962] ;Output character to screen
>> 00240 LOOP2 LDA ,X ;Load A with first
>> character of
>> stored string
>> 00250 JSR [40962] ;Output to screen
>> 00260 CMPX #8 ;Have we displayed all 8
>> characters?
>> 00270 BNE LOOP2 ;If not, get next
>> character in
>> string
>> 00280 RTS ;Return to caller
>> 00290 STMP RMB $09 ;Define storage area STMP
>> 00300 DEVNUM EQU $6F ;Location where output is
>> designated
>> 00310 END START
>>
>> Thanks for any help,
>>
>> Chuck
>>
>
> There is some code that can be cleaned up but that is a matter of style.
> What I see wrong is in loop2.
>
> lda ,x should be lda ,x+
> cmpx #8 should be cmpb #8 preceded by an incb
> regB should be cleared 231 clrb
>
> When I made these changes, the program worked for me under Basic. To get
> it to work in EDTASM the rts should be replaced with swi. You should
> also make sure the program does not assemble over and corrupt EDTASM.
There's one more problem. Both instances of LDX STMP should be LDX
#STMP. The latter actually loads the address of STMP while the former
loads the contents at that address. So, if the memory contains $0000,
your buffer is actually at address 0 (which might by why CMPX #8 worked
for you?).
--
William Astle
finger lost at l-w.ca for further information
Geek Code V3.12: GCS/M/S d- s+:+ !a C++ UL++++$ P++ L+++ !E W++ !N w---
!D !M PS PE V-- Y+ PGP t+@ 5++ X !R tv+@ b+++@ !DI D? G e++ h+ y?
More information about the Coco
mailing list