0

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


Smokeyparkin
  • 103
  • 6
  • 1
    Which assembler are you using? – larsks Jul 03 '21 at 23:34
  • 1
    These are VIC-II (`41 53 58 00 ♠♥♣@`) screen codes. It's the lowest layer (not ASCII). Those you normally use if you bypass the ASCII layer and talk directly with the VIC. For example, 01 = A, and 02 = B, etc. (by default). – the kamilz Jul 04 '21 at 04:39
  • CMB prg studio is the assembler. – Smokeyparkin Jul 04 '21 at 09:28
  • So how would I make sure that the ASCII codes are being stored into the memory or being converted when they come back? Would I have to find a way to reduce the codes to the likes of 01 etc for each respective ASCII character? How do I only store to an ASCII layer, am I using the wrong part of memory? – Smokeyparkin Jul 04 '21 at 09:31
  • Maybe this will help: https://stackoverflow.com/questions/43498617/ascii-to-c64-screen-codes-in-dasm-assembler – Ruud Helderman Jul 04 '21 at 11:17
  • Have you disabled the normal IRQ? If not, the you do not need to call SCNKEY. – some Jul 10 '21 at 18:52

1 Answers1

1

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
Smokeyparkin
  • 103
  • 6
  • I was trying to reproduce the behavior you mentioned in the question, but ended up getting carried away and used it as an excuse to play around with macros and procedures. I wasn't able to reproduce the behavior (testing in VICE your code seemed to do the right thing for me), but it was fun to muck around. You can see what I ended up with [here](https://github.com/larsks/c64-asm-getname). – larsks Jul 04 '21 at 17:42
  • Since you are clearing the carry before subtraction, you are subtracting with 64. (the carry should be cleared for addition, but set for subtraction). You could probably do `and #$BF` to clear bit 6. – some Jul 08 '21 at 13:11