mirror of
https://github.com/A2osX/A2osX.git
synced 2024-06-27 00:29:29 +00:00
Kernel 0.93
This commit is contained in:
parent
77b64abc5c
commit
74c56186b4
Binary file not shown.
|
@ -59,7 +59,7 @@ IO.Reset.In >LDA.G IO.hIn
|
||||||
.8 clc
|
.8 clc
|
||||||
IO.Reset.In.RTS rts
|
IO.Reset.In.RTS rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
IO.Pipe.Out >LDYA 256
|
IO.Pipe.Out >LDYAI 256
|
||||||
>SYSCALL pipe
|
>SYSCALL pipe
|
||||||
bcs IO.Reset.In.RTS
|
bcs IO.Reset.In.RTS
|
||||||
>STA.G IO.hPipe
|
>STA.G IO.hPipe
|
||||||
|
|
|
@ -390,7 +390,7 @@ SKT.shutdown.STREAM
|
||||||
SKT.Read jsr SKT.PullhFDDataInPtrLen
|
SKT.Read jsr SKT.PullhFDDataInPtrLen
|
||||||
|
|
||||||
jsr SKT.EOF.I
|
jsr SKT.EOF.I
|
||||||
bcs .9 I/O error
|
bcs .99 I/O error
|
||||||
|
|
||||||
tay
|
tay
|
||||||
bne .9 eof=true, exit with CC,Y,A = 0
|
bne .9 eof=true, exit with CC,Y,A = 0
|
||||||
|
@ -399,7 +399,7 @@ SKT.Read jsr SKT.PullhFDDataInPtrLen
|
||||||
|
|
||||||
.9 lda #0
|
.9 lda #0
|
||||||
tay
|
tay
|
||||||
rts
|
.99 rts
|
||||||
*/--------------------------------------
|
*/--------------------------------------
|
||||||
* # Write (STREAM)
|
* # Write (STREAM)
|
||||||
* ## C
|
* ## C
|
||||||
|
@ -417,18 +417,27 @@ SKT.Read jsr SKT.PullhFDDataInPtrLen
|
||||||
SKT.Write jsr SKT.PullhFDDataInPtrLen
|
SKT.Write jsr SKT.PullhFDDataInPtrLen
|
||||||
|
|
||||||
jsr SKT.CheckStream
|
jsr SKT.CheckStream
|
||||||
bcs .9
|
bcs .99
|
||||||
|
|
||||||
|
jsr SKT.GetTCB
|
||||||
|
ldx SKT.Cache+S.SOCKET.TCP.OUTFREE
|
||||||
|
cpx ZPDataInLen
|
||||||
|
lda SKT.Cache+S.SOCKET.TCP.OUTFREE+1
|
||||||
|
sbc ZPDataInLen+1
|
||||||
|
bcc .9 Not enough room in Q
|
||||||
|
|
||||||
jsr SKT.AddDataToSktOut will call SKT.GetTCB
|
jsr SKT.AddDataToSktOut will call SKT.GetTCB
|
||||||
bcs .90
|
|
||||||
|
|
||||||
jsr TCP.OUT.I SKT.GetTCB called, try to push, ignore error....
|
jsr TCP.OUT.I SKT.GetTCB called, try to push, ignore error....
|
||||||
|
|
||||||
|
>LDYA ZPDataInLen
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
.90 lda #0 no data transfered
|
.9 lda #0 no data transfered
|
||||||
sec
|
tay
|
||||||
.9 rts
|
clc
|
||||||
|
.99 rts
|
||||||
*/--------------------------------------
|
*/--------------------------------------
|
||||||
* # Recv (RAW,DGRAM,SEQPACKET)
|
* # Recv (RAW,DGRAM,SEQPACKET)
|
||||||
* # RecvFrom (RAW,DGRAM,SEQPACKET)
|
* # RecvFrom (RAW,DGRAM,SEQPACKET)
|
||||||
|
@ -1078,13 +1087,6 @@ SKT.GetDataFromSktIn
|
||||||
* Dst : hOutMem/OUTHEAD
|
* Dst : hOutMem/OUTHEAD
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
SKT.AddDataToSktOut
|
SKT.AddDataToSktOut
|
||||||
jsr SKT.GetTCB
|
|
||||||
ldx SKT.Cache+S.SOCKET.TCP.OUTFREE
|
|
||||||
cpx ZPDataInLen
|
|
||||||
lda SKT.Cache+S.SOCKET.TCP.OUTFREE+1
|
|
||||||
sbc ZPDataInLen+1
|
|
||||||
bcc .9 Not enough room in Q
|
|
||||||
|
|
||||||
ldy #S.SOCKET.SQ.hOutMem
|
ldy #S.SOCKET.SQ.hOutMem
|
||||||
lda (ZPPtrSKT),y
|
lda (ZPPtrSKT),y
|
||||||
>SYSCALL GetMemPtr
|
>SYSCALL GetMemPtr
|
||||||
|
@ -1141,9 +1143,6 @@ SKT.AddDataToSktOut
|
||||||
sta ZPTmpPtr2+1
|
sta ZPTmpPtr2+1
|
||||||
bra .1
|
bra .1
|
||||||
|
|
||||||
.9 sec
|
|
||||||
rts
|
|
||||||
|
|
||||||
.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTFREE,ZPDataInLen
|
.8 >SBC16 SKT.Cache+S.SOCKET.TCP.OUTFREE,ZPDataInLen
|
||||||
>ADC16 SKT.Cache+S.SOCKET.TCP.OUTUSED,ZPDataInLen
|
>ADC16 SKT.Cache+S.SOCKET.TCP.OUTUSED,ZPDataInLen
|
||||||
>ADC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataInLen
|
>ADC16 SKT.Cache+S.SOCKET.TCP.OUTTOSEND,ZPDataInLen
|
||||||
|
|
|
@ -271,7 +271,8 @@ IO.CLOSE.PIPE ldy #S.FD.PIPE.S
|
||||||
IO.CLOSE.FD lda (pFD),y
|
IO.CLOSE.FD lda (pFD),y
|
||||||
beq .1
|
beq .1
|
||||||
|
|
||||||
jsr K.FreeStkObj
|
* jsr K.FreeStkObj
|
||||||
|
jsr K.Freemem
|
||||||
|
|
||||||
.1 lda IO.hFD
|
.1 lda IO.hFD
|
||||||
jmp K.FreeMem
|
jmp K.FreeMem
|
||||||
|
@ -419,7 +420,7 @@ IO.READ.SSOCK ldy #S.FD.SSOCK.READ
|
||||||
lda IO.hFD
|
lda IO.hFD
|
||||||
|
|
||||||
.1 jsr $FFFF SELF MODIFIED
|
.1 jsr $FFFF SELF MODIFIED
|
||||||
bcs .9
|
bcs .9 I/O error
|
||||||
|
|
||||||
phy
|
phy
|
||||||
ply
|
ply
|
||||||
|
@ -428,7 +429,7 @@ IO.READ.SSOCK ldy #S.FD.SSOCK.READ
|
||||||
tax
|
tax
|
||||||
bne .9
|
bne .9
|
||||||
|
|
||||||
dec pStack CC, Y,A = 0
|
dec pStack no data transfered, CC, Y,A = 0
|
||||||
dec pStack
|
dec pStack
|
||||||
dec pStack
|
dec pStack
|
||||||
dec pStack keep buf/count on stack
|
dec pStack keep buf/count on stack
|
||||||
|
@ -449,30 +450,50 @@ IO.READ.PIPE ldy #S.FD.PIPE.Used+1
|
||||||
lda (pFD),y
|
lda (pFD),y
|
||||||
bpl .11
|
bpl .11
|
||||||
|
|
||||||
jmp IO.READ.PIPE.99 Remote PS closed the Pipe
|
jmp IO.READ.PIPE.EOF Remote PS closed the Pipe
|
||||||
|
|
||||||
.11 lda #0 BLOCKING I/O
|
.11 jmp IO.READ.PIPE.BLK
|
||||||
sec
|
|
||||||
rts
|
|
||||||
|
|
||||||
.10 >PULLW .3+1 get buf
|
.10 >PULLW .3+1 get buf
|
||||||
|
|
||||||
>PULLA get cnt lo
|
>PULLA get cnt lo
|
||||||
|
pha
|
||||||
|
ldy #S.FD.PIPE.Used
|
||||||
|
cmp (pFD),y
|
||||||
|
|
||||||
|
>PULLA get cnt hi
|
||||||
|
tax
|
||||||
|
iny
|
||||||
|
sbc (pFD),y
|
||||||
|
bcc .12
|
||||||
|
|
||||||
|
pla
|
||||||
|
dey
|
||||||
|
lda (pFD),y
|
||||||
|
pha
|
||||||
|
iny
|
||||||
|
lda (pFD),y
|
||||||
|
tax
|
||||||
|
|
||||||
|
.12 pla
|
||||||
|
sta .80+1
|
||||||
|
stx .81+1
|
||||||
eor #$ff
|
eor #$ff
|
||||||
sta IO.Counter
|
sta IO.Counter
|
||||||
|
|
||||||
>PULLA get cnt hi
|
txa
|
||||||
eor #$ff
|
eor #$ff
|
||||||
sta IO.Counter+1
|
sta IO.Counter+1
|
||||||
|
|
||||||
ldy #S.FD.PIPE.hMem
|
ldy #S.FD.PIPE.hMem
|
||||||
lda (pFD),y
|
lda (pFD),y
|
||||||
jsr K.GetMemPtr
|
jsr K.GetMemPtr
|
||||||
>STYA .2+1
|
|
||||||
|
|
||||||
ldy #S.FD.PIPE.Head
|
sty .2+1
|
||||||
lda (pFD),y
|
|
||||||
sta .4+1
|
ldy #S.FD.PIPE.Tail+1
|
||||||
|
adc (pFD),y
|
||||||
|
sta .2+2
|
||||||
|
|
||||||
dey S.FD.PIPE.Tail
|
dey S.FD.PIPE.Tail
|
||||||
lda (pFD),y
|
lda (pFD),y
|
||||||
|
@ -487,55 +508,82 @@ IO.READ.PIPE ldy #S.FD.PIPE.Used+1
|
||||||
|
|
||||||
.2 lda $ffff,y SELF MODIFIED
|
.2 lda $ffff,y SELF MODIFIED
|
||||||
.3 sta $ffff,x SELF MODIFIED
|
.3 sta $ffff,x SELF MODIFIED
|
||||||
inx
|
|
||||||
beq .8 moved $100 bytes
|
|
||||||
|
|
||||||
iny
|
inx
|
||||||
.4 cpy #$ff SELF MODIFIED
|
bne .4
|
||||||
|
|
||||||
|
inc .3+2
|
||||||
|
|
||||||
|
.4 iny
|
||||||
bne .1
|
bne .1
|
||||||
|
|
||||||
.5 clc
|
ldy #S.FD.PIPE.Tail+1
|
||||||
.HS B0 BCS
|
lda (pFD),y
|
||||||
|
inc
|
||||||
|
ldy #S.FD.PIPE.Size+1
|
||||||
|
cmp (pFD),y
|
||||||
|
beq .5
|
||||||
|
|
||||||
.8 sec
|
ldy #S.FD.PIPE.Tail+1
|
||||||
lda #0
|
sta (pFD),y
|
||||||
rol
|
inc .2+2
|
||||||
sta IO.Counter+1
|
ldy #0
|
||||||
stx IO.Counter
|
bra .1
|
||||||
|
|
||||||
tya
|
.5 lda #0
|
||||||
|
ldy #S.FD.PIPE.Tail+1
|
||||||
|
sta (pFD),y
|
||||||
|
|
||||||
|
ldy #S.FD.PIPE.hMem
|
||||||
|
lda (pFD),y
|
||||||
|
jsr K.GetMemPtr
|
||||||
|
sta .2+2
|
||||||
|
ldy #0
|
||||||
|
bra .1
|
||||||
|
|
||||||
|
.8 tya
|
||||||
ldy #S.FD.PIPE.Tail
|
ldy #S.FD.PIPE.Tail
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
|
|
||||||
txa
|
lda .80+1
|
||||||
ldy #S.FD.PIPE.Free
|
ldy #S.FD.PIPE.Free
|
||||||
clc
|
clc
|
||||||
adc (pFD),y
|
adc (pFD),y
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
|
|
||||||
iny
|
iny
|
||||||
lda IO.Counter+1
|
|
||||||
|
lda .81+1
|
||||||
adc (pFD),y
|
adc (pFD),y
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
|
|
||||||
ldy #S.FD.PIPE.Used
|
ldy #S.FD.PIPE.Used
|
||||||
sec
|
sec
|
||||||
lda (pFD),y
|
lda (pFD),y
|
||||||
sbc IO.Counter
|
sbc .80+1
|
||||||
sta (pFD),y
|
|
||||||
iny
|
|
||||||
lda (pFD),y
|
|
||||||
sbc IO.Counter+1
|
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
|
|
||||||
ldy IO.Counter
|
iny
|
||||||
lda IO.Counter+1 Y,A = bytes read
|
|
||||||
|
lda (pFD),y
|
||||||
|
sbc .81+1
|
||||||
|
sta (pFD),y
|
||||||
|
|
||||||
|
.80 ldy #$ff SELF MODIFIED
|
||||||
|
.81 lda #$ff Y,A = bytes read
|
||||||
|
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
IO.READ.PIPE.99 lda #MLI.E.EOF
|
IO.READ.PIPE.EOF
|
||||||
|
lda #MLI.E.EOF
|
||||||
sec
|
sec
|
||||||
>RET 4
|
>RET 4
|
||||||
|
|
||||||
|
IO.READ.PIPE.BLK
|
||||||
|
lda #0 BLOCKING I/O
|
||||||
|
sec
|
||||||
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
* (pStack)+2 count
|
* (pStack)+2 count
|
||||||
* (pStack)+0 buf
|
* (pStack)+0 buf
|
||||||
|
@ -543,7 +591,7 @@ IO.READ.PIPE.99 lda #MLI.E.EOF
|
||||||
IO.WRITE.PIPE ldy #S.FD.PIPE.S
|
IO.WRITE.PIPE ldy #S.FD.PIPE.S
|
||||||
lda (pFD),y
|
lda (pFD),y
|
||||||
|
|
||||||
bmi IO.READ.PIPE.99 Remote PS closed the Pipe
|
bmi IO.READ.PIPE.EOF Remote PS closed the Pipe
|
||||||
|
|
||||||
sec
|
sec
|
||||||
ldy #S.FD.PIPE.Free
|
ldy #S.FD.PIPE.Free
|
||||||
|
@ -556,7 +604,7 @@ IO.WRITE.PIPE ldy #S.FD.PIPE.S
|
||||||
ldy #3
|
ldy #3
|
||||||
sbc (pStack),y
|
sbc (pStack),y
|
||||||
|
|
||||||
bcc .9 not enough room in PIPE
|
bcc IO.READ.PIPE.BLK not enough room in PIPE
|
||||||
|
|
||||||
ldy #S.FD.PIPE.Free+1
|
ldy #S.FD.PIPE.Free+1
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
|
@ -567,6 +615,7 @@ IO.WRITE.PIPE ldy #S.FD.PIPE.S
|
||||||
>PULLW .2+1 get buf
|
>PULLW .2+1 get buf
|
||||||
|
|
||||||
>PULLA get cnt lo
|
>PULLA get cnt lo
|
||||||
|
sta .80+1
|
||||||
pha
|
pha
|
||||||
eor #$ff
|
eor #$ff
|
||||||
sta IO.Counter
|
sta IO.Counter
|
||||||
|
@ -577,6 +626,7 @@ IO.WRITE.PIPE ldy #S.FD.PIPE.S
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
|
|
||||||
>PULLA get cnt hi
|
>PULLA get cnt hi
|
||||||
|
sta .81+1
|
||||||
pha
|
pha
|
||||||
eor #$ff
|
eor #$ff
|
||||||
sta IO.Counter+1
|
sta IO.Counter+1
|
||||||
|
@ -588,14 +638,19 @@ IO.WRITE.PIPE ldy #S.FD.PIPE.S
|
||||||
ldy #S.FD.PIPE.hMem
|
ldy #S.FD.PIPE.hMem
|
||||||
lda (pFD),y
|
lda (pFD),y
|
||||||
jsr K.GetMemPtr
|
jsr K.GetMemPtr
|
||||||
>STYA .3+1
|
|
||||||
|
|
||||||
ldy #S.FD.PIPE.Head
|
sty .3+1
|
||||||
lda (pFD),y
|
|
||||||
tay
|
ldy #S.FD.PIPE.Head+1
|
||||||
|
adc (pFD),y
|
||||||
|
sta .3+2
|
||||||
|
|
||||||
ldx #0
|
ldx #0
|
||||||
|
|
||||||
|
dey
|
||||||
|
lda (pFD),y
|
||||||
|
tay S.FD.PIPE.Head
|
||||||
|
|
||||||
.1 inc IO.Counter
|
.1 inc IO.Counter
|
||||||
bne .2
|
bne .2
|
||||||
inc IO.Counter+1
|
inc IO.Counter+1
|
||||||
|
@ -604,28 +659,45 @@ IO.WRITE.PIPE ldy #S.FD.PIPE.S
|
||||||
.2 lda $ffff,x SELF MODIFIED
|
.2 lda $ffff,x SELF MODIFIED
|
||||||
.3 sta $ffff,y SELF MODIFIED
|
.3 sta $ffff,y SELF MODIFIED
|
||||||
|
|
||||||
iny
|
|
||||||
|
|
||||||
inx
|
inx
|
||||||
|
bne .4
|
||||||
|
|
||||||
|
inc .2+2
|
||||||
|
|
||||||
|
.4 iny
|
||||||
bne .1
|
bne .1
|
||||||
|
|
||||||
sec moved $100 bytes
|
ldy #S.FD.PIPE.Head+1
|
||||||
.HS 90 BCC
|
lda (pFD),y
|
||||||
|
inc
|
||||||
|
ldy #S.FD.PIPE.Size+1
|
||||||
|
cmp (pFD),y
|
||||||
|
beq .5
|
||||||
|
|
||||||
.8 clc
|
ldy #S.FD.PIPE.Head+1
|
||||||
tya
|
sta (pFD),y
|
||||||
|
inc .3+2
|
||||||
|
ldy #0
|
||||||
|
bra .1
|
||||||
|
|
||||||
|
.5 lda #0
|
||||||
|
ldy #S.FD.PIPE.Head+1
|
||||||
|
sta (pFD),y
|
||||||
|
|
||||||
|
ldy #S.FD.PIPE.hMem
|
||||||
|
lda (pFD),y
|
||||||
|
jsr K.GetMemPtr
|
||||||
|
sta .3+2
|
||||||
|
ldy #0
|
||||||
|
bra .1
|
||||||
|
|
||||||
|
.8 tya
|
||||||
ldy #S.FD.PIPE.Head
|
ldy #S.FD.PIPE.Head
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
|
|
||||||
txa
|
.80 ldy #$ff SELF MODIFIED
|
||||||
tay
|
.81 lda #$ff SELF MODIFIED
|
||||||
lda #0 Y,A = bytes written
|
clc Y,A = bytes written
|
||||||
rol
|
|
||||||
* clc
|
|
||||||
rts
|
|
||||||
|
|
||||||
.9 lda #0 BLOCKING I/O
|
|
||||||
sec
|
|
||||||
rts
|
rts
|
||||||
*/--------------------------------------
|
*/--------------------------------------
|
||||||
* # IOCTL
|
* # IOCTL
|
||||||
|
@ -668,28 +740,6 @@ K.IOCTL.GetPDrv ldy #S.FD.DEV.DRVPTR
|
||||||
sta pDRV+1
|
sta pDRV+1
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
IO.MLIOPEN >LDYAI 1024 get a ProDOS IOBUF
|
|
||||||
ldx #S.MEM.F.ALIGN+S.MEM.F.NOMOVE
|
|
||||||
jsr MEM.GetMem.YAX
|
|
||||||
bcs .9
|
|
||||||
|
|
||||||
>STYA K.MLI.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call
|
|
||||||
txa
|
|
||||||
ldy #S.FD.REG.IOBUF
|
|
||||||
sta (pFD),y
|
|
||||||
|
|
||||||
>MLICALL MLIOPEN
|
|
||||||
bcs .9
|
|
||||||
|
|
||||||
lda K.MLI.PARAMS+5 get ref_num
|
|
||||||
ldy #S.FD.REG.REF
|
|
||||||
sta (pFD),y
|
|
||||||
|
|
||||||
sta K.MLI.PARAMS+1 Next MLI Calls are REF_NUM based
|
|
||||||
|
|
||||||
* clc
|
|
||||||
.9 rts
|
|
||||||
*--------------------------------------
|
|
||||||
IO.EOF lda (pFD)
|
IO.EOF lda (pFD)
|
||||||
tax
|
tax
|
||||||
jmp (.1,x)
|
jmp (.1,x)
|
||||||
|
@ -777,6 +827,28 @@ IO.EOF.PIPE ldy #S.FD.PIPE.Used
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
|
IO.MLIOPEN >LDYAI 1024 get a ProDOS IOBUF
|
||||||
|
ldx #S.MEM.F.ALIGN+S.MEM.F.NOMOVE
|
||||||
|
jsr MEM.GetMem.YAX
|
||||||
|
bcs .9
|
||||||
|
|
||||||
|
>STYA K.MLI.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call
|
||||||
|
txa
|
||||||
|
ldy #S.FD.REG.IOBUF
|
||||||
|
sta (pFD),y
|
||||||
|
|
||||||
|
>MLICALL MLIOPEN
|
||||||
|
bcs .9
|
||||||
|
|
||||||
|
lda K.MLI.PARAMS+5 get ref_num
|
||||||
|
ldy #S.FD.REG.REF
|
||||||
|
sta (pFD),y
|
||||||
|
|
||||||
|
sta K.MLI.PARAMS+1 Next MLI Calls are REF_NUM based
|
||||||
|
|
||||||
|
* clc
|
||||||
|
.9 rts
|
||||||
|
*--------------------------------------
|
||||||
IO.DEVDIR >PSTR "/DEV/"
|
IO.DEVDIR >PSTR "/DEV/"
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
MAN
|
MAN
|
||||||
|
|
|
@ -382,7 +382,8 @@ K.MKFIFO
|
||||||
* A = hFD
|
* A = hFD
|
||||||
*\--------------------------------------
|
*\--------------------------------------
|
||||||
K.Pipe >STYA ZPPtr1
|
K.Pipe >STYA ZPPtr1
|
||||||
jsr K.NewStkObj Buffer in AUX mem
|
* jsr K.NewStkObj Buffer in AUX mem
|
||||||
|
jsr K.GetMem
|
||||||
bcs .99
|
bcs .99
|
||||||
|
|
||||||
stx .1+1 save PIPE buffer
|
stx .1+1 save PIPE buffer
|
||||||
|
@ -415,7 +416,7 @@ K.Pipe >STYA ZPPtr1
|
||||||
ldy #S.FD.PIPE.hMem
|
ldy #S.FD.PIPE.hMem
|
||||||
.1 lda #$ff Self Modified
|
.1 lda #$ff Self Modified
|
||||||
sta (pFD),y
|
sta (pFD),y
|
||||||
txa
|
txa hFD
|
||||||
* clc
|
* clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user