#INCLUDE "macros.asm" ; include macros & definitions #INCLUDE "regmem.asm" ; Portadresses & Random Access Memory ;************************** ; S T A R T O F R O M ;************************** .ORG $2000 rom reset sei lds #$1FFF ; Stackpointer ans Ende des (ext) RAM setzen aim #%11101111,RP5CR ; nicht auf "Memory Ready" warten, das statische RAM ist schnell genug ldab TCSR1 ldd #0 std OCR1H ldab TCSR2 ldd #0 std OCR2H clr TCSR1 clr TCSR2 clr TCSR3 oim #%100,RMCR ; jmp Start ;************************************ ;************************************ #INCLUDE "int.asm" ; Interrupt Service Routines ;************************************ ;************************************ Start jsr init_io ; I/O initialisieren (Ports, I2C, etc...) jsr init_SCI ; serielle Schnittstelle aktivieren jsr init_OCI ; OCI Int resets Watchdog ldd #FSTEP ; Kanalraster = 6,25kHz jsr pll_init ; PLL mit Kanalraster initialisieren ldab #$80 stab pll_locked_flag ; Den Status der PLL auf jeden Fall anzeigen ldx #0 stx frequency stx frequency+2 cli jsr lcd_h_reset chk_on ldab Port5_Data andb #%100 ;SWB+ ? tstb beq TRX_on ldaa #%11110111 ldab #%10 jsr send2shift_reg ;Gerät ist aus, STBY&9,6V löschen bra chk_on TRX_on ldaa #%11110101 ldab #%1010 jsr send2shift_reg ; Gerät ist an, STBY&9,6V setzen jsr lcd_s_reset ; LCD Soft Reset ;*************** jsr mem_init ; Speicher initialisieren cmpa #$11 bne ram_ok ; nur auf defektes RAM testen WLCDR($3B) ; Rote LED blinken PRINTF(ram_err_str) ; ERROR ausgeben ram_err_loop bra ram_err_loop ; Endlosschleife ram_ok jsr init_freq ; grundlegende Frequenzeinstellungen clr ep_slots clr ep_slots+1 ; kein Kanalspeicher im EEPROM jsr menu_init clr pll_timer ldab #1 stab sql_flag WLCDR($36) ; grüne LED an PRINTF(dg1yfe) WAIT(500) jsr lcd_clr PRINTF(ver1) WAIT(1000) jsr lcd_clr PRINTF(ver2) WAIT(1000) jsr lcd_clr WLCDR($31) ; ldx frequency+2 pshx ldx frequency pshx ldaa #'l' ldab #3 jsr putchar pulx pulx ; Frequenz ausgeben ldab #%10010000 ; Audio enable ldaa #%11111111 ; jsr send2shift_reg ; Main Loop loop jsr pwr_sw_chk ; Ein/Ausschalter abfragen & bedienen jsr pll_led ; PLL Lock Status auf rote LED ausgeben jsr ptt_stuff ; PTT abfragen jsr squelch ; Squelch bedienen jsr menu ; Menü für Frequenzeingabe etc. sei ldx roundcount inx stx roundcount cli jmp loop ;******************* ptt_stuff pshb psha pshx jsr ptt_chk ; PTT abfragen cmpb rxtx_state ; Statusänderung prüfen bne pts_change ; clr debounce ; Es hat sich nix geändert, "debounce" auf 0 jmp pts_end ; und zum Ende springen pts_change inc debounce ; Debounce Counter erhöhen tstb ; PTT gedrückt? bne pts_ptt ; Ja? Dann bei pts_ptt weitermachen ; NO PTT pts_noptt ldab debounce cmpb #40 ; PTT muß für mindestens 40 Durchgänge gelöst sein bcc pts_rx jmp pts_end ; wenn nicht -> zum Ende springen ; RX pts_rx ldab #%01000000 ; PA disable ldaa #%11011111 ; Mic disable jsr send2shift_reg ldab #10 stab gp_timer ; 10ms warten pts_rx_wait ldab gp_timer bne pts_rx_wait ; Timer schon bei 0 angekommen? ldab #%00000000 ; ldaa #%11111110 ; TX/RX Switch auf RX jsr send2shift_reg clrb jsr vco_switch ; RX VCO aktivieren ldx #frequency jsr set_rx_freq ; RX Frequenz setzen ; jsr pllrx clr rxtx_state ; Status auf RX setzen ldab #%00010000 ; Audio enable ldaa #%11111111 ; jsr send2shift_reg WLCDR($31) ; gelbe LED aus WCPOS(0) ldx frequency+2 pshx ldx frequency pshx ldaa #'l' ldab #3 jsr putchar pulx pulx bra pts_end ;*************** ; PTT pts_ptt ldab debounce cmpb #40 ; PTT muß für mindestens 40 Durchgänge gedrückt sein bcs pts_end ; wenn nicht -> zum Ende springen ldab #1 jsr vco_switch ; TX VCO aktivieren, TX/RX Switch freigeben ldx #frequency jsr set_tx_freq ; Frequenz setzen ldab #%00000001 ldaa #%11111111 ; TX/RX Switch auf TX jsr send2shift_reg ldab #10 stab gp_timer ; 10ms warten pts_tx_wait ldab gp_timer bne pts_tx_wait ; Timer schon bei 0 angekommen? ldab #%00100000 ; Mic enable ldaa #%10111111 ; Driver enable jsr send2shift_reg ldab #1 stab rxtx_state ; Status setzen ldab #%00000000 ; ldaa #%11101111 ; Audio disable jsr send2shift_reg WLCDR($35) ; gelbe LED an WCPOS(0) ldx vco+2 pshx ldx vco pshx ldaa #'l' ldab #3 jsr putchar pulx pulx pts_end pulx pula pulb rts ;******************************************* qrg .db "QRG?",0 dg1yfe .db "DG1YFE",0 ver1 .db "McPOCSAG",0 ver2 .db "0.2.1",0 ; McPocsag Version vom 21.7.2005 (23:48) ram_err_str .db "RAM ERR",0 ; $11 ;******************************************* #INCLUDE "menu.asm" #INCLUDE "subs.asm" ; general Subroutine File #INCLUDE "pll_freq.asm" ; PLL & Frequency related Subroutines #INCLUDE "display.asm" ; LC Display related Subroutines #INCLUDE "mem.asm" ; Memory related Subroutines #INCLUDE "math.asm" ; Divide, Multiply, Exp Table #INCLUDE "eeprom.asm" ; EEPROM Zugriffsroutinen #INCLUDE "io.asm" ; all I/O