; LAST UPDATE: 08.03.2025 savelij ;[]-----------------------------------------------------------[] ;Процедура умножения (8*8bit) ;На вход: E*C ;На выход:HL-результат Mult8 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 ;На выход:A+HL-результат Mult16X8 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-результат Mult16 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 ;На выход:HL+DE-результат Mult16X16 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) ;На вход: HL+DE*BC ;На выход:HL+DE-результат Mult32 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-остаток Divis16X16 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) ;На вход: H+L+C/DE ;На выход:A -результат ; HL-остаток Divis24X16 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 ;На вход: HL+DE/BC ;На выход:DE-результат ; HL-остаток Divis32X16 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 ;На вход: HL+DE/BC ;На выход:HL+DE-результат ; BC-остаток Divis32 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 ;[]===================================================================[] ;На вход: ; A:BC:HL - число 40 бит ; DE - буфер ConvNumTxt40: 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бит в текст ;На вход: ; BC+HL - число 32 бит ; DE - буфер ConvNumTxt32 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 - буфер ConvNumTxt16 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 - буфер ConvNumTxt8 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 - текст ;На выход: ; HL+IX - число ; CY - ошибка ConvTxtNum32 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 - ошибка ConvTxtNum16 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 ;[]-----------------------------------------------------------[] MoveBytes 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 MoveBytesUp 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 ;[]----------------------------------------------------------[] Resident LD (ResCall),DE IN B,(C) PUSH BC OUT (C),A CALL 0x0000 ResCall EQU $-2 POP BC OUT (C),B RET ;[]----------------------------------------------------------[] ; Конкатенация строки. Добавляется строка из hl в конец строки в de. Нуль копируется тоже. ; (hl) -> (de) ConcatString: ex hl,de .loop: ld a,(hl) or a jr z,.end inc hl jr .loop .end: ex hl,de ;Внимание!!! ожидается, что дальше ; идет CopyString, поэтому если между этими п/п добавили что-то - добавь вызов CopyString! ;[]----------------------------------------------------------[] ; Копирование строки до нуля. Нуль копируется тоже. ; (hl) -> (de) CopyString: ld a,(hl) ldi or a jr nz,CopyString 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 ;[]----------------------------------------------------------[] CompareStrings: ld a,(de) cp (hl) ret nz inc hl inc de ld a,(hl) or a jr nz,CompareStrings ; образец не закончен 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 ;[]----------------------------------------------------------[] SetCMOSPrint: EX AF,AF' LD (CMOSposXT),HL LD (CMOSposYT),DE LD A,B LD (CMOSColorT),A SUB A LD L,A LD H,A LD (CMOSPrint),A LD (CMOSTime),HL LD (CMOSTime+2),A LD (CMOSData),HL LD (CMOSData+2),A LD HL,CMOSTimeT LD DE,CMOSDataT 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 (CMOSOut),A OR A JR Z,TestCMOS EXX LD (CMOSposXD),HL LD (CMOSposYD),DE LD A,B LD (CMOSColorD),A EXX JR TestCMOS ResCMOSPrint: LD A,0x01 LD (CMOSPrint),A RET 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 EX DE,HL LD HL,(CMOSTime) OR A SBC HL,DE JR NZ,PrnCMOSTime LD A,(CMOSTime+2) CP B JR Z,TCMOS1 PrnCMOSTime: EX DE,HL LD (CMOSTime),HL LD A,B LD (CMOSTime+2),A LD DE,CMOSTimeT LD A,H CALL GetCMOS INC DE LD A,L CALL GetCMOS INC DE LD A,(CMOSTime+2) CALL GetCMOS LD HL,CMOSTimeT LD DE,(CMOSposXT) LD BC,(CMOSposYT) LD A,(CMOSColorT) CALL PrnTxtLnIFF TCMOS1 POP IX POP DE LD A,(CMOSOut) OR A JP Z,TCMOSex PUSH IX POP HL LD BC,1900 OR A SBC HL,BC LD B,L LD HL,(CMOSData) OR A SBC HL,DE JR NZ,PrnCMOSData LD A,(CMOSData+2) CP B JP Z,TCMOSex PrnCMOSData EX DE,HL LD (CMOSData),HL LD A,B LD (CMOSData+2),A LD DE,CMOSDataT LD A,H CALL GetCMOS INC DE LD A,L CALL GetCMOS INC DE LD A,(CMOSData+2) CALL GetCMOS LD A,(CMOSOut) DEC A JR NZ,TCMOS2 LD HL,CMOSDataT LD DE,(CMOSposXD) LD BC,(CMOSposYD) LD A,(CMOSColorD) CALL PrnTxtLnIFF JR TCMOSex TCMOS2 LD DE,CMOSDataT1 LD A,H CALL ConvNumTxt8 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 JR NC,.L1 INC H .L1 LD A,' ' .L2 LDI CP (HL) JR NZ,.L2 LD (DE),A INC DE PUSH IX POP HL CALL ConvNumTxt16 SUB A LD (DE),A LD HL,(CMOSposXD) LD (CMOSclX),HL LD HL,(CMOSposYD) LD (CMOSclY),HL LD A,(CMOSColorD) 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,CMOSDataT1 LD DE,(CMOSposXD) LD BC,(CMOSposYD) LD A,(CMOSColorD) CALL PrnTxtLnIFF TCMOSex POP IX RET ;CMOSPrint: DB 0x01 CMOSOut: DB 0 CMOSposXT: DW 0 CMOSposYT: DW 0 CMOSColorT: DB 0 CMOSTime: DB 3 DUP 0 CMOSTimeT: DB "00:00:00",0 CMOSposXD: DW 0 CMOSposYD: DW 0 CMOSColorD: DB 0 CMOSData: DB 3 DUP 0 CMOSDataT: DB "00/00/00",0 CMOSDataT1: DB 14 DUP ' ' GetCMOS: EX DE,HL LD BC,(('0' - 1) << 8) | 10;0x2F0A .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 Month: DB "Jan " DB "Febr " DB "March " DB "Apr " DB "May " DB "June " DB "July " DB "Aug " DB "Sept " DB "Oct " DB "Nov " DB "Dec " ;[]----------------------------------------------------------[] SetClock: 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 SetMouse 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