;----------------------------------------------------------- ; Прорисовка объекта ~Process Line~. ; При макс. числе меньшем, чем ширина линейки процесса, ; погрешность большая (не закрашивается вся линейка). ; ; Object ~Process Line~ ; Input: HL-label ; Format mouse table: ; +0 - Object ~Process line~ ; +1 - Xo position object ; +2 - Xi position object ; +3 - Y position object ; +4 - поз. печати ; +5,6 - кол-во единиц на 1 деление процесса ; +7,8 - ячейка, где тек. число единиц ; +9,10 - подпрограмма процесса ;----------------------------------------------------------- ; db ProcesLine ; dw 0504h ; Y,X полож. ; db 72 ; длина линейки ; dw FileBytes ; адрес ячейки с MAX числом ; dw CurrBytes ; адрес ячейки с тек. числом ;ConCall:dw 0 ; адрес подпрограммы процесса ;----------------------------------------------------------- ;FileBytes: ; dw 0,0 ; размер файла ;CurrBytes: ; dw 0,0 ; тек. смещение в файле ;----------------------------------------------------------- PProcess: ld (iy+1),a ;+0 object ld a,(hl) ; X pos inc hl ld c,a add a,(ix+0) ; Pos X from begin screen ld (iy+2),a ;+1 Xo ld a,(hl) ; Y pos inc hl ld b,a add a,(ix+1) ; Pos Y from begin screen ld (iy+4),a ;+3 Yo ld a,(hl) inc hl add a,(iy+2) ld (iy+3),a ld (iy+5),0 ; поз. вывода ld e,(hl) ; где макс. inc hl ld d,(hl) inc hl push ix push hl push bc ex de,hl ld e,(hl) ; HL,IX - max. единиц inc hl ld d,(hl) inc hl push de pop ix ; мл. разряд ld a,(hl) inc hl ld h,(hl) ; ст. рязряд ld l,a ld a,(iy+3) sub (iy+2) ld c,a ; кол-во делений процесса (ширина линейки) ld b,0 call Divis32 db 0DDh ld a,l ld (iy+6),a ; +6,+7 коэффициент db 0DDh ld a,h ld (iy+7),a pop bc pop hl pop ix ld a,(hl) inc hl ld (iy+8),a ld a,(hl) inc hl ld (iy+9),a ld a,(hl) inc hl ld (iy+10),a ld a,(hl) inc hl ld (iy+11),a call GetPutA ex de,hl ld a,(color_array+52) ; 30h цвет линейки процесса ld c,a ld a,(iy+3) sub (iy+2) ld b,a ld (hl),"░" inc hl ld (hl),c inc hl djnz $-5 ex de,hl ld de,12 ld (IY+0),e add iy,de ret ;----------------------------------------------------------- ; ; Обработчик событий объектов ~Process Line~ ; ;----------------------------------------------------------- ; п/п процесса должна возвращать "Carry", если ; процесс закончен. EProcess: push ix ld de,EProcNx ; адрес выхода push de ld l,(ix+10) ; Подпрограмма ld h,(ix+11) ; процесса jp (hl) ; EProcNx:pop ix push af push ix ld l,(ix+8) ; тек. положение ld h,(ix+9) ld c,(ix+6) ; bc=коэффициент ld b,(ix+7) ld e,(hl) ; hl,ix = cur. единиц inc hl ld d,(hl) inc hl push de pop ix ld a,(hl) ; ст. разряд inc hl ld h,(hl) ld l,a call Divis32 ; hl,ix / bc db 0DDh ld a,l pop ix ld b,a ld a,(ix+3) sub (ix+2) ld c,a cp b ld a,b jr nc,$+3 ld a,c sub (ix+5) ; пред. позиция вывода jp z,ProcEx1 ld b,a ; разница между положениями ld c,(ix+5) add a,c ld (ix+5),a ; запом. тек. положение ld a,(ix+2) ; Xo add a,c ; тек. положение ld e,a ld d,(ix+4) ; Yo push de push bc bit 7,(ix+3) ; Xi jr nz,ProcExt bit 7,e jr z,proc1 ld a,e neg sub b neg jr z,ProcExt jp m,ProcExt ld b,a ld e,0 proc1: ld a,e cp 80 jr nc,ProcExt add a,b cp 80 jr c,proc2 ld a,80 sub e ld b,a proc2: ld a,d cp 31 jr nc,ProcExt push ix push bc ld c,84h ; уст. курсор rst 08h pop bc ; b=число символов ld a,"█" ld c,82h rst 08h pop ix ProcExt:pop hl ; h=число единиц pop bc ; позиция на экране push ix in a,(SLOT3) push af ld a,(page_dial_screen) ; стр. буфера out (SLOT3),a ld ix,DialData ; таблица осн. диал. окна ld a,c sub (ix+0) ld c,a ld a,b sub (ix+1) ld b,a call GetPutA ld b,h ld a,"█" ld (de),a inc de inc de djnz $-3 pop af out (SLOT3),a pop ix ProcEx1:pop af ; флаг от п/п процесса ret nc ; процесс не закончился ld hl,what ; поле событий ld (hl),evCommand inc hl ld (hl),cmOkey ret ;------------------------------------------------- ; Процедура деления (32bit) ; вход: hl,de / bc ; выход: de=целое, hl=остаток ;------------------------------------------------- Divis32:ld a,b or c ret z ex de,hl ld hl,0 ld a,32 div32b1:add ix,ix ex de,hl adc hl,hl ex de,hl adc hl,hl sbc hl,bc jr nc,div32b2 add hl,bc dec a jr nz,div32b1 ret div32b2:inc ix dec a jr nz,div32b1 ret