Detects 128k, and does double-low-res if available

This commit is contained in:
Charles Mangin 2021-06-16 11:12:47 -04:00 committed by GitHub
parent cb5f9b8943
commit d1d72c37e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 190 additions and 17 deletions

183
QR.6502
View File

@ -63,6 +63,43 @@ RDPAGE2 EQU $C01C ; high bit set if on page2
ROMINIT EQU $FB2F
ROMSETKBD EQU $FE89
ROMSETVID EQU $FE93
SLOT3STATUS EQU $C017 ; bit 7 only
MACHINEID EQU $FBB3
80STOREOFF EQU $C000
80STOREON EQU $C001
80STORE EQU $C018 ; R7
80COLOFF EQU $C00C
80COLON EQU $C00D
80COL EQU $C01F ; R7
TEXTOFF EQU $C050
TEXTON EQU $C051
TEXT EQU $C01A ; R7
MIXEDOFF EQU $C052
MIXEDON EQU $C053
MIXED EQU $C01B ; R7
PAGE2OFF EQU $C054 ; MAIN
PAGE2ON EQU $C055 ; AUX
PAGE2 EQU $C01C ; R7
HIRESOFF EQU $C056
HIRESON EQU $C057
HIRES EQU $C01D ; R7
RAMRDOFF EQU $C002 ; MAIN
RAMRDON EQU $C003 ; AUX
RAMRD EQU $C013 ; R7
RAMWRTOFF EQU $C004 ; MAIN
RAMWRTON EQU $C005 ; AUX
RAMWR EQU $C014 ; R7
**************************************************
* Let's get this party started
@ -75,10 +112,21 @@ ROMSETVID EQU $FE93
SETUP JSR ROMINIT ; GR/HGR off, Text page 1
LDA #$00
STA LORES ; low res graphics mode
STA MIXCLR
JSR CLEARSCREEN ; BLANK SCREEN
STA LORES
STA HIRESOFF
STA MIXCLR
JSR Has128K ; do we have DLR?
BCC SETUPDONE
STA SET80VID ; double low-res mode
STA SETAN3 ; double low-res mode
STA 80STOREON
STA PAGE2OFF ; write to MAIN mem, display MAIN DLR page
SETUPDONE JSR CLEARSCREEN ; BLANK SCREEN
**************************************************
@ -468,7 +516,10 @@ CKCOLUMN CMP #$01 ; IS IT #$01? THEN WE'RE DONE HERE.
JMP NEXTZIG
DODISPLAY LDX #$0 ; COPY THE QR BYTES TO THE SCREEN.
DODISPLAY BIT 80STORE ; 80 column mode, do double-lo-res
BMI DODLR
DOLR LDX #$0 ; COPY THE QR BYTES TO THE SCREEN.
NEXTLINE LDY #$20
@ -496,8 +547,74 @@ QRDONE JMP QRDONE
DODLR ; MOVE GENERATED PIXELS TO DOUBLE LO RES SCREEN
LDX #$0
PAGE1LINE
LDA QRLINESHI,X ; QRLINESHI/LO,X INTO LO/HIBYTE
STA HIBYTE
LDA QRLINESLO,X
STA LOBYTE
INX ; LO RES SCREEN LO/HI INTO COLUMN/ROW
LDA LoLineTableL,X ; TARGET DOWN ONE ROW FOR WHITE SPACE AT TOP
STA ROW
LDA LoLineTableH,X
STA COLUMN
INC ROW
INC ROW ; WHITE SPACE ON LEFT
LDY #$1F ; 33 COLUMNS
NEXTP1COL LDA (LOBYTE),Y ; GET QR PIXEL
PHA
TYA
LSR
TAY
PLA
STA (ROW),Y ; STORE AT SCREEN PIXEL
TYA
ROL
TAY
DEY
DEY
BPL NEXTP1COL
CPX #$11
BNE PAGE1LINE
LDX #$0
STA PAGE2ON
PAGE2LINE
LDA QRLINESHI,X ; QRLINESHI/LO,X INTO LO/HIBYTE
STA HIBYTE
LDA QRLINESLO,X
STA LOBYTE
INX ; LO RES SCREEN LO/HI INTO COLUMN/ROW
LDA LoLineTableL,X ; TARGET DOWN ONE ROW FOR WHITE SPACE AT TOP
STA ROW
LDA LoLineTableH,X
STA COLUMN
INC ROW
INC ROW ; WHITE SPACE ON LEFT
LDY #$20
NEXTP2COL LDA (LOBYTE),Y ; GET QR PIXEL
PHA
TYA
LSR
TAY
PLA
STA (ROW),Y ; STORE AT SCREEN PIXEL
TYA
ROL
TAY
DEY
DEY
BPL NEXTP2COL
CPX #$11
BNE PAGE2LINE
JMP QRDONE
*** NEXTQRBYTE
@ -568,6 +685,10 @@ MASKDONE1 RTS
**************************************************
* blanks the screen quickly.
* CLOBBERS A,Y
@ -624,6 +745,58 @@ CHECKCHAR ; FOR EACH CHARACTER OF THE MESSAGE, CHECK FOR FF
RTS ; OOPS. INVALID CHARACTER.
**************************************************
* DO WE HAVE ACCESS TO 80 COLS/DLR MODE?
* ADAPTED FROM:
* https://github.com/a2-4am/4cade/blob/master/src/hw.memcheck.a
**************************************************
Has128K
bit $C082
sta 80STOREOFF
lda MACHINEID
cmp #$A0
beq IIE ; Spectrum ED
cmp #$06
bne @no ; earlier than //e -> no 128K
IIE lda SLOT3STATUS
bmi @no ; no 80-column card -> no 128K
ldx @checklen
LOOPC lda @checker,x
sta $80,x
dex
bpl LOOPC
jmp $80 ; check if auxmem actually works
@checker
lda #$EE
sta RAMWRTON
sta RAMRDON
sta $0C00
sta $0800
lda $0C00
cmp #$EE
bne @no
asl $0C00
asl
cmp $0C00
bne @no
cmp $0800
bne @yes
@no clc
db #$24
@yes sec
@finish sta RAMWRTOFF
sta RAMRDOFF
rts
@checklen db *-@checker
DS \
QRLINE0 HEX 00,F0,F0,F0,F0,F0,00,FF,00,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,00,F0,F0,F0,F0,F0,00
QRLINE1 HEX 00,FF,00,00,00,FF,00,FF,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,00,FF,00,00,00,FF,00

