From f37cbd10774f3d7b22be65485a39d751132564a3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 12 Dec 2023 04:24:00 +1000 Subject: [PATCH] =?UTF-8?q?SHELL:=20***=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20BAT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Console/CONSOLE.ASM | 2584 ------------- Console/Errors.TXT | 66 - Console/HISTORY.TXT | 4 - Console/build.txt | 1 - Console/version.inc | 22 - DOS/CURSOR.ASM | 63 - DOS/DOS.ASM | 7527 -------------------------------------- DOS/DOS.INC | 91 - DOS/KEYB.ASM | 1003 ----- DOS/MOUSE.ASM | 874 ----- DOS/README.RUS | 22 - DOS/pr.bat | 12 - DOS/readme.! | 1 - DSS/DOS_FM.ASM | 1 - DSS/EXECUTE.ASM | 48 +- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 121 +- SHELL/Commands/BREAK.ASM | 8 + SHELL/Commands/EXIT.ASM | 2 +- SHELL/Commands/REM.ASM | 3 +- SHELL/EXEC.ASM | 6 +- SHELL/SHELL.ASM | 23 +- SHELL/build.txt | 2 +- 23 files changed, 161 insertions(+), 12325 deletions(-) delete mode 100644 Console/CONSOLE.ASM delete mode 100644 Console/Errors.TXT delete mode 100644 Console/HISTORY.TXT delete mode 100644 Console/build.txt delete mode 100644 Console/version.inc delete mode 100755 DOS/CURSOR.ASM delete mode 100755 DOS/DOS.ASM delete mode 100755 DOS/DOS.INC delete mode 100755 DOS/KEYB.ASM delete mode 100755 DOS/MOUSE.ASM delete mode 100755 DOS/README.RUS delete mode 100755 DOS/pr.bat delete mode 100755 DOS/readme.! create mode 100644 SHELL/Commands/BREAK.ASM diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM deleted file mode 100644 index 6fd72fc..0000000 --- a/Console/CONSOLE.ASM +++ /dev/null @@ -1,2584 +0,0 @@ - -;[BEGIN] -; -; SYSTEM.EXE /S /P -; -; /P Primary command processor -; /S Secondary command processor -; /C Execute batch file - -;=====================================================================[] -;Rev. Date Name Description -;---------------------------------------------------------------------[] -;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION -;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти -;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений -;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP -;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET -;R07 14-12-2002 DNS PARSING BATCH LINE -;R06 12-12-2002 DNS ADD %0, %1, %2 ... -;R05 11-12-2002 DNS IMPLEMENTED %VAR% -;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE -;R03 11-12-2002 DNS NEW VERSION -;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES -;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO -;=====================================================================[] - - includelua 'Shared_includes/lua/Functions.lua' - include 'shared_includes/constants/bios_equ.inc' - include 'shared_includes/constants/dss_equ.inc' - include 'console/version.inc' - -; -; Standart EQU section -;---------------------------------------------------------------------[] -org_addr EQU #8000 + CLP_Buffer -code_addr EQU START -stack_point EQU #BFFF -stack_buffer EQU 64 -program_start EQU START -Loader_length EQU 0 -;---------------------------------------------------------------------[] -; - -; -; Program EQU section -;---------------------------------------------------------------------[] -CR EQU 13 -LF EQU 10 -;---------------------------------------------------------------------[] -; - OUTPUT './Build/system.exe' - include 'Shared_includes/constants/EXE_Header.z80' - ORG org_addr - -START: - LD HL,WORK_BUFFERS - LD DE,WORK_BUFFERS+1 - LD BC,BUFFERS_STRUCT-1 - LD (HL),0 - LDIR - - ;INIT - LD A,(IX-1) - LD (TASKX),A - PUSH IX - ;CALL CRLF - CALL GETPATH - POP IX - ; - - CALL GET_CMD - EI - LD A,(RUNMODE) - AND #80 ;TEST PRIMARY - JP NZ,FPRIMAR - LD A,(RUNMODE) - AND #20 ;TEST SECONDARY - JP NZ,FSECOND - LD A,(RUNMODE) - AND #10 ;TEST BATCH FILE - JP NZ,FBATCHS - LD A,(RUNMODE) - AND #40 ;TEST PROCESS - JP NZ,FBATCH - JP QUIT - -FSECOND CALL VERS - JP CONSOLE - -FBATCHS - LD HL,CMDLINE - CALL BATCH - JP QUIT - -FBATCH - CALL CMDMODE - JP QUIT - -FPRIMAR LD C,Dss.CTRLKey - RST ToDSS - LD A,B - AND #C0 - JP NZ,CONSOLE - LD HL,BATNAME - CALL BATCH - JP CONSOLE - -;R07 -MAKE_BATCH_PRM_ARRAY: - DEC HL -B_SKIP_SPACE - INC HL - LD A,(HL) - OR A - RET Z - CP " " - JR Z,B_SKIP_SPACE - CP 9 - JR Z,B_SKIP_SPACE - EX DE,HL - LD (HL),E - INC HL - LD (HL),D - INC HL - EX DE,HL -B_FIND_SPACE: - INC HL - LD A,(HL) - CP " "+1 - JR NC,B_FIND_SPACE - LD (HL),0 - OR A - RET Z - DJNZ B_SKIP_SPACE - RET - - -BATCH: PUSH HL - LD DE,PRMLINE -BCHL1 LD A,(HL) - LDI - OR A - JR NZ,BCHL1 - LD HL,PRMLINE - LD DE,BAT_PRM_ARRAY - LD B,10 - CALL MAKE_BATCH_PRM_ARRAY - JR NZ,B_ALL_P - LD HL,NULL - EX DE,HL -B_CLR_P LD (HL),E - INC HL - LD (HL),D - INC HL - DJNZ B_CLR_P - EX DE,HL -B_ALL_P POP HL -;R07 - XOR A - LD C,Dss.Open - RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 - RET C - LD (BAT_FM),A - CALL NEWLINE - XOR A - RET - -Restore_Screen: - PUSH AF - LD C,Dss.GetVMod - RST ToDSS - AND #80 - JR Z,.exit - LD BC,1 * 256 + Dss.SetVMod - LD A,Dss.SetVMod.txt80x32 - RST ToDSS -.exit: POP AF - RET - -NEWLINE LD DE,CMDLINE -ADDBAT PUSH DE - CALL READBAT - POP DE - OR A - JR NZ,BATLINE - EX DE,HL - LD DE,CMDLINE - ;AND A - SBC HL,DE - JR Z,.exit - LD A,L - LD (CMDLINE-1),A - CALL CMDMODE -.exit: LD A,(BAT_FM) - LD C,Dss.Close - RST ToDSS - RET - -BATLINE LD HL,BATBUFF -NBLINE CALL MOVWORD - JP C,ADDBAT - LD A,B - LD (BAT_LEN),A - PUSH HL - EX DE,HL - LD DE,CMDLINE - AND A - SBC HL,DE - LD A,L - LD (CMDLINE-1),A - CALL CMDMODE - LD DE,CMDLINE - POP HL - JP NBLINE -MOVWORD: LD A,(BAT_LEN) - LD B,A -.loop: LD A,(HL) - LD (DE),A - CP ' ' - INC HL - JR C,.loop2 - INC DE - DJNZ .loop - SCF - RET -.loop2: LD A,(HL) - CP ' ' - RET NC - INC HL - DJNZ .loop2 - ;R08 - PUSH DE - CALL READBAT - POP DE - LD HL,BATBUFF - LD A,(BAT_LEN) - LD B,A - OR A - JR NZ,.loop2 - SCF - ;R08 - RET - -READBAT LD HL,BATBUFF - LD DE,128 - LD C,Dss.Read - LD A,(BAT_FM) - RST ToDSS - LD A,E - LD (BAT_LEN),A - RET - -CMDMODE: XOR A - LD (POSIT),A - CALL EVALCMD ;R05 - LD IX,CMDLINE-2 - LD HL,CMDLINE - LD A,(HL) - CP "@" - JR NZ,NOALPHA - DEC HL - DEC (HL) - JR Z,NOEC - LD C,(HL) - INC HL - LD B,0 - LD D,H - LD E,L - INC HL - LDIR - JR NOEC -NOALPHA LD A,(ECHOFLG) - OR A - JR NZ,NOEC - LD DE,CMDLINE - CALL PRINT_S - CALL CRLF - LD A,(CMDLINE-1) - OR A - RET Z - CALL CRLF - CALL COMPBAT - RET - -NOEC LD A,(CMDLINE-1) - OR A - RET Z - CALL COMPBAT - RET - -COMPBAT LD HL,CMDLINE - DEC HL - LD C,(HL) - LD B,0 - INC HL -COMP00B LD A,(HL) - CP " " - JR NZ,COMP01B - INC HL - DEC C - JR NZ,COMP00B - RET -COMP01B LD D,H - LD E,L - ADD HL,BC - LD (HL),0 - SBC HL,BC - LD A,C - EX AF,AF' - LD A,#20 - CPIR - JR NZ,COMPB05 - INC C -COMPB05 EX AF,AF' - SUB C - LD C,A - LD HL,BATLIST - JP COMP004 - -CONSOLE: - CALL CRLF -RE_: CALL GETXY - CALL GETPATH -; CALL VERS - ;!TEST - LD HL,CMDLINE-1 - LD DE,CMDLINE - - LD (HL),0 - LD BC,#7F ;!HARDCODE длина CMDLINE - LDIR - CALL INPUT - CALL CRLF - LD A,(CMDLINE-1) - OR A - JP Z,RE_ - CALL CRLF - CALL COMP - JP RE_ - -GETXY LD C,Dss.Cursor - RST ToDSS - JP LOCAT - -INPUT: XOR A - LD (POSIT),A - LD (PRINT_S.SHIFT),A - LD (LEN_NEW),A - LD IX,CMDLINE-2 - CALL CEDIT - CALL RES_CUR ;!FIXIT scroll починить, тут тоже влияет вроде - RET - -COMP: CALL EVALCMD ;R05 - LD HL,CMDLINE - DEC HL - LD C,(HL) - LD B,0 - INC HL -COMP00 LD A,(HL) - CP " " - JR NZ,COMP01 - INC HL - DEC C - JR NZ,COMP00 - RET -COMP01 LD D,H - LD E,L - ADD HL,BC - LD (HL),0 - SBC HL,BC - LD A,C - EX AF,AF' - LD A,#20 - CPIR - JR NZ,COMP005 - INC C -COMP005 EX AF,AF' - SUB C - LD C,A - LD HL,CMDLIST -COMP004 PUSH BC - PUSH DE -COMP000 LD A,(DE) - CP 'a' - JP C,COMP001 - CP '{' - JP NC,COMP001 - SUB #20 -COMP001 CP (HL) - JP NZ,COMP002 - INC HL - INC DE - DEC C - JP NZ,COMP000 - XOR A - CP (HL) - JP NZ,COMP002 - POP BC - POP BC - LD A,(DE) - CP " " - JR NZ,NOSPC - INC DE -NOSPC INC HL - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - JP (HL) - -COMP002 XOR A - ;!TEST - ;LD C,#FF - LD C,A - CPIR -;.loop: CPI - ;JP NZ,.loop - ; - - INC HL - INC HL - POP DE - POP BC - LD A,(HL) - OR A - JP NZ,COMP004 - LD H,D ;CMDLINE - LD L,E - LD B,(HL) - INC HL - LD C,(HL) - INC HL - LD A,(HL) - OR A - JR NZ,RUN_EXT - LD A,":" - CP C - JR NZ,RUN_EXT - LD A,B - CP "a" - JR C,NOUP - CP "{" - JR NC,NOUP - AND #5F -NOUP SUB "A" - LD C,Dss.ChDisk - RST ToDSS - JP C,ERROR - JP GETPATH - -SAVEHL DW 0 - -RUN_EXT EX DE,HL - LD (SAVEHL),HL - LD BC,Dss.EX_Path.GET_TYPE*256 + Dss.EX_Path - LD DE,EXTBF - RST ToDSS - LD HL,(SAVEHL) - JR C,RUN_EXE - BIT 1,A - JR Z,NON_EXT - LD DE,EXTBF - LD HL,BATBF - LD B,3 - CALL COMPARE - LD HL,(SAVEHL) - JR Z,RUN_BAT - JP RUN_EXE - -NON_EXT LD BC,0*256+Dss.Exec - RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 - RET NC - LD HL,(SAVEHL) - CP 3 - JP NZ,EXEERR - PUSH HL - LD A,(CMDLINE-1) - LD B,A -EXF000 LD A,(HL) - CP "!" - JR C,EXF001 - INC HL - DJNZ EXF000 - -EXF001 - LD E,B - LD D,0 - ADD HL,DE - PUSH HL - LD E,4 - ADD HL,DE - POP DE - EX DE,HL - LD C,B - LD B,0 - INC C - LDDR - INC HL - LD (HL),"." - INC HL - LD (HL),"B" - INC HL - LD (HL),"A" - INC HL - LD (HL),"T" -; LD HL,(SAVEHL) - POP HL - JP RUN_BAT - -RUN_EXE: - LD BC,0*256 + Dss.Exec - RST ToDSS - ;R10 - CALL Restore_Screen - ;R10 - RET NC -EXEERR CP 5 - JP NC,ERROR - LD DE,0 ;BAD COMMAND OR FILENAME - JP ERR_MSG - -RUN_BAT CALL BATCH - JP C,EXEERR - RET - -; !! Не делать одну команду > 256 символов)) !! -BATLIST: DZ 'PAUSE' : DW CPAUSE - DZ 'REM' : DW CREM -CMDLIST: DZ 'CD' : DW CCHDIR - DZ 'DIR' : DW DIR - DZ 'ECHO' : DW CECHO - DZ 'PATH' : DW CPATH - DZ 'MD' : DW CMKDIR - DZ 'REN' : DW CRENAM - DZ 'DEL' : DW CDELET - DZ 'RD' : DW CRMDIR - DZ 'SET' : DW CSET - DZ 'TIME' : DW CTIME - DZ 'DATE' : DW CDATE - DZ 'VER' : DW VERS - DZ 'CLS' : DW CLS - DZ 'CHDIR' : DW CCHDIR - DZ 'MKDIR' : DW CMKDIR - DZ 'RENAME' : DW CRENAM - DZ 'ERASE' : DW CDELET - DZ 'RMDIR' : DW CRMDIR - DZ 'EXIT' : DW CEXIT - DZ 'HELP' : DW HELP - DZ 'VERSION' : DW VERS - DZ 'REBOOT' : DW REBOOT - DB #00 - -CLS LD DE,#0000 - LD HL,#2050 - LD BC,7*256+Dss.Clear - LD A," " - RST ToDSS - LD DE,#0000 - JP LOCAT - -CRLF LD A,#0D - CALL PRINTX - LD A,#0A - JP PRINTX - -CDATE EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD DE,DTA - LD A,(DE) - OR A - JR Z,NOSETD - CALL STR2DEC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,31 - CP L - JR C,ILLEG - LD B,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,12 - CP L - JR C,ILLEG - LD C,L - PUSH BC - CALL STR2DEC - PUSH HL - LD C,Dss.SysTime - RST ToDSS - POP IX - POP DE - LD C,Dss.SetTime - RST ToDSS -NOSETD LD C,Dss.SysTime - RST ToDSS - PUSH IX - PUSH DE - LD A,D - LD HL,PRM1 - CALL PUTB - LD A,"-" - LD (HL),A - INC HL - POP DE - LD A,E - CALL PUTB - LD A,"-" - LD (HL),A - INC HL - PUSH HL - POP IX - POP HL - CALL PDIGIT - LD DE,DATEMSG - JP MESSAGE - -ILLEG LD DE,ILLGMSG - CALL MESSAGE - RET - -CTIME EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD DE,DTA - LD A,(DE) - OR A - JR Z,NOSETT - CALL STR2DEC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,23 - CP L - JR C,ILLEG - LD B,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,59 - CP L - JR C,ILLEG - LD C,L - PUSH BC - CALL STR2DEC - POP BC - JR C,ILLEG - XOR A - CP H - JR NZ,ILLEG - LD A,59 - CP L - JR C,ILLEG - PUSH BC - LD A,L - PUSH AF - LD C,Dss.SysTime - RST ToDSS - POP BC - POP HL - LD C,Dss.SetTime - RST ToDSS -NOSETT LD C,Dss.SysTime - RST ToDSS - PUSH BC - PUSH HL - LD A,H - LD HL,PRM1 - CALL PUTB - LD A,":" - LD (HL),A - INC HL - POP DE - LD A,E - CALL PUTB - LD A,":" - LD (HL),A - INC HL - POP AF - CALL PUTB - XOR A - LD (HL),A - LD DE,TIMEMSG - JP MESSAGE - -CPAUSE LD DE,PAUSMSG - CALL MESSAGE - LD C,Dss.WaitKey - RST ToDSS - RET - - - -PATHSTR DB "PATH=",0 - -CPATH LD A,(DE) - OR A - JP Z,PRNEPATH - INC DE - CP 9 ; Tab - JR Z,CPATH - CP "!" - JR C,CPATH - DEC DE - EX DE,HL - DEC HL - LD (HL),"=" - DEC HL - LD (HL),"H" - DEC HL - LD (HL),"T" - DEC HL - LD (HL),"A" - DEC HL - LD (HL),"P" - LD BC,2*256+Dss.Environ - RST ToDSS - CALL C,ERROR - RET -PRNEPATH - LD DE,DTA - LD HL,PATHSTR - LD BC,1*256+Dss.Environ - RST ToDSS - JP C,ERROR - LD HL,PATHSTR - LD C,Dss.PChars - RST ToDSS - LD HL,DTA - LD C,Dss.PChars - RST ToDSS - CALL CRLF - RET - - -CSET LD A,(DE) - OR A - JP Z,PRNENVIR - INC DE ;R08 - CP 9 ;R08 - JR Z,CSET ;R08 - CP "!" ;R08 - JR C,CSET ;R08 - DEC DE ;R08 - EX DE,HL - LD BC,2*256+Dss.Environ - RST ToDSS - CALL C,ERROR - RET - -PRNENVIR - LD HL,DTA - LD BC,0*256+Dss.Environ - RST ToDSS - LD HL,DTA -PRNENVX LD C,Dss.PChars - RST ToDSS - LD A,CR - LD C,Dss.PutChar - RST ToDSS - LD A,LF - LD C,Dss.PutChar - RST ToDSS - LD A,(HL) - OR A - JR NZ,PRNENVX - RET - - -CECHO EX DE,HL - LD A,(HL) - OR A - JR Z,ECHO_F - EX DE,HL - PUSH DE - LD B,3 - LD HL,ECHOON - CALL COMPARE - POP DE - JR Z,ECHO_FS - PUSH DE - LD B,4 - LD HL,ECHOOFF - CALL COMPARE - POP HL - JR Z,ECHO_FR - -;R03 REMOVE R01 - - LD C,Dss.PChars - RST ToDSS - JP CRLF - -ECHO_F LD A,(ECHOFLG) - OR A - LD DE,ON__MSG - JR Z,ECHON - LD DE,OFF_MSG -ECHON CALL FMESAGE - LD DE,PRM1 - CALL PUTPRM - LD DE,ECHOMSG - CALL MESSAGE - RET - -ECHO_FS XOR A - LD (ECHOFLG),A - RET - -ECHO_FR LD A,#FF - LD (ECHOFLG),A - RET - -;R04 - -EVALCMD: - XOR A - LD HL,CMDLINE-1 - LD C,(HL) - LD B,A - INC HL - ADD HL,BC - LD (HL),A - SBC HL,BC - LD DE,TMPLINE - CALL EVALSTR - LD HL,TMPLINE - LD DE,CMDLINE - LD BC,#00FF -MOVLBAK LD A,(HL) - LDI - INC B - OR A - JR NZ,MOVLBAK - DEC B - LD A,B - LD (CMDLINE-1),A - AND A - RET - -; HL - STRING WITH %VAR% -EVALSTR -;R04 LD DE,DTA -;VARLOOP - LD A,(HL) - CP "%" - JR Z,TVARIABLE -VARL1 LDI - OR A - JR NZ,EVALSTR - LD BC,0 - LD (TVAR_PNT),BC -;R04 LD HL,DTA -;R04 - RET - -IZERO DB "ZERO",0 -IONE DB "ONE",0 -ITWO DB "TWO",0 -ITHREE DB "THREE",0 -IFOUR DB "FOUR",0 -IFIVE DB "FIVE",0 -ISIX DB "SIX",0 -ISEVEN DB "SEVEN",0 -IEIGHT DB "EIGHT",0 -ININE DB "NINE",0 - -;R06 -BAT_PRM_ARRAY: - DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE - DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -;R06 -NULL DB 0 ;R07 - -;R01 -TVAR_PNT - DW 0 - -TVARIABLE - LD BC,(TVAR_PNT) - LD A,B - OR C - LD A,"%" - LD (TVAR_PNT),DE - JR NZ,TVAR1 ;R06 - INC HL ;R06 - LD A,(HL) ;R06 - CP "9"+1 ;R06 - JR C,TVAR0 ;R06 -TVAR2 LD A,"%" ;R06 > "9" - DEC HL ;R06 - JP VARL1 ;R06 -TVAR0 CP "0" ;R06 - JR C,TVAR2 ;R06 < "0" -; BATCH PARAM %0, %1, %2 ... - INC HL ;R06 - PUSH HL - LD (TVAR_PNT),BC - SUB "0" - ADD A,A - LD C,A - LD HL,BAT_PRM_ARRAY - ADD HL,BC - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - OR H - JR Z,NOBTP ;NO BATCH PARM -MVBTP LD A,(HL) - LDI - OR A - JR NZ,MVBTP - DEC DE -NOBTP POP HL - JP EVALSTR ;R06 -;R06 - -TVAR1 PUSH HL - LD H,D - LD L,E - DEC HL - AND A - SBC HL,BC - JR Z,TNOVAR - LD A,"=" - LD (DE),A - INC DE - XOR A - LD (DE),A - LD D,B - LD E,C - LD H,B - LD L,C - INC HL - LD BC,1*256+Dss.Environ - RST ToDSS -TNOVAR POP HL - INC HL - LD BC,0 - LD (TVAR_PNT),BC - JP EVALSTR -;R01 - -COMPARE LD A,(DE) - CP #61 - JP C,COM001 - CP #7B - JP NC,COM001 - SUB #20 -COM001 CP (HL) - RET NZ - INC HL - INC DE - DJNZ COMPARE - RET - -CREM RET - -CCHDIR: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - XOR A - LD HL,DTA - CP (HL) - JR NZ,YP - LD (HL),"." - INC HL - LD (HL),"." - INC HL - LD (HL),0 - DEC HL - DEC HL -YP: LD C,Dss.ChDir - RST ToDSS - CALL C,ERROR - CALL GETPATH - RET - -CMKDIR EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - LD C,Dss.MkDir - RST ToDSS - CALL C,ERROR - RET - -CRMDIR: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - LD C,Dss.RmDir - RST ToDSS - CALL C,ERROR - RET - -CDELET: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - LD C,Dss.Delete - RST ToDSS - CALL C,ERROR - RET - -CRENAM: EX DE,HL - LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - ;LD DE,DTA+128 - LD DE,DTA_2 - LD C,Dss.GSwitch - RST ToDSS - LD HL,DTA - ;LD DE,DTA+128 - LD DE,DTA_2 - LD C,Dss.Rename - RST ToDSS - CALL C,ERROR - RET - -ERROR: LD E,A - LD D,0 - JP ERR_MSG - -DIR: LD HL,0 - LD (DIRNEX.files),HL - LD (S_LOW),HL - LD (S_HIGH),HL - EX DE,HL - LD A,(HL) - OR A - JR NZ,YPS - LD HL,ALLFS -YPS: LD DE,DTA - LD C,Dss.GSwitch - RST ToDSS - - LD HL,DTA - LD DE,DTA - LD A,#37 - LD BC,0*256+Dss.F_First - RST ToDSS - JP C,ERROR - - LD A,(PATHF) - LD HL,PRM1 - LD (HL),A - INC HL - LD (HL),":" - INC HL - LD (HL),0 - - LD HL,SER_NUM - LD DE,PRM2 - CALL PUTPRM - CALL GETPATH - LD HL,PATHF - LD DE,PRM3 - CALL PUTPRM - //call copy_string ; скопир. строку (с нулем) - - LD DE,DIR1MSG - CALL MESSAGE -; CALL CRLF -; CALL CRLF -DIRNEX: LD HL,DTA - LD DE,33 - ADD HL,DE - CALL PNAME - LD IX,DTA - LD A,(IX+32) - AND #10 - JP NZ,NODADD - ;LD HL,(FILES) -.files+1: LD HL,0 ;!TODO протестить какая процедура использующая эту переменную чаще вызывается и воткнуть переменную туда - INC HL - LD (DIRNEX.files),HL - LD E,(IX+30) - LD D,(IX+31) - LD HL,(S_HIGH) - EXX - LD E,(IX+28) - LD D,(IX+29) - LD HL,(S_LOW) - - - CALL ADDXXX - LD (S_LOW),HL - EXX - LD (S_HIGH),HL -NODADD: LD DE,DTA - LD C,Dss.F_Next - RST ToDSS - JR NC,DIRNEX - ;CALL ORDERS - ;RET -ORDERS: LD HL,(DIRNEX.files) - LD IX,PRM1 - CALL PDIGIT - LD HL,(S_LOW) - EXX - LD HL,(S_HIGH) - EXX - CALL MAKE_LN - LD HL,L32BIT_+9 - LD A,(HL) - CP #20 - JR NZ,ALR2 - LD A,#30 - LD (HL),A -ALR2: LD DE,SIZEBFF - LD HL,L32BIT_;; +1 - LD A,(HL) - LDI - CP " " - JR Z,NOPO1 - LD A,"." -NOPO1: LD (DE),A - INC DE - LDI - LDI - LD A,(HL) - LDI - CP " " - JR Z,NOPO2 - LD A,"." -NOPO2: LD (DE),A - INC DE - LDI - LDI - LD A,(HL) - LDI - CP " " - JR Z,NOPO3 - LD A,"." -NOPO3: LD (DE),A - INC DE - LDI - LDI - LDI - LD HL,SIZEBFF - LD DE,PRM2 - CALL PUTPRM - LD DE,DIR2MSG - JP MESSAGE - -;HL':HL + DE':DE -ADDXXX: ADD HL,DE - EXX - ADC HL,DE - EXX - RET - -;FILES: DW 0 - -S_LOW: DW 0 ;!FIXIT в команду -S_HIGH: DW 0 ;!FIXIT в команду - - -;12345678 123 1 234 567 890 " -; SIZE - -PNAME: LD BC,8 - LD DE,PRM1 - LDIR - XOR A - LD (DE),A - LD DE,PRM2 - LDI - LDI - LDI - LD (DE),A - LD IX,DTA - CALL PRNSIZE - CALL PRNDATE - CALL PRNTIME - LD DE,DIR3MSG - JP MESSAGE - -;!TODO -PRINTB: - ; LD A,(HL) - ; PUSH BC - ; CALL PRINTX - ; POP BC - ; INC HL - ; DJNZ PRINTB - ; RET -;------------------ - -PUTB LD C,#2F -.PUTB1 INC C - SUB 10 - JP NC,.PUTB1 - ADD A,10 - ADD A,#30 - PUSH AF - LD A,C - LD (HL),A - INC HL - POP AF - LD (HL),A - INC HL - RET - -;!TODO -PRNB: -; LD C,#2F -; .PRNB1 INC C -; SUB 10 -; JP NC,.PRNB1 -; ADD A,10 -; ADD A,#30 -; PUSH AF -; LD A,C -; CALL PRINTX -; POP AF -; JP PRINTX - -STR2DEC: LD HL,0 -.LOOP: LD A,(DE) - INC DE - OR A - RET Z - CP "-" - RET Z - CP ":" - RET Z - LD B,H - LD C,L - ADD HL,HL - ADD HL,HL - ADD HL,BC - ADD HL,HL - CALL ATODEC - RET C - ADD A,L - LD L,A - JR NC,.LOOP - INC H - JR .LOOP - -ATODEC CP "0" - RET C - CP ":" - CCF - RET C - SUB "0" - RET - -PDIGIT LD DE,10000 - LD A,#C8 - LD (RET_Z),A - CALL DIG - LD DE,1000 - CALL DIG - LD DE,100 - CALL DIG - LD DE,10 - CALL DIG - LD A,L - ADD A,"0" ;#30 - - ;!TEST - ;LD (IX+0),A - ;INC IX - ;LD (IX+0),0 - LD (IX+0),A - LD (IX+1),0 - ; - RET - -DIG: XOR A -.DIG1: INC A - SBC HL,DE - JR NC,.DIG1 - ADD HL,DE - DEC A -RET_Z: RET Z - ADD A,#30 - LD (IX+0),A - INC IX - XOR A - LD (RET_Z),A - RET - -PRNSIZE: LD A,(IX+32) - LD HL,DIRIDD - AND #10 - JP NZ,.PRZ - LD L,(IX+28) - LD H,(IX+29) - EXX - LD L,(IX+30) - LD H,(IX+31) - EXX - PUSH IX - CALL MAKE_LN - LD HL,L32BIT_+9 - LD A,(HL) - CP ' ' - JR NZ,.ALR - LD A,'0' - LD (HL),A -.ALR: LD DE,SIZEBFF - LD HL,L32BIT_;; +1 - LDI - LD A," " - LD (DE),A - INC DE - LDI - LDI - LDI - LD (DE),A - INC DE - LDI - LDI - LDI - LD (DE),A - INC DE - LDI - LDI - LDI - LD HL,SIZEBFF - POP IX -.PRZ: LD DE,PRM3 - JP PUTPRM - -; Скопировать в буфер дату файла/папки -PRNDATE: LD B,(IX+25) - LD C,(IX+24) - LD HL,SIZEBFF - CALL DATE - LD (HL),0 - LD HL,SIZEBFF - LD DE,PRM4 - LD A,(HL) - CP "0" - JP NZ,PUTPRM - LD (HL),#20 - JP PUTPRM -; Скопировать в буфер время файла/папки -PRNTIME: LD B,(IX+22) - LD C,(IX+23) - LD HL,SIZEBFF - CALL TIME - LD (HL),0 - LD HL,SIZEBFF - LD DE,PRM5 - LD A,(HL) - CP "0" - JP NZ,PUTPRM - LD (HL),' ' - JP PUTPRM -; в буфер время файла/папки -TIME: SRL C - RR B - SRL C - RR B - SRL C - RR B - SRL B - SRL B - LD A,C - CALL NUMB - LD (HL),":" - INC HL - LD A,B - JP NUMB -; в буфер дату файла/папки -DATE: LD A,C - AND #1F - PUSH BC - CALL NUMB - LD (HL),"." - INC HL - POP BC - LD A,C - SRL B - RLA - RLA - RLA - RLA - AND #0F - CALL NUMB - LD (HL),"." - INC HL - LD A,B - ADD A,#50 - CP 100 - JP C,NUMB -SUB100 SUB 100 - CP 100 - JP C,NUMB - JR SUB100 - -NUMB LD C,#2F -NUMB1 INC C - SUB 10 - JP NC,NUMB1 - ADD A,10 - ADD A,'0' - LD (HL),C - INC HL - LD (HL),A - INC HL - RET -; Десятичный 32-х разрядный вывод -MAKE_LN LD IX,L32BIT_ - EXX - LD DE,#3B9A ; 1000000000 - EXX - LD DE,#CA00 - CALL GET_DIG - EXX - LD DE,#05F5 ; 100000000 - EXX - LD DE,#E100 - CALL GET_DIG - EXX - LD DE,#0098 ; 10000000 - EXX - LD DE,#9680 - CALL GET_DIG - EXX - LD DE,#000F ; 1000000 - EXX - LD DE,#4240 - CALL GET_DIG - EXX - LD DE,#0001 ; 100000 - EXX - LD DE,#86A0 - CALL GET_DIG - EXX - LD DE,#0000 ; 10000 - EXX - LD DE,#2710 - CALL GET_DIG - EXX - LD DE,#0000 ; 1000 - EXX - LD DE,#03E8 - CALL GET_DIG - EXX - LD DE,#0000 ; 100 - EXX - LD DE,#0064 - CALL GET_DIG - EXX - LD DE,#0000 ; 10 - EXX - LD DE,#000A - CALL GET_DIG - LD A,L ; 1 - ADD A,#30 - LD (IX+0),A - INC IX - LD HL,L32BIT_ - LD DE,#2030 -KILLZ LD A,(HL) - CP E - JR NZ,KILLZ2 - LD (HL),D - INC HL - JP KILLZ -KILLZ2 LD HL,L32BIT_+9 - LD A,(HL) - CP D - RET NZ - LD (HL),E - RET - -; HL:HL - DE:DE -GET_DIG XOR A -INC_DG INC A - SBC HL,DE - EXX - SBC HL,DE - EXX - JP NC,INC_DG - ADD HL,DE - EXX - ADC HL,DE - EXX - DEC A - ADD A,#30 - LD (IX+0),A - INC IX - RET - -L32BIT_ DB "0000000000" - -DIRIDD DB " ",0 - -SIZEBFF DB "0 000 000 000",0,0 - -;------------------- - -;!FIXIT лучше такую функцию в DSS пихнуть -; прочитать BPB диска -/* -read_disk_info: -.disk+1: ld a,0 ; сохр. номер диска - ld c,Dss.DRV.Open ; open device - rst ToDSS.DRV - jr c,get_inf_data_err - ld a,(read_disk_info.disk) - ld de,BPB ; буфер - ld c,Dss.DRV.GetBPB ; get BPB - rst ToDSS.DRV - ;push af - ld a,(read_disk_info.disk) ; номер диска - ld c,Dss.DRV.Close ; close device - rst ToDSS.DRV - ;pop af - ;jr c,get_inf_data_err -get_inf_data_err: - ; Серийный номер лог. диска - ld hl,(BPB+41) ; ст.часть - ld de,SER_NUM ; xxxx-xxxx - call hex16 - ld a,"-" - ld (de),a - inc de - ld hl,(BPB+39) ; мл.часть - call hex16 - ; - ; Метка диска - ld a,(read_disk_info.disk) ; номер диска - cp 2 ; меньше "C:" ? - jr nc,get_inf_data1 ; метка в BPB - ; floppy, метка - как запись файла - ld c,Dss.ChDisk ; уст. диск - rst ToDSS - ; уст. корень диска - ld hl,ROOT ; "\",0 - ld c,Dss.ChDir - rst ToDSS - ; поиск метки - ld hl,ALLFS ; "*.*" имя метки - ld de,DTA ; куда - ld a,8 ; атрибут метки тома - ld bc,0*256 + Dss.F_First ; f_first, формат 11 - rst ToDSS - push af - call restore_path ; восст. тек. путь - pop af - jr c,no_volume_label ; метки нет - ld hl,DTA+33 ; начало метки в буфере f_first - jr volume_label - ; -get_inf_data1: - ld hl,BPB+53 ; конец метки в BPB - ld a,(hl) - cp " " ; есть метка ? - ld hl,BPB+43 ; начало метки в BPB - jr nz,volume_label ; да -; нет метки -no_volume_label: - ld hl,volume_string1 ; "has no label " - ld de,volume_string ; куда - ld bc,14 - ldir - ret -; есть метка -volume_label: - ex de,hl - ld hl,volume_string ; куда - ld (hl),"i" - inc hl - ld (hl),"s" - inc hl - ld (hl)," " - inc hl - ex de,hl - ; скопир. имя метки - ld bc,11 ; макс. длина метки - ld a,(hl) - cp " "+1 - jr nc,$+6 - inc hl - dec c - jr $-7 - ld a,11 - sub c - ldir - ld b,a - or a ; длина метки 11 симв. ? - ret z ; да - ; дополнить хвост. пробелами - ld (de),a - inc de - djnz $-2 - ret -*/ -; Вывод HL в hex-формате -; de=буфер -; hl=число -hex16: ld a,h - call hex8 - ld a,l -; вывод "a" -hex8: push af - rrca - rrca - rrca - rrca - call $+4 - pop af - and 0Fh - add a,90h - daa - adc a,40h - daa - ld (de),a - inc de - ret -;------------------- - -VERS: LD C,Dss.Version - RST ToDSS - LD L,D - LD H,E - LD DE,PRM1 - CALL .Set_Ver_to_PRM ; set DSS version - ;R13 - LD HL,256*CONSOLE_MODF + CONSOLE_VERS - LD BC,CONSOLE_BUILD - LD DE,PRM2 - CALL .Set_Ver_to_PRM ; set Shell version - ;R13 - LD DE,VERSMSG - JP MESSAGE - - ; вход: hl=число, de=буфер -.num_ver: -.num_mod: - ld ix,.tmp1__ - res 7,(ix+0) - jr .decim - - ; вход: hl=число, de=буфер -.num_build: - ld ix,.tmp1__ - res 7,(ix+0) - ld bc,100 ; 100 - call .num16 - -.decim: ld bc,10 ; 10 - call .num16 - ld a,l - add a,"0" - jr .num16_exit - -.tmp1__: BYTE 0 - -.num16: ld a,'0'-1 - and a - inc a - sbc hl,bc - jr nc,$-3 - add hl,bc - cp "0" - jr z,$+6 - set 7,(ix+0) - bit 7,(ix+0) - ret z -.num16_exit: - ld (de),a ; сохр. в буфере - inc de - ret - ; -; Вход: -; L - номер версии (0..9) -; H - номер модификации (0..99) -; BC - номер билда (0..999) -; DE - номер параметра -.Set_Ver_to_PRM: - PUSH BC - PUSH HL - LD H,0 - CALL .num_ver ;decim2 номер версии (0..9) - LD A,'.' - LD (DE),A - INC DE - POP HL - LD L,H - LD H,0 - CALL .num_mod ;decim2 номер модификации (0..99) - POP HL - LD A,'.' - LD (DE),A - INC DE - CALL .num_build ;decim3 номер билда (0..999) - XOR A - LD (DE),A - RET -/* -VERS: - LD C,Dss.Version - RST ToDSS - PUSH BC - - LD A,D - LD HL,PRM1 - CALL GETnoZERO - LD A,"." - LD (HL),A - INC HL - - LD A,E - CALL GETnoZERO - LD A,"." - LD (HL),A - INC HL - - POP BC - LD A,C - CALL GETnoZERO - XOR A - LD (HL),A - - LD DE,VERSMSG - JP MESSAGE - -GETnoZERO: - LD B,#2F -.loop: INC B - SUB 10 - JR NC,.loop - ADD A,10+"0" - LD C,A - LD A,"0" - CP B - LD A,C - JR Z,.mdec - LD (HL),B - INC HL -.mdec: LD (HL),A - INC HL - SCF - RET - -GETyesZERO: - LD B,#2F -.loop: INC B - SUB 10 - JR NC,.loop - ADD A,10 - LD (HL),B - INC HL - RET Z - ADD A,"0" - LD (HL),A - INC HL - RET -*/ - -HELP: LD DE,HELPMSG - CALL MESSAGE - RET - -CEXIT: LD A,(TASKX) - DEC A - DEC A - RET Z - POP HL -QUIT: LD BC,Dss.Exit - RST ToDSS - RET - -;----------------------------------------------------------------------- -;R12 -REBOOT: DI - LD C,BIOS.FullInit - RST ToBIOS - LD BC,2*256 + BIOS.REINIT - RST ToBIOS - DI - HALT -;R12 -;----------------------------------------------------------------------- - -ERR_MSG: INC DE - LD HL,ERR0 - LD BC,ERR0.Size - CALL LCPIR - CALL PRINTZ - CALL CRLF - JP CRLF - -MESSAGE: CALL FMESAGE - CALL PRINTZ - ;CALL GETXY - RET - -FMESAGE: INC DE - LD HL,MSG0 - LD BC,MSG0.Size -LCPIR: XOR A - CPIR - RET PO - RET NZ - ;R11 - XOR A - CP (HL) - JR Z,.no_mess - ; - DEC DE - LD A,D - OR E - JP NZ,LCPIR - RET -.no_mess: INC HL - RET - - -PUTPRM: LD BC,15 -PUTPRMA: LD A,(HL) - LDI - RET PO - OR A - JR NZ,PUTPRMA - RET - -;!FIXIT заменить на PUTPRMA с выставлением перед вызовом BC = 255 например -; Скопир. строку (с нулем) -; (hl) -> (de) -//copy_string: -// ld a,(hl) -// ldi -// or a -// jr nz,copy_string -// ret - - - -PRINTZ: LD A,(HL) - INC HL - OR A - RET Z - CP "%" - JR NZ,.char - - LD A,(HL) - INC HL - SUB "1" - PUSH HL - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,PRM1 - ADD HL,BC - LD C,Dss.PChars - RST ToDSS - POP HL - JP PRINTZ -.char: LD C,Dss.PutChar - RST ToDSS - JP PRINTZ - -ROOT: DB '\',0 - -ALLFS: DB "*.*",0 - -SER_NUM: DB "C37F-73AB",0 -//SER_NUM DB "XXXX-XXXX",0 - -EXTBF: BLOCK 4,0 - -BATBF: DB "BAT" - -ECHOON: DB "ON",0 -ECHOOFF: DB "OFF",0 - - -DIR1MSG EQU 0 -VERSMSG EQU 1 -DATEMSG EQU 2 -TIMEMSG EQU 3 -PAUSMSG EQU 4 -ILLGMSG EQU 5 -ECHOMSG EQU 6 -ON__MSG EQU 7 -OFF_MSG EQU 8 -DIR2MSG EQU 9 -DIR3MSG EQU 10 -HELPMSG EQU 11 - -MSG0: DB 0 -; 0 - DB "Volume in drive %1 has no label",CR,LF ; !FIXIT - DB "Volume Serial number is %2",CR,LF - DB "Directory of %3",CR,LF,CR,LF,0 -; 1 - DB "Estex DSS: Version %1",CR,LF - DB "Console: Version %2",CR,LF,0 ;R13 -; 2 - DB "Current date: %1",CR,LF,0 -; 3 - DB "Current time: %1",CR,LF,0 -; 4 - DB "Press any key to continue . . .",CR,LF,0 -; 5 - DB "Invalid parametr",CR,LF,0 -; 6 - DB "Echo is %1",CR,LF,0 -; 7 - DB "on",0 -; 8 - DB "off",0 -; 9 - DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 -; 10 FILENAME EXT SIZE DATE TIME - DB "%1 %2 %3 %4 %5",CR,LF,0 -; 11 - DB "COMMANDS:",CR,LF,CR,LF - DB "DIR REN | RENAME PATH HELP ",CR,LF - DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF - DB "MD | MKDIR TIME ECHO EXIT ",CR,LF - DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 - ;R11 - BYTE 0 - DZ "Unknown command" - ; -.Size EQU $-MSG0 -;----------------------------------------------------------------------- -;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются -ERR0: DB #00 - DZ "Bad command or file name" - DZ "Invalid function" ; 01 - неверный номер функции - DZ "Invalid drive number" ; 02 - неправильный номер устройства - DZ "File not found" ; 03 - файл не обнаружен - DZ "Path not found" ; 04 - неверный путь - DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор - DZ "Too many open files" ; 06 - нет свободного файлового манипулятора - DZ "File already exist" ; 07 - файл существует - DZ "File read only" ; 08 - файл только для чтения - DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) - DZ "No free space" ; 10 - нет свободного места на диске - DZ "Directory not empty" ; 11 - каталог не пуст - DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог - DZ "Invalid media" ; 13 - неизвестный формат - DZ "Unknown operation" ;R02 ; 14 - невозможная операция - DZ "Directory exist" ; 15 - каталог уже есть - DZ "Invalid filename" ; 16 - неверное имя - DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл - DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла - DZ "Access denied" ; 19 - ресурс не доступен - DZ "Not ready" ; 20 - нет готовности - DZ "Seek error" ; 21 - ошибка позиционирования - DZ "Sector not found" ; 22 - сектор не найден - DZ "CRC error" ; 23 - ошибка CRC - DZ "Write protect" ; 24 - защита записи - DZ "Read error" ; 25 - ошибка чтения - DZ "Write error" ; 26 - ошибка записи - DZ "Drive failure" ; 27 - сбой диска - DZ "Extended error 28" - DZ "Extended error 29" - DZ "Not enough memory" ; 30 - недостаточно памяти - DZ "Invalid memory block" ; 31 - несуществующий блок памяти - DZ "Extended error 32" - DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной - DZ "Extended error 34" - DZ "Too many files in directory" ; 35 - слишком много файлов в директории - DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 - DZ "Operation aborted by user" ; 37 - операция прервана пользователем - DZ "Common error" ; 38 - общая ошибка - DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения - DZ "40" - DZ "41" - DZ "42" - DZ "43" - DZ "44" - DZ "45" - DZ "46" - DZ "Wrong video mode" ; 48 - неправильный видеорежим - DZ "48" - DZ "49" - DZ "50" - ;R11 - DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: - DZ "Unknown error" - ; -.Size EQU $-ERR0 -;----------------------------------------------------------------------- - -GETPATH: - LD C,Dss.CurDisk - RST ToDSS - LD HL,PATHF - ADD A,"A" - LD (HL),A - INC HL - LD (HL),":" - INC HL - LD C,Dss.CurDir - RST ToDSS - - LD HL,PATHF - LD DE,PATH - LDI - LDI - LDI - PUSH HL - XOR A - LD BC,34 ;!HARDCODE - CPIR - JP NZ,LONGP - LD A,34 ;!HARDCODE - SUB C - LD C,A - POP HL - LDIR - JR PHLEN - -LONGP CPIR - LD A,"." - LD (DE),A - INC DE - LD (DE),A - INC DE - LD (DE),A - INC DE - LD BC,31 - AND A - SBC HL,BC - LDIR - POP HL -PHLEN LD HL,PATH - LD BC,40 ;!HARDCODE path - XOR A - CPIR - LD A,39 ;!HARDCODE - SUB C - LD (PATHLEN),A - LD C,A - INC C - INC C - LD A,80 - SUB C - LD (WINDOW),A - RET -PRINT_B LD C,A -PRINTBB PUSH BC - CALL PRINTX - POP BC - LD A,C - DJNZ PRINTBB - RET - -TEMPXY DW 0 - -CR_ LD C,Dss.Cursor - RST ToDSS - LD E,0 - JP LOCAT - -LF_ LD C,Dss.Cursor - RST ToDSS - LD A,D - CP #1F - JP Z,LFF - INC D - JP LOCAT - -LFF PUSH HL - PUSH DE - LD BC,#018A - LD DE,#0020 - EI - HALT - DI - RST ToBIOS - LD DE,#1F00 - CALL LOCAT - LD A,#20 - LD BC,#5082 - RST ToBIOS - EI - POP DE - CALL LOCAT - POP HL - RET - -PRINTX: CP ' ' - JP NC,CHAR - CP #0D - JP Z,CR_ - CP #0A - JP Z,LF_ -CHAR: PUSH BC - LD BC,1*256 + BIOS.LP_PRINT_SYM - RST ToBIOS - POP BC - RET - -LOCAT LD (TEMPXY),DE - LD C,Dss.Locate - RST ToDSS - RET - -;PRINTX LD C,Dss.PutChar -; RST #10 -; RET - -CEDIT PUSH IX - POP HL - INC HL - INC HL - LD (ETXS),HL - XOR A - LD (POSIT),A - LD (PRINT_S.SHIFT),A -EDIT1 LD DE,(ETXS) - CALL PRINT_S - CALL KEY - CP 13 ; enter code - RET Z - LD HL,EDIT1 - PUSH HL - AND A - LD HL,#5400 - SBC HL,DE - JP Z,BACK - AND A - LD HL,#5600 - SBC HL,DE - JP Z,FORW - CP #08 - JP Z,DELET - CP #20 - RET C - EX AF,AF' - LD A,(IX+1) - CP (IX+0) - CCF - RET C - LD A,(IX+1) - LD E,A - LD D,0 - LD HL,(ETXS) - ADD HL,DE - LD A,(POSIT) - LD E,A - LD A,(IX+1) - SUB E - JR Z,ADD_SM - LD B,D - LD C,A - LD D,H - LD E,L - DEC HL - LDDR - EX DE,HL -ADD_SM EX AF,AF' - LD (HL),A - LD A,(POSIT) - INC A - LD (POSIT),A - LD (MAIN_X),A - INC (IX+1) - LD HL,(ETXE) - INC HL - LD (ETXE),HL - LD HL,PRINT_S.SHIFT - SUB (HL) - CP (IX-1) - RET C - LD A,(STEP) - ADD A,(HL) - LD (HL),A -; CALL PAGE - RET - -BACK: LD A,(POSIT) - OR A - RET Z ;JP Z,BCK - DEC A - LD (POSIT),A - LD (MAIN_X),A - INC A - LD HL,PRINT_S.SHIFT - SUB (HL) - RET NZ - LD A,(STEP) - LD E,A - LD A,(HL) - SUB E - LD (HL),A -; CALL PAGE - RET - -FORW LD A,(POSIT) - CP (IX+1) - RET Z ; JP Z,FRD - INC A - LD (POSIT),A - LD (MAIN_X),A - LD HL,PRINT_S.SHIFT - SUB (HL) - CP (IX-1) - RET C - LD A,(STEP) - ADD A,(HL) - LD (HL),A -; CALL PAGE - RET - -DELET LD A,(POSIT) - OR A - RET Z ; JP Z,LINKSTR - LD HL,(ETXS) - LD E,A - LD D,0 - ADD HL,DE - LD A,(IX+1) - SUB E - JR Z,SUB_SM - LD B,D - LD C,A - LD D,H - LD E,L - DEC DE - LDIR -SUB_SM XOR A - DEC HL - LD (HL),A - LD A,(POSIT) - DEC A - LD (POSIT),A - LD (MAIN_X),A - DEC (IX+1) - LD HL,(ETXE) - DEC HL - LD (ETXE),HL - LD HL,PRINT_S.SHIFT - INC A - SUB (HL) - RET NZ - LD A,(STEP) - LD E,A - LD A,(HL) - SUB E - LD (HL),A -; CALL PAGE - RET - -KEY ;RES 5,(IY+1) - LD A,(PRINT_S.SHIFT) - LD E,A - LD A,(POSIT) - SUB E - INC A - LD HL,PATHLEN - ADD A,(HL) - LD (_X+1),A - LD A,(POSIT) - CP (IX+1) - JP C,KEY0 - LD A,#20 - LD (_A+1),A - JP KEY1 -KEY0 LD E,A - LD D,0 - LD HL,(ETXS) - ADD HL,DE - LD A,(HL) - LD (_A+1),A -KEY1 CALL CURSORF - EI - HALT - LD C,Dss.ScanKey - RST ToDSS - JP Z,KEY1 - RET - -CURSORX DB #00 - -CURSORF LD A,05 - DEC A - LD (CURSORF+1),A - RET NZ - LD A,05 - LD (CURSORF+1),A - LD DE,(TEMPXY) -_X LD E,#00 - CALL LOCAT - LD A,(CURSORX) - XOR #FF - LD (CURSORX),A - LD A,"_" - JR NZ,YEPCUR -_A LD A,#20 -YEPCUR CALL PRINTX - EI - RET - -RES_CUR LD A,(CURSORX) - OR A - RET Z - XOR #FF - LD (CURSORX),A - LD DE,(TEMPXY) - LD A,(_X+1) - LD E,A - CALL LOCAT - LD A,(_A+1) - JP PRINTX - -PRINT_S: - PUSH DE - CALL GETXY ;;; - LD DE,(TEMPXY) - LD E,0 - CALL LOCAT - LD HL,PATH - CALL PRINTZ - LD A,">" - CALL PRINTX - POP DE - EX DE,HL -.SHIFT+1: LD BC,#0000 - ADD HL,BC - LD A,(.SHIFT) - LD C,A - LD A,(IX+1) - SUB C - JP Z,.EMT_STR - LD B,A - LD A,(IX-1) - SUB B - JR NC,.PR_S - LD B,(IX-1) -.PR_S: PUSH BC - LD C,BIOS.LP_PRINT_LINE2 - RST ToBIOS - POP BC -.EMT_STR: LD A,(IX-1) - SUB B - EI - RET Z - LD B,A - LD A,' ' - LD C,BIOS.LP_PRINT_SYM - RST ToBIOS - EI - RET - -GET_CMD: LD D,XH - LD E,XL - EX DE,HL - LD E,(HL) - INC HL - LD D,0 - EX DE,HL - ADD HL,DE - LD (HL),0 -NEXTPRM EX DE,HL -SKIPSP LD A,(HL) - INC HL - CP " " - RET C - JR Z,SKIPSP - DEC HL - CP "/" - JR NZ,PROCESS - LD DE,BUFFER - LD C,Dss.GSwitch - RST ToDSS - PUSH AF - EX DE,HL ;SAVE HL IN DE - LD HL,BUFFER - INC HL - CALL ISWITCH - POP AF - JP NC,NEXTPRM - XOR A - RET - -PROCESS LD DE,CMDLINE - LD BC,#00FF -NLDI LD A,(HL) - LDI - INC B - CP " " - JR NC,NLDI - DEC B - LD A,B - LD (CMDLINE-1),A - LD A,(RUNMODE) - OR #40 ;PROCESS - LD (RUNMODE),A - XOR A - RET - -ISWITCH LD A,(HL) - CP "a" - JR C,NUP - CP "{" - JR NC,NUP - SUB #20 -NUP -PR000 CP "P" - JR NZ,PR001 - LD A,(RUNMODE) - OR #80 ;PRIMARY CONSOLE - LD (RUNMODE),A - RET -PR001 CP "S" - JR NZ,PR002 - LD A,(RUNMODE) - OR #20 ;SECONDARY CONSOLE - LD (RUNMODE),A -PR002 CP "C" - JR NZ,PR003 - LD A,(RUNMODE) - OR #10 ;RUN BATCH FILE - LD (RUNMODE),A -PR003 RET - -TASKX DB 0 -RUNMODE DB 0 -STEP DB 8 -MAIN_X DB 0 - -LEN_OLD DB 0 -POSIT DB 0 - -ETXS DW 0 -ETXE DW 0 -; +0 - Size buffer -; +1 - Amount simbols -; -1 - Scroll Window -WINDOW DB #50 -BUFFERC DB #FF -LEN_NEW DB #00 - -BATNAME DB "system.bat",0 -BAT_BUFFER.size EQU 128 ;!FIXIT BAT_BUFFER LENGTH - - - -/* -; Структура строки ввода ~input line~ -struct_input_line: - db max_len_comline ;+0 254 макс. число ввод. символов - db 0 ;+1 флаг ReadyString - db 0 ;+2 X тек. полож. курсора в пределах строки - db 0 ;+3 X смещ. строки за левый край (в символах) - db 0 ;+4 число введенных символов - ds max_len_comline+1 ;+5 строка ввода -*/ - - STRUCT BUFFERS_STRUCT -CMDLINE BLOCK 256,0 ;!HARDCODE cmdline size -TMPLINE BLOCK 256,0 -PRMLINE BLOCK 256,0 -;BUFFER -;BATBUFF -SHARED_BUFFER BLOCK BAT_BUFFER.size+1,0 -; -PRM1 BLOCK 16,0 -PRM2 BLOCK 16,0 -PRM3 BLOCK 16,0 -PRM4 BLOCK 16,0 -PRM5 BLOCK 16,0 -PRM6 BLOCK 16,0 -PRM7 BLOCK 16,0 -PRM8 BLOCK 16,0 -PRM9 BLOCK 16,0 -DTA BLOCK 256,0 -DTA_2 BLOCK 256,0 -BPB BLOCK 512,0 -PATHF BLOCK 256,0 -BAT_FM DB 0 -BAT_LEN DB 0 -ECHOFLG DB 0 -PATHLEN DB 0 -PATH BLOCK 40,0 ;!HARDCODE PATH LENGTH - ENDS - - -WORK_BUFFERS BUFFERS_STRUCT = $ - -CMDLINE EQU WORK_BUFFERS.CMDLINE -TMPLINE EQU WORK_BUFFERS.TMPLINE -PRMLINE EQU WORK_BUFFERS.PRMLINE -BUFFER EQU WORK_BUFFERS.SHARED_BUFFER -BATBUFF EQU WORK_BUFFERS.SHARED_BUFFER -PRM1 EQU WORK_BUFFERS.PRM1 -PRM2 EQU WORK_BUFFERS.PRM2 -PRM3 EQU WORK_BUFFERS.PRM3 -PRM4 EQU WORK_BUFFERS.PRM4 -PRM5 EQU WORK_BUFFERS.PRM5 -PRM6 EQU WORK_BUFFERS.PRM6 -PRM7 EQU WORK_BUFFERS.PRM7 -PRM8 EQU WORK_BUFFERS.PRM8 -PRM9 EQU WORK_BUFFERS.PRM9 -DTA EQU WORK_BUFFERS.DTA -DTA_2 EQU WORK_BUFFERS.DTA_2 -BPB EQU WORK_BUFFERS.BPB ;!TEST -PATHF EQU WORK_BUFFERS.PATHF -BAT_FM EQU WORK_BUFFERS.BAT_FM -BAT_LEN EQU WORK_BUFFERS.BAT_LEN -ECHOFLG EQU WORK_BUFFERS.ECHOFLG -PATHLEN EQU WORK_BUFFERS.PATHLEN -PATH EQU WORK_BUFFERS.PATH - - - DISPLAY "BUFFERS_STRUCT = ",/D,BUFFERS_STRUCT - DISPLAY "WORK_BUFFERS start = ",/H,WORK_BUFFERS - DISPLAY "WORK_BUFFERS end = ",/H,WORK_BUFFERS+BUFFERS_STRUCT - -/* - -CMDLINE BLOCK 256,0 - -TMPLINE BLOCK 256,0 - - -PRMLINE BLOCK 256,0 - -BUFFER: - -BATBUFF: BLOCK BAT_BUFFER.size+1,0 -; - -PRM1 BLOCK 16,0 -PRM2 BLOCK 16,0 -PRM3 BLOCK 16,0 -PRM4 BLOCK 16,0 -PRM5 BLOCK 16,0 -PRM6 BLOCK 16,0 -PRM7 BLOCK 16,0 -PRM8 BLOCK 16,0 -PRM9 BLOCK 16,0 - -DTA: BLOCK 256,0 -PATHF: BLOCK 256,0 - -BAT_FM: DB 0 -BAT_LEN: DB 0 - -ECHOFLG: DB 0 - -PATHLEN: DB 0 -PATH: BLOCK 40,0 ;!FIXIT PATH LENGTH -*/ - - OUTEND -; -;[End] \ No newline at end of file diff --git a/Console/Errors.TXT b/Console/Errors.TXT deleted file mode 100644 index 45055c1..0000000 --- a/Console/Errors.TXT +++ /dev/null @@ -1,66 +0,0 @@ -No free file handles -Bad Command or file name -Access denied -Memory allocation error -Cannot load COMMAND, system halted -Cannot start COMMAND, exiting -Top level process aborted, cannot continue -Write protect error -Invalid unit -Not ready -Invalid device request -Data error -Invalid device request parameters -Seek error -Invalid media type -Sector not found -Printer out of paper error -Write fault error -Read fault error -General failure -Sharing violation -Lock violation -Invalid disk change -FCB unavailable -System resource exhausted -Code page mismatch -Out of input -Insufficient disk space -Too many parameters -Required parameter missing -Invalid switch -Invalid keyword -Parameter value not inallowed range -Parameter value not allowed -Parameter value not allowed -Parameter format not correct -Invalid parameter -Invalid parameter combination -Invalid function -File not found -Path not found -Too many open files -Access denied -Invalid handle -Memory control blocks destroyed -Insufficient memory -Invalid memory block address -Invalid Environment -Invalid format -Invalid function parameter -Invalid data -Invalid drive specification -Attempt to remove current directory -Not same device -No more files -File exists -Cannot make directory entry -Fail on INT 24 -Too many redirections -Duplicate redirection -Invalid password -Invalid parameter -Network data fault -Function not supported by network -Required system component not installed - diff --git a/Console/HISTORY.TXT b/Console/HISTORY.TXT deleted file mode 100644 index 1acb2dd..0000000 --- a/Console/HISTORY.TXT +++ /dev/null @@ -1,4 +0,0 @@ -21-02-2003 FIX BUG WITH LINE MERGE IN BAT-FILE -14-12-2002 ADD BAT-PARAMETERS %1 %2 -11-12-2002 ADD BAT-VARIABLES %VAR% -03-10-2002 FIX BUG WITH OUTPUT AT THE SCREEN IN BAT-MODE diff --git a/Console/build.txt b/Console/build.txt deleted file mode 100644 index 2e66562..0000000 --- a/Console/build.txt +++ /dev/null @@ -1 +0,0 @@ -49 \ No newline at end of file diff --git a/Console/version.inc b/Console/version.inc deleted file mode 100644 index 1d20a76..0000000 --- a/Console/version.inc +++ /dev/null @@ -1,22 +0,0 @@ -;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] - LUA PASS1 - Console_build = increase_build("./Console/build.txt") - if Console_build > 999 then - Console_build = 999 - print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a") - end - ENDLUA - LUA ALLPASS - sj.insert_label("lua_BUILD", Console_build) - ENDLUA -;---------------------------------------------------------------------[] - -; -; Shell full version -; номер версии (0..9) -CONSOLE_VERS EQU 1 -; номер модификации (0..99) -CONSOLE_MODF EQU 2 -; номер билда (0..999) -CONSOLE_BUILD EQU lua_BUILD -; \ No newline at end of file diff --git a/DOS/CURSOR.ASM b/DOS/CURSOR.ASM deleted file mode 100755 index d7261a7..0000000 --- a/DOS/CURSOR.ASM +++ /dev/null @@ -1,63 +0,0 @@ -delay_curs equ 11 ; частота мигания курсора - - - -cursor: db 3Eh ; ld a,.. -crFlag: db 0 ; флаг курсора 00-нет/01-есть - cpl - ld (crFlag),a -; Включить курсор -cursor_on: - ld c,8Eh ; узнать полож. курсора - rst 08h - ld (curs_posit+1),de - xor a - ld c,0B4h ; получить символ - rst 08h - ld bc,1BB5h ; b=знакоген., с=символ на экран - ld a,(crFlag) - or a - jr z,curs__ - ld b,1Ah ; черта - ld a,(D0642) ; флаги клавы - bit 1,a ; бит Ins - jr nz,$+4 - ld b,19h ; блок -curs__: xor a ; номер окна - rst 08h - ld a,1 - ld (curs_inv_flag),a - ld a,delay_curs - ret - -; Выключить курсор -cursor_off: - db 3Eh ; ld a,.. -curs_inv_flag: - db 0 ; флаг курсора: 00-выкл/01-вкл - or a - ret z - ld a,-1 - ld (crFlag),a - inc a - ld (curs_inv_flag),a - ld a,delay_curs - ld (curs_timer),a -curs_posit: - ld de,0 ; Y/X полож. - bit 7,e - ret nz - ld c,0B4h ; получить символ - xor a - rst 08h - xor a - ld bc,1BB5h ; символ на экран - rst 08h - ret - - -; Установить фокус на "Input Line" -focus_to_inpline: - call cursor_on ; вкл. курсор - ei - ret diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM deleted file mode 100755 index 0abef18..0000000 --- a/DOS/DOS.ASM +++ /dev/null @@ -1,7527 +0,0 @@ -; Последняя редакция: 9.03.2007 -; - - -; метки ## - не ясные места (закомментарино) -; метки @@ - замена ориг. кода -; - - -; буфер D2E7C или T0400 также исп. для ввода/вывода файловых операций ? - - - - -; Примечания по ДОС-у -; -; Выравнивание кода на границу происходит в двух местах: 0100h и 0900h -; (есть немного лишнего места). -; -; -; Добавления: -; ~~~~~~~~~~~ -; Появилась новая функция #08 DSS_RESCAN (Пересканировать девайсы системы). -; -; Функция #00 (версия ДОС) дополн. возвращает в BC номер билда (0..999). -; -; Добавлен код обслуживания курсора (на прерываниях) и регистрация в системе -; знакогенераторов курсора с номерами 1Ah/19h (черта/блок). Функция #32 дора- -; ботана под новый курсор, а также не выводит ascii-код #00 (от курс. клавиш -; и т.д.). Переключение формы курсора клавишей "Ins". -; -; В функции #5F (символ на принтер) добавлено отслеживание байта состояния -; принтера (7..3 биты). При ошибке, функция возвращает байт состояния, а не -; печатаемый символ, как в фирменной версии. -; -; ;Добавлена функция #0C (tmp_filename) -; -; -; - - - -; Исправления: -; ~~~~~~~~~~~~ -; 1) В отличии от оригинала, функции 0Ah/0Bh (Create file/New create file) -; перед созданием файла проверяют на переполнение таблицу свободных -; дескрипторов. - -; 2) Убрано фирменное ограничение макс. длины строки переменной окружения -; в 32 символа и некорректная отработка функции #46 (в командах "path", -; "set"). Теперь макс. длина строки 255 символов. -; -; 3) Исправлена фирменная ошибка, при которой происходило зависание -; системы (непредсказуемое поведение) при превышении макс. числа -; открытых дескрипторов (функции search_handle, release_handle). -; -; 4) Исправлена фирменная ошибка, из-за которой в операциях с файлами не -; отслеживался атрибут "системный". -; -; 5) Исправлено не отслеживание атрибута файла "r/o" в функции #0E (удаление -; файла). -; -; 6) Пофиксен глюк вывода списка файлов, если число файлов в списке -; превышало 509. Сейчас список выводится корректно и может содержать -; макс. 510 файлов. Если число файлов в каталоге превышает 510, то выдается -; код ошибки 35 "слишком много файлов" (для списка каталогов выдается -; код ошибки 7 "каталог не найден"). -; -; 7) Пофиксен глюк "PrintScreen", выдававший скен-код #C7 клавиши и -; устанавливавший бит LShift-a. Версия ДОС стала 1.61.9. -; -; -; - - - - -; ДОС выделяется блок из 3 банок (функ. Init_DOS), используемых в качестве -; банок расширения. -; Исп. лог. номеров банок: -; 0 - кэш списка каталога -; 1 - кэш FAT -; 2 - path-переменная (запуск файла) и др. переменные окружения, а также -; сохранение текст. экрана при переключении в граф. режим -; ;3 - страница структуры tsr-обработчиков (моя) -; -; -; -; -; - - - - - - include "dos.inc" - - - - org 0000h - - - -;RST 00h -L0000: jp Func_41 ; заглушка (завершить программу) -D0003: db -1 ; D0=сигнал переполн. буфера клавы, D1=сигнал перекл. на альт.раскладку - db -1 - db -1 - db -1 - db -1 - -;RST 08h, Вызов функций Биоса - push af - ld a,0 ; вкл. ПЗУ Биоса в 0-е окно - out (7Ch),a - pop af - ret - db -1 - -;RST 10h - jp A006C ; вектор ДОС-а - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 18h - jp drv_devices ; вектор дисковых устройств - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 20h, свободный - jp empty__ ; заглушка - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 28h, свободный - jp empty__ ; заглушка - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 30h - jp MOUSE_vector ; вектор мышки - db -1 - db -1 - db -1 - db -1 - db -1 - -;RST 38h - jp $+3 - push af - ex af,af' - push af - push bc - push de - push hl - exx - push bc - push de - push hl - push ix - push iy - call keyb_scan ; обработчик клавиатуры - ld c,80h ; обработчик аппаратн. прерыв. мышки - rst 30h - call cursor_interrupt ; вектор обслуж. курсора - pop iy - pop ix - pop hl - pop de - pop bc - exx - pop hl - pop de - pop bc - pop af - ex af,af' - pop af - ei - reti - - db -1 ;,-1,-1,-1 ; на границу 0064h - -;0064h - retn - db 0 ; 0066h (от немаск. прерывания в IM0) - db 0 - db 0 - jp $-5 - - -;------------------------------------------------- -; ДОС-овый вектор -;------------------------------------------------- -A006C: push hl - ld l,c ; номер команды - ld h,T0200 / 256 ; 0200h..02FFh массив мл.байтов адресов - ld c,(hl) ; загр. мл.байт адреса - inc h ; 0300h..03FFh массив ст.байтов адресов - ld h,(hl) ; загр. ст.байт адреса - ld l,c ; готовый адрес - ex (sp),hl ; в стек и - ret ; перейти на него - - - -; Вектор обслуживания курсора -cursor_interrupt: - ld a,(curs_inv_flag) - or a - ret z - ;di ;поставил - db 3Eh ; ld a,.. -curs_timer: - db 1 ; пауза мигания - dec a - call z,cursor - ld (curs_timer),a - ret - - - -; Начало boot-сектора -T0076: ds 3 ; 3 байта, код перехода на загрузчик -; 8 байт, OEM ID - db "DSS_" - db major_version + "0" - db "." - db (minor_version / 10) + "0" - db (minor_version % 10) + "0" -; BPB, 17 байт -D0081: dw 512 ;+11 ; байтов на сектор -D0083: db 2 ;+13 ; секторов на кластер - dw 1 ;+14 ; зарезерв. секторов -D0086: db 2 ;+16 ; число копий FAT-ов - dw 112 ;+17 ; записей в корне - dw 1440 ;+19 ; # всех секторов на диске - db 0F0h ;+21 ; байт формата -D008C: dw 2 ;+22 ; # секторов на FAT - dw 9 ;+24 ; секторов на сторону -D0090: dw 2 ;+26 ; кол-во сторон диска -; extended boot-record - dw 0,0 ;+28,+30 ; скрытых секторов - dw 0,0 ;+32,+34 ; всех секторов на диске - dw 80h ;+36 ; 0x00 физ. номер диска - db 29h ;+38 ; сигнатура расш. boot-записи - dw 0,0 ;+39,+41 ; серийный номер диска - db "NO NAME " -T00AC: db "FAT16 " - - - -;----------------------------------------------------------- -; Настройка знакогенератора курсора черточкой -;----------------------------------------------------------- -setup_znak: - in a,(0C2h) - push af ; сохр. порт - ld a,(list_dos_pages+2) ; 2-й лог. номер страницы расш. ДОС - out (0C2h),a - ; получить сист. знакоген. - ld de,8000h ; буфер для 2048 байт данных - push de - ld c,0B8h ; получить знакоген. - rst 08h - ; заполнить кодом 0FFh 2 нижние линии - ld hl,8000h+(2048-(2*256)) ; последние 512 байт - ld bc,511 - ld a,1Ah; ; номер знакоген. "черточка" - call fill_data_font - pop hl - ; заполнить остальные 6 линий (полный блок) - ld bc,2048-513 - ld a,19h; ; номер знакоген. "блок" - call fill_data_font - pop af - out (0C2h),a ; восст. порт - ret - -; Настройка знакоген. и его регистрация -; вход: a=номер знакоген. -; hl=данные -; bc=размер данных -fill_data_font: - ld e,l - ld d,h - ld (hl),-1 - inc de - ldir - ld de,8000h ; знакоген. - ld c,0B6h ; уст. знакоген. - rst 08h - ret - - - - ;ds 100h - $ ; выровнить на границу #0100 -L0100 equ $+100h AND 0FF00h - ds L0100 - $ - - - -;0100h. Массив списка выдел. страниц -list_pages: - ds 256 - - - -; Младшие разряды адресов функций -T0200: db Init_DOS%256, Func_01%256, Func_02%256, Func_03%256 ; 00..03 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 04..07 - db Func_08%256, Func_09%256, Func_0A%256, Func_0B%256 ; 08..0B - db Func_0C%256, empty__%256, Func_0E%256, empty__%256 ; 0C..0F - db Func_10%256, Func_11%256, Func_12%256, Func_13%256 ; 10..13 - db Func_14%256, Func_15%256, Func_16%256, Func_17%256 ; 14..17 - db Func_18%256, Func_19%256, Func_1A%256, Func_1B%256 ; 18..1B - db Func_1C%256, Func_1D%256, Func_1E%256, empty__%256 ; 1C..1F - db empty__%256, Func_21%256, Func_22%256, empty__%256 ; 20..23 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 24..27 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 28..2B - db empty__%256, empty__%256, empty__%256, empty__%256 ; 2C..2F - db Func_30%256, Func_31%256, Func_32%256, Func_33%256 ; 30..33 - db empty__%256, Func_35%256, Func_36%256, Func_37%256 ; 34..37 - db Func_38%256, Func_39%256, Func_3A%256, Func_3B%256 ; 38..3B - db Func_3C%256, Func_3D%256, Func_3E%256, Func_3F%256 ; 3C..3F - db Func_40%256, Func_41%256, Func_42%256, Func_43%256 ; 40..43 - db Func_44%256, Func_45%256, Func_46%256, Func_47%256 ; 44..47 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 48..4B - db empty__%256, empty__%256, empty__%256, empty__%256 ; 4C..4F - db Func_50%256, Func_51%256, Func_52%256, Func_53%256 ; 50..53 - db Func_54%256, Func_55%256, Func_56%256, Func_57%256 ; 54..57 - db Func_58%256, Func_59%256, Func_5A%256, Func_5B%256 ; 58..5B - db Func_5C%256, empty__%256, empty__%256, Func_5F%256 ; 5C..5F - db empty__%256, empty__%256, empty__%256, empty__%256 ; 60..63 - db empty__%256, empty__%256, empty__%256, empty__%256 ; 64..67 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 68..6B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 6C..6F - db A0000%256, A0000%256, A0000%256, A0000%256 ; 70..73 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 74..77 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 78..7B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 7C..7F - db A0000%256, A0000%256, A0000%256, A0000%256 ; 80..83 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 84..87 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 88..8B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 8C..8F - db A0000%256, A0000%256, A0000%256, A0000%256 ; 90..93 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 94..97 - db A0000%256, A0000%256, A0000%256, A0000%256 ; 98..9B - db A0000%256, A0000%256, A0000%256, A0000%256 ; 9C..9F - db A0000%256, A0000%256, A0000%256, A0000%256 ; A0..A3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; A4..A7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; A8..AB - db A0000%256, A0000%256, A0000%256, A0000%256 ; AC..AF - db A0000%256, A0000%256, A0000%256, A0000%256 ; B0..B3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; B4..B7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; B8..BB - db A0000%256, A0000%256, A0000%256, A0000%256 ; BC..BF - db A0000%256, A0000%256, A0000%256, A0000%256 ; C0..C3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; C4..C7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; C8..CB - db A0000%256, A0000%256, A0000%256, A0000%256 ; CC..CF - db A0000%256, A0000%256, A0000%256, A0000%256 ; D0..D3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; D4..D7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; D8..DB - db A0000%256, A0000%256, A0000%256, A0000%256 ; DC..DF - db A0000%256, A0000%256, A0000%256, A0000%256 ; E0..E3 - db A0000%256, A0000%256, A0000%256, A0000%256 ; E4..E7 - db A0000%256, A0000%256, A0000%256, A0000%256 ; E8..EB - db A0000%256, A0000%256, A0000%256, A0000%256 ; EC..EF - db empty__%256, empty__%256, empty__%256, empty__%256 ; F0..F3 - db empty__%256, empty__%256, empty__%256, empty__%256 ; F4..F7 - db empty__%256, empty__%256, empty__%256, empty__%256 ; F8..FB - db empty__%256, empty__%256, empty__%256, empty__%256 ; FC..FF - -;0300h. Старшие разряды адресов функций - db Init_DOS/256, Func_01/256, Func_02/256, Func_03/256 ; 00..03 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 04..07 - db Func_08/256, Func_09/256, Func_0A/256, Func_0B/256 ; 08..0B - db Func_0C/256, empty__/256, Func_0E/256, empty__/256 ; 0C..0F - db Func_10/256, Func_11/256, Func_12/256, Func_13/256 ; 10..13 - db Func_14/256, Func_15/256, Func_16/256, Func_17/256 ; 14..17 - db Func_18/256, Func_19/256, Func_1A/256, Func_1B/256 ; 18..1B - db Func_1C/256, Func_1D/256, Func_1E/256, empty__/256 ; 1C..1F - db empty__/256, Func_21/256, Func_22/256, empty__/256 ; 20..23 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 24..27 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 28..2B - db empty__/256, empty__/256, empty__/256, empty__/256 ; 2C..2F - db Func_30/256, Func_31/256, Func_32/256, Func_33/256 ; 30..33 - db empty__/256, Func_35/256, Func_36/256, Func_37/256 ; 34..37 - db Func_38/256, Func_39/256, Func_3A/256, Func_3B/256 ; 38..3B - db Func_3C/256, Func_3D/256, Func_3E/256, Func_3F/256 ; 3C..3F - db Func_40/256, Func_41/256, Func_42/256, Func_43/256 ; 40..43 - db Func_44/256, Func_45/256, Func_46/256, Func_47/256 ; 44..47 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 48..4B - db empty__/256, empty__/256, empty__/256, empty__/256 ; 4C..4F - db Func_50/256, Func_51/256, Func_52/256, Func_53/256 ; 50..53 - db Func_54/256, Func_55/256, Func_56/256, Func_57/256 ; 54..57 - db Func_58/256, Func_59/256, Func_5A/256, Func_5B/256 ; 58..5B - db Func_5C/256, empty__/256, empty__/256, Func_5F/256 ; 5C..5F - db empty__/256, empty__/256, empty__/256, empty__/256 ; 60..63 - db empty__/256, empty__/256, empty__/256, empty__/256 ; 64..67 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 68..6B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 6C..6F - db A0000/256, A0000/256, A0000/256, A0000/256 ; 70..73 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 74..77 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 78..7B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 7C..7F - db A0000/256, A0000/256, A0000/256, A0000/256 ; 80..83 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 84..87 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 88..8B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 8C..8F - db A0000/256, A0000/256, A0000/256, A0000/256 ; 90..93 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 94..97 - db A0000/256, A0000/256, A0000/256, A0000/256 ; 98..9B - db A0000/256, A0000/256, A0000/256, A0000/256 ; 9C..9F - db A0000/256, A0000/256, A0000/256, A0000/256 ; A0..A3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; A4..A7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; A8..AB - db A0000/256, A0000/256, A0000/256, A0000/256 ; AC..AF - db A0000/256, A0000/256, A0000/256, A0000/256 ; B0..B3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; B4..B7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; B8..BB - db A0000/256, A0000/256, A0000/256, A0000/256 ; BC..BF - db A0000/256, A0000/256, A0000/256, A0000/256 ; C0..C3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; C4..C7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; C8..CB - db A0000/256, A0000/256, A0000/256, A0000/256 ; CC..CF - db A0000/256, A0000/256, A0000/256, A0000/256 ; D0..D3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; D4..D7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; D8..DB - db A0000/256, A0000/256, A0000/256, A0000/256 ; DC..DF - db A0000/256, A0000/256, A0000/256, A0000/256 ; E0..E3 - db A0000/256, A0000/256, A0000/256, A0000/256 ; E4..E7 - db A0000/256, A0000/256, A0000/256, A0000/256 ; E8..EB - db A0000/256, A0000/256, A0000/256, A0000/256 ; EC..EF - db empty__/256, empty__/256, empty__/256, empty__/256 ; F0..F3 - db empty__/256, empty__/256, empty__/256, empty__/256 ; F4..F7 - db empty__/256, empty__/256, empty__/256, empty__/256 ; F8..FB - db empty__/256, empty__/256, empty__/256, empty__/256 ; FC..FF - - - - - -; буфер 512 байт -T0400: db ". ",10h,0,0,0,0 ; тек. каталог - ds 16 - db ".. ",10h,0,0,0,0 ; родит. каталог - ds 16 - ds 448 - - -;T0600. Выровнить на границу xx00h - - include "keyb.asm" ; включает "init_DOS" - - - -;///////////////////////////////////////////////////////////////////// -; Функция #56. Очистить окно. -; -; вход: D - строка левого верхнего угла окна -; E - столбец левого верхнего угла окна -; H - высота окна -; L - ширина окна -; A - символ заполнитель -; B - атрибут заполнитель -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_56:ld c,8Dh ; очистка экрана указ. символом - rst 08h - and a - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5C. Вывод строки на экран. -; -; вход: HL - указатель на строку символов -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_5C:ld a,(hl) - inc hl - or a - ret z - call Func_5B ; вывод "a" на экран - jr Func_5C - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5B. Вывод символа на экран в тек. позиции. -; -; вход: A - символ -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_5B: - cp " " - jr nc,A0DFC - cp 0Dh ; в начало строки - jr z,A0E20 - cp 0Ah ; на след. строку - jr z,A0E28 - cp 9 ; Tab - jr z,A0E0F - cp 8 ; Backspace - jr z,A0E03 -A0DFC: push hl - ld bc,0182h ; вывести один символ без атрибута - rst 08h - pop hl - ret - -; Backspace -A0E03: ld c,8Eh ; узнать полож. курсора - rst 08h - xor a - cp e - jp z,Func_52 ; уст. полож. курсора - dec e - jp Func_52 ; уст. полож. курсора - -; Tab -A0E0F: ld c,8Eh ; узнать полож. курсора - rst 08h - ld a,e - and 0F8h - add a,8 - ld e,a ; X полож. курсора - jp Func_52 ; уст. полож. курсора - -; 0Dh - в начало строки -A0E20: ld c,8Eh ; узнать полож. курсора - rst 08h - ld e,0 - jp Func_52 ; уст. полож. курсора - -; 0Ah - на след. строку -A0E28: ld c,8Eh ; узнать полож. курсора - rst 08h - ld a,d - cp 31 - jr nc,A0E35 - inc d - jp Func_52 ; уст. полож. курсора - ; -A0E35: push hl - push de - ld bc,018Ah ; скроллинг вверх - ld de,0020h ; нач./число строк - ei - halt - di - rst 08h - ld de,1F00h ; Y/X полож. нижней строки - call Func_52 ; уст. полож. курсора - ld a," " ; символ - ld bc,5082h ; вывести 80 симв. - rst 08h - ei - pop de - call Func_52 ; уст. полож. курсора - pop hl - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #52. Установить положение курсора. -; -; вход: D - строка курсора -; E - колонка курсора -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_52:ld c,84h ; уст. полож. курсора - rst 08h - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #53. Узнать положение курсора. -; -; вход: нет -; выход: D - строка курсора -; E - колонка курсора -;///////////////////////////////////////////////////////////////////// -Func_53:ld c,8Eh ; узнать полож. курсора - rst 08h - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #57. Прочитать символ с экрана. -; -; вход: D - строка -; E - колонка -; выход: A - символ -; B - атрибут -;///////////////////////////////////////////////////////////////////// -Func_57:xor a - ld c,0B4h - rst 08h - ld a,l - ld b,h - and a - ret - -;///////////////////////////////////////////////////////////////////// -; Функция #58. Вывести символ на экран. -; Управляющие символы выводятся как обычные символы. -; -; вход: D - строка -; E - колонка -; A - символ -; B - атрибут -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_58:ld c,a - push bc - push de - ld c,0B4h ; символ с экрана - xor a - rst 08h - pop de - pop hl - ld c,0B5h ; символ на экран - xor a - rst 08h - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #59. Сохранить окно экрана. -; -; вход: D - строка -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B - страница буфера -; IX - адрес буфера -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_59:ld a,r ; во флаг P/V сост. триггера разреш. прерываний - push af - xor a - di - ld c,0B2h - rst 08h - pop af ; восст. флаг - scf - ccf - ret po ; прерывания разрешены - ei - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5A. Восстановить окно экрана. -; -; вход: D - строка -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B - страница буфера -; IX - адрес буфера -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_5A:ld a,r ; во флаг P/V сост. триггера разреш. прерываний - push af - xor a - di - ld c,0B3h - rst 08h - pop af - scf - ccf - ret po ; прерывания разрешены - ei - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #55. Скроллинг экрана. -; -; вход: D - строка левого верхнего угла окна -; E - колонка левого верхнего угла окна -; H - высота окна -; L - ширина окна -; B = 1 - прокрутка вверх -; B = 2 - прокрутка вниз -; A = 0 - очищать строку -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_55: djnz A0EBA - ld b,a - ld c,h - push bc - push de - push hl - LD XH,D - LD XL,E - inc d - dec h - xor a - ld c,0B7h ; перемещ. окна - di - rst 08h - ei - pop hl - pop de - pop bc - xor a - cp b - ret nz ; не очищать строку - ld a,d - add a,h - dec a - ld d,a -A0EAA: push de - call Func_52 ; уст. полож. курсора - ld a," " - ld b,l - ld c,82h - rst 08h - pop de - call Func_52 ; уст. полож. курсора - and a - ret - ; -A0EBA: djnz A0EE0 - ld b,a - ld c,l - push de - push bc - db 0DDh - ld h,d - db 0DDh - ld l,e - db 0DDh - inc h - dec h - xor a - ld c,0B7h - di - rst 08h - ei - pop hl - pop de - xor a - cp b - jr z,A0EAA ; очистить строку - ret - ; -A0EE0: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #54. Выбрать активную страницу экрана. -; -; вход: B - страница экрана 0/1 -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_54:push bc - ld a,(mode_screen) ; тек. режим экрана - bit 7,a - jr nz,A0EF0 - ld c,a - call A0F04 -A0EF0: pop bc - ld a,b - and 1 - out (0C9h),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #51. Получить текущий режим экрана. -; -; вход: нет -; выход: A - текущий режим экрана -; B - страница экрана 0/1 -;///////////////////////////////////////////////////////////////////// -Func_51:in a,(0C9h) ; страница экрана 0/1 - ld b,a - ld a,(mode_screen) ; тек. режим экрана - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #50. Выбор режима экрана. -; -; вход: A - режим экрана -; 02h - текстовый 40x32x16 цветов -; 03h - текстовый 80x32x16 цветов -; 81h - графический 320x256x256 цветов -; 82h - графический 640x256x16 цветов -; B - страница экрана 0/1 -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_50:bit 7,a - ld c,a - jr nz,A0F27 ; уст. граф. режимы -A0F04: ld ix,A1080 ; точка выхода (восст. экран граф. режима) - push ix - ex af,af' - ld a,(mode_screen) ; тек. режим экрана - ld (A1081+1),a - ex af,af' - inc a ; a=0 - dec a - jr z,A0F21 - dec a ; a=1 - jr z,A0F21 - dec a ; a=2 - jr z,A0F3F - dec a ; a=3 - jr z,A0F67 -A0F21: pop ix ; восст. баланс стека (заодно ix) - ld a,EERR48 ; код "ошибка 48" - scf - ret - -; Установка граф. режимов -A0F27: call A1042 ; сохр. экран текст. режима - and 7Fh - jp z,A0F8F ; a=80h - dec a ; a=81h - jp z,A0F93 - dec a ; a=82h - jp z,A0FBA - dec a ; a=83h - jp z,A0FE1 - ld a,EERR48 ; код "ошибка 48" - scf - ret - -; Уст. текст. режим 40x32. -A0F3F: push bc - ; текстовое, 8 точек/знакоместо, #0B - номер знакоген. - ld hl,T101A ; описатель окна (8 байт) - ld a,b - rlca - rlca - rlca - rlca - or b - and 11h - xor 10h - ld e,a ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h - rst 30h - ld a,0C0h - out (89h),a - xor a - ret - -; Уст. текст. режим 80x32. -A0F67: push bc - ; текстовое, 16 точек/знакоместо, #0B - номер знакоген. - ld hl,T1012 ; описатель окна (8 байт) - ld a,b - rlca - rlca - rlca - rlca - or b - and 11h - xor 10h - ld e,a ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h ; режим экрана для мышки - rst 30h - ld a,0C0h ; закр. спек-экран - out (89h),a - xor a - ret - ; -A0F8F: ld a,EERR48 ; код "ошибка 48" - scf - ret - ; -A0F93: push bc - ; графическое, 8 точек/знакоместо, 0-й экран - ld hl,T102A ; описатель окна (8 байт) - ld e,11h ; флаги окна - call open_window - ; графическое, 8 точек/знакоместо, 1-й экран - ld hl,T103A ; описатель окна (8 байт) - ld e,0 ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h - rst 30h - ld a,0C0h - out (89h),a - xor a - ret - -A0FBA: push bc - ; графическое, 16 точек/знакоместо, 0-й экран - ld hl,T1022 ; описатель окна (8 байт) - ld e,11h ; флаги окна - call open_window - ; графическое, 16 точек/знакоместо, 1-й экран - ld hl,T1032 ; описатель окна (8 байт) - ld e,0 ; флаги окна - call open_window - pop bc - ld a,c - ld (mode_screen),a ; тек. режим экрана - ld a,b - and 1 - out (0C9h),a - ld a,(mode_screen) ; тек. режим экрана - ld c,81h - rst 30h - ld a,0C0h - out (89h),a - xor a - ret - -A0FE1: ld a,EERR48 ; код "ошибка 48" - scf - ret - - -; тек. режим экрана -mode_screen: - db 3 ; 80x32x16 текстовый - - - -;------------------------------------------------- -; Открыть окно -; вход: hl=описатель окна -; e=флаги окна -;------------------------------------------------- -open_window: - push de - ld de,LFEE0 ; куда - ld bc,32 ; размер описателя (8..31 зарез.) - call A1001 ; скопир. описатель в сист. страницу - pop de - ld ix,LFEE0 ; описатель окна (8 байт) - ld c,0B0h ; откр. окно - rst 08h - ld a,0C0h ; закр. спек-экран - out (89h),a - xor a - ret - - -;----------------------------------------------------- -; Скопировать описатель окна в сист. страницу Биоса -; вход: hl=откуда -; de=куда -; bc=сколько -;----------------------------------------------------- -A1001: ld a,r ; во флаг P/V сост. триггера разреш. прерываний - in a,(0E2h) - ex af,af' ; сохр. флаг - ld a,0FEh ; страница переменных Биоса - out (0E2h),a - ldir - ex af,af' ; восст. флаг - out (0E2h),a - ret po ; прерывания разрешены - ei - ret - - - -;----------------------------------------------------------- -; Массив описателей окон -; -; флаги окна: -; bit4 = 1/0 - text/graf режим -; bit5 = 1/0 - 8/16 точек в знакоместе -; graf_mode bit3..0 - не исп. -; bit7..6 - номер палитры (номер экрана) -; text_mode bit7..6, 3..0 - номер знакогенератора -; исключение: bit7..6="11" -> бордер -;----------------------------------------------------------- - -; 80x32. текстовое, 16 точек/знакоместо, #0B - номер знакоген. -T1012: db 40 ;+0 X размер окна в знакоместах - db 32 ;+1 Y размер окна в знакоместах - db 0 ;+2 X полож. окна на экране - db 0 ;+3 Y полож. окна на экране - db 00011011b ;+4 режим знакоместа - db 0 ;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) - db 0 ;+6 X полож. в поле графики (в знакоместах) - db 0 ;+7 Y полож. в поле графики (в знакоместах) - -; 40x32. текстовое, 8 точек/знакоместо, #0B - номер знакоген. -T101A: db 40,32 ; X/Y габариты - db 0,0 - db 00111011b ;+4 5,4, bit3..0 номер знакоген. - db 0,0,0 - -; графическое, 16 точек/знакоместо, 0-й экран -T1022: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 00000000b ;+4 - db 0,0,0 - -; графическое, 8 точек/знакоместо, 0-й экран -T102A: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 00100000b ;+4 5-й бит - db 0,0,0 - -; графическое, 16 точек/знакоместо, 1-й экран -T1032: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 01000000b ;+4 6-й бит - db 0 - db 40 ;+6 X полож. в поле графики (в знакоместах) - db 0 - -; графическое, 8 точек/знакоместо, 1-й экран -T103A: db 40,32 ; X/Y габариты (в знакоместах) - db 0,0 - db 01100000b ;+4 6,5 биты - db 0 - db 40 ;+6 X полож. в поле графики (в знакоместах) - db 0 - - -;-------------------------------------------------- -; Сохранить экран текст. режима. -; Для буфера экрана исп. 2-я банка расширения ДОС. -;-------------------------------------------------- -A1042: push af - ld a,(mode_screen) ; тек. режим экрана - bit 7,a - jr nz,A107E ; граф. режим - sub 2 - jr c,A107E ; меньше 02h - push bc - push de - push hl - push ix - push af - ld c,8Eh ; узнать полож. курсора - rst 08h - ld (A10A0+1),de - pop af ; режим экрана - ld ix,LC000 ; буфер - ld de,0000h ; Y/X полож. - ld hl,2050h ; Y/X размер (32x80) - or a - jr nz,$+4 ; 80x32 текст. режим - ld l,40 ; X размер - ld (A1090+1),hl - ld a,(list_dos_pages+2) ; номер банки расширения ДОС - ld b,a - xor a - ld c,0B2h ; с экрана в буфер - di - rst 08h - ei - pop ix - pop hl - pop de - pop bc -A107E: pop af - ret - - -;------------------------------------------------- -; Восстановить экран граф. режима. -; Буфер экрана во 2-й банке расширения ДОС. -;------------------------------------------------- -A1080: push af -A1081: ld a,0 ; тек. режим экрана - rlca ; 4 такта - jr nc,A10AB ; текстовый - push bc - push de - push hl - push ix - ld ix,LC000 ; буфер - ld de,0000h ; Y/X полож. -A1090: ld hl,2050h ; Y/X размер (32x80 или 32x40) - ld a,(list_dos_pages+2) ; номер банки расширения ДОС - ld b,a - xor a - ld c,0B3h ; из буфера на экран - di - rst 08h - ei -A10A0: ld de,0 ; Y/X полож. - ld c,84h ; уст. курсор - rst 08h - pop ix - pop hl - pop de - pop bc -A10AB: pop af - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #5F. Вывод символа на принтер без ожидания. -; -; Интерпретация байта состояния принтера: -; 0..2 - не используются, обычно уст. в "1" -; 3 - ошибка принтера - есть/нет (1/0) -; 4 - принтер подключен/не подключен (1/0) -; 5 - бумаги нет/есть (1/0) -; 6 - принтер готов/выводит очередной символ (1/0) -; 7 - принтер свободен/занят (1/0) -; -; вход: A - символ -; выход: B - символ -; CF - ошибка, A=байт состояния (биты 7..3) -;///////////////////////////////////////////////////////////////////// -Func_5F:ld b,a - ld a,r ; во флаг P/V сост. триггера разреш. прерываний - ld a,b - di - push af ; сохр. флаг - xor a - out (1Bh),a - ld a,10h - out (1Bh),a - xor a - out (1Bh),a - in a,(1Bh) ; порт состояния принтера - ld c,a; - bit 5,a ; 0/1 есть/нет бумага - jr nz,A10CC ; нет бумаги - and 11011000b; - jr z,A10CC; ; ошиб. ситуация - ld a,b - out (1Ch),a ; символ в принтер - pop af ; восст. флаг - scf - ccf ; сбр. CF - ret po ; прерывания разрешены - ei - ret - ; -A10CC: pop af - ld a,c; ; байт состояния - scf ; уст. CF - ret po ; прерывания разрешены - ei - ret - - - -; Иниц. портов -A10D1: di - ld a,0CFh - ld bc,001Fh ; порт - out (c),a - ld a,63h - out (c),a - ld a,0C0h - out (1Eh),a - ld a,0Fh - out (1Dh),a - ld a,0 - out (19h),a - ld a,0 - out (19h),a - ld a,5 - out (19h),a - ld a,62h - out (19h),a - ret - - -; Установить начальный кластер для чтения -A10F6: ld hl,1 - ld (A10FD+1),hl - ret - - -A10FD: ld hl,1 -A1100: inc hl ; номер кластера - call A1132 ; прочитать из кеша FAT-а номер след. кластера - cp 0Ah - scf - ret z ; ошибка ? - ld a,d - or e - jr nz,A1100 - ld (A10FD+1),hl - xor a - ret - - -A1111: push hl - call A10FD - pop de - ret c - push hl - push hl - ex de,hl ; hl=номер кластера -A111A: call A1132 ; прочитать из кеша FAT-а номер след. кластера - ex de,hl - jr nc,A111A ; не конец цепочки - ex de,hl - pop de ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - pop hl - ld de,(D150E) ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - call A128B ; подкл. банку кеша FAT и записать его на диск - and a - ret - - -;----------------------------------------------------------- -; Прочитать из кеша FAT-а номер след. кластера -; вход: hl=номер кластера -; выход: hl=номер кластера -; de=номер след. кластера -; CF - конец цепочки -;----------------------------------------------------------- -A1132: ex de,hl - ld hl,(D12FF) - and a - sbc hl,de - ex de,hl - ld a,0Ah - ret c - exx - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - exx - push hl - push af ; старая банка порта - ld a,(D150B) - cp "2" ; fat12 - jr z,A1177 - ; fat16, просто читать след. номер - ld a,h - ld b,a - and 0Fh - ld h,a - ld a,b - rrca - rrca - rrca - rrca - and 0Fh - add hl,hl - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; начало кеша FAT-а - add hl,de ; на ячейку FAT - ld e,(hl) ; прочитать номер кластера - inc hl - ld d,(hl) - pop af - out (0E2h),a ; восст. порт - ld hl,0FFEFh - ;and a ;@@ - xor a; - sbc hl,de ; проверка на служ. кластеры - pop hl - ;ld a,0 - ret -; fat12 -A1177: ld d,h - ld e,l - add hl,hl - add hl,de - rr h ; сдвиг вправо через CF - rr l - push af ; сохр. флаг - ld a,h - ld b,a - and 1Fh - ld h,a - ld a,b - rlca - rlca - rlca - and 7 - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; начало кеша FAT-а - add hl,de ; на ячейку FAT - pop af ; восст. флаг - ld e,(hl) - inc hl - ld d,(hl) - jr c,A11A3 ; номер не четный - ld a,d - and 0Fh - ld d,a - jr A11B7 - ; -A11A3: ld a,e - and 0F0h - ld e,a - rr d ; вправо на 4 битa - rr e - rr d - rr e - rr d - rr e - rr d - rr e -A11B7: pop af ; восст. порт - out (0E2h),a - ld hl,0FEFh - ;and a - xor a; - sbc hl,de ; проверка на служ. кластеры - pop hl - ;ld a,0 - ret - - -;----------------------------------------------------------- -; Записать в кеш FAT-а номер кластера -; вход: de=номер кластера -; hl=номер первого кластера ? -; выход: ;hl=номер след. кластера ? -; de=номер кластера -;----------------------------------------------------------- -A11C4: push de - ex de,hl - ld hl,(D12FF) - and a - sbc hl,de - ex de,hl - pop de - ld a,0Ah - ret c - exx - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - exx - push hl - push af ; старая банка порта - ld a,1 - ld (D12FE),a - ld a,(D150B) - cp "2" ; fat12 - jr z,A120B - ; fat16, просто сохр. номер - push de - ld a,h - ld b,a - and 0Fh - ld h,a - ld a,b - rrca - rrca - rrca - rrca - and 0Fh - add hl,hl - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; кеш FAT - add hl,de ; на ячейку FAT - pop de - ld (hl),e ; сохр. в кеше FAT-а - inc hl ; номер кластера - ld (hl),d ; - pop af ; восст. порт - pop hl - out (0E2h),a - xor a - ret -; fat12 -A120B: push de - ld d,h - ld e,l - add hl,hl - add hl,de - rr h - rr l - push af ; сохр. флаг - ld a,h - ld b,a - and 1Fh - ld h,a - ld a,b - rlca - rlca - rlca - and 7 - ld bc,(D12FD) - cp c - call nz,A125B ; прочитать в кеш 16 секторов FAT-а - ld de,LC000 ; кеш FAT - add hl,de - pop af - pop de - jr c,A123E ; номер не четный - ld (hl),e - inc hl - ld a,(hl) - and 0F0h - or d - ld (hl),a - pop af ; восст. порт - pop hl - out (0E2h),a - and a - ret - ; -A123E: sla e ; влево на 4 битa - rl d - rl e - rl d - rl e - rl d - rl e - rl d - ld a,(hl) - and 0Fh - or e - ld (hl),a ; сохр. в кеше FAT-а - inc hl ; номер кластера - ld (hl),d ; - pop af ; восст. порт - pop hl - out (0E2h),a - and a - ret - - -; Прочитать в кеш 16 секторов FAT-а -; вход: a=.. ? -A125B: push hl - push af - ld a,(D12FE) - or a - call nz,A129A ; запись кеша (всего ?) FAT-а на диск - pop af - ld l,a - ld h,0 - ld (D12FD),hl - add hl,hl ;1+1=2 - add hl,hl ;2+2=4 - add hl,hl ;4+4=8 - add hl,hl ;8+8=16 - ld de,(D14FC) - add hl,de - ex de,hl - ld ix,0 - add ix,de ; номер лог. сектора - ld hl,0 ; ст. разряд - ld de,LC000 ; куда (кеш FAT) - ld a,(disk) ; номер диска - ld b,16 ; число секторов - ld c,5 ; чтение секторов - rst 18h - pop hl - ret - - - -; Подключить банку кеша FAT и записать его на диск -A128B: exx - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - exx - push af ; старая банка порта - call A129A ; запись кеша (всего ?) FAT-а на диск - pop af - out (0E2h),a ; восст. порт - ret - -; Запись кеша (всего ?) FAT-а на диск -A129A: ld hl,(D12FD) - ld h,0 - ld (D12FD),hl - add hl,hl ;1+1=2 - add hl,hl ;2+2=4 - add hl,hl ;4+4=8 - add hl,hl ;8+8=16 - push hl - ld b,h - ld c,l - ld de,16 - add hl,de - ld de,(D008C) ; секторов на FAT - ld a,16 ; число секторов - and a - sbc hl,de - jr c,A12C3 - ex de,hl - ld hl,16 - sbc hl,de - jr c,A12FA - ld a,l -A12C3: ld h,b - ld l,c - ld de,(D14FC) - add hl,de - ex de,hl - ld ix,0 - add ix,de ; номер лог. сектора - ld hl,0 ; ст. разряд - ld de,LC000 ; откуда (кеш FAT) - ld b,a ; число секторов - ld c,6 ; запись секторов - ld a,(disk) ; номер диска - push bc - rst 18h - pop bc ; b=число секторов - pop hl - ld de,(D14FE) - add hl,de - ex de,hl - ld ix,0 - add ix,de ; номер лог. сектора - ld de,LC000 ; откуда (кеш FAT) - ld hl,0 ; ст. разряд - ld a,(disk) ; номер диска - ld c,6 ; запись секторов - rst 18h - ret - ; -A12FA: pop hl - scf - ret - - -D12FD: db 0 -D12FE: db 0 -D12FF: dw 0FF0h ; макс. число кластеров FAT12 (без служ.) - - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #00. Версия ДОС. -; Возвращает номер версии дисковой системы. -; вход: нет -; выход: DE=номер версии/модификации -; BC=номер билда (0..999) -;///////////////////////////////////////////////////////////////////// - -Func_00:xor a - ld de,(major_version SHL 8) + minor_version ; 1.61 версия ДОС - ld bc,build_version ; номер билда - ld h,a - ld l,a - ret - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #01. Смена текущего диска. -; -; вход: A - номер диска (0=A,1=B,..) -; выход: A - макс. номер диска, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_01:push af ; номер девайса - ld c,1 ; открыть девайс - rst 18h - pop bc - jr c,A1323 ; ошибка - ld a,b - ld (disk),a ; номер тек. диска - call A1370 - ret c - ld a,(last_drive) ; номер послед. диска - and a - ret - ; -A1323: cp EINVDRV ; код "неверный номер устройства" - scf - ret z - ld a,ENORDY ; код "нет готовности" - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #02. Номер текущего диска. -; -; вход: нет -; выход: A - номер диска (0=A,1=B,..) -;///////////////////////////////////////////////////////////////////// -Func_02:ld a,(disk) - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #03. Информация о диске. -; Возвращает информацию об общем и свободном пространстве дискового -; устройства. -; -; вход: A - номер диска (0=A,1=B,..0FFh-текущий) -; выход: A - размер кластера в секторах, если CF=0 -; HL - общее кол-во кластеров -; DE - свободных кластеров -; BC - размер сектора в байтах -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_03:inc a - jr z,A1338 - dec a - call Func_01 ; смена текущего диска - ret c -A1338: ld hl,2 ; номер кластера - ld bc,0 -A133E: push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - pop bc - cp 0Ah - jr z,A1353 ; ошибка ? - xor a - cp e - jr nz,A134F - cp d - jr nz,A134F - inc bc -A134F: inc hl - jr A133E - ; -A1353: ld d,b ; свободных кластеров - ld e,c - ld hl,(D12FF) ; общее кол-во кластеров - dec hl - ld bc,(D0081) ; байтов на сектор (512) - ld a,(D0083) ; секторов на кластер - and a - ret - - -; Номер последнего диска в системе -last_drive: - db 2 ; "B" диск - ; список дисковых устройств ? - ds 5 - - - -; нет обращения -L1368: ld a,(disk) ; номер диска - ld c,3 ; проверка смены носителя в девайсе - rst 18h ; всегда выдает "менялся" - or a - ret z ; не менялся - ; -A1370: ld c,0E2h - in b,(c) - push bc - in a,(82h) - out (0E2h),a - ld de,LC400 ; буфер - ld a,(disk) ; номер диска - ld c,4 ; прочитать BPB - rst 18h - pop bc - out (c),b ; восст. порт - jp c,A14F0 ; ошибка (нет готовности) - push iy - ld de,0AA55h ; сигнатура - ld hl,(T0400+510) - and a - sbc hl,de - jp nz,A14EA ; ошибка "не известный формат" - ld hl,T0400 ; откуда - ld de,T0076 ; куда - ld bc,62 - ldir - ld iy,T0076 ; структура boot-сектора - ld a,(iy+21) - cp 0F0h ; байт формата - jp c,A14EA - ld hl,0 - ld e,(iy+14) ; de=зарезерв. секторов - ld d,(iy+15) - add hl,de - ld (D14FC),hl - ld (D14FC),hl - ld (D14FE),hl - ld e,(iy+22) ; de=число секторов на FAT - ld d,(iy+23) - ld a,(D0086) ; число копий FAT-ов - cp 1 - jr z,A13D2 - dec a - add hl,de - ld (D14FE),hl -A13D2: add hl,de - dec a - jr nz,A13D2 - ld (D1502),hl - ld c,(iy+11) ; bc=байтов на сектор - ld b,(iy+12) - rl c - rl b - rl c - rl b - rl c - rl b - ld c,b - ld b,0 - ld a,c - ld (D1504),a - ld e,(iy+17) ; de=записей в корне - ld d,(iy+18) - ex de,hl - dec hl - xor a -A13FB: inc a - jp z,A14EA - sbc hl,bc - jr nc,A13FB - ex de,hl - ld c,a - ld b,0 - ld (D1505),a - add hl,bc - ld (D1506),hl - ld c,(iy+11) ; bc=байтов на сектор - ld b,(iy+12) - ld hl,0 - ld a,(D0083) ; число секторов на кластер -A141A: add hl,bc - dec a - jr nz,A141A - ld (D1508),hl ; размер блока "секторов на кластер" - ex de,hl - ld hl,4000h-1 ; константа - xor a -A1426: inc a - jp z,A14EA - sbc hl,de - jr nc,A1426 - ld (D150A),a - ld hl,T00AC ; "FAT16 " - ld de,T14F4 ; "FAT" - ld b,3 -A1439: ld a,(de) - cp (hl) - jp nz,A14D1 - inc hl - inc de - djnz A1439 -A1442: ld a,(hl) - inc hl - cp " " - jr z,A1442 - cp "1" - jp nz,A14EA - ld a,(hl) - cp "6" - ld hl,0FFFFh ; ячейка FAT16 - jr z,A145D - cp "2" - jp nz,A14EA - ld hl,0FFFh ; ячейка FAT12 -A145D: ld (D150B),a ; "2"/"6" fat12/fat13 - ld (D150E),hl - ld hl,0 - ld c,(iy+24) ; bc=секторов на сторону - ld b,(iy+25) - ld a,(D0090) ; кол-во сторон диска -A146F: add hl,bc - dec a - jr nz,A146F - ld (D150C),hl - ld de,(D1506) - ld l,(iy+19) ; hl=всех секторов на диске - ld h,(iy+20) - ld a,h - or l - jr nz,A149B - ; extended boot-record - ld l,(iy+32) ; hl=мл.разряд всех секторов на диске - ld h,(iy+33) ; - ld c,(iy+34) ; bc=ст.разряд - ld b,(iy+35) ; - sbc hl,de - jr nc,A14A1 - dec bc - jr A14A1 - ; -A149B: sbc hl,de - ld bc,0 -A14A1: ld a,(D0083) ; секторов на кластер - scf -A14A5: rra - jr c,A14B3 - rr b - rr c - rr h - rr l - jr A14A5 - ; -A14B3: inc hl - ld (D12FF),hl - pop iy ; iy=структура дескр. - ld hl,0 - ld (D12FD),hl - ld a,1 ; лог. номер дос-банки (кэш FAT-а) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - xor a - call A125B ; прочитать в кеш 16 секторов FAT-а - pop af - out (0E2h),a - call A10F6 ; уст. начальный кластер для чтения - xor a - ret - ; -A14D1: ld a,(iy+15h) - cp 0F0h ; формат 720kB дискеты - jr c,A14EA - cp 0F8h ; байт-дескриптор винта - ld a,"6" - ld hl,0FFFFh ; ячейка FAT16 - jr z,A145D - ld a,"2" - ld hl,0FFFh ; ячейка FAT12 - jp A145D - ; -A14EA: pop iy - ld a,EINVMED ; код "не известный формат" - scf - ret - ; -A14F0: ld a,ENORDY ; код "нет готовности" - scf - ret - - -T14F4: db "FAT" - ; - db 0 - db 0 - db 0 - db 0 - -disk: db 1 ; номер диска ДОС - -D14FC: dw 0 -D14FE: dw 0 -D1500: dw 0 -D1502: dw 0 -D1504: db 0 -D1505: db 0 -D1506: dw 0 -D1508: dw 0 ; размер блока "секторов на кластер" -D150A: db 0 -D150B: db 0 ; "6"/"2" fat16/fat12 -D150C: dw 0 -D150E: dw 0FFFFh ; 0FFFFh/0FFFh fat16/fat12 - - -; Буфер текущего пути (каталога) системы -T1510: db '\' - ds 256 - - - -; <<< Массив структур дескрипторов, 44*10=440 байт >>> -; -; Структура дескриптора тек. каталога -handle: db ". " ;+0 имя файла (+0=0 - дескр. свободен) - db " " ;+8 расш. файла - db 10h ;+11 атрибут - ds 10 ;+12 резерв - dw 0 ;+22 время - dw 0 ;+24 дата - dw 0 ;+26 номер первого кластера - dw 0,0 ;+28 размер файла - dw 0 ;+32 мл.разряд указателя файла - dw 0 ;+34 ст.разряд - dw 0 ;+36 номер первого кластера каталога (из +26) - dw 0 ;+38 индекс записи в списке каталога (исп. #11 функ.) - db 0 ;+40 номер диска (drive or current) - db 0 ;+41 режим доступа к файлу (r,w,r/w). 7-й бит - признак изменения файла - db 0 ;+42 уровень тек. программы (задача (владелец)) - db 0 ;+43 резерв - -size_struc_handle equ $-handle ; размер структуры (44 байта) - - ; 9 файловых структур - ds size_struc_handle * max_handles ; 44*9=396 - - - - - -;------------------------------------------------- -; Поиск дескриптора файла. -; вход: a=номер дескр. -; выход: iy=адрес структуры дескр. -; CF - нет дескриптора -;------------------------------------------------- -search_handle: - inc a - cp max_handles+1 ; запред. число дескрипторов - jr nc,A17E3 - push de - ld iy,handle - size_struc_handle ; массив дескр. - 44 - ld de,size_struc_handle ; 44 размер структуры дескриптора - add iy,de - dec a - jr nz,$-3 ; ищем нужный дескр. - pop de - ld a,(iy+0) ; номер тек. дескр. - or a - ld a,EZERO ; код "Ok" - ret nz ; дескр. занят -A17E3: ld a,EINVHND ; код "не существующий дескриптор" - scf - ret - - -;----------------------------------------------------------- -; Освобождение дескриптора файла. -; вход: a=номер дескриптора -; выход: CF - при ошибке "не существующий дескриптор" -;----------------------------------------------------------- -release_handle: - inc a - cp max_handles+1 ; запред. число дескрипторов - jr nc,A17E3 - push de - ld iy,handle - size_struc_handle ; массив дескр. - 44 - ld de,size_struc_handle ; 44 размер структуры дескриптора - add iy,de - dec a - jr nz,$-3 ; ищем нужный дескриптор - pop de - ld a,(iy+0) ; имя файла в дескрипторе - or a ; структура свободна ? - ld a,EINVHND ; код "не существующий дескриптор" - exx - scf - ret z ; да - xor a - ld (iy+0),a ; освоб. тек. дескриптор - ret - - -;------------------------------------------------- -; Поиск свободного дескриптора. -; вход: нет -; выход: c=номер дескриптора -; CF - нет своб. дескриптора -;------------------------------------------------- -search_free_handle: - ld b,max_handles+1 ; 10 макс.число дескрипторов+1 - ld c,-1 ; счетчик номера дескр. - ld iy,handle - size_struc_handle ; массив дескр. - 44 - ld de,size_struc_handle ; 44 размер структуры дескриптора -A1815: add iy,de - inc c ; 0..9 - ld a,(iy+0) - or a ; тек. структура дескриптора свободна ? - ret z ; да - djnz A1815 ; на след. структуру - ld a,EMFILE ; код "слишком много откр. файлов" - scf - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #15. Перемещение указателя в файле. -; -; вход: A - дескриптор файла -; HL:IX - смещение указателя в файле -; B - способ перемещения -; B=0 от начала файла -; B=1 от текущего значения указателя -; B=2 от конца файла -; выход: HL:IX - новое значение указателя -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_15:call search_handle ; поиск дескр. файла - ret c ; не найден - inc b - dec b - jr z,A1835 ; от начала - dec b - jr z,A184B ; от тек. полож. - dec b - jr z,A183D ; от конца -empty__:ld a,EINVFNC ; код "не верный номер функции" - scf - ret - -; От начала файла -A1835: ld bc,0 ; для мл. разряда - ld e,c ; для ст. разряда - ld d,c - jr A1857 - -; От конца файла -A183D: ld c,(iy+1Ch) ; iy=дескр. файла - ld b,(iy+1Dh) - ld e,(iy+1Eh) - ld d,(iy+1Fh) - jr A1857 - -; От тек. положения -A184B: ld c,(iy+20h) - ld b,(iy+21h) - ld e,(iy+22h) - ld d,(iy+23h) -A1857: add ix,bc ; мл. разряд - adc hl,de ; ст. разряд - db 0DDh - ld d,h - db 0DDh - ld e,l - ld (iy+20h),e - ld (iy+21h),d - ld (iy+22h),l - ld (iy+23h),h - xor a - ret - - -A186D: ld l,(iy+1Ch) - ld h,(iy+1Dh) - ld e,(iy+20h) - ld d,(iy+21h) - and a - sbc hl,de - ld l,(iy+1Eh) - ld h,(iy+1Fh) - ld e,(iy+22h) - ld d,(iy+23h) - sbc hl,de - ret - - - -A188B: pop bc - pop de - and a - ret - ; -A188F: pop bc - pop de - scf ; ошибка - ret - ; -A1893: push bc - ld (D1CFB),ix - ld a,(D0083) ; секторов на кластер - ld c,a - ld b,0 - call A1CD9 - db 0DDh - ld b,h - db 0DDh - ld c,l - push hl - ld l,(iy+26) ; номер первого кластера (из дескр.) - ld h,(iy+27) ; - ld a,h - or l - jr nz,A18BB - jr A188B ; файл нулевой длины - ; -A18B2: push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - pop bc - jr c,A188B ; конец цепочки - ex de,hl ; hl=номер след. кластера - dec bc -A18BB: ld a,b - or c - jr nz,A18B2 ; прочитать след. сектор (кластер) - pop de - pop bc - ld a,(D0083) ; секторов на кластер - sub e - ld c,a - cp b - jr c,A18CA - ld c,b -A18CA: ld a,b - sub c - ld b,a - push hl - push bc - push de - call A1CB8 - pop de - add ix,de - jr nc,$+3 - inc hl - ld de,(D1CFB) ; буфер - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,5 ; чтение секторов - rst 18h - jr c,A188F ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) -A18EF: add hl,de - dec c - jr nz,A18EF - ld (D1CFB),hl - pop de - ld a,b - or a - ret z -A18FA: ld hl,D0083 ; секторов на кластер - ld a,b - sub (hl) - ld b,a - ld c,(hl) - jr nc,A1909 - ld b,0 - add a,(hl) - ld c,a - or a - ret z -A1909: ex de,hl ; hl=номер кластера - push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - pop bc - jr c,A1938 ; конец цепочки - ex de,hl ; hl=номер след. кластера - push hl - push bc - call A1CB8 - ld de,(D1CFB) ; куда - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,5 ; чтение секторов - rst 18h - jp c,A188F ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) -A192E: add hl,de - dec c - jr nz,A192E - ld (D1CFB),hl - pop de - jr A18FA - ; -A1938: and a - ret - - - -A193A: pop bc -A193B: pop bc - pop de - scf - ret - ; -A193F: push bc - ld (D1CFB),ix - ld a,(D0083) ; секторов на кластер - ld c,a - ld b,0 - call A1CD9 - db 0DDh - ld b,h - db 0DDh - ld c,l - push hl - ld l,(iy+1Ah) ; hl=номер первого кластера - ld h,(iy+1Bh) ; - ld a,h - or l - jr nz,A198A - push bc - call A10FD - jr c,A193A - ld (iy+1Ah),l ; hl=номер первого кластера - ld (iy+1Bh),h ; - ld de,(D150E) ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - push hl - call A128B ; подкл. банку кеша FAT и записать его на диск - pop hl - pop bc - jr A198A - ; -A1977: push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - jr nc,A1987 ; не конец цепочки - push hl ; номер кластера (не следующего) - call A1111 - pop hl - jr c,A193A - call A1132 ; прочитать из кеша FAT-а номер след. кластера -A1987: pop bc - ex de,hl ; hl=номер след. кластера - dec bc -A198A: ld a,b - or c - jr nz,A1977 - pop de - pop bc - ld a,(D0083) ; секторов на кластер - sub e - ld c,a - cp b - jr c,$+3 - ld c,b - ld a,b - sub c - ld b,a - push hl - push bc - push de - call A1CB8 - pop de - add ix,de - jr nc,$+3 - inc hl - ld de,(D1CFB) ; буфер - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,6 ; запись секторов - rst 18h - jp c,A193B ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) - add hl,de - dec c - jr nz,$-2 - ld (D1CFB),hl - pop de - ld a,b - or a - ret z -A19C9: ld hl,D0083 ; секторов на кластер - ld a,b - sub (hl) - ld b,a - ld c,(hl) - jr nc,A19D8 - ld b,0 - add a,(hl) - ld c,a - or a - ret z -A19D8: ex de,hl - push bc - call A1132 ; прочитать из кеша FAT-а номер след. кластера - jr nc,A19E9 ; не конец цепочки - push hl ; номер кластера (не следующего) - call A1111 - pop hl - jr c,A1A10 ; нет места на диске - call A1132 ; прочитать из кеша FAT-а номер след. кластера -A19E9: pop bc - ex de,hl ; hl=номер след. кластера - push hl - push bc - call A1CB8 - ld de,(D1CFB) ; буфер - ld a,(disk) ; номер диска - ld b,c ; число секторов - ld c,6 ; запись секторов - rst 18h - jp c,A193B ; ошибка - pop bc - ld hl,(D1CFB) - ld de,(D0081) ; байтов на сектор (512) - add hl,de - dec c - jr nz,$-2 - ld (D1CFB),hl - pop de - jr A19C9 - ; -A1A10: pop bc - ld a,ENOSPACE ; код "нет места на диске" - scf - ret - - -A1A15: xor a - ld (D1CFA),a - ld l,(iy+20h) - ld h,(iy+21h) - add hl,de - exx - ld e,a - ld d,a - ld l,(iy+22h) - ld h,(iy+23h) - adc hl,de - exx - ld c,(iy+1Ch) - ld b,(iy+1Dh) - and a - sbc hl,bc - exx - ld c,(iy+1Eh) - ld b,(iy+1Fh) - sbc hl,bc - exx - ret c - ex de,hl - sbc hl,de - ex de,hl - ld a,-1 - ld (D1CFA),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #13. Чтение из файла. -; -; вход: A - дескриптор файла (0-й = чтение списка диска) -; HL - буфер -; DE - кол-во читаемых байт -; выход: DE - реальное кол-во прочитанных байт -; если CF=0: -; A=0 прочитаны все байты -; A=0FFh прочитано меньшее число байт -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_13:ld (D1D01),hl - ld (D1D03),hl - call search_handle ; поиск дескр. файла - ret c ; не найден - call A1A15 - ld a,d - or e - jp z,A1B02 - push de - ld a,(iy+40) ; номер диска из дескр. - call A2147 - jp c,A1B57 - ld c,(iy+32) ; мл.разряд указателя файла - ld a,(iy+33) ; - ld e,a - and 1 - ld b,a - ld d,(iy+34) ; ст.разряд - ld l,(iy+35) ; - ld h,0 - or a - rr l - rr d - rr e - ld a,b - or c - jp nz,A1B07 -A1A85: pop bc - push bc - srl b - jr z,A1ABA - ld (D1CFD),hl - ld (D1CFF),de - ld ix,(D1D01) - call A1893 - jp c,A1B57 - ld de,(D1D01) - ld hl,(D1CFB) - and a - sbc hl,de - ld c,h - ld b,0 - add hl,de - ld (D1D01),hl - srl c - ld hl,(D1CFF) - add hl,bc - ex de,hl - ld hl,(D1CFD) - ld c,b - adc hl,bc -A1ABA: pop bc - ld a,b - and 1 - ld b,a - or c - jr z,A1AEA - push bc - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h ; порт - out (c),b ; восст. порт - jp c,A1B57 - ld hl,T0400 ; откуда - ld de,(D1D01) - pop bc - ldir - ld (D1D01),de -A1AEA: ld hl,(D1D03) - ld de,(D1D01) - ex de,hl - and a - sbc hl,de - push hl - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,0 - call A184B - pop de -A1B02: ld a,(D1CFA) - or a - ret - ; -A1B07: push bc - push hl - push de - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h - out (c),b ; восст. порт - pop hl - jr c,A1B55 - ld bc,1 ;T0001 - add hl,bc - ex de,hl - pop hl - ld c,b - adc hl,bc - exx - pop de - ld hl,512 ;T0200 ? - and a - sbc hl,de - ld b,h - ld c,l - pop hl - and a - sbc hl,bc - jr nc,A1B42 - add hl,bc - ld b,h - ld c,l - ld hl,0 -A1B42: push hl - ld hl,T0400 ; откуда - add hl,de - ld de,(D1D01) ; куда - ldir - ld (D1D01),de - exx - jp A1A85 - ; -A1B55: pop hl - pop hl -A1B57: pop bc - scf - ret - ; -A1B5A: pop hl -A1B5B: pop hl -A1B5C: pop bc - scf - ret - ; -A1B5F: pop de - ld a,EROFILE ; код "файл r/o" - scf - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #14. Запись в файл. -; -; вход: A - дескриптор файла (0-й = запись списка диска) -; HL - буфер данных -; DE - кол-во записываемых байт -; выход: DE - реальное кол-во записанных байт -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_14:ld (D1D01),hl - ld (D1D03),hl - push de - call search_handle ; поиск дескр. файла - jr c,A1B5C ; не найден - ld a,(iy+41) ; режим доступа к файлу (r,w,r/w) - and 1 ; на чтение - jr nz,A1B5F ; запись не возможна (файл r/o) - set 7,(iy+41) ; уст. признак изменения файла - set 5,(iy+11) ; бит "архивный" в ячейке атрибута - ld a,(iy+40) ; номер диска - call A2147 - jr c,A1B5C - ld c,(iy+32) - ld a,(iy+33) - ld e,a - and 1 - ld b,a - ld d,(iy+34) - ld l,(iy+35) - ld h,0 - or a - rr l - rr d - rr e - ld a,b - or c - jp nz,A1C4E -A1BA7: pop bc - push bc - srl b - jr z,A1BD1 - push hl - push de - push bc - ld ix,(D1D01) - call A193F - pop bc - jp c,A1B5A - ld c,b - ld hl,(D1D01) - ld de,512 ; размер сектора - add hl,de - djnz $-1 - ld (D1D01),hl - pop hl - add hl,bc - ex de,hl - pop hl - ld c,b - adc hl,bc -A1BD1: pop bc - ld a,b - and 1 - ld b,a - or c - jr z,A1C19 - push hl - push de - push bc - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h - out (c),b ; восст. порт - ld de,T0400 ; куда - ld hl,(D1D01) ; откуда - pop bc - jp c,A1B5B - ldir - ld (D1D01),hl - pop de - pop hl - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A193F - pop bc - ld c,0E2h - out (c),b ; восст. порт - ret c -A1C19: ld de,(D1D03) - ld hl,(D1D01) - and a - sbc hl,de - push hl - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,0 - call A184B - call A186D - pop de - ret nc - ld l,(iy+20h) - ld h,(iy+21h) - ld c,(iy+22h) - ld b,(iy+23h) - ld (iy+1Ch),l - ld (iy+1Dh),h - ld (iy+1Eh),c - ld (iy+1Fh),b - and a - ret - ; -A1C4E: push bc - push hl - push de - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A1893 - pop bc - ld c,0E2h - out (c),b ; восст. порт - pop de - pop hl - exx - pop de - jp c,A1B5C - ld hl,512 ;T0200 - and a - sbc hl,de - ld b,h - ld c,l - pop hl - and a - sbc hl,bc - jr nc,A1C81 - add hl,bc - ld b,h - ld c,l - ld hl,0 -A1C81: push hl - ld hl,T0400 ; куда - add hl,de - ld de,(D1D01) ; откуда - ex de,hl - ldir - ld (D1D01),hl - exx - push hl - push de - ld ix,LC400 - ld b,1 - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - call A193F - pop bc - ld c,0E2h - out (c),b ; восст. порт - pop hl - jp c,A1B5B - ld bc,1 ;T0001 - add hl,bc - ex de,hl - pop hl - ld c,b - adc hl,bc - jp A1BA7 - - -A1CB8: dec hl - dec hl - ex de,hl - ld a,(D0083) ; секторов на кластер - ld b,a - ld hl,0 - ld ix,0 -A1CC6: add ix,de - jr nc,$+3 - inc hl - djnz A1CC6 - ld de,(D1506) - add ix,de - ld e,b - ld d,b - adc hl,de - ret - - -A1CD9: db 0DDh - ld h,d - db 0DDh - ld l,e - ex de,hl - ld hl,0 - ld a,32 -A1CE3: add ix,ix - ex de,hl - adc hl,hl - ex de,hl - adc hl,hl - sbc hl,bc - jr nc,A1CF4 - add hl,bc - dec a - jr nz,A1CE3 - ret - ; -A1CF4: inc ix - dec a - jr nz,A1CE3 - ret - - - -D1CFA: db 0 -D1CFB: dw 0 -D1CFD: dw 0 -D1CFF: dw 0 -D1D01: dw 0 -D1D03: dw 0 - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #16. Получение/изменение атрибута файла. -; -; вход: HL - указатель на имя файла -; B - режим доступа: -; B=0 получить атрибут -; B=1 установить атрибут -; A - атрибут файла -; выход: A - атрибут файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_16:inc b - dec b - jr z,A1D12 ; b=0 - dec b - jr z,A1D24 ; b=1 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -; Получить атрибут файла -A1D12: xor a ; атрибут записи - call A1E5F - ret c - ld b,(iy+11) ; атрибут записи из дескр. - push bc - call Func_12 ; закрыть файл - pop bc - ret c - ld a,b - and a - ret - -; Изменить атрибут файла -A1D24: push af - xor a ; атрибут записи - call A1E5F - pop bc - ret c - set 7,(iy+41) ; уст. признак изменения файла - res 3,b ; бит "метка тома" - ld (iy+11),b ; ячейка атрибутов записи - push bc - call Func_12 ; закрыть файл - pop bc - ret c - ld a,b - and a - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #0A. Создание файла. -; -; вход: HL - указатель на имя файла -; A - атрибут файла -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0A:and 11100111b ; маска, скрыть биты dir/label - ld (D1F3A),a ; раб. ячейка - ld (file_name+1),hl ; имя файла - push hl - call search_free_handle ; поиск своб. дескриптора - pop hl - ret c ; не найден - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c ; недоп. имя - call search_rec_file ; поиск записи файла в списке диска - call nc,mark_delete ; найден, пометить запись как "удаленная" - jr A1D7B - - -;///////////////////////////////////////////////////////////////////// -; Функция #0B. Создание нового файла. -; Проверяет, существует ли файл с таким же именем. -; -; вход: HL - указатель на имя файла -; A - атрибут файла -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0B:and 11100111b ; маска, скрыть биты dir/label - ld (D1F3A),a ; раб. ячейка - ld (file_name+1),hl ; имя файла - push hl - call search_free_handle ; поиск своб. дескриптора - pop hl - ret c ; не найден - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c ; недоп. имя - call search_rec_file ; поиск записи файла в списке диска - ld a,EEXIST ; код "файл существует" - ccf - ret c ; найден - ; создать в буфере новую запись -A1D7B: ld hl,T2364 - ld de,T1F3B - ld bc,11 - ldir - ex de,hl - ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) - ld (hl),a ;+11 в записи - inc hl - ld bc,0A00h ; b=10 байт резерва - ld (hl),c - inc hl - djnz $-2 - push hl - call Func_21 ; узнать тек. дату и время - call A2599 ; закодировать время/дату - pop hl - ld (hl),e ;+22 время - inc hl - ld (hl),d - inc hl - ld (hl),c ;+24 дата - inc hl - ld (hl),b - inc hl - ld bc,0600h ; 6 ячеек, № кластера и размер файла - ld (hl),c - inc hl - djnz $-2 - call A1F5B ; скопир. новую запись в список диска (каталога) - call flush_cash_dir ; сбросить кеш каталога на диск - ; открыть созданный файл -file_name: - ld hl,0 ; адрес имени файла - xor a ; на чтение/запись - jp Func_11 ; открыть файл - - - -;///////////////////////////////////////////////////////////////////// -; Функция #0C. Создание файла с уникальным именем. -; В конце строки пути должно быть как минимум 12 байт, -; на размещение созданного имени файла. Сама строка должна -; заканчиваться нулем. -; Если созданный файл уже существует, он обнуляется и откры- -; вается на чтение/запись. -; -; вход: HL - указатель на строку пути (и/или с диском). -; A - атрибут файла -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0C:jp empty__ ; код "не верный номер функции" - ;push af - ;push hl - ; создать уник. имя - ;call Func_21 ; узнать тек. дату и время - ;call A2599 ; закодировать время/дату - ;; bc=дата, de=время - ;ld hl,T2364 ; буфер имени 11 симв. формата - ;ld a,b - ;call byte2dec - ;ld a,c - ;call byte2dec - ;ld a,d - ;call byte2dec - ;ld a,e - ;call byte2dec - ;pop hl - ;push hl - ;; перейти на конец строки - ;xor a - ;ld bc,256 - ;cpir - ;dec hl - ;ex de,hl - ;; добавить имя файла в конец строки - ;ld hl,T2364 ; буфер имени 11 симв. формата - ;ld bc,8 ; имя - ;ldir - ;ex de,hl - ;ld (hl),"." - ;inc hl - ;ld a,"$" ; расш. файла - ;ld (hl),a - ;inc hl - ;ld (hl),a - ;inc hl - ;ld (hl),a - ;inc hl - ;ld (hl),0 - ;pop hl ; имя файла - ;pop af ; атрибут - ;; создать файл - ;jp Func_0A - - -; Цифру в hex-формате в буфер. -; вход: hl=буфер -; a=цифра -;byte2dec: - ;push af - ;rra - ;rra - ;rra - ;rra - ;call $+4 - ;pop af - ;and 0Fh - ;add a,90h - ;daa - ;adc a,40h - ;daa - ;ld (hl),a - ;inc hl - ;ret - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #0E. Удаление файла. -; Файлы "r/o" нельзя стереть данной функцией. -; -; вход: HL - указатель на имя файла -; A - атрибут файла -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_0E:bit 0,a - scf - ld a,EROFILE ; код "файл r/o" - ret nz - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - call A228F ; прочитать список каталога - call search_rec_file ; поиск записи файла в списке диска - ret c ; не найден -; пометить запись как "удаленная" -mark_delete: - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - ld (ix+0),0E5h ; признак удаления файла - ld e,(ix+26) ; № первого кластера - ld d,(ix+27) - out (0E2h),a ; восст. порт - ld a,e - or d - jp z,flush_cash_dir ; сбросить кеш каталога на диск -A1DEA: ex de,hl ; hl=номер кластера - call A1132 ; прочитать из кеша FAT-а номер след. кластера - push de ; номер след. кластера - push af - ld de,0 ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - pop af - pop de - jr nc,A1DEA ; не конец цепочки - call A128B ; подкл. банку кеша FAT и записать его на диск - jp flush_cash_dir ; сбросить кеш каталога на диск - - - -;///////////////////////////////////////////////////////////////////// -; Функция #10. Переименование файла. -; Глобальные символы * и ? в именах файлов не допускаются. -; -; вход: HL - указатель на старое имя файла -; DE - указатель на новое имя файла -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_10:push de - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - pop de - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - push de - call A228F ; прочитать список каталога - ld a,33h ; атрибут "arch + dir + r/o + hidden" - call search_record ; поиск записи в списке диска - pop hl ; 8.3 имя - ret c - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - push ix ; адр. записи переимен. файла - ld a,33h ; атрибут "arch + dir + r/o + hidden" - call search_record ; поиск записи в списке диска - pop ix - ld a,EEXIST ; код "файл существует" - ccf - ret c - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - ld hl,T2364 - db 0DDh - ld d,h - db 0DDh - ld e,l - ld bc,11 - ldir - out (0E2h),a ; восст. порт - jp flush_cash_dir ; сбросить кеш каталога на диск - - -A1E5F: ld (D1F3A),a ; раб. ячейка (здесь атрибут записи) - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld a,37h ; атрибут "все, кроме метки тома" - call search_record ; поиск записи в кэше списка каталога - jr nc,A1E8D ; на поиск своб. дескриптора - ; запись не найдена - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #11. Открытие файла. -; -; вход: HL - указатель на имя файла -; A - режим доступа: -; A=0 чтение/запись -; A=1 чтение -; A=2 запись -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_11:ld (D1F3A),a ; раб. ячейка - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c -A1E89: call search_rec_file ; поиск записи файла в списке диска - ret c ; не найден -A1E8D: call search_free_handle ; поиск своб. дескриптора - ret c ; не найден - ; заполнить структуру дескриптора - ld a,c ; номер своб. дескриптора - ex af,af' - exx - ld (iy+38),e ; de=индекс записи в списке каталога (исп. #11 функ.) - ld (iy+39),d - exx - db 0FDh ; ld de,iy - ld d,h - db 0FDh - ld e,l - ld hl,T1F3B ; 32 байта - ld bc,32 - ldir ; заполнить дескриптор - ld a,(D1F3A) ; режим доступа к файлу (раб. ячейка) - ld (iy+41),a - ld a,(D2E70) ; уровень текущей программы (владелец) - ld (iy+42),a - xor a - ld (iy+32),a - ld (iy+33),a - ld (iy+34),a - ld (iy+35),a - ld a,(disk) ; номер диска - ld (iy+40),a - ld hl,handle+26 ; ячейка № первого кластера - ld e,(hl) - inc hl - ld d,(hl) - ld (iy+36),e ; № первого кластера - ld (iy+37),d - ex af,af' - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #12. Закрытие файла. -; -; вход: A - дескриптор файла -; выход: A - код ошибки, если CF=1 -; -;///////////////////////////////////////////////////////////////////// -Func_12:ld (D1F3A),a ; дескр. (раб. ячейка) - call search_handle ; поиск дескр. файла - ret c ; не найден - ld a,(D2E70) ; уровень текущей программы - cp (iy+42) ; уровень из дескриптора - ld a,EACCES ; код "ресурс не доступен" - scf - ret nz - bit 7,(iy+41) ; флаг изменения файла - jr z,A1F31 ; освоб. дескр. файла - ; файл изменялся - ld d,(iy+36) - ld e,(iy+37) - push de - xor a ; номер дескр. - call search_handle ; поиск дескр. файла - pop de - ld (iy+36),d - ld (iy+37),e - call A228F ; прочитать список каталога - ld a,(D1F3A) ; дескриптор (раб. ячейка) - call search_handle ; поиск дескр. файла - ld hl,LC000 - ld de,32 - ld c,(iy+38) ; bc=индекс записи в списке каталога - ld b,(iy+39) - jr A1F17 - ; -A1F15: add hl,de - dec bc -A1F17: ld a,b - or c - jr nz,A1F15 - db 0FDh - ld d,h - db 0FDh - ld e,l - ex de,hl - push hl - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - pop hl - ld bc,32 - ldir - out (0E2h),a ; восст. порт - call flush_cash_dir ; сбросить кеш каталога на диск -A1F31: ld a,(D1F3A) ; дескр. (раб. ячейка) - jp release_handle ; освоб. дескр. файла - - - -D1F3A: db 0 ; раб. ячейка (режим поиска/доступа/..) - - -; 32 байта. Буфер записи файла/каталога -T1F3B: ds 11 -D1F46: db 0 ;+11 ячейка атрибутов файла - ds 14 -D1F55: dw 0 - ds 4 - - - -;----------------------------------------------------------- -; Скопировать новую запись в кэш списка каталога -;----------------------------------------------------------- -A1F5B: xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld ix,LC000 ; начало списка диска - exx - ld de,0 ; сбр. индекс записи (исп. #11 функ.) - exx -A1F6A: ld a,(ix+0) - or a ; конец списка - jr z,A1F82 - cp 0E5h ; признак удал. записи - jr z,A1F82 - ld bc,32 - add ix,bc ; на след. запись - jr nc,A1F6A - ; за границей 0FFFFh - pop af - out (0E2h),a ; восст. порт - ld a,EROOT ; код "переполнение root-каталога" - scf - ret -; скопир. новую запись в список диска -A1F82: db 0DDh - ld d,h ; de=куда - db 0DDh - ld e,l - ld hl,T1F3B ; откуда 32 байта (новая запись) - ld bc,32 - ldir ; скопир. новую запись в список диска - pop af - out (0E2h),a ; восст. порт - ld hl,LC000 ; начало списка диска - ld bc,(size_cash_directory) - dec bc - add hl,bc - and a - sbc hl,de - ret nc - ld hl,(size_cash_directory) - ld bc,(D1508) ; размер блока "секторов на кластер" - add hl,bc - ld (size_cash_directory),hl - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #44. Преобразовать имя файла (11 -> 8.3 и обратно). -; -; вход: B=0, преобразовать из 11 символьного формата в формат ДОС -; HL - 11 символов имени файла -; DE - буфер для имени в формате ДОС (13 байт) -; B=1, преобразовать из формата ДОС в 11 символьный формат -; HL - имя файла в формате ДОС -; DE - 11 символов имени файла -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_44:inc b - dec b ; b=0 - jr z,A1FB8 ; преобр. имя 11 -> 8.3 формат - dec b ; b=1 - jp z,A2384 ; преобр. имя 8.3 -> 11 формат - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -;------------------------------------------------- -; Преобразовать имя 11 -> 8.3 формат -; -; вход: hl=откуда -; de=куда -;------------------------------------------------- -A1FB8: ld bc,08FFh ; b=счетчик -A1FBB: ld a,(hl) - cp " " - jr nz,A1FC5 - inc hl - djnz $-1 - jr A1FC9 - ; -A1FC5: ldi - djnz A1FBB -A1FC9: ld a,(hl) - cp " " - ld a,"." - jr nz,A1FD2 - ld a,0 -A1FD2: ld (de),a - inc de - ret z - ld b,3 -A1FD7: ld a,(hl) - cp " " - ret z - ldi - xor a - ld (de),a - djnz A1FD7 - ret - - - -D1FE2: dw 0 ; адрес раб. буфера (f_first, f_next) -D1FE4: dw 0 ; адрес след. записи (f_first, f_next) -D1FE6: db false ; флаг отработки "f_first" -D1FE7: db false ; флаг 8.3 или 11 формата имени (f_first, f_next) - - -;///////////////////////////////////////////////////////////////////// -; Функция #19. Поиск первого совпадающего файла. -; -; вход: HL - указатель на имя файла -; DE - рабочий буфер 44 байта, если B=0, иначе 46 байт ;256 байт -; A - атрибуты, используемые при поиске -; B=0 - имя найденного файла в формате 11 байт "FilenameExt" -; B=1 - имя найденного файла в формате DOS "filename.ext",0 -; выход: de'= индекс записи в списке каталога (исп. #11 функ.) -; A - код ошибки, если CF=1 -; -; формат раб. буфера: -; +00 8 db "FILE????" ; шаблон имени -; +08 3 db "???" ; шаблон расширения -; +11 1 db 20h ; атрибуты для поиска -; +12 10 ds 10 ; зарезервировано -; +22 2 dw 0000h ; время создания файла -; +24 2 dw 0000h ; дата создания файла -; +26 2 dw 0000h ; номер первого кластера -; +28 4 dw 0000h ; мл.разряд размер файла в байтах -; dw 0000h ; ст.разряд -; +32 1 db 20h ; атрибут найденного файла -; +33 11 db "FILENAMEEXT" ; имя найденного файла (копия из каталога) -;///////////////////////////////////////////////////////////////////// -Func_19:ld (D1F3A),a ; атрибут поиска - ld (D1FE2),de ; адрес раб. буфера - ld a,b - ld (D1FE7),a ; флаг 8.3 или 11 формата имени - push hl ; имя файла - call A228F ; прочитать список каталога (также указ. в строке) - pop hl - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) - call search_record ; поиск записи в списке диска - ret c ; запись не найдена/слишком много файлов - ld hl,T2364 ; буфер имени 11 симв. формата - ld de,(D1FE2) ; адрес раб. буфера - ld bc,11 - ldir ; перекачать "???????.." - ld a,(D1F3A) ; раб. ячейка (здесь атрибут записи) - ld (de),a ;+11 раб. буфер функции -A201D: inc de - ld bc,32 - add ix,bc - ld (D1FE4),ix ;; след. запись - ld hl,T1F3B+12 ; смещ. в записи - ld bc,20 - ldir - ld a,(T1F3B+11) ; ячейка атрибутов файла - ld (de),a ;+32 в раб. буфере функции - inc de - ld hl,T1F3B ; найденная запись файла/каталога - ld a,(D1FE7) ; флаг 8.3 или 11 формата имени - or a - jr nz,A2049 ; 11 -> 8.3 - ; скопир. имя найд. файла (формат 11) - ld bc,11 - ldir -A2042: ld a,true - ld (D1FE6),a ; флаг отработки "F_FIRST" - xor a - ret - ; преобр. 11 -> 8.3 формат -A2049: call A1FB8 - jr A2042 - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1A. Поиск следующего совпадающего файла. -; -; вход: de = указатель на рабочий буфер -; выход: de'= индекс записи в списке каталога (исп. #11 функ.) -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1A:ld a,(D1FE6) ; флаг отработки "F_FIRST" - or a - ld a,EUNOPER ; код "невозможная операция" - scf - ret z - ld (D1FE2),de ; адрес раб. буфера - ld hl,T2364 ; буфер имени 11 симв. формата - ex de,hl - ld bc,11 - ldir - xor a - ld (D1FE6),a ; сбр. флаг отработки "f_first" - ld a,(hl) ; ячейка атрибутов записи - push hl - call A207B ; найти след. запись - pop de - ret c ; не найдена или слишком много файлов - jr A201D ; скопир. остальные 20 байт записи - - - -; поиск след. записи -A207B: ex af,af' ; сохр. атрибуты записи - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ex af,af' ; восст. атрибуты записи - cpl - ld c,a - exx - ld de,0 ; сбр. индекс записи (исп. #11 функ.) - exx - ld ix,(D1FE4) ;; адрес след. записи - db 0DDh - ld a,h - db 0DDh - or l - jr z,search_record_too_many ; вышли за границу 0FFFFh - jr search_record_loop ; на цикл поиска записи - - - - -;------------------------------------------------- -; Поиск записи каталога в списке каталога -; -; вход: a=атрибут записи -; выход: de'=индекс записи в списке каталога -; CF - каталог не найден -;------------------------------------------------- -search_rec_dir: - ld a,10h ; атрибут "dir" - call search_record - ret nc - ld a,ENOPATH ; код "неверный путь" - ret - - -;------------------------------------------------- -; Поиск записи файла в списке каталога. -; -; вход: a=атрибут записи -; выход: ix=адрес найденной записи -; de'=индекс записи в списке каталога (для #11 функ.) -; CF - при ошибке, A=код ошибки -;------------------------------------------------- -search_rec_file: - ld a,27h ; атрибут "все, кроме папки и метки тома" -search_record: - ex af,af' ; сохр. атрибут записи - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ex af,af' ; восст. атрибут записи - cpl - ld c,a - ld ix,LC000 ; кэш списка каталога диска - exx - ld de,0 ; сбр. индекс записи (исп. #11 функ.) - exx - ; цикл поиска записи -search_record_loop: - ld a,(ix+0) - or a - jr z,search_record_not_found - cp 0E5h ; код удал. записи - jp z,search_record_next - ld a,(ix+11) ; атрибут записи - and c ; искомый атрибут ? - jp nz,search_record_next ; нет - ld hl,T2364 ; готовое имя файла (11 симв. формат) - db 0DDh - ld d,h - db 0DDh - ld e,l - ld b,11 - ex de,hl -A20C9: ld a,(de) - cp "?" - jr z,A20D1 - cp (hl) - jp nz,search_record_next -A20D1: inc hl - inc de - djnz A20C9 - db 0DDh - ld d,h - db 0DDh - ld e,l - ld hl,T1F3B ; 32 буфер записи - ex de,hl - ld bc,32 - ldir ; скопир. найденную запись в буфер - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -search_record_next: - exx - inc de ; ++индекс записи (исп. #11 функ.) - exx - ld de,32 - add ix,de ; на след. запись - jp nc,search_record_loop - ; выход за границу 0FFFFh -search_record_too_many: - ld e,ETMFILE ; код "слишком много файлов" - jr $+4 -search_record_not_found: - ld e,ENOFILE ; код "файл не обнаружен" - pop af - out (0E2h),a ; восст. порт - ld a,e ; код ошибки - scf - ret - - -;------------------------------------------------- -; Тест на допустимое имя и настроиться на диск. -; вход: hl=строка имени -;------------------------------------------------- -A20F8: ld de,D213A ; куда - ld bc,0DFFh ; b=счетчик -A20FE: ld a,(hl) - inc hl - cp '\' - jr z,A2114 - cp ":" - jr z,A2122 - ld (de),a - inc de - cp " "+1 - ccf - ret nc - djnz A20FE - ld a,EINVFNAM ; код "неверное имя" - scf - ret - ; -A2114: ld a,0 - ld (de),a - push hl - ld hl,D213A - call A2164 - pop hl - jr nc,A20F8 - ret - ; -A2122: ld a,(D213A) ; буква диска - cp "a" - jr c,A212F - cp "z"+1 - jr nc,A212F - sub 20h -A212F: sub "A" - push hl - call A2147 - pop hl - jr nc,A20F8 - ret - - -; Буфер имени 8.3 формата -D213A: db " ",0 ; 12 пробелов - - - -A2147: push af ; номер девайса - ld c,1 ; открыть девайс - rst 18h - pop bc - jr c,A215C ; ошибка - ld a,b - ld (disk),a ; номер диска - call A1370 - ret c - ld a,(last_drive) ; номер посл. диска - and a - ret - ; -A215C: cp EINVDRV ; код "bad drive number" - scf - ret z - ld a,ENORDY ; код "нет готовности" - scf - ret - - -A2164: xor a ; номер дескр. - call search_handle ; поиск дескр. файла - ld a,(hl) ; 8.3 имя - or a - jr nz,A2183 -A216D: ld de,0 - ld (iy+26),e - ld (iy+27),d - call A228F ; прочитать список каталога - ld hl,T1510 ; буфер тек. пути (каталога) системы - ld (hl),'\' - inc hl - ld (hl),0 - and a - ret - ; -A2183: cp "." - jr nz,A21AF - ld a,(iy+26) - or (iy+27) - jr nz,A2195 - inc hl - ld a,(hl) - or a - dec hl - jr z,A216D -A2195: exx - ld hl,T2364 - ld de,T2364+1 - ld bc,10 - ld (hl)," " - ldir - exx - ld de,T2364 -A21A7: ldi - ld a,(hl) - or a - jr nz,A21A7 - jr A21B6 - ; -A21AF: ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c -A21B6: call A21DC - ret c - ld (iy+26),e - ld (iy+27),d - ld de,L4000 - ld (iy+28),e - ld (iy+29),d - call A228F ; прочитать список каталога - and a - ret - - - -A21CE: ld bc,32 - add ix,bc ; на след. запись - jr nc,A21E6 - ; превышение границы #FFFF -A21D5: pop af - out (0E2h),a ; восст. порт - ld a,ENOPATH ; код "неверный путь" - scf - ret - ; -A21DC: xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld ix,LC000 ; кеш списка каталога -A21E6: ld a,(ix+0) - or a - jr z,A21D5 ; список пустой - cp 0E5h - jr z,A21CE ; файл удален - ld a,(ix+11) ; ячейка атрибутов - and 10h ; каталог ? - jr z,A21CE ; нет, на след. запись - ; каталог - ld hl,T2364 - db 0DDh - ld d,h - db 0DDh - ld e,l - ex de,hl - ld b,11 -A2201: ld a,(de) - cp "?" - jr z,A2209 - cp (hl) - jr nz,A21CE ; на след. запись -A2209: inc hl - inc de - djnz A2201 - ld a,(ix+0) - cp "." - jr nz,A2245 - ld a,(ix+1) - cp "." - jr nz,A223A - ; родит. каталог - ld hl,T1510 ; буфер тек. пути (каталога) системы - ld d,h - ld e,l - ld bc,256 - xor a - cpir - ld bc,256 - ld a,'\' - cpdr - inc hl - and a - ex de,hl - sbc hl,de - ex de,hl - jr nz,A2238 - inc hl -A2238: ld (hl),0 -A223A: ld e,(ix+26) - ld d,(ix+27) - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -A2245: db 0DDh - ld e,l - db 0DDh - ld d,h - ld hl,T1510 ; буфер тек. пути (каталога) системы - ld bc,255 - xor a - cpir - dec hl - dec hl - ld a,'\' - cp (hl) - inc hl - jr z,$+4 - ld (hl),a - inc hl - ld bc,0820h ; b=счетчик, c=пробел -A225F: ld a,(de) - inc de - cp c - jr z,A2266 - ld (hl),a - inc hl -A2266: djnz A225F - ld a,(de) - inc de - cp c - jr z,A227F - ld (hl),"." - inc hl - ld (hl),a - inc hl - ld a,(de) - inc de - cp c - jr z,A227F - ld (hl),a - inc hl - ld a,(de) - cp c - jr z,A227F - ld (hl),a - inc hl -A227F: ;ld (hl),'\' ; ; концовка пути - ;inc hl; - ld (hl),0 - jr A223A - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1E. Информация о текущем каталоге. -; -; вход: HL - буфер в памяти 256 байт -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1E:ex de,hl ; de=куда - ld hl,T1510 ; откуда ; CurrentDirectory - ld a,(hl) - or a - ldi - jr nz,$-4 - ret - - - -;------------------------------------------------- -; Прочитать список каталога -;------------------------------------------------- -A228F: xor a - ld l,a - ld h,a - push hl - pop ix - ld b,a ; от начала файла - call Func_15 ; перемещение указателя в файле - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ; очистить кеш каталога -/* ld hl,LC000 ;@@ - ld de,LC000+1 - ld bc,4000h-1 - ld (hl),l - ldir ; 21 * #3FFF = 344.043 -*/ ld (.stack),sp ; сохр. стек - ld de,0 ; байты заполнения - ld bc,400h / 2 - ld sp,0000h ; откуда (вниз) -.loop: push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - push de - dec bc - ld a,c - or b - jp nz,.loop - db 31h ; ld sp,.. -.stack: dw 0 - ; - ld a,(disk) ; номер диска - ld (iy+40),a ; сохр. в дескриптор - ld d,(iy+26) ; de=номер первого кластера - ld e,(iy+27) - ld a,d - or e - jr z,A22D2 ; root ?? - ld hl,LC000 ; куда - ld de,4000h ; сколько - xor a ; дескриптор - call Func_13 ; чтение из файла - ld (size_cash_directory),de ; число прочит. байтов - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -A22D2: ld hl,(D1500) ; ст. разряд - ld ix,(D1502) ; номер лог. сектора - ld a,(D1505) - ld b,32 ; размер root-каталога - sub b - jr nc,A22E3 - add a,b - ld b,a ; число секторов -A22E3: ld a,(disk) ; номер диска - ld c,5 ; чтение секторов - ld de,LC000 ; буфер - rst 18h - pop af - out (0E2h),a ; восст. порт - and a - ret - - - -;------------------------------------------------- -; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -;------------------------------------------------- -flush_cash_dir: - xor a - ld l,a - ld h,a - push hl ; ст. разряд - pop ix ; мл. разряд - ld b,a ; от начала файла - call Func_15 ; перемещение указателя в файле - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld a,(disk) ; номер диска - ld (iy+40),a ; сохр. в дескрипторе - ld d,(iy+26) ; de=номер первого кластера - ld e,(iy+27) - ld a,d - or e - jr z,A2325 ; root ?? - ld hl,LC000 ; откуда - ld de,(size_cash_directory) ; сколько - xor a ; дескр. - call Func_14 ; запись в файл - pop af - out (0E2h),a ; восст. порт - and a - ret - ; -A2325: ld hl,(D1500) ; ст. разряд - ld ix,(D1502) ; лог. номер сектора - ld a,(D1505) - ld b,32 ; макс. число секторов ? - sub b - jr nc,$+4 - add a,b - ld b,a ; число секторов - ld a,(disk) ; номер диска - ld c,6 ; запись секторов - ld de,LC000 ; буфер - rst 18h - pop af - out (0E2h),a ; восст. порт - and a - ret - - -size_cash_directory: - dw 0 ; размер списка каталога - - - - -;----------------------------------------------------------- -; Подключить банку расширения ДОС в 3-е окно -; -; вход: a=лог. номер банки (0..2, в данной версии ДОС) -; выход: a=старая банка порта -;----------------------------------------------------------- -set_dos_page: - ld c,a - ld b,0 - ld hl,list_dos_pages ; 16 байт, номера банок расширения ДОС - add hl,bc - in a,(0E2h) ; сохр. порт - ld c,0E2h ; порт - outi ; один байт (hl) -> порт (bc) - ret - - -; Массив лог. номеров банок расширения ДОС. 16 байт. -list_dos_pages: - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - db -1 - - - -; Буфер 11 симв. имени (первые 11 байт) -T2364: ds 8 ; имя файла -T236C: ds 3 ; расш. - ; - ds 21 ; 11+21=32 - - -;------------------------------------------------- -; Преобразовать имя 8.3 -> 11 формат -; вход: hl = 8.3 имя -; de = буфер имени 11 симв. формата -; при ошибке CF - недоп. имя -;------------------------------------------------- -A2384: push hl - push de - ld h,d - ld l,e - inc de - ld (hl)," " - ld bc,10 - ldir - pop de - pop hl - ld a,(hl) - cp "." - scf - jr z,A239A - cp " "+1 -A239A: ld a,EINVFNAM ; код "неверное имя" - ret c - ld bc,0902h ; b=счетчик -A23A0: ld a,(hl) - cp " "+1 - ccf - ret nc - cp '"' - jr z,A23E9 ; ошибка - cp "*" - jr z,A23ED - cp "+" - jr z,A23E9 ; ошибка - cp "," - jr z,A23E9 ; ошибка - cp "." - jr z,A23FE - cp "/" - jr z,A23E9 ; ошибка - cp ":" - jr z,A23E9 ; ошибка - cp ";" - jr z,A23E9 ; ошибка - cp "<" - jr z,A23E9 - cp "=" - jr z,A23E9 - cp ">" - jr z,A23E9 - cp "[" - jr z,A23E9 - cp '\' - jr z,A23E9 - cp "]" - jr z,A23E9 - cp "|" - jr z,A23E9 - call upper ; a..z -> A..Z - ld (de),a - inc hl - inc de - djnz A23A0 -A23E9: ld a,EINVFNAM ; код "неверное имя" - scf - ret - ; -A23ED: ld a,"?" - inc hl - djnz A23F6 - jr A23E9 - ; -A23F6: ld (de),a - inc de - djnz A23F6 - ld b,1 - jr A23A0 - -A23FE: ld a," " - inc hl - djnz A240D -A2403: ld b,4 - dec c - jr nz,A23A0 - jr A23E9 ; код "неверное имя" - ; -A240D: ld (de),a - inc de - djnz A240D - jr A2403 - - - -; a..z -> A..Z -upper: cp "a" - ret c - cp "z"+1 - jr nc,A2425 - sub 20h - ret - ; -A2425: cp "а" ; русская - ret c - cp "п"+1 - jr nc,A2430 - sub 20h - ret - ; -A2430: cp "р" ; русская - ret c - cp "Ё" - jr nc,A243B - sub 50h - ret - ; -A243B: cp "ё" - ret nz - dec a ; ё -> Ё - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #21. Текущая дата и время. -; -; вход: нет -; выход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; C - день недели -;///////////////////////////////////////////////////////////////////// -Func_21:ld c,0F5h - rst 08h - jp c,A24D0 - ld d,7 ; номер регистра - call A24BB ; чтение регистров CMOS - push af - ld d,8 - call A24BB - pop de - ld e,a - push de - ld d,4 - call A24BB - push af - ld d,2 - call A24BB - pop de - ld e,a - push de - ld d,0 - call A24BB - push af - ld d,6 - ld c,0F6h - rst 08h - pop de - ld e,a - push de - ld d,9 - call A24BB - push af - ld d,32h - ld c,0F6h - rst 08h - db 0DDh - ld h,a - pop af - cp 80 ;50h - push af - jr c,A248B - ld a,19h - db 0DDh - cp h - jr z,A249A - jr A2491 - ; -A248B: ld a,20h - db 0DDh - cp h - jr z,A249A -A2491: push af - ld d,32h - ld c,0F7h - rst 08h - pop af - db 0DDh - ld h,a -A249A: pop af - db 0DDh - ld l,a - db 0DDh - ld a,h - call A24BE - ld l,a - ld h,0 - ld c,l - ld b,h - db 0DDh - ld h,b - add hl,hl - add hl,hl - add hl,bc - add hl,hl - ld b,h - ld c,l - add hl,hl - add hl,hl - add hl,bc - add hl,hl - ex de,hl - add ix,de - pop bc - pop hl - pop de - and a - ret - - -; Чтение регистров CMOS -; вход: d=номер регистра -A24BB: ld c,0F6h - rst 08h -A24BE: ld e,a - rrca - rrca - rrca - rrca - and 0Fh - ld d,a - add a,a - add a,a - add a,d - add a,a - ld d,a - ld a,e - and 0Fh - add a,d - ret - - -A24D0: ld de,(D255D) - ld hl,(D255F) - ld bc,(D2561) - ld ix,(D2563) - and a - ret - - -A24E1: ld c,0 - ld (D255D),de - ld (D255F),hl - ld (D2561),bc - ld (D2563),ix - and a - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #22. Установить текущую дату и время. -; -; вход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_22:push ix - push bc - push hl - push de - ld c,0F5h - rst 08h - jr c,A24E1 - pop af - push af - ld d,7 ; номер регистра - call A2544 ; запись регистров CMOS - pop bc - ld a,c - ld d,8 - call A2544 - pop af - push af - ld d,4 - call A2544 - pop bc - ld a,c - ld d,2 - call A2544 - pop af - push af - ld d,0 - call A2544 - pop bc - ld a,c - ld d,6 - ld c,0F7h - rst 08h - pop hl - xor a - ld de,100 -A252E: inc a - sbc hl,de - jr nc,A252E - add hl,de - dec a - push hl - ld d,32h - call A2544 - pop bc - ld a,c - ld d,9 - call A2544 - and a - ret - - -; Запись регистров CMOS -; вход: d=номер регистра -A2544: call A254B - ld c,0F7h - rst 08h - ret - ; -A254B: ld bc,0AFFh ; константа -A254E: inc c - sub b - jr nc,A254E - add a,b - ld b,a - ld a,c - rlca - rlca - rlca - rlca - and 0F0h - or b - ret - - -; Дата по-умолчанию -D255D: dw 0101h ; день:месяц -D255F: dw 0000h ; часы:минуты -D2561: dw 0001h ; 00h=секунды -D2563: dw 2005 ; год - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #17. Информация о дате и времени файла. -; -; вход: A - дескриптор файла -; выход: D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_17:call search_handle ; поиск дескр. файла - ret c ; не найден - ; время/дату из структуры дескр. - ld e,(iy+22) ; время - ld d,(iy+23) ; - ld c,(iy+24) ; дата - ld b,(iy+25) ; - call A25C3 ; раскодировать время/дату - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #18. Изменение даты и времени файла. -; -; вход: A - дескриптор файла -; D - день -; E - месяц -; IX - год -; H - час -; L - минуты -; B - секунды -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_18:push af - call A2599 ; закодировать время/дату - pop af ; дескриптор - push de - push bc - call search_handle ; поиск дескр. файла - pop bc - pop de - ret c ; не найден - ; время/дату в структуру дескр. - ld (iy+22),e ; время - ld (iy+23),d ; - ld (iy+24),c ; дата - ld (iy+25),b ; - set 7,(iy+41) ; уст. признак изменения файла - and a - ret - -;------------------------------------------------- -; Закодировать время/дату -; вход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; выход: de - время -; bc - месяц/день -; ix - год -;------------------------------------------------- -A2599: ld a,l - rlca - rlca - sla a - rl h - sla a - rl h - sla a - rl h - srl b - or b - ld l,a - ld bc,-1980 - add ix,bc - ld a,e - rlca - rlca - rlca - rlca - and 0F0h - db 0DDh - ld b,l - sla a - rl b - or d - ld c,a - ex de,hl - and a - ret - - -;------------------------------------------------- -; Раскодировать время/дату -; вход: de - время -; bc - месяц/день -; ix - год -; выход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -;------------------------------------------------- -A25C3: ex de,hl - ld a,c - and 1Fh - ld d,a - srl b - rr c - ld a,c - rrca - rrca - rrca - rrca - and 0Fh - ld e,a - ld c,b - ld b,0 - ld ix,1980 - add ix,bc - ld a,l - and 1Fh - add a,a - ld b,a - srl h - rr l - srl h - rr l - srl h - rr l - srl l - srl l - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1D. Смена текущего каталога. -; Меняет текущий каталог и текущий диск, если он указан в файловой -; спецификации. Если путь начинается с "\" - это означает путь от -; корневого каталога, иначе от текущего. -; -; вход: HL - указатель на имя каталога -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_1D:call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A - ld a,(hl) - or a - call nz,A2164 - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1B. Создание каталога. -; -; вход: HL - указатель на имя каталога -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1B:call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - call A228F ; прочитать список каталога - call search_rec_dir ; поиск записи каталога в списке диска - ld a,EEXISDIR ; код "каталог существует" - ccf - ret c ; каталог найден - call A10FD - ret c - push hl - ld de,(D150E) ; номер кластера - call A11C4 ; записать в кеш FAT-а номер кластера - call A128B ; подкл. банку кеша FAT и записать его на диск - ld hl,T2364 - ld de,T1F3B - ld bc,11 - ldir - ex de,hl - ld a,10h ; атрибут записи каталога - ld (hl),a - inc hl - ld bc,0A00h ; b=счетчик - ld (hl),c - inc hl - djnz $-2 - push hl - call Func_21 ; узнать тек. дату и время - call A2599 ; закодировать время/дату - pop hl - ld (hl),e ; de=время - inc hl - ld (hl),d - inc hl - ld (hl),c ; день - inc hl - ld (hl),b ; месяц - inc hl - pop de - push de - ld (hl),e - inc hl - ld (hl),d - inc hl - ld bc,0400h ; b=счетчик - ld (hl),c - inc hl - djnz $-2 - call A1F5B ; скопир. новую запись в список диска (каталога) - call flush_cash_dir ; сбросить кеш каталога на диск - ld hl,T0400 ; буфер - ld (hl),"." ; запись тек. каталога - ld bc,0A20h ; b=счетчик, c=пробел - inc hl - ld (hl),c - djnz $-2 - inc hl - ld de,T1F3B+11 ; ячейка атрибутов файла - ex de,hl - ld bc,21 - ldir - ex de,hl - ld (hl),"." ; запись родит. каталога - inc hl - ld (hl),"." - ld bc,0920h ; b=счетчик, c=пробел - inc hl - ld (hl),c - djnz $-2 - inc hl - push hl - xor a ; лог. номер стр. (кэш списка каталога) - call set_dos_page ; подключить банку расширения ДОС - pop hl - push af ; старая банка порта - ld a,(LC000) - cp "." - ld de,LC000+11 ; атрибуты записи - jr z,A26A9 - ld ix,T1F3B - xor a - ld (ix+26),a - ld (ix+27),a - ld de,T1F3B+11 ; ячейка атрибутов файла -A26A9: ex de,hl - ld bc,21 - ldir - pop af - out (0E2h),a ; восст. порт - ex de,hl - ld d,h - ld e,l - inc de - ld (hl),0 - ld bc,447 - ldir - pop hl - call A1CB8 - ld a,(D0083) ; секторов на кластер -A26C4: push af - push hl ; ст. разряд - push ix ; номер лог. сектора - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - ld de,LC400 ; буфер - ld b,1 ; число секторов - ld a,(disk) ; номер диска - ld c,6 ; запись секторов - rst 18h - pop af - out (0E2h),a - ld hl,T0400 ; откуда - ld de,T0400+1 ; куда - ld bc,512-1 - ld (hl),0 - ldir - pop ix - pop hl - inc ix - db 0DDh - ld a,h - db 0DDh - or l - jr nz,$+3 - inc hl - pop af - dec a - jr nz,A26C4 - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #1C. Удаление каталога. -; Можно удалить только пустой каталог. -; -; вход: HL - указатель на имя каталога -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_1C:call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - ld hl,T2364 - ld bc,11 - ld a,"?" - cpir - ld a,EINVFNAM ; код "неверное имя" - scf - ret z - call A228F ; прочитать список каталога - call search_rec_dir ; поиск записи каталога в списке диска - ret c ; не найден - ld hl,(D1F55) - push ix -A2724: push hl - call A1CB8 - ld a,(D0083) ; секторов на кластер -A272B: push af - push hl ; ст. разряд - push ix ; номер лог. сектора - in a,(0E2h) - push af - in a,(82h) - out (0E2h),a - ld de,LC400 ; буфер - ld bc,0105h ; чтение одного сектора - ld a,(disk) ; номер диска - rst 18h - pop af - out (0E2h),a - ld b,16 - ld hl,T0400 -A2748: ld a,(hl) - or a - jr z,A2783 - cp "." - jr z,A2761 - cp 0E5h ; байт удаления файла - jr z,A2761 - ld de,11 ; смещ. до байта атрибутов - add hl,de - ld a,(hl) - sbc hl,de - ;bit 3,a ;@@ бит "метка тома" - and 00001000b ; 7 тактов - jr z,A278A -A2761: ld de,32 - add hl,de - djnz A2748 - pop ix - pop hl - inc ix - db 0DDh - ld a,h - db 0DDh - or l - jr nz,$+3 - inc hl - pop af - dec a - jr nz,A272B - pop hl ; номер кластера - call A1132 ; прочитать из кеша FAT-а номер след. кластера - ex de,hl ; hl=номер след. кластера - jr nc,A2724 ; не конец цепочки -A277E: pop ix - jp mark_delete ; пометить запись как "удаленная" - ; -A2783: pop ix - pop hl - pop af - pop hl - jr A277E - ; -A278A: pop ix - pop hl - pop af - pop hl - pop ix - ld a,ENOEMPTY ; код "каталог не пуст" - scf - ret - - - - -D2795: dw 0 - - -;///////////////////////////////////////////////////////////////////// -; Функция #47. Получение информации приложения. -; -; вход: HL - буфер данных -; B - номер подфункции: -; B=0 - получение параметров командной строки -; B=1 - получение полного пути к каталогу программы -; B=2 - получение полного пути и имени файла программы -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_47: inc b - djnz A27A8 - ex de,hl - xor a - ld (de),a - ld hl,(D2795) - ld c,(hl) - inc c - ret z - inc hl - ldir - and a - ret - -; Получение параметров командной строки -A27A8: djnz A27CF - ex de,hl - ld hl,(D2795) - ld c,(hl) - inc hl - add hl,bc - inc hl - inc hl - push hl - ld bc,256 - xor a - cpir - ld a,'\' - cpdr - inc hl - inc hl - pop bc - and a - sbc hl,bc - ld a,b - ld b,h - ld h,a - ld a,c - ld c,l - ld l,a - ldir - xor a - ld (de),a - ret - -; Получение полного пути к каталогу программы -A27CF: djnz A27E1 - ex de,hl - ld hl,(D2795) - ld c,(hl) - inc hl - add hl,bc - inc hl - inc hl -A27DA: ld a,(hl) - ldi - or a - jr nz,A27DA - ret - ; -A27E1: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #45. Разбор командной строки. -; -; вход: HL - указатель командной строки -; DE - указатель на буфер пользователя -; B - номер подфункции: -; 0 - Разобрать строку -; 1 - Выделить имя диска -; 2 - Выделить директорию -; 3 - Выделить имя файла -; 4 - Выделить расширение файла -; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла -; 6 - Зарезервировано -; 7 - Выделить параметр командной строки -; 8 - Преобразовать из 11 символьного формата в формат ДОС -; 9 - Преобразовать из формата ДОС в 11 символьный формат -; выход: нет -;///////////////////////////////////////////////////////////////////// -Func_45:exx - ld hl,T0400 - ld (D2947),hl - ld hl,T2952 - ld (D2943),hl - ld hl,T295F - ld (D2945),hl - ld hl,T2949 - ld (D2941),hl - exx - inc b - dec b - jr z,A2857 ; разобрать строку - dec b - jr z,A2825 ; выделить имя диска - dec b - jr z,A2845 ; выделить директорию - dec b - jr z,A284B ; выделить имя файла - dec b - jr z,A2851 ; выделить расширение файла - dec b - jr z,A2859 ; выделить диск, путь, файл и расш. - dec b ; зарезервировано - jr z,A2821 - dec b - jp z,Func_43 ; выделить параметр ком-строки - dec b - jp z,A1FB8 ; преобр. имя 11 -> 8.3 формат - dec b - jp z,A2384 ; преобр. имя 8.3 -> 11 формат -A2821: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -; Выделить имя диска -A2825: ld (D2941),de - call A287C - ret c - ld de,(D2941) - ld a,(de) - dec a - cp -1 - ret z - cp "@" - jr c,A2841 - cp "Z" - jr nc,A2841 - sub "A"-1 - ret - ; -A2841: ld a,EINVDRV ; код "не верный номер устройства" - scf - ret - -; Выделить директорию -A2845: ld (D2947),de - jr A287C - -; Выделить имя файла -A284B: ld (D2943),de ; куда - jr A287C - -; Выделить расширение файла -A2851: ld (D2945),de - jr A287C - -; Разобрать строку -A2857: jr A287C - -; Выделить диск, путь, файл и расш. -A2859: ex de,hl - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (D2941),bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (D2947),bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (D2943),bc - ld c,(hl) - inc hl - ld b,(hl) - ld (D2945),bc - ex de,hl - jr A287C - - -A287C: ex af,af' - exx - xor a - ld hl,(D2947) - ld (hl),a - ld hl,(D2943) ; адрес буфера под имя файла - ld (hl),a - ld hl,(D2945) - ld (hl),a - ld hl,(D2941) - ld (hl),a - exx - ex af,af' -A2891: ld de,T2934 - ld bc,0D01h ; счетчики -A2897: ld a,(hl) - call upper ; a..z -> A..Z - ld (de),a - inc hl - inc de - inc c ; ++счетчик - cp '\' - jr z,A2916 - cp ":" - jr z,A2900 - cp " "+1 - jr c,A28BF - cp "?" - jr z,A28B9 - cp "*" - jr z,A28B9 -A28B3: djnz A2897 - ld a,EINVFNAM ; код "неверное имя" - scf - ret - ; -A28B9: ex af,af' - set 7,a - ex af,af' - jr A28B3 - ; -A28BF: ld a,2 - cp c - jr z,A28FD - push hl - ld hl,T2934 - ld de,(D2943) ; адрес буфера под имя файла - ld b,0 - dec c - dec c - ld a,c - ldir - ld c,a - xor a - ld (de),a - ld hl,(D2943) ; адрес буфера под имя файла - ld a,"." - cpir - jr nz,A28F8 - ld c,3 - ld de,(D2945) -A28E5: ld a,(hl) - or a - jr nz,A28EC - ld a," " - dec hl -A28EC: ld (de),a - inc hl - inc de - dec c - jr nz,A28E5 - xor a - ld (de),a - ex af,af' - set 1,a ; указано расш. файла - ex af,af' -A28F8: ex af,af' - set 0,a ; указано имя файла - ex af,af' - pop hl -A28FD: ex af,af' - and a - ret - - -A2900: xor a - ld (de),a - push hl - ld hl,T2934 - ld de,(D2941) - ld b,0 - ldir - pop hl - ex af,af' - set 3,a ; указано имя диска - ex af,af' - jp A2891 - - -A2916: xor a - ld (de),a - push hl - push bc - ld hl,(D2947) - ld bc,255 - cpir - dec hl - ex de,hl - ld hl,T2934 ; 12 пробелов - pop bc - ld b,0 - ldir - pop hl - ex af,af' - set 2,a ; указан путь файла - ex af,af' - jp A2891 - - - -T2934: db " ",0 ; 12 пробелов - - -D2941: dw T2949 -D2943: dw T2952 -D2945: dw T295F -D2947: dw T0400 ; 512 байт, ".", ".." записи - - -T2949: ds 9 - -T2952: db " ",0 ; 9 пробелов - -T295F: db " ",0 - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #43. Выделить параметр командной строки. -; -; вход: HL - указатель командной строки -; DE - буфер для выдел. параметра -; выход: HL - указатель на след. параметр ком-строки -; CF=0 - конец строки не достигнут (есть другие параметры) -; CF=1 - конец строки (в буфер перенесён последний параметр или ноль) -;///////////////////////////////////////////////////////////////////// -Func_43:xor a - ld (de),a -A2965: ld a,(hl) - inc hl - cp " " - ret c - jr z,A2965 -A296C: ld (de),a - ld a,(hl) - inc hl - inc de - cp " "+1 - jr nc,A296C - cp " " - ld a,0 - ld (de),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3C. Информация о памяти. -; -; вход: нет -; выход: HL - общее кол-во страниц -; BC - кол-во своб. страниц -;///////////////////////////////////////////////////////////////////// -Func_3C:ld c,0C0h - rst 08h - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3D. Выделение блока памяти. -; -; вход: B - размер блока в страницах по 16kB -; выход: A - идентификатор блока памяти, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3D:ld c,0C2h - rst 08h - ld e,a - ld a,ENOMEM ; код "не хватает памяти" - ret c - ld d,0 - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - ld a,(D2E70) ; уровень текущей программы - ld (hl),a - ld a,e - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3E. Освобождение блока памяти. -; -; вход: A - идентификатор блока памяти -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3E:ld e,a - ld d,0 - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - ld a,(D2E70) ; уровень текущей программы - cp (hl) - ld a,EINVMEM ; код "не существующий блок памяти" - scf - ret nz - push de - ld a,e - ld c,0C3h - rst 08h - pop de - ld a,EINVMEM ; код "не существующий блок памяти" - ret c - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - xor a - ld (hl),a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #3F. Изменение блока памяти. -; -; вход: A - идентификатор блока памяти -; B - новый размер блока -; выход: A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3F:ld e,a - ld d,0 - ld hl,list_pages ; массив списка выдел. страниц - add hl,de - ld a,(D2E70) ; уровень текущей программы - cp (hl) - ld a,EINVMEM ; код "не существующий блок памяти" - scf - ret nz - ld d,b - push de - ld a,e - call A29EE - pop de - ld a,EINVMEM ; код "не существующий блок памяти" - ret c - ld a,b - cp d - ret z - jr c,A29DB - ld b,d - ld a,e - ld c,9Dh - rst 08h - ld a,b - ld c,0C3h - rst 08h - xor a - ret - ; -A29DB: ld a,d - sub b - ld b,a - ld c,e - push bc - ld c,0C2h - rst 08h - pop bc - ld b,a - ld a,ENOMEM ; код "недостаточно памяти" - ret c - ld a,c - ld c,9Eh - rst 08h - xor a - ret - -A29EE: ld b,-1 - ld c,a -A29F1: inc b - push bc - ld a,c - ld c,0C4h - rst 08h - pop bc - jr nc,A29F1 - or a - scf - ret z - xor a - ret - -A29FF: ld hl,list_pages ; массив списка выдел. страниц - ld bc,256 -A2A05: ld a,(D2E70) ; уровень текущей программы - cpir - ret nz - push hl - push bc - dec hl - and a - ld de,256 - sbc hl,de - ld a,l - call Func_3E ; освоб. блок памяти - pop bc - pop hl - jr A2A05 - - - -;///////////////////////////////////////////////////////////////////// -; Функция #38. Подключение страницы памяти. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_38:bit 7,h - jr z,Func_39 ; в 1-е - bit 6,h - jr z,Func_3A ; во 2-е - jr Func_3B ; в 3-е - - -;///////////////////////////////////////////////////////////////////// -; Функция #39. Подключение страницы памяти в первое окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_39:ld c,0C4h - ex de,hl - rst 08h - ex de,hl - ret c - ld c,0A2h - in b,(c) - out (c),a - ld a,b - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #3A. Подключение страницы памяти во второе окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3A:ld c,0C4h - ex de,hl - rst 08h - ex de,hl - ret c - ld c,0C2h ; порт - in b,(c) - out (c),a - ld a,b - ret - - -;///////////////////////////////////////////////////////////////////// -; Функция #3B. Подключение страницы памяти в третье окно. -; -; вход: A - идентиф. блока памяти -; B - номер страницы в блоке (0,1,2,..) -; выход: A - номер страницы, если CF=0 -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_3B:ld c,0C4h - ex de,hl - rst 08h - ex de,hl - ret c - ld c,0E2h - in b,(c) - out (c),a - ld a,b - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #40. Выполнить файл. -; -; вход: HL - указатель на имя файла -; B=0 - загрузить и выполнить программу -; выход: A - код завершения, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_40: inc b - dec b - jp z,A2AFE - dec b - jp z,A2B09 - ld a,EINVFNC ; код "не верный номер функции" - scf - ret - - - -A2A5D: ld a,(hl) - inc hl - cp '\' - ret z - cp "/" - ret z - cp " "+1 - jr nc,A2A5D - ret - - -A2A6A: ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - call Func_02 ; получить номер тек. диска - add a,"A" - ld hl,LFD00 - ld (hl),a - inc hl - ld a,":" - ld (hl),a - inc hl - call Func_1E ; инфа о тек. каталоге - call A2AC1 - ld hl,LFC80 -A2A87: ld e,(hl) - inc hl - ld d,(hl) - inc hl - bit 1,(hl) - inc hl - push hl - push bc - ex de,hl - call z,A2AB8 - call Func_1D ; смена текущего каталога - jr c,A2AAC - ld hl,D2E7C ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - jr c,A2AAC - call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) - jr c,A2AAC ; не совпадает - call search_rec_file ; поиск записи файла в списке диска -A2AAC: pop bc - pop hl - jr nc,A2AB3 ; запись найдена - djnz A2A87 - scf -A2AB3: pop bc - ld a,b - out (0E2h),a ; восст. порт - ret - -A2AB8: push hl - ld hl,LFD00 - call Func_1D ; смена текущего каталога - pop hl - ret - -A2AC1: ld hl,LFC7F - ld de,LFDFF - ld b,0 -A2AC9: ld (hl),c - inc hl - xor a - ld (de),a - ld c,a - inc de - ld (hl),e - inc hl - ld (hl),d - inc hl - inc b -A2AD4: ld a,(de) - cp '\' - jr nz,A2ADB - set 1,c -A2ADB: ld a,(de) - cp ";" - jr z,A2AC9 - inc de - cp ":" - jr z,A2AD4 - or a - jr nz,A2ADB - ld (hl),c - inc hl - ld (hl),a - inc hl - ld (hl),a - ret - - -T2AEE: db "PATH=",0 ; имя перем. окружения - - -; ++уровня текущей программы -A2AF4: ld hl,D2E70 - inc (hl) - ret - -; --уровня текущей программы -A2AF9: ld hl,D2E70 - dec (hl) - ret - - - -;------------------------------------------------------------------------ -; Загрузить и выполнить программу. -; функ. 40h, B=0. -; -; 1) Открывает exe-файл на чтение; -; 2) Считывает в рабочую область префикс exe-файла; -; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного -; загрузчика, если его размер не равен нулю; -; 4) Сохраняет стек; -; 5) Подключает страницы из выделенного блока; -; 6) Строит префикс запуска программы и устанавливает на него регистр IX; -; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения -; кода в памяти); -; 8) Закрывает exe-файл, если это не первичный загрузчик; -; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека); -; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); -; -; Префикс запуска файла: -; -; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком -; -02 1 db ? ; Идентификатор блока памяти -; -01 1 db ? ; Уровень текущей программы -; +00 1 db ? ; Длина ком-строки -; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем -;------------------------------------------------------------------------ -A2AFE: ld (D2E78),hl - call A2A5D - ld hl,(D2E78) - jr c,A2B32 -; B=1. -A2B09: ld (D2E78),hl - ld a,1 - ld (D1F3A),a ; раб. ячейка - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) - ld a,ENOFILE ; код "файл не найден" - ret c - call A2AF4 - call A1E89 - jr nc,A2B75 - jr A2AF9 - ; -A2B32: ld a,1 - ld (D1F3A),a ; раб. ячейка - call A20F8 ; тест на допуст. имя и настр. на диск - ret c - ld hl,D213A ; 8.3 имя - ld de,T2364 ; буфер имени 11 симв. формата - call A2384 ; преобр. имя 8.3 -> 11 формат - ret c - call A2CB6 ; сравнить/добавить расш. с "EXE" (если задано) - ld a,ENOFILE ; код "файл не найден" - ret c - call A2AF4 - call A1E89 - jr nc,A2B75 - call A2AF9 - ld hl,T2AEE ; имя перем. окружения "PATH=" - ld de,LFE00 ; куда - ld b,1 ; получить перем. окружения - call Func_46 ; функция сист. окружения - ld hl,(D2E78) - ld de,D2E7C -A2B67: ld a,(hl) - ldi - or a - jr nz,A2B67 - call A2A6A - ld hl,(D2E78) - jr A2B09 - ; -A2B75: ld (D2E76),a ; сохр. дескр. файла - ld hl,D2E7C ; буфер - ld de,128 ; число чит. байт - ld a,(D2E76) ; дескр. файла - call Func_13 ; чтение из файла - jp c,A2CD7 - ld ix,D2E7C - ld hl,(D2E7C) - ld de,"XE" ; сигнатура - sbc hl,de - ld a,EINVEXE ; код "неправильный EXE-файл" - scf - jp nz,A2CD7 - ld a,(ix+3) - or a - ld a,ENSUPEXE ; код "не поддерж. версия EXE-файла" - scf - jp nz,A2CD7 - - - ld de,(D2E84) - ld a,e - or d - jp nz,A2CE4 - ld l,a - ld h,a - push hl - pop ix - ld b,2 ; от конца файла - ld a,(D2E76) ; дескр. файла - call Func_15 ; перемещение указателя в файле - ld de,(D2E8C) - ld a,d - and 3Fh - ld d,a - add ix,de - ld de,0 - adc hl,de - ld a,xh - sla a - rl l - rl h - sla a - rl l - rl h - or xl - jr z,1F - inc hl -1: ld a,h - or a - jp nz,A2CD5 - ld b,l - call Func_3D ; выделить блок памяти - jp c,A2CD5 - ld (D2E77),a ; идентиф. блока памяти - exx - pop de - ld hl,0 - add hl,sp - ld sp,(D2E7A) - push hl - push de - in a,(0E2h) - ld d,a - in a,(0C2h) - ld e,a - in a,(0A2h) - push de - push af - ld (D2E7A),sp - ld sp,hl - exx - ld a,(D2E77) ; идентиф. блока памяти - ld de,T2E71 - ld bc,00C4h - rst 08h - ld (de),a - inc de - ld a,(D2E77) ; идентиф. блока памяти - ld bc,01C4h - rst 08h - ld (de),a - inc de - ld a,(D2E77) ; идентиф. блока памяти - ld bc,02C4h - rst 08h - ld (de),a - inc de - ld a,(D2E77) ; идентиф. блока памяти - ld bc,03C4h - rst 08h - ld (de),a - ld hl,(D2E78) - ld de,T0400+1 - call A2E52 - ld a,128 ;80h - sub b - ld (T0400),a - ld sp,T307A - ld a,0FFh ; номер стр. - out (0A2h),a - out (0C2h),a - out (0E2h),a - ld hl,(D2E8C) - ld de,T2E71 - ld a,h - and 0C0h - cp 40h ; 40(00)h - jr z,A2C5E - cp 80h ; 80(00)h - jr z,A2C62 - cp 0C0h ; 0C0(00)h - jr z,A2C66 -A2C5E: ld a,(de) - out (0A2h),a - inc de -A2C62: ld a,(de) - out (0C2h),a - inc de -A2C66: ld a,(de) - out (0E2h),a - call A2DE9 - ld hl,(D2E82) - ld ix,(D2E80) - ld b,0 ; от начала файла - ld a,(D2E76) ; дескр. файла - call Func_15 ; перемещение указателя в файле - ld sp,L403F - ld de,(D2E8C) - xor a - ld l,a - ld h,a - sbc hl,de - ex de,hl ; de=число чит. байт - ld hl,(D2E8C) ; буфер - ld a,(D2E76) ; дескр. файла - call Func_13 ; чтение из файла - ld a,(D2E76) ; дескр. файла - call Func_12 ; закрыть файл - ld sp,(D2E90) - ld hl,(D2E8C) - ld de,128 ;T0080 - and a - sbc hl,de - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,(D2E8E) - ld de,A2CB3 ; адрес п/п "завершить процесс" - push de - push hl - ret - ; -A2CB3: jp Func_41 ; завершить программу (процесс) - - - -;------------------------------------------------- -; Если расш. файла не задано, задать "exe". -; Если расш. файла задано, сравнить его с "exe". -;------------------------------------------------- -A2CB6: ld hl,T2E6D ; "EXE" - ld de,T236C - ld b,3 - ld a,(de) - cp " " - jr nz,A2CCB ; задано расш. - ldi - ldi - ldi - xor a - ret - ; -; сравнить расш. с "EXE" -A2CCB: ld a,(de) - cp (hl) - scf - ret nz ; не совпадает - inc hl - inc de - djnz A2CCB - xor a ; Ok - ret - - -A2CD5: ld a,1Eh -A2CD7: push af - ld a,(D2E76) ; дескр. файла - call Func_12 ; закрыть файл - ld hl,D2E70 - dec (hl) ; --уровня текущей программы - pop af - ret - -A2CE4: ex de,hl - ld de,(D2E8C) - ld a,d - and 3Fh - ld d,a - adc hl,de - xor a - sla h - rla - sla h - rla - ld b,a - ld a,h - or l - jr z,A2CFC - inc b -A2CFC: call Func_3D ; выделить блок памяти - jr c,A2CD5 - ld (D2E77),a ; идентификатор блока памяти - exx - pop de - ld hl,0 - add hl,sp - ld sp,(D2E7A) - push hl - push de - in a,(0E2h) - ld d,a - in a,(0C2h) - ld e,a - in a,(0A2h) - push de - push af - ld (D2E7A),sp - ld sp,hl - exx - ld de,T2E71 - ld bc,00C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - inc de - ld bc,01C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - inc de - ld bc,02C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - inc de - ld bc,03C4h - ld a,(D2E77) ; идентификатор блока памяти - rst 08h - ld (de),a - ld hl,(D2E78) - ld de,T0400+1 - call A2E52 - ld a,80h - sub b - ld (T0400),a - ld sp,T307A - ld a,0FFh ; номер стр. - out (0A2h),a - out (0C2h),a - out (0E2h),a - ld hl,(D2E8C) - ld de,T2E71 - ld a,h - and 0C0h - cp 40h ; 40(00)h - jr z,A2D76 - cp 80h - jr z,A2D7A - cp 0C0h - jr z,A2D7E -A2D76: ld a,(de) - out (0A2h),a - inc de -A2D7A: ld a,(de) - out (0C2h),a - inc de -A2D7E: ld a,(de) - out (0E2h),a - call A2DE9 - ld hl,(D2E82) - ld ix,(D2E80) - ld b,0 ; от начала файла - ld a,(D2E76) ; дескр. файла - call Func_15 ; перемещение указателя в файле - ld sp,L403F - ld hl,(D2E8C) ; буфер - ld de,(D2E84) ; число чит. байт - ld a,(D2E76) ; дескр. файла - call Func_13 ; чтение из файла - ld sp,(D2E90) - ld hl,(D2E8C) - ld de,128 - and a - sbc hl,de - ex de,hl - ld xh,d - ld xl,e - ld hl,(D2E8E) - ld de,A2CB3 ; дос-заглушка - push de - push hl - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #41. Завершить программу (процесс). -; -; вход: B - код завершения -; выход: A - код ошибки, если CF=1 -; -; Выход из EXE-файла: -; -; 1) Освобождаются все блоки памяти которые выделялась данному приложению. -; 2) Восстанавливаются страницы которые были подключены до запуска EXE-файла. -; 3) Вспоминается стек. -; 4) В регистр A помещается код возврата и выполняется RET. -; -;///////////////////////////////////////////////////////////////////// -Func_41: ld a,b - ld (return_code),a ; код завершения программы - call A29FF - ld hl,D2E70 - dec (hl) ; --уровня текущей программы - ld sp,(D2E7A) - pop af - pop hl - out (0A2h),a - ld a,l - out (0C2h),a - ld a,h - out (0E2h),a - pop de - pop hl - ld (D2E7A),sp - ld sp,hl - ex de,hl - ld a,(return_code) ; код завершения программы - and a - jp (hl) - - - -;///////////////////////////////////////////////////////////////////// -; Функция #42. Получить код завершения программы. -; -; вход: нет -; выход: A - код завершения -;///////////////////////////////////////////////////////////////////// -Func_42:ld a,(return_code) - and a - ret - -A2DE9: ld hl,(D2E8C) - dec h - ld d,h - ld e,l - inc de - ld bc,00FFh - ld (hl),b - ldir - ex de,hl - dec h - ld de,128 ;T0080 - add hl,de - ex de,hl - db 0DDh - ld h,d - db 0DDh - ld l,e - ld hl,T0400 ; откуда - ld c,(hl) - inc c - ldir - ex de,hl - ld (hl),b - ld a,(D2E70) ; уровень текущей программы - ld (ix-1),a ; в префикс exe-файла - ld a,(D2E77) ; идентификатор блока памяти - ld (ix-2),a ; в префикс exe-файла - ld a,(D2E76) ; дескр. файла - ld (ix-3),a ; в префикс exe-файла - inc hl - ld (hl),b - inc hl - call Func_02 ; получить номер тек. диска - add a,"A" - ld (hl),a - inc hl - ld a,":" - ld (hl),a - inc hl - push hl - call Func_1E ; инфа о тек. каталоге - pop hl - xor a - ld bc,256 - cpir - dec hl - dec hl - ld a,'\' - cp (hl) - inc hl - jr z,A2E3F - ld (hl),a - inc hl -A2E3F: ex de,hl - ld hl,D213A -A2E43: ld a,(hl) - ldi - cp " "+1 - jr nc,A2E43 - dec de - xor a - ld (de),a - ld (D2795),ix - ret - - -A2E52: ld bc,8021h -A2E55: ld a,(hl) - cp c - jr c,A2E61 - inc hl - djnz A2E55 - xor a - ld (de),a - ld b,80h - ret -A2E61: ld bc,8020h -A2E64: ld a,(hl) - ld (de),a - inc hl - inc de - cp c - ret c - djnz A2E64 - ret - - -T2E6D: db "EXE" - -D2E70: db 1 ; уровень текущей программы -T2E71: db 0 - db 0 - db 0 - db 0 - -return_code: - db 0 ; код завершения программы (процесса) - -D2E76: db 0 ; дескр. файла -D2E77: db 0 ; идентификатор блока памяти - -D2E78: dw 0 - - - -D2E7A: dw L317B ; адрес стека - - -; 512 байт. exe-заголовок, после раб. буфер -D2E7C: db "EXE" - db 0 ; exe версия -D2E80: dw 0 ; 512, мл. смещ. кода -D2E82: dw 0 ; ст. смещ. кода -D2E84: dw 0 ; end-beg, первичный загрузчик - dw 0,0,0 ; резерв -D2E8C: dw 0 ; адрес загрузки кода -D2E8E: dw L0000 ; адрес передачи управления -D2E90: ds 490 - - - -T307A: ds 257 -L317B: db 0 ; начало стека - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #46. Системное окружение. -; -; вход: B - номер подфункции: -; B=0, получение системного окружения -; HL - буфер -; B=1, получить переменную окружения -; HL - имя переменной -; DE - буфер для значения переменной -; B=2, установить/удалить переменную окружения -; HL - имя переменной и значение, разделенные символом "=" -; т.е. ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ -; В конце строки должен стоять нуль. -; выход: A - состояние, если CF=0 -; DE - указывает на конец буфера (только для B=1) -; A=0FFh - переменная обнаружена -; A=0 - переменная не обнаружена -; A - код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -Func_46: inc b - jr z,A318E ; B=#FF - dec b - jr z,A31B2 ; B=0. получить сист. окружение - dec b - jr z,A31DB ; B=1. получить перем. окружения - dec b - jr z,A31FD ; B=2. установить/удалить перем. окружения - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -;------------------------------------------------- -; Инициализация буфера переменных окружения -;------------------------------------------------- -A318E: ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - ld de,LE400 ; начало буфера переменных окружения - xor a - ld (de),a - inc de - ld hl,DEFAULT_ENV - ld bc,1 - ldir - ld (de),a - ex de,hl - ld de,LE400 ; начало буфера переменных окружения - and a - sbc hl,de - ld (D3296),hl - pop af - out (0E2h),a ; восст. порт - and a - ret - -;------------------------------------------------- -; Получить сист. окружение -;------------------------------------------------- -A31B2: push hl - ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - ld h,a ; старая банка порта - ld c,0E2h - in l,(c) - exx - ld hl,LE400 ; начало буфера переменных окружения - inc hl - pop de - ld bc,(D3296) - exx -A31C8: out (c),l - exx - ld a,(hl) - exx - out (c),h ; восст. порт - exx - ld (de),a - inc hl - inc de - dec bc - ld a,b - or c - exx - jr nz,A31C8 - xor a - ret - -;------------------------------------------------- -; Получить переменную окружения -;------------------------------------------------- -A31DB: push de - call A325F ; скопир. строку перем. окруж. в буферы - ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - ex af,af' ; старая банка порта - call A323D ; найти конец всех переменных ? - pop de - ld a,0 - ld (de),a - jr nc,A31F7 -A31EE: ld a,(hl) - ldi - or a - jr nz,A31EE - dec de - ld a,-1 -A31F7: ex af,af' - out (0E2h),a ; восст. порт - ex af,af' - and a - ret - - -;------------------------------------------------- -; Установить/Удалить переменную окружения -; -; вход: hl=имя перем. и значение, раздел. символом "=" -;------------------------------------------------- -A31FD: ; в D2E7C "EXE" - ; в T0400 содержимое system.bat - call A325F ; скопир. строку перем. окруж. в буферы - ld a,2 ; лог. номер стр. (path, перем. окруж.) - call set_dos_page ; подключить банку расширения ДОС - push af ; старая банка порта - call A323D ; найти конец всех переменных ? - jr nc,A3214 - xor a - cpir - ld a,b - or c - jr z,A3214 - ldir -A3214: ld a,(T0400) - or a - jr z,A322D - ld hl,D2E7C ; 512 байт, буфер -A321D: ld a,(hl) - ldi - cp "=" ; символ разделения - jr nz,A321D - ld hl,T0400 ; откуда -A3227: ld a,(hl) - ldi - or a - jr nz,A3227 -A322D: xor a - ld (de),a - ld hl,LE400 ; начало буфера переменных окружения - ex de,hl - sbc hl,de - ld (D3296),hl - pop af - out (0E2h),a ; восст. порт - and a - ret - -; найти конец всех переменных ? -A323D: ld hl,LE400 ; начало буфера переменных окружения - ld bc,(D3296) - push hl -A3245: pop de - ld de,D2E7C ; 512 байт буфер - xor a - cpir - push hl -A324D: ld a,(hl) - or a - jr z,A325D - ld a,(de) - cp (hl) - inc hl - inc de - dec bc - jr nz,A3245 - cp "=" ; символ разделения - jr nz,A324D - scf -A325D: pop de - ret - -;----------------------------------------------------------- -; Скопировать строку переменной окружения в буферы -; (имя и значение в разные буферы) -; вход: hl=имя перем. и значение, раздел. символом "=" -;----------------------------------------------------------- -A325F: ld b,maxlen_env_string ; 255 макс. длина строки (имя+знач.) - ld de,D2E7C ; куда - xor a - ld (de),a - ld (T0400),a - ; скопир. в "D2E7C" имя переменной -A3269: ld a,(hl) - inc hl - cp "=" ; символ разделения - jr z,A3283 ; конец имени - or a - jr z,A327B ; конец строки - call upper ; a..z -> A..Z - ld (de),a - inc de - djnz A3269 - jr A3294 ; слишком длинная строка - -; значение не задано -A327B: ld a,"=" ; символ разделения - ld (de),a - inc de - xor a - ld (de),a - inc de - ret - - -A3283: ld (de),a ; сохр. "=" - inc de - xor a - ld (de),a ; в конец имени перем. - ; скопир. в "T0400" значение переменной (строку путей) - ld de,T0400 ; 512 байт, буфер - ld (de),a - ld c,255 ; чтобы "ldi" не портила "b" -A328D: ld a,(hl) - ldi - or a - ret z ; конец строки знач. переменной - djnz A328D -A3294: ld a,b - ld (de),a ; обрезать слишком длинную строку - inc de - scf - ret - - -D3296: dw 1 -DEFAULT_ENV: db 0 - - - - include "mouse.asm" ; код мышки - - - - db " " ; 12 - ds 20 - - db "FILENAME.EXT",0 - - - - -;------------------------------------------------- -; RST 18h. Вектор дисковых устройств -; вход: a=номер устройства (0-25) -;------------------------------------------------- -drv_devices: - push hl - push bc ; сохр. bc - ld c,a - add a,a ;1+1=2 - add a,c ;2+1=3 - ld c,a - ld b,0 - ld hl,A38FC ; таблица переходов - add hl,bc - ld a,(hl) - inc a - jr z,A38F4 ; было a=0FFh - dec a - inc hl - ld c,(hl) ; загр. адрес обработчика - inc hl ; - ld h,(hl) ; - ld l,c - pop bc ; восст. bc - ex (sp),hl ; адрес в стек - ret ; перейти на него - ; -A38F4: pop bc - pop hl - ld a,EINVDRV ; код "неверный номер устройства" - scf - ret - - - -A38FA: dw A38FC - - -; Таблица адресов обработчиков девайсов. 26 элементов (диски A..Z ?). -A38FC: db -1 ;00 - dw -1 - db -1 ;01 - dw -1 - db -1 ;02 - dw -1 - db -1 ;03 - dw -1 - db -1 ;04 - dw -1 - db -1 ;05 - dw -1 - db -1 ;06 - dw -1 - db -1 ;07 - dw -1 - db -1 ;08 - dw -1 - db -1 ;09 - dw -1 - db -1 ;10 - dw -1 - db -1 ;11 - dw -1 - db -1 ;12 - dw -1 - db -1 ;13 - dw -1 - db -1 ;14 - dw -1 - db -1 ;15 - dw -1 - db -1 ;16 - dw -1 - db -1 ;17 - dw -1 - db -1 ;18 - dw -1 - db -1 ;19 - dw -1 - db -1 ;20 - dw -1 - db -1 ;21 - dw -1 - db -1 ;22 - dw -1 - db -1 ;23 - dw -1 - db -1 ;24 - dw -1 - db -1 ;25 - dw -1 - db -1 ; конец - - - - -;----------------------------------------------------------- -; Просканировать систему на FDD/HDD девайсы и RAM-диски -;----------------------------------------------------------- -scan_all_devices: - xor a - ld (last_drive),a ; сбр. ячейку - ld hl,A38FC - ld (A38FA),hl ; восст. ячейку - ; FDD девайсы - ld c,a ; c="open device" - call A3D7A ; узнать число FDD-девайсов - ld de,A3D7A ; адрес обработчика тек. девайса - call A397B ; иниц. таблицу переходов - ; HDD девайсы - xor a - ld c,a ; c="open device" - call A39CC ; узнать число HDD-девайсов - ld de,A39CC ; адрес обработчика тек. девайса - call A397B ; иниц. таблицу переходов - ; RAM-диски - xor a - ld c,a ; c="open device" - call A3E5E ; узнать число RAM-дисков - ld de,A3E5E ; адрес обработчика тек. девайса - call A397B ; иниц. таблицу переходов - xor a - ret - - - -; Инициировать таблицу переходов девайса. -; вход: de=адрес обработчика девайса -; a=число девайсов (0=нет) -A397B: ld c,a - ld hl,last_drive ; ячейка номера посл. диска - add a,(hl) - ld (hl),a - ld a,c - ld c,0 ; сбр. - or a - ret z ; нет девайсов - ld hl,(A38FA) ; тек. полож. в таблице -A3989: ld (hl),c ; индекс ? - inc hl - ld (hl),e ; de=адрес обработчика - inc hl - ld (hl),d - inc hl - inc c ; ++индекс ? - dec a - jr nz,A3989 - ld (A38FA),hl ; сохр. новое полож. в таблице - dec a - ld (hl),a ; a=0FFh - ret - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. -; -; вход: нет -; выход: A - номер последнего лог. диска в системе -;///////////////////////////////////////////////////////////////////// -Func_08:di - call scan_all_devices ; перескан. все девайсы - ld a,(last_drive) - ei - ret - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #09. Номер системного диска. -; Возвращает номер диска, c которого загружена система. -; -; вход: B = 0 (01h - исп. boot-загрузчик системы) -; выход: A - номер системного диска (0=A,1=B,..) -;///////////////////////////////////////////////////////////////////// -Func_09: inc b - dec b - jr z,A39A5 - dec b - jr z,A39AA ; с какого диска загр. система (для загрузчика) - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A39A5: db 3Eh ; ld a,.. -boot_disk: - db -1 ; номер диска, с которого загружалась система - and a - ret - -; Сообщить DSS с какого диска загружается система. -; Исп. загрузчик системы для иниц. ячейки "boot_disk". -A39AA: ld b,a - ld c,0 -A39AD: push bc - ld a,c - ld bc,0008h ; получить геометрию диска - ld de,55AAh ; сигнатура - rst 18h - pop bc - jr c,A39C3 ; ошибка - ex af,af' - cp b - jr nz,A39C3 - ld a,c - ld (boot_disk),a ; иниц. ячейку - and a - ret - ; -A39C3: inc c ; ++номер boot-диска - ld a,(last_drive) ; номер посл. диска системы - cp c - jr nz,A39AD - scf - ret - - -;------------------------------------------------- -; Обработчик HDD (rst 18h) -;------------------------------------------------- -A39CC: inc c - dec c ; c=0 - jr z,A3A01 - dec c ; c=1 open - jp z,A3BD1 - dec c ; c=2 close - jp z,A3BD3 - dec c ; c=3 media check (смена носителя) - jp z,A3BD5 - dec c ; c=4 get BPB - jp z,A3BD9 - dec c ; c=5 input (чтение секторов) - jp z,A3C27 - dec c ; c=6 output (запись секторов) - jp z,A3C1C - dec c ; c=7 - jp z,A3BCD - dec c ; c=8 узнать геометрию диска - jp z,A3B34 - dec c ; c=9 - jr z,A39FD - dec c ; c=10 - jp z,A3C06 - dec c ; c=11 - jp z,A3C11 -A39FD: ld a,1 ; код "bad command" - scf - ret - -; c=0 -A3A01: push iy - ld hl,T3A4C ; таблица лог.дисков (16*12) - ld (D3D78),hl ; адрес структуры тек. лог. диска - ld ix,L4000 ; буфер под список (5 байт) - ld c,5Fh ; список дисковых устройств - rst 08h - xor a - ld b,(ix+2) ; кол-во HDD устройств - cp b - jr z,A3A25 ; нет винтов - ; - ld c,80h ; мастер на первом канале -A3A19: push bc - ld a,c - ld (D3D6F),a ; номер девайса (80h/81h мастер/слейв) - call A3C9A ; узнать лог. диски винта и создать их таблицы - pop bc - inc c ; слейв на первом канале - djnz A3A19 - ; -A3A25: pop iy - ld hl,(D3D78) ; адрес структуры тек. лог. диска - ld de,T3A4C ; таблица лог.дисков (16*12) - xor a ; счетчик лог. дисков - sbc hl,de - ret z ; структура первого лог. диска - ld de,16 ; размер структуры лог. диска - inc a - sbc hl,de - jr nz,$-3 ; перейти на структуру первого лог. диска - and a ; a=кол-во лог.дисков - ret - - -; нет обращения -;L3A3B: ld a,0FFh - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret nz - ;inc hl - ;cp (hl) - ;ret - - -; Таблица лог. дисков ДОС-а -; -; +0 - номер девайса (80h,...) -; +1,+2,+3,+4 - абс. номер нач. сектора лог. диска -; +5,+6,+7,+8 - размер лог. диска (число секторов) -; -; -T3A4C: ds 16*12 ; 192 C..N - - -; вход: a=0..11 (индекс) -; выход: ix,hl - абс. номер нач. сектора -; a - номер девайса (80h,...) -A3B0C: push de - push bc - push hl - ld l,a - ld h,0 - add hl,hl ;1+1=2 - add hl,hl ;2+2=4 - add hl,hl ;4+4=8 - add hl,hl ;8+8=16 - ex de,hl - ld iy,T3A4C ; таблица лог.дисков (16*12) - add iy,de - ld c,(iy+1) ; абсолютный номер - ld b,(iy+2) ; начального сектора - ld e,(iy+3) ; раздела - ld d,(iy+4) ; - pop hl - add ix,bc - adc hl,de - ld a,(iy+0) ; тип девайса (80h,...) - pop bc - pop de - ret - -;c=8. Узнать геометрию диска (CHS) -A3B34: bit 7,b - jr nz,A3B49 - inc b - dec b ; b=0 - jr z,A3B6F - dec b ; b=1 - jr z,A3B5C - dec b ; b=2 - jr z,A3B60 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A3B49: res 7,b - inc b - dec b - jr z,A3B65 - dec b - jr z,A3B67 - dec b - jr z,A3B6B - ld a,1 ; код "bad command" - scf - ret - ; -A3B5C: ld a,0Bh ; код "failure" - scf - ret - ; -A3B60: ld b,l - jp A3C32 - ; -A3B65: and a - ret - ; -A3B67: ld a,0Bh ; код "failure" - scf - ret - ; -A3B6B: ld a,0Bh ; код "failure" - scf - ret - -;c=8. Узнать геометрию диска (CHS) -;b=0. -; вход: a - индекс (0..11) -A3B6F: ex de,hl - ld bc,55AAh ; сигнатура раздела - and a - sbc hl,bc - ld l,a ; индекс раздела - ld a,0Bh ; код "failure" - scf - ret nz - push iy - ld h,0 - add hl,hl ; *16 - add hl,hl - add hl,hl - add hl,hl - ld b,h - ld c,l - ld iy,T3A4C ; таблица лог.дисков (16*12) - add iy,bc - ld e,(iy+5) ; размер раздела (число секторов) - ld d,(iy+6) ; - ld l,(iy+7) ; ст. разряд - ld h,(iy+8) ; - ld a,(iy+0) ; тип девайса (80h,...) - ld c,a - ld iy,LC1C0 ; LC000+01BEh+2 ?? - and 0Fh - jr z,A3BA7 ; - ld iy,LC1C8 ; LC000+01BEh+0Ah ?? -A3BA7: in a,(0E2h) - push af - ld a,0FEh ; номер стр. - out (0E2h),a - ld a,(iy+0) - exx - ld l,(iy+3) ; - ld h,(iy+4) ; - ld e,(iy+2) ; - ld d,0 - ld b,d - ld c,(iy+1) ; - exx - ex af,af' - pop af - out (0E2h),a - ld a,c - ex af,af' - pop iy - and a - ret - - -A3BCD: ld a,1 ; код "bad command" - and a - ret - -A3BD1: xor a - ret - -A3BD3: xor a - ret - -A3BD5: ld a,-1 - and a - ret - - - -A3BD9: push iy - push de - ld l,a - ld h,0 - add hl,hl ; *16 - add hl,hl - add hl,hl - add hl,hl - ld b,h - ld c,l - ld iy,T3A4C ; таблица лог.дисков (16*12) - add iy,bc - ld e,(iy+1) ; мл. разряд номера сектора - ld d,(iy+2) - ld l,(iy+3) ; ст. разряд - ld h,(iy+4) - db 0DDh - ld l,e - db 0DDh - ld h,d - ld a,(iy+0) ; тип девайса (80h,...) - pop de ; буфер - pop iy - ld bc,0155h ; прочитать один сектор - rst 08h - ret - -A3C06: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,52h ; чтение секторов в зад. блок памяти - rst 08h - pop iy - ret - -A3C11: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,53h ; ? - rst 08h - pop iy - ret - -A3C1C: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,56h ; записать "b" секторов - rst 08h - pop iy - ret - -A3C27: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,55h ; прочитать "b" секторов - rst 08h - pop iy - ret - -A3C32: push iy - call A3B0C ; получить абс. номер нач. сектора - ld c,54h ; проверка секторов (не работает?) - rst 08h - pop iy - ret - - -; на лог. диск раздела -A3C3D: ld e,(iy+8) ; абсолютный (лог.) номер - ld d,(iy+9) ; начального сектора - ld l,(iy+10) ; раздела - ld h,(iy+11) ; - ld ix,(D3D70) ; мл.разряд - add ix,de - ld de,(D3D72) ; ст.разряд - adc hl,de - db 0DDh - ld d,h - db 0DDh - ld e,l - ld ix,(D3D78) ; адрес структуры тек. лог. диска - ld (ix+1),e - ld (ix+2),d - ld (ix+3),l - ld (ix+4),h - ; - ld e,(iy+12) ; размер раздела (число секторов) - ld d,(iy+13) ; - ld l,(iy+14) ; ст. разряд - ld h,(iy+15) ; - ld (ix+5),e - ld (ix+6),d - ld (ix+7),l - ld (ix+8),h - ld a,(D3D6F) ; номер девайса (80h/81h мастер/слейв) - ld (ix+0),a - ld de,16 ; размер таблицы лог.диска ? - add ix,de - ld (D3D78),ix ; адрес структуры след. лог. диска -A3C90: ld de,16 ; размер раздела - add iy,de - pop bc - djnz A3CD3 ; проверить след. раздел - and a ; конец разделов в MBR - ret - - -;---------------------------------------------------- -; Узнать лог. диски винта и создать их таблицы -;---------------------------------------------------- -A3C9A: in a,(0E2h) ; сохр. стр. - push af - ld a,0FFh ; номер стр. - out (0E2h),a - call A3CA8 - pop af - out (0E2h),a ; восст. стр. - ret - -A3CA8: ld ix,0 - ld de,0 - ld (D3D74),de - ld (D3D76),ix - ; цикл -A3CB7: ld (D3D70),de ; мл.разряд номера сектора - ld (D3D72),ix ; ст.разряд - call read_one_sector ; прочитать один сектор (MBR, 0-й сектор) - ld hl,(LC000+510) ; конец сектора - ld de,0AA55h ; сигнатура таблицы разделов - and a - sbc hl,de - jr nz,A3D1A ; не знакомый раздел, выйти - ld iy,LC000+01BEh ; на описатель 1-го раздела - ld b,4 ; макс. число разделов винта -A3CD3: push bc - ; тест на расш. раздел - ld a,(iy+4) ; байт-идентиф. раздела - cp 5 ; "Расширенный" 0-2Гб (MS-DOS 3.3) - jr nz,A3CFE - ; на след. раздел -A3CDB: push iy - ld de,(D3D70) ; мл.разряд номера сектора - ld ix,(D3D72) ; ст.разряд - push de - push ix - call next_partition ; на след. раздел - pop ix - pop de - ld (D3D70),de ; мл.разряд номера сектора - ld (D3D72),ix ; ст.разряд - call read_one_sector ; прочитать один сектор - pop iy - jr A3C90 - ; - ; тест на расш. раздел -A3CFE: cp 0Fh ; "Расширенный" 0-2Гб (Win95) - jr z,A3CDB ; на след. раздел - ; тест на осн. раздел - cp 0Eh ; "Основной" 32Мб-2Гб FAT16 (Win95) - jp z,A3C3D ; на лог. диск раздела - cp 6 ; "Основной" 32Мб-2Гб FAT16 (MS-DOS 4.0) - jp z,A3C3D - cp 4 ; "Основной" 16Мб-32Мб FAT16 (MS-DOS 3.0) - jp z,A3C3D - cp 1 ; "Основной" 0Мб-15Мб FAT12 (MS-DOS 2.0) - jp z,A3C3D - call test_others; ; поставил - jr z,A3CDB; ; на след. раздел - pop bc - or a - ret z ; конец разделов -A3D1A: scf ; не знакомый раздел - ret - -; перейти на след. раздел -next_partition: - ld hl,(D3D74) - ld de,(D3D76) - ld a,l - or h - or e - or d - ld e,(iy+8) ; абсолютный (лог.) номер - ld d,(iy+9) ; начального сектора - ld l,(iy+10) ; раздела - ld h,(iy+11) ; - jr nz,A3D44 - ld (D3D74),de - ld (D3D76),hl - ld ix,(D3D76) - jp A3CB7 - ; -A3D44: ld ix,(D3D74) ; мл. разряд - add ix,de - push ix - ld de,(D3D76) ; ст. разряд - adc hl,de - push hl - pop ix - pop de - jp A3CB7 - -; тест на другие типы разделов -; вход: a - тип раздела -; выход: Z - на след. раздел -test_others: - cp 0Bh ; "Основной" 512Мб-2Тб FAT32 (OSR2) - ret z - cp 7 ; NTFS - ret z - cp 82h ; Linux swap - ret z - cp 83h ; Linux - ret z - cp 0EBh ; BeOS - ret - - -;------------------------------------------------- -; Чтение одного сектора в буфер 0C000h -;------------------------------------------------- -read_one_sector: - push iy - ld ix,(D3D70) ; мл.разряд номера сектора - ld hl,(D3D72) ; ст.разряд - ld de,LC000 ; буфер - ld bc,0155h ; прочитать один сектор - ld a,(D3D6F) ; номер девайса (80h/81h мастер/слейв) - rst 08h - pop iy - ret - - -D3D6F: db 0 ; номер девайса (80h/81h мастер/слейв) - ; -D3D70: dw 0 ; мл.разряд номера сектора -D3D72: dw 0 ; ст.разряд -D3D74: dw 0 -D3D76: dw 0 - ; -D3D78: dw T3A4C ; адрес структуры тек. лог. диска - - - - -;------------------------------------------------- -; Обработчик FDD (rst 18h) -;------------------------------------------------- -A3D7A: inc c - dec c ; c=0 - jr z,A3DA7 - dec c ; c=1 - jr z,A3DAB - dec c ; c=2 - jr z,A3DAF - dec c ; c=3 - jr z,A3DB1 - dec c ; c=4 - jr z,A3DB5 - dec c ; c=5 - jr z,A3DDB - dec c ; c=6 - jr z,A3DDF - dec c ; c=7 - jp z,A3E5A - dec c ; c=8 - jr z,A3DE3 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret -; c=0 -A3DA7: ld a,2 - and a - ret -; c=1 -A3DAB: ld c,51h ; сбр. контроллер и настр. на диск - rst 08h - ret -; c=2 -A3DAF: xor a - ret -; c=3 -A3DB1: ld a,-1 - and a - ret -; c=4 -A3DB5: ld ix,0 ; мл. разряд номера сектора - ld hl,0 ; ст. разряд - push de - push af - ld bc,0155h ; прочитать один сектор - rst 08h - pop de - pop hl - ret c - ld bc,24 - add hl,bc - ld e,(hl) - push de - ld a,d - ld c,58h ; получить парам. носителя - rst 08h - ld a,h - pop hl - push hl - ld h,a - pop af - ld c,59h ; уст. парам. носителя - rst 08h - xor a - ret - -; c=5 -A3DDB: ld c,55h ; чтение с девайса - rst 08h - ret -; c=6 -A3DDF: ld c,56h ; запись на девайс - rst 08h - ret -; c=8 -A3DE3: bit 7,b - jr nz,A3DF0 - inc b - dec b - jr z,A3DFB - ld a,1 ; код "bad command" - scf - ret - ; -A3DF0: res 7,b - inc b - dec b - jr z,A3E41 - ld a,1 ; код "bad command" - scf - ret - ; -A3DFB: ex de,hl - ld bc,55AAh ; сигнатура - and a - sbc hl,bc - ld l,a - ld a,0Bh ; код "failur" - scf - ret nz - ld a,l - and 0Fh - push af - ld c,58h ; получить парам. носителя - rst 08h - jr c,A3E3C - push hl - push de - ld a,h - ld h,0 - add hl,hl - dec a - jr nz,$-2 - ld b,h - ld c,l - ex af,af' - xor a - ld l,a - ld h,a -A3E20: ex af,af' - add hl,bc - adc a,0 - dec de - ex af,af' - ld a,d - or e - jr nz,A3E20 - ex af,af' - ld e,a - ex de,hl - exx - pop de - pop hl - pop af - ex af,af' - ld a,b - ld c,l - ld b,0 - ld l,h - ld h,b - ex de,hl - exx - and a - ret - ; -A3E3C: pop af - ld a,2 ; код "bad drive number" - scf - ret - ; -A3E41: push af - exx - ex de,hl - ld h,l - ld l,c - pop af - and 0Fh - push af - push hl - push de - ld c,58h ; получить парам. носителя - rst 08h - pop de - pop hl - jr c,A3E3C - pop af - ld c,59h ; уст. парам. носителя - rst 08h - ret c - and a - ret -; c=7 -A3E5A: ld a,1 - and a - ret - - -;------------------------------------------------- -; Обработчик RAM-дисков -;------------------------------------------------- -A3E5E: inc c - dec c ; c=0 - jp z,A3EF5 - dec c ; c=1 - jr z,A3E7F - dec c ; c=2 - jr z,A3E81 - dec c ; c=3 - jr z,A3E83 - dec c ; c=4 - jr z,A3E87 - dec c ; c=5 - jr z,A3E93 - dec c ; c=6 - jr z,A3EC4 - ld a,1 ; код "bad command" - scf - ret -; c=1 -A3E7F: xor a - ret -; c=2 -A3E81: xor a - ret -; c=3 -A3E83: ld a,-1 - and a - ret -; c=4 -A3E87: ld ix,0 - ld hl,0 - ld b,1 -; c=5 -A3E93: push bc - push ix - push hl - push bc - call A3F35 - pop bc - ld ix,512 ; размер сектора ? -A3EA0: push bc - push ix - call A3F71 - pop ix - pop bc - djnz A3EA0 - pop hl - pop ix - pop bc - xor a - cp b - ld c,b - ld b,a - jr z,A3EBC - add ix,bc - ld c,b - adc hl,bc - xor a - ret - ; -A3EBC: inc b - add ix,bc - ld b,c - adc hl,bc - xor a - ret -; c=6 -A3EC4: push bc - push ix - push hl - push bc - call A3F35 - pop bc - ld ix,512 ; размер сектора ? -A3ED1: push bc - push ix - call A3FAD - pop ix - pop bc - djnz A3ED1 - pop hl - pop ix - pop bc - xor a - cp b - ld c,b - ld b,a - jr z,A3EED - add ix,bc - ld c,b - adc hl,bc - xor a - ret - ; -A3EED: inc b - add ix,bc - ld b,c - adc hl,bc - xor a - ret - -; c=0. Просканировать число RAM-дисков. -A3EF5: ;ld hl,0200h ; ## -; ld a,80h -;A3EFA: srl a ; / 2 (мл.бит в CF) -; rr h ; цикл. сдвиг вправо через CF -; jr nc,A3EFA - ; выход: h=0, a=20h - ld a,20h ; поставил - ld (D3F70),a - ld de,T3F25 ; таблица номеров (0..15) RAM-дисков - ld bc,00CEh ; получить id блока, назнач. на RAM-диск -A3F09: push bc - ld a,b ; номер RAM-диска 0..15 - rst 08h - or a - jr z,A3F11 ; блок не назначен - ld (de),a ; id блока в таблицу - inc de -A3F11: pop bc - inc b ; ++номер ram-диска - ld a,15+1 ; макс. номер + 1 - cp b - jr nz,A3F09 - ; выход за пределы 0..15 диапазона (нет своб. ram-дисков) - ld hl,T3F25 ; таблица номеров (0..15) RAM-дисков - ex de,hl - and a - sbc hl,de - ld a,l ; число RAM-дисков (0=нет) - ;ld hl,T3FEB; ; нужен ? - and a - ret - - -; Таблица номеров (0..15) RAM-дисков -T3F25: db -1,-1,-1,-1,-1,-1,-1,-1 - db -1,-1,-1,-1,-1,-1,-1,-1 - - - -A3F35: ld bc,T3F25 - add a,c - ld c,a - ld a,0 - adc a,b - ld b,a - ld a,(bc) - ex af,af' - db 0DDh - ld b,h - db 0DDh - ld c,l - ld a,(D3F70) -A3F47: rrca ; цикл. сдвиг вправо (мл.разряд в CF) - jr c,A3F54 - rr h - rr l - rr b - rr c - jr A3F47 - ; -A3F54: ld b,c ; лог. номер страницы - ld c,0C4h ; получить физ. номер страницы блока - ex af,af' - rst 08h - ex af,af' - ld a,(D3F70) - ld c,a - dec c - db 0DDh - ld a,l - and c - inc a - ld hl,LC000 - ld bc,512 - sbc hl,bc - add hl,bc - dec a - jr nz,$-2 - ret - -D3F70: db 0 - - -A3F71: ld a,d - cp 0A0h - ld c,0E2h - set 6,h - jr c,A3F7E - ld c,0A2h - res 7,h -A3F7E: in a,(c) - ex af,af' - di - out (c),a - db 0DDh - ld b,h - db 0DDh - ld h,c - db 0DDh - ld c,l - ldir - ex af,af' - db 0DDh - ld c,h - out (c),a - ld a,h - and 7Fh - ei - ret nz - ld c,0E2h - in b,(c) - ld a,0FEh - out (c),a - ex af,af' - db 0DDh - ld h,0C2h - db 0DDh - ld l,a - ld a,(ix+0) - ex af,af' - out (c),b - ld h,0C0h - ret - - -A3FAD: ld a,d - cp 0A0h - ld c,0E2h - set 6,h ; 00->40h - jr c,A3FBA - ld c,0A2h - res 7,h -A3FBA: in a,(c) - ex af,af' - di - out (c),a - db 0DDh - ld b,h - db 0DDh - ld h,c - db 0DDh - ld c,l - ex de,hl - ldir - ex de,hl - ex af,af' - db 0DDh - ld c,h - out (c),a - ld a,h - and 7Fh - ei - ret nz - ld c,0E2h - in b,(c) ; сохр. порт - ld a,0FEh ; номер стр. - out (c),a - ex af,af' - db 0DDh - ld h,0C2h - db 0DDh - ld l,a - ld a,(ix+0) - ex af,af' - out (c),b ; восст. порт - ld h,0C0h - ret - - - include "cursor.asm" - - - - - - -; вход: de=скен-код/ascii-код (d - сбр. 7-й бит) -; -;TSR: ld a,b -; and 00110000b ; биты Ctrl+Alt -; cp 00110000b ; 30h -; jp nz,A06DD ; сохр. de,bc в кольц. буфере клавы -; ; de=скен-код/ascii-код -; ; очистить буфер клавиатуры -; ld a,(D0641) -; ld (D0640),a -; ret; -; ; -; res 7,d -; ld a,d -; ld e,a -; ld d,0 ; de=индекс скен-кода (hot-клавиши) -; ; вкл. стр. с таблицей -; ld a,3 ; лог. номер дос-банки -; call set_dos_page ; подкл. дос-банку в 0C000h -; ld (tsr2+1),a ; старая банка 0E2h порта -; ; -; ld hl,0C000h -; add hl,de ; адрес элемента обраб. hot-клавиши -; ld a,(hl) -; or a -; jr z,tsr1 ; обраб. не определен -; ld (tsr2+1),a ; стр. обработчика -; inc hl -; ld a,(hl) ; адрес обработчика hot-клавиши -; inc hl -; ld h,(hl) -; ld l,a -; ld (tsr4+1),hl ; адрес обработчика -; jr tsr3 -; ; -;tsr1: -;tsr2: ld a,-1 -; out (0E2h),a ; восст. порт -; ret -; ; -;tsr3: call tsr1 ; вкл. страницу обработчика -;tsr4: jp 0 ; перейти на обработчик - - - - -; раб. буфер, исп. 16 байт (п/п рам-дисков) -;T3FEB: db 0 diff --git a/DOS/DOS.INC b/DOS/DOS.INC deleted file mode 100755 index 16445ae..0000000 --- a/DOS/DOS.INC +++ /dev/null @@ -1,91 +0,0 @@ -true equ 1 -false equ 0 - -; номер версии ДОС -major_version equ 1 ; версия (0..9) -minor_version equ 61 ; модификация (0..99) -build_version equ 10 ; билд (0..999) - -; макс. число дескрипторов файлов в системе -max_handles equ 9 - -; макс. длина строки переменной окружения (имя + значение) -maxlen_env_string equ 255 - - - - -A0000 equ 0 -;A0101 equ 0101h ; 257 ? -L4000 equ 4000h -L403F equ 403Fh ; стек -LC000 equ 0C000h -LC1C0 equ 0C1C0h -LC1C8 equ 0C1C8h -LC400 equ 0C400h -LE400 equ 0E400h ; начало буфера переменных окружения -LFC7F equ 0FC7Fh -LFC80 equ 0FC80h -LFD00 equ 0FD00h -LFDFF equ 0FDFFh -LFE00 equ 0FE00h - ; -LFEE0 equ 0FEE0h ; 32 байта описателя окна (8..31 зарез.) - - - - - -; Коды ошибок ДОС -; -EZERO equ 0 ; No error -EINVFNC equ 1 ; Invalid function -EINVDRV equ 2 ; Invalid drive number -ENOFILE equ 3 ; File not found -ENOPATH equ 4 ; Path not found -EINVHND equ 5 ; Invalid handle -EMFILE equ 6 ; Too many open files -EEXIST equ 7 ; File already exists -EROFILE equ 8 ; File read only -EROOT equ 9 ; Root overflow -ENOSPACE equ 10 ; No free space -ENOEMPTY equ 11 ; Directory not empty -ECURDIR equ 12 ; Can't delete current directory -EINVMED equ 13 ; Invalid media -EUNOPER equ 14 ; Unknown operation (невозм. операция) -EEXISDIR equ 15 ; Directory exist -EINVFNAM equ 16 ; Invalid filename -EINVEXE equ 17 ; Invalid EXE-file -ENSUPEXE equ 18 ; Not supported EXE-file -EACCES equ 19 ; Access denied -ENORDY equ 20 ; Not ready -ESEEK equ 21 ; Seek error -ENOSECT equ 22 ; Sector not found -ECRC equ 23 ; CRC error -EWRTPRT equ 24 ; Write protect -EREAD equ 25 ; Read error -EWRITE equ 26 ; Write error -EDRVFAIL equ 27 ; Drive failure -EEXTND28 equ 28 ; Extended error: 28 -EEXTND29 equ 29 ; Extended error: 29 -ENOMEM equ 30 ; Not enough memory -EINVMEM equ 31 ; Invalid memory block -EEXTND32 equ 32 ; Extended error: 32 -EEXTND33 equ 33 ; Extended error: 33 -EEXTND34 equ 34 ; Extended error: 34 -ETMFILE equ 35 ; Too many files in directory (список файлов) -EDEPTH equ 36 ; (слишком большая влож. папок или >= 1024 папок) -EUABORT equ 37 ; User abort (операция прервана пользователем) -EERR38 equ 38 ; 38 -EERR39 equ 39 ; 39 -EERR40 equ 40 ; 40 -EERR41 equ 41 ; 41 -EERR42 equ 42 ; 42 -EERR43 equ 43 ; 43 -EERR44 equ 44 ; 44 -EERR45 equ 45 ; 45 -EERR46 equ 46 ; 46 -EERR47 equ 47 ; 47 -EERR48 equ 48 ; 48 -EERR49 equ 49 ; 49 -EERR50 equ 50 ; 50 diff --git a/DOS/KEYB.ASM b/DOS/KEYB.ASM deleted file mode 100755 index 6525e79..0000000 --- a/DOS/KEYB.ASM +++ /dev/null @@ -1,1003 +0,0 @@ -; Начинается с 0600h. Внутри идет выравнивание на границу 0900h. -; -; Также включает код "Init_DOS". -; - - - - -; раб. ячейки клавы - -T0600: ds 64 ; 40h (не менять размер, идет AND 3Fh) - ; -D0640: db 0 ; тек. адрес конца кольц. буфера? -D0641: db 0 ; адрес начала кольц. буфера? -; флаги клавы -D0642: db 2 - db 0 - db 0 - db 3 - ; -D0646: dw 0 - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #30. Ожидание нажатия клавиатуры (без эха). -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -;///////////////////////////////////////////////////////////////////// -Func_30:ld hl,D0641 - ld a,(D0640) - cp (hl) - jr z,Func_30 ; нет клавиши - call A06FC - ld a,e - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #31. Опрос клавиатуры без ожидания. -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -; "Z" - нет клавиш -;///////////////////////////////////////////////////////////////////// -Func_31:ld hl,D0641 - ld a,(D0640) - cp (hl) - ret z ; нет клавиши - call A06FC - ld a,e - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #32. Ожидание нажатия клавиатуры (с эхом). -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -;///////////////////////////////////////////////////////////////////// -Func_32: - call focus_to_inpline ; вкл. курсор - call Func_31 ; опрос клавы без ожидания - jr z,$-3 - push de - push bc - push af - call cursor_off ; выкл. курсор - pop af - or a ; добавил - call nz,Func_5B ; вывод "a" на экран - pop bc - pop de - ld a,e - and a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #33. Получить состояние клавиатуры. -; Возвращает состояние клавиатуры на данный момент. -; Данные берутся не из буфера клавиатуры (как в остальных функциях), -; а непосредственно из результатов последнего сканирования клавиатуры. -; -; вход: нет -; выход: A=0 - нет символов в буфере -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -;///////////////////////////////////////////////////////////////////// -Func_33:ld hl,D0641 - ld a,(D0640) - cp (hl) - ld bc,(D0642) ; флаги клавы - ld a,0 - ret z ; нет клавиши - dec a - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #37. Опрос буфера клавиатуры. -; Возвращаемые регистры, как и в функции 30h (WAITKEY). -; Информация о нажатии остается в буфере. -; -; вход: нет -; выход: A=код символа -; D=скен-код -; Е=код символа -; B=биты Ctrl,Alt,Shift -; C=др.служ.клавиши -; "Z" - нет символов в буфере -;///////////////////////////////////////////////////////////////////// -Func_37:ld hl,D0641 - ld a,(D0640) - cp (hl) - ret z ; нет клавиши - ld l,(hl) - ld h,T0600 / 256 ; 06h ст. байт адреса - ld e,(hl) - inc l - ld d,(hl) - inc l - ld b,(hl) - inc l - ld c,(hl) - ld a,e - ret - - - -;///////////////////////////////////////////////////////////////////// -; Функция #35. Очистить буфер клавиатуры и выполнить функцию. -; -; вход: B=номер функции 30h, 31h, 32h, 33h -; выход: В зависимости от указанной функции в регистре B. -;///////////////////////////////////////////////////////////////////// -Func_35:ld a,(D0641) ; адрес начала кольц.буфера - ld (D0640),a ; тек. адрес в кольц. буфере - ; - ld a,30h-1 - cp b - jr c,A06D1 - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A06D1: ld a,35h ; номер функции - cp b - jr nc,A06DA - ld a,EINVFNC ; код "неверный номер функции" - scf - ret - ; -A06DA: ld c,b - rst 10h - ret - - - - -A06DD: ld hl,D0640 - ld a,(D0641) - sub 4 - and 3Fh ; ограничить адрес конца кольц. буфера - cp (hl) - jr z,A0716 ; бип, конец кольц. буфера - ld a,(hl) - inc (hl) ; ячейка D0640 - inc (hl) - inc (hl) - inc (hl) - res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) - ld l,a - ld h,T0600 / 256 ; 06h ст. байт адреса - ld (hl),e - inc l - ld (hl),d - inc l - ld (hl),b - inc l - ld (hl),c - ret - -A06FC: ld hl,D0641 - ld a,(D0640) - cp (hl) - ret z ; нет клавиши - ld a,(hl) - inc (hl) - inc (hl) - inc (hl) - inc (hl) - res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) - ld l,a - ld h,T0600 / 256 ; 06h ст. байт адреса - ld e,(hl) - inc l - ld d,(hl) - inc l - ld b,(hl) - inc l - ld c,(hl) - ret - -; бип -A0716: ex af,af' - bit 0,(ix+3) - jr z,A0728 - exx - ld de,230 ; задержка внутр. цикла - ld hl,50 ; задержка внеш. цикла - call beep ; звук - exx -A0728: ex af,af' - ret - - - - -A072A: set 7,(ix+2) - jr A0740 - -A0730: set 6,(ix+2) ; уст. бит "отжата" - jr A0740 - -A0736: set 5,(ix+2) - jr A0740 - -; сканирование клавы -keyb_scan: - ld ix,D0642 ; флаги клавы -A0740: in a,(19h) ; порт статуса - rra ; 0-bit, очередной байт пришел ? - ret nc ; нет - in a,(18h) - cp 0F0h ; клавиша отжата ? - jr z,A0730 ; да, уст. 6 bit - cp 0E0h ; признак "Upgrade Code" у Антона - jr z,A072A ; уст. 7 bit (расш. скен-код) - cp 0E1h ; Pause - jr z,A0736 ; уст. 5 bit - ; - ld l,a - bit 6,(ix+2) ; отжата клавиша ? - jr nz,A07B3 ; да, на сброс битов регистра "B" (ix+1) - call A0990 - call A0892 ; уст. биты регистра "B" (ix+1) - res 7,(ix+2) ; сбр. бит "расш. скен-код" ? - res 5,(ix+2) ; сбр. бит паузы - ret z ; не сохранять код, биты устанавливались - call A09B4 - ; - ld hl,1C00h ; Caps Lock - and a - sbc hl,de - call z,A07C8 - ld hl,0B800h ; Space + Ctrl, Alt - and a - sbc hl,de - call z,A07D1 ; перекл. бита Rus/Lat - ld hl,5000h ; Ins - and a - sbc hl,de - call z,A07EF - ld hl,4900h ; Num Lock - and a - sbc hl,de - call z,A07F8 ; инв. 3-й бит (бит Num Lock) - ld hl,0C900h ; Pause или Num Lock+80h (Num Lock+Ctrl/Atl/Shift) - and a - sbc hl,de - call z,A0801 - ld hl,4800h ; Scroll Lock - and a - sbc hl,de - call z,A081E ; инв. 2-й бит (бит Scroll Lock) - ld hl,0CF00h ; Del+80h (с Shift) - and a - sbc hl,de - call z,reboot_system ; тест на Ctrl+Alt - ld bc,(D0642) ; флаги клавы - jp A06DD ;## сохр. de,bc в кольц. буфере клавы - ;jp TSR; - ;ret ; не оптимизить - - -A07B3: res 6,(ix+2) ; сбр. бит "клавиша отжата" - call A0990 - call A0837 ; сбр. биты регистра "B" (ix+1) - res 7,(ix+2) ; сбр. бит "расш. скен-код" ? - ld h,0 - ld (D0646),hl - ret - -A07C8: ld a,(ix+0) - xor 1 - ld (ix+0),a - ret - -A07D1: bit 5,(ix+1) ; бит Ctrl ? - ret z ; нет - ld a,(ix+0) - xor 80h ; 7-й бит (1=Rus,0=Lat) - ld (ix+0),a - bit 1,(ix+3) - ret z - exx - ld de,190 ; задержка внутр. цикла - ld hl,20 ; задержка внеш. цикла - call beep ; звук - exx - ret - -A07EF: ld a,(ix+0) - xor 2 ; 1-й бит - ld (ix+0),a - ret - -A07F8: ld a,(ix+0) - xor 8 ; 3-й бит - ld (ix+0),a - ret - -; Pause или Num Lock + Ctrl, Atl, Shift -A0801: bit 5,(ix+1) ; бит Ctrl ? - ret z ; нет -; pop hl ; ?? - ld a,(ix+0) - xor 40h ; 6-й бит - ld (ix+0),a - bit 6,(ix+0) - ret z - ei -A0815: halt - bit 6,(ix+0) - jr nz,A0815 - di - ret - -A081E: ld a,(ix+0) - xor 4 - ld (ix+0),a - ret - - -; клавиша Del -reboot_system: - ;bit 5,(ix+1) ; бит Ctrl - ;ret z - ;bit 4,(ix+1) ; бит Alt - ;ret z - ld c,00110000b ; биты Ctrl+Alt - ld a,(ix+1) - and c - cp c - ret nz - ; софтовый ребут - xor a - ld bc,01FDh - rst 08h - ret - - - -;------------------------------------------------- -; Сбросить биты регистра "B" (ix+1) -;------------------------------------------------- -A0837: ld a,l - cp 37h - jr nz,A084A - res 2,(ix+1) - bit 0,(ix+1) - ret nz - res 4,(ix+1) - ret - ; -A084A: cp 39h - jr nz,A085C - res 0,(ix+1) - bit 2,(ix+1) - ret nz - res 4,(ix+1) - ret - ; -A085C: cp 36h - jr nz,A086E - res 3,(ix+1) - bit 1,(ix+1) - ret nz - res 5,(ix+1) - ret - ; -A086E: cp 3Ah - jr nz,A0880 - res 1,(ix+1) - bit 3,(ix+1) - ret nz - res 5,(ix+1) - ret - ; -A0880: cp 29h - jr nz,A0889 - res 7,(ix+1) ; сбр. бит LShift - ret - ; -A0889: cp 34h - ret nz - res 6,(ix+1) ; сбр. бит RShift - ret - - -;------------------------------------------------- -; Установить биты регистра "B" (ix+1) -;------------------------------------------------- -A0892: ld a,l - cp 37h - jr nz,A08A0 - set 2,(ix+1) - set 4,(ix+1) - ret - ; -A08A0: cp 39h - jr nz,A08AD - set 0,(ix+1) - set 4,(ix+1) - ret - ; -A08AD: cp 36h - jr nz,A08BA - set 3,(ix+1) - set 5,(ix+1) - ret - ; -A08BA: cp 3Ah - jr nz,A08C7 - set 1,(ix+1) - set 5,(ix+1) - ret - ; -A08C7: cp 29h - jr nz,A08D0 - ;-- поставил (фикс глюка PrintScreen) - ; при нажатии PrnScrn, клава выдает двойной код: LShift и PrnScrn - bit 7,(ix+2) ; был расш. скен-код (#E0) ? - jr z,$+4 ; нет (Ctrl,Alt,Shift не нажаты) - xor a ; флаг "Z" (не сохр. код #29 LShift) - ret - ;-- - set 7,(ix+1) ; уст. бит LShift - ret - ; -A08D0: cp 34h - ret nz - set 6,(ix+1) ; уст. бит RShift - ret - - - - -;///////////////////////////////////////////////////////////////////// -; -; Начальная инициализация ДОС -; -;///////////////////////////////////////////////////////////////////// -Init_DOS: - di - call init_keyb_ports ; иниц. LPT-портов для клавы - call A10D1 ; иниц. ?? портов + lpt-портов клавы - ld c,0 ; иниц. мышки - rst 30h - ld a,(mode_screen) ; тек. режим экрана - ld c,81h ; инфа о смене режима (для мышки) - rst 30h - call scan_all_devices ; определить все девайсы в системе - ei - ; уст. вектор на функцию #00 - ld de,Func_00 ; адрес функции "номер версии ДОС" - ld hl,T0200 ; таблица мл. разрядов адресов - ld (hl),e ; сохр. мл.разряд - inc h ; 0300h - ld (hl),d ; сохр. ст.разряд - ; - ld bc,03C2h ; выделить 3 банки памяти - ;ld bc,04C2h ; выделить 4 банки памяти - rst 08h - ld hl,list_dos_pages ; 16 байт, номера банок расширения ДОС - ld c,a ; дескр. блока - ld b,-1 -A00DF: inc b - push bc ; b=номер страницы в блоке - push hl - ld a,c ; дескр. блока - ld c,0C4h ; получить физ. номер стр. блока - rst 08h - pop hl - pop bc - ld (hl),a ; сохр. номер банки - inc hl - jr nc,A00DF - ; - call setup_znak ; настр. знакоген. курсора - ld b,-1 ; иниц. буфера окружения ? - call Func_46 ; системная окружения - jp Func_00 ; функция "номер версии ДОС" - - - - - - ;ds 0900h - $ ; выровнить на границу xx00h -L0900 equ $+100h AND 0FF00h - ds L0900 - $ - - - -; Должно начинаться точно с xx00h! (не стал фиксить (для скорости)). -; Скен-коды клавиш, 144 байта. -A0900: db 0,43h,0,3Fh,3Dh,3Bh,3Ch,46h - db 0,44h,42h,40h,3Eh,0Fh,0,0 - db 0 - db 37h,29h,0 - db 36h,10h,2,0 - db 0,0,2Ah,1Eh,1Dh,11h,3,0 - db 0,2Ch,2Bh,1Fh,12h,5,4,0 - db 0,38h,2Dh,20h,14h,13h,6,0 - db 0,2Fh,2Eh,22h,21h,15h,7,0 - db 0 -;A0939: - db 0 -;A093A: - db 30h,23h,16h,8,9,0,0,31h - db 24h,17h,18h,0Bh,0Ah -;A0947: - db 0,0,32h -;A094A: - db 33h,25h,26h,19h -;A094E: - db 0Ch,0,0,0,27h,0,1Ah,0Dh - db 0,0,1Ch,34h - db 28h,1Bh,0,35h - db 0,0,0,0,0,0,0,0 - db 0Eh,0,0,51h,0,54h,57h,0 - db 0,0,50h,4Fh,52h,55h,56h,58h - db 1,49h,45h,4Dh,53h,4Ch - db 4Bh,59h - db 48h,0,0,0,0,41h,0,0 - db 0,0,0,0,0,0,0,0 - db 0,0 - - - -A0990: bit 7,(ix+2) ; бит "расш. скен-код" ? - jr z,A09B0 - cp 11h ; Alt (левый/правый) - ld l,39h ; RAlt - ret z - cp 14h ; Ctrl (левый/правый) - ld l,3Ah ; RCtrl - ret z - cp 5Ah ; Enter - ld l,4Eh ; enter - ret z - cp 4Ah ; / - ld l,a;4Ah ; / - ret z - cp 7Ch ; "*" в доп.поле, PrintScreen - ld l,47h ; PrintScreen - ret z - ld l,a -A09B0: ld h,A0900 / 256 ; 09h ст. байт адреса - ld l,(hl) ; загрузить скен-код - ret - - -A09B4: ld d,l - ld e,0 - bit 7,(ix+0) - jp nz,A09F6 - ld a,(ix+1) - and 0C0h - jr nz,A09E3 - set 7,d - bit 4,(ix+1) - ret nz - bit 5,(ix+1) - ret nz - ld d,l - ld bc,T0B75 ; Lat-раскладка с вкл. CapsLock - bit 0,(ix+0) - jr nz,A09DE - ld bc,T0AC1 ; нормальная Lat-раскладка -A09DE: ld h,0 - add hl,bc - ld e,(hl) - ret - ; -A09E3: ld bc,T0B1B ; Lat-раскладка с Shift - bit 0,(ix+0) - jr z,A09EF - ld bc,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift -A09EF: ld h,0 - add hl,bc - ld e,(hl) - set 7,d - ret - ; - ; -A09F6: ld a,(ix+1) - and 0C0h - jr nz,A0A1B - set 7,d - bit 4,(ix+1) - ret nz - bit 5,(ix+1) - ret nz - ld d,l - bit 0,(ix+0) - ld bc,T0CDD ; Rus-раскладка с вкл. CapsLock - jr nz,A0A16 - ld bc,T0C29 ; нормальная Rus-раскладка -A0A16: ld h,0 - add hl,bc - ld e,(hl) - ret - ; -A0A1B: ld bc,T0C83 ; Rus-раскладка с Shift - bit 0,(ix+0) - jr z,A0A27 - ld bc,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift -A0A27: ld h,0 - add hl,bc - ld e,(hl) - set 7,d - ret - - - - - - - - - -;///////////////////////////////////////////////////////////////////// -; Функция #36. Управление настройками клавиатуры. -; -; вход: B=номер подфункции (0,1,2) -; выход: В зависимости от указанной функции в регистре B. -;///////////////////////////////////////////////////////////////////// -Func_36:inc b - dec b - jr z,A0A49 ; уст. раскладку клавиатуры - dec b - jr z,A0A3F ; получить состояние звуковых переменных - dec b - jr z,A0A44 ; уст. состояние звуковых переменных - ld a,EUNOPER ; код "невозможная операция" - scf - ret - -;B=1. Получить состояние звуковых переменных -A0A3F: ld a,(D0003) - and a - ret - -;B=2. Установить состояние звуковых переменных -; A=значение переменной -; D0 - сигнал переполнения буфера клавиатуры -; D1 - сигнал переключения на альтернативную раскладку клавиатуры -A0A44: ld (D0003),a - and a - ret - -;B=0. Установить раскладку клавиатуры -; A=номер раскладки -; 0 - normal -; 1 - shift -; 2 - caps lock -; 3 - caps lock + shift -; 4 - normal (альтернативная клав.) -; 5 - shift (альтернативная клав.) -; 6 - caps lock (альтернативная клав.) -; 7 - caps lock + shift (альтернативная клав.) -A0A49: ld bc,T0B1B - T0AC1 ; 90 размер раскладки в Таблице кодов клавиш - bit 7,a - jr nz,A0A87 - ld de,T0AC1 ; нормальная Lat-раскладка - or a - jr z,A0A83 - ld de,T0B1B ; Lat-раскладка с Shift - dec a - jr z,A0A83 - ld de,T0B75 ; Lat-раскладка с вкл. CapsLock - dec a - jr z,A0A83 - ld de,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0A83 - ld de,T0C29 ; нормальная Rus-раскладка - dec a - jr z,A0A83 - ld de,T0C83 ; Rus-раскладка с Shift - dec a - jr z,A0A83 - ld de,T0CDD ; Rus-раскладка с вкл. CapsLock - dec a - jr z,A0A83 - ld de,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0A83 - xor a ; код - scf - ret - ; -A0A83: ldir - xor a - ret - ; -A0A87: res 7,a - ld de,T0AC1 ; нормальная Lat-раскладка - or a - jr z,A0ABC - ld de,T0B1B ; Lat-раскладка с Shift - dec a - jr z,A0ABC - ld de,T0B75 ; Lat-раскладка с вкл. CapsLock - dec a - jr z,A0ABC - ld de,T0BCF ; Lat-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0ABC - ld de,T0C29 ; нормальная Rus-раскладка - dec a - jr z,A0ABC - ld de,T0C83 ; Rus-раскладка с Shift - dec a - jr z,A0ABC - ld de,T0CDD ; Rus-раскладка с вкл. CapsLock - dec a - jr z,A0ABC - ld de,T0D37 ; Rus-раскладка с вкл. CapsLock + Shift - dec a - jr z,A0ABC - xor a - scf - ret - ; -A0ABC: ex de,hl - ldir - xor a - ret - - -; Таблица кодов клавиш (8 раскладок по 90 байт) -; Нормальная раскладка -T0AC1: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"q","w","e","r","t","y","u","i","o","p","[","]" - db 0 ; CapsLock - db "a","s","d","f","g","h","j","k","l",";","'",0Dh - db 0 ; Left Shift - db "z","x","c","v","b","n","m",",",".","/" - db 0 ; Right Shift - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с Shift -T0B1B: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 - db 9,"Q","W","E","R","T","Y","U","I","O","P","{","}" - db 0 ; CapsLock - db "A","S","D","F","G","H","J","K","L",":",'"',0Dh - db 0 ; Left Shift - db "Z","X","C","V","B","N","M","<",">","?" - db 0 ; Right Shift - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock -T0B75: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"Q","W","E","R","T","Y","U","I","O","P","[","]",0 - db "A","S","D","F","G","H","J","K","L",";","'",0Dh,0 - db "Z","X","C","V","B","N","M",",",".","/",0 - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock + Shift -T0BCF: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 - db 9,"q","w","e","r","t","y","u","i","o","p","{","}",0 - db "a","s","d","f","g","h","j","k","l",":",'"',0Dh,0 - db "z","x","c","v","b","n","m","<",">","?",0 - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Нормальная раскладка -T0C29: db "ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 - db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 - db "я","ч","с","м","и","т","ь","б","ю",".",0 - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с Shift -T0C83: db "Ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 - db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 - db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 - db "Я","Ч","С","М","И","Т","Ь","Б","Ю",",",0 - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock -T0CDD: db "Ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 - db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 - db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 - db "Я","Ч","С","М","И","Т","Ь","Б","Ю",".",0 - db '\' - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 ; NumLock - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - ; -; Раскладка с вкл. CapsLock + Shift -T0D37: db "ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 - db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 - db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 - db "я","ч","с","м","и","т","ь","б","ю",",",0 - db "|" - db 0 ; Ctrl - db 0 ; Alt - db 20h ; Space - db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ; доп. поле - db 0 - db "/","*","-","+",0Dh - db 0,0,0,0,0,0,0,0,0,0,0 - - - - -; Звук. -; вход: hl=задержка внеш. цикла -; de=задержка внутр. цикла -beep: ld a,10h - out (0FEh),a ; порт - ld b,d - ld c,e - dec bc - ld a,b - or c - jr nz,$-3 - ld a,0 - out (0FEh),a ; порт - ld b,d - ld c,e - dec bc - ld a,b - or c - jr nz,$-3 - dec hl - ld a,h - or l - jr nz,beep - ret - - - -;------------------------------------------------- -; Иниц. LPT-портов для клавы -;------------------------------------------------- -init_keyb_ports: - ld a,0 - out (19h),a - ld a,1 - out (19h),a - ld a,0 - out (19h),a - ld a,3 - out (19h),a - ld a,0C1h - out (19h),a - ld a,4 - out (19h),a - ld a,7 - out (19h),a - ld a,5 - out (19h),a - ld a,62h - out (19h),a - ret - - - -;PR: push ix -; push hl -; push de -; push af -; push hl; -; ld c,8Eh -; rst 08h -; ld (_pr+1),de -; ld de,1500h -; ld c,84h -; rst 08h -; pop hl; -; ;ld a,l -; call HEX1 -;_pr: ld de,0 -; ld c,84h -; rst 08h -; call newline -; pop af -; pop de -; pop hl -; pop ix -; ret - -;HEXHL: ld a,h -; push hl -; call HEX1 -; pop hl -; ld a,l -;HEX1: push af -; rra -; rra -; rra -; rra -; call HEX2 -; pop af -;HEX2: and 0Fh -; add a,90h -; daa -; adc a,40h -; daa -;symb: jp Func_5B ; вывод символа на экран - -;newline:ld a,0Ah -; call Func_5B -; ld a,0Dh -; jp Func_5B diff --git a/DOS/MOUSE.ASM b/DOS/MOUSE.ASM deleted file mode 100755 index a3b180e..0000000 --- a/DOS/MOUSE.ASM +++ /dev/null @@ -1,874 +0,0 @@ -;=========================================================== -; Вектор мышки -;=========================================================== -MOUSE_vector: - bit 7,c - jr nz,A32E3 ; c >=80h - inc c - dec c ; c=0 иниц. мышки - jr z,init_mouse - dec c ; c=1 показать мышку - jr z,show_mouse - dec c ; c=2 скрыть мышку - jp z,hide_mouse - dec c ; c=3 узнать сост. мышки - jp z,get_mouse_status - dec c ; c=4 уст. координаты мышки - jp z,set_mouse_coords - dec c ; c=5 заглушка - jp z,A32DF - dec c ; c=6 заглушка - jr z,A32DF - dec c ; c=7 уст. Y границы перем. мышки - jp z,set_y_limit - dec c ; c=8 уст. X границы перем. мышки - jp z,set_x_limit - dec c ; c=9 загрузить курсор мышки - jp z,A3385 - dec c ; c=0Ah уст. символ/атрибут мышки для текст. режима - jp z,A341F - dec c ; c=0Bh получить курсор мышки - jp z,A33CC - dec c ; c=0Ch заглушка - jr z,A32DF - dec c ; c=0Dh заглушка - jr z,A32DF - dec c ; c=0Eh получить чувствит. мышки - jp z,A342D - dec c ; c=0Fh уст. чувств. мышки - jp z,A3428 -A32DF: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - -; c >= 80h -A32E3: res 7,c - inc c - dec c ; c=80h Обработчик аппаратн. прерывания от мыши - jp z,A374B - dec c ; c=81h инфа для мышки о смене режима экрана - jp z,A3700 - dec c ; c=82h заглушка - jr z,A32F5 - dec c ; c=83h принуд. перерисовка мышки - jp z,A3760 -A32F5: ld a,EINVFNC ; код "неверный номер функции" - scf - ret - - -;----------------------------------------------------------- -; Функция #00. Инициализация драйвера мышки -;----------------------------------------------------------- -init_mouse: - di - ld a,55h - out (10h),a - ld a,2Dh - out (10h),a - ld a,0 - out (1Bh),a - ld a,1 - out (1Bh),a - ld a,0 - out (1Bh),a - ld a,3 - out (1Bh),a - ld a,41h - out (1Bh),a - ld a,4 - out (1Bh),a - ld a,47h - out (1Bh),a - ld a,5 - out (1Bh),a - ld a,0E0h - out (1Bh),a - ei - xor a - ret - - -;----------------------------------------------------------- -; Функция #01. Показать указатель мышки -;----------------------------------------------------------- -show_mouse: - push ix - push hl - push de - ex af,af' - push af - ld hl,(D378C) ; X координата мышки - ld de,(D378E) ; Y координата мышки - di - call A3524 - ld a,true - ld (enable_mouse_cursor),a ; флаг вывода указателя мышки - ei - pop af - ex af,af' - pop de - pop hl - pop ix - xor a - ret - - - -;----------------------------------------------------------- -; Функция #02. Скрыть указатель мышки -;----------------------------------------------------------- -hide_mouse: - push ix - push hl - push de - ex af,af' - push af - di - xor a ; false - ld (enable_mouse_cursor),a ; флаг вывода указателя мышки - call A34D7 - ei - pop af - ex af,af' - pop de - pop hl - pop ix - xor a - ret - - -;----------------------------------------------------------- -; Функция #03. Узнать сотояние мышки -; Возвращает координаты мышки и состояние кнопок -;----------------------------------------------------------- -get_mouse_status: - ld hl,(D378C) ; X координата - ld de,(D378E) ; Y координата - ld a,(D3792) ; 0 bit - левая, 1 bit - правая - and a - ret - - -;----------------------------------------------------------- -; Функция #04. Установить координаты указателя мышки -; Функция перемещает курсор в заданные координаты -; -; вход: hl/de = X/Y координаты -; выход: a = код ошибки, если CF=1 -;----------------------------------------------------------- -set_mouse_coords: - push ix - push hl - push de - ld (D378C),hl ; X координата мышки - ld (D378E),de ; Y координата мышки - ex af,af' - push af - di - call A3772 - ei - pop af - ex af,af' - pop de - pop hl - pop ix - xor a ;? - ret - - - -A3385: push bc - push de - push hl - push ix - ;ld a,l - ;ld (D37A6),a - ;ld a,h - ;ld (D37A7),a - ld (D37A6),hl; ; ширина/высота стрелки мышки - ld c,e - ld b,0 - ld (D379E),bc - ld c,d - ld (D37A0),bc - exx - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld a,(D37A7) ; 14 высота стрелки мышки - ld l,b - ld h,b - add hl,bc - dec a - jr nz,$-2 - push hl - ld bc,257 ;A0101 ; 257 ? - and a - sbc hl,bc - ccf - exx - pop bc - pop hl - ld a,EINVHND ; код "несуществ. дескр. файла" - jr c,A33C7 - ld de,mouse_pointer ; 10x14 массив стрелки мышки - di - ldir - xor a ; код "Ok" -A33C7: pop hl - pop de - pop bc - ei - ret - - -A33CC: push ix - exx - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld a,(D37A7) ; 14 высота стрелки мышки - ld l,b - ld h,b - add hl,bc - dec a - jr nz,$-2 - push hl - ld bc,257 ;A0101 ; 257 ? - and a - sbc hl,bc - ccf - exx - pop bc - pop hl - ld a,EINVHND ; код "несуществ. дескр. файла" - jr c,A340B - ld de,mouse_pointer ; 10x14 массив стрелки мышки - ex de,hl - di - ldir - ;ld a,(D37A6) ;@@ - ;ld l,a - ;ld a,(D37A7) - ;ld h,a - ld hl,(D37A6); ; ширина/высота стрелки мышки - ;ld bc,(D379E) - ;ld e,c - ;ld bc,(D37A0) - ;ld d,c - ld a,(D379E); - ld e,a; - ld a,(D37A0); - ld d,a; - xor a - ;ld c,a - ;ld b,a -A340B: ei - ret - - - -;----------------------------------------------------------- -; Функция #08. Установка гориз. границ перемещения мышки -; -; вход: hl = минимальная -; de = максимальная -;----------------------------------------------------------- -set_x_limit: - ld (D3794),hl - ld (D3796),de - xor a - ret - - - -;----------------------------------------------------------- -; Функция #07. Установка верт. границ перемещения мышки -; -; вход: hl = минимальная -; de = максимальная -;----------------------------------------------------------- -set_y_limit: - ld (D3798),hl - ld (D379A),de - xor a - ret - - - -A341F: ld (D37A2),hl - ld (D37A4),de - xor a - ret - - -A3428: ld (D379C),hl - xor a - ret - - -A342D: ld hl,(D379C) - xor a - ret - - -A3432: ld (A348B+1),hl - ld (A348E+1),de - srl d - rr e - srl d - rr e - srl d - rr e - ld d,e - srl h - rr l - srl h - rr l - srl h - rr l - ld e,l - in a,(89h) - db 0DDh - ld h,a - in a,(0A2h) - db 0DDh - ld l,a - di - ld a,54h ; номер стр. - out (0A2h),a - ld a,d - add a,a - add a,a - ld l,a - ld h,43h ; ст. разряд ? - in a,(0C9h) - rrca - and 80h - or 1 - add a,e - out (89h),a - inc l - ld a,(hl) - ld bc,(D37A2) - and b - xor c - ld (hl),a - inc l - ld a,(hl) - ld bc,(D37A4) - and b - xor c - ld (hl),a - db 0DDh - ld a,l - out (0A2h),a - db 0DDh - ld a,h - out (89h),a - ret - - -A348B: ld hl,0 -A348E: ld de,0 - srl d - rr e - srl d - rr e - srl d - rr e - ld d,e - srl h - rr l - srl h - rr l - srl h - rr l - ld e,l - in a,(89h) - db 0DDh - ld h,a - in a,(0A2h) - db 0DDh - ld l,a - di - ld a,50h - out (0A2h),a - ld a,d - add a,a - add a,a - ld l,a - ld h,43h ; ст. разряд ? - in a,(0C9h) - rrca - and 80h - or 1 - add a,e - out (89h),a - inc l - ld a,(hl) - ld (hl),a - inc l - ld a,(hl) - ld (hl),a - db 0DDh - ld a,l - out (0A2h),a - db 0DDh - ld a,h - out (89h),a - ret - -A34D7: ld a,0 - bit 7,a - jr z,A348B - in a,(0E2h) - ld b,a - in a,(89h) - ld c,a - push bc - ld a,50h - out (0E2h),a -A34E9: ld hl,0 -A34EC: ld de,0 - ld a,e - ex af,af' -A34F1: ld a,0 - and 1 - ld de,LC000 - jr z,A34FD - ld de,LC000+320 -A34FD: add hl,de -A34FE: ld a,0 ; 14 сохр. высота стрелки мышки - db 0DDh - ld h,a - ex af,af' -A3503: ld bc,10 - out (89h),a - ex af,af' - ld (A3510+1),hl - ld d,h - ld e,l - ldir -A3510: ld hl,0 - ex af,af' - inc a - jr z,A351B - db 0DDh - dec h - jr nz,A3503 -A351B: pop bc - ld a,b - out (0E2h),a - ld a,c - out (89h),a - xor a - ret - - -A3524: ld a,(D378B) - ld (A34D7+1),a - bit 7,a - jp z,A3432 - cp 82h ; 130 - jr nz,A3537 - srl h - rr l -A3537: ld ix,mouse_pointer ; 10x14 массив стрелки мышки - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld (D37AA),bc - ld (A3503+1),bc - ld c,b - ld (D37A8),bc - ld a,(D37A7) ; 14 высота стрелки мышки - ld (A34FE+1),a - ld c,a - ld b,0 - ld (D37AC),bc - ld bc,(D37A0) - ld a,e - sub c - ld e,a - jr nc,A357B - neg - ld e,a - ld a,(D37A6) ; 10 ширина стрелки мышки - ld c,a - ld b,0 - ld a,(D37A7) ; 14 высота стрелки мышки - sub e -A3571: add ix,bc - dec e - jr nz,A3571 - ld c,a - ld (D37AC),bc -A357B: ld bc,(D379E) - and a - sbc hl,bc - jr nc,A359A - ld b,h - ld c,l - ld hl,0 - and a - sbc hl,bc - ld (D37A8),hl - ld a,(D37A6) ; 10 ширина стрелки мышки - sub l - ld l,a - ld (D37AA),hl - ld hl,0 -A359A: ld (A34E9+1),hl - ld (A34EC+1),de - push hl - in a,(0E2h) - ld h,a - in a,(89h) - ld l,a - ex (sp),hl - ld a,5Ch ; видео-страница - out (0E2h),a - ld a,e - ex af,af' - in a,(0C9h) - ld (A34F1+1),a - and 1 - ld de,LC000 - jr z,A35BE - ld de,LC000+320 ; начало 2-го экрана ? -A35BE: add hl,de - db 0DDh - ld d,h - db 0DDh - ld e,l - ex de,hl - ld bc,(D37AC) - db 0DDh - ld h,c - ex af,af' -A35CB: ld bc,(D37A8) - add hl,bc - ld bc,(D37AA) - out (89h),a - ex af,af' - ld (A35DD+1),de - ldir -A35DD: ld de,0 - ex af,af' - inc a - jr z,A35E8 - db 0DDh - dec h - jr nz,A35CB -A35E8: pop bc - ld a,b - out (0E2h),a - ld a,c - out (89h),a - xor a - ret - - -A35F1: in a,(1Bh) - rrca - ret nc - in a,(1Ah) - ld l,a - bit 6,a - ccf - ret z - in a,(1Bh) - rrca - jr nc,$-3 - in a,(1Ah) - ld e,a - bit 6,a - ccf - ret nz - in a,(1Bh) - rrca - jr nc,$-3 - in a,(1Ah) - ld d,a - bit 6,a - ccf - ret nz - ld a,e - and 3Fh - ld e,a - ld a,l - and 3 - rrca - rrca - or e - ld e,a - ld a,d - and 3Fh - ld d,a - ld a,l - and 0Ch - rrca - rrca - rrca - rrca - or d - ld d,a - ld a,l - rlca - rlca - rlca - res 6,a - jr nc,$+4 - set 6,a - rlca - rlca - and 3 - ld (D3792),a ; сост. кнопок: 0/1 bits - левая/правая - call A36C3 - ;ld a,e ;@@ - ;ld (D3790),a - ;ld a,d - ;ld (D3791),a - ld (D3790),de - scf - ret - - -A364B: ld hl,(D378C) ; X координата мышки - ld de,(D3790) - ld d,0 - bit 7,e - jr nz,A366F - add hl,de - ld (D378C),hl ; X координата мышки - ex de,hl - ld hl,(D3796) - and a - sbc hl,de - jr nc,A3689 - ld hl,(D3796) - ld (D378C),hl ; X координата мышки - jr A3689 - ; -A366F: ld a,e - neg - ld e,a - and a - sbc hl,de - ld (D378C),hl ; X координата мышки - jr c,A3683 - ld de,(D3794) - sbc hl,de - jr nc,A3689 -A3683: ld hl,(D3794) - ld (D378C),hl ; X координата мышки -A3689: ld hl,(D378E) ; Y координата мышки - ld de,(D3791) - ld d,0 - bit 7,e - jr nz,A36A9 - add hl,de - ld (D378E),hl ; Y координата мышки - ex de,hl - ld hl,(D379A) ; макс. Y граница для указателя - and a - sbc hl,de - ret nc - ld hl,(D379A) ; макс. Y граница для указателя - ld (D378E),hl ; Y координата мышки - ret - ; -A36A9: ld a,e - neg - ld e,a - and a - sbc hl,de - ld (D378E),hl ; Y координата мышки - jr c,A36BC - ld de,(D3798) ; мин. Y граница для указателя - sbc hl,de - ret nc -A36BC: ld hl,(D3798) ; мин. Y граница для указателя - ld (D378E),hl ; Y координата мышки - ret - - -A36C3: ld hl,(D379C) - ld a,l - or l - ret z - dec a - ret z - ld a,e - bit 7,a - ld b,0FFh - jr z,A36D6 - ld b,7Fh - neg -A36D6: inc b - sub l - jr nc,A36D6 - bit 7,b - jr z,A36E4 - ld a,b - res 7,a - neg - ld b,a -A36E4: ld e,b - ld a,d - bit 7,a - ld b,0FFh - jr z,A36F0 - ld b,7Fh - neg -A36F0: inc b - sub h - jr nc,A36F0 - bit 7,b - jr z,A36FE - ld a,b - res 7,a - neg - ld b,a -A36FE: ld d,b - ret - - -A3700: ld (D378B),a - or a - jr z,A3720 - cp 1 - jr z,A3720 - cp 2 ; 40x32x16 текстовый - jr z,A3723 - cp 3 ; 80x32x16 текстовый - jr z,A3737 - bit 7,a - jr z,A3720 - ; граф. режимы экрана - ;res 7,a ;@@ - cp 81h ; 320x256x256 - jr z,A3723 - cp 82h ; 640x256x16 - jr z,A3737 -A3720: xor a - scf - ret - -; 320x256x256 режим -A3723: ld de,319 ; макс. X граница -A3726: ld hl,0 ; мин. X/Y границы - call set_x_limit ; уст. X границу перем. указателя - ld de,255 ; макс. Y граница - jp set_y_limit ; уст. Y границу перем. указателя - -; 640x256x16 режим -A3737: ld de,639 ; макс. X граница - jr A3726 - - - - -;----------------------------------------------------------- -; Функция #80. Обработчик аппаратн. прерывания от мыши -; -; По приходу прерывания от мыши вызывается данная функция -; драйвера. В случае, когда требуется работа подпрограммы -; при запрещенных прерываниях, используйте данную функцию, -; чтобы избежать потери пакетов данных от мыши. -;----------------------------------------------------------- -A374B: in a,(0E2h) - ld b,a - in a,(89h) - ld c,a - push bc - call A3772 - call A3765 - pop bc - ld a,b - out (0E2h),a - ld a,c - out (89h),a - ret - - -A3760: call A3765 - and a - ret - - -A3765: call A35F1 - ret nc - call A364B - ld a,0 - ld (A3776+1),a - ret - - -A3772: db 3Eh ; ld a,.. -enable_mouse_cursor: - db false ; флаг вывода указателя мышки - or a - ret z ; не выводить указатель -A3776: ld a,0 - call A34D7 - ld hl,(D378C) ; X координата мышки - ld de,(D378E) ; Y координата мышки - call A3524 - ld a,-1 - ld (A3776+1),a - ret - - - - - -D378B: db 3 -D378C: dw 160 ; X координата мышки -D378E: dw 128 ; Y координата мышки -D3790: db 0 -D3791: db 0 -D3792: db 0 ; сост. кнопок: 0/1 bits - левая/правая - db 0; ; нужен ? - ; -D3794: dw 0 -D3796: dw 319 -D3798: dw 0 ; мин. Y граница для указателя -D379A: dw 255 ; макс. Y граница для указателя - -D379C: dw 0 -D379E: dw 0 -D37A0: dw 0 - ; -D37A2: dw 0FF00h -D37A4: dw 0FF77h - ; -D37A6: db 10 ; ширина стрелки мышки -D37A7: db 14 ; высота стрелки мышки - ; -D37A8: dw 0 -D37AA: dw 0 -D37AC: dw 0 - - - -; Стрелка мышки. Массив 10x14 байтов + 116 = 256 -mouse_pointer: - db 0,0,-1,-1,-1,-1,-1,-1,-1,-1 ; 1 - db 0,-2,0,-1,-1,-1,-1,-1,-1,-1 ; 2 - db 0,-2,-2,0,-1,-1,-1,-1,-1,-1 ; 3 - db 0,-2,-2,-2,0,-1,-1,-1,-1,-1 ; 4 - db 0,-2,-2,-2,-2,0,-1,-1,-1,-1 ; 5 - db 0,-2,-2,-2,-2,-2,0,-1,-1,-1 ; 6 - db 0,-2,-2,-2,-2,-2,-2,0,-1,-1 ; 7 - db 0,-2,-2,-2,-2,0,0,0,0,-1 ; 8 - db 0,-2,-2,0,-2,0,-1,-1,-1,-1 ; 9 - db 0,-2,0,0,-2,-2,0,-1,-1,-1 ; 10 - db 0,0,-1,-1,0,-2,0,-1,-1,-1 ; 11 - db 0,-1,-1,-1,0,-2,-2,0,-1,-1 ; 12 - db -1,-1,-1,-1,-1,0,0,-1,-1,-1 ; 13 - db -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ; 14 - ; - ds 256-140 ; 116 diff --git a/DOS/README.RUS b/DOS/README.RUS deleted file mode 100755 index b873111..0000000 --- a/DOS/README.RUS +++ /dev/null @@ -1,22 +0,0 @@ -Версию ДОС обозвал как 1.61. -Установка: заменить оригинальный файл "system.dos". - - -1. Исправлена фирменная ошибка, при которой происходило зависание -системы (непредсказуемое поведение) при превышении макс. числа -открытых дескрипторов. Однажды, во времена портирования M80.EXE, -из-за данного бага и конечно неудачного расположения звезд на небе, -был снесен весь логический диск "C". - -2. Появилась новая функция: - - Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. - вход: нет - выход: A - номер последнего лог. диска в системе - -Предназначена для создателей RAM-дисков. Для доступа к созданному -RAM-диску не нужно перезагружать компьютер. - -3. В отличии от оригинала, функции 0Ah/0Bh (Create file/New create file) -перед созданием файла проверяют на переполнение таблицу свободных -дескрипторов. diff --git a/DOS/pr.bat b/DOS/pr.bat deleted file mode 100755 index ab47e4d..0000000 --- a/DOS/pr.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -..\asmplus.exe dos.asm SYSTEM.DOS -if errorlevel 1 goto ERR -echo Ok! -goto END - -:ERR -del system.dos -echo ошибки компиляции... - -:END -del dos.lst diff --git a/DOS/readme.! b/DOS/readme.! deleted file mode 100755 index 15647ee..0000000 --- a/DOS/readme.! +++ /dev/null @@ -1 +0,0 @@ -При создании файла, папки и др. операций с путем (диском) - ДОС меняет текущий путь !!!. diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index b8c12cd..e4a72e6 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -61,7 +61,6 @@ FM_BUF: _sFM ENDM //////////////////////////////////////////////////////////////////////// - SET_FM: _mFM_FIND LD A,DSS_Error.sys.NO_ERROR RET NZ diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index a9bd714..f566f87 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -545,7 +545,9 @@ SIZEBLK: LD B,#FF XOR A RET -LEAVMEM: LD HL,MEMTAB +//////////////////////////////////////////////////////////////////////// +FREE_PROCESS_MEMORY: + LD HL,MEMTAB LD BC,256 ;!HARDCODE размер блока страниц ОЗУ .loop: LD A,(TASK) CPIR @@ -561,7 +563,31 @@ LEAVMEM: LD HL,MEMTAB POP BC POP HL JP .loop +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +FREE_PROCESS_FMs: + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size + LD B,FMCOUNT+1 + LD A,(TASK) +.loop: ADD IY,DE + CP (IY+_sFM.TASK_NUM) + CALL Z,.CLOSE + DJNZ .loop + RET + ; +.CLOSE: PUSH IY + PUSH DE + PUSH AF + LD A,FMCOUNT+1 + SUB B + CALL CLOSE_FN + POP AF + POP DE + POP IY + RET +//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ; Функция #38. Подключение страницы памяти. ; @@ -1055,10 +1081,6 @@ _TST_PROC: IN A,(SLOT1) PUSH DE PUSH AF - ;[x] 25/10/23 close EXE FM - LD A,(EXE_FM) - PUSH AF - ; LD (EXSTACK),SP LD SP,HL EXX @@ -1165,13 +1187,11 @@ _TST_PROC_2: ; ;///////////////////////////////////////////////////////////////////// LEAVE: LD A,B - LD (ERLEVEL),A - CALL LEAVMEM + LD (ErrorLevel),A + CALL FREE_PROCESS_MEMORY LD SP,(EXSTACK) - ;[x] 25/10/23 close EXE FM - POP AF - ;CALL RES_FM - CALL CLOSE_FN + ;[x] 10/12/23 close EXE FMs + CALL FREE_PROCESS_FMs _mDECTASK ; POP AF @@ -1186,7 +1206,7 @@ LEAVE: LD A,B LD (EXSTACK),SP LD SP,HL EX DE,HL - LD A,(ERLEVEL) + LD A,(ErrorLevel) ;R12 CP DSS_Error.sys.UNEXPECTED_APP_TRMN JR NZ,.exit @@ -1202,7 +1222,7 @@ LEAVE: LD A,B ; вход: нет ; выход: A - код завершения ;///////////////////////////////////////////////////////////////////// -WAIT: LD A,(ERLEVEL) +WAIT: LD A,(ErrorLevel) AND A RET ;///////////////////////////////////////////////////////////////////// @@ -1302,7 +1322,7 @@ TASK: DB #01 ; RAMMAP: DB #00,#00,#00,#00 -ERLEVEL: DB #00 ; код завершения программы (процесса) +ErrorLevel: DB #00 ; код завершения программы (процесса) EXE_FM: DB #00 ; дескр. файла EXE_MEM: DB #00 ; идентификатор блока памяти diff --git a/DSS/build.txt b/DSS/build.txt index bc93f94..be2fb0a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -786 \ No newline at end of file +789 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index a00c92c..959344c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -19,11 +19,17 @@ echo_mode: ; Запуск bat-файла ; вход: hl=имя файла ;------------------------------------------------- -A83E8: call BATCH +RUN_BAT: + ; [ ] 11/12/23 вложенные bat +;.level+1: + ; LD A,(BAT_FM) + ; OR A + ; jr nz,.new_process + ; ; + call BATCH jp c,A83DD ; ошибка откр. файла (cpp.asm) ret - - +;------------------------------------------------- ; вход: b=число слов "ZERO".."NINE" MAKE_BATCH_PRM_ARRAY: @@ -78,6 +84,14 @@ BATCH: push hl ; ex de,hl .B_ALL_P: pop hl ; восст. имя bat-файла + ; [ ] 11/12/23 вложенные bat + ld a,(BAT_FM) + or a + jr z,1F + CALL .new_process + xor a + ret +1: ; ld a,Dss.Open.R ; на чтение ld c,Dss.Open ; открыть файл RST ToDSS @@ -91,9 +105,47 @@ BATCH: push hl ; ld (BAT_FM),a ; дескр. bat-файла ; выполн. команд bat-файла call NEWLINE + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat xor a ret + ; [ ] 11/12/23 вложенные bat +.new_process: + ld de,work_buffer + call copy_string + ; + ld hl,.shell + ld de,struct_input_line+5 + call copy_string + ; + ld hl,work_buffer + ld de,struct_input_line+5 + .shell.size - 1 + call copy_string + ; + ; ld c,Dss.CurDisk + ; rst ToDSS + ; add a,'A' + ; ld (.shell),a + ; + ld hl,struct_input_line+5 + ld bc,Dss.Exec;.Here + rst ToDSS + ; + ; PUSH AF + ; LD A + ret nc + CP DSS_Error.sys.FILE_NOT_FOUND + jp z,A83DD ; ошибка откр. файла (cpp.asm) + ret +;.shell: DB '?:\SYSTEM.EXE /C ',0 + +.shell: DB 'SYSTEM.EXE /C ',0 +.shell.size EQU $ - .shell +; +.ErrorEnv: DB 'ERRORLEVEL=' +.ErrorEnv.Code: DB 'xxx',0 +.ErrorEnv.Size EQU $ - .ErrorEnv + ; ;--------------------------------------------------- ; Выполнение команд BAT-файла @@ -106,20 +158,27 @@ NEWLINE: or a ; a=число прочит. байт jr nz,.BATLINE ex de,hl - ;ld de,T96AE ;;256 буфер (inline.asm) ld de,struct_input_line+5 sbc hl,de - jr z,.exit; ;[x] Vasil, убран баг с незакрытым BAT-файлом + jr z,.exit; ;[x] убран баг с незакрытым BAT-файлом ld a,l ld (struct_input_line+4),a ; длина строки + PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break + ; [ ] 11/12/23 вложенные bat + ; ld a,#FF + ; ld (RUN_BAT.level),a + ; call CMDMODE ; тест на bat-команды "rem","pause" + POP HL ; [ ] 11/12/23 для баланса стека в cmd_break .exit: ld a,(BAT_FM) ; дескр. bat-файла ld c,Dss.Close ; закрыть файл + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat RST ToDSS + xor a + ld (BAT_FM),a ret ; .BATLINE: - ;ld hl,T99B9 ; откуда, 128 буфер (ccp.asm) "work_buffer1" ld hl,work_buffer1 .loop: call MOVWORD ; скопир. work_buffer1 -> struct_input_line+5 jr c,.ADDBAT @@ -127,17 +186,16 @@ NEWLINE: ld (MOVWORD.count),a ; осталось пропарсить прочитанных байтов push hl ex de,hl - ;ld de,T96AE ;;256 буфер (inline.asm) ld de,struct_input_line+5 - ;ld de,work_buffer+256;; sbc hl,de ld a,l - ;ld (D96AD),a ;; длина строки (inline.asm) ld (struct_input_line+4),a ; длина строки + ; [ ] 11/12/23 вложенные bat + ; ld a,#FF + ; ld (RUN_BAT.level),a + ; call CMDMODE ; тест на bat-команды "rem","pause" - ;ld de,T96AE ;;256 буфер (inline.asm) ld de,struct_input_line+5 - ;ld de,work_buffer+256;; pop hl jr .loop @@ -155,7 +213,7 @@ MOVWORD: .loop: ld a,(hl) ld (de),a cp " " - jr c,.loop2 + jr c,.loop_ inc hl inc de djnz .loop @@ -165,7 +223,7 @@ MOVWORD: .loop2: ld a,(hl) cp " " ret nc - inc hl +.loop_: inc hl djnz .loop2 push de call READBAT ; прочитать 128 байт из файла @@ -196,6 +254,7 @@ READBAT: ; Тест на bat-команды "rem","pause" +; должен соблюдаться баланс стека для cmd_break CMDMODE: ;xor a ;ld (D96A6),a ; (inline.asm) @@ -203,14 +262,13 @@ CMDMODE: ;ld ix,T96AC ; нужно?? закоментарил (inline.asm) ;ld hl,T96AE ;;256 буфер (inline.asm) ld hl,struct_input_line+5 - ;ld hl,work_buffer+256;; ld a,(hl) cp "@" ; 40h - jr nz,A8240 + jr nz,.A8240 dec hl ;ld hl,struct_input_line+4;; dec (hl) - jr z,A825B + jr z,.A825B ld c,(hl) ; длина строки inc hl ld b,0 @@ -219,11 +277,11 @@ CMDMODE: ld e,l inc hl ldir - jr A825B + jr .A825B ; -A8240: ld a,(echo_mode) ; флаг echo-режима +.A8240: ld a,(echo_mode) ; флаг echo-режима or a - jr z,A825B ; off + jr z,.A825B ; off ; вывести сист. путь и строку содержимого bat-файла ;ld de,T96AE ;;256 буфер (inline.asm) ;ld de,struct_input_line+5 @@ -250,7 +308,7 @@ A8240: ld a,(echo_mode) ; фла sub b ei ret z ; правый край экрана - jr c,A8250; ; строка больше ширины экрана + jr c,.A8250; ; строка больше ширины экрана ; заполнить строку до конца экрана dec a ; чтобы не сработал скроллинг экрана ;!FIXIT scroll ld b,a ; число вывод. символов @@ -259,7 +317,7 @@ A8240: ld a,(echo_mode) ; фла RST ToBIOS ei ;!TEST -A8250: call newline +.A8250: call newline ; ; ;ld a,(D96AD) ;; длина строки (inline.asm) @@ -269,7 +327,7 @@ A8250: call newline ;call newline ;jr A8264 ; -A825B: ;ld a,(D96AD) ;; длина строки (inline.asm) +.A825B: ;ld a,(D96AD) ;; длина строки (inline.asm) ld a,(struct_input_line+4) or a ret z @@ -282,15 +340,15 @@ A825B: ;ld a,(D96AD) ;; ld b,0 inc hl ;ld hl,work_buffer+256;; -A826C: ld a,(hl) +.A826C: ld a,(hl) cp " " - jr nz,A8276 + jr nz,.A8276 inc hl dec c - jr nz,A826C + jr nz,.A826C ret ; -A8276: ld d,h +.A8276: ld d,h ld e,l add hl,bc ld (hl),b ; 0 в конец строки (первого конц. пробела) @@ -299,15 +357,19 @@ A8276: ld d,h ex af,af' ld a," " cpir - jr nz,A8286 + jr nz,.A8286 inc c -A8286: ex af,af' +.A8286: ex af,af' sub c ld c,a ; длина слова или строки ? ld hl,BATLIST ; команды "pause","rem" + dos-команды ; de=struct_input_line+5, c=длина строки (без конц. пробелов) ; выполн. команду или запустить файл - jp COMP005.start + ; [ ] 11/12/23 вложенные bat + ; ld a,#FF + ; ld (RUN_BAT.level),a + ; + jp COMP005.start @@ -418,6 +480,7 @@ EVALSTR: ld a,(hl) ; BAT-команды (не отделять от дос-команд) BATLIST: DZ 'PAUSE' : DW cmd_pause ;CPAUSE DZ 'REM' : DW cmd_rem ;CREM + DZ 'EXIT' : DW cmd_break ;break ; ; DSS-команды CMDLIST: DZ 'CD' : DW cmd_chdir ;CCHDIR diff --git a/SHELL/Commands/BREAK.ASM b/SHELL/Commands/BREAK.ASM new file mode 100644 index 0000000..3753220 --- /dev/null +++ b/SHELL/Commands/BREAK.ASM @@ -0,0 +1,8 @@ +; [ ] 11/12/23 +cmd_break: + pop hl ; восстановление баланса стека + pop hl ; восстановление баланса стека + XOR A + ld (MOVWORD.count),a + ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat + JP NEWLINE.exit \ No newline at end of file diff --git a/SHELL/Commands/EXIT.ASM b/SHELL/Commands/EXIT.ASM index 2e20b9d..78f5b9c 100644 --- a/SHELL/Commands/EXIT.ASM +++ b/SHELL/Commands/EXIT.ASM @@ -8,5 +8,5 @@ cmd_exit: dec a dec a ret z ; a=2 (primary шелл) - pop hl ; восст. баланс стека (убрать вызов A82E7 в гл. цикле оболочки) + ;pop hl ; восст. баланс стека (убрать вызов COMP в гл. цикле оболочки) jp back_to_parent_process ; вернуться в родит. процесс diff --git a/SHELL/Commands/REM.ASM b/SHELL/Commands/REM.ASM index 77fa229..5dbfaad 100644 --- a/SHELL/Commands/REM.ASM +++ b/SHELL/Commands/REM.ASM @@ -3,4 +3,5 @@ ; REM. Комментарий (в bat-файле) ; ;/////////////////////////////////////////////////// -cmd_rem:ret +cmd_rem: ret +; diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 31f4e8e..260672b 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -102,10 +102,10 @@ RUN_EXT: ex de,hl ; ; есть расш. файла ld de,T8C1A ; буфер расш. файла ld hl,T8C1E ; "BAT" - ld b,3 ; длина сравнения + ld b,3 ; длина сравнения ;!HARDCODE call A874E ; сравнить строки ld hl,(D8374) - jp z,A83E8 ; выполнить bat-файл (batch.asm) + jp z,RUN_BAT ; выполнить bat-файл (batch.asm) jr A83D7 ; выполнить exe-файл A839D: ld bc,0*256 + Dss.Exec ; загр. и выполнить программу @@ -153,7 +153,7 @@ A83B7: ld e,b inc hl ld (hl),"T" pop hl - jp A83E8 ; выполнить bat-файл (batch.asm) + jp RUN_BAT ; выполнить bat-файл (batch.asm) ; Выполнить exe-файл diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 1a36d36..9eb0307 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -117,14 +117,26 @@ shell: bit 6,a ; 6-й бит (вводились дополн. параметры) jr z,back_to_parent_process ; вводились дополн. параметры + PUSH HL ; [ ] 11/12/23 для баланса стека в cmd_break + ; [ ] 11/12/23 вложенные bat + ; xor a + ; ld (RUN_BAT.level),a + ; call CMDMODE ; (batch.asm) выполн. команду или запустить файл + POP HL ; [ ] 11/12/23 для баланса стека в cmd_break call save_disk_path ; узнать и сохр. тек. диск и путь ; ; Вернуться в родит. процесс back_to_parent_process: - ld bc,0*256 + Dss.Exit - RST ToDSS - ret + ; [ ] 11/12/23 вложенные bat + LD B,0 + JR NC,1F + LD B,A +1: ld c,Dss.Exit + ;ld bc,0*256 + Dss.Exit + ; + JP ToDSS + ;ret @@ -148,7 +160,9 @@ option_c: ;ld hl,work_buffer+256;; ld hl,struct_input_line+5 ; имя bat-файла call BATCH ; обработка bat-файла (batch.asm) + PUSH AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата call save_disk_path ; узнать и сохр. тек. диск и путь + POP AF ; [ ] 11/12/23 вложенные bat, сохраняем код возврата jr back_to_parent_process ; вернуться в родит. процесс @@ -289,7 +303,7 @@ setopt2: cp "S" ; set 5,c jr setopt4 ; -setopt3:cp "C" ; выполн. bat-файл и вернуться в родит. процесс +setopt3: cp "C" ; выполн. bat-файл и вернуться в родит. процесс ret nz set 4,c setopt4: ld a,c @@ -532,6 +546,7 @@ T8C24: db "OFF",0 ; include 'Commands/exit.asm' ; выход в родит. процесс + include 'Commands/break.asm' ; выход из парсера bat include 'Commands/pause.asm' ; пауза include 'Commands/rem.asm' ; комментарий include 'Commands/ver.asm' ; вывод версии ДОС diff --git a/SHELL/build.txt b/SHELL/build.txt index 9754915..f3a5e81 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -259 \ No newline at end of file +281 \ No newline at end of file