; Chess 83 - by Harper Maddox .NOLIST #define equ .equ #define EQU .equ #define end .end #include "ti83asm.inc" #include "tokens.inc" .LIST .org 9327h curX = SAVESSCREEN curY = SAVESSCREEN+1 curS = curY+1 XCoord = curS+2 YCoord = curS+3 move = curS+4 temp = move+1 mins = move+2 secs = move+3 time = move+4 nop ;these 2 lines identify the program jr prog_start ;as AShell-compatable .dw $0000 ;Version of table .dw desc ;Points to the program description prog_start: call drawboard ; Routine that draws the chess board + piece call _grbufcpy_V call message ; Displays a message box on the screen ld a,3 ld (curcol),a ld a,3 ld (currow),a ld hl,restore call _puts ; big font Home Screen ld a,4 ld (currow),a ld a,3 ld (curcol),a ld hl,restart call _puts ld a,3 ld (temp),a ld a,1 ld (curcol),a stloop: ld a,3 ld (currow),a ld a,lspace call _putmap ; put big character ld a,4 ld (currow),a ld a,lspace call _putmap ld a,(temp) ld (currow),a ld a,$DF call _putmap call _getkey ; wait for keypress cp 4 call z,incchos cp 3 call z,decchos cp 9 ret z cp 5 jr nz,stloop ld a,(temp) cp 3 jr z,incipio call rstgame ; reset chessboard incipio: ; btw "incipio" is latin for begin xor a ld (temp),a ld hl,arrow ld (CurS),hl Keyloop: ld de,plotsscreen+8 ld hl,fullLINE ld bc,4 ldir ld de,plotsscreen+764 ld hl,fullLINE ld bc,4 ldir ld de,plotsscreen+20 ld b,62 borderlop: push bc ld bc,4 ld hl,eraseline ldir ld hl,8 add hl,de ex de,hl pop bc djnz borderlop ld a,(move) or a jr z,whiteST ld de,plotsscreen+680 ld b,7 btextlop: push bc ld bc,4 ld hl,Fullline ldir ld hl,8 add hl,de ex de,hl pop bc djnz btextlop whiteST: call drawboard ld a,(curY) ld e,a ld a,(curX) ld hl,(CurS) call sprite call _grbufcpy_V call find_XY ld hl,256+85 ld (pencol),hl ld a,(Xcoord) ld b,a ld a,La add a,b call _vputmap ld a,(Ycoord) ld b,a ld a,8 sub b call _setxxop1 ld a,2 call _dispop1a call chgtime ld a,0ffh ;reset keyport out (1),a ;necessary code ld a,0FEh ; Check the arrow keys out (1),a in a,(1) bit 0,a push af CALL z,MoveDown ; If you don't use call, don't forget to jump back to the line coming below! pop af bit 1,a push af CALL z,MoveLeft ; Also remember pushing the A register if you change it in the call! pop af bit 2,a push af CALL z,MoveRight pop af bit 3,a CALL z,MoveUp ld a,0ffh ;reset keyport out (1),a ;necessary code ld a,$DF ; Check 2nd and more out (1),a in a,(1) push af cp 127 call z,deselect pop af cp 255 jp nz,Keyloop ld a,0ffh ;reset keyport out (1),a ;necessary code ld a,$BF ; Check 2nd and more out (1),a in a,(1) cp 223 call z,MovePiece cp 127 call z,UndoMove cp 191 jp nz,Keyloop ret MoveUp: ld a,(curY) or a ret z dec a ld (curY),a ret MoveDown: ld a,(CurY) cp 56 ret z inc a ld (CurY),a ret MoveLeft: ld a,(curX) or a ret z dec a ld (curX),a ret MoveRight: ld a,(curX) cp 88 ret z inc a ld (curX),a ret deselect: ld a,(Yorig) cp $F0 ret z ld a,$F0 ld (Yorig),a ld hl,arrow ld (curS),hl ret MovePiece: ld a,(Yorig) cp $F0 jr z,Get_XY_init call find_xy call ConvertXY2 ex de,hl push hl call ConvertXY ex de,hl pop hl call _cphlde ret z ld a,(de) ld (psave),a ldi dec hl ld (hl),0 ld a,(Xorig) ld (xsave2),a ld a,(yorig) ld (ysave2),a ld a,(xcoord) ld (xsave),a ld a,(ycoord) ld (ysave),a ld a,$F0 ld (Yorig),a ld hl,arrow ld (curS),hl moveth: ld a,(move) inc a and %1 ld (move),a ret Get_XY_Init: call Find_XY call ConvertXY ld a,(move) cp 1 jr z,Get_White_XY ld a,(hl) cp 7 ret nc or a ret z Get_XY2: call get_piece ld (curS),hl ld a,(Xcoord) ld (Xorig),a ld a,(Ycoord) ld (Yorig),a call rsttemp ld (temp),a ret Get_White_XY: ld a,(hl) cp 7 jr nc,Get_XY2 ret UndoMove: ld a,(Ysave) cp $F0 ret z ld a,(Xsave2) ; orig = save ld (Xcoord),a ld a,(Ysave2) ld (Ycoord),a ld a,(Xsave) ld (Xorig),a ld a,(Ysave) ld (Yorig),a call convertXY2 ; piece location ex de,hl push hl call convertXY ; destination location ex de,hl pop hl ldi dec hl ld a,(Psave) ld (hl),a ld a,$F0 ld (Ysave),a ld (Yorig),a jp moveth Find_XY: ld a,(curY) srl a srl a srl a ; Y/8 ld (Ycoord),a ld a,(curX) srl a srl a srl a ld (Xcoord),a ret rsttemp: xor a ld (temp),a ret chgtime: ld a,(time) inc a ld (time),a cp 21 jr c,disptime xor a ld (time),a ld a,(secs) inc a cp 60 call z,upmins ld (secs),a jr disptime upmins: ld hl,mins inc (hl) xor a ret disptime: ld a,(move) or a jr z,whitetxt set textInverse,(iy+textflags) ld hl,56*256+72 ld (pencol),hl ld hl,black call _vputs res textInverse,(iy+textflags) jr timer whitetxt: ld hl,56*256+71 ld (pencol),hl ld hl,white call _vputs timer: ld hl,13*256+73 ld (pencol),hl ld a,(mins) call _setxxop1 ld a,2 call _dispop1a ld a,Lcolon call _vputmap ld a,(secs) call _setxxop1 ld a,2 call _dispop1a ret FXY: ld d,0 ld a,(YCoord) ld l,a ld h,96 call _htimesl ld a,(XCoord) ld e,a add hl,de ret ConvertXY: ld d,0 ld a,(YCoord) ld l,a ld h,8 call _htimesl ld a,(XCoord) ld e,a add hl,de ld de,board add hl,de ret ConvertXY2: ld d,0 ld a,(YOrig) ld l,a ld h,8 call _htimesl ld a,(XOrig) ld e,a add hl,de ld de,board add hl,de ex de,hl ret drawboard: call _grbufclr ld hl,chekers call drawstuff ld hl,board drawstuff: ld de,plotsscreen ld c,8 ; WHY CANT IT BE >6 bleep: ld b,8 bloop: ld a,(hl) or a jr z,no_sprite push bc push hl call GET_piece call chpiece ; aligned sprite routine pop hl pop bc no_sprite: inc hl inc de djnz bloop push hl ld hl,88 ; 8 + 12*7 add hl,de ex de,hl pop hl dec c ld a,c or a jr nz,bleep ret get_piece: ld b,a ld hl,pieces ; chess piece sprites sprite_inc_loop: push bc ld bc,8 ; load the next sprite into hl add hl,bc pop bc djnz sprite_inc_loop ret chpiece: push de ld b,8 sprt_loop: push bc ldi push hl ld hl,11 add hl,de ex de,hl pop hl pop bc djnz sprt_loop pop de ret rstgame: ld hl,bkup ld de,board ld bc,64 ldir ld a,$F0 ld (Xorig),a xor a ld (move),a ld (mins),a ld (secs),a call drawboard ret message: ld hl,8e29h+252 ; Graph Buffer + 252 ld b,21 clrlop: push bc ld b,8 clop2: ld (hl),0 inc hl djnz clop2 inc hl inc hl inc hl inc hl pop bc djnz clrlop call _grbufcpy_V ; copy graphbuffer ld b,3 ld c,41 ld d,61 ld e,41 ld h,1 call _iline ; draw line 62 is top of screen ... 0 = bottom ld b,3 ld c,23 ld d,61 ld e,23 ld h,1 call _iline ld b,3 ld c,41 ld d,3 ld e,23 ld h,1 call _iline ld b,61 ld c,41 ld d,61 ld e,23 ld h,1 call _iline ret incchos: ld a,(temp) cp 4 ret z inc a ld (temp),a ret decchos: ld a,(temp) cp 3 ret z dec a ld (temp),a ret SPRITE: push hl ; Save sprite address ;лллл Calculate the address in graphbuf лллл ld hl,0 ; Do y*12 ld d,0 add hl,de add hl,de add hl,de add hl,hl add hl,hl ld d,0 ; Do x/8 ld e,a srl e srl e srl e add hl,de ld de,8e29h add hl,de ; Add address to graphbuf ld b,00000111b ; Get the remainder of x/8 and b cp 0 ; Is this sprite aligned to 8*n,y? jr z,ALIGN ;лллл Non aligned sprite blit starts here лллл pop ix ; ix->sprite ld d,a ; d=how many bits to shift each line ld e,8 ; Line loop LILOP: ld b,(ix+0) ; Get sprite data ld c,0 ; Shift loop push de SHLOP: srl b rr c dec d jp nz,SHLOP pop de ld a,b ; Write line to graphbuf or (hl) ld (hl),a inc hl ld a,c or (hl) ; SLIGHT EDITING... or -> and ld (hl),a ld bc,11 ; Calculate next line address add hl,bc inc ix ; Inc spritepointer dec e jr nz,LILOP ; Next line jr DONE1 ;лллл Aligned sprite blit starts here лллл ALIGN: ; Blit an aligned sprite to graphbuf pop de ; de->sprite ld b,8 ALOP1: ld a,(de) or (hl) ; xor=erase/blit ld (hl),a inc de push bc ld bc,12 add hl,bc pop bc djnz ALOP1 DONE1: ret pieces: .dw 0,0,0,0 ;wpawn .db %00000000 .db %00000000 .db %00011000 .db %00100100 .db %00011000 .db %00011000 .db %00111100 .db %00000000 ;wbishop .db %00000000 .db %00001000 .db %00010100 .db %00100010 .db %00010100 .db %00010100 .db %00111110 .db %00000000 ;wknight .db %00000000 .db %00011100 .db %00101010 .db %01100010 .db %00010100 .db %00101000 .db %01111110 .db %00000000 ;wrook .db %00000000 .db %00101010 .db %00111110 .db %00010100 .db %00010100 .db %00010100 .db %00111110 .db %00000000 ;wqueen .db %00000000 .db %01011010 .db %00100100 .db %00011000 .db %00100100 .db %01000010 .db %01111110 .db %00000000 ;wking .db %00000000 .db %00001000 .db %00011100 .db %00001000 .db %00010100 .db %00010100 .db %00111110 .db %00000000 ;b pawn .db %00000000 .db %00000000 .db %00011000 .db %00111100 .db %00011000 .db %00011000 .db %00111100 .db %00000000 ;b bishop .db %00000000 .db %00001000 .db %00011100 .db %00111110 .db %00011100 .db %00011100 .db %00111110 .db %00000000 ;b knight .db %00000000 .db %00011100 .db %00110110 .db %01111110 .db %00011100 .db %00111000 .db %01111110 .db %00000000 ;b rook .db %00000000 .db %00101010 .db %00111110 .db %00011100 .db %00011100 .db %00011100 .db %00111110 .db %00000000 ;b queen .db %00000000 .db %01011010 .db %00111100 .db %00011000 .db %00111100 .db %01111110 .db %01111110 .db %00000000 ;b king .db %00000000 .db %00001000 .db %00011100 .db %00001000 .db %00011100 .db %00011100 .db %00111110 .db %00000000 box: .db %10101010 .db %01010101 .db %10101010 .db %01010101 .db %10101010 .db %01010101 .db %10101010 .db %01010101 arrow: .db %01000000 .db %01100000 .db %01110000 .db %01111000 .db %01111100 .db %01111000 .db %01111100 .db %01011000 chekers: .db 0,13,0,13,0,13,0,13 .db 13,0,13,0,13,0,13,0 .db 0,13,0,13,0,13,0,13 .db 13,0,13,0,13,0,13,0 .db 0,13,0,13,0,13,0,13 .db 13,0,13,0,13,0,13,0 .db 0,13,0,13,0,13,0,13 .db 13,0,13,0,13,0,13,0 board: .db 10,9,8,11,12,8,9,10 .db 7,7,7,7,7,7,7,7 .db 0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0 .db 1,1,1,1,1,1,1,1 .db 4,3,2,5,6,2,3,4 bkup: .db 10,9,8,11,12,8,9,10 .db 7,7,7,7,7,7,7,7 .db 0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0 .db 1,1,1,1,1,1,1,1 .db 4,3,2,5,6,2,3,4 eraseline: .db %01000000,%00000000,%00000000,%00000001 fullLine: .db %01111111,255,255,255 XOrig: .db $F0 YOrig: .db $F0 Psave: .db 0 Xsave: .db $F0 Ysave: .db $F0 Xsave2: .db 0 Ysave2: .db 0 desc: .db "Chess by Harper Maddox",0 white: .db " White",0 black: .db "Black",0 restore: .db "Restore",0 restart: .db "Restart",0 .end END