;=========================================================== ; Вектор мышки ;=========================================================== 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