This week's lab also we were supposed to work on Lab 4 and I will talk about the second task that were supposed to work on, in this blog. Now in case you guys did not check out last post this was our task:
Now the approach used was to store each of the inputs was that each iteration would give a message (stored as constant byte) followed by the user input (stored as empty dcb's of required lengths). Then each of the empty constant bytes will be replaced by user input accordingly and displayed in the last iteration with the help of labels. Now there was a very important concept about logical operations we were taught in week 5 which was XOR or EOR which stands for exclusive OR. Anything EOR with 0 would keep the original value and EOR with 1 would give a flipped value. So basically we used it to flip the bits.
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
define POINTER $10 ; ptr: start of row
define POINTER_H $11
define SPOINTER $12 ; ptr: start of screen
define SPOINTER_H $13
define MAX_INPUT $14
lda #$f0
sta SPOINTER_H
lda #40
sta MAX_INPUT
jsr SCINIT
; Name
ldx #<label1 ; loading X with a pointer to the string to be printed
ldy #>label1 ; loading Y with a pointer to the string to be printed
jsr prtstr ; print string
ldx #<name ; loading X with a pointer to the string to be read and store
ldy #>name
lda #len1 ; length of string
jsr getstr ; go get user input
jsr SCINIT
;Address
ldx #<label2
ldy #>label2
jsr prtstr
ldx #<address ; loading X with a pointer to the string to be read and stored
ldy #>address ; loading X with a pointer to the string to be read and stored
lda #len2 ; length of string
jsr getstr ; get user input
jsr SCINIT
;City
ldx #<label3
ldy #>label3
jsr prtstr
ldx #<city ; loading X with a pointer to the string to be read and stored
ldy #>city ; loading Y with a pointer to the string to be read and stored
lda #len3 ; length of string
jsr getstr ; go get user input
jsr SCINIT
; Printing final message and captured details
ldx #<label4 ; load XY with a pointer to the string to be printed
ldy #>label4
jsr prtstr ; go print string
ldx #<name ; load XY with a pointer to the string to be printed
ldy #>name
jsr prtstr ; go print string
jsr prtcrlf
ldx #<address ; load XY with a pointer to the string to be printed
ldy #>address
jsr prtstr ; go print string
jsr prtcrlf
ldx #<city ; load XY with a pointer to the string to be printed
ldy #>city
jsr prtstr ; go print string
jsr prtcrlf
brk
prtcrlf: ;this subroutine moves the code to a newline
ldx #<crlf ; there is only one parameter
ldy #>crlf ;prints a newline carriage return character
jsr prtstr
prtstr: ; this subroutine prints a NULL terminated string
stx POINTER ; there is only one parameter
sty POINTER_H ; registers XY point to the string to be printed
ldy #$00
prtchar:
lda (POINTER),y
beq prtstrdone
jsr CHROUT
iny
bne prtchar
prtstrdone:
rts
getstr: ;this subroutine takes care of the typing and checking of keys
stx POINTER ; there is 2 parameters the pointer and length of string
sty POINTER_H
sta SPOINTER
ldy #$00
check2:
idle: inx
cpx #$10
bne check
lda (SPOINTER),y
eor #$80
sta (SPOINTER),y
check: lda $ff
beq idle
ldx #$00
stx $ff
cmp #$08
bne print
lda (SPOINTER),y
and #$7f
sta (SPOINTER),y
dey
jmp next
print:
cpy MAX_INPUT
beq maxed
cmp #$0D ; check for Enter key
beq done
cmp #$83 ; check for Left arrow key
beq go_left
cmp #$81 ; check for Right arrow key
beq go_right
sta (SPOINTER),y
sta (POINTER),y
iny
maxed:
jmp check2
go_left:
;brk
dey
cpy #$ff
bne not_at_left
iny
not_at_left:
jmp idle
go_right:
;brk
lda (POINTER),y
cmp #$00
;brk
beq not_at_right
iny
not_at_right:
jmp idle
done:
rts
label1:
dcb "p","l","e","a","s","e",32,"e","n","t","e","r",32,"y","o","u","r",32,"n","a","m","e",":",00
define len1 24
label2:
dcb "p","l","e","a","s","e",32,"e","n","t","e","r",32,"y","o","u","r",32,"a","d","d","r","e","s","s",":",00
define len2 27
label3:
dcb "p","l","e","a","s","e",32,"e","n","t","e","r",32,"y","o","u","r",32,"c","i","t","y",32,"a","n","d",32,"p","o","s","t","a","l",32,"c","o","d","e",":",00
define len3 40
label4:
dcb "Y","o","u","r",32,"o","r","d","e","r",32,"w","i","l","l",32,"b","e",32,"d","e","l","i","v","e","r","e","d",32,"t","o",":",$0d,$0d,00
name:
dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$0d
address:
dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$0d
city:
dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$0d
crlf:
dcb $0d,0
So by incorporating previous task's knowledge about working with character display and some additional information we were able to finish this lab.
This week's lecture started with a quiz and it was all about differences between the architecture we already finished learning and the architectures we were in process of learning i.e. 6502, AArch 64 and X86 64. And after the quiz the prof. gave us a summary about the 3.
6502: 8 bit processor, 16 bit address, 3 registers.
X86 64: 64 bit processor, 64 bit address, 16 registers.
AArch 64: 64 bit processor, 64 bit address, 31 registers.
Then we got an insight on how both architectures started from different approaches i.e. RISC (have tiny instructions but small and fast), and CISC (complex instructions) and ended up curving in a way to come on similar grounds.
Then we were shown a sample hello world program that had some weird looking syntax at first but then made sense once we got to understand it.
Overall we knew we were taking a step forward into the this assembly language and had to be ready for it.