ORG 0x7e00 ;EXE-file header: DW 5845h ; EXE Signature DB 45h ; Reserved (EXE type) DB 00h ; Version of EXE file DW 0200h ; Code offset DW 0000h DW 0000h ; Primary loader size or 0 (no primary loader) DW 0000h ; Reserved DW 0000h ; Reserved DW 0000h ; Reserved DW start ; Loading address DW start ; Starting address (register PC) DW 0BFFFh ; Stack address (register SP) DS 490 ; Reserved ;code of program start: LD A,81h ;используем режим 320х256 LD BC,0050h ;B - номер видео страницы C - функция SETVMOD RST 10h ;установить видео режим JP C,VMError ;если ошибка флаг C установлен IN A,(0e2h) ;читаем номер страницы установленной в 3 окно ЦП LD (OldPage),A ;сохраняем в ячейку памяти LD A,50h ;номер страницы видео памяти OUT (0e2h),A ;устанавливаем его в 3 окно ЦП LD IX,rndSeed LD BC,0DFBDh LD A,0 OUT (C),A getSec: LD BC,0FFBDh IN A,(C) AND A JR Z,getSec SLA A SLA A LD (IX),A LD B,0FFh LD HL,buffStars initStLoop1: CALL rndNumber LD (HL),A INC HL DJNZ initStLoop1 LD IX,buffStars LD IY,scrollSin mainLoop: DI LD A,15 LD (color),A CALL printStars EI HALT XOR A LD (color),A CALL printStars CALL scrollStars LD A,(IY) AND A CALL Z,initMove LD B,A moveLoop: PUSH BC CALL moveStarsUp initMoveStars: EQU $-2 POP BC DJNZ moveLoop INC IY LD C,31h ; test keypress RST 10h JR Z,mainLoop CP 1Bh ; ESC is pressed? JR NZ,mainLoop LD A,(OldPage) ;восстанавливаем предыдущую страницу OUT (0e2h),A ;устанавливаем ее в 3 окно ЦП LD A,03h ;текстовый режим LD BC,0050h ;первая страница, функция SETVMOD RST 10h ;устанавливаем exit: LD BC,0041h ;функция EXIT корректный выход в DOS RST 10h RET ;вызываем VMError: LD HL,ErrMess ;сообщение об ошибки LD BC,005ch ;выводим RST 10h JR exit printStars: PUSH IX XOR A LD B,0FFh printStLoop: LD HL,color LD D,0C0h LD E,(IX) OUT (89h),A PUSH BC LDI POP BC INC A INC IX DJNZ printStLoop POP IX RET scrollStars: PUSH IX PUSH HL LD B,0FFh/3 scrollStLoop: LD HL,initSpeed LD A,(IX) ADD A,(HL) LD (IX),A INC IX INC HL LD A,(IX) ADD A,(HL) LD (IX),A INC IX INC HL LD A,(IX) ADD A,(HL) LD (IX),A INC IX DJNZ scrollStLoop POP HL POP IX RET moveStarsUp: LD HL,buffStars+1 LD DE,buffStars LD A,(DE) LD BC,0FEh LDIR LD (DE),A LD HL,initSpeed+1 LD DE,initSpeed LD A,(DE) LD BC,2 LDIR LD (DE),A RET moveStarsDown: LD HL,buffStars+0FEh LD DE,buffStars+0FFh LD A,(buffStars+0FFh) LD BC,0FFh LDDR LD (buffStars),A LD HL,initSpeed+1 LD DE,initSpeed+2 LD A,(initSpeed+2) LD BC,3 LDDR LD (initSpeed),A RET initMove: LD A,(flMove) AND A JR Z,moveUp LD IY,moveStarsUp XOR A LD (flMove),A LD (initMoveStars),IY JR endInitMove moveUp: LD IY,moveStarsDown LD A,1 LD (flMove),A LD (initMoveStars),IY endInitMove: LD IY,scrollSin LD A,(IY) RET rndNumber: LD IX,rndSeed LD D,(IX) LD A,(IX+2) LD (IX+3),A LD A,(IX+1) LD (IX+2),A LD (IX+1),D LD A,(IX+3) LD E,A SLA A SLA A SLA A XOR E LD E,A SRL A SRL A SRL A SRL A SRL A XOR E LD E,A SRL D SRL D SRL D SRL D SRL D LD A,D XOR D XOR E LD (IX),A RET ErrMess: DB "Error set video mode!",0dh,0ah,00h OldPage: DB 00h color: DB 15 initSpeed: DB 1,2,3 flMove DB 0 rndSeed: DB 18,43,3,73 scrollSin: DB 1,1,1,1,1,2,1,2,1,2,2,2,2,3,2,2,3,3,2,3,3,3,3,3,3,3,3,3,3 DB 3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,3,2,2,2,2,1,2,1,2,1,1,1,1,1,0 buffStars: DS 256