mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-10-25 14:26:11 +00:00
Merge branch 'master' of https://github.com/deater/dos33fsprogs
This commit is contained in:
commit
18aff6dcad
@ -39,7 +39,7 @@ print_string_loop:
|
|||||||
iny
|
iny
|
||||||
bne print_string_loop
|
bne print_string_loop
|
||||||
done_print_string:
|
done_print_string:
|
||||||
rts
|
; rts
|
||||||
|
|
||||||
;====================
|
;====================
|
||||||
; point_to_end_string
|
; point_to_end_string
|
||||||
|
@ -135,6 +135,12 @@ JC
|
|||||||
no lights on the football field and the roof of the gym
|
no lights on the football field and the roof of the gym
|
||||||
still leaked during basketball games.
|
still leaked during basketball games.
|
||||||
|
|
||||||
|
There was a dress code. At the time for the girls it was
|
||||||
|
transitioning from ugly brown (herringbone in the winter) skirts,
|
||||||
|
and yellow/brown sweater to some sort of horrible green for the
|
||||||
|
people a few years younger than us. It's not the Apple II palette
|
||||||
|
making things ugly, it's actually fairly accurate.
|
||||||
|
|
||||||
Math Office
|
Math Office
|
||||||
Where the academic team practiced.
|
Where the academic team practiced.
|
||||||
|
|
||||||
@ -213,10 +219,25 @@ Deutsch Klasse
|
|||||||
German class was also fun, though possibly more fun for
|
German class was also fun, though possibly more fun for
|
||||||
us than it was for Frau Potter who had to teach us.
|
us than it was for Frau Potter who had to teach us.
|
||||||
|
|
||||||
|
We called her just "Frau" for short, which didn't bother her,
|
||||||
|
but it shocked all the German exchange students as being excessively
|
||||||
|
rude as it was sort of like calling her "Woman" or "Lady".
|
||||||
|
|
||||||
The agents are some weird thing I did where everyone in our
|
The agents are some weird thing I did where everyone in our
|
||||||
class was a secret Starfleet Agent, and were assigned letters.
|
class was a secret Starfleet Agent, and were assigned letters.
|
||||||
No, it didn't make any sense at the time either.
|
No, it didn't make any sense at the time either.
|
||||||
|
|
||||||
|
Half the class was actually male, but we mostly sat on the near side
|
||||||
|
of the room for some reason. The girls all sat on the pictured
|
||||||
|
side by the windows (view from where I sat).
|
||||||
|
For all 4 years. I have no idea why we did that.
|
||||||
|
There were actually some interesting people in this class, feel
|
||||||
|
bad for leaving them out but the game engine only budgets 5 talking
|
||||||
|
spots per room.
|
||||||
|
|
||||||
|
Interesting fact, 3 of the 4 students pictured have gone on
|
||||||
|
to get PhDs.
|
||||||
|
|
||||||
Acting Principal
|
Acting Principal
|
||||||
One of our favorite teachers. He wore a robo-leg when
|
One of our favorite teachers. He wore a robo-leg when
|
||||||
playing Badminton. The "Since we have no electricity we have no
|
playing Badminton. The "Since we have no electricity we have no
|
||||||
|
@ -650,19 +650,25 @@ unsigned char deutsch_rle[]={
|
|||||||
0xFF,0xF8,0x8F,0x88,0xFF,0x88,0xFF,
|
0xFF,0xF8,0x8F,0x88,0xFF,0x88,0xFF,
|
||||||
0xF8,0x88,0x88,0xFF,0xF8,0x8F,0x88,0xFF,
|
0xF8,0x88,0x88,0xFF,0xF8,0x8F,0x88,0xFF,
|
||||||
0x8F,0xFF,0x88,0xF8,0xFF,0x88,0xA3,0x91,
|
0x8F,0xFF,0x88,0xF8,0xFF,0x88,0xA3,0x91,
|
||||||
0xA3,0x99,0xA0,0x22,0x88,0xA3,0x99,0xA0,0x28,0x08,0xA0,0x39,0x00,0x80,0x80,0xA7,0x00,
|
0xA3,0x99,0xA0,0x22,0x88,0xA3,0x99,0xA0,0x28,0x08,0xA0,0x50,0x00,0xA3,0x80,0xA8,0x00,
|
||||||
0xB8,0x88,0xA0,0x1D,0x00,0x88,0xBB,0xB0,0xA5,0x00,
|
0xD0,0xD0,0xA8,0x00,0xDD,0xBD,0xA5,0x00,0xB8,0x88,
|
||||||
0x0B,0xBB,0x88,0xA4,0x00,0xB8,0x88,0xAE,0x00,
|
0xA6,0x00,0xB8,0xD8,0x00,0x00,0x88,0xBB,0x3B,
|
||||||
0x88,0xB8,0xA7,0x00,0x88,0xFB,0xA7,0x00,0x2B,
|
0xA8,0x00,0xDD,0xBB,0xB0,0xA7,0x00,0xDD,0xBB,
|
||||||
0xA4,0x00,0x0B,0xBB,0x88,0xAE,0x00,0x88,0xBB,
|
0x0B,0xA3,0x00,0x0B,0xBB,0x88,0xA5,0x00,0x0B,
|
||||||
0x0B,0xA6,0x00,0xF8,0xFF,0xF0,0xA5,0x00,0x44,
|
0xBB,0xD8,0x00,0x00,0x88,0xFB,0x8B,0xA7,0x00,
|
||||||
0x22,0xA5,0x00,0xFF,0x08,0x80,0xAD,0x00,0x88,
|
0xD0,0x0D,0xDB,0xA8,0x00,0xDD,0xFF,0xA5,0x00,
|
||||||
0xF0,0xA7,0x00,0x0F,0x00,0x0F,0xA5,0x00,0x04,
|
0xFF,0x08,0xA3,0x00,0xFF,0x00,0x00,0x1B,0x08,
|
||||||
0x02,0xA4,0x00,0x0F,0x0F,0xAF,0x00,0x77,0x7F,0xB0,
|
0x00,0x00,0x88,0xFF,0xF8,0xB0,0x00,0x00,0xA4,0x70,
|
||||||
0xA0,0x25,0x00,0x4F,0x4F,0xA0,0x25,0x00,0x04,0xB4,0x04,0x04,0xA8,0x00,
|
0x00,0x70,0x7D,0x7D,0x7B,0x00,0xA4,0x70,0x00,
|
||||||
0xB0,0xA4,0x00,0xD0,0xA5,0x00,0xB0,0xA0,0x11,0x00,0x8F,
|
0x70,0x7F,0x7F,0x7B,0x00,0x7B,0x7F,0x7F,0x70,0x70,
|
||||||
0x80,0xA9,0x00,0x08,0x08,0x00,0x00,0x08,0x08,0xA4,0x00,0x08,0x08,
|
0x00,0x00,0x0F,0xB0,0x10,0x11,0xA3,0x00,0x70,
|
||||||
0xA0,0xA9,0x00,0xA1, };
|
0x7F,0x77,0x07,0xA8,0x00,0x6D,0x80,0xA8,0x00,
|
||||||
|
0x8F,0x80,0xA3,0x00,0x80,0x8F,0xA7,0x00,0x11,
|
||||||
|
0xA3,0x00,0x07,0xA3,0x88,0xA8,0x00,0x08,0xB8,0xA8,0x00,
|
||||||
|
0x08,0xB8,0xA3,0x00,0xB8,0x08,0xA7,0x00,0x11,0x11,
|
||||||
|
0xA5,0x00,0xBB,0xA9,0x00,0x8F,0x80,0xA8,0x00,0x8F,
|
||||||
|
0x80,0x00,0x80,0x8F,0xA8,0x00,0x11,0x11,0xA5,0x00,
|
||||||
|
0x08,0x08,0xA0,0x1E,0x00,0x80,0x88,0xA0,0xA3,0x00,0xA1, };
|
||||||
unsigned char homeroom_rle[]={
|
unsigned char homeroom_rle[]={
|
||||||
0x28, /* ysize=40 */
|
0x28, /* ysize=40 */
|
||||||
0xA0,0x20,0x00,0x77,0xA6,0x57,0x77,0xA0,0x20,0x00,0x77,0x55,0x55,
|
0xA0,0x20,0x00,0x77,0xA6,0x57,0x77,0xA0,0x20,0x00,0x77,0x55,0x55,
|
||||||
|
@ -38,6 +38,12 @@
|
|||||||
#define DIALOG_RACHAEL 24
|
#define DIALOG_RACHAEL 24
|
||||||
#define DIALOG_MREE 25
|
#define DIALOG_MREE 25
|
||||||
|
|
||||||
|
#define DIALOG_NIRE 26
|
||||||
|
#define DIALOG_AGENT_S 27
|
||||||
|
#define DIALOG_AGENT_G 28
|
||||||
|
#define DIALOG_AGENT_AP 29
|
||||||
|
#define DIALOG_FRAU 30
|
||||||
|
|
||||||
struct dialog_words {
|
struct dialog_words {
|
||||||
char *words;
|
char *words;
|
||||||
int next;
|
int next;
|
||||||
@ -175,7 +181,6 @@ struct dialog_type dialog[100]={
|
|||||||
[DIALOG_FORD]= {
|
[DIALOG_FORD]= {
|
||||||
.statement[0].words="557-0868 Utopia BBS is really great!",
|
.statement[0].words="557-0868 Utopia BBS is really great!",
|
||||||
.statement[0].next=0,
|
.statement[0].next=0,
|
||||||
// AMIGA?
|
|
||||||
},
|
},
|
||||||
#if 0
|
#if 0
|
||||||
AP CALCULUS, TEAM I-1
|
AP CALCULUS, TEAM I-1
|
||||||
@ -193,13 +198,32 @@ struct dialog_type dialog[100]={
|
|||||||
LIZBETH
|
LIZBETH
|
||||||
BLUME
|
BLUME
|
||||||
VINCE CON PATILLAS
|
VINCE CON PATILLAS
|
||||||
DEUTSCH
|
#endif
|
||||||
AGENT G
|
//DEUTSCH
|
||||||
AGENT AP
|
[DIALOG_NIRE]= {
|
||||||
AGENT S
|
.statement[0].words="Vince, what are you doing!",
|
||||||
NIRE
|
.statement[0].next=0,
|
||||||
FRAU: DER DIE DAS
|
// Sue you?
|
||||||
|
},
|
||||||
|
[DIALOG_AGENT_S]= {
|
||||||
|
.statement[0].words="...",
|
||||||
|
.statement[0].next=0,
|
||||||
|
},
|
||||||
|
[DIALOG_AGENT_G]= {
|
||||||
|
.statement[0].words="Cultural experience on Friday!",
|
||||||
|
.statement[0].next=0,
|
||||||
|
},
|
||||||
|
[DIALOG_AGENT_AP]= {
|
||||||
|
.statement[0].words="...",
|
||||||
|
.statement[0].next=0,
|
||||||
|
},
|
||||||
|
[DIALOG_FRAU]= {
|
||||||
|
.statement[0].words="Immer mit der Ruhe!",
|
||||||
|
.statement[0].next=0,
|
||||||
|
.statement[1].words="Karte Spiel",
|
||||||
|
.statement[1].next=0,
|
||||||
|
},
|
||||||
|
#if 0
|
||||||
HOMEROOM
|
HOMEROOM
|
||||||
TRAPANI
|
TRAPANI
|
||||||
WEAVE!
|
WEAVE!
|
||||||
|
@ -687,6 +687,43 @@ struct map_info_type map_info[34] = {
|
|||||||
.scatter=SCATTER_NONE,
|
.scatter=SCATTER_NONE,
|
||||||
.entry_type=ENTRY_CENTER, .entry_x=0, .entry_y=0,
|
.entry_type=ENTRY_CENTER, .entry_x=0, .entry_y=0,
|
||||||
.background_image=deutsch_rle,
|
.background_image=deutsch_rle,
|
||||||
|
.num_locations=5,
|
||||||
|
.location[0] = {
|
||||||
|
.name="Nire",
|
||||||
|
.x0 = 0, .x1 = 6,
|
||||||
|
.y0 = 25, .y1 = 33,
|
||||||
|
.destination=DIALOG_NIRE,
|
||||||
|
.type=LOCATION_CONVERSATION,
|
||||||
|
},
|
||||||
|
.location[1] = {
|
||||||
|
.name="Agent S",
|
||||||
|
.x0 = 10, .x1 = 18,
|
||||||
|
.y0 = 25, .y1 = 33,
|
||||||
|
.destination=DIALOG_AGENT_S,
|
||||||
|
.type=LOCATION_CONVERSATION,
|
||||||
|
},
|
||||||
|
.location[2] = {
|
||||||
|
.name="Agent G",
|
||||||
|
.x0 = 19, .x1 = 25,
|
||||||
|
.y0 = 25, .y1 = 33,
|
||||||
|
.destination=DIALOG_AGENT_G,
|
||||||
|
.type=LOCATION_CONVERSATION,
|
||||||
|
},
|
||||||
|
.location[3] = {
|
||||||
|
.name="Agent AP",
|
||||||
|
.x0 = 26, .x1 = 31,
|
||||||
|
.y0 = 25, .y1 = 33,
|
||||||
|
.destination=DIALOG_AGENT_AP,
|
||||||
|
.type=LOCATION_CONVERSATION,
|
||||||
|
},
|
||||||
|
.location[4] = {
|
||||||
|
.name="Frau",
|
||||||
|
.x0 = 32, .x1 = 38,
|
||||||
|
.y0 = 25, .y1 = 33,
|
||||||
|
.destination=DIALOG_FRAU,
|
||||||
|
.type=LOCATION_CONVERSATION,
|
||||||
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
[HOMEROOM]={ // 29: HOMEROOM
|
[HOMEROOM]={ // 29: HOMEROOM
|
||||||
.name="Homeroom 12E",
|
.name="Homeroom 12E",
|
||||||
|
BIN
split_screen/KATC.BIN
Normal file
BIN
split_screen/KATC.BIN
Normal file
Binary file not shown.
@ -5,11 +5,12 @@ TOKENIZE = ../asoft_basic-utils/tokenize_asoft
|
|||||||
|
|
||||||
all: split.dsk
|
all: split.dsk
|
||||||
|
|
||||||
split.dsk: BISHOP BISHOP.BAS RAINBOW.BAS RAINBOW KATC.BIN
|
split.dsk: BISHOP BISHOP.BAS RAINBOW.BAS RAINBOW KATC.BIN CREDITS
|
||||||
$(DOS33) -y split.dsk BSAVE -a 0x0300 BISHOP
|
$(DOS33) -y split.dsk BSAVE -a 0x0300 BISHOP
|
||||||
$(DOS33) -y split.dsk SAVE A BISHOP.BAS
|
$(DOS33) -y split.dsk SAVE A BISHOP.BAS
|
||||||
$(DOS33) -y split.dsk SAVE A RAINBOW.BAS
|
$(DOS33) -y split.dsk SAVE A RAINBOW.BAS
|
||||||
$(DOS33) -y split.dsk BSAVE -a 0x0c00 RAINBOW
|
$(DOS33) -y split.dsk BSAVE -a 0x0c00 RAINBOW
|
||||||
|
$(DOS33) -y split.dsk BSAVE -a 0x1000 CREDITS
|
||||||
# $(DOS33) -y split.dsk BSAVE -a 0x2000 LENNA.BIN
|
# $(DOS33) -y split.dsk BSAVE -a 0x2000 LENNA.BIN
|
||||||
$(DOS33) -y split.dsk BSAVE -a 0x2000 KATC.BIN
|
$(DOS33) -y split.dsk BSAVE -a 0x2000 KATC.BIN
|
||||||
|
|
||||||
@ -31,8 +32,16 @@ RAINBOW: rainbow.o
|
|||||||
RAINBOW.BAS: rainbow.bas
|
RAINBOW.BAS: rainbow.bas
|
||||||
$(TOKENIZE) < rainbow.bas > RAINBOW.BAS
|
$(TOKENIZE) < rainbow.bas > RAINBOW.BAS
|
||||||
|
|
||||||
|
credits.o: credits.s
|
||||||
|
ca65 -o credits.o credits.s -l credits.lst
|
||||||
|
|
||||||
|
CREDITS: credits.o
|
||||||
|
ld65 -o CREDITS credits.o -C ../linker_scripts/apple2_1000.inc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
KATC.BIN: kat.bmp
|
KATC.BIN: kat.bmp
|
||||||
../bmp2dhr/b2d kat.bmp hgr dither
|
../bmp2dhr/b2d kat.bmp hgr dither
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *~ *.o *.lst BISHOP RAINBOW
|
rm -f *~ *.o *.lst BISHOP RAINBOW CREDITS
|
||||||
|
212
split_screen/credits.s
Normal file
212
split_screen/credits.s
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
.include "zp.inc"
|
||||||
|
|
||||||
|
H2 = $2C
|
||||||
|
; V2 = $2D
|
||||||
|
; TEMPY = $FB
|
||||||
|
|
||||||
|
HGR = $F3E2
|
||||||
|
HPLOT0 = $F457
|
||||||
|
HCOLOR = $F6EC
|
||||||
|
; HLINE = $F819
|
||||||
|
; VLINE = $F828
|
||||||
|
; COLOR = $F864
|
||||||
|
; TEXT = $FB36
|
||||||
|
; HOME = $FC58
|
||||||
|
|
||||||
|
jsr TEXT
|
||||||
|
jsr HOME
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta DISP_PAGE
|
||||||
|
lda #0
|
||||||
|
sta DRAW_PAGE
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta CH
|
||||||
|
sta CV
|
||||||
|
lda #<line1
|
||||||
|
sta OUTL
|
||||||
|
lda #>line1
|
||||||
|
sta OUTH
|
||||||
|
jsr move_and_print
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
jsr move_and_print
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
jsr move_and_print
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
jsr move_and_print
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
jsr move_and_print
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
jsr move_and_print
|
||||||
|
|
||||||
|
; draw the moon
|
||||||
|
lda #0
|
||||||
|
sta CV
|
||||||
|
lda #3
|
||||||
|
sta CH
|
||||||
|
jsr htab_vtab ; vtab(1); htab(4)
|
||||||
|
lda #32 ; inverse space
|
||||||
|
ldy #0
|
||||||
|
sta (BASL),Y
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
dec CH
|
||||||
|
jsr htab_vtab
|
||||||
|
lda #32
|
||||||
|
ldy #0
|
||||||
|
sta (BASL),Y
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
jsr htab_vtab
|
||||||
|
lda #32
|
||||||
|
ldy #0
|
||||||
|
sta (BASL),Y
|
||||||
|
|
||||||
|
inc CV
|
||||||
|
inc CH
|
||||||
|
jsr htab_vtab
|
||||||
|
lda #32
|
||||||
|
ldy #0
|
||||||
|
sta (BASL),Y
|
||||||
|
|
||||||
|
; Wait
|
||||||
|
|
||||||
|
jsr wait_until_keypressed
|
||||||
|
|
||||||
|
; GR part
|
||||||
|
bit LORES
|
||||||
|
bit SET_GR
|
||||||
|
bit FULLGR
|
||||||
|
|
||||||
|
lda #$44
|
||||||
|
sta COLOR
|
||||||
|
|
||||||
|
lda #39
|
||||||
|
sta V2
|
||||||
|
|
||||||
|
lda #28
|
||||||
|
|
||||||
|
line_loop:
|
||||||
|
pha
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
|
||||||
|
jsr hlin_double
|
||||||
|
|
||||||
|
pla
|
||||||
|
clc
|
||||||
|
adc #2
|
||||||
|
cmp #48
|
||||||
|
bne line_loop
|
||||||
|
|
||||||
|
; Wait
|
||||||
|
|
||||||
|
jsr wait_until_keypressed
|
||||||
|
|
||||||
|
bit HIRES
|
||||||
|
|
||||||
|
|
||||||
|
; Wait
|
||||||
|
|
||||||
|
jsr wait_until_keypressed
|
||||||
|
|
||||||
|
|
||||||
|
display_loop:
|
||||||
|
; each scan line 65 cycles
|
||||||
|
; 1 cycle each byte (40cycles) + 25 for horizontal
|
||||||
|
; Total of 12480 cycles to draw screen
|
||||||
|
; Vertical blank = 4550 cycles (70 scan lines)
|
||||||
|
; Total of 17030 cycles to get back to where was
|
||||||
|
|
||||||
|
; 16666 = 17030 x=1021.8
|
||||||
|
; 1000 x
|
||||||
|
|
||||||
|
|
||||||
|
; TODO: find beginning of scan
|
||||||
|
; Text mode for 6*8=48 scanlines (3120 cycles)
|
||||||
|
; hgr for 64 scalines (4160 cycles)
|
||||||
|
; gr for 80 scalines (5200 cycles)
|
||||||
|
; vblank = 4550 cycles
|
||||||
|
|
||||||
|
; text
|
||||||
|
bit SET_TEXT ; 4
|
||||||
|
|
||||||
|
ldy #15 ; 2
|
||||||
|
loop2:
|
||||||
|
|
||||||
|
; 5*255+2 = 197
|
||||||
|
|
||||||
|
ldx #39 ; 2
|
||||||
|
loop1:
|
||||||
|
dex ; 2
|
||||||
|
bne loop1 ; 2nt/3
|
||||||
|
|
||||||
|
dey ; 2
|
||||||
|
bne loop2 ; 2nt/3
|
||||||
|
|
||||||
|
; hgr
|
||||||
|
bit HIRES ; 4
|
||||||
|
bit SET_GR ; 4
|
||||||
|
|
||||||
|
ldy #15 ; 2
|
||||||
|
loop3:
|
||||||
|
|
||||||
|
; 5*255+2 = 197
|
||||||
|
|
||||||
|
ldx #39 ; 2
|
||||||
|
loop4:
|
||||||
|
dex ; 2
|
||||||
|
bne loop4 ; 2nt/3
|
||||||
|
|
||||||
|
dey ; 2
|
||||||
|
bne loop3 ; 2nt/3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; gr
|
||||||
|
bit LORES
|
||||||
|
|
||||||
|
ldy #15 ; 2
|
||||||
|
loop5:
|
||||||
|
|
||||||
|
; 5*255+2 = 197
|
||||||
|
|
||||||
|
ldx #39 ; 2
|
||||||
|
loop6:
|
||||||
|
dex ; 2
|
||||||
|
bne loop6 ; 2nt/3
|
||||||
|
|
||||||
|
dey ; 2
|
||||||
|
bne loop5 ; 2nt/3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
jmp display_loop ; 3
|
||||||
|
|
||||||
|
wait_until_keypressed:
|
||||||
|
lda KEYPRESS ; check if keypressed
|
||||||
|
bpl wait_until_keypressed ; if not, loop
|
||||||
|
bit KEYRESET
|
||||||
|
rts
|
||||||
|
|
||||||
|
line1:.asciiz " * . "
|
||||||
|
line2:.asciiz " * . T A L B O T . "
|
||||||
|
line3:.asciiz " * F A N T A S Y "
|
||||||
|
line4:.asciiz " * S E V E N "
|
||||||
|
line5:.asciiz " . . . "
|
||||||
|
line6:.asciiz " . "
|
||||||
|
|
||||||
|
.include "../asm_routines/gr_offsets.s"
|
||||||
|
.include "../asm_routines/text_print.s"
|
||||||
|
.include "../asm_routines/gr_hlin_double.s"
|
||||||
|
|
||||||
|
.align $1000
|
||||||
|
|
||||||
|
.incbin "KATC.BIN"
|
Binary file not shown.
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 7.7 KiB |
Loading…
Reference in New Issue
Block a user