; BlackJack 83 - By Harper Maddox ; written on 7/15/98 ; title pic and numerous ideas by James Matthews ; ; If you have any questions about the source please dont ask me... ; just take a look at James Matthews 83 asm help file .NOLIST #define equ .equ #define EQU .equ #define end .end #include "ti83asm.inc" #include "tokens.inc" .LIST .org 9327h TEMP = savesscreen timer = savesscreen+2 nolet = timer+1 drawn = timer+2 cash = timer+3 betX = timer+5 dealers = timer+7 yours = dealers+5 deck = yours+5 nop ;these 2 lines identify the program jr incipio ;as AShell-compatable .dw $0000 ;Version of table .dw desc ;Points to the program description desc: .db "BlackJack v1.0",0 incipio: ld hl,100 ld (cash),hl prog_start: ld a,5 ld (temp),a ld hl,card_x ld (hl),0 ld de,card_x+1 ld bc,5 ldir call Tile_cards1 ld a,5 ld (currow),a ld a,6 ld (curcol),a ld hl,intro_text1 call _puts ld a,6 ld (currow),a ld (curcol),a ld hl,intro_text2 call _puts ld a,7 ld (currow),a ld a,6 ld (curcol),a ld hl,intro_text3 call _puts stloop: ld a,5 ld (curcol),a ld a,5 ld (currow),a ld a,lspace call _putmap ; put big character ld a,6 ld (currow),a ld a,lspace call _putmap ld a,7 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 jr z,cursor_down cp 3 jr z,cursor_up cp 9 ret z cp 5 jr nz,stloop ld a,(temp) cp 5 jp z,play_game cp 6 jr z,info ret cursor_up: ld a,(temp) cp 5 jr z,stloop dec a ld (temp),a jr stloop cursor_down: ld a,(temp) cp 7 jr z,stloop inc a ld (temp),a jr stloop info: ; stats of the game call _grbufclr ld hl,title ld de,plotsscreen+1 ld bc,223 ldir call _grbufcpy_V ld hl,256*15 ld (pencol),hl ld hl,info_text1 call _vputs ld a,3 ld (currow),a xor a ld (curcol),a ld hl,info_text2 call _puts ld a,7 ld (curcol),a ld a,(wins) ld l,a ld h,0 call _disphl ld a,4 ld (currow),a xor a ld (curcol),a ld hl,info_text3 call _puts ld a,(losses) ld l,a ld h,0 call _disphl ld a,5 ld (currow),a xor a ld (curcol),a ld hl,info_text4 call _puts ld a,(wins) ld b,a ld a,(losses) add a,b or a jr z,no_stats ld l,b ld h,100 push af call _htimesl ; wins*100 pop af call _divhlbya ; (100*wins)/total call _disphl ld a,Lpercent call _putc no_stats: ld a,1 ld (curcol),a ld a,7 ld (currow),a ld hl,info_text5 call _puts ld hl,(high_score) call _disphl call _getkey jp prog_start play_game: call fill_deck deal_cards: ld hl,dealers ld (hl),0 ld de,dealers+1 ld bc,11 ldir call _grbufclr call disp_deck ld a,50 ld e,8 ld hl,Sprite_ptr call normsp ld a,67 ld e,8 ld hl,Sprite_ptr call normsp call _grbufcpy_V call bet call _grbufclr call disp_deck ld a,50 ld e,8 ld hl,Sprite_ptr call normsp call get_dealers call get_dealers ld hl,sprites call Find_sprite ld a,67 ld e,8 call drcard call get_yours hit: call get_yours ld hl,yours call card_counter cp 22 jr nc,you_bust call disp_yours call _grbufcpy_V ld a,3 ld (curcol),a ld a,4 ld (currow),a ld hl,game_text1 call _puts ld a,8 ld (curcol),a ld hl,game_text2 call _puts ld a,2 ld (temp),a keyloop: ld a,4 ld (currow),a ld a,2 ld (curcol),a ld a,lspace call _putmap ; put big character ld a,7 ld (curcol),a ld a,lspace call _putmap ld a,(temp) ld (curcol),a ld a,$DF call _putmap call _Getkey cp 2 jp z,left cp 1 jp z,right cp 5 jr nz,keyloop ld a,(temp) cp 2 jp z,hit you_bust: call dealer_AI call _grbufclr call disp_deck call disp_dealers call disp_yours call _grbufcpy_V ld hl,dealers call card_counter call _setxxop1 ld a,2 ld hl,26*256 ld (pencol),hl call _dispop1a ld hl,yours call card_counter call _setxxop1 ld a,2 ld hl,50*256 ld (pencol),hl call _dispop1a call get_winner call _getkey cp 9 ret z xor a ld (temp),a ld (currow),a ld a,9 ld (curcol),a ld hl,game_text3 call _puts ld a,1 ld (currow),a ld a,7 ld (curcol),a ld hl,game_text4 call _puts done_game: ld a,8 ld (curcol),a xor a ld (currow),a ld a,lspace call _putmap ; put big character ld a,1 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 jr z,a_down cp 3 jr z,a_up cp 9 ret z cp 5 jr nz,done_game ld a,(temp) cp 1 jp z,prog_start ld hl,(cash) ld de,10 call _cphlde jp c,gameover jp deal_cards a_down: ld a,1 ld (temp),a jr done_game a_up: xor a ld (temp),a jr done_game right: ld a,7 ld (temp),a jp keyloop left: ld a,2 ld (temp),a jp keyloop card_counter: ld b,5 xor a ctr_loop: push af ld a,(hl) push hl cp 11 call nc,face_card pop hl inc hl ld c,a pop af add a,c djnz ctr_loop ret face_card: ld a,10 ret dealer_AI: ; HOW UNBELIVEVABLE ld a,(dealers+4) or a ret nz ld hl,dealers call card_counter cp 17 ret nc call get_dealers jr dealer_AI get_winner: ld hl,dealers call card_counter ld e,a ld hl,yours call card_counter cp 22 jr nc,you_lose ld d,a ld a,e cp 22 jr nc,you_win ld a,d cp e jr z,you_tie cp e jr nc,you_win you_lose: xor a ; reset flags ld de,(betX) ld hl,(cash) sbc hl,de ld (cash),hl ld hl,losses inc (hl) ld hl,fin_text1 jr fin_game you_win: ld de,(betX) ld hl,(cash) add hl,de ld (cash),hl ld de,(high_score) call _cphlde call nc,newhi ld hl,wins inc (hl) ld hl,fin_text2 jr fin_game newhi: ld (high_score),hl ret you_tie: ld hl,fin_text3 fin_game: ld a,1 ld (currow),a ld a,7 ld (curcol),a call _puts ret disp_yours: ld hl,yours ld c,10 dy_loop: ld a,(hl) push hl call Find_sprite ld a,c ld e,44 push bc call drcard pop bc pop hl inc hl ld a,c add a,17 ld c,a ld a,(hl) or a ret z ld de,yours+5 call _cphlde ret z jr dy_loop disp_dealers: ld hl,dealers ld c,10 dd_loop: ld a,(hl) push hl call Find_Sprite ld a,c ld e,20 push bc call drcard pop bc pop hl inc hl ld a,c add a,17 ld c,a ld a,(hl) or a ret z ld de,dealers+5 call _cphlde ret z jr dd_loop get_yours: ld a,(yours+4) or a ret nz ld hl,yours-1 gy_lop: inc hl ld a,(hl) or a jr nz,gy_lop push hl call getcard pop hl ld (hl),a ret get_dealers: ld a,(dealers+4) or a ret nz ld hl,dealers-1 gd_lop: inc hl ld a,(hl) or a jr nz,gd_lop push hl call getcard pop hl ld (hl),a ret tile_cards1: ld b,16 move_em1: push bc ld hl,card_x ld c,0 move_l1: ld a,(hl) add a,c ld (hl),a push bc push hl ld hl,ace ld e,20 call SPRITE pop hl pop bc inc hl inc c ld a,(hl) cp 187 jr nz,move_l1 call _grbufcpy_V call _grbufclr call delay pop bc djnz move_em1 ret disp_deck: ; displays deck at top left ld a,(drawn) ld l,a ld h,0 ld a,5 call _divhlbya ld b,l ld c,b ddeck_loop: push bc ld a,c sub b ld e,0 ld hl,Sprite_ptr call normsp pop bc djnz ddeck_loop ld a,c add a,12 ld e,0 ld hl,Sprite_ptr call normsp ret gameover: call _grbufclr ld hl,title ld de,plotsscreen+1 ld bc,223 ldir call _grbufcpy_V ld a,4 ld (curcol),a ld (currow),a ld hl,fin_text4 call _puts call _getkey ret ;******************** ;Delay ;10 halts ;******************** Delay: ld b,10 Delay_LOP: halt djnz Delay_LOP ret getkey: call _getk call _op2toop1 call _convop1 ld a,e ret fill_deck: push bc ld a,52 ld (drawn),a ld hl,deck ld b,4 fd1: push bc ld b,13 fd2: ld a,b ld (hl),a inc hl djnz fd2 pop bc djnz fd1 pop bc ret ;************************************************** ;getcard - produces random card out of 52 card deck ;******* getcard: ld a,r ld h,a gc2: ld a,(hl) add hl,hl cp 52 jr nc,gc2 inc a ld e,a ld a,(drawn) dec a ld (drawn),a or a call z,fill_deck ld d,0 ld hl,deck add hl,de ld a,(hl) or a jr z,gc2 push af ld (hl),0 pop af ret bet: ld hl,10 ld (betX),hl xor a ld (curcol),a ld a,6 ld (currow),a ld hl,bet_text2 call _puts ld hl,(cash) call _disphl xor a ld (curcol),a ld a,7 ld (currow),a ld hl,bet_text1 call _puts ld a,12 ld (curcol),a ld hl,bet_text3 call _puts betKEYloop: ld a,4 ld (curcol),a ld hl,(betX) call _disphl call _getkey cp 4 jr z,bet_down cp 3 jr z,bet_up cp 5 jr nz,betKEYloop ret bet_down: ld de,10 ld hl,(betX) call _cphlde jr z,betKEYloop sbc hl,de ld (betX),hl jr betKEYloop bet_up: ld de,(cash) ld hl,(betX) call _cphlde jr nc,betKEYloop ld de,10 add hl,de ld (betX),hl jr betKEYloop ;******************** ;Find Sprite ; a = sprite # ;******************** Find_sprite: or a ; cp 0 ret z ld hl,sprites ld b,a push de get_sprite: ld de,9 add hl,de ; 18*2 djnz get_sprite pop de ret ;************************************* ;* Hacked 18x16, from Movax's 8x8 SR * ;* done by Harper Maddox * ;************************************* SPRITE: push af push hl push de push bc ld hl,title ld de,plotsscreen+1 ld bc,223 ldir pop bc pop de pop hl pop af drcard: push af ; disp card # or face card push de push af ld a,e add a,7 ld e,a pop af add a,3 call SPR8 pop de pop af push af ; show suit push de push af push de ld a,r ld hl,diamond and %11 jr z,skipGS2 ld b,a gs2: ld de,9 add hl,de ; 18*2 djnz gs2 skipGS2 pop de pop af add a,8 inc e call SPR8 pop de pop af ld hl,card_back normsp: 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,plotsscreen 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,18 ; Line loop LILOP: ld b,2 DBLOP: push bc 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) ld (hl),a inc ix pop bc djnz DBLOP ld bc,10 ; Calculate next line address add hl,bc 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,18 ALOP1: ld a,(de) or (hl) ; or=erase/blit ld (hl),a inc de inc hl ld a,(de) or (hl) ; or=erase/blit ld (hl),a inc de push bc ld bc,11 add hl,bc pop bc djnz ALOP1 DONE1: ret ;********************** ; 8x9 ... dont ask why ;********************** SPR8: 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,ALIGN2 ;лллл Non aligned sprite blit starts here лллл pop ix ; ix->sprite ld d,a ; d=how many bits to shift each line ld e,9 ; Line loop LILOP2: ld b,(ix+0) ; Get sprite data ld c,0 ; Shift loop push de SHLOP2: srl b rr c dec d jp nz,SHLOP2 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,LILOP2 ; Next line jr DONE2 ;лллл Aligned sprite blit starts here лллл ALIGN2: ; Blit an aligned sprite to graphbuf pop de ; de->sprite ld b,9 ALOP2: ld a,(de) or (hl) ; xor=erase/blit ld (hl),a inc de push bc ld bc,12 add hl,bc pop bc djnz ALOP2 DONE2: ret sprite_ptr: .db %11111111,%11111100 .db %11000011,%11000010 .db %11100111,%01100110 .db %11110110,%01110110 .db %10111100,%10111110 .db %10001111,%01001110 .db %10011011,%10011010 .db %10111001,%10111010 .db %11110000,%11110010 .db %11000011,%11000010 .db %11100111,%01100110 .db %11110110,%01110110 .db %10111100,%10111110 .db %10001111,%01001110 .db %10011011,%10011010 .db %10111001,%10111010 .db %11111111,%11111110 .db %01111111,%11111110 card_back: .db %11111111,%11111100 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %10000000,%00000110 .db %01111111,%11111110 diamond: .db %00100000 .db %01110000 .db %11111000 .db %01110000 .db %00100000 .db 0,0,0,0 club: .db %01110000 .db %01110000 .db %11011000 .db %11111000 .db %00100000 .db 0,0,0,0 heart: .db %01010000 .db %11111000 .db %11111000 .db %01110000 .db %00100000 .db 0,0,0,0 spade: .db %00100000 .db %01110000 .db %11111000 .db %10101000 .db %01110000 .db 0,0,0,0 ; number sprites, courtesy of Microsoft :P ; MS Sans Serif, Bold, Size 10 sprites: .db 0,0,0,0,0,0,0,0,0 ace: .db %00011000 .db %00111100 .db %00111100 .db %00111100 .db %01100110 .db %01100110 .db %11111111 .db %11000011 .db %11000011 two: .db %00111100 .db %01100110 .db %00000110 .db %00000110 .db %00001100 .db %00011000 .db %00110000 .db %01100000 .db %01111110 three: .db %00111100 .db %01100110 .db %00000110 .db %00000110 .db %00011100 .db %00000110 .db %00000110 .db %01100110 .db %00111100 four: .db %00001100 .db %00011100 .db %00011100 .db %00111100 .db %00111100 .db %01101100 .db %01111110 .db %00001100 .db %00001100 five: .db %01111110 .db %01100000 .db %01100000 .db %01111100 .db %01100110 .db %00000110 .db %00000110 .db %01100110 .db %00111100 six: .db %00111100 .db %01100110 .db %01100000 .db %01100000 .db %01111100 .db %01100110 .db %01100110 .db %01100110 .db %00111100 seven: .db %01111110 .db %00000110 .db %00001100 .db %00001100 .db %00011000 .db %00011000 .db %00110000 .db %00110000 .db %00110000 eight: .db %00111100 .db %01100110 .db %01100110 .db %01100110 .db %00111100 .db %01100110 .db %01100110 .db %01100110 .db %00111100 nine: .db %00111100 .db %01100110 .db %01100110 .db %01100110 .db %00111110 .db %00000110 .db %00000110 .db %01100110 .db %00111100 ten: .db %11001110 .db %11011111 .db %11011011 .db %11011011 .db %11011011 .db %11011011 .db %11011011 .db %11011111 .db %11001110 jack: .db %00000110 .db %00000110 .db %00000110 .db %00000110 .db %00000110 .db %00000110 .db %01100110 .db %01111100 .db %00111000 queen: .db %01111110 .db %11100111 .db %11000011 .db %11000011 .db %11001011 .db %11011111 .db %01111110 .db %00111111 .db %00000011 king: .db %11000111 .db %11001110 .db %11011100 .db %11111000 .db %11111100 .db %11101100 .db %11001110 .db %11000111 .db %11000011 intro_text1: .db "Play",0 intro_text2: .db "Info",0 intro_text3: .db "Exit",0 info_text1: .db "By: Harper Maddox",0 info_text2: .db "Wins:",0 info_text3: .db "Losses:",0 info_text4: .db "Win Pct:",0 info_text5: .db "HiScore:",0 game_text1: .db "Hit",0 game_text2: .db "Stay",0 game_text3: .db "Deal",0 game_text4: .db " Quit ",0 bet_text1: .db "Bet:",0 bet_text2: .db "Cash:",0 bet_text3: .db "+/-",0 fin_text1: .db "You Lose",0 fin_text2: .db "You Win",0 fin_text3: .db "Tie",0 fin_text4: .db "Game Over",0 card_x: .db 0,0,0,0,0,0,187 ; 187 is kill switch... it moves around during the game ;total game stats wins: .db 0 losses: .db 0 high_score: .dw 100 title: .db 48,0,0,6,0,0,0,0,6,0,0,0,32,0,0,6,0,0,0,0,6,0,0,63,32,0,0,6,0,0 .db 0,0,6,0,0,49,160,127,135,246,24,252,127,135,246,24,0,33,160,225,140,22,32,12,225,140,22,32,0,35,33 .db 192,152,6,64,13,192,152,6,64,0,62,33,129,152,7,128,13,129,152,7,128,0,35,33,129,152,6,193,13,129,152 .db 6,192,0,35,33,199,156,22,97,29,199,156,22,96,0,62,124,252,143,246,57,248,252,143,246,56,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,0,0,255,255,255,255,255,255,255,254,0 .db 0,0,0,0,0,255,255,255,255,255,240,0,0,0,0,0,0,0,0,1,255,255,128,0,0,0,0,0,0,0,0 .db 0,31,254,0,0,0,0,0,0,0,0,0,0,7,240,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0 .db 0,0,0,0,0,0,0,64 .end .END