6510/6502 C64 Keyboard input print to screen & store in memory issue

591 views Asked by At

getting somewhere with this but by looking at the Screen Display section of my c64 Reference book, the characters I am typing in below are printing to screen correctly, but when recalled to be printed later again from memory they are not. :(

Basically, if type in an "A" I get the black spade symbol, "S" comes back as a heart symbol and "X" comes back as a club. I must state this doen't happen as I type in as the user, and see my text printed to screen - that works great. It only goes wrong when I hit RETURN as the user and the characters that I think are stored at $1000,x (with inx happening after ever key press) displaying as symbols further down in the allocated area, followed by @ symbols to make up the rest of what I can see is empty spaces in the rest of the byte.

Excuse the messy/over-newb-engineered code, I have been learning Assembly for just under a week or so - with only BASIC as a sorta foundation.

I ran the debugger and when entering "ASX" into the program, the memory location via the debugger looked like this...

41 53 58 00 00 00 00 00 00 00 00 00 00 00 00 00 ♠♥♣@@@@@@@@@@@@@

;USER INPUTS NAME OF CORPORATION

getnamea
        ldx #00
        ldy #00
        jmp getnameb

getnameb
       ; ldx $0900   ; transfer the x value here to a safe address

        jsr $FF9F   ;SCNKEY, place ASCII character into keyboard queue
        jsr $FFE4   ;GETIN, this places the ASCII value into the Accumulator 

        BEQ getnameb ;loop until keys are pressed. Branch if zero
        
        JSR $FFD2    ;CHROUT, print it to the screen as it is being typed in.
        CMP #13      ; CMP looks for the carrige return
        BEQ Name2    ; if we find it we branch using BEQ to name2 for msg2 
        ldx $0900
        STA $1000,x  ; also store what is being typed in consecutively? 
        INX
        INY
        stx $0900
        JMP getnameb ; if we don't we loop!        
                    
                    ; * store exactly what has been typed by the user into a place 
                    ;   in memory and give it the varible name: corpname
                    ; * display some more program defined text that includes the 
                    ; users inputted string

msg1    text 'What is the name of your corporation?'
        byte 0

;------------------------------------------------------------------------------------------------------

;PRINT MSG 2

Name2   LDX #00       ; load into the x registry zero


cycle2  LDA msg2,x    ; load into A the msg2, the x sequence.
        CMP #00       ; compare memory and accumulator to the value 0?    
        BEQ reveal   ; branch/jump if the result in A is 0
        STA 1704,x    ; where on the screen does msg2 start?
        INX           ; inc x to move the print along 1 space?
        
        JMP cycle2    ; jump back to the beginning of cycle and do it all again.

; WHAT DOES THIS DO WHEN WE JUST CALL THE ADDRESS $1000?

reveal  LDX #00
reveal1 
        LDA $1000,x
        STA 1784,x
        INX
        TXA
        CMP #16
        BEQ exit
        JMP reveal1
exit    jsr *



msg2    text `New astro mining corp registration...
        byte 0


1

There are 1 answers

2
Smokeyparkin On

Problem solved, but I would love to know if there was a better way of doing this...

        CLC            ; clear the carry
        LDA $1000,x    ; load the character
        SBC #63        ; subtract 63 from it to get the right character in the first set