; 
; 
;                     BANZAI.ASM Ver.1.1
; 
;                          as of
; 
;                     September 3, 1980
; 
;  So  you  have embedded your copyright notice in your  pride 
; and joy (3000 hours, 'till 3 in the morning "super program") 
; and  have  even included serial numbers  to  discourage  the 
; "rip-off"  artists...Great,  the "rip-off" artist takes your 
; ".COM" file and puts DDT or SID to work on it,  and calls it 
; his/hers...Oh well...but WAIT...there is HOPE.
; 
;  Include  BANZAI in your source file,  reassemble  with  the 
; appropriate copyright notice and serial number, and wait for 
; the  fireworks...ANY ATTEMPT to corrupt either the copyright 
; notice  or the serial number,  will "scramble" your file  so 
; bad  on  the  disk,  that  it  will  never  be  figured  out 
; again...In  addition,  any remnent parts of the  program  in 
; memory  are  also  "clobberd",  so back-tracking  is  nearly 
; impossible...a fitting justice to the "rip-off" artist.
; 
;  Digital  Research's  macro assemble "MAC"  is  required  to 
; assemble "BANZAI.ASM".
; 
; 
;                          Best regards,
;      
;                          Kelly Smith, CP/M-NET (tm)
;                          805-527-9321 (Modem, 300 Baud)
;                          805-527-0518 (Verbal)
; 
; 
;
;DEFINE DATA MOVE MACRO: MOVE FROM,TO,LENGTH FROM MAY BE ADDR, OR QUOTED STRING
;
MOVE	MACRO	?F,?T,?L
	IF	NOT NUL ?F
	IRPC	?C,?F
?Q	SET	'&?C&?C' ;;TEST FOR QUOTE
	EXITM
	ENDM
	IF	?Q EQ ''''
	LOCAL	?B,?Z
	CALL	?Z
?B	DB	?F
?Z	POP	H	;GET FROM
	LXI	B,?Z-?B	;GET LEN
	ELSE
	LXI	H,?F
	ENDIF
	ENDIF
	IF	NOT NUL ?T
	LXI	D,?T
	ENDIF
	IF	NOT NUL ?L
	LXI	B,?L
	ENDIF
	CALL	MOVER
	ENDM
;
;DEFINE CP/M MACRO - CPM FNC,PARM
;
CPM	MACRO	?F,?P
	PUSH	B
	PUSH	D
	PUSH	H
	IF	NOT NUL ?F
	MVI	C,?F
	ENDIF
	IF	NOT NUL ?P
	LXI	D,?P
	ENDIF
	CALL	BDOS
	POP	H
	POP	D
	POP	B
	ENDM


;
LXIH	EQU	021H	;DEFINE LXI H,XX TO CONFUSE DISASSEMBLERS
;

	ORG	100H
;
; INITIALIZE LOCAL STACK
; 
STARTZ:LXI	H,0
	DAD	SP
	SHLD	STACK
	LXI	SP,STACK
; 
; START OF PROGRAM EXECUTION

START:	JMP	BEGIN	; JUMP OVER COPYRIGHT NOTICE AND SERIAL NUMBER
	DB	LXIH	;CONFUSE DISASSEMBLERS

COPY$RIGHT:

	DB	' Copyright 1980, by Microcosm Associates '
SERIAL$NUMBER:

	DB	'UAC15234'

BEGIN:	JMP	GET$COPYRIGHT
	DB	LXIH	;CONFUSE DISASSEMBLERS
INSTR:	MOV	A,B
	SUB	C
	CMC
	RNC
	MOV	B,A
INSTR1:	PUSH	B
	PUSH	D
	PUSH	H
	JMP	GET$MATCH
	DB	LXIH	;CONFUSE DISASSEMBLERS
MATCH:	INR	C
MATCH1:	DCR	C
	RZ
	LDAX	D
	ANI	07FH	;REVEAL HIDDEN TEXT
	SUB	M
	RNZ
	INX	H
	INX	D
	JMP	MATCH1
	DB	LXIH	;CONFUSE DISASSEMBLERS
GET$MATCH:
	CALL	MATCH
	POP	H
	POP	D
	POP	B
	JZ	MATCH$OK
	ANA	A
	DCR	B
	RM
	INX	H
	JMP	INSTR1
	DB	LXIH	;CONFUSE DISASSEMBLERS
MATCH$OK:
	MVI	B,0
	DAD	B
	STC
	RET
	DB	LXIH	;CONFUSE DISASSEMBLERS
GET$COPYRIGHT:
	LXI	H,COPY$RIGHT
	MVI	B,40H
	MVI	C,CHECK$COPYRIGHT-HIDDEN$COPYRIGHT
	LXI	D,HIDDEN$COPYRIGHT
	CALL	INSTR
	JMP	CHECK$COPYRIGHT
	DB	LXIH	;CONFUSE DISASSEMBLERS
HIDDEN$COPYRIGHT:
	DB	' '+80H
	DB	'C'+80H
	DB	'o'+80H
	DB	'p'+80H
	DB	'y'+80H
	DB	'r'+80H
	DB	'i'+80H
	DB	'g'+80H
	DB	'h'+80H
	DB	't'+80H
	DB	' '+80H
	DB	'1'+80H
	DB	'9'+80H
	DB	'8'+80H
	DB	'0'+80H
	DB	','+80H
	DB	' '+80H
	DB	'b'+80H
	DB	'y'+80H
	DB	' '+80H
	DB	'M'+80H
	DB	'i'+80H
	DB	'c'+80H
	DB	'r'+80H
	DB	'o'+80H
	DB	'c'+80H
	DB	'o'+80H
	DB	's'+80H
	DB	'm'+80H
	DB	' '+80H
	DB	'A'+80H
	DB	's'+80H
	DB	's'+80H
	DB	'o'+80H
	DB	'c'+80H
	DB	'i'+80H
	DB	'a'+80H
	DB	't'+80H
	DB	'e'+80H
	DB	's'+80H
	DB	' '+80H
CHECK$COPYRIGHT:
	JNC	BANZAI	; BANZAI FILE, IF COPYRIGHT CORRUPTED
	LXI	H,SERIAL$NUMBER
	MVI	B,40H
	MVI	C,CHECK$SERIAL$NUMBER-HIDDEN$SERIAL$NUMBER
	LXI	D,HIDDEN$SERIAL$NUMBER
	CALL	INSTR
	JMP	CHECK$SERIAL$NUMBER
	DB	LXIH	;CONFUSE DISASSEMBLERS
HIDDEN$SERIAL$NUMBER:
	DB	'U'+80H
	DB	'A'+80H
	DB	'C'+80H
	DB	'1'+80H
	DB	'5'+80H
	DB	'2'+80H
	DB	'3'+80H
	DB	'4'+80H
CHECK$SERIAL$NUMBER:
	JNC	BANZAI	; BANZAI FILE, IF SERIAL NUMBER CORRUPTED
	JMP	NOBANZAI; EXIT, FOR PURPOSES OF DEMO...
			; ...NORMAL EXECUTION OF FILE WOULD CONTINUE
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; 
; 

BANZAI:			; BANZAI THE SPECIFIED FILE IN "TFCB"

; 
; SCRAMBLE A WHILE TO MIX UP THE SEED
; 
	MVI	H,0	; GET 256 #'S
MIXUP:	CALL	PSEURAN	; GET A #
	DCR	H	; MORE?
	JNZ	MIXUP	; LOOP IF SO
;
;GET LOGGED IN DRIVE NUMBER
;
	LDA	FCB	; GET FROM "JUST LOADED" FILENAME
	STA	TFCB	; AND SAVE IN TEMPORARY FCB
; 
; SEE THAT THE INPUT FILE EXISTS
; 
	CPM	OPEN,TFCB
	INR	A	; OK?
	JNZ	SCRAMLP	; YES, SCRAMBLE IT
	CALL	ERXIT
	DB	'++NO SUCH FILE++$'
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; READ THE FILE, SCRAMBLE A SECTOR, RE-WRITE IT.
; 
SCRAMLP:CALL	RDSECT	; READ A SECTOR
	JC	FINISH	; EXIT LOOP IF EOF
	CALL	SCRAMBL	; SCRAMBLE IT
	CALL	BACKUP	; RE-POSITION FOR WRITE
	CALL	WRSECT	; RE-WRITE THE SECTOR
	JMP	SCRAMLP	; LOOP UNTIL EOF
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; 
FINISH:	CPM	CLOSE,TFCB
	JMP	EXIT	; THIS BETTER WORK..
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; SECTOR READ ROUTINE
; 
RDSECT:	CPM	READ,TFCB
	ORA	A
	RZ		; ALL OK
; 
; READ ERROR OR EOF
; 
	CPI	1	; EOF?
	STC		; CARRY SHOWS EOF
	RZ		; RET, CARRY SET
	JMP	EXIT	; GREAT, A READ ERROR MAY HAVE BANZAI'D THE FILE
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; SCRAMBLE THE SECTOR
; 
SCRAMBL:LXI	H,80H	; POINT TO SECTOR
SCRLP:	CALL	PSEURAN	; GET PSEUDO RANDOM #
	XRA	M	; SCRAMBLE
	MOV	M,A
	INR	L	; MORE IN SECTOR?
	JNZ	SCRLP
	RET
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; BACKUP THE FILE POINTER FOR THE RE-WRITE
; 
BACKUP:	LDA	FCBRNO	; GET SECTOR #
	DCR	A	; BACK UP
	STA	FCBRNO
	RP		; RETURN IF OK
; 
; WE BACKED UP INTO PREVIOUS EXTENT, WILL HAVE TO RE-OPEN IT
; 
	LDA	FCBEXT	; GET EXTENT
	DCR	A	; BACK UP 1
	STA	FCBEXT
	CPM	OPEN,TFCB ; RE-OPEN
	INR	A
	JNZ	OPEN2OK
	JMP	EXIT	; GREAT, OPEN ERROR MAY HAVE BANZAI'D THE FILE
	DB	LXIH	;CONFUSE DISASSEMBLERS
OPEN2OK:MVI	A,7FH	; GET HI SECTOR
	STA	FCBRNO
	RET
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; WRITE BACK THE SECTOR
; 
WRSECT:	CPM	WRITE,TFCB
	ORA	A
	RZ
	JMP	EXIT	; GREAT, WRITE ERROR MAY HAVE BANZAI'D THE FILE
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; GET A PSEUDO-RANDO] 8 BIT NUMBER USING THE PASSWORD AS A SEED
; 
; 	FOR SPEED, THIS ROUTINE DOES NO REGISTER
; 	PUSHES AND POPS, HOWEVER HL AREN'T USED.
; 
PSEURAN:MVI	C,4	; GRAB EVERY 4TH PSEU. #
PSEULP0:MVI	B,8	; SHIFT THRU 8 BYTES
	LXI	D,PASSWD
	ORA	A	; CLEAR INITIAL CARRY
PSEULP1:LDAX	D	; GET A CHAR
	RAR		; SHIFT
	STAX	D
	INX	D
	DCR	B
	JNZ	PSEULP1
; EXCLUSIVE-OR THE LAST FEW BITS INTO THE FIRST ONE
	DCX	D	; BACK UP TO LAST
	RAR
	RAR		; SHIFT A FEW MORE
	XCHG
	XRA	M
	RRC		; SHIFT LO BIT INTO HI
	ANI	80H	; ISOLATE SINGLE BIT
	LXI	H,PASSWD ; GET FIRST BYTE
 	ORA	M	; 'OR' IN THE BIT
	MOV	M,A	; MOVE IT BACK
	XCHG		; RESTORE HL
	DCR	C
	JNZ	PSEULP0	; LOOP IF MORE PASSES
	RET
	DB	LXIH	;CONFUSE DISASSEMBLARS
; 
; MOVE SUBROYTINES
; 
MOVER:	MOV	A,M
	STAX	D
	INX	H
	INX	D
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	MOVER
	RET
	DB	LXIH	;CONFUSE DISASSEMBLERS
; 
; EXIT WITH ERROR MESSAGE
; 
MSGEXIT	EQU	$	; EXIT WITH MESSAGE
ERXIT:	POP	D	; GET MSG
	MVI	C,PRNSTRG
	CALL	BDOS
; 
; EXIT, CLOBBER MEMORY, RESTORE STACK, AND RETURN (HEH, HEH...)
; 
ENDZ	EQU	$		; END OF MEMORY TO BE CLOBBERD
EXIT:	LXI	B,ENDZ-STARTZ	; GET BYTE NUMBER TO CLOBBER
	LXI	H,STARTZ	; POINT TO START OF CLOBBER
CLOBBER:MOV	M,A		; DO IT...TO IT...
	INX	H
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	CLOBBER		; CLOBBER ALL...
NOBANZAI:			; NO BANZAI REQUIRED...
	LHLD	STACK
	SPHL
	RET		; RETURN TO CP/M
	DB	LXIH	;CONFUSE DISASSEMBLERS

PASSWD:	DB	'KILLFILE'
	DB	LXIH	;CONFUSE DISASSEMBLERS

TFCB:	DB	0,'BANZAI  COM',0,0,0,0
	DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

	DS	128	; STACK AREA
STACK	DS	2

;
; BDOS/CBIOS EQUATES (VERSION 7)	
;
RDCON	EQU	1
WRCON	EQU	2
PRNSTRG	EQU	9
CONST	EQU	11
OPEN	EQU	15
CLOSE	EQU	16
SRCHF	EQU	17
SRCHN	EQU	18
ERASE	EQU	19
READ	EQU	20
WRITE	EQU	21
MAKE	EQU	22
REN	EQU	23
STDMA	EQU	26
BDOS	EQU	5
FCB	EQU	5CH 
FCB2	EQU	6CH
FCBEXT	EQU	TFCB+12
FCBRNO	EQU	TFCB+32

	END
