home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol018
/
banzai.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
8KB
|
423 lines
;
;
; 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-RANDOM 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 DISASSEMBLERS
;
; MOVE SUBROUTINES
;
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