Moving to R39

Chat about anything CX16 related that doesn't fit elsewhere
Greg King
Posts: 162
Joined: Wed Jul 08, 2020 1:14 pm

Moving to R39

Post by Greg King »



On 6/13/2022 at 10:18 PM, TomXP411 said:




Also, the addresses in VERA have changed. So you need to query $9F35 to get the screen address. ROL this left one place to get high byte of the address, and the Carry flag is the bank number.



ASL instead of ROL!

TomXP411
Posts: 1781
Joined: Tue May 19, 2020 8:49 pm

Moving to R39

Post by TomXP411 »



On 6/14/2022 at 3:27 AM, Greg King said:




ASL instead of ROL!



Yes, that would save one byte and 2 CPU cycles. Since ASL always shifts 0 into the low bit, I don't actually need the CLC first. Next time I need to do this, I'll probably use the ASL and save the extra byte. 

That's some of the fun about Assembly language: being able to sift through routines to save one or two bytes on a routine that's 18 bytes long. That one change is more than a 5% decrease in size and execution time... imagine if software engineers took that kind of care writing modern applications and operating systems.

In fact, now that I think about it, I could make this even smaller by removing the branch and rotating the Carry bit directly into $502. Let me see what that does...

... and here's the new routine:

STZ $0500

LDA $9F35

ASL

STA $0501

LDA #$08   ; Increment value. This gets shifted left to $1x in the next step.

ROL

STA $0502

BRK

This saves 7 bytes, although it's slightly less readable.

Also, it fixes a bug in the first example. I was setting the increment byte differently based on which bank the result landed in. This would have created unexpected behavior on R41 systems, assuming I was expecting an increment of 1.

In this case, note that I pre-load A with $08 before rotating in the Carry bit. Since we actually want the final result to set the increment to 1 (so $10 or $11), I pre-loaded the value with the increment one to the right of where I expect it to land. I could have also accomplished this with 

LDA #0

ROL

ORA #$10

STA $0502

But, as you can see, this adds 2 extra bytes. However, this approach is more readable, and it might be preferable in a situation where speed isn't as much of a concern. At the very least, I'd add a comment so the next person knows what I'm doing. 

So here are the test results:

Test on R41: I expect 00 B0 11

.:0500 00 B0 11 00 00 00 00 00

This is correct. R41 sets the Map base to $1:B000

Test on R38: I expect 00 00 10

.:0500 00 00 10 00 00 00 00 00

 

 

Post Reply