• Welcome to Valhalla Legends Archive.
 

Just for fun...

Started by iago, February 15, 2003, 06:39 AM

Previous topic - Next topic

iago

Just for fun, here's a Motorola 68k program I wrote for school.  It's not the best written since we're allowed to use a very limited number of instructions.  The purpose is to convert a hex number (in a string) to binary, decimal, and, if possible, ascii:

*****************************************************************
* NAME              iago
* STUDENT NUMBER    666
* COURSE            74.222
* INSTRUCTOR        Sara
* ASSIGNMENT        2
* QUESTION          3
*****************************************************************
*setup low memory
          org       $0
          dc.l      $100000             stack pointer after reset
          dc.l      start               program counter after reset
          org       $1000
*****************************************************************
          include   68kIO.s             Input/Output routines
*****************************************************************
*initialize for I/O
start:    lea       zzduart,a1
          move.b    #%00010000,zzcra(a1)     Reset MR?A pointer
          move.b    #%00100011,zzmr1a(a1)    8 data bits
          move.b    #%00010111,zzmr2a(a1)    Normal Mode
          move.b    #%10111011,zzcsra(a1)    Set clock to 9600
          move.b    #%00000101,zzcra(a1)     Enable Rx and Tx
*****************************************************************
*equ symbols
null      equ       $00                 null string terminator
lf        equ       $0A                 linefeed
cr        equ       $0D                 carriage return
*****************************************************************
* My program starts here
*****************************************************************

main
*Print Identification
      lea      IDBanner,a0         address of IDBanner
      jsr      strout
      jsr      newline

* Get the input values
* Print the prompt
Begin:
      jsr       newline
      lea       GetHex,a0
      jsr       strout

* Input the hex value
      lea       HexStr,a0
      jsr       strin

* d7 = HO Byte
* d6 = LO Byte
* d5 = Decimal Value of byte

* Move half the string into d7
      clr.l       d7
      move.b       (a0)+,d7
* Move the other half into d6
      clr.l       d6
      move.b       (a0),d6

*      jsr       ShowNums

* Clear the decimal byte
      clr.l       d5
* Make d7 and d6 into their decimal values
      sub.l       #'0',d7
      sub.l       #'0',d6

*      jsr       ShowNums

* If d7 is already in decimal, jump over conversion
      cmp.b       #9,d7
      ble       d7IsGood
* Ok, d7 is a hex letter
* The value to subtract is 10 - ('A' - '0') - 1
*                        = 10 - (0x40 - 0x30) - 1
*                        = 10 - 0x10 - 1
*                        = 10 - 16 - 1
*                        = 7
      sub.l       #7,d7
d7IsGood:

* Now do the same for d6
      cmp.b       #9,d6
      ble      d6IsGood
* d6 is hex > 9
      sub.l       #7,d6
d6IsGood:

* Now we multiply d7 by 16 to make it hex
      mulu       #16,d7

* Finally, add them together to get the full decimal value
      add.l       d6,d7

* Here is the easiest place to check for the sentinal, so
* what the heck?
      cmp       #0,d7
      beq       Over
* Display the decimal value
      lea       PutDec,a0
      jsr       strout
      move.l       d7,d0
      jsr       decout

* Make a copy of the number for converting to binary
      move.l       d7,d6
* Load the address of BinStr into a1
      lea       BinStr,a1

* Set up d1 as a counter, and branch to the end of CalcBin
      move.l       #8,d1
      bra       EndBin

* Clear out d2 to store remainder
      clr.l       d2
BegBin:
* Divide d6 by 2
      divu       #2,d6
* Bring the remainder to the front
      swap       d6
* Move the remainder into d2
      move.w       d6,d2
* Get rid of the remainder
      clr.w       d6
* Put the next value to divide back into the LOW
      swap       d6
* Check the remainder, if it's a 1 jump to DoOne, otherwise fall through
      cmp.w       #1,d2
      beq DoOne
* Set the next bit to a zero
      move.b       #0,(a1)+
      bra       EndBin
* Otherwise, set it to a one
DoOne:
      move.b       #1,(a1)+
EndBin:
      dbra       d1,BegBin


      jsr       newline

* Read the binary backwards from a1
      move.l       #8,d1
* Make sure d0 is clean
      clr       d0

*Display BinaryDisplay header
      lea       PutBin,a0
      jsr       strout

      bra       EndBDis
BegBDis:
* Clear d0
      clr.l       d0
* Load the value of a1 into d0
      move.b       -(a1),d0
* Display it
      jsr       decout

