Jimmy Virus

Let's some fun with a tiny virus.
Ok I read the source code quickly and this virus is not really bad but as the name should inspire _f3aR and underground so please be afraid about this program.

Ok let's go guys :

.NOLIST #include "ti83plus.inc" ;Standard TI-83 Plus include file #include "mirage.inc" ;Mirage include file #define kEnter 254 .org $9d93 ;Origin .db $BB,$6D ;Compiled AsmPrgm token ret ;Header Byte 1 -- So TIOS wont run .db 1 ;Header Byte 2 -- Identifies as MirageOS prog button: ;Button - should be a 15x15 graphic .db %00000000,%00000000 .db %00011111,%11110000 .db %00100000,%00001000 .db %00100110,%11001000 .db %00100110,%11001000 .db %00100000,%00001000 .db %00011000,%00110000 .db %00001000,%00100000 .db %00000100,%01000000 .db %00000011,%10000000 .db %01100000,%00001100 .db %00111100,%01111000 .db %00000111,%11000000 .db %00011100,%01110000 .db %01110000,%00011100 desc: ;Description - zero terminated .db "Jimmy Virus",0


Ok nothing suspect here, this is the usal mirage os header, the includes (ti83plus.inc and mirage.inc), the token and the icon for mirage os display.
I don't know what to say because there's really nothing special here, so we will continue.

progstart: ;Program code starts here ld a, 5FH out (10H), a bcall(_clrLCDFull) ld (hl), 0000H ld (CurRow), hl ld hl, label bcall(_puts) bcall(_getkey) ret label: .db "You have been ",0 .db "infected with ",0 .db "the Jimmy Virus!",0 .END END


Ok so the virus is here.
What I see here is that Jimmy Conner is simply sending a value to the port which is false. So by sending dummy value to the lcd controller you get a dummy behaviour.
See the wikiti page about this port :

00 : Switch to 6-bit mode. (Port 11 transfers 6-bits at a time.)
01 : Switch to 8-bit mode. (Port 11 transfers 8-bits at a time.)
02 : Disable the screen. This blanks the screen and disconnects the LCD RAM from the physical screen, thus allowing you to use the LCD RAM as extra saferam. (But accessing it is so horribly slow that you should only do this if the usual saferam areas aren't enough and you don't need to display anything.)
03 : Enable the screen. This resumes displaying the LCD's RAM contents to the physical screen. (So any garbage you put into LCD RAM while it was off will show up, so B_CALL ClrLCDFull before this!)
04 : Set X auto-decrement mode. Every read or write operation from the data port will cause the LCD's internal pointer to move up one row.
05 : Set X auto-increment mode. Every read or write operation from the data port will cause the LCD's internal pointer to move down one row. The TI-83+ expects the LCD to be in this mode for most display routines.
06 : Set Y auto-decrement mode. Every read or write operation from the data port will cause the LCD's internal pointer to move left one column.
07 : Set Y auto-increment mode. Every read or write operation from the data port will cause the LCD's internal pointer to move right one column.
[08~0B]: Set power supply enhancement. You'd be well advised to just leave this alone.
[0C~0F]: Applies screen mirroring on newer calculators. Bit 0 set enables horizontal mirroring, bit 1 set enables vertical mirroring.
[10~13]: Set power supply level. You'd be well advised to just leave this alone.
[14~17]: Undefined.
[18]: Cancel test mode (see Comments).
[19~1B]: Undefined.
[1C~1F]: Enter test mode (see Comments).
[20~3F]: Set column. [20~2E] are valid columns in 8-bit mode, [20~33] are valid columns in 6-bit mode. [34~3F] values are also accepted, but do not correspond to a drawable area.
[40~7F]: "Z addressing" (It just changed what phyiscal row the top row of RAM is displayed on. The LCD will wrap the bottom of it's RAM to the top of the screen as needed.)
[80~BF]: Set row.
[C0~FF]: Set contrast. (C0 is lowest. Note that there is a System RAM area (contrast) for this which will need to be updated if you want 2nd+Up/2nd+Down to change the contrast as expected (instead of causing a sudden jump...).)
As you can see sometimes we can read : You'd be well advised to just leave this alone.

The value sends by Jimmy is 5F, so he simply change Z addressing.
As he says, rebooting the calc simply restore a correct behaviour.

This virus is really not hard to understand, and you can write easily your own with a lot of other dummy values to this port (or another one).
But please respect each other and don't crash calc for the pleasure !