;************************************************************************ ;Tastatur- Spielhebel- Kassetten- u. Musik- Treiber ;BEEP ueber Kanal A ;27.06.89 ;Bearbeiter: Luetzner ;************************************************************************ ; external STOP1 ; ;************************************************************************ global IRSYS SYS06 SYS19 SOTB SOTB10 FTB FTB6 global CAPSB STOPB HOMEB RIPUZI CTRIPU global STB STB2 LORIPU INKEY RDRIPU RDRIP1 GETA35 global YSLDIF ;************************************************************************ YIRSYS ld (IRSPL2),sp ld sp,IRSPL2 push af in a,(PPIA) ld (H1PPIA),a ld a,0A0h YSLOT equ $-1 out (PPIA),a call IRSYS ;Tastatur-IR ausfuehren ld a,(H1PPIA) out (PPIA),a pop af ld sp,(IRSPL2) ei reti ;-------------------------------- YSLDIF equ YSLOT-YIRSYS ;-------------------------------- ;SToPTeST ; ;IN: HL= ; STPTST ld a,(STOPFL) and a ret nz ;Stop aus-->RET ;------------------------------- push hl ld hl,STCSSW di ld a,(hl) ld (hl),0 pop hl ei and a ret z ;kein Stop-->RET ;------------------------------- cp 3 ;CTRL-STOP? jr z,STPT20 ; Ja-->STPT20 ; ------------------------ push hl push de push bc call KUSEZ ;Bed. Kursoranz ld hl,STCSSW STPT15 di ld a,(hl) ld (hl),0 ei and a jr z,STPT15 ;Warten auf 2. STOP push af call KUREZ ;Bed. Kursorloe pop af pop bc pop de pop hl cp 3 ;CTRL-STOP? ret nz ; Nein-->RET ;=============================================== STPT20 push hl ;CTRL-STOP-Beh call LORIPU ;Loe Ringpuff call TSTPIR ;Test Stop-IR jr nc,STPT30 ;kein IR-->STPT30 ; ------------------------ ld hl,STOPSW di call IRAMN ;IR anmelden ei pop hl ret ;----------------------------------------------- STPT30 call LATXTM ld a,(BASUB) ld h,40H call BANKUM ;BASIC zuschalten pop hl ;HL unveraendert xor a ld sp,(HELPSP) push bc ;Masken Bankum jp STOP1 ;*********************************************** ;Test SToPtasten-IR ; ;OUT: CY=1: IR TSTPIR ld a,(STOPSW) rrca ret nc ; ------------------------ ld hl,(STOPAD) ld a,h or l ret z ; ------------------------- ld hl,(ACTZN) inc hl ld a,h or l ret z ; ------------------------- scf ;CY=1-->IR ret ;************************************************ ;LOeschen RIngPUffer ; LORIPU ld hl,(SCHRIP) ld (LESRIP),hl call XRDRP2 ;SCP - Statuspufferzeile ; loeschen ret ;************************************************ ;Direkter SToptasten-TeSt ; ;OUT: CY=1: CTRL-STOP ; DSTPTS in a,(PPIC) and 0F0H or 6 out (PPIC),a EX (SP),HL EX (SP),HL in a,(PPIB) and 4 ;CTRL ? ret nz ;nein ; ------------------------ in a,(PPIC) inc a out (PPIC),a EX (SP),HL EX (SP),HL in a,(PPIB) and 10h ;STOP jr nz,DSTPT1 ;nein ; ------------------------ ld a,(LTMSTP) and 0EFh ;STOP eintr. ld (LTMSTP),a jr DSTPT2 ; ------------------------ DSTPT1 in a,(PPIC) and 0F0h or 3 out (PPIC),a EX (SP),HL EX (SP),HL in a,(PPIB) and 1 ;C ? ret nz ;nein ;------------------------------- DSTPT2 push hl ld hl,(SCHRIP) ld (LESRIP),hl ;Ringpuff loeschen pop hl ld a,19 ;Tastatur entprellen ld (TSTPRZ),a scf ;CY=1 ret ;************************************************ IRSYS push hl push de push bc exx ex af,af' push hl push de push bc push af push iy push ix ; ------------------------ call XIRSY1 ;0FD9AH ; ------------------------ ei call XIRSY2 ;0FD9FH ;------------------------------- ld hl,(DAUER) dec hl ld a,h or l jr nz,SYS05 ; ------------------------ ld hl,INTVSW call IRAMN ;IR: Time ld hl,(VAIVAL) ; ------------------------ SYS05 ld (DAUER),hl ;------------------------------- SYS06 ld hl,(VATIME) inc hl ld (VATIME),hl ;Time-Variable+1 ;------------------------------- ld a,(MUKAFL) ;Tonerzeugung fuer ld c,a xor a SYS10 rr c push af push bc call c,MUERZI pop bc pop af inc a cp 3 ; alle 3 Kanaele jr c,SYS10 ;------------------------------- ld hl,TSTIRZ dec (hl) jr nz,SYS15 ;================================ ld (hl),2 ;------------------------------- call XIRSY4 ;SCP: PC=SYS19 ; ------------------------ call INJOY and 0F0H ;nur Schussauswertung ld b,a call INKSTA and 1 ;Space ? ld a,b jr z,SYS30 or 1 ;nein SYS30 ld c,a ;Bit 0: Space-Taste ;Bit 4-7: Aktionstasten ; ------------------------ ld hl,HSTRIG xor (hl) and (hl) ;Bit i,A=1 bei 1/0-Flanke ld (hl),c ld c,a ; ------------------------ rrca ld hl,SRG0SW call c,IRAMN ;IR: Space-Taste ; ------------------------ rl c ld hl,SRG2SW call c,IRAMN ;IR: Joy2 Aktionstaste1 ; ------------------------ rl c ld hl,SRG4SW call c,IRAMN ;IR: Joy2 Aktionstaste2 ; ------------------------ rl c ld hl,SRG1SW call c,IRAMN ;IR: Joy1 Aktionstaste1 ; ------------------------ rl c ld hl,SRG3SW call c,IRAMN ;IR: Joy1 Aktionstaste2 ;=============================== SYS19 xor a ld (KCLK1T),a ;-------------------------------- call GETAST ;Abfrage Tastenmatrix jr nz,SYS15 ;noch Zeichen im Ringpuffer -->Ende ;------------------------------- ld hl,TSTPRZ ;Repeatzaehler=0 ? dec (hl) jr nz,SYS15 ; Nein-->Ende ; ------------------------ ld (hl),1 ld hl,LTAMAT ld de,LTAMAT+1 ld bc,8 ld (hl),0FFH ldir ;LTAMAT loeschen call GETA25 ;Erneute Tastenabfrage ;=============================== SYS15 pop ix pop iy pop af pop bc pop de pop hl ex af,af' exx pop bc pop de pop hl ret ;************************************************ ;GEt TASTaturbelegung ; GETAST in a,(PPIC) and 0F0H ld c,a ld b,9 ;Spaltenanzahl ld hl,ATAMAT ;aktuelle Tastenmatrix GETA05 ld a,c out (PPIC),a ex (sp),hl ex (sp),hl in a,(PPIB) ld (hl),a ;akt. Tastenbelegung fuer Spalte c inc c inc hl djnz GETA05 ; ---------------------- call XGETA5 ;Test auf unerfuelte STOP-Anforderung ;----------------------------- GETA10 ld de,ATAMAT ld b,9 GETA15 dec de ;akt Tastenbelgg = dec hl ; letzte - " - ld a,(de) cp (hl) jr nz,GETA20 ; Nein-->GETA20 djnz GETA15 jr GETA25 ; ------------------------ GETA20 ld a,19 ;Repeatzaehler ld (TSTPRZ),a; laden ;------------------------------- GETA25 ld b,9 ld hl,LTAMAT ;alte Tastenbelegg. ld de,ATAMAT ;akt. -"- GETA30 ld a,(de) ld c,a xor (hl) ;Bit i,A=1, wenn Taste gedr and (hl) ; (d.h. Bit i,(HL) mit 1/0-Flanke) ld (hl),c call nz,TASTV ;Behandlung d.gedr. Taste(n) inc de inc hl djnz GETA30 ;=============================== GETA35 ld hl,(LESRIP) ;Lesezeiger ld a,(SCHRIP) sub l ;Zeichen im Ringpuffer ret ;NZ: Ja ;************************************************ ; ;Out: NZ ,wenn Zeichen im Buffer ; INKEY ei push hl push de push bc call TGRASV ;Grafikscreen ? jr nc,INKEY2 ; ja ; ------------------------ ld a,(FTSHI) ld hl,ASTAMT xor (hl) ld hl,FKTANZ and (hl) rrca call c,KEYON ; ------------------------- INKEY2 call GETA35 pop bc pop de pop hl ret ;************************************************ ;TASTaturVerteiler ;IN: Bit i,A: Zeile der gedr Taste ; B: 9-Spalte - " - ; TASTV push hl push de push bc push af ld a,9 sub b add a,a add a,a add a,a ld c,a ;8*Spalte(0-8) ld b,8 pop af ;Zeile TASTV2 rra push bc push af call c,JPCDE pop af pop bc inc c djnz TASTV2 jp POP2 ;************************************************ ;TAstenCOdeTabelle ; TACOT defm '0123456789' ;ohne Sondertaste defb 3Ch ;< oder mit CTRL defb 2Bh ;+ (A=0) defb 94h ;oe defb 84h ;ae defb 81h ;ue defb 23h ;# defb 27h defb 3Fh ;? defb 2Ch ;, defb 2Eh ;. defb 2Dh ;- defb 0 defm 'abcdefghijklm' defm 'nopqrstuvwxyz' ;------------------------------- defb 3Dh ;= mit SHIFT defb 21h ;! oder CTRL SHIFT defb 22h ;" (A=1) defb 5Ch ;\ defb 24h ;$ defb 25h ;% defb 26h ;& defb 2Fh ;/ defb 28h ;( defb 29h ;) defb 3Eh ;> defb 2Ah ;* defb 99h ;OE defb 8Eh ;AE defb 9Ah ;UE defb 5Eh ;^ defb 60h defb 0E1h defb 3Bh ;; defb 3Ah ;: defb 5Fh ;_ defb 0 defm 'ABCDEFGHIJKLM' defm 'NOPQRSTUVWXYZ' ;-------------------------------- defb 9h ; mit GRAPH defb 0ACh ; (A=2) defb 0ABh defb 12h defb 0AAh defb 16h defb 0F4h defb 1Dh defb 0ECh defb 0FAh defb 0AEh defb 0F1h defb 6 defb 5 defb 1 defb 0Fh defb 0 defb 0Dh defb 0B0h defb 0FBh defb 017h defb 0 defb 0C7h defb 0C8h defb 0BDh defb 0B6h defb 0B7h defb 0DDh defb 0DFh defb 0CCh defb 0CBh defb 0CEh defb 0B9h defb 0B1h defb 0BCh defb 0CAh defb 0BBh defb 0Bh defb 0D6h defb 10h defb 0D7h defb 1Fh defb 0C9h defb 0DBh defb 0D2h defb 0D0h defb 0D3h defb 0BAh ;------------------------------- defb 0Ah ; mit SHIFT GRAPH defb 0EFh ; (A=3) defb 0FDh defb 0FCh defb 0A9h defb 0F6h defb 0F5h defb 0F8h defb 0F9h defb 8h defb 0AFh defb 0FEh defb 4 defb 3 defb 2 defb 7Eh defb 0 defb 0Eh defb 0C4h defb 0F7h defb 0F0h defb 0 defb 0C6h defb 0C0h defb 0BEh defb 0B5h defb 0B8h defb 0DEh defb 0DCh defb 0C3h defb 0C2h defb 0C5h defb 0B4h defb 0B2h defb 0D9h defb 0C1h defb 0BFh defb 0Ch defb 0D5h defb 11h defb 0D8h defb 01Eh defb 0DAh defb 0B3h defb 0D1h defb 0CFh defb 0D4h defb 0CDh ;------------------------------- defb 0EBh ; mit ALT defb 0 ; (A=4) defb 40h defb 15h defb 87h defb 0EEh defb 0E7h defb 7h defb 5Bh defb 5Dh defb 0F3h defb 0 defb 0 defb 0 defb 0EDh defb 0E5h defb 0 defb 0E9h defb 86h defb 0A6h defb 0A7h defb 0 defb 0E0h defb 97h defb 8Dh defb 8Bh defb 8Ch defb 9Fh defb 98h defb 0 defb 0A1h defb 91h defb 0 defb 0 defb 0E6h defb 0A4h defb 0A2h defb 0A3h defb 83h defb 93h defb 89h defb 96h defb 82h defb 95h defb 88h defb 8Ah defb 85h defb 0A0h ;------------------------------- defb 13h ; mit SHIFT ALT defb 0ADh ; (A=5) defb 9Eh defb 9Ch defb 80h defb 14h defb 0E2h defb 9Bh defb 7Bh defb 7Dh defb 0F2H defb 0EAh defb 0 defb 7Ch defb 0E8h defb 0E4h defb 0 defb 0A8h defb 8Fh defb 0 defb 0 defb 0 defb 0 defb 0 defb 0 defb 1Ah defb 18h defb 0 defb 0 defb 0 defb 0 defb 92h defb 0 defb 0 defb 0 defb 0A5h defb 0 defb 0E3h defb 1Ch defb 0 defb 1Bh defb 0 defb 90h defb 0 defb 0 defb 19h defb 9Dh defb 0 ;********************************************************************* ;FunktionsTasten-Behandlung ; ;IN: C = Tastencode (35H...39H) ;OUT: bei SHIFT: C = C+5 ; FTB ld a,37H ;F5..F1 sub c ;in add a,37H ;F1..F5 ld c,a ;WANDELN ld a,(ASTAMT) rrca jr c,FTB2 ld a,c add a,5 ld c,a FTB2 ld e,c ;C=35H(F1)...3EH(F10) ld d,0 ; ------------------------ call XFTB ;SCP: PC:= FTB6 ; ------------------------ ld hl,FIRERL-35H ;Kann FTaste add hl,de ld a,(hl) and a ; IR ausloesen? jr nz,FIRANM ; JA--> ;------------------------------- FTB6 ex de,hl add hl,hl add hl,hl add hl,hl add hl,hl ;HL=DE*10H ld de,FKEY1-350H add hl,de ex de,hl ;DE=Adr ZK fuer FTaste ;------------------------------- FTB8 ld a,(de) and a ;Endezeichen? ret z ; Ja-->RET call CTRIPU ;ZK in Ringpuffer inc de jr FTB8 ;************************************************ ;Funktionstasten-IR-ANMeldung ; FIRANM ld hl,(ACTZN) inc hl ld a,h or l ;Direktmode? jr z,FTB6 ; Ja--> ;------------------------------- ld hl,KEY1SW-3*35H add hl,de add hl,de add hl,de ;HL=KEY1SW...KEY10S ;************************************************ ;IR-ANMeldung ; ;IN: HL = IR-Steuerbyte ; IRAMN ld a,(hl) and 1 ;IR ON gewesen? ret z ; Nein-->RET ;------------------------------- ld a,(hl) or 4 ;IR STOP gewesen? cp (hl) ret z ; Ja-->RET ;------------------------------- ld (hl),a ;IR STOP xor 5 ret nz ;-------------------------------- ld a,(IRVAN) ;je IR-Quelle inc a ;einmalige ld (IRVAN),a ;Anmeldung ret ;************************************************ ;MUsikERZeugung im Interrupt ; ;IN: A=SVG-Kanal (0..2) ; MUERZI ld b,a call MUR1 ;------------------------------- dec hl ;Dekr 2 Byte in (HL-2) ld d,(hl) dec hl ld e,(hl) dec de ld (hl),e inc hl ld (hl),d ;------------------------------- ld a,d ;Ergebnis=0? or e ret nz ; Nein-->RET ;------------------------------- ld a,b ld (HEMUKA),a call MUREAD cp 0FFH jr z,MUER40 ;------------------------------- ld d,a and 0E0H rlca rlca rlca ld c,a ld a,d and 1FH ld (hl),a ;------------------------------- call MUREAD dec hl ld (hl),a inc c ;================================ MUER10 dec c ret z ;C=0-->RET ;------------------------------- call MUREAD ld d,a and 0C0H jr nz,MUER20 ;------------------------------- call MUREAD ld e,a ld a,b rlca call MUOTAE ;Frequenz ;------------------------------- inc a ld e,d call MUOTAE ; an SVG dec c jr MUER10 ;=============================== MUER20 ld h,a and 80H jr z,MUER30 ;------------------------------- ld e,d ld a,b add a,8 call MUOTAE ;Lautstaerke an SVG ;------------------------------- ld a,e and 10H ld a,0DH call nz,MUOTAE ;Huellkurve an SVG ;------------------------------- MUER30 ld a,h and 40H jr z,MUER10 ;------------------------------- call MUREAD ld d,a call MUREAD ld e,a ld a,0BH call MUOTAE ;Periode der ;------------------------------- inc a ld e,d call MUOTAE ; Huellkurve an SVG dec c dec c jr MUER10 ;=============================== MUER40 ld a,b add a,8 ld e,0 call MUOTAE ;Lautstaerke=0 ;------------------------------- inc b ld hl,MUKAFL xor a scf ;------------------------------- MUER50 rla djnz MUER50 and (hl) xor (hl) ;Res i,(HL), i=Kanalnr. ld (hl),a ;************************************************ ;MUsikZELlen Verwalten ; MUZELV ld a,(MUKAFL) or a ret nz ;------------------------------- ld hl,MUHLP ld a,(hl) or a ret z ;------------------------------- dec (hl) ld hl,1 ld (MULA0),hl ld (MULA1),hl ld (MULA2),hl ld a,7 ld (MUKAFL),a ret ;************************************************ ;MUsik READ ; MUREAD ld a,(HEMUKA) push hl push de push bc call MUPUR jp POP2 ;************************************************************ ;MUsikRechnung 1 ; ;IN: A=SVG-Kanal ; MUR1 ld l,2 jr MUR3 ;************************************************************ ;MUsikRechnung 2 ; ;IN: L= ? ; MUR2 ld a,(MUKA) ;************************************************************ ;MUsikRechnung 3 ; ;IN: A=SVG-Kanal / L= ? ;OUT:HL=MULA0+L+25H*A ; MUR3 push de ld de,MULA0 ld h,0 add hl,de or a jr z,MUR34 ld de,25H MUR32 add hl,de dec a jr nz,MUR32 MUR34 pop de ret ;************************************************************ ;MUsikPUffer Write ; ;IN: A=SVG-Kanal / E=Musikbyte ; MUPUW call MUPUKR ld a,b inc a inc hl and (hl) cp c ret z ;Puffer voll (?) ;------------------------------- push hl dec hl dec hl dec hl ex (sp),hl inc hl ld c,a ld a,(hl) inc hl ld h,(hl) ld l,a ld b,0 add hl,bc ld (hl),e ;Musikbyte abspeichern pop hl ld (hl),c ret ;************************************************************ ;MUsikPUffer Read ; ;IN: A=SVG-Kanal ;OUT:A= ; HL= ; MUPUR call MUPUKR ld (hl),0 jr nz,MUPUR2 ;------------------------------- ld a,c cp b ret z ;Pufferende (Z=1) ;------------------------------- inc hl inc a and (hl) dec hl dec hl push hl inc hl inc hl inc hl ld c,a ld a,(hl) inc hl ld h,(hl) ld l,a ld b,0 add hl,bc ld a,(hl) pop hl ld (hl),c or a ret nz ;RET (Z=0) ;------------------------------- inc a ld a,0 ret ;------------------------------- MUPUR2 ld c,a ld b,0 ld hl,MUPU0-5 ;F970 add hl,bc ld a,(hl) ret ;************************************************************ ;MUsikPUfferKopf Initialisieren ; ;IN: A=SVG-Kanal / B=7FH / DE=MUPU0/1/2 ; MUPUKI push bc call MUR4 ld (hl),b inc hl ld (hl),b inc hl ld (hl),b inc hl pop af ld (hl),a inc hl ld (hl),e inc hl ld (hl),d ret ;************************************************************ ;MUsik-1-Dummy ; ;IN: A=SVG-Kanal ;OUT:HL= ; MU1D call MUPUKR ld a,b inc a inc hl and (hl) ld b,a ld a,c sub b and (hl) ld l,a ld h,0 ret ;************************************************************ ;MUsikPUfferKopf Read ; ;IN: A=SVG-Kanal ;OUT:HL=MUPUK0/1/2+2 ; B=(MUPUK0/1/2) ; C=(MUPUK0/1/2+1) ; A=(MUPUK0/1/2+2) ; F entsprechend OR A ; MUPUKR call MUR4 ld b,(hl) inc hl ld c,(hl) inc hl ld a,(hl) or a ret ;************************************************************ ;MUsikRechnung 4 ; ;IN: A=SVG-Kanal ;OUT:HL=MUPUK0/1/2 / B=0 ; MUR4 rlca ld b,a rlca add a,b ld c,a ld b,0 ld hl,(AMUPUK) add hl,bc ret ;************************************************************ MUINI ld a,7 ld e,7 ;alle Kanaele ein call MUOTAE ; ----------------------------------- ld a,11 ld e,a call MUOTAE ;------------------------------------------ ; MUINIT push hl push de push bc push af ld hl,MUKAFL ld b,3*37+2 xor a MUIN02 ld (hl),a inc hl djnz MUIN02 ; ------------------------------------- ld de,MUPU0 ld b,7Fh ld hl,80h MUIN04 push hl push de push bc push af call MUPUKI ; ---------------------------- pop af ;Kanalnr. add a,8 ld e,0 ;Lautstaerke=0 -> aus call MUOTAE sub 8 push af ; ---------------------------- ld l,0Fh call MUR3 ;DE=MUKOP0/1/2 ex de,hl ld hl,MUINTB ld bc,6 ldir ;---------------------------------- pop af pop bc pop hl pop de ;Reihenfolge getauscht ! add hl,de ex de,hl ;DE+:=80h, HL=80h ; -------------------------- inc a cp 3 jr c,MUIN04 ;naechsten Kanal ; -------------------------- ld a,7 ld e,7 call MUOTAE ;--------------------------------- jp POP1 ;=============================================== MUINTB defb 4 defb 4 defb 78h defb 88h defb 0FFh defb 0 ; ;************************************************ ;HOME-Behandlung ; HOMEB ld a,(ASTAMT) rrca ;mit SHIFT? ld a,0CH ; Ja: A=0CH (CLS) jr nc,HOMEB2 ; ----------------------- ld hl,HOMECO; Nein (HOME) sbc a,(HL) ; RBASIC: A=0BH ; SCP : A=1 ; ----------------------- HOMEB2 jr STB4 ;************************************************ ;SonderTasten-Behandlung ; ;IN: A= Tastencode (>2FH) ; STB call XSTB ;0FDD1H ;------------------------------- ld e,a ld d,0 ld hl,STACOT-30H STB2 add hl,de ;Zeichencode lesen ld a,(hl) and a ret z STB4 jr CTRIPU ;************************************************ ;CAPS-Behandlung ; CAPSB ld hl,CAPSSW ld a,(hl) cpl ld (hl),a cpl ;************************************************ ;CAPs-LED bedienen ; ;IN: A = 0 : LED ein ; 1 : aus ; CAPLED and a ld a,0CH jr z,CAPL5 inc a CAPL5 out (PPIM),a ret ;************************************************ ;STOP-Behandlung ; STOPB ld a,(ASTAMT) rrca rrca rrca ld a,3 ;CTRL-STOP: A=3 (NC) jr nc,STOPB2 inc a ;nur STOP: A=4 (CY) STOPB2 ld (STCSSW),a ; ----------------------- call XSTOPB ; ----------------------- jr c,TKCLK ;************************************************ ;Character To RIngPUffer ; CTRIPU ld hl,(SCHRIP) ld (hl),a call RIPUZI ;Zeiger erhoehen ld a,(LESRIP) cp l ret z ld (SCHRIP),hl ; ---------------------- call XRDRP2 ;************************************************ ;Test KeyCLicK ; TKCLK ld a,(KCLKSW) and a ret z ;------------------------------- ld a,(KCLK1T) ;bei mehreren and a ; gedrueckten Tasten ret nz ; nur 1 Click !! ;------------------------------- ld a,0FH ;A=15: Keyclick on ld (KCLK1T),a out (PPIM),a ;------------------------------- ld a,0AH ;Warten TKCLK2 dec a jr nz,TKCLK2 ;************************************************ ;KEYCLicK negieren ; ;IN: A=0 : Click off ; <>0: on ; KEYCLK and a ld a,0EH jr z,KEYCL2 inc a KEYCL2 out (PPIM),a ret ;************************************************ ;SOnstige TastenBehandlung ; ;IN: C=Tastencode (<30H) ; SOTB ld a,(ASTAMT) ld e,a rra rra rra push af ;CTRL gedrueckt: CY=0 ;------------------------------- ld a,e cpl ;------------------------------- call XSOTB1 ;SCP: or a / ret ,d.h. CY=0 ;------------------------------- jr nc,SOTB10 ;A=0 : CTRL ;A=1 : CTRL u SHIFT ;------------------------------- and 1 ;Shift bit 4,e ;ALT? jr nz,SOTB06 ; ----------------------- or 4 jr SOTB20 ; ----------------------- SOTB06 ld e,a ld a,(ASTAMT+1) cpl and 4 ;GRAPH rrca or e ;+ Shift ;********************************************* ; rra ; rra ; rlca ; and 3 ; bit 1,a ; jr nz,SOTB20 ;A=2 : GRAPH ; ;A=3 : GRAPH u SHIFT ;------------------------------- ; bit 4,e ; jr nz,SOTB20 ;A=0 : nur Taste ; ;A=1 : SHIFT ;------------------------------- ; or 4 ;A=4 : ALT ; ;A=5 : ALT u SHIFT DEFB 11H ;LD DE,1E6H SOTB10 AND 1 ; - " - ;=============================== SOTB20 ld e,a add a,a add a,e add a,a add a,a add a,a add a,a ld e,a ld d,0 ;DE=30H*A ;------------------------------- ld hl,TACOT add hl,de ld b,d ;B=0 add hl,bc ;------------------------------- ld a,(hl) ; ------------------------ ld hl,SZFLAG inc (hl) dec (hl) jr z,SOTB24 ;sz u. ? normal ;------------------------------- cp 3Fh ;a='?' ? jr nz,SOTB22 ; ------------------------ ld a,0E1h ; ja: ? -> sz jr SOTB24 ;------------------------------- SOTB22: cp 0E1h ;a='sz' ? jr nz,SOTB24 ; ------------------------ ld a,3Fh ; ja: sz -> ? ;------------------------------- SOTB24: ld hl,CAPSSW inc (hl) dec (hl) jr z,SOTB30 ;------------------------------- cp 'a' jr c,SOTB25 cp 'z'+1 jr nc,SOTB25 ; ------------------------ and 0DFh ;klein -> gross jr SOTB30 ;------------------------------- SOTB25 ld c,GUMLT-KUMLT ld hl,GUMLT-1 cpdr jr nz,SOTB30 ; ------------------------ ld c,GUMLT-KUMLT+1 add hl,bc ld a,(hl) ; ------------------------ SOTB30 call XSOTB2 ; ------------------------ ld e,a pop af ;CTRL-> CY=0 ld a,e inc a dec a ret z ;------------------------------- jr c,SOTB40 ;ohne CTRL ;------------------------------- and 0DFH sub 40H cp 20H ret nc ;ungueltige CTRL-Kombination ; ------------------------ cp 3 jp z,STOPB2 ;^C = ^STOP ; ------------------------ SOTB38 jp CTRIPU ; SOTB40 cp 20h jr nc,SOTB38 push af ;2-Byte-Grafikzeichen ld a,1 ;GCH call CTRIPU pop af add a,40h jr SOTB38 ;************************************************ ;JmP, wenn Cy-flag gesetzt nach (DE) ; ;IN: C=phys. Tastencode (0..71) ;OUT: Ansprung entsprechendes Tastenbehandluns-Programm ; JPCDE ld a,c ld hl,TABET ;------------------------------- call XJPCDE ;0FDCCH ; SCP: hl=TABET2 ;------------------------------- JPCDE2 cp (hl) inc hl ld e,(hl) ;Low-Teil inc hl ld d,(hl) inc hl push de ;CAnsprung UP pop de jr JPCDE2 ;************************************************ ;SonderTasten-COdeTabelle ; STACOT defb 0 ;SHIFT defb 1bh ;ESC(CTRL) defb 0 ;CTRL(GRAPH) defb 0 ;CAPS defb 0 ;ALT defb 0 ;F1 defb 0 ;F2 defb 0 ;F3 defb 0 ;F4 defb 0 ;F5 defb 0 ;GRAPH(ESC) defb 0 ;TAB defb 0 ;STOP defb 0 ;BS defb 0 ;SELECT defb 0Dh ;RETURN defb 20h ;SPACE defb 0 ;HOME defb 12h ;INS defb 7Fh ;DEL defb 1Dh ;<- defb 1Eh ;^ defb 1Fh ;v defb 1Ch ;-> ;************************************************ ; KUMLT defb 82h defb 84h ;mit ALT und defb 94h defb 81h defb 0A4h ;Umlaute klein defb 86h defb 87h defb 91h ;************************************************* ;Grossbuchstaben - UMLautTabelle ; GUMLT defb 90h defb 8Eh defb 99h defb 9Ah defb 0A5h defb 8Fh defb 80h defb 92h ;************************************************ ;RIngPUfferZeiger Inkrementieren ; ;IN: Zeigerwert in HL ; RIPUZI inc hl ld a,l cp (RINGPU+40).AND.0FFH ret nz ld hl,RINGPU ret ;************************************************ ;ReaD RIngPUffer ; ;OUT: A=Zeichenkode ; RDRIPU push hl push de push bc ;------------------------------- RDRIP1 call XRDRI1 call INKEY ;Zeichen im Puffer? jr nz,RDRIP4 ; Ja--> ;------------------------------- call KUSEZ RDRIP2 call XRDRI2 call INKEY jr z,RDRIP2 ;Warten auf Zeichen call KUREZ ;-------------------------------- RDRIP4 ld hl,STCSSW ld a,(hl) cp 4 ;CTRL-STOP gedrueckt? jr nz,RDRIP6 ; Ja--> ld (hl),0 ;Schalter loeschen ;------------------------------- RDRIP6 ld hl,(LESRIP) ; ------------------------ call XRDRP4 ;falls Stop-Monitor aktiv war -> RDRIP1 ; ------------------------ ld c,(hl) ;Zeichen lesen call RIPUZI ld (LESRIP),hl ; ------------------------ call XRDRP2 ;aktual. Statuszeile ; ------------------------ ei ld a,c jp POP2 ;************************************************ ;BREAK ; ;OUT: Bei CTRL-STOP: Rueckkehr ins BASIC mit ; HL=0 (Fehlercode o Zeilennr) ; BREAK push hl ld hl,0 call STPTST pop hl ret ;************************************************ ;BEEPausgabe (Version 2.00 ueber Kanal C mit Low-Frequ.= 55h) ; BEEP ld a,0 ld e,80h ;Bit 6=0 wegen moegl. SVG-Probleme call MUOTAE ld e,0 inc a call MUOTAE ld e,1 ;Kanal A ld a,7 call MUOTAE ld e,7 ld a,8 ;Lautstaerke 7 fuer A call MUOTAE ld bc,07D0h call WAITBC ld e,0 ld a,8 ;Ton aus call MUOTAE LD A,(BSKENN) BIT 1,A RET NZ ;SCP -> RET JP MUINIT ;************************************************ ;MUsik Out To A mit parameter E ; MUOTAE di out (0A0h),a ;Reg. anwaehlen push af ld a,e ;Parameter out (0A1h),a pop af ei ret ;************************************************* ;WAIT BC-mal ; WAITBC dec bc ex (sp),hl ex (sp),hl ld a,b or c jr nz,WAITBC ret ;************************************************ ;Get STICK Richtungsabfrage ; ;IN: A=0 :Tastatur / =1: Joy 1 / = 2: Joy 2 ;OUT:A=Joycode (1...8) ; A=0 ,keine Betaetigung ; GSTICK dec a jp m,STICK4 ;------------------------------- call INJOY ;Bit 0-3,A: Richtung ld hl,JOYCT STICK2 and 0FH ld e,a ld d,0 add hl,de ld a,(hl) ret ;=============================== STICK4 call INKSTA ;Abfrage Cursortasten rrca rrca rrca rrca ld hl,KSCT jr STICK2 ;************************************************ ;INput JOYstick ; ;IN: A=0/1: Joy 1/2 ;OUT:Bit 0-3,A: Richtung ; 4-5,A: Aktionstasten Joy 1 ; 6-7,A: -#- 2 ; INJOY and 1 ld b,a di in a,(DPIOB) ;Bit 5,A =0 Joy1 aktiv and 9FH ;Bit 6,A =0 Tastatur aus dec b jp m,INJOY1 or 20H ;Bit 5,A =1 Joy2 aktiv INJOY1 out (DPIOB),a ld a,0 ;8 Takte in a,(PPIB) push af in a,(DPIOB) or 40H ;Tastatur ein out (DPIOB),a pop af ei ret ;************************************************ ;INput KurSor-TAsten ; ;OUT: A=Tastencode fuer Kursor- und Space-Tasten ; INKSTA di in a,(PPIC) and 0F0H add a,8 out (PPIC),a ex (sp),hl ex (sp),hl in a,(PPIB) ei ret ;************************************************ ;JOYCode-Tabelle ; JOYCT defb 0 defb 5 defb 1 defb 0 defb 7 defb 6 defb 8 defb 7 defb 3 defb 4 defb 2 defb 3 defb 0 defb 5 defb 1 defb 0 ;************************************************ ;KurSorCode-Tabelle ; KSCT defb 0 defb 3 defb 5 defb 4 defb 1 defb 2 defb 0 defb 3 defb 7 defb 0 defb 6 defb 5 defb 8 defb 1 defb 7 defb 0 ;************************************************ ;Get STRIG Abfrage Aktionstaste (A) ; ;IN: A=0 : Tastatur (Space) ; 1 : Joy 1 Knopf 1 ; 2 : Joy 2 Knopf 1 ; 3 : Joy 1 Knopf 2 ; 4 : Joy 2 Knopf 2 ; ;OUT:A=0 : Aktionstaste (A) nicht gedrueckt ; A=FF: sonst ; GSTRIG dec a jp m,STRIG6 push af ld bc,MASKT add a,c ld c,a jr nc,STRIG1 inc b STRIG1 ld a,(bc) ld c,a ;Maske fuer Aktionstaste pop af call INJOY and c STRIG4 sub 1 sbc a,a ret STRIG6 call INKSTA and 1 jr STRIG4 ;----------------------------- MASKT defb 20H defb 80H defb 10H defb 40H ;************************************************ ;MOTor-STeuerung Kassette ; ;IN: A=0 : Aus / =1 : Ein / =FF: Negieren ; MOTST and a jp m,MOTST6 MOTST2 jr nz,MOTST4 ld a,9 defb 0c2h ;JP NZ,83EH MOTST4 ld a,8 ; - " - out (PPIM),a ret MOTST6 in a,(PPIC) and 10H jr MOTST2 ;************************************************************ ;Direkte TastenMAtrix-ABFrage ; ;IN: A=Spaltenbelegung ;OUT:A=Zeilenbelegung ; DTMABF ld c,a di in a,(PPIC) and 0F0H add a,c out (PPIC),a EX (SP),HL EX (SP),HL in a,(PPIB) ei ret ;************************************************************ GPAD ld a,0FFh;nichts gedrueckt ret GPDL ld a,0FFh ret ;************************************************************ ;Wait und Motor OFF ; ;OUT: EI ! ; WMOFF push bc push af ld bc,0 WMOFF2 dec bc ld a,b or c jr nz,WMOFF2 pop af pop bc ;************************************************************ ;Motor OFF ; ;OUT: EI ! ; MOFF push af ld a,9 out (PPIM),a pop af ei ret ;************************************************************ ;OUTput VorTon ; ;IN: A=0 : Kurzer / <>0 : langer Vorton ; OUTVT or a push af ;------------------------------- ld a,8 out (PPIM),a ;Motor on ;------------------------------- ld hl,0 OUTVT2 dec hl ld a,h or l jr nz,OUTVT2 ;warten ;------------------------------- pop af ld a,(VOTOL) jr z,OUTVT4 ;-->kuzer VT add a,a add a,a ;langer VT ;------------------------------- OUTVT4 ld b,a ld c,0 ;BC=A*256 di OUTVT6 call OTHIFR call OT0BI2 ;UP=RET dec bc ld a,b or c jr nz,OUTVT6 jp DSTPTS ;************************************************************ ;OUTput BYTe ; ;IN: A=Byte ; OUTBYT ld hl,(NUBIFR) push af ;------------------------------- ld a,l sub 0EH ;Korrektur Low-Zeit ld l,a call OTPER ;Startbit ausgeben ;------------------------------- pop af ld b,8 OUTBY2 rrca call c,OT1BI ;Bit 0...7 call nc,OT0BI djnz OUTBY2 ;------------------------------- call OT1BI ;2 Stopbits call OT1BI ;ausgeben jp DSTPTS ;************************************************************ ;OuTput 0-BIt ; ;1 Periode der niedrigen Frequenz ; OT0BI ld hl,(NUBIFR) call OTPER OT0BI2 ret ;************************************************************ ;OuTput 1-BIt ; ;2 Perioden der hohen Frequenz ; OT1BI call OTHIFR ex (sp),hl ;60 Takte ex (sp),hl nop nop nop nop ; warten call OTHIFR ret ;************************************************************ ;OuTput HIgh-FRequenz ; OTHIFR ld hl,(EIBIFR) ;************************************************************ ;OuTput 1 PERiode ; ;IN: L=LOW-Zeit / H=HIGH-Zeit ; OTPER push af OTPER2 dec l ;16*L Takte Low jp nz,OTPER2 ; ------------------------ ld a,0BH out (PPIM),a ;Ausgabe High OTPER4 dec h ;16*H Takte High jp nz,OTPER4 ; ------------------------ ld a,0AH out (PPIM),a ;Ausgabe Low pop af ret ;************************************************************ ;INput VorTon ; INVT ld a,8 ;Motor on out (PPIM),a di ;DI ! ;------------------------------- INVT10 ld hl,1111 ;1111 Perioden einlesen ; ------------------------ INVT20 ld d,c ;D=letzte Periode call TBPD2 ;Periodendauer auszaehlen ret c ;CTRL-STOP-->RET ; ------------------------ ld a,c ;A=jetzige Periode cp 222 ;Absoluttoleranz jr nc,INVT10 ; 5<=A<222? cp 5 jr c,INVT10 ; Nein--> ; ------------------------ sub d jr nc,INVT30 cpl inc a INVT30 cp 4 ;Gleichlauf jr nc,INVT10 ; ABS(A-D)<=4? ; ------------------------ dec hl ; ja ld a,h or l jr nz,INVT20 ;------------------------------- ld hl,0 ld b,l ld d,l ; ------------------------ INVT40 call TBPD2 ;256 Perioden zum ret c ;Erkennen der add hl,bc ;Baud-Rate lesen dec d jp nz,INVT40 ; ------------------------ ld bc,1710 add hl,bc ld a,h rra and 7FH ;a=h/2 ld d,a add hl,hl ld a,h sub d ld d,a sub 6 ;Mindestperiodendauer ld (VKAIN1),a;fuer Startbit ; ------------------------ ld a,d add a,a ld b,0 ; ------------------------ INVT50 sub 3 inc b jr nc,INVT50 ; ------------------------ ld a,b sub 3 ;Zeitfensterbreite ld (VKAIN2),a ;zum Flankenzaehlen ;------------------------------- or a ;CY=0 ret ;************************************************************ ;INput BYTE ; ;OUT: A=Byte ; INBYTE ld a,(VKAIN1) ld d,a ;------------------------------- INBY2 call DSTPTS ret c ; CTRL-Stop in a,(DPIOB) rlca jr nc,INBY2 ;Warten auf High ;-------------------------------- INBY4 call DSTPTS ret c in a,(DPIOB) rlca jr c,INBY4 ;Warten auf Low ;=============================== ld e,0 ;Startbit mit Low beginnend call TBPD1 ;Halbperiode auszaehlen INBY6 ld b,c ;Zaehlwert call TBPD1 ret c ;CTRL-Stop ld a,b add a,c ;zulaessige Startbitperiodendauer ? jp c,INBY6 ; nein - zu gross cp d jr c,INBY6 ; nein - zu klein ;------------------------------- ld l,8 ;8 Datenbit INBY8 call TBFLZ ;Flanken im Zeitfenster zaehlen cp 4 ccf ret c cp 2 ;2-3 Flanken -> 1-Bit ccf ;0-1 -#- -> 0-Bit rr d ;Byte aufbauen ld a,c rrca call nc,TBPD12 ;auf 1.bzw. 3. Flanke warten call TBPD1 ;auf letzte Flanke warten dec l jp nz,INBY8 ; ------------------------ call DSTPTS ld a,d ;Byte ret ;************************************************************ ;TonBand-FLankenanZahl ; ;IN: E=Maske fuer Flanke ;OUT:A=Flankenzahl ; E=/E ,nach jeder Flanke ; TBFLZ ld a,(VKAIN2) ld b,a ;B=Zaehlzeit ld c,0 ;C=Zaehler ;------------------------------- TBFLZ2 in a,(DPIOB) xor e ;war Flanke ? jp p,TBFLZ4 ; nein ; ------------------------ ld a,e ; ja cpl ld e,a ;E=/E ;----------------------- inc c djnz TBFLZ2 ;------------------------------- ld a,c ret ;=============================== TBFLZ4 nop ;Zeitschleife nop nop nop djnz TBFLZ2 ;------------------------------- ld a,c ret ;************************************************************ ;TonBand-PeriodenDauer 1 ; TBPD1 call DSTPTS ret c ;************************************************************ ;TonBand-PeriodenDauer 12 ; TBPD12 ld c,0 ;Anfangsstand Zaehler ;************************************************************ ;TonBand-PeriodenDauer ; ;IN: C=Anfangsstand Zaehler ; E=Maske fuer Flanke ;OUT:C=Zaehlergebnis ; E=/E wenn Flanke kam ; TBPD14 inc c jr z,TBPD16 ;Uberlauf--> in a,(DPIOB) xor e jp p,TBPD14 ;Warten auf Flanke ; ------------------------ ld a,e cpl ld e,a ;E=/E ret ;------------------------------- TBPD16 dec c ret ;************************************************************ ;TonBand-PeriodenDauer2 ; ;OUT:C=Periodendauer ; TBPD2 call DSTPTS ret c ;CTRL-Stop in a,(DPIOB) rlca jr c,TBPD2 ;Warten auf low ;------------------------------- ld e,0 ;Zaehlen call TBPD12 ; Low- u. jp TBPD14 ; High-Zeit ;************************************************************ ;TAstenBEehandlungs-Tabelle ; TABET DEFB 30H DEFW SOTB DEFB 33H DEFW STB DEFB 34H DEFW CAPSB DEFB 35H DEFW STB DEFB 3AH DEFW FTB DEFB 3CH DEFW STB DEFB 3DH DEFW STOPB DEFB 41H DEFW STB DEFB 42H DEFW HOMEB DEFB 0FFH DEFW STB ;************************************************************* ÿªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª