;====================================================================== ; common.inc ; common macros & equs etc. ; generally include this at the top of each file. ;---------------------------------------------------------------------- ; COMMON INCLUDES and BOILERPLATE include /usr/share/gputils/header/p18f458.inc radix dec include panic.inc include morse+auto.inc include ../iwjpictest/insn-aliases.inc clock equ -1 include ../iwjpictest/clockvaries.inc include variables+vars.inc include pindata.inc ;---------------------------------------------------------------------- ; Common conventions for function register notation: ; Master Slave ; Registers etc. ; W Trashed Trashed ; STATUS Trashed Trashed ; BSR Not used Not used ; t Low ISR Low ISR ; TBLPTR*,TABLAT Low ISR Low ISR ; PROD* Low ISR Low ISR ; FSR0 Low ISR Low ISR ; FSR1 Low ISR High ISR (detect[1]) ; FSR2 Low ISR High ISR (detect[1]) ; ; Trashed May be trashed by any routine anywhere. Saved ; during every ISR entry/exit. ; ; Low ISR May be used/traashed by any routine run in low-priority ; interrupt, or any routine run during initialisation. ; May therefore not be used in background loop with ; interrupts enabled. May not be used by high-priority ; ISR (unless explicitly saved). ; ; High ISR May be used/trashed by any routine run in high-priority ; interrupt, or any routine run during initialisation. ; May therefore not be used elsewhere with interrupts ; enabled. ; ; Only the routines specially noted as intended to ; be called from the High ISR are safe. ; ; ... (subsystem) ; Register is reserved for use by this subsystem, which ; is allowed to expect the value to be preserved. ; Anything else which uses it must save and restore (and ; may also need to disable interrupts, depending on its ; relative status). ; ; Not High May be used by any routine not running in high-priority ; interrupt. Not saved by high-priority interrupt ; entry/exit, so any high-priority interrupt routine which ; uses this register must save and restore it. ; ; A routine which is allowed to trash a register may document that it ; saves that register for the benefit of its callers. ; ; [1] FSR1 and FSR2 on slave pics are reserved exclusively for the ; I2C response and detection code (detect.asm), after det_slave_init. ; ; General-purpose hardware allocation: ; ; Master Slave ; Timer 0 nmra Disabled ; Timer 2 - - ; Timer 1 1ms tick, int. low 1ms tick, int. low ; CCP1 1ms tick, int. low 1ms tick, int. low ; Timer 3 point fire timer point fire timer ; ECCP - - ;---------------------------------------------------------------------- ; Conventional routine names: ; ; _local_do Process a master-to-slave command to activate ; a local peripheral (also called on master to ; activate its own local peripherals) ; ; _local_init Initialises RAM tables for local peripheral ; and arranges for pins to be set in appropriate ; quiescent state. Configures pic built-in ; peripherals. ; ; _local_intr Low ISR service routine. ; Checks for, and clears, any relevant interrupt, ; and returns with `return'. ; ; _master_do Called when an appropriate message has been ; received from the host. ; ;---------------------------------------------------------------------- ; MACROS ;---------------------------------------- ; For entering and leaving Low ISR, saving and restoring STATUS and W enter_interrupt_low macro mov_ff STATUS, isr_low_save_status mov_wf isr_low_save_w endm return_interrupt_low macro mov_fw isr_low_save_w mov_ff isr_low_save_status, STATUS retfie endm ;---------------------------------------- ; For disabling all interrupts, to make a critical section: ; (for use from main program and Low ISR only) ; ; GIEH modified appropriately ; everything else preserved mask_int_high macro bc_f INTCON,GIEH endm unmask_int_high macro bs_f INTCON,GIEH endm ;---------------------------------------- ; For the fix specified in the silicon errata: ; silicon revision B4 issue 4 ; ; Before After ; TABLAT any data from flash ; TBLPTR* correct incremented/decremented ; everything else any preserved tblrd_postinc_fixup macro tblrd *+ dw 0xffff endm tblrd_postdec_fixup macro tblrd *- dw 0xffff endm ;---------------------------------------- ; For setting up TBLPTR according to the picno load_perpic_tblptr macro flash_map_base, perpic_entry_size ; ; Before After ; TBLPTR* any set ; W, STATUS, PROD* any undefined ; everything else any preserved ; mov_lw perpic_entry_size mul_wf picno mov_lw flash_map_base & 0xff add_wfw PRODL mov_wf TBLPTRL mov_lw flash_map_base >> 8 addc_wfw PRODH mov_wf TBLPTRH clr_f TBLPTRU ; TBLPTR* -> our point data endm ;---------------------------------------------------------------------- ; PINSPECS stuff ; ; A PINSPEC is a constant 0x where is a b c d e ; and is 0 1 2 3 4 5 6 7. Generally p__ ; are equ'd for this. radix hex p0_cdu_enable equ 5b p0_rs232_fcin equ 4b p0_booster_shutdown equ 2b p0_booster_overload equ 1b p0_booster_userfault equ 0b p0_spare2 equ 6d p0_spare1 equ 5d p0_rs232_fcout equ 5c pall_perpicled equ 2d pall_pt0reverse equ 7b p0_spare0 equ 0a p0_booster_dirn equ 0c p0_booster_pwm equ 1c radix dec ; ; LAT* may be subject to read-modify-write, see below ; TRIS* may be subject to read-modify-write, see below ; PORT* may be read, see below ; everything else untouched ; ; LAT* TRIS* PORT* ; pin_z untouched set untouched ; pin_h set cleared untouched ; pin_l cleared cleared untouched ; pin_nz untouched cleared untouched ; pin_vh set untouched untouched ; pin_vl cleared untouched untouched ; pin_ifh untouched untouched read ; pin_ifl untouched untouched read pin_z macro pinspec bs_f TRISA + (TRISB-TRISA)*((pinspec-0xa) & 15), pinspec >> 4 endm pin_nz macro pinspec bc_f TRISA + (TRISB-TRISA)*((pinspec-0xa) & 15), pinspec >> 4 endm pin_vh macro pinspec bs_f LATA + (LATB-LATA)*((pinspec-0xa) & 15), pinspec >> 4 endm pin_vl macro pinspec bc_f LATA + (LATB-LATA)*((pinspec-0xa) & 15), pinspec >> 4 endm pin_h macro pinspec pin_vh pinspec pin_nz pinspec endm pin_l macro pinspec pin_vl pinspec pin_nz pinspec endm pin_ifh macro pinspec bt_f_if1 PORTA + (PORTB-PORTA)*((pinspec-0xa) & 15), pinspec >> 4 endm pin_ifl macro pinspec bt_f_if0 PORTA + (PORTB-PORTA)*((pinspec-0xa) & 15), pinspec >> 4 endm ;----------------------------------------------------------------------