====== NEWCLS ======
Playing around with some ideas...
===== COLOR BASIC SOURCE =====
The inner loop of the CLS command
* CLEAR SCREEN
LA928 LDB #$60 BLANK
LDX #VIDRAM GET ADDR OF START OF SCREEN BUFFER
LA92D STX CURPOS SAVE IT IN CURPOS
LA92F STB ,X+ FILL SCREEN WITH CONTENTS OF ACCB
CMPX #VIDRAM+511 END OF SCREEN?
BLS LA92F NO
RTS
===== A NEW CLS =====
The part of of the CLS code that I was poking at runs from A928 to A936 - the core loop that uses the main cycles to clear the screen.
By my Slightly Suspect(tm) math, it takes 512 loops of 11 cycles each to clear the low-res text screen using the B register, for a total of around 5632 cycles.
However, if you use the D register, and step X by two, you could cut the looping in half, with only a cycle or two more used in each loop pass... for a total of around 3072 cycles, almost cutting the count in half.
>>> cat newcls.s
CURPOS EQU $88 ; CURSOR POSITION HELD BY COLOR BASIC
VIDRAM EQU $0400 ; START OF VIDEO RAM
ORG $7F00 ; PICK A RAM ADDRESS
NEWCLS PSHS D,X,CC ; SAVE MODIFIED REGISTERS ONTO STACK
LDD #$6060 ; LOAD BLANK CHARACTER IN A AND B
LDX #VIDRAM ; START ADDRESS OF VIDEO TEXT RAM
STX CURPOS ; SET CURSOR POSITION BACK TO HOME
CLRTWO STD ,X++ ; CLEAR TWO BYTES AT X AND INCREMENT X+2
CMPX #VIDRAM+511 ; HAVE WE REACHED THE LAST ADDRESSES?
BLS CLRTWO ; NOT DONE YET, GO TO NEXT
PULS D,X,CC,PC ; CLEAN UP REGISTERS FROM STACK AND RETURN
>>> lwasm -l -o newcls.bin -b -m newcls.s
0088 ( newcls.s):00001 CURPOS EQU $88 ; CURSOR POSITION HELD BY COLOR BASIC
0400 ( newcls.s):00002 VIDRAM EQU $0400 ; START OF VIDEO RAM
( newcls.s):00003
( newcls.s):00004 ORG $7F00 ; PICK A RAM ADDRESS
7F00 3417 ( newcls.s):00005 NEWCLS PSHS D,X,CC ; SAVE MODIFIED REGISTERS ONTO STACK
7F02 CC6060 ( newcls.s):00006 LDD #$6060 ; LOAD BLANK CHARACTER IN A AND B
7F05 8E0400 ( newcls.s):00007 LDX #VIDRAM ; START ADDRESS OF VIDEO TEXT RAM
7F08 9F88 ( newcls.s):00008 STX CURPOS ; SET CURSOR POSITION BACK TO HOME
7F0A ED81 ( newcls.s):00009 CLRTWO STD ,X++ ; CLEAR TWO BYTES AT X AND INCREMENT X+2
7F0C 8C05FF ( newcls.s):00010 CMPX #VIDRAM+511 ; HAVE WE REACHED THE LAST ADDRESSES?
7F0F 23F9 ( newcls.s):00011 BLS CLRTWO ; NOT DONE YET, GO TO NEXT
7F11 3597 ( newcls.s):00012 PULS D,X,CC,PC ; CLEAN UP REGISTERS FROM STACK AND RETURN
Symbol: CLRTWO (newcls.bin) = 7F0A
Symbol: CURPOS (newcls.bin) = 0088
Symbol: NEWCLS (newcls.bin) = 7F00
Symbol: VIDRAM (newcls.bin) = 0400
>>> perl -e 'print chr(255) x (35*18*256)' > newcls.dsk
>>> writecocofile newcls.dsk newcls.bin
Once you load it into a CoCo:
CLEAR 256,32512
LOADM"NEWCLS.BIN"
EXEC32512
===== ADDITIONAL THOUGHTS =====
The replacement loop takes ~4 bytes more than the existing loop in Color BASIC.
These bytes could be recovered by scavenging additional bytes from the code taken by the Microsoft CLS Easter egg.
Also, my code does not allow you to jump into the middle due to the change from RTS to PSHS/PULS, which is how the background color change works ... it jumps into the CLS code after the LDB #$60 green blank character.
Thinking about that, it should be possible to use one of the few zero page addresses as a BCKCLR location, and have it seeded with $6060 or let you push a different character there... beyond just the full color blocks.
===== RTS =====
Return to [[:Tandy Color Computer:]]