	.nolist		
	#include "ion.inc"
	#include "keys.inc"
	.list		
#ifdef TI83P		
	.org progstart-2
	.db $BB,$6D

TEXT_MEM  = $8508
APD_BUF   = $86EC
MUL_HL = $4276

#else		
	.org progstart

TEXT_MEM  = $80c9
APD_BUF   = $8265
MUL_HL = $4382

#endif		
		xor a	
		jr nc,Start
progdesc: .db "PJ I level editor",0


LEVELPT = TEXT_MEM
LEVELY = TEXT_MEM+2
MASK    = TEXT_MEM+3


;-------------------------------------------------------------------------------
;Built-in Level editor:
;-------------------------------------------------------------------------------
Start:
 call ClearAPD
 bcall(_cleargbuf)   ;Clear plotsscreen

DispLevelEdit:
 bcall(_clrlcdf)  ;Clear LCD
 set 7, (iy+$14)   ;Write Text to plotsscreen
 ld     HL, Title
 ld     B, 6
 ld     DE, $011A
 ld     (pencol), DE
 bcall(_vputs)
 inc    D

Disp:
 ld     A, D
 add    A, 6
 ld     D, A
 ld     E, $1A
 ld     (pencol), DE
 bcall(_vputs)
 djnz   Disp
 res 7, (iy+$14)  ;Stop writing to plotsscreen
 xor    A
 ld     (LEVELY), a
 call   EDrwScreen
 ld     A, $80
 ld     (MASK), a
 ld     B, 0
 ld     C, 60
KeyLoop:
WaitKey:
 call   DrawBox  ;Flash box
 push bc
 call ionFastCopy  ;neccessary for smooth scrolling
 pop bc
 call   DrawBox
 push bc
 call ionFastCopy ;neccessary for smooth scrolling
 bcall(_getk) ;Test for keys
 pop bc
 and    A
 jr     z, WaitKey
 cp     G_DOWN
 jr     z, MoveDown
 cp     G_LEFT
 jr     z, MoveLeft
 cp     G_RIGTH
 jp     z, MoveRight
 cp     G_UP
 jp     z, MoveUp
 cp     G_2nd
 jp     z, ChangeStone
 cp     G_MODE
 jp     z, ClearLevel
 cp     G_CLEAR
 jp     z,Exit
 cp     G_DEL
 jp     z,ExitEditor
 cp     G_YEDIT
 jr     nz, KeyLoop
LoadLevel:
 call Write   ;Right the name
 ld hl,NameProg   ; the name of the prog
 bcall(_mov9toop1)
 
 bcall(_chksysvar)   ;Find the prog
 jp c,Exit     ;Return to shell if it doesn't exist

 ex de,hl
 inc hl
 inc hl
 ld     A, (HL)
 cp     3
 ret    nz
 inc    HL
 ld     A, (HL)
 and    A
 ret    nz

 ld     DE, APD_BUF
 ld     BC, 256
 ldir

 ld     HL, APD_BUF
 ld     (LEVELPT), HL
 jp     DispLevelEdit 

MoveDown:
 ld     A, (LEVELY)
 and    A
 jp     z, KeyLoop
 dec    A
 ld     (LEVELY), a
 inc    C
 inc    C
 ld   a, c
 cp   62
 jp   nz, KeyLoop
 ld   hl, (LEVELPT)
 dec  hl
 ld   (LEVELPT), hl
 ld   c, 60
 call   EDrwScreen
 jp KeyLoop
MoveLeft:
 ld   a, b
 and  a
 jp   z, KeyLoop
 dec  b
 dec  b
 ld   a, (MASK)
 add  a, a
 ld   (MASK), a
 jp   KeyLoop
MoveRight:
 ld   a, b
 cp   14
 jp   z, KeyLoop
 inc  b
 inc  b
 ld   a, (MASK)
 rrca
 ld   (MASK), a
 jp   KeyLoop
MoveUp:
 ld   a, (LEVELY)
 cp   252
 jp     z, KeyLoop
 inc  a
 ld   (LEVELY), a
 dec  c
 dec  c
 ld   a, c
 and  a
 jp     nz, KeyLoop
 ld   hl, (LEVELPT)
 inc  hl
 ld   (LEVELPT), hl
 ld   c, 2
 call   EDrwScreen
 jp     KeyLoop
ChangeStone:
 ld     HL, (LEVELPT)
 ld     A, 60
 sub    C
 ld     E, A
 srl    E
 ld     D, 0
 add    HL, DE
 ld     A, (MASK)
 xor    (HL)
 ld     (HL), A
 call   EDrwScreen
 jp     KeyLoop

CLEARLevel:
 call ClearAPD

 bcall(_cleargbuf)
 jp     DispLevelEdit

ExitEditor:

 ;ld hl, APD_BUF
 ;ld de, APD_BUF+252		; Why is this used ?

 ;ldi
 ;ldi
 ;ldi    ;???????
 
 call Write

  ld hl,NameProg   ; the name of the prog
  bcall(_mov9toop1)
  bcall(_chksysvar)  ; look it up
  call nc, delvar
  
 
 ld     hl, 258		; WHY 260 ? It should be 256+2
 bcall(_createprog)    ;Create the prog 
 jr c,Exit
 ld (hl),6

