; LAST UPDATE: 02.08.2025 savelij ;[]-----------------------------------------------------------[] ; Процедура умножения (8*8bit) ; На вход: E * C ; На выход: ; HL - результат Mul_8X8_16b: SUB A LD L,A LD H,A LD D,A CP C RET Z CP E RET Z LD H,C LD B,0x08 .L1 ADD HL,HL JR NC,.L2 ADD HL,DE .L2 DJNZ .L1 RET ; Процедура умножения (16*8bit) ; На вход: DE * C ; На выход: ; AHL - результат Mul_16X8_24b: SUB A LD L,A LD H,A CP C RET Z OR D OR E RET Z LD A,C LD BC,8 << 8 .L1 ADD HL,HL RLA JR NC,.L2 ADD HL,DE ADC A,C .L2 DJNZ .L1 RET ; Процедура умножения (16*16bit) ; На вход: DE * BC ; На выход: ; HL - результат Mul_16X16_16b: LD HL,0x0000 LD A,0x10 .L1 RR B RR C JR NC,.L2 ADD HL,DE .L2 RL E RL D DEC A JR NZ,.L1 RET ; Процедура умножения (32bit) ; На вход: DE * BC ; На выход: ; HLDE - результат Mul_16X16_32b: PUSH IX EX DE,HL LD E,0x00 LD D,E LD IXL,E LD IXH,D LD A,0x20 .L1 ADD IX,IX ADC HL,HL RL E RL D JR NC,.L2 ADD IX,BC JR NC,.L2 INC HL .L2 DEC A JR NZ,.L1 LD E,IXL LD D,IXH POP IX RET ; Процедура умножения (32bit) ; На вход: HLDE * BC ; На выход: ; HLDE - результат Mul_32X16_32b: PUSH IX LD IX,0x0000 LD A,0x20 EX DE,HL .L1 ADD IX,IX ADC HL,HL RL E RL D JR NC,.L2 ADD IX,BC JR NC,.L2 INC HL .L2 DEC A JR NZ,.L1 LD E,IXL LD D,IXH POP IX RET ; Процедура деления (16bit) ; На вход: BC / DE ; На выход: ; BC - результат ; HL - остаток Div_16X16_16b_16b: LD A,D OR E RET Z LD HL,0x0000 LD A,B LD B,0x10 .L1 RL C RLA ADC HL,HL SBC HL,DE CCF JR NC,.L4 .L2 DJNZ .L1 RL C RLA LD B,A RET .L3 RL C RLA ADC HL,HL ADD HL,DE JR C,.L2 .L4 DJNZ .L3 RL C RLA ADD HL,DE LD B,A RET ; Процедура деления (24x16bit) ; На вход: HLC / DE ; На выход: ; A -результат ; HL - остаток Div_24X16_8b_16b: LD A,D CPL LD D,A LD A,E CPL LD E,A INC DE LD A,C LD B,0x08 .L1 ADD HL,HL JR C,.L2 ADD A,A JR NC,.L4 INC HL .L4 PUSH HL ADD HL,DE JR NC,.L5 EX (SP),HL INC A .L5 POP HL DJNZ .L1 RET .L2 ADC A,A JR NC,.L3 INC HL .L3 ADD HL,DE DJNZ .L1 RET ; Процедура деления 32/16bit=16bit ; На вход: HLDE / BC ; На выход: ; DE - результат ; HL - остаток Div_32X16_16b_16b: LD A,0x10 .L2 EX DE,HL ADD HL,HL EX DE,HL ADC HL,HL SBC HL,BC JR NC,.L1 ADD HL,BC DEC A JR NZ,.L2 RET .L1 INC DE DEC A JR NZ,.L2 RET ; Процедура деления 32/16bit=32bit ; На вход: HLDE/BC ; На выход: ; HLDE - результат ; BC-остаток Div_32X16_32b_16b: PUSH IX LD IXL,E LD IXH,D EX DE,HL LD HL,0x0000 LD A,0x20 .L1 ADD IX,IX RL E RL D ADC HL,HL SBC HL,BC JR NC,.L2 DEC IX ADD HL,BC .L2 INC IX DEC A JR NZ,.L1 LD C,L LD B,H EX DE,HL LD E,IXL LD D,IXH POP IX RET ;[]===================================================================[] ;На вход: ; ABCHL - число 40 бит ; DE - буфер ConvertNumbers_40b: PUSH IX LD IX,ConvertFlg RES 7,(IX+0x00) PUSH BC EXX LD HL,ConNumbExit LD (ChooseStringFormat.address),HL POP HL LD E,0x17 LD BC,0x4876 EXX ld bc,0xE800 ; E':BC':BC = 100,000,000,000 call ConNumb40 exx ld e,0x02 ld bc,0x540B exx ld bc,0xE400 ; E':BC':BC = 10,000,000,000 CALL ConNumb40 exx ld e,0x00 ld bc,0x3B9A exx ld bc,0xCA00 ; E':BC':BC = 1,000,000,000 CALL ConNumb40 ; E':BC':BC = 100,000,000 CALL ConvNumTxt32_Shared.skip_1 POP IX RET ;[]-----------------------------------------------------------[] ;Конвертер числа 32бит в текст ;На вход: ; BCHL - число 32 бит ; DE - буфер ConvertNumbers_32b: PUSH IX LD IX,ConvertFlg RES 7,(IX+0x00) PUSH BC EXX LD HL,ConNumbExit LD (ChooseStringFormat.address),HL POP HL EXX call ConvNumTxt32_Shared POP IX RET ConvNumTxt32_Shared: LD BC,0xCA00 EXX LD BC,0x3B9A ;1'000'000'000 EXX CALL ConNumb32 .skip_1: LD BC,0xE100 EXX LD BC,0x05F5 ;100'000'000 EXX CALL ConNumb32 LD BC,0x9680 EXX LD BC,0x0098 ;10'000'000 EXX CALL ConNumb32 LD BC,0x4240 EXX LD BC,0x000F ;1'000'000 EXX CALL ConNumb32 LD BC,0x86A0 EXX LD BC,0x0001 ;100'000 EXX CALL ConNumb32 LD BC,10000 ;10'000 EXX LD BC,0x0000 EXX CALL ConNumb32 LD BC,1000 ;1'000 CALL ConNumb16 LD BC,100 ;100 CALL ConNumb16 LD BC,10 ;10 CALL ConNumb16 LD A,L ADD A,'0' LD (DE),A INC DE RET ; Конвертер числа 16бит в текст ; На вход: ; HL - число 16 бит ; DE - буфер ConvertNumbers_16b: PUSH IX PUSH BC LD IX,ConNumbExit ld (ChooseStringFormat.address),IX LD IX,ConvertFlg RES 7,(IX+0x00) LD BC,10000 ;10'000 CALL ConNumb16 LD BC,1000 ;1'000 CALL ConNumb16 LD BC,100 ;100 CALL ConNumb16 LD BC,10 ;10 CALL ConNumb16 LD A,L ADD A,'0' LD (DE),A INC DE POP BC POP IX RET ; Конвертер числа 8бит в текст ; На вход: ; A - число 8 бит ; DE - буфер ConvertNumbers_8b: PUSH IX PUSH BC LD IX,ConNumbExit ld (ChooseStringFormat.address),IX LD IX,ConvertFlg RES 7,(IX+0x00) LD C,100 CALL ConNumb8 LD C,10 CALL ConNumb8 ADD A,'0' LD (DE),A INC DE POP BC POP IX RET ;----------------------------------------------------------------------; ConNumb40: exx ld d,'0'-1 exx and a .loop: sbc hl,bc exx sbc hl,bc sbc a,e inc d exx jp nc,.loop add hl,bc exx adc hl,bc adc a,e ex af,af' ld a,d exx JR ConNumb8.exit ConNumb32: LD A,'0' - 1 OR A .loop: INC A SBC HL,BC EXX SBC HL,BC EXX JR NC,.loop ADD HL,BC EXX ADC HL,BC EXX JR ChooseStringFormat ConNumb16: LD A,'0' - 1 OR A .loop: INC A SBC HL,BC JR NC,.loop ADD HL,BC JR ChooseStringFormat ConNumb8: LD B,'0' - 1 .loop: INC B SUB C JR NC,.loop ADD A,C EX AF,AF' LD A,B .exit: CALL ChooseStringFormat EX AF,AF' RET ConvertFlg DEFB 0x00 ChooseStringFormat: JP 0x0000 .address: equ $-2 ConNumbExit: CP "0" JR Z,.skip SET 7,(IX+0x00) .skip: BIT 7,(IX+0x00) RET Z LD (DE),A INC DE RET ;[]-----------------------------------------------------------[] ; Конвертер текста в число 32 бит ; На вход: ; DE - текст ; На выход: ; HLIX - число ; CY - ошибка atoi_32b: LD IX,0x0000 LD HL,0x0000 ConvTN1 LD A,(DE) CP 0x21 CCF RET NC SUB 0x30 RET C CP 0x0A CCF RET C INC DE ADD IX,IX ADC HL,HL RET C PUSH HL PUSH IX ADD IX,IX ADC HL,HL RET C ADD IX,IX ADC HL,HL RET C POP BC ADD IX,BC POP BC ADC HL,BC RET C LD C,A LD B,0x00 ADD IX,BC LD C,B ADC HL,BC RET C JR ConvTN1 ; Конвертер текста в число 16 бит ; На вход: ; DE - текст ; На выход: ; HL - число ; CY - ошибка atoi_16b: LD HL,0x0000 ConvTN2 LD A,(DE) CP 0x21 CCF RET NC SUB 0x30 RET C CP 0x0A CCF RET C INC DE ADD HL,HL RET C PUSH HL ADD HL,HL RET C ADD HL,HL RET C POP BC ADD HL,BC RET C LD C,A LD B,0x00 ADD HL,BC RET C JR ConvTN2 ;[]-----------------------------------------------------------[] MoveBytesInc: LD A,B OR A JR Z,MvByte1 DI ACCEL ACCELCMD.SET_BUFFER LD A,0x00 MvByte0 ACCEL ACCELCMD.COPY LD A,(HL) LD (DE),A ACCEL ACCELCMD.OFF INC H INC D DEC B JR NZ,MvByte0 EI MvByte1 LD A,C OR A RET Z LD (Mvlen1),A DI ACCEL ACCELCMD.SET_BUFFER LD A,0x00 Mvlen1 EQU $-1 ACCEL ACCELCMD.COPY LD A,(HL) LD (DE),A ACCEL ACCELCMD.OFF EI LD A,C ADD A,E LD E,A JR NC,.L1 INC D .L1 LD A,C ADD A,L LD L,A RET NC INC H RET MoveBytesDec: LD A,B OR A JR Z,MovUp1 DI ACCEL ACCELCMD.SET_BUFFER LD A,0x00 MovUp0 DEC H DEC D ACCEL ACCELCMD.COPY LD A,(HL) LD (DE),A ACCEL ACCELCMD.OFF DEC B JR NZ,MovUp0 EI MovUp1 LD A,C OR A RET Z LD (LenUp+1),A SBC HL,BC EX DE,HL SBC HL,BC EX DE,HL DI ACCEL ACCELCMD.SET_BUFFER LenUp LD A,0x00 ACCEL ACCELCMD.COPY LD A,(HL) LD (DE),A ACCEL ACCELCMD.OFF EI RET ;[]----------------------------------------------------------[] ; Конкатенация строки. Добавляется строка из hl в конец строки в de. Нуль копируется тоже. ; (hl) -> (de) STRCAT: ex hl,de .loop: ld a,(hl) or a jr z,.end inc hl jr .loop .end: ex hl,de ;Внимание!!! ожидается, что дальше ; идет CopyString, поэтому если между этими п/п добавили что-то - добавь вызов CopyString! ;[]----------------------------------------------------------[] ; Копирование строки до нуля. Нуль копируется тоже. ; (hl) -> (de) STRCPY: ld a,(hl) ldi or a jr nz,STRCPY dec de ret ;[]----------------------------------------------------------[] ; Копирование строки до нуля или пробела. В конец добавляется нуль. ; (hl) -> (de) ;!FIXIT если не будет 0 и пробела - может много запороть CopyWord: ld bc, 0x20FF .loop: ld a,(hl) ldi or a ret z cp b jr nz,.loop dec de xor a ld (de),a ret ;[]----------------------------------------------------------[] ; Сравнение строки с учетом регистра. ; (образец должен заканчиваться нулем) ; вход: de - string1 ; hl - string2 (образец) ; выход: "z" - string1 = string2 ; "c" - string1 < string2 ; иначе - string1 > string2 ;[]----------------------------------------------------------[] STRCMP: ld a,(de) cp (hl) ret nz inc hl inc de ld a,(hl) or a jr nz,STRCMP ; образец не закончен ld a,(de) cp (hl) ret ; Поиск конца слова или строки ; > hl - строка ; < hl - конец строки или SkipWord: ld b,0x20 .loop: ld a,(hl) inc hl cp b jr z,.skipSpace and a jr nz,.loop .end: dec hl ret .skipSpace: ld a,(hl) cp b ret nz inc hl jr .skipSpace ;[]----------------------------------------------------------[] ; HL - X позиция вывода времени ; DE - Y позиция вывода времени ; B - цвет вывода времени ; HL' - X позиция вывода даты ; DE' - Y позиция вывода даты ; B' - цвет вывода даты CMOSPrintDateTime: EX AF,AF' LD (CMOSpos.posXtime),HL LD (CMOSpos.posYtime),DE LD A,B LD (CMOSpos.colorTime),A SUB A LD L,A LD H,A LD (CMOSPrint),A LD (CMOSpos.Time),HL LD (CMOSpos.Time + 2),A ; LD (CMOSpos.Date),HL ; LD (CMOSpos.Date + 2),A ; LD HL,CMOSpos.TimeTXT ; LD DE,CMOSpos.DateTXT ; LD A,'0' ; LD B,0x03 ;.L1 LD (HL),A ; INC HL ; LD (HL),A ; INC HL ; INC HL ; LD (DE),A ; INC DE ; LD (DE),A ; INC DE ; INC DE ; DJNZ .L1 EX AF,AF' LD (CMOSpos.CMOSOut),A OR A JR Z,TestCMOS EXX LD (CMOSpos.posXDate),HL LD (CMOSpos.posYDate),DE LD A,B LD (CMOSpos.colorDate),A EXX ; JR TestCMOS TestCMOS: LD A,(CMOSFlag) OR A RET Z LD A,(CMOSPrint) OR A RET NZ PUSH IX HALT ;!TEST ;DI SPDSS DSSF.GETTIME ;!TEST ;EI PUSH DE PUSH IX ; DE,IX сохранили день,месяц год EX DE,HL LD HL,(CMOSpos.Time) OR A SBC HL,DE JR NZ,.PrnCMOSTime LD A,(CMOSpos.Time + 2) CP B JR Z,TCMOS1 .PrnCMOSTime: EX DE,HL LD (CMOSpos.Time),HL LD A,B LD (CMOSpos.Time + 2),A LD DE,CMOSpos.TimeTXT LD A,H ; часы CALL Conv4CMOS INC DE LD A,L ; минуты CALL Conv4CMOS INC DE LD A,(CMOSpos.Time + 2) ; секунды CALL Conv4CMOS LD HL,CMOSpos.TimeTXT LD DE,(CMOSpos.posXtime) LD BC,(CMOSpos.posYtime) LD A,(CMOSpos.colorTime) CALL PrintTxtLine_IFF TCMOS1 POP IX POP DE ; DE,IX восстановили день,месяц,год LD A,(CMOSpos.CMOSOut) OR A JP Z,TCMOSexit ; PUSH IX ; POP HL ; LD BC,1900 ; OR A ; SBC HL,BC ; LD B,L ; LD HL,(CMOSpos.Date) ; OR A ; SBC HL,DE ; JR NZ,.PrnCMOSData ; LD A,(CMOSpos.Date + 2) ; CP B ; JP Z,TCMOSexit ;.PrnCMOSData EX DE,HL LD (CMOSpos.Date),HL ; день,месяц ; LD A,B LD (CMOSpos.Date + 2),IX ; год LD A,(CMOSpos.CMOSOut) DEC A JR NZ,.TCMOS2 ; вывод даты ввиде 02.08.2025 LD DE,CMOSpos.DateTXT LD A,H CALL Conv4CMOS INC DE LD A,L CALL Conv4CMOS INC DE ; LD A,(CMOSpos.Date + 2) LD HL,(CMOSpos.Date + 2) CALL ConvertNumbers_16b;Conv4CMOS ; LD A,(CMOSpos.CMOSOut) ; DEC A ; JR NZ,.TCMOS2 LD HL,CMOSpos.DateTXT LD DE,(CMOSpos.posXDate) LD BC,(CMOSpos.posYDate) LD A,(CMOSpos.colorDate) CALL PrintTxtLine_IFF JR TCMOSexit ; вывов даты ввиде 2 Aug 2025 .TCMOS2 LD DE,CMOSpos.DateT1 LD A,H CALL ConvertNumbers_8b LD A,' ' LD (DE),A INC DE LD A,L DEC A ADD A,A ; LD L,A ADD A,A ; ADD A,L LD HL,Month ADD A,L LD L,A ADC A,H SUB L LD H,A LD A,' ' .L2 LDI CP (HL) JR NZ,.L2 ; LD (DE),A ; INC DE LDI ; PUSH IX ; POP HL LD HL,(CMOSpos.Date + 2) CALL ConvertNumbers_16b SUB A LD (DE),A ; LD HL,(CMOSpos.posXDate) ; LD (CMOSclX),HL ; LD HL,(CMOSpos.posYDate) ; LD (CMOSclY),HL ; LD A,(CMOSpos.colorDate) ; AND 0xF0 ; RRCA ; RRCA ; RRCA ; RRCA ; LD (CMOScol),A ; MAKEWINDOW WINSUBOBJ.WOBIND ; W_FILL 0,0,76,8,COLORI.BLACK ; W_END ;CMOSclX EQU $ - 10 ;CMOSclY EQU $ - 8 ;CMOScol EQU $ - 2 LD HL,CMOSpos.DateT1 LD DE,(CMOSpos.posXDate) LD BC,(CMOSpos.posYDate) LD A,(CMOSpos.colorDate) CALL PrintTxtLine_IFF TCMOSexit POP IX RET ;CMOSPrintOff: LD A,DateMonthFormat.Digit ; LD (CMOSPrint),A ; RET Conv4CMOS: EX DE,HL LD BC,(('0' - 1) << 8) + 10 .L1 INC B SUB C JR NC,.L1 ADD A,C LD (HL),B INC HL ADD A,'0' LD (HL),A INC HL EX DE,HL RET CMOSpos .CMOSOut: DB 0 ; тип вывода даты: ; 0 - тест ; 1 - день/месяц/год ; 2 - день месяц год .posXtime: DW 0 ; позиция X для времени .posYtime: DW 0 ; позиция Y для времени .colorTime: DB 0 ; цвет для времени .Time: DB 3 DUP 0 ; часы,минуты,секунды .TimeTXT: DZ "00:00:00" .posXDate: DW 0 ; позиция X для даты .posYDate: DW 0 ; позиция Y для даты .colorDate: DB 0 ; цвет для даты .Date: DD 0 ; день,месяц,год .DateTXT: DZ "00.00.0000" .DateT1: DB 14 DUP 0 Month: DB "Jan " DB "Feb " DB "Mar " DB "Apr " DB "May " DB "Jun " DB "Jul " DB "Aug " DB "Sep " DB "Oct " DB "Nov " DB "Dec " ;[]----------------------------------------------------------[] PointerMouseClock: LD A,(MouseFlag) OR A RET Z PUSH IY PUSH IX PUSH HL PUSH DE PUSH BC GETPORT WINSP.CPU3 PUSH AF LD A,(RAMPAGES.FNFONT) SETPORT WINSP.CPU3,,0 LD IX,CLOCK_BMP;ClockBMP LD HL,14 << 8 + 9 LD DE,7 << 8 | 4 SPMOUSE MOUSEF.LOAD_IMAGE POP AF SETPORT WINSP.CPU3,,0 POP BC POP DE POP HL POP IX POP IY HALT RET PointerMousePointer: LD A,(MouseFlag) OR A RET Z PUSH IY PUSH IX PUSH HL PUSH DE PUSH BC GETPORT WINSP.CPU3 PUSH AF LD A,(RAMPAGES.FNFONT) SETPORT WINSP.CPU3,,0 LD IX,MOUSE_BMP;MouseBMP LD HL,13 << 8 + 9 LD DE,0 SPMOUSE MOUSEF.LOAD_IMAGE POP AF SETPORT WINSP.CPU3,,0 POP BC POP DE POP HL POP IX POP IY HALT RET