TITLE 'CP/M 3 Patch - Version 3.0' PAGE 0 ;*************************** ;*************************** ;** ** ;** P A T C H ** ;** ** ;** AUGUST 15 1982 ** ;** ** ;*************************** ;*************************** ; FFFF = ON EQU 0FFFFH 0000 = OFF EQU 00000H FFFF = PATCH4 EQU ON ;CORRECT PATCHFIELD ;PATCH 4 VERIFIED AGAINST DRI RELEASE WITH PATCH INSTALLED ; ON 17 OCT 97 RHP FFFF = PATCH14 EQU ON ;CORRECT PATCHES > 24 ; 0100 ORG 100H ;BEGINNING OF TPA ; ;******************************** ;* BDOS FUNCTIONS ;******************************** 0000 = RETURN EQU 0 ;RETURN TO CCP 0002 = CONOUT EQU 2 ;CONSOLE OUTPUT 0006 = CONIN EQU 6 ;CONSOLE INPUT 0009 = PSTRING EQU 9 ;PRINT STRING 000A = RSTRING EQU 10 ;READ STRING 000C = VERSION EQU 12 ;CP/M VERSION 000F = OPENF EQU 15 ;OPEN FILE 0010 = CLOSEF EQU 16 ;CLOSE FILE 0014 = READF EQU 20 ;READ FILE 001A = DMAF EQU 26 ;SET DMA 0022 = WRITERF EQU 34 ;WRITE RANDOM 002D = ERRMODE EQU 45 ;SET ERROR MODE ; ;******************************** ;* NON GRAPHIC CHARACTERS ;******************************** 000D = CR EQU 0DH ;CARRIAGE RETURN 000A = LF EQU 0AH ;LINE FEED ^J 0018 = CTRLX EQU 018H ;^X 0003 = CTRLC EQU 03H ;^C 0008 = BAK EQU 08H ;<- 007F = RUB EQU 07FH ;<- (DEL) ; ;******************************** ;* FCB, BUFFER AND BDOS LOCATIONS ;******************************** 0005 = BDOS EQU 05H ;BDOS ENTRY POINT 005C = FCB EQU 05CH ;FILE CONTROL BLOCK 0065 = SPEC EQU 065H ;FILE SPEC BEGINNING LOCATION 0080 = BUF EQU 080H ;PASSWORD BUFFER ; ;******************************** ;* BEGINNING OF PROGRAM ;******************************** 0100 C3DC07 JMP BEGIN ; ;******************************** ;* PATCH HEADER / PATCH AREA ;******************************** 0103 0000000000 DW 0,0,0,0,0,0 ;UNDEFINED AREA 010F 00 DB 0 0110 5041544348 DB 'PATCH VERSION3.0' ;PROGRAM NAME AND VERSION 0120 2020205041 DB ' PATCH.COM ' ;PROGRAM AS FOUND ON DISK 0130 0000000000 DW 0,0,0,0,0,0,0,0 ;UNDEFINED AREA 0140 0000000000 DW 0,0,0,0,0,0,0,0 0150 434F505952 DB 'COPYRIGHT 1982, ' ;COPYRIGHT AND YEAR 0160 4449474954 DB 'DIGITAL RESEARCH' 0170 3135313238 DB '151282' ;VERSION DATE [DAY-MONTH-YEAR] ; IF PATCH14 0176 00000002 DB 0,0,0,2 ;PATCH BIT MAP ELSE IF PATCH4 DB 0,0,0,1 ;PATCH BIT MAP ELSE DB 0,0,0,0 ;PATCH BIT MAP ENDIF ;PATCH 4 ENDIF ;PATCH 14 ; 017A 3635343332 DB '654321' ;SERIAL NUMBER IDENTIFIER ; ;******************************** ;* BEGINNING OF PROGRAM ;******************************** 0180 C3DC07 JMP BEGIN ;BEGIN PROGRAM ; ;******************************** ;* INITIALIZING ROUTINE ;******************************** INIT: 0183 3A6F00 LDA 06FH 0186 32210A STA NUM 0189 2A6D00 LHLD 06DH ;PATCH NUMBER INPUTED 018C 221B0A SHLD NUMBER 018F 0E2D MVI C,ERRMODE ;SET ERROR MODE SO NO 0191 1EFF MVI E,255 ;BDOS ERROR MESSAGES WILL 0193 CD0500 CALL BDOS ;APPEAR 0196 11FD07 LXI D,INTRO$MESS 0199 CD3C06 CALL PRINT ;PRINT 'PATCH ' ; CHECK$VER: 019C 0E0C MVI C,VERSION 019E CD0500 CALL BDOS ;GET VERSION 01A1 7C MOV A,H ;'H'=0 -> CP/M 01A2 FE00 CPI 0H ;'H'=1 -> MP/M 01A4 C22307 JNZ WRNGVER ;JUMP IF WRONG O.S. 01A7 7D MOV A,L 01A8 FE30 CPI 030H 01AA DA2307 JC WRNGVER ;JUMP IF WRONG VERSION 01AD C9 RET ; ;******************************** ;* CHECK FILE TYPES ;* CHECK DEFAULT ROUTINES ;******************************** CHECK$FILE: 01AE 3A5D00 LDA FCB+1 01B1 FE20 CPI ' ' 01B3 C0 RNZ 01B4 11BC08 LXI D,FILE$PRMT$MESS 01B7 CD3C06 CALL PRINT 01BA 3E12 MVI A,18 01BC 32020A STA FILE$BUFF 01BF 11020A LXI D,FILE$BUFF 01C2 0E0A MVI C,RSTRING 01C4 CD0500 CALL BDOS ;ASK FOR FILE NAME 01C7 3A030A LDA FILE$BUFF+1 01CA FE00 CPI 0 01CC CAD107 JZ STOP PARSE: 01CF 3A050A LDA FILE$BUFF+3 01D2 FE3A CPI ':' 01D4 CA3302 JZ PARSE$DRIVE 01D7 21040A LXI H,FILE$BUFF+2 PARSE2: 01DA 0608 MVI B,8 01DC 115D00 LXI D,FCB+1 PARSE$NAME: 01DF 7E MOV A,M 01E0 FE2E CPI '.' 01E2 CAFD01 JZ PARSE3 01E5 FE20 CPI ' ' 01E7 CA1F02 JZ PARSE$NUM 01EA FE61 CPI 'a' 01EC DAF601 JC PARSE$NAME2 01EF FE7B CPI '{' 01F1 D2F601 JNC PARSE$NAME2 01F4 D620 SUI 020H PARSE$NAME2: 01F6 12 STAX D 01F7 23 INX H 01F8 13 INX D 01F9 05 DCR B 01FA C2DF01 JNZ PARSE$NAME PARSE3: 01FD 23 INX H 01FE 116500 LXI D,FCB+9 0201 0603 MVI B,3 PARSE$TYPE: 0203 7E MOV A,M 0204 FE20 CPI ' ' 0206 CA2002 JZ PARSE$NUM2 0209 FE61 CPI 'a' 020B DA1502 JC PARSE$TYPE2 020E FE7B CPI '{' 0210 D21502 JNC PARSE$TYPE2 0213 D620 SUI 020H PARSE$TYPE2: 0215 12 STAX D 0216 23 INX H 0217 13 INX D 0218 05 DCR B 0219 CA1F02 JZ PARSE$NUM 021C C30302 JMP PARSE$TYPE ; PARSE$NUM: 021F 23 INX H PARSE$NUM2: 0220 7E MOV A,M 0221 FE20 CPI ' ' 0223 C8 RZ 0224 326D00 STA 6DH 0227 23 INX H 0228 7E MOV A,M 0229 326E00 STA 6EH 022C 2A6D00 LHLD 6DH 022F 221B0A SHLD NUMBER 0232 C9 RET ; PARSE$DRIVE: 0233 3A040A LDA FILE$BUFF+2 0236 FE61 CPI 'a' 0238 DA4202 JC PARSE$DRIVE2 023B FE7B CPI '{' 023D D24202 JNC PARSE$DRIVE2 0240 D620 SUI 020H PARSE$DRIVE2: 0242 D640 SUI 040H 0244 325C00 STA FCB 0247 21060A LXI H,FILE$BUFF+4 024A 3A5C00 LDA FCB 024D FE11 CPI 17 024F D2A407 JNC BAD$DRIVE 0252 C3DA01 JMP PARSE2 ; CHECK$SPEC: 0255 216500 LXI H,SPEC 0258 0603 MVI B,3 CHECK$SPEC2: 025A 7E MOV A,M 025B FE20 CPI ' ' 025D C0 RNZ 025E 23 INX H 025F 05 DCR B 0260 C25A02 JNZ CHECK$SPEC2 0263 21434F LXI H,04F43H ;='CO' 0266 226500 SHLD SPEC 0269 3E4D MVI A,'M' 026B 326700 STA SPEC+2 026E 3E01 MVI A,1 0270 32180A STA TYPE 0273 C9 RET ; CHECK$TYPE: 0274 CD7A02 CALL CHECK$COM ;CHECK FILE TYPE 0277 C39602 JMP CHECK$PRL ;IF .COM OR .PRL ; ;1=>COM 2=>PRL CHECK$COM: 027A 3A180A LDA TYPE 027D FE01 CPI 1 027F 2A6500 LHLD SPEC 0282 7D MOV A,L 0283 FE43 CPI 'C' 0285 C0 RNZ 0286 7C MOV A,H 0287 FE4F CPI 'O' 0289 C0 RNZ 028A 3A6700 LDA SPEC+2 028D FE4D CPI 'M' 028F C0 RNZ 0290 3E01 MVI A,1 0292 32180A STA TYPE 0295 C9 RET ; CHECK$PRL: ;CHECK IF .PLR 0296 2A6500 LHLD SPEC 0299 7D MOV A,L 029A FE50 CPI 'P' 029C C2F706 JNZ NO$COM 029F 7C MOV A,H 02A0 FE52 CPI 'R' 02A2 C2F706 JNZ NO$COM 02A5 3A6700 LDA SPEC+2 02A8 FE4C CPI 'L' 02AA C2F706 JNZ NO$COM 02AD 3E02 MVI A,2 02AF 32180A STA TYPE 02B2 C9 RET ; ;******************************** ;* OPEN FILE / PASSWORD ROUTINE ;******************************** OPEN$FILE: 02B3 0E0F MVI C,OPENF ;ALSO CHECK IF PASSWORD 02B5 115C00 LXI D,FCB 02B8 CD0500 CALL BDOS ;OPEN THE FILE 02BB 32FD09 STA KEEPA 02BE 7C MOV A,H 02BF FE07 CPI 7 ;IF PASSWORD STATUS EXISTS 02C1 CACD02 JZ GET$PASSWD ;THEN H=7 02C4 3AFD09 LDA KEEPA 02C7 FEFF CPI 255 ;IF NOFILE THEN ACC.=FFH 02C9 CA4007 JZ NO$FILE 02CC C9 RET ; GET$PASSWD: 02CD 3A160A LDA TPASSWD 02D0 FEFF CPI 255 ;CHECK IF USER HAS ALREADY 02D2 CA2C07 JZ WRNG$PASS ;TRIED PASSWORD 02D5 CD3F03 CALL SPACE 02D8 11CB08 LXI D,QUEST 02DB CD3C06 CALL PRINT ;PRINT 'PASSWORD ?' 02DE CDF502 CALL INPUT ;GET THE PASSWORD 02E1 32170A STA LEN ;LEN = LENGTH OF PASSWORD 02E4 CD4C03 CALL CAP ;CAP THE PASSWORD 02E7 118200 LXI D,BUF+2 02EA CD2A06 CALL SET$DMA2 ;TELL WHERE PASSWORD CAN 02ED 3EFF MVI A,255 ;BE FOUND 02EF 32160A STA TPASSWD ;SET TRIED PASSWORD FLAG 02F2 C3B302 JMP OPEN$FILE ; INPUT: 02F5 218200 LXI H,BUF+2 ;BUF+2 = BUFFER AREA FOR 02F8 3E00 MVI A,0 ;PASSWORD INPUT2: ;ACC. IS THE COUNTER 02FA E5 PUSH H 02FB 32FD09 STA KEEPA ;SAVE THE REGISTERS 02FE 0E06 MVI C,CONIN 0300 1EFD MVI E,0FDH 0302 CD0500 CALL BDOS ;GET RAW CHARACTER 0305 FE18 CPI CTRLX 0307 CA3603 JZ INPUT3 ;RESTART INPUT ROUTINE IF ^X 030A FE03 CPI CTRLC 030C CAD107 JZ STOP ;STOP IF ^C 030F FE0D CPI CR 0311 CA3D03 JZ INPUT4 ;RETURN IF 0314 FE08 CPI BAK 0316 CA2B03 JZ BACK$SPACE ;JUMP IF DEL OR BAK 0319 FE7F CPI RUB ;JUMP IF RUB 031B CA2B03 JZ BACK$SPACE 031E E1 POP H 031F 77 MOV M,A ;MOVE INTO MEMORY THE CHAR. 0320 3AFD09 LDA KEEPA ;RESTORE THE COUNTER 0323 23 INX H ;INC. MEMORY LOCATION 0324 3C INR A ;INC. COUNTER 0325 FE08 CPI 8 ;CHECK IF 8 CHARS. READ 0327 C2FA02 JNZ INPUT2 032A C9 RET ; BACK$SPACE: ;BACK SPACE (^H) 032B E1 POP H ;RESTORE BUFFER POINTER 032C 3AFD09 LDA KEEPA ;RESTORE COUNTER 032F 2B DCX H ;SET MEMORY BACK 1 0330 3D DCR A ;SET COUNTER BACK 1 0331 3620 MVI M,' ' ;BLANK OUT THE UNWANTED 0333 C3FA02 JMP INPUT2 ;CHARACTER ; INPUT3: ;CTRL - X (^X) 0336 E1 POP H ;RESTORE BUFFER POINTER 0337 CD3F03 CALL SPACE ;BLANK OUT THE BUFFER 033A C3F502 JMP INPUT ;FOR PASSWORD AND START AGAIN ; INPUT4: ;RESTORE STACK AND RETURN 033D E1 POP H ;TO GETPASSWD ROUTINE 033E C9 RET ; SPACE: ;THIS ROUTINE BLANKS 033F 3E08 MVI A,8 ;OUT THE BUFFER THAT 0341 218200 LXI H,BUF+2 ;CONTAINS THE PASSWORD SPACE2: ; 0344 3620 MVI M,' ' ;MOVE INTO THE POINTER ' ' 0346 23 INX H ;DO IT 8 TIMES 0347 3D DCR A 0348 C24403 JNZ SPACE2 034B C9 RET ; CAP: ;THIS ROUTINE CHANGES 034C 1608 MVI D,8 ;THE'PASSWORD' TO UPPER-CASE 034E 218200 LXI H,BUF+2 CAP2: 0351 7E MOV A,M 0352 FE61 CPI 'a' ;CHECK IF CHARACTER IS 0354 DA5F03 JC SKIP ;BETWEEN 'A' AND 'Z' 0357 FE7B CPI '{' ;IF SO THEN CHANGE IT 0359 D25F03 JNC SKIP ;TO UPPERCASE BY SUBTRACTING 035C D620 SUI 20H ;20 HEX 035E 77 MOV M,A SKIP: 035F 23 INX H 0360 15 DCR D 0361 C25103 JNZ CAP2 ; DEL$CHAR: ;THIS ROUTINE DELETES 0364 3A170A LDA LEN ;THE CHARACTER AFTER 0367 C682 ADI 082H ;THE PASSWORD BECAUSE 0369 32170A STA LEN ;BDOS FUNCTION 10 ADDS 036C 2A170A LHLD LEN ;AN EXTRA CHARACTER TO THE 036F 3620 MVI M,' ' ;INPUT 0371 C9 RET ; ;******************************** ;* SERAIL NUMBER CHECK ROUTINES ;******************************** CHECK$SER: ;THIS ROUTINE CHECKS TO SEE 0372 3A180A LDA TYPE ;IF THE PROGRAM TO BE PATCHED 0375 FE01 CPI 1 ;IS A CP/M 3 PROGRAM 0377 CA9D03 JZ COM$SERIAL 037A FE02 CPI 2 037C CAAF03 JZ PRL$SERIAL 037F C3F706 JMP NO$COM ; CHANGE$TYPE: 0382 3E02 MVI A,2 ;THIS ROUTINE TELLS PATCH CHANGE$TYPE2: ;TO TREAT THE CURRENT COM 0384 32FD09 STA KEEPA ;FILE IN THE FCB AS A PRL 0387 CD2706 CALL SET$DMA ;FILE SO IT WILL SEARCH THE 038A CD3006 CALL READ$BUFF ;THIRD RECORD INSTEAD OF 038D 3AFD09 LDA KEEPA ;THE FIRST 0390 3D DCR A 0391 C28403 JNZ CHANGE$TYPE2 0394 CDC503 CALL SERIAL 0397 3E02 MVI A,2 0399 32180A STA TYPE 039C C9 RET ; COM$SERIAL: ;CHECK FOR .COM SERIAL # 039D CD2706 CALL SET$DMA 03A0 CD3006 CALL READ$BUFF 03A3 3A530A LDA BUFF 03A6 FEC9 CPI 0C9H ;CHECK IF A 'RET' STATEMENT 03A8 CA8203 JZ CHANGE$TYPE ;IF SO TREAT IT AS A PRL FILE 03AB CDC503 CALL SERIAL 03AE C9 RET ; PRL$SERIAL: ;CHECK FOR .PRL SERIAL # 03AF 3E03 MVI A,3 ;COUNTER PRL$SERIAL2: 03B1 32FD09 STA KEEPA ;MUST READ IN THE 3RD 03B4 CD2706 CALL SET$DMA ;RECORD OF THE .PRL FILE 03B7 CD3006 CALL READ$BUFF ;INORDER TO CHECK FOR THE 03BA 3AFD09 LDA KEEPA ;SERIAL NUMBER AND RETREIVE 03BD 3D DCR A ;THE PATCH BIT MAP 03BE C2B103 JNZ PRL$SERIAL2 03C1 CDC503 CALL SERIAL 03C4 C9 RET ; SERIAL: ;THIS ROUTINE CHECKS A CERTAIN ; IF PATCH4 03C5 21C30A LXI H,BUFF+112 ;MEMORY BLOCK AND SEARCHES 6 ELSE LXI H,BUFF+122 ;MEMORY BLOCK AND SEARCHES 6 ENDIF ;PATCH 4 ; 03C8 11330A LXI D,SER$TABLE 03CB 0605 MVI B,5 ;CERTAIN BYTES TO SEE IF IT IS SERIAL2: 03CD 1A LDAX D 03CE BE CMP M 03CF C21A07 JNZ WRNG$SER ;IT CHECKS THE LAST 6 BYTES 03D2 23 INX H 03D3 13 INX D 03D4 05 DCR B 03D5 C2CD03 JNZ SERIAL2 03D8 C9 RET ; ;******************************** ;* BRANCHING ROUTINES ;******************************** CHECK$RW: ;THIS ROUTINE CHECKS TO 03D9 3A210A LDA NUM ;SEE IF THE USER WANTS 03DC FE20 CPI ' ' ;TO 'WRITE' OR 'READ' 03DE C25D07 JNZ NOT$NUM ;A PATCH 03E1 2A1B0A LHLD NUMBER 03E4 7D MOV A,L 03E5 FE20 CPI ' ' 03E7 CAFA03 JZ SET$READ 03EA FE31 CPI '1' 03EC DA5D07 JC NOT$NUM 03EF FE3A CPI ':' 03F1 D25D07 JNC NOT$NUM 03F4 3E02 MVI A,2 03F6 32190A STA RW ;SET THE'WRITE' FLAG 03F9 C9 RET ; SET$READ: ;SET THE 'READ' FLAG 03FA 3E01 MVI A,1 03FC 32190A STA RW 03FF C9 RET ; BRANCH: ;BRANCH IF 'READ OR WRITE' 0400 CD4104 CALL GET$PATCHBITS ;GET BIT MAP PATCH 0403 3A190A LDA RW ;INTO ACTUAL NUMBERS 0406 FE01 CPI 1 0408 CA4E04 JZ READ ;IF '1' THEN 'READ' 040B FE02 CPI 2 040D CAC604 JZ WRITE ;IF '2' THEN 'WRITE' 0410 C3D107 JMP STOP ; ;******************************** ;* MULTIPLY ROUTINE ;******************************** GET$NUM: ;GET INPUTED NUMBER 0413 2A1B0A LHLD NUMBER ;BY USER AND TRANSFER IT 0416 7C MOV A,H ;INTO A NON ASCII NUMBER 0417 FE20 CPI ' ' 0419 CA3A04 JZ SET$VAL 041C D630 SUI 030H ;CHANGE INTO ACTUAL NUMBER 041E 32230A STA NUMTWO ;STORE IT 0421 7D MOV A,L 0422 D630 SUI 030H ;CHANGE INTO ACTUAL NUMBER ; MULTIPLY: 0424 0609 MVI B,9 ;TIMES TO ADD NUMBER 0426 5F MOV E,A MULTIPLY2: 0427 83 ADD E ;A=A+E 0428 05 DCR B 0429 C22704 JNZ MULTIPLY2 042C 5F MOV E,A ;E=A*10 042D 3A230A LDA NUMTWO 0430 83 ADD E 0431 32240A STA VAL 0434 FE21 CPI 33 0436 D25D07 JNC NOT$NUM 0439 C9 RET ; SET$VAL: ;IF INPUTED PATCH NUMBER IS 043A 7D MOV A,L ;ONLY ONE CHARACTER THEN 043B D630 SUI 030H ;CHANGE IT INTO A 'NO ASCII' 043D 32240A STA VAL ;NUMBER 0440 C9 RET ; GET$PATCHBITS: ;GET THE 4 BYTES IN THE BIT MAP 0441 2AC90A LHLD BUFF+118 ;AND SAVE THEM FOR LATER 0444 221D0A SHLD PATCH1 0447 2ACB0A LHLD BUFF+120 044A 221F0A SHLD PATCH2 044D C9 RET ; ;******************************** ;* READ ROUTINE ;******************************** READ: ;THIS ROUTINE CHECKS THE PATCH 044E 113F09 LXI D,CRPATC$MESS ;BIT MAP AND DISPLAYS ANY 0451 CD3C06 CALL PRINT ;CURRENT PATCHES 0454 CD8D06 CALL DISP$FILE ;DISPLAY THE FILE 0457 11F709 LXI D,COL$CR$LF$SP 045A CD3C06 CALL PRINT 045D CDAD04 CALL CHECK$BITS ;CHECK IF ANY PATCHES EXIST 0460 1E00 MVI E,0 ;HEX TOTAL COUNTER 0462 2A1F0A LHLD PATCH2 0465 7C MOV A,H 0466 CD8104 CALL ROT ;SEE IF ANY 1-8 0469 2A1F0A LHLD PATCH2 046C 7D MOV A,L 046D CD8104 CALL ROT ;SEE IF ANY 9-16 0470 2A1D0A LHLD PATCH1 0473 7C MOV A,H 0474 CD8104 CALL ROT ;SEE IF ANY 17-24 0477 2A1D0A LHLD PATCH1 047A 7D MOV A,L 047B CD8104 CALL ROT ;SEE IF ANY 25-32 047E C3D107 JMP STOP ; ROT: 0481 1608 MVI D,8 ;LOOP COUNTER (1-8) 0483 32FD09 STA KEEPA 0486 3E00 MVI A,0 ROT2: 0488 3A220A LDA CT ;DECIMAL COUNTER 048B C601 ADI 1 048D 27 DAA ;ADD 1 (DECIMAL) 048E 32220A STA CT 0491 1C INR E 0492 7B MOV A,E 0493 32FE09 STA KEEPE ;E IS THE HEX COUNTER 0496 7A MOV A,D 0497 32FF09 STA KEEPD 049A 3AFD09 LDA KEEPA 049D 0F RRC ;ROTATE THE BYTE 049E 32FD09 STA KEEPA 04A1 DCBB06 CC DISP$CT ;CALL ROUTINE IF BIT IS ON 04A4 3AFF09 LDA KEEPD 04A7 57 MOV D,A 04A8 15 DCR D ;CHECK IF LOOP IS DONE 04A9 C8 RZ 04AA C38804 JMP ROT2 ; CHECK$BITS: 04AD 2A1F0A LHLD PATCH2 ;THIS ROUTINE CHECKS THE 04B0 7C MOV A,H ;PATCH BIT MAP AREA TO SEE 04B1 FE00 CPI 0 ;IF ANY OF THE BYTES HAVE 04B3 C0 RNZ ;A BIT THAT IS ON 04B4 7D MOV A,L 04B5 FE00 CPI 0 04B7 C0 RNZ 04B8 2A1D0A LHLD PATCH1 04BB 7C MOV A,H 04BC FE00 CPI 0 04BE C0 RNZ 04BF 7D MOV A,L 04C0 FE00 CPI 0 04C2 CA1407 JZ NO$PATCHES ;JUMP IF NO BITS ARE ON 04C5 C9 RET ; ;******************************** ;* WRITE ROUTINE ;******************************** WRITE: 04C6 CDD704 CALL CHECK$SAME ;CHECK TO SEE IF THE INPUTED 04C9 3A1A0A LDA HPATCH ;NUMBER BY THE USER 04CC 5F MOV E,A ;ALREADY EXISTS FOR THE FILE 04CD 3A240A LDA VAL 04D0 BB CMP E 04D1 DC6405 CC LESSER 04D4 C30F05 JMP GREATER ; CHECK$SAME: 04D7 3A240A LDA VAL ;THIS ROUTINE TAKES THE INPUTED 04DA 47 MOV B,A ;NUMBER AND COMPARES IT 04DB 1E00 MVI E,0 ;TO AN INCREMENTING NUMBER 04DD 2A1F0A LHLD PATCH2 ;EVERY TIME A BIT IS ON 04E0 7C MOV A,H 04E1 CDF404 CALL ROTATE 04E4 7D MOV A,L 04E5 CDF404 CALL ROTATE 04E8 2A1D0A LHLD PATCH1 04EB 7C MOV A,H 04EC CDF404 CALL ROTATE 04EF 7D MOV A,L 04F0 CDF404 CALL ROTATE 04F3 C9 RET ; ROTATE: 04F4 1608 MVI D,8 ;COUNTER TO ROTATE EIGHT TIMES ROTATE2: 04F6 1C INR E 04F7 0F RRC 04F8 32FD09 STA KEEPA 04FB DC0605 CC COMPARE ;IF BIT IS ON THEN CHECK IF 04FE 3AFD09 LDA KEEPA ;THE COUNTER EQUALS THE INPUTED 0501 15 DCR D ;NUMBER BY THE USER 0502 C2F604 JNZ ROTATE2 0505 C9 RET ; COMPARE: 0506 7B MOV A,E 0507 321A0A STA HPATCH ;STORE THE CURRENT HIGEST PATCH 050A B8 CMP B ;FOUND FOR LATER USE 050B CAE405 JZ ALREADY 050E C9 RET ; GREATER: ;THIS ROUTINE DISPLAYS THE 050F 11DE08 LXI D,INSTL$MESS ;USER'S INPUTED PATCH NUMBER 0512 CD7806 CALL DISP$NUM ;DISPLAY INPUTED NUMBER 0515 118609 LXI D,HAS$MESS 0518 CD3C06 CALL PRINT 051B 11C009 LXI D,BETW$MESS 051E CD3C06 CALL PRINT 0521 CD8D06 CALL DISP$FILE ;DISPLAY THE FILE IN THE 'FCB' 0524 1E20 MVI E,' ' 0526 CD4306 CALL PBYTE2 0529 1E3F MVI E,'?' ;MAKE IT A QUESTION 052B CD4306 CALL PBYTE2 052E 1E20 MVI E,' ' 0530 CD4306 CALL PBYTE2 0533 0E0A MVI C,RSTRING 0535 3E04 MVI A,4 ;LENGTH OF INPUT 0537 32250A STA ANSWER ;BUFFER 053A 11250A LXI D,ANSWER ;PONT 'DE' TO BUFFER 053D CD0500 CALL BDOS ;WAIT FOR INPUT 0540 3A270A LDA ANSWER+2 0543 FE59 CPI 'Y' 0545 CA5005 JZ GREATER2 ;WITH THE PATCH 0548 FE79 CPI 'y' 054A CA5005 JZ GREATER2 054D C37407 JMP QUIT$PTCH GREATER2: 0550 CD7A05 CALL PLC$PATCH ;PLACE THE PATCH IN THE BUFFER 0553 CDF605 CALL WRIT$PTCH ;WRITE THE PATCH INTO THE FILE 0556 0E10 MVI C,CLOSEF 0558 115C00 LXI D,FCB 055B CD0500 CALL BDOS ;CLOSE THE FILE 055E 11C609 LXI D,OK$MESS ;TELL USER THAT THE PATCH 0561 C3CB07 JMP PR$STOP ;IS FINISHED ; LESSER: 0564 115609 LXI D,LESS$MESS ;THIS ROUTINE CAUTIONS THE USER 0567 CD7806 CALL DISP$NUM ;THAT PATCHES GREATER THAN 056A 117709 LXI D,LESS2$MESS 056D CD3C06 CALL PRINT 0570 CD8D06 CALL DISP$FILE ;DISPLAY THE FILE 0573 11F009 LXI D,CR$LF 0576 CD3C06 CALL PRINT 0579 C9 RET ; PLC$PATCH: ;THIS ROUTINE CHECKS TO SEE 057A 3A240A LDA VAL ;WHAT BYTE TO ALTER 057D FE09 CPI 9 057F DAB605 JC BYTE3 ;INPUTED # IS 1-8 ; IF PATCH14 0582 FE19 CPI 25 ELSE CPI 24 ENDIF ;PATCH 14 0584 D28F05 JNC BYTE0 ;INPUTED # IS 25-32 0587 FE11 CPI 17 0589 DAA905 JC BYTE2 ;INPUTED # IS 9-16 058C C39C05 JMP BYTE1 ;INPUTED # IS 17-24 ; BYTE0: ;THIS ROUTINE IS DONE 058F 3A240A LDA VAL ;IF THE INPUT WAS BETWEEN 0592 D619 SUI 25 ;25-32 0594 32290A STA BIT$POS 0597 3E00 MVI A,0 0599 C3C205 JMP TABLE$LOAD ; BYTE1: ;THIS ROUTINE IS DONE 059C 3A240A LDA VAL ;IF THE INPUT WAS BETWEEN 059F D611 SUI 17 ;17-24 05A1 32290A STA BIT$POS 05A4 3E01 MVI A,1 05A6 C3C205 JMP TABLE$LOAD ; BYTE2: ;THIS ROUTINE IS DONE 05A9 3A240A LDA VAL ;IF THE INPUT WAS BETWEEN 05AC D609 SUI 9 ;9-16 05AE 32290A STA BIT$POS 05B1 3E02 MVI A,2 05B3 C3C205 JMP TABLE$LOAD ; BYTE3: ;THIS ROUTINE IS DONE 05B6 3A240A LDA VAL ;IF THE INPUT WAS BETWEEN 05B9 3D DCR A ;1-8 05BA 32290A STA BIT$POS 05BD 3E03 MVI A,3 05BF C3C205 JMP TABLE$LOAD ; TABLE$LOAD: 05C2 322A0A STA BYTE$POS 05C5 21C90A LXI H,BUFF+118 ;PATCH BIT MAP 05C8 0600 MVI B,0 05CA 3A2A0A LDA BYTE$POS ;PATCH AREA 05CD 4F MOV C,A 05CE 09 DAD B ;'HL' = LOCATION TO GET BYTE 05CF 222B0A SHLD PATCH$POS ;PLACE TO GET/PUT PATCH 05D2 21390A LXI H,TABLE 05D5 0600 MVI B,0 05D7 3A290A LDA BIT$POS ;BIT POSITION (0-7) 05DA 4F MOV C,A 05DB 09 DAD B 05DC 46 MOV B,M ;'HL' CONTAINS THE BYTE TO ALTER 05DD 2A2B0A LHLD PATCH$POS 05E0 7E MOV A,M 05E1 B0 ORA B ;TURN THE BIT ON 05E2 77 MOV M,A ;SAVE IT 05E3 C9 RET ; ALREADY: ;THIS ROUTINE TELLS THE USER 05E4 11B209 LXI D,ALREAD$MESS2 ;THAT THE INPUTED PATCH NUMBER 05E7 CD7806 CALL DISP$NUM ;HAS ALREADY BEEN INSTALLED 05EA 119D09 LXI D,ALREAD$MESS 05ED CD3C06 CALL PRINT 05F0 CD8D06 CALL DISP$FILE 05F3 C3D107 JMP STOP ; WRIT$PTCH: ;THIS ROUTINE BRANCHES DEPENDING 05F6 3A180A LDA TYPE ;WHAT TYPE OF FILE TYPE THE FILE 05F9 FE01 CPI 1 ;HAS SO IT CAN WRITE 05FB CA0106 JZ COM$PATCH ;CORRECTLY 05FE C30606 JMP PRL$PATCH ; COM$PATCH: ;TELL THAT THE RECORD POSTION 0601 3E00 MVI A,0 ;IS THE FIRST RECORD 0603 C30B06 JMP WRITE$RAN ; PRL$PATCH: 0606 3E02 MVI A,2 ;TELL THAT THE RECORD POSTION 0608 C30B06 JMP WRITE$RAN ;IS THE THIRD RECORD ; WRITE$RAN: ;THIS ROUTINE WRITES A RECORD 060B 327D00 STA FCB+33 060E 210000 LXI H,00 0611 227E00 SHLD FCB+34 0614 0E22 MVI C,WRITERF ;TO THE FILE IN THE FCB 0616 115C00 LXI D,FCB ;AT THE RECORD POSITION FOUND 0619 CD0500 CALL BDOS ;AT FCB+33 061C FE00 CPI 0 ;AND THE DATA TO BE WRITTEN 061E C8 RZ ;IS FOUND FROM THE BUFF+128(80H) 061F FEFF CPI 255 0621 CABD07 JZ PHYS$ERR ;JUMP IF PHYSICAL ERROR 0624 C37407 JMP QUIT$PTCH ; ;******************************** ;* SUBROUTINES ;******************************** SET$DMA: 0627 11530A LXI D,BUFF ;THIS ROUTINE SET THE DMA SET$DMA2: 062A 0E1A MVI C,DMAF 062C CD0500 CALL BDOS 062F C9 RET ; READ$BUFF: ;THIS ROUTINE READS A BLOCK 0630 0E14 MVI C,READF ;FROM A FILE AND PLACES IT INTO 0632 115C00 LXI D,FCB ;MEMORY 0635 CD0500 CALL BDOS 0638 C9 RET ; PERROR: ;PRINT 'ERROR :' 0639 111A08 LXI D,ERR$MESS ; PRINT: ;THIS ROUTINE PRINTS A STRING 063C 0E09 MVI C,PSTRING ;POINTED BY REGISTERS 'DE' 063E CD0500 CALL BDOS ;UNTIL A '$' IS FOUND 0641 C9 RET ; PBYTE: ;THIS ROUTINE PRINTS THE 0642 5F MOV E,A ;'ASCII' CHARACTER FOUND PBYTE2: ;IN REGISTER 'E' 0643 0E02 MVI C,CONOUT 0645 CD0500 CALL BDOS 0648 C9 RET ; DISPLAYIT: ;THIS ROUTINE DISPLAYS 0649 22000A SHLD KEEPH ;THE INVALID PATCH NUMBER 064C 32FD09 STA KEEPA ;THAT WAS INPUTED 064F 7E MOV A,M 0650 FE20 CPI ' ' 0652 C8 RZ 0653 CD4206 CALL PBYTE 0656 2A000A LHLD KEEPH 0659 3AFD09 LDA KEEPA 065C 23 INX H 065D 3D DCR A 065E C24906 JNZ DISPLAYIT 0661 C8 RZ ; DISPLAYIT2: ;THIS ROUTINE DISPLAYS 0662 22000A SHLD KEEPH ;THE INVALID FILESPEC 0665 32FD09 STA KEEPA ;WHEN AN ERROR OCCURS 0668 5E MOV E,M 0669 CD4306 CALL PBYTE2 066C 2A000A LHLD KEEPH 066F 3AFD09 LDA KEEPA 0672 23 INX H 0673 3D DCR A 0674 C26206 JNZ DISPLAYIT2 0677 C9 RET ; DISP$NUM: 0678 CD3C06 CALL PRINT ;PRINT STRING POINTED EARLIER 067B 2A1B0A LHLD NUMBER 067E 7D MOV A,L 067F CD4206 CALL PBYTE 0682 2A1B0A LHLD NUMBER 0685 7C MOV A,H 0686 FE20 CPI ' ' 0688 C8 RZ 0689 CD4206 CALL PBYTE 068C C9 RET ; DISP$FILE: ;THIS ROUTINE DISPLAYS THE FILE 068D 215D00 LXI H,FCB+1 ;NAME AND SPEC. FOUND IN THE FCB 0690 3E08 MVI A,8 ;(5DHEX) 0692 CD4906 CALL DISPLAYIT 0695 1E2E MVI E,'.' 0697 CD4306 CALL PBYTE2 069A 216500 LXI H,FCB+9 069D 3E03 MVI A,3 069F CD4906 CALL DISPLAYIT 06A2 C9 RET ; DISP$DRV: 06A3 CD3C06 CALL PRINT 06A6 3A5C00 LDA FCB ;GET THE CURRENT LOGGED ON DRIVE 06A9 FE00 CPI 0 ;SEE IF IT IS DRIVE 'A' 06AB CCB906 CZ CHNGDRV ;IF SO CHANGE THE NUMBER 06AE C640 ADI 040H ;MAKE THE NUMBER ASCII 06B0 CD4206 CALL PBYTE ;DISPLAY IT 06B3 1E3A MVI E,':' 06B5 CD4306 CALL PBYTE2 06B8 C9 RET ; CHNGDRV: 06B9 3C INR A ;THIS ROUTINE ADDS 1 TO THE DRIVE 06BA C9 RET ;NUMBER SO IT CAN BE DISPLAYED ; DISP$CT: ;THIS ROUTINE IS CALLED 06BB 3AFE09 LDA KEEPE ;EVERY TIME A BIT IS FOUND 06BE FE0A CPI 10 ;ON IN THE 'READ' ROUTINE 06C0 D2CE06 JNC DISP$CT2 ;AND DISPLAYS THE CURRENT 06C3 C630 ADI 030H ;PATCH ACCORDING TO WHAT 06C5 CD4206 CALL PBYTE ;BIT IS ON 06C8 1E20 MVI E,' ' 06CA CD4306 CALL PBYTE2 06CD C9 RET DISP$CT2: 06CE 3A220A LDA CT ;CURRENT DECIMAL COUNT 06D1 E60F ANI 0FH ;GET RID OF THE HIGH NIBBLE 06D3 32280A STA LOWDIG ;STORE THE LOWER 06D6 3A220A LDA CT 06D9 E6F0 ANI 0F0H ;GET RID OF THE LOW NIBBLE 06DB 0F RRC 06DC 0F RRC 06DD 0F RRC 06DE 0F RRC ;ROTATE FOUR TIMES 06DF C630 ADI 030H ;MAKE IT AN ASCII CHARACTER 06E1 FE30 CPI '0' ;IF CHARACTER =0 THEN SKIP 06E3 CAE906 JZ DISP$CT3 ;THE DISPLAY ROUTINE 06E6 CD4206 CALL PBYTE ;PRINT THE BYTE DISP$CT3: 06E9 3A280A LDA LOWDIG ;GET THE SECOND DIGIT 06EC C630 ADI 030H ;MAKE IT AN ASCII CHARACTER 06EE CD4206 CALL PBYTE 06F1 1E20 MVI E,' ' ;PRINT A SPACE 06F3 CD4306 CALL PBYTE2 06F6 C9 RET ; NO$COM: ;THIS ROUTINE TELLS THE USER 06F7 3A180A LDA TYPE ;THAT THE FILE WAS NOT THE 06FA FE03 CPI 3 ;PROPER FILE TYPE AND DISPLAYS 06FC D8 RC ;THE FILE TYPE THE USER 06FD CD3906 CALL PERROR 0700 113A08 LXI D,NCOM$MESS ;INPUTED 0703 CD3C06 CALL PRINT 0706 216500 LXI H,SPEC 0709 3E03 MVI A,3 070B CD6206 CALL DISPLAYIT2 070E 110409 LXI D,POS$TYPE 0711 C3CB07 JMP PR$STOP ; NO$PATCHES: ;THIS ROUTINE TELLS THE USER 0714 11BB09 LXI D,NONE$MESS ;THAT NO PATCHES HAVE BEEN 0717 C3CB07 JMP PR$STOP ;MADE FOR THE FILE ; WRNG$SER: ;THIS ROUTINE TELLS THE USER 071A CD3906 CALL PERROR 071D 114F08 LXI D,SER$MESS ;THAT THE SERIAL # DOES NOT 0720 C3CB07 JMP PR$STOP ;MATCH ; WRNGVER: ;THIS ROUTINE INFORMS THE USER 0723 CD3906 CALL PERROR ;THAT THE WRONG VERSION OF CP/M 0726 112408 LXI D,VER$MESS ;IS BEING USED 0729 C3CB07 JMP PR$STOP ; WRNG$PASS: ;THIS ROUTINE TELLS THE USER 072C CD3906 CALL PERROR 072F 117008 LXI D,PASS$MESS ;THAT THE INPUTED PASSWORD 0732 CD3C06 CALL PRINT ;WAS FALSE 0735 218200 LXI H,BUF+2 0738 3E08 MVI A,8 073A CD6206 CALL DISPLAYIT2 073D C3D107 JMP STOP ; NO$FILE: ;THIS ROUTINE TELLS THE USER 0740 CD3906 CALL PERROR 0743 116608 LXI D,NF$MESS ;THAT THE FILE WAS NOT FOUND 0746 CD3C06 CALL PRINT ;AND IT GIVES THE NAME OF THE 0749 3A5D00 LDA FCB+1 ;FILE 074C FE20 CPI ' ' 074E CAD107 JZ STOP 0751 CD8D06 CALL DISP$FILE 0754 11A708 LXI D,DRV$MESS 0757 CDA306 CALL DISP$DRV 075A C3D107 JMP STOP ; NOT$NUM: ;THIS ROUTINE TELLS THE USER 075D CD3906 CALL PERROR 0760 118108 LXI D,NONUM$MESS ;THAT THE INPUTED NUMBER TO PATCH 0763 CD3C06 CALL PRINT ;IS ILLEGAL 0766 216D00 LXI H,06DH 0769 3E05 MVI A,5 076B CD4906 CALL DISPLAYIT 076E 112309 LXI D,POS$NUM 0771 C3CB07 JMP PR$STOP ; QUIT$PTCH: ;THIS ROUTINE TELLS THE USER 0774 11D909 LXI D,NOT$PTCHD ;THAT THE PATCH WAS NOT INSTALLED 0777 C3CB07 JMP PR$STOP ; DISK$RO: ;THIS ROUTINE TELLS THE USER 077A 11F009 LXI D,CR$LF ;THAT THE DISK IS READ/ONLY 077D CD3C06 CALL PRINT 0780 CD3906 CALL PERROR 0783 119808 LXI D,DRIVE$MESS 0786 CDA306 CALL DISP$DRV 0789 119F08 LXI D,RO$MESS 078C CD3C06 CALL PRINT 078F C3D107 JMP STOP ; FILE$RO: ;THIS ROUTINE TELLS THE USER THAT 0792 11F009 LXI D,CR$LF ;THE FILE HE/SHE IS TRYING TO 0795 CD3C06 CALL PRINT ;PATCH IS READ/ONLY 0798 CD3906 CALL PERROR 079B CD8D06 CALL DISP$FILE 079E 119F08 LXI D,RO$MESS 07A1 C3CB07 JMP PR$STOP ; BAD$DRIVE: 07A4 CD3906 CALL PERROR 07A7 11AC08 LXI D,BADDRV$MESS 07AA CD3C06 CALL PRINT 07AD 3A5C00 LDA FCB 07B0 C640 ADI 040H 07B2 CD4206 CALL PBYTE 07B5 1E3A MVI E,':' 07B7 CD4306 CALL PBYTE2 07BA C3D107 JMP STOP ; PHYS$ERR: ;THIS ROUTINE TELLS THE USER 07BD 7C MOV A,H ;THAT WHEN PERFORMING THE 07BE FE02 CPI 2 ;WRITE ROUTINE A PERMANENT ERROR 07C0 CA7A07 JZ DISK$RO ;WAS DETECTED 07C3 FE03 CPI 3 07C5 CA9207 JZ FILE$RO 07C8 C37407 JMP QUIT$PTCH ; PR$STOP: 07CB CD3C06 CALL PRINT 07CE C3D107 JMP STOP ; STOP: ;THIS ROUTINE ENDS THE PROGRAM 07D1 11F309 LXI D,CR$LF$LF 07D4 CD3C06 CALL PRINT 07D7 0E00 MVI C,RETURN 07D9 CD0500 CALL BDOS ;RETURN TO CCP ; ;******************************** ;* PROGRAM CALLING ROUTINE ;******************************** BEGIN: 07DC 31510A LXI SP,STACK ;SET STACK TO 'STACK' 07DF CD8301 CALL INIT ;INITIALIZE 07E2 CDAE01 CALL CHECK$FILE ;CHECK IF FILE IN THE FCB 07E5 CD5502 CALL CHECK$SPEC ;CHECK IF .COM INPLIED 07E8 CD7402 CALL CHECK$TYPE ;CHECK FILE TYPE BEGIN2: 07EB CDD903 CALL CHECK$RW ;CHECK IF 'READ' OR 'WRITE' 07EE CD1304 CALL GET$NUM ;GET/CHANGE INPUTED NUMBER 07F1 CDB302 CALL OPEN$FILE ;OPEN THE FILE 07F4 CD7203 CALL CHECK$SER ;CHECK SERIAL NUMBER 07F7 CD0004 CALL BRANCH ;BRANCH TOO READ OR WRITE 07FA CDD107 CALL STOP ;STOP PROGRAM ; ;******************************** ;* CONSOLE MESSAGES TO USER ;******************************** ;* INTRO MESSAGE * 07FD 0D0A43502FINTRO$MESS: DB CR,LF,'CP/M 3 PATCH - Version 3.0$' ;* ERROR MESSAGES * 081A 0D0A455252ERR$MESS: DB CR,LF,'ERROR: $' 0824 5041544348VER$MESS: DB 'PATCH requires CP/M 3$' 083A 496E76616CNCOM$MESS: DB 'Invalid file type: .$' 084F 5365726961SER$MESS: DB 'Serial number mismatch$' 0866 4E6F206669NF$MESS: DB 'No file: $' 0870 46616C7365PASS$MESS: DB 'False password: $' 0881 496E76616CNONUM$MESS: DB 'Invalid patch number: $' 0898 4472697665DRIVE$MESS: DB 'Drive $' 089F 2069732052RO$MESS: DB ' is R/O$' 08A7 206F6E2024DRV$MESS: DB ' on $' 08AC 496C6C6567BADDRV$MESS: DB 'Illegal drive: $' ;* QUESTIONS * 08BC 0D0A456E74FILE$PRMT$MESS: DB CR,LF,'Enter File: $' 08CB 0D0A456E74QUEST: DB CR,LF,'Enter Password: $' 08DE 0D0A446F20INSTL$MESS: DB CR,LF,'Do you want to indicate that patch $' ;* STATUS MESSAGES * 0904 0D0A56616CPOS$TYPE: DB CR,LF,'Valid file types: COM or PRL$' 0923 0D0A56616CPOS$NUM: DB CR,LF,'Valid patch numbers: 1-32$' 093F 0D0A437572CRPATC$MESS: DB CR,LF,'Current patches for $' 0956 0D0A574152LESS$MESS: DB CR,LF,'WARNING: Patches greater than $' 0977 0D0A202065LESS2$MESS: DB CR,LF,' exist for $' 0986 0D0A202068HAS$MESS: DB CR,LF,' has been installed$' 099D 20616C7265ALREAD$MESS: DB ' already exists for $' 09B2 0D0A506174ALREAD$MESS2: DB CR,LF,'Patch $' 09BB 4E6F6E6524NONE$MESS: DB 'None$' 09C0 20666F7220BETW$MESS: DB ' for $' 09C6 0D0A0A5061OK$MESS: DB CR,LF,LF,'Patch installed$' 09D9 0D0A0A5061NOT$PTCHD: DB CR,LF,LF,'Patch not installed$' 09F0 0D0A24 CR$LF: DB CR,LF,'$' 09F3 0D0A0A24 CR$LF$LF: DB CR,LF,LF,'$' 09F7 3A0D0A2020COL$CR$LF$SP: DB ':',CR,LF,' $' ; ;******************************** ;* VARIABLE AND DATA STORAGE AREA ;******************************** 09FD 00 KEEPA: DB 0 ;STORAGE FOR 'ACC' 09FE 00 KEEPE: DB 0 ;STORAGE FOR 'E' 09FF 00 KEEPD: DB 0 ;STORAGE FOR 'D' 0A00 0000 KEEPH: DW 0 ;STORAGE FOR 'HL' 0A02 2020202020FILE$BUFF: DB 32,32,32,32,32,32 ;FILE BUFFER FOR DEFAULT 0A08 2020202020 DB 32,32,32,32,32,32 0A0E 2020202020 DB 32,32,32,32,32,32,32,32 0A16 00 TPASSWD: DB 0 ;'TRIED PASSWORD' FLAG 0A17 00 LEN: DB 0 ;LENGTH OF PASSWORD INPUT 0A18 FF TYPE: DB 255 ;FILE TYPE (.COM,. PRL OR .SPR) 0A19 00 RW: DB 0 ;'READ/WRITE' FLAG 0A1A 00 HPATCH: DB 0 ;HIGHEST PATCH 0A1B 0000 NUMBER: DW 00 ;INPUTED (ASCII) NUMBER 0A1D 0000 PATCH1: DW 00 ;'PATCH' BIT MAP STORAGE AREA 0A1F 0000 PATCH2: DW 00 ;'PATCH' BIT MAP STORAGE AREA 0A21 00 NUM: DB 0 ;THIRD NUMBER OF INPUT BY USER 0A22 00 CT: DB 0 ;ACTUAL 'PATCHES' AFTER ROTATE (DEC) 0A23 00 NUMTWO: DB 0 ;INPUT # -30H 0A24 00 VAL: DB 0 ;ACTUAL INPUT VALUE AFTER MULTIPLY 0A25 ANSWER: DS 3 ;STORAGE FOR INPUT TO QUESTION 0A28 LOWDIG: DS 1 ;STORAGE FOR LOWER DIGIT TO DISPLAY 0A29 00 BIT$POS: DB 0 ;POSITION OF BIT (0-7) 0A2A 00 BYTE$POS: DB 0 ;POSTION OF BYTE (0-3) 0A2B 0000 PATCH$POS: DW 0 ;HOLDS ADDRESS OF PATCH BYTE 0A2D 434F4D COM$TABLE: DB 'COM' ;THESE TABLES ARE USED TO 0A30 50524C PRL$TABLE: DB 'PRL' ; COMPARE FILE TYPES IN ; IF PATCH4 0A33 3135313238SER$TABLE: DB '151282' ;THIS TABLE IS FOR SERIAL CHECKER ELSE SER$TABLE: DB '654321' ;THIS TABLE IS FOR SERIAL CHECKER ENDIF ;PATCH 4 ; 0A39 0102040810TABLE: DB 1,2,4,8,16,32,64,128 ;THIS TABLE IS FOR BIT MANIPULATION 0A41 DS 16 ;STACK AREA STACK: 0A51 DS 2 0A53 BUFF: DS 128 ;BUFFER (HOLDS ONE RECORD;128 BYTES)