"Loading TBG Support" $PRINT CRLF ; Time Base Generator support ; req !IRQ/-IRQ/!ISR ; mod 12/29/03 - self patching ; mod 8/29/04 - watchdog timer "Renaming +IRQ to !IRQ" $PRINT CRLF RENAME +IRQ !IRQ "Setting TBG Channel to 10, poke 270 to change" $PRINT CRLF 270 10 PUT ; "Loading +TBG" $PRINT CRLF ; ; +TBG starts time base generator ; CREATE +TBG ** set to ZP TBG slot... ZTBG EQU 270 ** patch channel... LDA PL LDB ZTBG JSB PSUBA,I ** set to internal TBG slot... (not important anymore) TSLOT EQU 10 TVECT EQU 67 location of z.p. ISR pointer LDA ISRA STA TVECT put address of ISR in 67 LDA HOOK P1 STA TSLOT put JSB 67,I in 10 (or tbg slot) P2 STC TSLOT,C enable timer JMP END HOOK JSB TVECT,I ISRA DEF ISR ISR NOP JSB ISAVE,I save state ISZ TMRLO increment low word, skip next if zero JMP *+3 if not zero skip next inc ISZ TMRHI increment high word, skip next if zero NOP * 8/28/04 watchdog code, requires 0.58 and new CREATE * with WDTOV, WDENA, WDTMR, ABVEC variables LDA WDENA get watchdog enable flag SZA,RSS skip if not zero JMP P3 if zero disable watchdog LDA WDTMR get value CPA WDTOV compare to overflow JMP ABVEC,I if equal, reset via alternate boot vector ISZ WDTMR increment wdt NOP P3 STC TSLOT,C reenable timer JSB IREST,I restore state JMP ISR,I ** patch list.. PL DEF *+1 DEF P1 DEF P2 DEF P3 OCT 0 END ; "Loading -TBG" $PRINT CRLF ; ; -TBG disables time base generator ; CREATE -TBG /KEEP LDA PL2 LDB ZTBG JSB PSUBA,I P4 CLC TSLOT JMP END PL2 DEF *+1 DEF P4 OCT 0 END ; "Loading >TBG" $PRINT CRLF ; ; >TBG loads course value into time base generator ; 1 >TBG produces 1ms ticks ; 2 >TBG produces 10ms ticks ; 3 >TBG produces 100ms ticks ; CREATE >TBG /KEEP LDA PL3 LDB ZTBG JSB PSUBA,I JSB ZSPOP,I AND MASK P5 OTA TSLOT JMP END MASK OCT 000007 PL3 DEF *+1 DEF P5 OCT 0 END ; "Loading TBGZERO" $PRINT CRLF ; ; TBGZERO zeros the time base count ; CREATE TBGZERO CLF 0 CLA STA TMRLO STA TMRHI JSB IENAV,I * re-enable only if global ints enabled END ; "Loading >WDT" $PRINT CRLF CREATE >WDT JSB ZSPOP,I pop stack STA WDTOV save as new timeout value END ; "Loading +WDT" $PRINT CRLF CREATE +WDT CLA 8/29/04 STA WDTMR set timer to 0 INA STA WDENA enable watchdog END ; "Loading -WDT" $PRINT CRLF CREATE -WDT CLA STA WDENA END ; "Loading !100MS" $PRINT CRLF ; ; !100MS start up a 100ms counter clock on startup ; DEFINE !100MS 3 >TBG TBGZERO +TBG END ; "Loading T>>S" $PRINT CRLF ; ; T>>S push timer low, then push timer high ; CREATE T>>S CLF 0 LDA TMRLO JSB ZSPSH,I push low word LDA TMRHI JSB ZSPSH,I push high word JSB IENAV,I END ; "Loading TIME>>S" $PRINT CRLF ; ; TIME>>S calculates elapsed time since TBGZERO ; pushes 10ths, seconds, minutes then hours ; CREATE TIME>>S CLF 0 LDA TMRLO STA TLO LDA TMRHI STA THI JSB IENAV,I LDA TLO LDB THI DIV double-divide timer DEF BY36K by 36000 to get hours CMA,INA compensate for divisor >32767 STA HOURS save results LDA 1 put remainder in A CLB DIV double-divide DEF BY600 by 600 to get minutes STA MINTS save minutes LDA 1 put remainder in A CLB DIV double divide DEF BY10 by 10 to get seconds STA SCNDS save seconds LDA 1 JSB ZSPSH,I push 10ths LDA SCNDS JSB ZSPSH,I push seconds LDA MINTS JSB ZSPSH,I push minutes LDA HOURS JSB ZSPSH,I push hours JMP END * divide constants... BY10 DEC 10 BY600 DEC 600 BY36K DEC 36000 * temp storage... TLO OCT 0 THI OCT 0 HOURS OCT 0 MINTS OCT 0 SCNDS OCT 0 END ; "Loading PTIME" $PRINT CRLF ; ; PTIME prints time ; DEFINE PTIME RADIX ;save original radix DECIMAL ;we think of time in decimal TIME>>S PNUM "HOURS " $PRINT PNUM "MINUTES " $PRINT $STR $PRINT "." $PRINT PNUM "SECONDS" $PRINT CASE = 2 BINARY ;restore original radix = 10 OCTAL ;10 octal = 8 decimal.. defining in octal ENDCASE END ; "Loading !WDA" $PRINT CRLF DEFINE !WDA 260 GET IFNZ CRLF "Timeout." $PRINT ENDIF END ; "Done" $PRINT CONSOLE