From 33f7fbc6b090a10c673b79d339d44c65bdc5f3a5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 15 Jul 2023 05:04:58 +1000 Subject: [PATCH] ... --- BOOT/BOOT.ASM | 5 +- Console/CONSOLE.ASM | 768 +++++++++++++++++++++++++++++--------------- DSS/CHANGES.LOG | 2 + DSS/DOS5.ASM | 5 +- DSS/DOS_FM.ASM | 106 +++++- DSS/VERSION.INC | 39 ++- DSS/build.txt | 1 + Shared_Includes | 2 +- 8 files changed, 643 insertions(+), 285 deletions(-) create mode 100644 DSS/build.txt diff --git a/BOOT/BOOT.ASM b/BOOT/BOOT.ASM index 3fe8460..1649222 100644 --- a/BOOT/BOOT.ASM +++ b/BOOT/BOOT.ASM @@ -1,11 +1,10 @@ -; Последняя редакция: 25.04.2006 +;!TODO определение попытки сделать загрузочным не первый раздел +; Последняя редакция: 25.04.2006 ; Программа записи на FDD/HDD boot-загрузчика и файлов системы. ; ; Загружает сист. файлы из корня диска, с которого была ; загружена система. -; - ; Фитчи программы: ; В отличие от оригинального boot-инсталлятора, эта может diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM index d27dbdb..0f4cab8 100644 --- a/Console/CONSOLE.ASM +++ b/Console/CONSOLE.ASM @@ -7,9 +7,9 @@ ; /S Secondary command processor ; /C Execute batch file -;-------------------------------------------------------------- +;=====================================================================[] ;Rev. Date Name Description -;-------------------------------------------------------------- +;---------------------------------------------------------------------[] ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R09 ??-??-???? DNS ;????? ???? ;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS @@ -21,48 +21,50 @@ ;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 -; - OUTPUT './Build/system.exe' +;=====================================================================[] - ORG #8100-512 include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.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 - DB "EXE" ;EXE ID - DB #00 ;EXE VERSION - DW #0200 ;CODE OFFSET LOW - DW #0000 ;CODE OFFSET HIGH - DW #0000 ;END-BEG ;PRIMARY LOADER - DW #0000 ; - DW #0000 ;RESERVED - DW #0000 ; - DW #8100 ;LOAD ADDRESS - DW #8100 ;START ADDRESS - DW #BFFF ;STACK ADDRESS - - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0 +;---------------------------------------------------------------------[] +; + OUTPUT './Build/system.exe' + include 'Shared_includes/constants/EXE_Header.z80' + ORG org_addr -; DEFS 490,0 +START: + ;INIT + LD A,(IX-1) + LD (TASKX),A + PUSH IX + CALL CRLF + CALL GETPATH + POP IX + + LD HL,WORK_BUFFERS + LD DE,WORK_BUFFERS+1 + LD BC,BUFFERS_STRUCT-1 + LD (HL),0 + LDIR + ; -; LD SP,#BFFF -START CALL INIT CALL GET_CMD EI LD A,(RUNMODE) @@ -92,7 +94,7 @@ FBATCH JP QUIT FPRIMAR LD C,Dss.CTRLKey - RST #10 + RST ToDSS LD A,B AND #C0 JP NZ,CONSOLE @@ -153,7 +155,7 @@ B_ALL_P POP HL ;R07 XOR A LD C,Dss.Open - RST #10 + RST ToDSS ;R10 CALL Restore_Screen ;R10 @@ -191,7 +193,7 @@ ADDBAT PUSH DE CALL CMDMODE LD C,Dss.Close LD A,(BAT_FM) - RST #10 + RST ToDSS RET BATLINE LD HL,BATBUFF @@ -245,7 +247,7 @@ READBAT LD HL,BATBUFF LD DE,128 LD C,Dss.Read LD A,(BAT_FM) - RST #10 + RST ToDSS LD A,E LD (BAT_LEN),A RET @@ -317,14 +319,6 @@ COMPB05 EX AF,AF' LD HL,BATLIST JP COMP004 -INIT LD A,(IX-1) - LD (TASKX),A - PUSH IX - CALL CRLF - CALL GETPATH - POP IX - RET - CONSOLE: CALL CRLF RE_: CALL GETXY @@ -345,7 +339,7 @@ RE_: CALL GETXY JP RE_ GETXY LD C,Dss.Cursor - RST #10 + RST ToDSS JP LOCAT INPUT XOR A @@ -451,7 +445,7 @@ COMP002 XOR A AND #5F NOUP SUB "A" LD C,Dss.ChDisk - RST #10 + RST ToDSS JP C,ERROR JP GETPATH @@ -461,7 +455,7 @@ RUN_EXT EX DE,HL LD (SAVEHL),HL LD BC,Dss.EX_Path.GET_TYPE*256 + Dss.EX_Path LD DE,EXTBF - RST #10 + RST ToDSS LD HL,(SAVEHL) JR C,RUN_EXE BIT 1,A @@ -475,7 +469,7 @@ RUN_EXT EX DE,HL JP RUN_EXE NON_EXT LD BC,0*256+Dss.Exec - RST #10 + RST ToDSS ;R10 CALL Restore_Screen ;R10 @@ -563,7 +557,7 @@ CLS LD DE,#0000 LD HL,#2050 LD BC,7*256+Dss.Clear LD A," " - RST #10 + RST ToDSS LD DE,#0000 JP LOCAT @@ -575,7 +569,7 @@ CRLF LD A,#0D CDATE EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD DE,DTA LD A,(DE) OR A @@ -604,13 +598,13 @@ CDATE EX DE,HL CALL STR2DEC PUSH HL LD C,Dss.SysTime - RST #10 + RST ToDSS POP IX POP DE LD C,Dss.SetTime - RST #10 + RST ToDSS NOSETD LD C,Dss.SysTime - RST #10 + RST ToDSS PUSH IX PUSH DE LD A,D @@ -639,7 +633,7 @@ ILLEG LD DE,ILLGMSG CTIME EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD DE,DTA LD A,(DE) OR A @@ -678,13 +672,13 @@ CTIME EX DE,HL LD A,L PUSH AF LD C,Dss.SysTime - RST #10 + RST ToDSS POP BC POP HL LD C,Dss.SetTime - RST #10 + RST ToDSS NOSETT LD C,Dss.SysTime - RST #10 + RST ToDSS PUSH BC PUSH HL LD A,H @@ -709,7 +703,7 @@ NOSETT LD C,Dss.SysTime CPAUSE LD DE,PAUSMSG CALL MESSAGE LD C,Dss.WaitKey - RST #10 + RST ToDSS RET @@ -737,21 +731,21 @@ CPATH LD A,(DE) DEC HL LD (HL),"P" LD BC,2*256+Dss.Environ - RST #10 + RST ToDSS CALL C,ERROR RET PRNEPATH LD DE,DTA LD HL,PATHSTR LD BC,1*256+Dss.Environ - RST #10 + RST ToDSS JP C,ERROR LD HL,PATHSTR LD C,Dss.PChars - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.PChars - RST #10 + RST ToDSS CALL CRLF RET ;R09 @@ -768,23 +762,23 @@ CSET LD A,(DE) DEC DE ;R08 EX DE,HL LD BC,2*256+Dss.Environ - RST #10 + RST ToDSS CALL C,ERROR RET PRNENVIR LD HL,DTA LD BC,0*256+Dss.Environ - RST #10 + RST ToDSS LD HL,DTA PRNENVX LD C,Dss.PChars - RST #10 + RST ToDSS LD A,CR LD C,Dss.PutChar - RST #10 + RST ToDSS LD A,LF LD C,Dss.PutChar - RST #10 + RST ToDSS LD A,(HL) OR A JR NZ,PRNENVX @@ -812,7 +806,7 @@ CECHO EX DE,HL ;R03 REMOVE R01 LD C,Dss.PChars - RST #10 + RST ToDSS JP CRLF ECHO_F LD A,(ECHOFLG) @@ -891,8 +885,8 @@ 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 + 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 @@ -958,7 +952,7 @@ TVAR1 PUSH HL LD L,C INC HL LD BC,1*256+Dss.Environ - RST #10 + RST ToDSS TNOVAR POP HL INC HL LD BC,0 @@ -981,10 +975,10 @@ COM001 CP (HL) CREM RET -CCHDIR EX DE,HL +CCHDIR: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS XOR A LD HL,DTA CP (HL) @@ -996,8 +990,8 @@ CCHDIR EX DE,HL LD (HL),0 DEC HL DEC HL -YP LD C,Dss.ChDir - RST #10 +YP: LD C,Dss.ChDir + RST ToDSS CALL C,ERROR CALL GETPATH RET @@ -1005,53 +999,55 @@ YP LD C,Dss.ChDir CMKDIR EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.MkDir - RST #10 + RST ToDSS CALL C,ERROR RET -CRMDIR EX DE,HL +CRMDIR: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.RmDir - RST #10 + RST ToDSS CALL C,ERROR RET -CDELET EX DE,HL +CDELET: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA LD C,Dss.Delete - RST #10 + RST ToDSS CALL C,ERROR RET -CRENAM EX DE,HL +CRENAM: EX DE,HL LD DE,DTA LD C,Dss.GSwitch - RST #10 - LD DE,DTA+128 + RST ToDSS + ;LD DE,DTA+128 + LD DE,DTA_2 LD C,Dss.GSwitch - RST #10 + RST ToDSS LD HL,DTA - LD DE,DTA+128 + ;LD DE,DTA+128 + LD DE,DTA_2 LD C,Dss.Rename - RST #10 + RST ToDSS CALL C,ERROR RET -ERROR LD E,A +ERROR: LD E,A LD D,0 JP ERR_MSG -DIR LD HL,0 - LD (FILES),HL +DIR: LD HL,0 + LD (DIRNEX.files),HL LD (S_LOW),HL LD (S_HIGH),HL EX DE,HL @@ -1059,33 +1055,39 @@ DIR LD HL,0 OR A JR NZ,YPS LD HL,ALLFS -YPS LD DE,DTA +YPS: LD DE,DTA LD C,Dss.GSwitch - RST #10 + RST ToDSS + LD HL,DTA LD DE,DTA LD A,#37 LD BC,0*256+Dss.F_First - RST #10 + RST ToDSS JP C,ERROR + LD A,(PATHF) - LD (PRM1+0),A - LD A,":" - LD (PRM1+1),A - LD A,0 - LD (PRM1+2),A + 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 + ;CALL GETPATH LD HL,PATHF LD DE,PRM3 - CALL PUTPRM + ;CALL PUTPRM + call copy_string ; скопир. строку (с нулем) + LD DE,DIR1MSG CALL MESSAGE ; CALL CRLF ; CALL CRLF -DIRNEX LD HL,DTA +DIRNEX: LD HL,DTA LD DE,33 ADD HL,DE CALL PNAME @@ -1093,9 +1095,10 @@ DIRNEX LD HL,DTA LD A,(IX+32) AND #10 JP NZ,NODADD - LD HL,(FILES) + ;LD HL,(FILES) +.files+1: LD HL,0 ;!TODO протестить какая процедура использующая эту переменную чаще вызывается и воткнуть переменную туда INC HL - LD (FILES),HL + LD (DIRNEX.files),HL LD E,(IX+30) LD D,(IX+31) LD HL,(S_HIGH) @@ -1103,18 +1106,19 @@ DIRNEX LD HL,DTA 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 +NODADD: LD DE,DTA LD C,Dss.F_Next - RST #10 + RST ToDSS JR NC,DIRNEX - CALL ORDERS - RET - -ORDERS LD HL,(FILES) + ;CALL ORDERS + ;RET +ORDERS: LD HL,(DIRNEX.files) LD IX,PRM1 CALL PDIGIT LD HL,(S_LOW) @@ -1128,14 +1132,14 @@ ORDERS LD HL,(FILES) JR NZ,ALR2 LD A,#30 LD (HL),A -ALR2 LD DE,SIZEBFF +ALR2: LD DE,SIZEBFF LD HL,L32BIT_;; +1 LD A,(HL) LDI CP " " JR Z,NOPO1 LD A,"." -NOPO1 LD (DE),A +NOPO1: LD (DE),A INC DE LDI LDI @@ -1144,7 +1148,7 @@ NOPO1 LD (DE),A CP " " JR Z,NOPO2 LD A,"." -NOPO2 LD (DE),A +NOPO2: LD (DE),A INC DE LDI LDI @@ -1153,7 +1157,7 @@ NOPO2 LD (DE),A CP " " JR Z,NOPO3 LD A,"." -NOPO3 LD (DE),A +NOPO3: LD (DE),A INC DE LDI LDI @@ -1165,22 +1169,22 @@ NOPO3 LD (DE),A JP MESSAGE ;HL':HL + DE':DE - -ADDXXX ADD HL,DE +ADDXXX: ADD HL,DE EXX ADC HL,DE EXX RET -FILES DW 0 +;FILES: DW 0 + +S_LOW: DW 0 ;!FIXIT в команду +S_HIGH: DW 0 ;!FIXIT в команду -S_LOW DW 0 -S_HIGH DW 0 ;12345678 123 1 234 567 890 " ; SIZE -PNAME LD BC,8 +PNAME: LD BC,8 LD DE,PRM1 LDIR XOR A @@ -1197,19 +1201,21 @@ PNAME LD BC,8 LD DE,DIR3MSG JP MESSAGE -PRINTB LD A,(HL) - PUSH BC - CALL PRINTX - POP BC - INC HL - DJNZ PRINTB - RET +;!TODO +PRINTB: + ; LD A,(HL) + ; PUSH BC + ; CALL PRINTX + ; POP BC + ; INC HL + ; DJNZ PRINTB + ; RET ;------------------ PUTB LD C,#2F -PUTB1 INC C +.PUTB1 INC C SUB 10 - JP NC,PUTB1 + JP NC,.PUTB1 ADD A,10 ADD A,#30 PUSH AF @@ -1221,21 +1227,22 @@ PUTB1 INC C 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 -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 -STRLOOP LD A,(DE) +STR2DEC: LD HL,0 +.LOOP: LD A,(DE) INC DE OR A RET Z @@ -1253,9 +1260,9 @@ STRLOOP LD A,(DE) RET C ADD A,L LD L,A - JR NC,STRLOOP + JR NC,.LOOP INC H - JR STRLOOP + JR .LOOP ATODEC CP "0" RET C @@ -1284,27 +1291,27 @@ PDIGIT LD DE,10000 ;LD (IX+0),0 LD (IX+0),A LD (IX+1),0 + ; RET -DIG XOR A -DIG1 INC A +DIG: XOR A +.DIG1: INC A SBC HL,DE - JR NC,DIG1 + JR NC,.DIG1 ADD HL,DE DEC A -RET_Z RET Z +RET_Z: RET Z ADD A,#30 LD (IX+0),A INC IX -; LD A,0 XOR A LD (RET_Z),A RET -PRNSIZE LD A,(IX+32) +PRNSIZE: LD A,(IX+32) LD HL,DIRIDD AND #10 - JP NZ,PRZ + JP NZ,.PRZ LD L,(IX+28) LD H,(IX+29) EXX @@ -1315,11 +1322,11 @@ PRNSIZE LD A,(IX+32) CALL MAKE_LN LD HL,L32BIT_+9 LD A,(HL) - CP #20 - JR NZ,ALR - LD A,#30 + CP ' ' + JR NZ,.ALR + LD A,'0' LD (HL),A -ALR LD DE,SIZEBFF +.ALR: LD DE,SIZEBFF LD HL,L32BIT_;; +1 LDI LD A," " @@ -1340,10 +1347,11 @@ ALR LD DE,SIZEBFF LDI LD HL,SIZEBFF POP IX -PRZ LD DE,PRM3 +.PRZ: LD DE,PRM3 JP PUTPRM -PRNDATE LD B,(IX+25) +; Скопировать в буфер дату файла/папки +PRNDATE: LD B,(IX+25) LD C,(IX+24) LD HL,SIZEBFF CALL DATE @@ -1355,8 +1363,8 @@ PRNDATE LD B,(IX+25) JP NZ,PUTPRM LD (HL),#20 JP PUTPRM - -PRNTIME LD B,(IX+22) +; Скопировать в буфер время файла/папки +PRNTIME: LD B,(IX+22) LD C,(IX+23) LD HL,SIZEBFF CALL TIME @@ -1366,11 +1374,10 @@ PRNTIME LD B,(IX+22) LD A,(HL) CP "0" JP NZ,PUTPRM - LD (HL),#20 + LD (HL),' ' JP PUTPRM - -TIME - SRL C +; в буфер время файла/папки +TIME: SRL C RR B SRL C RR B @@ -1384,9 +1391,8 @@ TIME INC HL LD A,B JP NUMB - -DATE - LD A,C +; в буфер дату файла/папки +DATE: LD A,C AND #1F PUSH BC CALL NUMB @@ -1417,13 +1423,13 @@ NUMB1 INC C SUB 10 JP NC,NUMB1 ADD A,10 - ADD A,#30 + 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 @@ -1490,7 +1496,6 @@ KILLZ2 LD HL,L32BIT_+9 RET ; HL:HL - DE:DE - GET_DIG XOR A INC_DG INC A SBC HL,DE @@ -1516,8 +1521,192 @@ SIZEBFF DB "0 000 000 000",0,0 ;------------------- -VERS LD C,Dss.Version - RST #10 +;!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 + PUSH BC + PUSH DE + + LD L,D + LD H,0 + LD DE,PRM1 + CALL .num_ver ;decim2 номер версии (0..9) + LD A,'.' + LD (DE),A + + INC DE + POP HL + 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 + + 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,2Fh + 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 +/* +VERS: + LD C,Dss.Version + RST ToDSS PUSH BC LD A,D @@ -1573,6 +1762,7 @@ GETyesZERO: LD (HL),A INC HL RET +*/ HELP LD DE,HELPMSG CALL MESSAGE @@ -1585,7 +1775,7 @@ CEXIT LD A,(TASKX) POP HL QUIT LD B,0 LD C,Dss.Exit - RST #10 + RST ToDSS RET ERR_MSG INC DE @@ -1622,6 +1812,17 @@ PUTPRMA LD A,(HL) 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 @@ -1641,20 +1842,20 @@ PRINTZ LD A,(HL) LD BC,PRM1 ADD HL,BC LD C,Dss.PChars - RST #10 + RST ToDSS POP HL JR PRINTZ PRINTZ2 LD C,Dss.PutChar - RST #10 + RST ToDSS JP PRINTZ -ROOT DB "C:",#5C,0 +ROOT DB '\',0 ALLFS DB "*.*",0 -SER_NUM DB "C37F-73AB",0 +SER_NUM DB "XXXX-XXXX",0 -EXTBF DS 4 +EXTBF BLOCK 4,0 BATBF DB "BAT" @@ -1757,56 +1958,17 @@ ERR0 DB #00 DB 0 ERR1 -PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -DTA ;DEFS 256,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -PATHF ;DEFS 256,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -BAT_FM DB 0 -BAT_LEN DB 0 - -ECHOFLG DB 0 - -PATHLEN DB 0 -PATH ;DEFS 40,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0 - -GETPATH: LD C,2 - RST #10 +GETPATH: + LD C,Dss.CurDisk + RST ToDSS LD HL,PATHF ADD A,"A" LD (HL),A INC HL LD (HL),":" INC HL - LD C,30 - RST #10 + LD C,Dss.CurDir + RST ToDSS LD HL,PATHF LD DE,PATH @@ -1815,10 +1977,10 @@ GETPATH: LD C,2 LDI PUSH HL XOR A - LD BC,34 + LD BC,34 ;!HARDCODE CPIR JP NZ,LONGP - LD A,34 + LD A,34 ;!HARDCODE SUB C LD C,A POP HL @@ -1839,10 +2001,10 @@ LONGP CPIR LDIR POP HL PHLEN LD HL,PATH - LD BC,40 + LD BC,40 ;!HARDCODE path XOR A CPIR - LD A,39 + LD A,39 ;!HARDCODE SUB C LD (PATHLEN),A LD C,A @@ -1863,12 +2025,12 @@ PRINTBB PUSH BC TEMPXY DW 0 CR_ LD C,Dss.Cursor - RST #10 + RST ToDSS LD E,0 JP LOCAT LF_ LD C,Dss.Cursor - RST #10 + RST ToDSS LD A,D CP #1F JP Z,LFF @@ -1901,14 +2063,14 @@ PRINTX CP #20 CP #0A JP Z,LF_ CHAR PUSH BC - LD BC,#0182 + LD BC,#0182 RST ToBIOS POP BC RET LOCAT LD (TEMPXY),DE LD C,Dss.Locate - RST #10 + RST ToDSS RET ;PRINTX LD C,Dss.PutChar @@ -2082,7 +2244,7 @@ KEY1 CALL CURSORF EI HALT LD C,Dss.ScanKey - RST #10 + RST ToDSS JP Z,KEY1 RET @@ -2179,7 +2341,7 @@ SKIPSP LD A,(HL) JR NZ,PROCESS LD DE,BUFFER LD C,Dss.GSwitch - RST #10 + RST ToDSS PUSH AF EX DE,HL ;SAVE HL IN DE LD HL,BUFFER @@ -2231,42 +2393,126 @@ PR002 CP "C" LD (RUNMODE),A PR003 RET -TASKX DB 0 -RUNMODE DB 0 -STEP DB 8 -MAIN_X DB 0 +TASKX DB 0 +RUNMODE DB 0 +STEP DB 8 +MAIN_X DB 0 -LEN_OLD DB #00 -POSIT DB #00 -ETXS DW 0 -ETXE DW 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 -CMDLINE ;DEFS #100,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - -TMPLINE DS 256 +WINDOW DB #50 +BUFFERC DB #FF +LEN_NEW DB #00 BATNAME DB "system.bat",0 +BAT_BUFFER.size EQU 128 ;!FIXIT BAT_BUFFER LENGTH -PRMLINE DS 256 + + + + + STRUCT BUFFERS_STRUCT +CMDLINE BLOCK 256,0 +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 ;!FIXIT 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: -BAT_BUFFER.size EQU 128 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/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index f411461..9d9c223 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -11,6 +11,8 @@ DSS 1.70.2 Изменения после версии 1.70 + [+] исправлен баг с "C:\>CD E:\" + [+] исправлен баг с переключением на другой диск из некорневой директории, когда на новом диске оказывался в несуществующей директории [+] при чтении/записи файла не происходит избыточное перечитывание кластеров от начала файла [+] перечитывание BPB теперь делается не на каждый чих, а когда надо (и бага при загрузке с диска "B:" нет :-P ) [+] изменена работа с RAM DISK, теперь он может быть загрузочным diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index ec89219..e2f6980 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -642,7 +642,10 @@ GETWORD: SUB #20 .next: SUB 'A' PUSH HL - CALL OPENDSK + ;!TEST CHNDISK OPENDSK + ;CALL OPENDSK + CALL CHNDISK + ; POP HL JP NC,GETWORD RET diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 4b5f93f..53a9c50 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -352,6 +352,7 @@ BLOK_WR PUSH BC CALL DIV32 LD B,XH LD C,XL + PUSH HL ;RESIDUE LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER LD H,(IY+_sFM.ST_CLUSTER+1) @@ -909,9 +910,29 @@ ADD_DE2: DJNZ ADD_DE1 ADC HL,DE RET -; HL:DE / BC => DE:IX HL-OSTATOK +; HL:DE / BC => DE:IX HL-OSTATOK (DE:BC.HL) +DIV32: LD A,#FF + LD B,E +.loop: SRL C + JR C,.exitLoop + SRL H : RR L : RR D : RR E : SLA A + JP .loop +.exitLoop: + CPL + AND B + LD XH,D + LD XL,E + EX DE,HL + LD H,0 + LD L,A + RET +/* + DEFINE NEW_DIV 1 + DIV32: LD XH,D LD XL,E + + IFN NEW_DIV EX DE,HL LD HL,0 LD A,#20 @@ -929,18 +950,83 @@ DIV001: ADD IX,IX DIV002: INC IX DEC A JR NZ,DIV001 - RET + RET + ELSE -//READCOD DB #00 -//READMEM DW #0000 +div32_16: +;HLIX/BC -> HLIX remainder DE +;174+4*div32_16_sub8 +;min: 2186cc +;max: 2794cc +;avg: 2466cc +;61 bytes + ex de,hl ; 4 -//SECTORH DW 0 -//SECTORL DW 0 +; Negate BC to allow add instead of sbc + xor a ; 4 +; Need to set HL to 0 anyways, so save 2cc and a byte + ld h,a ; 4 + ld l,a ; 4 + sub c ; 4 + ld c,a ; 4 + sbc a,a ; 4 + sub b ; 4 + ld b,a ; 4 -//R_POINT DW 0 -//S_POINT DW 0 -;//MODULE: DOS_FM -;[END] + ld a,d ; 4 + call div32_16_sub8 ; 17 + rla ; 4 + ld d,a ; 4 + ld a,e ; 4 + call div32_16_sub8 ; 17 + rla ; 4 + ld e,a ; 4 + + ld a,ixh ; 8 + call div32_16_sub8 ; 17 + rla ; 4 + ld ixh,a ; 8 + + ld a,ixl ; 8 + call div32_16_sub8 ; 17 + rla ; 4 + ld ixl,a ; 8 + + ;ex de,hl ; 4 + ret ; 10 + +div32_16_sub8: +;119+8*div32_16_sub +;min: 503cc +;max: 655cc +;avg: 573cc + call 1F +1: +;17+2(17+2(div32_16_sub))) + call 1F +1: +;17+2(div32_16_sub) + call div32_16_sub +div32_16_sub: +;48+{8,0+{0,19}} +;min: 48cc +;max: 67cc +;avg: 56.75cc + rla ; 4 + adc hl,hl ; 15 + jr c,1F ;12/7 + add hl,bc ; 11 + ret c ;11/5 + sbc hl,bc ; 15 + ret ; 10 +1: + add hl,bc ; 11 + scf ; 4 + ret ; 10 + + ENDIF +*/ +; \ No newline at end of file diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC index e6a3d19..583cb64 100644 --- a/DSS/VERSION.INC +++ b/DSS/VERSION.INC @@ -1,10 +1,31 @@ +;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] + LUA PASS1 + dss_date, dss_month, dss_year = Get_date_RU(sj.get_define("__DATE__")) + dss_build = increase_build("./DSS/build.txt") + if dss_build > 999 then + dss_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_DAY", dss_date) + sj.insert_label("lua_MONTH", dss_month) + sj.insert_label("lua_YEAR", dss_year) + sj.insert_label("lua_BUILD", dss_build) + ENDLUA +;---------------------------------------------------------------------[] + ; -; DSS Version -VERS EQU 01 ;Version Number (XX.) -MODF EQU 70 ;Modification (.xx) -BUILD EQU 2 +; DSS full version +; номер версии (0..9) +VERS EQU 1 +; номер модификации (0..99) +MODF EQU 70 +; номер билда (0..999) +BUILD EQU lua_BUILD ; + ; Release Types RELEASE EQU 0 RC EQU 1 @@ -12,13 +33,13 @@ BETA EQU 2 DP EQU 3 ; -; Bulid Type +; Build Type OSTYPE EQU BETA REVISION EQU 1 ; -; Default date -DAY EQU 30 -MONTH EQU 03 -YEAR EQU 2023 +; Current date +DAY EQU lua_DAY +MONTH EQU lua_MONTH +YEAR EQU lua_YEAR ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt new file mode 100644 index 0000000..9d60796 --- /dev/null +++ b/DSS/build.txt @@ -0,0 +1 @@ +11 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 53ae29d..eb8e552 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 53ae29d127a926a372ada8fc8692afc7ecafdd9a +Subproject commit eb8e55262317fea366bfb6b7d834dde90ff7307b