SaveStuff:      ;Save Stuff to VAR
 ex de,hl
 inc hl
 inc hl		; skip the size
 ld     (hl), 3
 inc    hl
 ld     (hl), 0
 inc    hl	; Plain Jump level header
 ex     de,hl
 ld     HL, APD_BUF
 ld     BC, 256
 ldir		; copy the level data
Exit:
 ret   ;return to shell

;-----------------------------------------------------------------------------
;EDrwScreen: draws screen
;-----------------------------------------------------------------------------
EDrwScreen:
 push   BC
 call ClearGraph

 ld     HL, (LEVELPT)
 ld     B, 30
DrawLoop:
 ld     A, B
 add    A, A
 ld     C, A
 push   BC
 ld     D, $80
 ld     B, 0
DrawLoop_:
 ld     A, (HL)
 and    D
 call   nz, DrawBox
 inc    B
 inc    B
 rrc    D
 jr     nc, DrawLoop_
 pop    BC
 inc    HL
 djnz   DrawLoop
 call ionFastCopy
 pop bc
 ret
;-----------------------------------------------------------------------------
;DrawBox
;-----------------------------------------------------------------------------
DrawBox:
 push bc
 push hl
 push de
 call FINDPIXEL
 ld   de,plotsscreen
 add  hl,de
 ld   c, a
 xor  (hl)
 ld   (hl),a
 ld   a, c
 rrca
 xor  (hl)
 ld   (hl), a
 ld   de, 12
 add  hl, de
 ld   a, c
 xor  (hl)
 ld   (hl), a
 ld   a, c
 rrca
 xor  (hl)
 ld   (hl), a
 pop  de
 pop  hl
 pop  bc
 ret

Title:          .db "PJ I level editor",0
Arrow:          .db "ARROWS to Move",0
SecondT:        .db "2ND to Change Block",0
ExitT:          .db "MODE to Clear Level",0
DelT:           .db "DEL to Save Level",0
Clear:          .db "CLEAR to Exit",0
Load:           .db "Y= to Load a Level",0

EnterN:         .db "ENTER NAME:",0

;-------------------------------------------------------------------------------
;FINDPIXEL Routine, by Patrick Davidson [From Zkart3d 82]
;-------------------------------------------------------------------------------
FINDPIXEL_DATA:
         .db      128,64,32,16,8,4,2,1
FINDPIXEL:
         push     bc
         ld       a,b
         and      7
         ld       hl,FINDPIXEL_DATA
         ld       e,a
         ld       d,0
         add      hl,de
         ld       e,(hl)            ; E = pixel mask

        ld a,c

         add      a,a
         add      a,c               ; A = 3 * Y
         ld       l,a
         ld       h,0
         add      hl,hl
         add      hl,hl             ; HL = 12 * Y
         ld       a,b
         ld       b,0
         rrca
         rrca
         rrca
         and      15
         ld       c,a
         add      hl,bc
         ld       a,e               ; A = pixel mask
         pop      bc
         ret


ClearAPD:
 ld     HL, APD_BUF
 ld     (LEVELPT), HL
 ld     BC, 767

OTH_CLEAR:
 ld (hl),0
 ld d,h
 ld e,l
 inc de
 ldir
 ret


ClearGraph:   ;Clear only the first 24 pixels in each row
 push bc
 ld b, 64
 ld hl, plotsscreen
 ld de, 12
 call Loop
 ld b, 64
 ld hl, plotsscreen+1
 ld de, 12
 call Loop
 pop bc 
 ret
Loop:
 ld (hl), 0
 add hl, de
 djnz Loop
 ret


Write:
 ld hl,NameProg+1
 ld bc,8
 call OTH_CLEAR
         bcall(_clrlcdf)
 	   ld de,$0000
	   ld (currow),de
	   ld hl,EnterN
 	   bcall(_puts)
         ld       hl,$0403
         ld       (currow),hl
         ld       hl, NameProg+1
         push     hl
         ld       b,8
space_loop:
         ld       (hl), ' '
         inc      hl
         djnz     space_loop
         pop      ix

enter_name_loop:
	push bc
	   bcall(_getk)
	pop bc
         or       A
         jr       z,enter_name_loop
         cp       $38
         jr       z,backup
	   sub      9
	   jr       z,CheckIfDone
         dec      a
         jp       m,enter_name_loop
         ld       hl,chartable
         ld       e,a
         ld       d,0
         add      hl,de
         ld       a,8
         cp       b
         jr       z,enter_name_loop
         ld       a,(hl)
         or       a
         jr       z,enter_name_loop
         ld       (ix),a
	 bcall(_putc)
         inc      b
         inc      ix
         jr       enter_name_loop
backup:  xor      a
         cp       b
         jr       z,enter_name_loop
         dec      b
         dec      ix
         ld       a,' '

         ld       (ix),a
         ld       hl,curcol
         dec      (hl)
	  bcall(_putc)
         dec      (hl)
         jr       enter_name_loop
CheckIfDone:
 ld a,b
 cp 8
 ret z
 jr enter_name_loop

chartable:
         .db      ":WRMH."
         .DB      "..0VQLG!..ZUPKFC"
         .DB      "..YTOJEBX.>SNIDA"
         .DB      ".12345.."
NameProg:
 .db 5,"        ",0

delvar:
 bcall(_delvar)
 ret

.end

