Lab2

Goal:
    - get user input number only
    - generate random number using $FE range from 0 to 1024, but will start with a number range 0 - 255 first
    - user can input number to guess the number
    - if user input an number that is not the target, on display it will mark as red. Mark green if the user input match the target
 
setup: 
 
; ROM routines

define        SCINIT        $ff81 ; initialize/clear screen
define        CHRIN        $ffcf ; input character from keyboard
define        CHROUT        $ffd2 ; output character to screen
define        SCREEN        $ffed ; get screen size
define        PLOT        $fff0 ; get/set cursor coordinates

; Memory locations
define        INPUT        $0000 ; input buffer (up to 4 chars)
define        TARGET        $0010 ; target number

get and store random number:

    LDA $00FE
    STA TARGET,Y
    INY
    LDA $00FE
    STA TARGET,Y
    INY
    LDA $00FE
    STA TARGET,Y
    INY
    LDA $00FE
    STA TARGET,Y
 

storing user input:

GET_INPUT:
    LDA #$A0    ; CODE FOR BLACK SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT

    LDY #$00    ; COUNT OF NUMBERS TYPED
    
GET_CHAR:
    JSR CHRIN
    CMP #$00
    BEQ GET_CHAR

    CMP #$08    ; COMPARE INPUT CHAR WITH BACKSPACE
    BNE CHECK_ENTER    ; ... IF NOT BS, THEN CHECK FOR ENTER

    CPY #$00    ; COMPARE CHAR COUNT WITH 0
    BEQ GET_CHAR    ; ... IF EQUAL THEN GET ANOTHER CHAR

    DEY
    
    LDA #$00    ; CLEAR MEMORY WHEN BACKSPACE
    STA INPUT,Y

    LDA #$20    ; LOAD A WITH CODE FOR WHITE SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT
    JSR CHROUT
    LDA #$A0    ; CODE FOR BLACK SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT

CHECK_ENTER:
    CMP #$0D    ; COMPARE INPUT CHAR WITH ENTER
    BNE CHECK_NUM    ; ... IF NOT ENTER, CHECK FOR LETTERS
    CPY #$01    ; SEE IF WE HAVE AT LEAST 1 NUMBERS
    BCS DONE_INPUT    ; IF WE HAVE AT LEAST 1 CHARS, AND THE USER PRESSED ENTER, DONE!
    ;CMP #$04
    ;JMP DONE_INPUT

CHECK_NUM:
    CMP #48        ; COMPARE INPUT CHAR WITH '0'
    BCC GET_CHAR    ; ... IF LOWER, CHECK IF IT'S UPPERCASE

    CMP #58        ; COMPARE INPUT CHAR WITH '9' + 1
    BCS GET_CHAR    ; ... IF HIGHER THAN '9' THEN GET ANOTHER CHAR
    
    CPY #$04    ; CHECK THE COUNT OF CHARACTERS
    BEQ GET_CHAR    ; ... IF WE HAVE 4 WE CAN'T ACCEPT ANOTHER ONE

    STA INPUT,Y
    JSR CHROUT    ; PRINT RECEIVED LETTER ON THE SCREEN

    LDA #$A0    ; CODE FOR BLACK SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT

    INY
    JMP GET_CHAR


 

user input is store in 0000-0003.

Just learn about x86 and arm. It's crazy, i have to start thinking like a computer. There is so much information to take in. I can't believe Seneca made this class half the time. I wish I have 2 times the time to take in all this cool and fun information.

compare user input with random generate number:

Problem, input is store as hexadecimal in different location. somehow have to change them to decimal and combine them.

    LDA INPUT        ; GET FIRST DIGIT
    AND #$0F
    TAY
    LDA LOOKUP100,Y   ; GET VALUE
    TAX               ; STASH IT IN X

    LDY #$01
    LDA INPUT,Y      ; GET 2ND DIGIT
    AND #$0F
    TAY
    TXA
    CLC
    ADC LOOKUP10,Y    ; GET VALUE, ADD TO RESULT
    TAX

    LDY #02
    LDA INPUT,Y      ; GET 3RD DIGIT
    AND #$0F
    STA TEMP
    TXA
    CLC
    ADC TEMP    ; ADD TO RESULT
    STA $001F
    STA $0300    ; check point
    ;BRK         ; RESULT IS IN A
    STY $0400    ; check point


Done version 1 mini game (still trying to fix just bugsssssss) :

 ; ROM routines
define        SCINIT        $ff81 ; initialize/clear screen
define        CHRIN        $ffcf ; input character from keyboard
define        CHROUT        $ffd2 ; output character to screen
define        SCREEN        $ffed ; get screen size
define        PLOT        $fff0 ; get/set cursor coordinates

; Memory locations
define        INPUT        $0000 ; input buffer (up to 4 chars)
define        TARGET        $0010 ; target number
define        TEMP        $000F
define        INPUT1        $0000
define        INPUT2        $0001
define        INPUT3        $0002

; A number guessing game range from 0 - 1024. Will only accept number
; as input. On display will show if user's guess is close to the target or not

    LDY #$00  ; Initialize character counter
    ; LEFT 0-9,A-F * 16 + RIGHT = decemal
    ; step1: get a random number
    ; step2: get random number x 4 to become the target number
    ; or: get four random number 0-256 and add them up will be the target number
    LDA $00FE

    STA TARGET,Y    
    INY        
    LDA $00FE
    STA TARGET,Y
    INY
    LDA $00FE
    STA TARGET,Y
    INY
    LDA $00FE
    STA TARGET,Y

;============================================================

    JSR SCINIT

    LDY #$00 ; Initialize character counter
