;ETCH-A-SCETCH version 1.1 for TI-83 by Andrew Von Dollen
;Updated on: 11/8/96

#DEFINE kLeft       02h     ;Rather than use TI's messed
#DEFINE kRight      01h     ;up ones :)
#DEFINE kUp         03h
#DEFINE kDown       04h
#DEFINE kEnter      05h
#DEFINE kClear      09h
#DEFINE kQuit       40h
#DEFINE PROGSTART   9327h
#DEFINE GETKEY      4CFEh
#DEFINE CLRLCDFULL  4755h
#DEFINE GRBUFCLR    515Bh
#DEFINE IPOINT      4AE8h
#DEFINE XCOORD      8265h
#DEFINE YCOORD      8275h
  .org PROGSTART            
Initialize:
  call GRBUFCLR             ;clear backup graph buffer
  call CLRLCDFULL           ;clear screen
  ld a,47                   
  ld (XCOORD),a             ;initialize XCOORD and YCOORD
  ld a,31                   ;to pretty near the center
  ld (YCOORD),a             ;of the screen
Start:
  call GETKEY               ;get a key
  cp kLeft                  ;left arrow pressed?
  jr z,left                 ;if yes, go to "left"
  cp kRight                 ;right arrow pressed?
  jr z,right                ;if yes, go to "right"
  cp kUp                    ;up arrow pressed?
  jr z,up                   ;if yes, go to "up"
  cp kDown                  ;down arrow?
  jr z,down                 ;if yes, go to "down"
  cp kEnter                 ;Enter key?
  jr z,exit                 ;exit this program
  cp kQuit
  jr z,exit
  cp kClear
  jr z,clear
  jr Start                  ;keys that don't work or no key? try again!
left:                       
  ld a,(XCOORD)             ;put the value stored at XCOORD into register a
  dec a                     ;decrement register a
  ld (XCOORD),a             ;put value in a back into XCOORD
  jr Plot                   ;plot it!!
right:
  ld a,(XCOORD)             ;put XCOORD into register a          
  inc a                     ;increment a
  ld (XCOORD),a             ;put it back
  jr Plot                   ;plot the point
up:
  ld a,(YCOORD)             ;put YCOORD into register a
  inc a                     ;increment a
  ld (YCOORD),a             ;put it back
  jr Plot                   ;plot
down:
  ld a,(YCOORD)             ;put YCOORD into register a
  dec a                     ;decrement register a
  ld (YCOORD),a             ;put it back into YCOORD
  jr Plot                   ;plot it
Plot:
  ld a,(XCOORD)             ;put value at XCOORD into register a
  ld b,a                    ;put value in reg. a into reg. b
  ld a,(YCOORD)             ;put YCOORD into reg. a
  ld c,a                    ;put a into c
  ld d,1                    ;put 1 into reg. d (to set the point on)
  call IPOINT               ;call IPOINT (routine that plots a point)
  jr Start                  ;back to the top
clear:
  call CLRLCDFULL
  call GRBUFCLR
  jr Start
exit:
  call CLRLCDFULL           ;clear screen
  ret                       ;return from ASM program
.end
