home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
develop
/
as65
/
demo
/
s1
/
namtast.asm
< prev
next >
Wrap
Assembly Source File
|
1995-02-27
|
12KB
|
452 lines
;**************************************************************************
;
; Filename : NAMTAST.ASM
; ----------------------
;
; (c) 1990/91 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Namentasten Handling
;
;
;**************************************************************************
MODUL_START set * ; Größe des Moduls berechnen
; =========================================================================
;
; Funktion : Namentaste auswerten
; der NT Speicher ist folgendermaßen aufgeteilt:
; NT 0 : Babyphone Rufnr.
; NT 1-? : NT Rufnr. im 1. RAM
; NT ?-100 : NT Rufnr. im 2. RAM
; NT 101-? : Rufnr. für Telefonbuch
;
; Eingang : Offset auf Tastaturtabelle in X-Reg.
; : Tastenwert im Accu
;
; Ausgang : LED in Namentaste eingeschaltet
;
; Register : Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================
namsp_tab word put_nt ; standard Namentaste speichern/kontrollieren
word put_notruf ; Notruf Namentaste speichern/kontrollieren
word put_telnt ; TeleBuch Namentaste speichern/kontrollieren
key_namen jsr curs_off ; Cursor ausschalten
pha ; Tastenwert retten
lda tast_tab+1,x ; NT Nr. holen
tax ; Tastennr.
pla ; Tastenwert holen
; LED in vorheriger NT ausschalten
; --------------------------------
ldy #LD_L|LD_R|LD_OFF ; LED-Wert laden
jsr set_prgled ; LED in allen NT ausschalten
; LED in gedrückter NT einschalten
; --------------------------------
ldy #LD_L|LD_T ; LED-Wert für 1.Speicher laden
bbr ST_2SP,feap_stat,key_nam_1sp ; 2.Speicher nicht aktiv
ldy #LD_R|LD_T ; LED-Wert für 2.Speicher laden
key_nam_1sp jsr set_twnrled ; LED in NT einschalten
txa ; NT Nr. -> Accu
clc
adc #NT_NAMTAST ; 1. gültige NT (10-...) generieren
rmb NT_OUT,allg_stat ; Rufnr. auf NT wählen
bbs MOD_SP,modus,keynam_sp ; Rufnr. auf Namentaste speichern
bbr MOD_KO,modus,keynam_whl ; Rufnummer auf NT wählen
; NT kontrollieren
; ----------------
keynam_out jsr dp_clr ; Display löschen
smb NT_OUT,allg_stat ; Rufnr. auf NT nur ausgeben
ldx namsp_fkt ; akt. Funktion für Namen Speicher
jmp (namsp_tab,x) ; und ausführen
; Rufnr. auf Namentaste wählen/ausgeben
; =====================================
keynam_whl jmp put_nt ; Rufnummer der NT ausgeben/wählen
; Rufnummer der gedrückten NT ausgeben
; ====================================
last_nt_out lda last_nt ; NT Nr. laden
jsr keynam_out ; und Rufnummer erneut ausgeben
sty ziff_offs ; Offset auf NT Buffer für nächste Ziffer
key_nam_end rts
; Auswahl der NT für Rufnr. speichern (NT Nr. im Accu)
; Einsprung auch von Babyphone, Notruf, Telefonbuch !!!
; ====================================================
keynam_sp
block
ldx #WTA_SPNAM ; WTA Prg. für Speichern NT
stx wta_prg ; und bei Wähltaste ausführen
jsr getnam_adr ; Adr. der NT nach (nam_sp) holen
bcc key_nam_end ; Speicherbereich ist nicht gültig
cmp last_nt ; gleiche Taste erneut gedrückt ?
sta last_nt ; letzte NT merken
bne nam_aktiv ; nein
; Rufnr. zum editieren anzeigen
; -----------------------------
bbs EDIT_NT,allg_stat,nam_aktiv ; Eingabe toggeln
smb EDIT_NT,allg_stat ; Rufnr. ist zum editieren ausgegeben
bra last_nt_out ; Rufnr. ausgeben
; Rufnr. Eingabe aktivieren
; -------------------------
nam_aktiv rmb EDIT_NT,allg_stat ; komplette Rufnr. eingeben
lda #MAX_NAM_ZIFF-1 ; 1. Ziffer einstellen
sta ziff_offs
jmp put_rufnr ; "Rufnummer ?" ausgeben
bend
; =====================================================
; nächste Spezial NT einstellen und im ACCU zurückgeben
; =====================================================
nt_nxt_spec
block
lda last_nt ; akt. NT Speicher holen
bbr ST_2SP,feap_stat,set ; 2.SP ist nicht aktiv
rmb ST_2SP,feap_stat ; 2.SP ist nicht aktiv
inc a ; nächsten NT Speicherplatz einstellen
inc last_nt
rts
set smb ST_2SP,feap_stat
rts
bend
; =========================================================================
;
; Funktion : Rufnummer auf einer Namentaste speichern/kontrollieren
;
; Eingang : Auswahl bei Speichern/Kontrolle
;
; Ausgang : Wähltastatur abgeschaltet, wird durch NT Druck aktiviert
;
; Register : X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================
spko_namkey
block
ldx #WTA_NOPRG ; kein WTA-Programm ausführen
stx wta_prg ; und bei Wähltaste ausführen
ldx #<nt_txt ; Text ausgeben
ldy #>nt_txt
jmp puttxt
nt_txt byte DSP_CLR
shift "Namentaste ?"
bend
; =========================================================================
;
; Funktion : Ziffer auf NT speichern
;
; Eingang : bei Wähltaste und eingeschaltetem Namentasten-Speicher-Modus
; : Tastenwert (1 bis ...) im Accu
;
; Ausgang : eingegebene Rufnummer auf der Namentaste gespeichert
;
; Register : Accu, Y
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================
wta_spnam
block
smb EDIT_NT,allg_stat ; Rufnr. ist zum editieren ausgegeben
ldy ziff_offs ; Offset auf akt. Ziffer laden
bmi end ; max. Anzahl Ziffern eingegeben
pha ; Ziffer retten
lda (nam_sp),y ; Ziffer für 1. und 2. Speicher laden
bbs ST_2SP,feap_stat,nam_2sp ; 2.SP ist aktiv
; Rufnummer für 1.Speicher ermitteln
; ----------------------------------
and #%11110000 ; unteres Nibble = 1.Speicher ausblenden
sta hlp_reg
pla ; Ziffer zurück
bra nam_write ; und Ziffernwert eintragen
; Rufnummer für 2.Speicher ermitteln
; ----------------------------------
nam_2sp and #%00001111 ; oberes Nibble = 2.Speicher ausblenden
sta hlp_reg
pla ; Ziffer zurück
asl ; unteres Nibble ins obere schieben
asl ; Rufnr. des 2.Speichers steht im high Nibble
asl
asl
nam_write ora hlp_reg ; Ziffer vom anderen (1.oder 2.Speicher) dazu
sta (nam_sp),y ; neue Ziffer speichern
; Ende der Rufnr. kennzeichnen
; ----------------------------
dey ; nächste Ziffer ist Ende Kennung
bra nam_clr ; Ende Kennung eintragen
end rts
bend
; =========================================================================
;
; Funktion : einzelne Ziffer auf Namentaste löschen
; !! Vergleich ob Y negativ ist == kein Löschen (letzte Ziffer)
;
; Eingang : Offset auf Ziffernbuffer in Y
;
; Ausgang : -------
;
; Register : Accu
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================
nam_clr
block
bmi end ; keine Ende Kennung notwendig
lda (nam_sp),y ; Ende-kennung für 1. und 2. Speicher laden
bbs ST_2SP,feap_stat,nam_clr_2sp ; 2.SP ist aktiv
and #%11110000 ; unteres Nibble ausblenden, letzte Ziffer 1.SP
bra nam_clr_1 ; und Endekennzeichnung speichern
nam_clr_2sp and #%00001111 ; oberes Nibble ausblenden, letzte Ziffer 2.SP
nam_clr_1 sta (nam_sp),y ; letzte Ziffer kennzeichnen
end jmp last_nt_out ; und Rufnummer erneut ausgeben
bend
; =========================================================================
;
; Funktion : letzte Ziffer auf Namentaste löschen
;
; Eingang : bei Löschtaste und eingeschaltetem Namentasten-Speicher-Modus
;
; Ausgang : letzte eingegebene Ziffer clr wenn bereits Eingabe erfolgt ist
; sonst wird die komplette Rufnr. gelöscht
;
; Register : Accu, Y
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================
namziff_clr smb EDIT_NT,allg_stat ; Rufnr. ist zum editieren ausgegeben
ldy ziff_offs ; akt. Ziffer laden
cpy #MAX_NAM_ZIFF-1
beq nam_clr ; noch keine Ziffer eingegeben, alles löschen
iny ; vorherige Ziffer einstellen
bra nam_clr ; und Ziffer löschen
; =========================================================================
;
; Funktion : Rufnummer einer Namentaste ausgeben
; die Rufnummer wird von hinten nach vorne gespeichert.
; Das vorzeitige Ende der Rufnr. wird durch NUL gekennzeichnet.
;
; Eingang : NT Nr. im Accu
; : BIT NT_OUT in allg_stat == 1, Rufnr. auf NT nur ausgeben
;
; Ausgang : Offset auf nächste Ziffer hinter Ausgabe in Y
; Anzahl ausgegebene Ziffern in X
;
; Register : Accu, X, Y
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================
put_nt
block
jsr getnam_adr ; Adr. der Namentaste in (nam_sp) eintragen
bcc end ; Speicherbereich ist nicht gültig
; Rufnr. auf Namentaste ausgeben
; ------------------------------
ldy #MAX_NAM_ZIFF-1 ; Ptr. auf erste Ziffer stellen
ldx #$00 ; Ziffern Counter
loop lda (nam_sp),y ; Ziffer laden
bbr ST_2SP,feap_stat,nam_out_1sp ; 2.SP ist nicht aktiv
; Ziffer für 2.Speicher ermitteln
; -------------------------------
lsr ; oberes Nibble ins untere schieben
lsr ; Rufnr. des 2.Speichers steht im high Nibble
lsr
lsr
; Ziffer für 1.Speicher ermitteln
; -------------------------------
nam_out_1sp and #%00001111 ; oberes Nibble ausblenden
beq nam_end ; alle Ziffern ausgegeben
bbs NT_OUT,allg_stat,nam_out ; Rufnummer nur anzeigen
; Ziffer auf Namentaste wählen
; ----------------------------
jsr whl_ziff ; Ziffer wählen
bra nxt_nam
nam_out jsr wta_displ ; Ziffer ins Display schreiben
nxt_nam inx ; Anzahl ausgegebener Ziffern
dey ; nächste Ziffer einstellen
bpl loop ; nächste Ziffer holen
nam_end bbr EDIT_NT,allg_stat,nam_end_1 ; Edit Modus nicht aktiv
jsr curs_on ; Cursor für Editier Modus einschalten
nam_end_1 cpx #$00 ; wurden Ziffern ausgegeben
bne end ; ja, Ende
bbs MOD_NT_SPEC,modus,end ; Sonder Funktion für NT-Speicher
phy ; Offset auf NT Buffer retten
jsr curs_off ; Cursor ausschalten
ldx #<nbel_txt ; "NT nicht belegt" ausgeben
ldy #>nbel_txt
jsr puttxt
ply
end rts
nbel_txt byte DSP_CLR
shift "Namentaste nicht belegt"
bend
; =========================================================================
;
; Funktion : Adr. für Speicherbereich einer Namentaste ermitteln
;
; Eingang : NT Nr. im Accu
;
; Ausgang : Adr. auf Namenspeicher der Taste in "nam_sp"
; : SEC == Adr. eingestellt, CLC == kein Zusatz RAM
;
; Register : ------
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================
getnam_adr
block
pha ; Register retten
phx
phy
; Start-Adr. für Namenspeicher on Board (RAM 1)
; ---------------------------------------------
ldx #<nam_buff1
ldy #>nam_buff1
cmp #MAX_NAM1 ; Speicherbereich für NT im 1.RAM ?
bcc nam_adr ; ja, Adresse berrechnen
sbc #MAX_NAM1 ; 1. NT im Zusatz RAM einstellen
; Adr. für Namenspeicher im Zusatz RAM (RAM 2)
; --------------------------------------------
bbr ST_ZRAM,allg_stat,nam_adr_err ; Zusatz-RAM nicht vorhanden
; Start-Adr. für Namenspeicher im Zusatz-RAM
; ------------------------------------------
ldx #<nam_buff2
ldy #>nam_buff2
; Adresse der Namentaste im RAM berechnen
; ---------------------------------------
nam_adr sty hlp_reg ; high Byte der Startadr.
ldy #MAX_NAM_ZIFF ; Multiplikator, Anz. der Ziffern je Namentaste
; (NT Nr. (accu) * Anz. Ziffern je NT) + Startadr. (hlp_reg, X)
jsr mul_add ; (Accu * Y) + (hlp_reg, X) == (Accu, X)
stx nam_sp ; low Adr. des Namespeichers
sta nam_sp+1 ; dito high
sec ; Adr. eingestellt
bra nam_adr_ok
; Zusatz-RAM ist nicht installiert, Fehlertext ausgeben
; -----------------------------------------------------
nam_adr_err jsr put_kzram ; Text "Zusatz RAM fehlt" ausgeben
clc ; kein Zusatz RAM vorhanden
nam_adr_ok ply ; Register zurück
plx
pla
rts
bend
; --------------------------------------------------------------------------
HLP set *
_NAMTAST equ HLP-MODUL_START ; Größe des Moduls