EndBDis:
* Checks to see if we've displayed 8 bin values yet
      dbra       d1,BegBDis

      jsr       newline

* Show the ascii header (this would make more sense after the condition,
*  but I didn't invent this!)
      lea       PutChar,a0
      jsr       strout

* If the number is smaller than 0x20 (a control character), don't display
      cmp       #$20,d7
      blt       Begin

      
      lea       AsciiStr,a0
      move.b       d7,(a0)
      jsr       strout



      bra       Begin
* end of processing
Over:
      lea      EOP,a0              address of message
      jsr      newline
      jsr      strout
      break

ShowNums:
*This just outputs d7 and d6 in readable format (for debugging)
      move.l       d7,d0
      jsr       decout
      jsr       newline
      move.l       d6,d0
      jsr       decout
      jsr       newline
      rts
***********************************************************************
IDBanner  dc.b      'NAME               iago',cr,lf
          dc.b      'STUDENT NUMBER     666',cr,lf
          dc.b      'COURSE             74.222',cr,lf
          dc.b      'INSTRUCTOR         Sara',cr,lf
          dc.b      'ASSIGNMENT 2',cr,lf
          dc.b      'QUESTION 3',cr,lf,lf
          dc.b      null                Banner string terminator
EOP       dc.b      'END OF PROCESSING',cr,lf,null
HexStr    dc.w      '    '
        dc.b      null
AsciiStr  dc.b      null      
        dc.b      null                Make sure ascii is null-terminated
BinStr    dc.l      '        '
        dc.b      null
GetHex    dc.b      'Enter a 2-digit (1 byte) hex value: ',null
PutDec    dc.b      'Decimal value: ',null
PutBin    dc.b      'Binary value: ',null
PutChar   dc.b      'Character: ',null


***********************************************************************
          end
This'll make an interesting test for broken AV:
QuoteX5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*



iago

in 20 days, this post will be a year old.
This'll make an interesting test for broken AV:
QuoteX5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*



Skywing

#4
That would be a hint to stop posting in old topics, particularly if you have nothing useful to contribute.

Adron

It could also be a threat - stop or be banned.

iago

Quote from: Adron on January 26, 2004, 11:00 AM
It could also be a threat - stop or be banned.

Skywing's response is more of a threat, mine's a hint :)
This'll make an interesting test for broken AV:
QuoteX5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*


Zorm

I really don't see what the big deal with replying to really old posts is? If they make a new post asking question about some random thing that was already talked about but that they don't understand people will tell them to search anyhow. IMHO people complaining that user x bumped an old post are more annoying then anything else.
"Now, gentlemen, let us do something today which the world make talk of hereafter."
- Admiral Lord Collingwood

iago

Quote from: Zorm on January 27, 2004, 12:53 AM
I really don't see what the big deal with replying to really old posts is? If they make a new post asking question about some random thing that was already talked about but that they don't understand people will tell them to search anyhow. IMHO people complaining that user x bumped an old post are more annoying then anything else.

It's all right if somebody actually has something useful to say, in my opinion.
This'll make an interesting test for broken AV:
QuoteX5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*


Skywing

#9
Quote from: Zorm on January 27, 2004, 12:53 AM
I really don't see what the big deal with replying to really old posts is? If they make a new post asking question about some random thing that was already talked about but that they don't understand people will tell them to search anyhow. IMHO people complaining that user x bumped an old post are more annoying then anything else.
This as known as "spam", typically something which results in wasted time due to rereading topics you've already read.

If you want to discuss this further, please take the discussion to at least a different forum.

Adron

Making useless posts (I.e. "me too" style posts, laughs, or just agreements where noone has disagreed) is acceptable for fresh topics, and where there aren't too many useless posts already. It then adds some measure of feel to the post, kind of like laughing at a joke.

It's unacceptable to make useless posts to old topics, or topics that are getting drowned in useless posts. It's as annoying as people who suddenly start laughing like crazy at a joke you pulled 15 minutes ago, long after the conversation moved on, because they finally understood it.

iago

Quote from: Adron on January 27, 2004, 12:12 PM
It's as annoying as people who suddenly start laughing like crazy at a joke you pulled 15 minutes ago, long after the conversation moved on, because they finally understood it.

haha, I did that on the weekend.  There was a cleverly named something-or-other, and I've known about it for a long time but didn't recognize the pun.  Then somebody said it and it clicked and I said, while everybody was dumbly staring at me, "oooh I get it now! HAH!"  If I remember what the pun was, I'll share it :)
This'll make an interesting test for broken AV:
QuoteX5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*


Banana fanna fo fanna