Merge pull request #1 from peterferrie/main

a bit faster, explicit memory init
This commit is contained in:
Charles Mangin 2021-06-15 23:33:28 -04:00 committed by GitHub
commit 4e1e69e8a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

224
QR.6502
View File

@ -112,45 +112,33 @@ GETMESSAGE LDA MESSAGE,Y ; 0
STA $FC STA $FC
JSR MULT45 ; RESULT IN FE,FD JSR MULT45 ; RESULT IN FE,FD
CLC CLC
INY ; 1 LDA MESSAGE+1,Y
LDA MESSAGE,Y
ADC $FD ADC $FD
STA $FD STA STORAGE+1,Y ; LO BYTE
BCC STOREPAIR
INC $FE ; RESULT IN FE,FD
STOREPAIR DEY ; 0
LDA $FE LDA $FE
ADC #0 ; RESULT IN FE,FD
STA STORAGE,Y ; HI BYTE STA STORAGE,Y ; HI BYTE
INY ; 1 INY ; 1
LDA $FD
STA STORAGE,Y ; LO BYTE
INY ; 2 INY ; 2
CPY MESSAGELENGTH CPY MESSAGELENGTH
BEQ BUILDQR BCC GETMESSAGE
BCS BUILDQR BCS BUILDQR
JMP GETMESSAGE
************************************************** **************************************************
* Byte mode = ROR each byte in message 4x, append to mode/length bits. * Byte mode = ROR each byte in message 4x, append to mode/length bits.
************************************************** **************************************************
BYTEMODE LDY #$00 BYTEMODE LDY #$FF
FINDLENGTH LDX MESSAGE,Y FINDLENGTH INY
BEQ FOUNDLENGTH LDX MESSAGE,Y
INY BNE FINDLENGTH
JMP FINDLENGTH
FOUNDLENGTH STY MESSAGELENGTH FOUNDLENGTH STY MESSAGELENGTH
LDX MESSAGELENGTH LDA MESSAGE-1,Y ; LAST BYTE OF MESSAGE
DEX ASL ; LO 4 BITS
LDA MESSAGE,X ; LAST BYTE OF MESSAGE ASL
AND #$0F ; LO 4 BITS ASL
CLC ASL
ROL STA STORAGE,Y ; 4 BITS AT END OF CONVERTED MESSAGE
ROL
ROL
ROL
INX
STA STORAGE,X ; 4 BITS AT END OF CONVERTED MESSAGE
COPYMSG LDX #$0 ; COPY THE MESSAGE TO STORAGE COPYMSG LDX #$0 ; COPY THE MESSAGE TO STORAGE
COPYBYTE LDA MESSAGE,X COPYBYTE LDA MESSAGE,X
@ -163,12 +151,10 @@ COPYBYTE LDA MESSAGE,X
LDY #$04 LDY #$04
RORMSG LDX #$0 RORMSG LDX #$0
CLC CLC
PHP RORBYTE ROR STORAGE,X
RORBYTE PLP
ROR STORAGE,X
INX INX
PHP ; PRESERVES CARRY TXA ; DON'T USE CPX, PRESERVES CARRY
CPX MESSAGELENGTH ; BECAUSE CPX CLOBBERS IT EOR MESSAGELENGTH
BNE RORBYTE BNE RORBYTE
DEY DEY
BNE RORMSG BNE RORMSG
@ -183,7 +169,6 @@ BUILDQR
************************************************** **************************************************
LDA MESSAGELENGTH ; NNNNXXXX LDA MESSAGELENGTH ; NNNNXXXX
CLC
LDX MODE LDX MODE
CPX #$40 CPX #$40
BEQ LSR4X BEQ LSR4X
@ -203,32 +188,22 @@ LSR4X LSR
BNE DOALPHAMODE BNE DOALPHAMODE
JMP DOBYTEMODE JMP DOBYTEMODE
DOALPHAMODE AND #$1F ; 000NXXXX DOALPHAMODE ; 000NXXXX
CLC ASL
ROL ; <- 3X ASL ; <- 3X
ROL ASL ; NXXXX 000
ROL ; NXXXX 000
LDX #$0 ORA STORAGE ; 3 BITS OF FIRST HI BYTE
ORA STORAGE,X ; 3 BITS OF FIRST HI BYTE
INY INY
STA MPINTS,Y STA MPINTS,Y
INX
INY INY
LDA STORAGE,X ; FIRST LO BYTE LDA STORAGE+1 ; FIRST LO BYTE
STA MPINTS,Y ; HOW CONVENIENT. FIRST PAIR OF BYTES ENDS ON AN 8X BOUNDARY. JSR NEXTQRBYTE ; HOW CONVENIENT. FIRST PAIR OF BYTES ENDS ON AN 8X BOUNDARY.
INY ; SET UP NEXT BYTE OF QR ; ALSO INITIALIZES BITCOUNTER
* FOR EACH REMAINING PAIR OF BYTES, GET 3 BITS FROM HI, 8 BITS FROM LO
LDA #$08
STA BITCOUNTER ; CURRENT BIT OF QR ENCODING CYCLE
LDA MPINTS,Y ; CURRENT BYTE OF QR DATA
LDX #$02 ; WHICH BYTE OF MESSAGE LDX #$02 ; WHICH BYTE OF MESSAGE
NEXTMBYTE ROL STORAGE,X ; HI BYTE - ROL 5X NEXTMBYTE ASL STORAGE,X ; HI BYTE - ROL 5X
ROL STORAGE,X ROL STORAGE,X
ROL STORAGE,X ROL STORAGE,X
ROL STORAGE,X ROL STORAGE,X
@ -291,39 +266,31 @@ BIT10 ROL STORAGE,X
JSR NEXTQRBYTE JSR NEXTQRBYTE
NEXTHIBYTE INX NEXTHIBYTE INX
CPX MESSAGELENGTH ; up to 114 BYTES OF MESSAGE CPX MESSAGELENGTH ; up to 114 BYTES OF MESSAGE
BEQ PADBYTES
BCS PADBYTES BCS PADBYTES
JMP NEXTMBYTE ; 3 BITS OF HI BYTE AND 8 OF LO BYTE ROTATED INTO QR BYTESTREAM JMP NEXTMBYTE ; 3 BITS OF HI BYTE AND 8 OF LO BYTE ROTATED INTO QR BYTESTREAM
DOBYTEMODE AND #$0F ; A=MESSAGELENGTH. 0000XXXX DOBYTEMODE ; A=MESSAGELENGTH. 0000XXXX
CLC ASL
ROL ASL
ROL ASL
ROL ASL ; XXXX____
ROL ; XXXX____
ORA STORAGE,Y ORA STORAGE,Y
INY BYTEMODELOOP INY
BYTEMODELOOP STA MPINTS,Y
CPY MESSAGELENGTH
BEQ LASTBYTE
LDA STORAGE,Y
INY
JMP BYTEMODELOOP
LASTBYTE LDA STORAGE,Y
INY
STA MPINTS,Y STA MPINTS,Y
JMP PADLOOP LDA STORAGE,Y
CPY MESSAGELENGTH
BCC BYTEMODELOOP
BEQ BYTEMODELOOP
BCS PADLOOP
* pad to 80 bytes with 0s and 11101100 00010001 (#$EC #$11) * pad to 80 bytes with 0s and 11101100 00010001 (#$EC #$11)
PADBYTES LDX BITCOUNTER ; ALWAYS TERMINATE WITH 4 ZEROES PADBYTES LDX BITCOUNTER ; ALWAYS TERMINATE WITH 4 ZEROES
PADBYTES2 CLC db $C9 ; MASK ASL
PADBYTES2 ASL
DEC BITCOUNTER DEC BITCOUNTER
BMI PADBITS BPL PADBYTES2
ROL
JMP PADBYTES2
PADBITS STA MPINTS,Y ; STORE INCOMPLETE BYTE WITH TRAILING ZEROS PADBITS STA MPINTS,Y ; STORE INCOMPLETE BYTE WITH TRAILING ZEROS
CPX #$04 ; NEEDS TO BE AT LEAST 4 FOR TERMINATOR CPX #$04 ; NEEDS TO BE AT LEAST 4 FOR TERMINATOR
BCS PADLOOP BCS PADLOOP
@ -342,42 +309,42 @@ PADLOOP INY ; NEXT QR BYTE
DOECCBYTES LDX #$0 ; OH, THIS GON' BE FUN. DOECCBYTES LDX #$50 ; OH, THIS GON' BE FUN.
LDA #$50
STA BYTECOUNTER ; HOW MANY TIMES HAVE WE BEEN HERE BEFORE? STX BYTECOUNTER ; HOW MANY TIMES HAVE WE BEEN HERE BEFORE?
COPYBYTES LDA MPINTS,X ; COPY COMPLETE MESSAGE BYTES TO STORAGE SPACE AT $8000 COPYBYTES LDA MPINTS,X ; COPY COMPLETE MESSAGE BYTES TO STORAGE SPACE AT $8000
STA STORAGE,X STA STORAGE,X
INX ECCSTEP1
CPX #$51 ; DONE ALL 80 BYTES MSGTOEXP TAY ; convert integers in message to exponents
BNE COPYBYTES
ECCSTEP1 LDX #$0 ; convert integers in message to exponents
MSGTOEXP LDY MPINTS,X ; convert integers in message to exponents
LDA INTTOEXP,Y LDA INTTOEXP,Y
STA MPEXP,X STA MPEXP,X
INX LDA #0
CPX #$51 STA SCRATCH,X
BNE MSGTOEXP ; MSG EXPONENTS IN MPEXP DEX ; DONE ALL 80 BYTES
BPL COPYBYTES
STA XORRESULT+$50
STA XORRESULT+$51
STA XORRESULT+$52 ; SKIPZERO READS OOB
ECCSTEP2 LDX #$0 ; Multiply the Generator Polynomial by the Lead EXPONENT of the Message Polynomial ECCSTEP2 LDX #$0 ; Multiply the Generator Polynomial by the Lead EXPONENT of the Message Polynomial
STEP2LOOP LDA MPEXP ; mp first exponent STEP2LOOP LDA MPEXP ; mp first exponent
CLC CLC
ADC GENERATOR,X ; ADDED TO each gp exponent ADC GENERATOR,X ; ADDED TO each gp exponent
ADC #0 ; MOD 255 ON ROLLOVER > FF ADDS CARRY
TAY TAY
BCC SCRATCHINT ; MOD 255 ON ROLLOVER > FF ADDS CARRY
INY
SCRATCHINT LDA EXPTOINT,Y ; convert EXPONENTS in RESULT to INTEGERS SCRATCHINT LDA EXPTOINT,Y ; convert EXPONENTS in RESULT to INTEGERS
STA SCRATCH,X ; STORE IN WORK AREA 2 STA SCRATCH,X ; STORE IN WORK AREA 2
ECCSTEP3 EOR MPINTS,X ; INTEGER TERMS OF MESSAGE
STA XORRESULT,X ; RESULT FEEDS INTO STEP 1
INX INX
CPX #$15 CPX #$15
BNE STEP2LOOP ; INTEGER RESULTS IN SCRATCH BNE STEP2LOOP ; INTEGER RESULTS IN SCRATCH
ECCSTEP3 LDX #$0 ; XOR the result with the message polynomial (INTEGERS) ; XOR the result with the message polynomial (INTEGERS)
XORBYTE LDA SCRATCH,X ; INTEGER RESULT OF MULTIPLICATION
EOR MPINTS,X ; INTEGER TERMS OF MESSAGE XORBYTE LDA MPINTS,X ; INTEGER TERMS OF MESSAGE
STOREXOR STA XORRESULT,X ; RESULT FEEDS INTO STEP 1 STA XORRESULT,X ; RESULT FEEDS INTO STEP 1
INX INX
CPX #$51 CPX #$51
BNE XORBYTE BNE XORBYTE
@ -410,23 +377,21 @@ XORTOEXP STA MPINTS,Y ; RESULT INTEGERS IN MPINTS
BNE XORTOEXP ; RESULT EXPONENTS IN MPEXP BNE XORTOEXP ; RESULT EXPONENTS IN MPEXP
DEC BYTECOUNTER ; DO ECC MATH UNTIL THERE'S 20 REMAINDERS DEC BYTECOUNTER ; DO ECC MATH UNTIL THERE'S 20 REMAINDERS
BEQ ECCDONE BNE ECCSTEP2
JMP ECCSTEP2
ECCDONE ; XORRESULT CONTAINS 20 ECC BYTES ECCDONE ; XORRESULT CONTAINS 20 ECC BYTES
LDX #$1 LDX #$15
LDY #$50 LDY #$64
BUILDMSG LDA XORRESULT,X BUILDMSG LDA XORRESULT,X
STA STORAGE,Y STA STORAGE,Y
INX DEY
INY DEX
CPX #$16
BNE BUILDMSG ; STORAGE NOW HAS FULL 100 BYTES OF MESSAGE BNE BUILDMSG ; STORAGE NOW HAS FULL 100 BYTES OF MESSAGE
RESETBYTE LDA #$0 ; SET UP FOR BYTE/BIT TRACKING RESETBYTE ;;LDA #$0 ; SET UP FOR BYTE/BIT TRACKING
STA BYTECOUNTER ;;STA BYTECOUNTER
RESETBIT LDA #$8 RESETBIT LDA #$8
STA BITCOUNTER STA BITCOUNTER
@ -434,9 +399,10 @@ RESETBIT LDA #$8
LDA #$20 ; ROW=33 (0-#$20) LDA #$20 ; ROW=33 (0-#$20)
STA ROW ; COLUMN=33 (0-#$20) STA ROW ; COLUMN=33 (0-#$20)
STA COLUMN STA COLUMN
NEXTZIG CLC ; QRLINE=ROW/2 NEXTZIG ; QRLINE=ROW/2
LDA ROW LDA ROW
LSR LSR
PHP
TAX ; LINE NUM OF BLANK QR = ROW/2 TAX ; LINE NUM OF BLANK QR = ROW/2
LDA QRLINESLO,X LDA QRLINESLO,X
STA LOBYTE STA LOBYTE
@ -456,8 +422,7 @@ LONIBBLE AND #$0F
BNE ZAG ; OCCUPIED? BNE ZAG ; OCCUPIED?
JSR SETPIXEL ; GET A BIT FROM THE MESSAGE, AND DEPOSIT INTO THE PIXEL JSR SETPIXEL ; GET A BIT FROM THE MESSAGE, AND DEPOSIT INTO THE PIXEL
ZAG DEY ; ZIG IS DONE/OCCUPIED, TIME TO ZAG - ONE COLUMN TO THE LEFT ZAG DEY ; ZIG IS DONE/OCCUPIED, TIME TO ZAG - ONE COLUMN TO THE LEFT
LDA ROW ; LOST THE CARRY, SO CHECK THE ROW AGAIN PLP ; RESTORE THE CARRY
LSR
LDA (LOBYTE),Y ; GET CURRENT QR PIXEL LDA (LOBYTE),Y ; GET CURRENT QR PIXEL
BCC LONIBBLE2 BCC LONIBBLE2
AND #$F0 AND #$F0
@ -482,14 +447,12 @@ DIVBY4 LSR ; DIVIDE STARTING COLUMN BY 2
GOINGUP LDA ROW GOINGUP LDA ROW
BEQ UTURN ; TURN THE CORNER AT ROW 0 BEQ UTURN ; TURN THE CORNER AT ROW 0
DEC ROW DEC ROW
LDA COLUMN
JMP NEXTZIG ; JMP NEXTZIG ;
GOINGDOWN LDA ROW GOINGDOWN LDA ROW
CMP #$20 ; LAST ROW? CMP #$20 ; LAST ROW?
BEQ UTURN ; TURN THE CORNER, ROW 32 BEQ UTURN ; TURN THE CORNER, ROW 32
INC ROW ; OTHERWISE, NEXT ROW INC ROW ; OTHERWISE, NEXT ROW
LDA COLUMN
JMP NEXTZIG JMP NEXTZIG
UTURN LDA COLUMN UTURN LDA COLUMN
@ -500,7 +463,6 @@ CKCOLUMN CMP #$01 ; IS IT #$01? THEN WE'RE DONE HERE.
BEQ DODISPLAY BEQ DODISPLAY
DEC COLUMN DEC COLUMN
DEC COLUMN ; TWO COLUMNS OVER FOR NEXT ZIG DEC COLUMN ; TWO COLUMNS OVER FOR NEXT ZIG
LDA COLUMN
JMP NEXTZIG JMP NEXTZIG
@ -550,28 +512,20 @@ NEXTQRBYTE STA MPINTS,Y ; STORE COMPLETE BYTE
*** SETPIXEL *** SETPIXEL
SETPIXEL CMP #$01 ; ACC IS GOING TO BE EITHER 01 OR 10 SETPIXEL CMP #$01 ; ACC IS GOING TO BE EITHER 01 OR 10
BEQ SETLONIBBLE PHP
JSR GETNEXTBIT ; LOADS TEMP WITH PROPER F OR 0 JSR GETNEXTBIT ; LOADS TEMP WITH PROPER F OR 0
; Y HAS COLUMN OFFSET ; Y HAS COLUMN OFFSET
; (LOBYTE) HAS ROW ; (LOBYTE) HAS ROW
SETHINIBBLE LDA TEMP EOR (LOBYTE),Y ; MIX BITS
AND #$F0 PLP
STA TEMP BEQ SETLONIBBLE
LDA (LOBYTE),Y ; GET CURRENT QR PIXEL SETHINIBBLE AND #$F0 ; SEPARATE BITS
AND #$0F ; CLEAR HI NIBBLE
JMP SETNIBBLE JMP SETNIBBLE
SETLONIBBLE JSR GETNEXTBIT ; LOADS TEMP WITH PROPER F OR 0 SETLONIBBLE AND #$0F ; SEPARATE BITS
LDA TEMP
AND #$0F
STA TEMP
LDA (LOBYTE),Y ; GET CURRENT QR PIXEL SETNIBBLE EOR (LOBYTE),Y ; MERGE BITS
AND #$F0 ; CLEAR LO NIBBLE
SETNIBBLE EOR TEMP
STA (LOBYTE),Y ; REPLACE QR PIXEL. STA (LOBYTE),Y ; REPLACE QR PIXEL.
RTS RTS
*** SETPIXEL *** SETPIXEL
@ -583,32 +537,28 @@ GETNEXTBIT LDA BITCOUNTER ; WHERE WERE WE IN THE ROL SHENANIGANS?
LDA #$08 ; OR ARE WE? LDA #$08 ; OR ARE WE?
STA BITCOUNTER ; IF SO... STA BITCOUNTER ; IF SO...
INC BYTECOUNTER ; NEXT BYTE INC BYTECOUNTER ; NEXT BYTE
NEXTBIT LDX BYTECOUNTER ; ARE WE DONE WITH ALL 100 BYTES? NEXTBIT LDA TEMP
LDX BYTECOUNTER ; ARE WE DONE WITH ALL 100 BYTES?
CPX #$64 CPX #$64
BEQ MASKDONE BEQ MASKDONE1
DEC BITCOUNTER DEC BITCOUNTER
CLC ASL STORAGE,X
ROL STORAGE,X
BCC WHITEPIXEL
BLACKPIXEL LDA #$00
BEQ COLORPIXEL ; BRANCH ALWAYS
WHITEPIXEL LDA #$FF WHITEPIXEL LDA #$FF
COLORPIXEL STA TEMP BLACKPIXEL ADC #$00
COLORPIXEL TAX
DOMASK ; JFC ON A POGO STICK! GOTTA MASK THE BITS! DOMASK ; JFC ON A POGO STICK! GOTTA MASK THE BITS!
; MASK PATTERN 1: IF (row) mod 2 == 0 THEN FLIP BIT. ; MASK PATTERN 1: IF (row) mod 2 == 0 THEN FLIP BIT.
LDA ROW LDA ROW
LSR LSR
TXA
BCS MASKDONE ; ROW IS ODD, ALL DONE. BCS MASKDONE ; ROW IS ODD, ALL DONE.
LDA TEMP ; ROW IS EVEN, FLIP THE BIT EOR #$FF ; ROW IS EVEN, FLIP THE BIT
BNE FLIPBIT MASKDONE STA TEMP
DEC TEMP ; TEMP IS ZERO, SET TO FF MASKDONE1 RTS
RTS
FLIPBIT INC TEMP ; TEMP IS FF, SET TO ZERO
MASKDONE RTS
*** GETNEXTBIT *** GETNEXTBIT