;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; file name : os.asm ;
; author :
; description : LC4 Assembly program to serve as an OS ;
Copyright By PowCoder代写 加微信 powcoder
; TRAPS will be implemented in this file ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;; OS – TRAP VECTOR TABLE ;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ADDR x8000
; TRAP vector table
JMP TRAP_GETC ; x00
JMP TRAP_PUTC ; x01
JMP TRAP_GETS ; x02
JMP TRAP_PUTS ; x03
JMP TRAP_TIMER ; x04
JMP TRAP_GETC_TIMER ; x05
JMP TRAP_RESET_VMEM ; x06
JMP TRAP_BLT_VMEM ; x07
JMP TRAP_DRAW_PIXEL ; x08
JMP TRAP_DRAW_RECT ; x09
JMP TRAP_DRAW_SPRITE ; x0A
; TO DO – add additional vectors as described in homework
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;; OS – MEMORY ADDRESSES & CONSTANTS ;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; these handy alias’ will be used in the TRAPs that follow
USER_CODE_ADDR .UCONST x0000 ; start of USER code
OS_CODE_ADDR .UCONST x8000 ; start of OS code
OS_GLOBALS_ADDR .UCONST xA000 ; start of OS global mem
OS_STACK_ADDR .UCONST xBFFF ; start of OS stack mem
OS_KBSR_ADDR .UCONST xFE00 ; alias for keyboard status reg
OS_KBDR_ADDR .UCONST xFE02 ; alias for keyboard data reg
OS_ADSR_ADDR .UCONST xFE04 ; alias for display status register
OS_ADDR_ADDR .UCONST xFE06 ; alias for display data register
OS_TSR_ADDR .UCONST xFE08 ; alias for timer status register
OS_TIR_ADDR .UCONST xFE0A ; alias for timer interval register
OS_VDCR_ADDR .UCONST xFE0C ; video display control register
OS_MCR_ADDR .UCONST xFFEE ; machine control register
OS_VIDEO_NUM_COLS .UCONST #128
OS_VIDEO_NUM_ROWS .UCONST #124
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;; OS DATA MEMORY RESERVATIONS ;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ADDR xA000
OS_GLOBALS_MEM .BLKW x1000
;;; LFSR value used by lfsr code
LFSR .FILL 0x0001
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;; OS VIDEO MEMORY RESERVATION ;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ADDR xC000
OS_VIDEO_MEM .BLKW x3E00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;; OS & TRAP IMPLEMENTATIONS BEGIN HERE ;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ADDR x8200
;; first job of OS is to return PennSim to x0000 & downgrade privledge
CONST R7, #0 ; R7 = 0
RTI ; PC = R7 ; PSR[15]=0
;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_GETC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: Get a single character from keyboard
;;; Inputs – none
;;; Outputs – R0 = ASCII character from ASCII keyboard
LC R0, OS_KBSR_ADDR ; R0 = address of keyboard status reg
LDR R0, R0, #0 ; R0 = value of keyboard status reg
BRzp TRAP_GETC ; if R0[15]=1, data is waiting!
; else, loop and check again…
; reaching here, means data is waiting in keyboard data reg
LC R0, OS_KBDR_ADDR ; R0 = address of keyboard data reg
LDR R0, R0, #0 ; R0 = value of keyboard data reg
RTI ; PC = R7 ; PSR[15]=0
;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_PUTC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: Put a single character out to ASCII display
;;; Inputs – R0 = ASCII character to write to ASCII display
;;; Outputs – none
LC R1, OS_ADSR_ADDR ; R1 = address of display status reg
LDR R1, R1, #0 ; R1 = value of display status reg
BRzp TRAP_PUTC ; if R1[15]=1, display is ready to write!
; else, loop and check again…
; reaching here, means console is ready to display next char
LC R1, OS_ADDR_ADDR ; R1 = address of display data reg
STR R0, R1, #0 ; R1 = value of keyboard data reg (R0)
RTI ; PC = R7 ; PSR[15]=0
;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_GETS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: Get a string of characters from the ASCII keyboard
;;; Inputs – R0 = Address to place characters from keyboard
;;; Outputs – R1 = Lenght of the string without the NULL
;; TO DO: complete this trap
;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_PUTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: Put a string of characters out to ASCII display
;;; Inputs – R0 = Address for first character
;;; Outputs – none
;; TO DO: complete this trap
;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_TIMER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function:
;;; Inputs – R0 = time to wait in milliseconds
;;; Outputs – none
TRAP_TIMER
LC R1, OS_TIR_ADDR ; R1 = address of timer interval reg
STR R0, R1, #0 ; Store R0 in timer interval register
LC R1, OS_TSR_ADDR ; Save timer status register in R1
LDR R1, R1, #0 ; Load the contents of TSR in R1
BRzp COUNT ; If R1[15]=1, timer has gone off!
; reaching this line means we’ve finished counting R0
RTI ; PC = R7 ; PSR[15]=0
;;;;;;;;;;;;;;;;;;;;;;; TRAP_GETC_TIMER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: Get a single character from keyboard
;;; Inputs – R0 = time to wait
;;; Outputs – R0 = ASCII character from keyboard (or NULL)
TRAP_GETC_TIMER
;; TO DO: complete this trap
RTI ; PC = R7 ; PSR[15]=0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_RESET_VMEM ;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; In double-buffered video mode, resets the video display
;;; DO NOT MODIFY this trap, it’s for future HWs
;;; Inputs – none
;;; Outputs – none
TRAP_RESET_VMEM
LC R4, OS_VDCR_ADDR
CONST R5, #1
STR R5, R4, #0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_BLT_VMEM ;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; TRAP_BLT_VMEM – In double-buffered video mode, copies the contents
;;; of video memory to the video display.
;;; DO NOT MODIFY this trap, it’s for future HWs
;;; Inputs – none
;;; Outputs – none
TRAP_BLT_VMEM
LC R4, OS_VDCR_ADDR
CONST R5, #2
STR R5, R4, #0
;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_DRAW_PIXEL ;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: Draw point on video display
;;; Inputs – R0 = row to draw on (y)
;;; – R1 = column to draw on (x)
;;; – R2 = color to draw with
;;; Outputs – none
TRAP_DRAW_PIXEL
LEA R3, OS_VIDEO_MEM ; R3=start address of video memory
LC R4, OS_VIDEO_NUM_COLS ; R4=number of columns
CMPIU R1, #0 ; Checks if x coord from input is > 0
BRn END_PIXEL
CMPIU R1, #127 ; Checks if x coord from input is < 127
BRp END_PIXEL
CMPIU R0, #0 ; Checks if y coord from input is > 0
BRn END_PIXEL
CMPIU R0, #123 ; Checks if y coord from input is < 123
BRp END_PIXEL
MUL R4, R0, R4 ; R4= (row * NUM_COLS)
ADD R4, R4, R1 ; R4= (row * NUM_COLS) + col
ADD R4, R4, R3 ; Add the offset to the start of video memory
STR R2, R4, #0 ; Fill in the pixel with color from user (R2)
RTI ; PC = R7 ; PSR[15]=0
;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_DRAW_RECT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: EDIT ME!
;;; Inputs EDIT ME!
;;; Outputs EDIT ME!
TRAP_DRAW_RECT
;; TO DO: complete this trap
;;;;;;;;;;;;;;;;;;;;;;;;;;; TRAP_DRAW_SPRITE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Function: EDIT ME!
;;; Inputs EDIT ME!
;;; Outputs EDIT ME!
TRAP_DRAW_SPRITE
;; TO DO: complete this trap
;; TO DO: Add TRAPs in HW
程序代写 CS代考 加微信: powcoder QQ: 1823890830 Email: powcoder@163.com