Testing some code formatting so it doesn't look ugly anymore.
Using http://hilite.me to format the html.
; Simple speed up for MC-10 Microcolor BASIC ; (C) 2018 James Diffendaffer ; May be freely redistributed ; Date: 2/28/2018 ; code to patch the CHRGET function on the direct page ; chrget is used to parse through the BASIC code and gets called a lot. ; by checking the most frequent case in RAM, it saves a 3 clock cycle jmp ; to the remainder of the function in ROM. ; definitions for the TASM cross assembler needed for 6803 syntax .MSFIRST ; Most Significant byte first #define EQU .EQU #define ORG .ORG #define RMB .BLOCK #define FCB .BYTE #define FCC .TEXT #define FDB .WORD #define END .END #define FCS .TEXT #define equ .EQU #define org .ORG #define rmb .BLOCK #define fcb .BYTE #define fcc .TEXT #define fdb .WORD #define end .END #define fcs .TEXT ;start of code org $434B ;1st address after a REM on the first line of codeof the program. ;this is constant on startup in Microcolor BASIC pshx ;preserve register contents psha pshb ldaa $F6 cmpa #$7E ; is it a jmp instruction? bne exit ; if not we exit ldd $F7 ; grab the current address JMP calls addd #$0105 ; hopefully this will skip the compare & branch now on the direct page subd #$0101 ; - to avoid putting a zero in the code. std $FC ; save it at the end of the new code ; ldx #PATCH ; get the address of our patch code minus 1 (to avoid using LDD 0,X) ;pc relative version of ldx to make code relocatable bsr pcRel+1 ; push PC (avoiding zero byte) pcRel: nop ; origin for PC-relative indexing pulx ; X = pcRel ldd PATCH-pcRel,X ; get the firs two bytes std $F6 ; save them ldd PATCH-pcRel+2,x ; get the next two std $F8 ; etc... ldd PATCH-pcRel+4,x std $FA exit: pulb ; restore registers pula pulx rts ; return to BASIC ; contains the patch PATCH: ; FCB $F0 ; dummy byte so LDD doesn't have to use LDD 0,X ; org $00F6 ; the address the patch is meant to run at. Not really needed due to relative branch. cmpa #':' ; set Z flag if statement separator bcs AA ; perform more tests if not rts ; return if >= ':' AA jmp $E1CC ; jump to the parser back end. The address can be dropped ; - because we copy the current one plus 4 now end
No comments:
Post a Comment