Introduction
Hello everyone, my name is Dustin. Today, I'd like to talk about my experience working with another assignment in Assembly language in SPO class.
For this lab, we got to choose 1 out of 3 options that my professor gave to me which are Data Input Form, Hexdump, Screen Colour Selector. I found Data Input Form is another option of my interest I guess.
Requirement
- Create a subroutine which enables the user to enter a string of up to 40 characters. Decide how the data will be returned from the subroutine. The user should be able to use the left/right cursor keys and backspace to edit the text, and the cursor location should be visible to the user.
- Write a program which uses this subroutine to collect the user's name, address, city, province, and postal code, and then display this information formatted as a shipping address (for example, as shown below).
For this lab, it's almost the same as the part 1 that I did, but way more difficult as it has more requirements. For the previous one, I also have to input 2 numbers but this one, I have to handle the whole string 40 characters long. Apart from that, user's also be able to left or right cursor keys or backspace to edit the string they've entered which is AMAZING.
Wrap up
I was stuck many times and truth is Assembly Language is not my thing, the trouble was real. But with the help of my friends, we are able to solve it and get it up and running. Thank you for reading my blog, and below is the code
Code
Rom routines
define SCINIT $ff81 ; initialize/clear screen
define CHROUT $ffd2 ; output character to screen
Declare var
define COLOUR $10
define COLOUR_INDEX $11
define POINTER $40
define POINTER_H $41
define UP_KEY $80
define DOWN_KEY $82
init
lda #$00
sta COLOUR
sta COLOUR_INDEX
jsr initializePrint
up and down arrow keys
getKey:
lda $ff
sty $ff
cmp #UP_KEY
beq decrementKey
cmp #DOWN_KEY
beq incrementKey
jmp getKey
decrementKey:
lda COLOUR
cmp #$01
bpl decrementColour
jmp getKey
decrementColour:
dec COLOUR
jsr initializePrint
jsr initializePaint
jmp getKey
incrementKey:
lda COLOUR
cmp #$0f
bmi incrementColour
jmp getKey
incrementColour:
inc COLOUR
jsr initializePrint
jsr initializePaint
jmp getKey
Print screen
initializePrint:
jsr SCINIT
ldy #$00
writeTitle:
lda title,y
beq titleDone
jsr CHROUT
iny
bne writeTitle
titleDone:
lda #$00
sta COLOUR_INDEX
startColour:
ora #$00
ldy #$00
colourName:
jsr selectedColour
beq afterWriting
jsr highlightLine
jsr CHROUT
iny
bne colourName
afterWriting:
inc COLOUR_INDEX
lda COLOUR_INDEX
cmp #$10
bne startColour
selectedColour:
lda COLOUR_INDEX
cmp #$00
beq printColour0
cmp #$01
beq printColour1
cmp #$02
beq printColour2
cmp #$03
beq printColour3
cmp #$04
beq printColour4
cmp #$05
beq printColour5
cmp #$06
beq printColour6
cmp #$07
beq printColour7
cmp #$08
beq printColour8
cmp #$09
beq printColour9
cmp #$0a
beq printColour10
cmp #$0b
beq printColour11
cmp #$0c
beq printColour12
cmp #$0d
beq printColour13
cmp #$0e
beq printColour14
cmp #$0f
beq printColour15
rts
printColour0:
lda colour0,y
rts
printColour1:
lda colour1,y
rts
printColour2:
lda colour2,y
rts
printColour3:
lda colour3,y
rts
printColour4:
lda colour4,y
rts
printColour5:
lda colour5,y
rts
printColour6:
lda colour6,y
rts
printColour7:
lda colour7,y
rts
printColour8:
lda colour8,y
rts
printColour9:
lda colour9,y
rts
printColour10:
lda colour10,y
rts
printColour11:
lda colour11,y
rts
printColour12:
lda colour12,y
rts
printColour13:
lda colour13,y
rts
printColour14:
lda colour14,y
rts
printColour15:
lda colour15,y
rts
highlightLine:
ldx COLOUR_INDEX
cpx COLOUR
beq highlight
ora #$00
rts
highlight:
ora #$80
rts
Change color of the bitmap
initializePaint:
lda #$00 ; set a pointer at $40 to point to $0200
sta POINTER
lda #$02
sta POINTER_H
ldy #$00
lda COLOUR
draw_screen:
sta ($40), y ; set pixel
iny ; increment index
bne draw_screen ; continue until done the page
inc $41 ; increment the page
ldx $41 ; get the page
cpx #$06 ; compare with 6
bne draw_screen ; continue until done all pages
rts
List of colors on the screen
title:
dcb "L","i","s","t",32,"o","f",32,"C","o","l","o","u","r","s",":",13
dcb 00
colour0:
dcb "B","l","a","c","k",13
dcb 00
colour1:
dcb "W","h","i","t","e",13
dcb 00
colour2:
dcb "R","e","d",13
dcb 00
colour3:
dcb "C","y","a","n",13
dcb 00
colour4:
dcb "P","u","r","p","l","e",13
dcb 00
colour5:
dcb "G","r","e","e","n",13
dcb 00
colour6:
dcb "B","l","u","e",13
dcb 00
colour7:
dcb "Y","e","l","l","o","w",13
dcb 00
colour8:
dcb "O","r","a","n","g","e",13
dcb 00
colour9:
dcb "B","r","o","w","n",13
dcb 00
colour10:
dcb "L","i","g","h","t",32,"r","e","d",13
dcb 00
colour11:
dcb "D","a","r","k",32,"g","r","e","y",13
dcb 00
colour12:
dcb "G","r","e","y",13
dcb 00
colour13:
dcb "L","i","g","h","t",32,"g","r","e","e","n",13
dcb 00
colour14:
dcb "L","i","g","h","t",32,"b","l","u","e",13
dcb 00
colour15:
dcb "L","i","g","h","t",32,"g","r","e","y",13
dcb 00
Top comments (0)