View File

@ -1,18 +1,18 @@
10 HOME : PRINT "One moment..." : PRINT CHR$ (4)"BLOAD QRCODE,A$2000"
20 VTAB 8: PRINT "This program creates and displays a": PRINT "QR code of 33 by 33 pixels.": PRINT "": PRINT "Choose an encoding type:"
30 HTAB 4: VTAB 14: PRINT "[A] for Alphanumeric.": HTAB 4: PRINT "Up to 114 characters. Limited": HTAB 4: PRINT "to upper case letters, numbers,": HTAB 4: PRINT "$ % * + - . / : and spaces."
40 HTAB 4: VTAB 19: PRINT "[B] for Bytes.": HTAB 4: PRINT "Limited to 78 ASCII characters."
50 VTAB 22: INPUT "Enter A or B :";M$
60 IF NOT (M$ = "A" OR M$ = "B" or M$="a" or M$="b") THEN GOTO 50
70 IF (M$ = "B" or M$="b") THEN M$ = "B": POKE 8,64: GOTO 700
80 IF (M$ = "A" or M$="a") THEN M$ = "A": POKE 8,32: GOTO 800
10 HOME : PRINT "ONE MOMENT..." : PRINT CHR$ (4)"BLOAD QRCODE,A$2000"
20 VTAB 8: PRINT "THIS PROGRAM CREATES AND DISPLAYS A": PRINT "QR CODE OF 33 BY 33 PIXELS.": PRINT "": PRINT "CHOOSE AN ENCODING TYPE:"
30 HTAB 4: VTAB 14: PRINT "[A] FOR ALPHANUMERIC.": HTAB 4: PRINT "UP TO 114 CHARACTERS. LIMITED": HTAB 4: PRINT "TO UPPER CASE LETTERS, NUMBERS,": HTAB 4: PRINT "$ % * + - . / : AND SPACES."
40 HTAB 4: VTAB 19: PRINT "[B] FOR BYTES.": HTAB 4: PRINT "LIMITED TO 78 ASCII CHARACTERS."
50 VTAB 22: INPUT "ENTER A OR B :";M$
60 IF NOT (M$ = "A" OR M$ = "B" OR M$="A" OR M$="B") THEN GOTO 50
70 IF (M$ = "B" OR M$="b") THEN M$ = "B": POKE 8,64: GOTO 700
80 IF (M$ = "A" OR M$="a") THEN M$ = "A": POKE 8,32: GOTO 800
700 HOME : VTAB 8
710 PRINT "BYTE MODE:": PRINT "Enter up to 78 ASCII characters:"
710 PRINT "BYTE MODE:": PRINT "ENTER UP TO 78 ASCII CHARACTERS:"
730 GOTO 1000
800 HOME : VTAB 8
810 PRINT "ALPHANUMERIC MODE:": PRINT "Enter up to 114 characters:"
820 VTAB 16: INVERSE: PRINT "Valid characters:" : PRINT "A-Z 0-9 $ % * + - . / : (space)": NORMAL
810 PRINT "ALPHANUMERIC MODE:": PRINT "ENTER UP TO 114 CHARACTERS:"
820 VTAB 16: INVERSE: PRINT "VALID CHARACTERS:" : PRINT "A-Z 0-9 $ % * + - . / : (SPACE)": NORMAL
1000 VTAB 12: INPUT ">";S$
1010 if ((M$ = "A" and len(S$)>114) or (M$ = "B" and len(S$)>78)) then ? "Message too long.": goto 1000
1010 IF ((M$ = "A" AND LEN(S$)>114) OR (M$ = "B" AND LEN(S$)>78)) THEN ? "MESSAGE TOO LONG.": GOTO 1000
1020 CALL 8192 : REM IF THIS FAILS, THE MESSAGE CONTAINS SOMETHING OUTSIDE THE ALLOWED RANGE
1030 HOME : VTAB 5: INVERSE : ? "INVALID CHARACTERS ENTERED. TRY AGAIN.": NORMAL :VTAB 8:GOTO 810

Binary file not shown.