PROMPT_INPUT:
    LDA TEXT1,Y
    BEQ DONE_PROMPT
    JSR CHROUT
    INY
    BNE PROMPT_INPUT

PROMPT_AGAIN:
    LDA TEXT5,Y
    BEQ DONE_PROMPT
    JSR CHROUT
    INY
    BNE PROMPT_AGAIN

DONE_PROMPT:
    JSR GET_INPUT

    LDA #$0D
    JSR CHROUT

    LDY #$00

COMPARE_NUM:
    
    ;LDA INPUT,Y
    ;JSR CHROUT
    ;INY
    ;CMP #$00
    ;BNE COMPARE_NUM

    STY $0200    ; check point
    ;*************************

    LDA INPUT        ; GET FIRST DIGIT
    AND #$0F
    TAY
    LDA LOOKUP100,Y   ; GET VALUE
    TAX               ; STASH IT IN X

    LDY #$01
    LDA INPUT,Y      ; GET 2ND DIGIT
    AND #$0F
    TAY
    TXA
    CLC
    ADC LOOKUP10,Y    ; GET VALUE, ADD TO RESULT
    TAX

    LDY #02
    LDA INPUT,Y      ; GET 3RD DIGIT
    AND #$0F
    STA TEMP
    TXA
    CLC
    ADC TEMP    ; ADD TO RESULT
    STA $001F
    STA $0300    ; check point
    ;BRK         ; RESULT IS IN A
    STY $0400    ; check point

    ;*************************

    ;LDY $001F
    CMP TARGET    ; compare
    BEQ PROMPT_WIN    ; if it's equal
    LDX $00

    STY $0500
    LDY #$00
    JMP PROMPT_AGAIN

LOOKUP100:  ; VALUES OF FIRST DIGIT (100s)
    DCB         0,100,200

LOOKUP10:   ; VALUES OF SECOND DIGIT (10s)
    DCB         0,10,20,30,40,50,60,70,80,90

PROMPT_WIN:
    LDX #$00
    JMP PROMPT_WIN_LOOP
    LDX #$00
PROMPT_WIN_LOOP:
    LDA TEXT4,X
    JSR CHROUT
    INX
    CMP #$00
    BNE PROMPT_WIN_LOOP
    RTS

TEXT1:
    dcb "E","n","t","e","r",32,"n","u","m","b","e","r",32,"(","1","0","0","-","2","5","5",")",":",00
TEXT2:
    dcb "H","i","g","h","e","r",00
TEXT3:
    dcb "L","o","w","e","r",00
TEXT4:
    dcb $0d,"Y","o","u",32,"W","o","n","!","!","!",00
TEXT5:
    dcb $0d,"!","!","!",":",00

GET_INPUT:
    LDA #$A0    ; CODE FOR BLACK SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT

    LDY #$00    ; COUNT OF NUMBERS TYPED
    
GET_CHAR:
    JSR CHRIN
    CMP #$00
    BEQ GET_CHAR

    CMP #$08    ; COMPARE INPUT CHAR WITH BACKSPACE
    BNE CHECK_ENTER    ; ... IF NOT BS, THEN CHECK FOR ENTER

    CPY #$00    ; COMPARE CHAR COUNT WITH 0
    BEQ GET_CHAR    ; ... IF EQUAL THEN GET ANOTHER CHAR

    DEY
    
    LDA #$00    ; CLEAR MEMORY WHEN BACKSPACE
    STA INPUT,Y

    LDA #$20    ; LOAD A WITH CODE FOR WHITE SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT
    JSR CHROUT
    LDA #$A0    ; CODE FOR BLACK SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT

CHECK_ENTER:
    CMP #$0D    ; COMPARE INPUT CHAR WITH ENTER
    BNE CHECK_NUM    ; ... IF NOT ENTER, CHECK FOR LETTERS
    CPY #$03    ; SEE IF WE HAVE AT LEAST 1 NUMBERS
    BCS DONE_INPUT    ; IF WE HAVE AT LEAST 1 CHARS, AND THE USER PRESSED ENTER, DONE!
    ;CMP #$04
    ;JMP DONE_INPUT

CHECK_NUM:
    CMP #48        ; COMPARE INPUT CHAR WITH '0'
    BCC GET_CHAR    ; ... IF LOWER, CHECK IF IT'S UPPERCASE

    CMP #58        ; COMPARE INPUT CHAR WITH '9' + 1
    BCS GET_CHAR    ; ... IF HIGHER THAN '9' THEN GET ANOTHER CHAR
    
    CPY #$04    ; CHECK THE COUNT OF CHARACTERS
    BEQ GET_CHAR    ; ... IF WE HAVE 4 WE CAN'T ACCEPT ANOTHER ONE

    STA INPUT,Y
    JSR CHROUT    ; PRINT RECEIVED LETTER ON THE SCREEN

    LDA #$A0    ; CODE FOR BLACK SPACE
    JSR CHROUT
    LDA #$83    ; CODE TO MOVE CURSOR LEFT ONE POSITION
    JSR CHROUT

    INY
    JMP GET_CHAR

DONE_INPUT:
    LDA #$20    ; LOAD A WITH CODE FOR WHITE SPACE
    JSR CHROUT

    RTS


Got to make improvements in the future. This reminds me when I first started learning C/C++. I every week I learn better way to improve my code. And looking back on the code i have wrote in the beginning is not that great and can see ways to improve it. I feel like this would be the same case. As I gain more knowledge on assembly level programming, I sure that I would be able to code better. This process is pain but also very fun.

Comments

Popular posts from this blog

Project Stage 2

Project Stage 1

Project Stage 3