p******************************** ORG $0b00 ;DECIMAL 2816 (CASSETTE BUFFER) JMP sTART ******************************** *  sMARTwATCH 128 FOR bIG bLUE rEADER V4.01 *    (INCLUDES INFO FOR CHANGING TO V4.0) * *  BY bRAD dUMLER   01-19-93 *     (d.dUMLER ON geNIE) * *       copyright 1993. *     all rights reserved. *  ok TO COPY. not ok TO SELL. ******************************** * *   thanks to: * *     mICHAEL r. mILLER FOR A FANTASTIC DISK UTILITY *       PACKAGE TO START WITH, AND FOR HIS HELP IN *       ADAPTING THE sMARTwATCH TO HIS PROGRAM. * *     sMARTwATCH128 CODE BY eRIC c. rAFANAN *       (mEeRIC ON qLINK) * *     oRIGINAL sMARTwATCH CODE FOR geos BY kEN wALLACE *       (kENwALL ON qLINK) * *     mERLIN 128 ASSEMBLER PACKAGE * ******************************** * *  command syntax:   bank 15:sys 2816 * *  tO CHANGE DISK DEVICE NUMBER FOR 'BOOT-128' FILE: * *        poke 2819, DEV. # *        bsave"@SMW128.BBR V4",u(DEV. #),b0,p2816 to p3248 * *  fOR bbr V4.0, TO CHANGE DAY/DATE STORAGE: * *        poke 3146,240:poke 3155,241:poke3164,242 *        bsave"@SMW128.BBR V4",u(DEV. #),b0,p2816 to p3248 * ******************************** * *  sYSTEM eQUATES * ndx EQU $d0 keyd EQU $034a clkrate EQU $d030 pORTrEGa EQU $dc00 dATAdIRa EQU $dc02 tod1tENTH EQU $dc08 tod1sEC EQU $dc09 tod1mIN EQU $dc0a tod1hR EQU $dc0b cNTLrEG1 EQU $dc0f mmucr EQU $ff00 primm EQU $ff7d setbnk EQU $ff68 setlfs EQU $ffba setnam EQU $ffbd loadsp EQU $ffd5 * *  sMARTwATCH 128 USAGE * *    dATA AND STORAGE * dv DB $08 pATTERN DB $c5,$3a,$a3,$5c,$c5,$3a,$a3,$5c sMwtENTH DB $00 sMwsEC DB $00 sMwmIN DB $00 sMwhR DB $00,$00 sMwdAY DB $00 sMwmONTH DB $00 sMwyEAR DB $00 cONFIGoRIG DB $00 ddraoRIG DB $00 tEMP0 DB $00 tEMP1 DB $00 * *  bIG bLUE rEADER V4.01 (AND V4.0) FILE PARAMETERS * bbrdAY EQU $7e8 ;ADDRESS FOR bbr DATE STORAGE (2024) *              $7f0 (2032) FOR V4.0 bbrmONTH EQU $7e9 ;ADDRESS FOR bbr MONTH STORATE (2025) *              $7f1 (2033) FOR V4.0 bbryEAR EQU $7ea ;ADDRESS FOR bbr YEAR (2-DIGIT) STORAGE (2026) *              $7f2 (2034) FOR V4.0 * fILEnAME TXT 'BOOT-128' ;FILENAME * kEYS DB 147,144 ;clr SCREEN & black TEXT TXT 'RUN' DB 13 ;return ******************************** * *  main program *    irq'S ARE DISABLED TO PREVENT CONFLICT OF ROUTINES WHICH *      ALSO USE cia #1 (I.E. SCANNING OF THE KEYBOARD). *    bank 15 IS SET AND ORIGINAL bank IS RESTORED AFTERWARDS. * sTART SEI ;DISABLE INTERRUPTS LDA mmucr ;GET CONFIGURATION STA cONFIGoRIG ;SAVE IT LDA #$00 ;MAKE bank 15 STA mmucr LDA dATAdIRa ;GET ORIGINAL... (NORMALLY $FF) STA ddraoRIG ;  AND SAVE IT. LDA #00 STA clkrate ;SET slow 1 mhZ MODE JSR wAKEuP JSR rEADsMw LDA ddraoRIG ;RETRIEVE ORIGINAL... STA dATAdIRa ;  AND RESTORE IT. LDA sMwhR ;GET HOUR BYTE CMP #$ff ;CHECK IF ALL ONES BEQ nOTcONNCTD ;IF = THEN sMw IS NOT CONNECTED          JSR   sETtIME JSR sETdATE LDA cONFIGoRIG ;RESTORE ORIGINAL CONFIGURATION STA mmucr CLI ;RESTORE INTERRUPTS JSR lOADbbr JMP rUNbbr ******************************** * *  iF sMARTwATCH IS NOT CONNECTED, OUTPUT A bell SOUND. * nOTcONNCTD JSR primm DB $07 ;ascii FOR BELL TONE DB $00 LDA cONFIGoRIG ;RESTORE ORIGINAL CONFIGURATION STA mmucr CLI ;RESTORE INTERRUPTS JSR lOADbbr JMP rUNbbr * *  sEND THE WAKEUP PATTERN TO THE sMARTwATCH * *    iNITIALIZE sMARTwATCH *      pORT REGISTER a BITS ARE ASSIGNED AS FOLLOWS: *        BIT 0 - USED TO SEND AND RECEIVE SERIAL DATA *        BIT 1 - SELECT READ (SET) / WRITE (CLEAR) *        BIT 2 - SEQUENCER - HI-TO-LO TRANS CLOCKS DATA *                            IN/OUT ACCORDING TO BIT 1 * wAKEuP LDA #$06 ;SET i/o DIRECTION BITS... STA dATAdIRa ;  BIT 0 - IN, BITS 1&2 - OUT LDA #$06 ;BRING SEQUENCER HI, SELECT READ STA pORTrEGa LDA #$02 ;BRING SEQUENCER LO TO CLEAR IT STA pORTrEGa LDA #$06 ;SEQUENCER HI TO CYCLE, SELECT READ STA pORTrEGa LDA #$04 ;SEQUENCER HI, SELECT WRITE STA pORTrEGa LDA #$07 ;SET i/o DIRECTION BITS... STA dATAdIRa ;  BITS 0,1, &2, - OUTPUT * *  sEND THE PATTERN * LDX #$00 sNDpATTERN LDA pATTERN,X ;GET BYTE OF THE WAKEUP PATTERN LDY #$08 ;INITIALIZE BIT COUNTER STA tEMP1 nEXToUT LDA #$00 ;GET SET FOR NEXT BIT LSR tEMP1 ;MOVE LO BIT INTO CARRY REGISTER ROL ;MOVE CARRY INTO BIT 0 OF ACCUMULATOR STA pORTrEGa ;OUTPUT DATA - SEQUENCER LO, SELECT WRITE ORA #$04 ;RESET SEQUENCER HI, SELECT WRITE, ... STA pORTrEGa ;  DATA STILL THE SAME. DEY BNE nEXToUT ;IF NOT DONE, GET NEXT BIT INX ;INCREMENT FOR NEXT BYTE OF PATTERN CPX #$08 ;IF LESS THAN 8 ... BNE sNDpATTERN ;  GET NEXT BYTE. RTS ;IF EQUAL, THEN DONE. * *  rEAD THE TIME FROM THE sMARTwATCH * *    tIME IS IN PACKED bcd FORMAT. *    hOURS ARE IN 12 HOUR FORMAT WITH BIT 5 OF hour BYTE *      SPECIFYING AM (CLEAR) OR PM (SET). *    fORMAT OF wEEKDAY IS AS FOLLOWS: *      BITS 0-2 - # OF DAY OF THE WEEK *                 (001=sUNDAY, ... ,111=sATURDAY) *      BIT    4 - sET TO DISABLE THE reset PIN ON sMARTwATCH *      BIT    5 - oSCILLATOR CONTROL (1=oFF, 0=oN) *      BITS 3, 6, &7 - nOT USED * rEADsMw LDA #$06 ;GET SET FOR INPUT ON BIT 0 STA dATAdIRa LDA #$06 ;SEQUENCER HI, SELECT READ STA pORTrEGa LDX #$00 gETbYTE LDY #$08 ;INITIALIZE BIT COUNTER gETbIT LDA #$02 ;BRING SEQ. LO, SELECT READ STA pORTrEGa LDA pORTrEGa ;PUT DATA INTO a LSR ;SHIFT DATA BIT (BIT 0) TO CARRY ROR tEMP1 ;ROLL CARRY INTO BIT 7 OF tEMP1 LDA #$06 ;BRING SEQUENCER HI AGAIN STA pORTrEGa DEY BNE gETbIT ;IF NOT DONE, GET NEXT BIT LDA tEMP1 ;GET COMPLETED BYTE STA sMwtENTH,X ;PUT INTO TIME STORAGE INX CPX #$08 ;IF LESS THAN 8... BMI gETbYTE ;  GET NEXT BYTE LDA #$FF ;IF EQUAL, SET ALL LINES HI STA pORTrEGa LDA #01 STA clkrate ;SET fast 2 mhZ MODE RTS ;ALL DONE READING TIME AND DATE. * *  sET THE TIME FOR tod CLOCK * sETtIME LDA sMwhR ;MOVE AM/PM BIT TO BIT 7 AND #$20 ;MASK OUT ALL BUT AM/PM BIT CLC ;MAKE SURE NO CARRY BECAUSE... ROL ;  WE ROLL BIT 5 INTO BIT 7 ROL STA tEMP0 ;SAVE AM/PM BIT LDA sMwhR ;GET ORIGINAL AND #$1F ;GET JUST THE HOURS BITS ORA tEMP0 ;ADD IN THE AM/PM BIT STA sMwhR ;SAVE NEW VALUE LDA sMwtENTH ;GET HI NYBBLE OF BYTE LSR ;  HI NYBBLE IS TENTHS LSR ;  LO NYBBLE IS HUNDREDTHS LSR ;  tod CLOCKS ONLY USE TENTHS LSR ;    BUT IN THE LO NYBBLE STA sMwtENTH * *  sETTING THE AM/PM BIT REQUIRES SPECIAL ATTENTION IF THE HOUR *    IS 12.  iF YOU TRY TO PUT THE HOUR 12 INTO THE hours BYTE, *    THE tod WILL eor THE AM/PM BIT OF WHAT IS CURRENTLY IN THE *    hours BYTE WITH THE AM/PM BIT OF WHAT YOU ARE TRYING TO PUT *    IN.  tHIS IS NORMAL SINCE WHEN IT IS NORMALLY COUNTING, IT *    TOGGLES THE AM/PM BIT WHEN IT HITS 12 NOON OR 12 MIDNIGHT. * LDA sMwhR ;GET THE hours BYTE AND #$1F ;LEAVE OUT AM/PM BIT CMP #$12 ;IS THE HOUR 12? BNE sETcia1 ;NO, THEN CONTINUE LDA sMwhR ;OTHERWISE GET ORIGINAL VALUE EOR #$80 ;TOGGLE THE AM/PM BIT STA sMwhR ;PUT THE MODIFIED VALUE BACK * *  sET c128 cia #1 tod CLOCK * *    bOTH sMARTwATCH AND THE tod CLOCK USE bcd. *    AM/PM BIT (BIT 5 OF sMw, BIT 7 OF tod) ALREADY MOVED. * sETcia1 LDA cNTLrEG1 ;MAKE SURE WE WRITE TO CLOCK AND #$7F ;CLEAR BIT 7 STA cNTLrEG1 ;AND PUT IT BACK LDA #$80 ;PUT KNOWN VALUE INTO hours SO STA tod1hR ;  SPECIAL AM/PM ROUTINE WORKS LDA sMwhR ;START WITH hours - CLOCK STOPS STA tod1hR LDA sMwmIN STA tod1mIN ;STORE minutes LDA sMwsEC STA tod1sEC ;STORE seconds LDA sMwtENTH STA tod1tENTH ;STORE tenths - CLOCK STARTS RTS ;ALL DONE SETTING CLOCK. * ******************************** * *  cONVERT MONTH, DATE, AND YEAR TO 1-BYTE DECIMAL INTEGERS *    AND STORE FOR ACCESS BY bbr INITIALIZATION ROUTINE. * sETdATE LDA sMwdAY JSR bcdTOdec ;CONVERT TO DECIMAL INTEGER STA bbrdAY * LDA sMwmONTH JSR bcdTOdec STA bbrmONTH * LDA sMwyEAR JSR bcdTOdec STA bbryEAR * RTS ;ALL DONE SETTING UP DATE. * ******************************** * *  tHIS ROUTINE CONVERTS A PACKED bcd BYTE TO A DECIMAL *    INTEGER. * bcdTOdec PHA ;SAVE COPY FOR LATER USE AND #$0f ;CLEAR HI NYBBLE TAY ;SAVE THE LO NYBBLE FOR LATER * PLA ;RETRIEVE ORIGINAL VALUE AND #$f0 ;CLEAR LO NYBBLE FOR USE CLC LSR ;MOVE HI NYBBLE TO LO AND LSR ;  MULTIPLY BY 2 LSR STA tEMP0 ;SAVE THIS VALUE FOR MULT BY 5 * LDX #$04 ;INDEX FOR MULTIPLICATION LOOP mULTlOOP CLC ADC tEMP0 DEX CPX #$00 ;FINISHED MULTIPLYING? BNE mULTlOOP ;NO, KEEP ADDING * STA tEMP0 ;SAVE THE TENS TYA ;RETRIEVE LO NYBBLE CLC ADC tEMP0 ;ADD TENS AND ONES * RTS ;ALL DONE CONVERTING TO DECIMAL. * ******************************** * *  lOAD bbr BOOT PROGRAM INTO MEMORY * *    sETUP * lOADbbr LDA #$00 ;AREA IN ram BANK 0 TAX ;FILENAME ALSO IN ram BANK 0 JSR setbnk * LDA #$01 ;SET LOGICAL FILE NUMBER LDX dv ;SET DEVICE ADDRESS (NUMBER) LDY #$FF ;SET SECONDARY ADDRESS FOR LOADING JSR setlfs * LDA #kEYS-fILEnAME ;SET LENGTH OF FILENAME LDX #fILEnAME ;SET ADDRESS OF FILENAME JSR setnam * *    lOAD IT * LDA #$00 ;LOAD - NOT VERIFY JSR loadsp RTS ;ALL DONE LOADING bbr BOOT PROGRAM. * *  rUN bbr BOOT PROGRAM BY USING DYNAMIC KEYBOARD * rUNbbr LDX #$00 ;INITIALIZE INDEX lOOPkEYS LDA kEYS,X STA keyd,X ;MOVE CHARACTER TO KEYBD BUFFER INX CPX #sTART-kEYS ;NUMBER OF KEYS TO MOVE BNE lOOPkEYS STX ndx ;SET NUMBER OF KEYS IN BUFFER RTS ;run bbr