Browsing articles tagged with " assembler"
Digital Systems CW1: Calculator
$include (reg66x.inc) ; At the very beginning, jump to 40H... ORG 0 TIMECOUNT EQU 8h MBUFFER EQU 10h KBUFFERA EQU 18h KBUFFERB EQU 20h KEY EQU 28h MODE EQU 30h DISPLAYA EQU 38H DISPLAYB EQU 40H DISPLAYC EQU 48H DISPLAYD EQU 50H DISPLAYR EQU 58H CLEARCALLED EQU 60H LJMP CLEAR ; ...which is where our code begins. ORG 40H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAIN: ; Defines the MAIN loop. ACALL INPUT ; INPUT subroutine. ACALL CALCULATE ; CALCULATE subroutine. ACALL OUTPUT ; OUTPUT subroutine. SJMP MAIN ; Jump back to the beginning. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Subroutine: CALCULATE ;;;;; Purpose: Prepares calculations for output. ;;;;; MODE: 1 = ADD, 2 = SUB, 3 = MULT ;;;;; 4 = DIV, 9 = RESULT CALCULATE: MOV A, MODE CJNE A, #0, STOREMODE SJMP NONEOFTHEABOVE STOREMODE: CJNE A, #9, DOSTOREMODE SJMP RESULT DOSTOREMODE: MOV MBUFFER, MODE LJMP CALCULATEDONE RESULT: MOV A, MBUFFER ADDITION: CJNE A, #1, SUBTRACT MOV A, KBUFFERA ADD A, KBUFFERB MOV R0, A MOV B, #10 DIV AB CJNE A, #0, ADDTWODIGITS MOV DISPLAYA, R0 SJMP CLEANUP ADDTWODIGITS: MOV DISPLAYB, A MOV DISPLAYA, B SJMP CLEANUP SUBTRACT: CJNE A, #2, MULTIPLY MOV A, KBUFFERA SUBB A, KBUFFERB MOV DISPLAYA, A SJMP CLEANUP MULTIPLY: CJNE A, #3, DIVIDE MOV A, KBUFFERA MOV B, KBUFFERB MUL AB MOV R0, A MOV B, #10 DIV AB CJNE A, #0, MULTWODIGITS MOV DISPLAYA, R0 SJMP CLEANUP MULTWODIGITS: MOV DISPLAYB, A MOV DISPLAYA, B SJMP CLEANUP DIVIDE: CJNE A, #4, CALCULATEDONE MOV A, KBUFFERA MOV B, KBUFFERB DIV AB MOV DISPLAYA, B MOV DISPLAYR, #1 MOV DISPLAYC, A SJMP CLEANUP NONEOFTHEABOVE: MOV A, MBUFFER CJNE A, #0, STOREB STOREA: MOV KBUFFERA, KEY SJMP STOREDONE STOREB: MOV KBUFFERB, KEY STOREDONE: MOV A, KEY CJNE A, #0, DISPLAYKEY SJMP CALCULATEDONE DISPLAYKEY: MOV DISPLAYA, KEY SJMP CALCULATEDONE CLEANUP: MOV KBUFFERA, #0 MOV KBUFFERB, #0 MOV MBUFFER, #0 MOV KEY, #0 MOV MODE, #0 MOV A, #0 MOV B, #0 CALCULATEDONE: RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Subroutine: OUTPUT ;;;;; Purpose: Updates the display. OUTPUT: MOV P2, #3 MOV P1, DISPLAYD ACALL TIMER MOV P2, #2 MOV P1, DISPLAYC ACALL TIMER MOV P2, #1 MOV A, DISPLAYR CJNE A, #1, DISPLAYBNOW MOV P1, #0FFh CPL P2.4 CPL P2.5 SJMP DISPLAYANOW DISPLAYBNOW: MOV P1, DISPLAYB DISPLAYANOW: ACALL TIMER MOV P2, #0 MOV P1, DISPLAYA RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Subroutine: INPUT ;;;;; Purpose: Read buttons pressed on keypad. INPUT: MOV MODE, #0 MOV P0, #0FFH CLR P0.4 ACALL TIMER MOV A,P0 ANL A, #0FH CJNE A, #0FH, ROWONECOLONE SETB P0.4 CLR P0.5 ACALL TIMER MOV A, P0 ANL A, #0FH CJNE A, #0FH, ROWTWOCOLONE SETB P0.5 CLR P0.6 ACALL TIMER MOV A, P0 ANL A, #0FH CJNE A, #0FH, ROWTHREECOLONE SETB P0.6 CLR P0.7 ACALL TIMER MOV A, P0 ANL A, #0FH CJNE A, #0FH, ROWFOURCOLONE RET ROWONECOLONE: CJNE A, #14, ROWONECOLTWO MOV KEY, #1h RET ROWONECOLTWO: CJNE A, #13, ROWONECOLTHREE MOV KEY, #2h RET ROWONECOLTHREE: CJNE A, #11, ROWONECOLFOUR MOV KEY, #3h RET ROWONECOLFOUR: MOV MODE, #1 ; mode 1 = ADD RET ROWTWOCOLONE: CJNE A, #14, ROWTWOCOLTWO MOV KEY, #4h RET ROWTWOCOLTWO: CJNE A, #13, ROWTWOCOLTHREE MOV KEY, #5h RET ROWTWOCOLTHREE: CJNE A, #11, ROWTWOCOLFOUR MOV KEY, #6h RET ROWTWOCOLFOUR: MOV MODE, #2 ; mode 1 = SUB RET ROWTHREECOLONE: CJNE A, #14, ROWTHREECOLTWO MOV KEY, #7h RET ROWTHREECOLTWO: CJNE A, #13, ROWTHREECOLTHREE MOV KEY, #8h RET ROWTHREECOLTHREE: CJNE A, #11, ROWTHREECOLFOUR MOV KEY, #9h RET ROWTHREECOLFOUR: MOV MODE, #3 ; mode 1 = MULT RET ROWFOURCOLONE: CJNE A, #14, ROWFOURCOLTWO MOV CLEARCALLED, #1 ACALL CLEAR RET ROWFOURCOLTWO: CJNE A, #13, ROWFOURCOLTHREE MOV KEY, #0h RET ROWFOURCOLTHREE: CJNE A, #11, ROWFOURCOLFOUR MOV MODE, #9 ; mode 9 = EQUALS RET ROWFOURCOLFOUR: CJNE A, #7, NOKEYSCAN MOV MODE, #4 ; mode 4 = DIVIDE RET NOKEYSCAN: RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Subroutine: CLEAR ;;;;; Purpose: Reset the shit out of it. CLEAR: MOV KBUFFERA, #0 MOV KBUFFERB, #0 MOV MBUFFER, #0 MOV DISPLAYA, #0 MOV DISPLAYB, #0 MOV DISPLAYC, #0 MOV DISPLAYD, #0 MOV DISPLAYR, #0 MOV KEY, #0 MOV MODE, #0 MOV A, #0 MOV B, #0 MOV A, CLEARCALLED CJNE A, #0, CLEARRET LJMP MAIN CLEARRET: MOV A, #0 MOV CLEARCALLED, #0 RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Subroutine: TIMER ;;;;; Purpose: Produce a 58ms-ish delay on ACALL. TIMER: MOV R0, #255 TIMELOOPA: DJNZ R0, TIMELOOPA TIMEDONE: RET END
Also Check Out
Tags
android
apache
applescript
assembler
autoit
bash
beta
bugfix
c
camera
code
cpld
essay
flash
html
irc
lighttpd
mac
micro
mobile
networking
not very good
palm
patch
perl
phones
photography
php
poe
proof of concept
robotics
screen scraping
sms
spherebot
tinyurl
tools
uni
uni first year
uni second year
vhdl
weather
web
webdav
windows
writing
Lifestream
-
Listened to Beautiful Beast - Aidan Baker.
-
Listened to Machina - Aidan Baker.
-
Listened to Green & Cold - Aidan Baker.
-
Listened to Chainsaw - Aidan Baker.
-
Listened to Untitled - Aidan Baker.
-
Listened to The Little Things Give You Away - Linkin Park.
-
Listened to Kuolema tekee taiteilijan - Nightwish.
-
Listened to Ain't No Sense In Love - Take That.






