Lab2
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
Post a Comment