10 ;*** DRIVER FOR RTC USING MC146818 MOTOROLA CICUIT ***
20 ;*** WRITTEN BY G.ASSMANN AUG/SEPT '86 ***
30 ;SYSTEM EQUATES USED
35 RUNAD     = $02E0 ;RUNADDRESS WRITTEN HERE FOR AUTORUN EXEC.
40 HATABS    = $031A ;HANDLER TABLES START ADDRESS
50 CLADR     = $D580 ;CLOCK DATA REGISTER
60 CLDATA    = $D581 ;CLOCK ADDRESS REGISTER
70 BUFFER    = $0400 ;ALL CLOCK DATA STORED/RETRIEVED FROM 400 TO 43F THE CASETTE BUFFER
80 NMIEN     = $D40E ;NMI ENABLE
90 SDMCTL    = $022F ;DMA ENABLE
0100         *= $600 ;PUT OBJECT CODE HERE
0110 PREND   .BYTE SRCEND&255  ;HERE IS HOW TO
0120         .BYTE SRCEND/256  ;CALCULATE CODE END
0130 STORE   .BYTE 00,00,00 ;TEMP.STORE REGISTERS
0140 TDRIVER .WORD TOPEN-1 ;HANDLER
0150         .WORD TCLOSE-1;FUNCTION
0160         .WORD TREAD-1 ;JUMPADR. BASIC GET #n,y
0170         .WORD TWRITE-1;TABLE    BASIC PUT #n,y
0180         .WORD TSET-1            BASIC STATUS #n,y
0190         .WORD TXIO-1 ;NULL FUNCTION
0200 GOINIT  JMP TINIT ;JUST FOR SAFETY
0210 ;*** BASIC RECONNECT X=USR(1556) ***
0220 RECONN  PLA
0230         BEQ GOINIT ;IF NO PARAMETERS
0240         TAY
0250 PULLTHEM
0260         PLA  ;PARAMETERS
0270         PLA  ;PULL
0280         DEY
0290         BNE PULLTHEM ;PULL ANY OTHERS
0300         BEQ GOINIT
0310 TOPEN   LDY #1  ;INDICATE SUCCES
0320         RTS     ;AND GO BACK
0330 TCLOSE  LDY #1  ;ALL ARE
0340         RTS     ;JUST NULL
0350 TXIO    LDY #1  ;HANDLERS AND
0360         RTS     ;DO NOTHING
0370 ;*** THE FOLLOWING PART MAKES THE COMPUTER STOP SCREEN DISPLAY ***
0380 ;*** NEEDED TO READ CLOCK PROPERLY ***
0390 VBWAIT  SEI  ;DISABLE INTERRUPT
0400         LDA NMIEN   ;SAVE NMI
0410         STA STORE+1 ;STATUS
0420         LDA #$40  ;DISABLE ALL
0430         STA NMIEN ;BUT RESET NMI
0440         LDA SDMCTL  ;SAVE DMA
0450         STA STORE+2 ;STATUS
0460         LDA #$00    ;AND DISABLE
0470         STA SDMCTL  ;IT
0480         RTS
0490 ;*** READ ROUTINE STARTS HERE ***
0500 TREAD   STX STORE  ;SAVE X
0510         JSR VBWAIT ;DISABLE INTERRUPTS
0520         LDX #$0A   ;CHECK FOR
0560 SET     STX CLADR  ;UPDATE AND
0570         LDA CLDATA ;WAIT TILL
0580         BMI SET    ;READY
0590         LDX #$00   ;THEN READ
0600 LOOP    STX CLADR  ;CLOCK NOW
0610         LDA CLDATA
0620         STA BUFFER,X
0630         INX
0635         CPX #$40
0640         BNE LOOP
0650         JSR RVBL   ;RE-ENABLE INTERRUPTS
0660         LDX STORE  ;RESTORE X
0670         LDY #$01   ;SUCCES
0680         RTS
0690 ;*** THIS ROUTINE RESTORES ALL INTERRUPT MASKS ***
0700 RVBL    LDA STORE+1
0710         STA NMIEN
0720         LDA STORE+2
0730         STA SDMCTL
0740         CLI
0750         RTS
0760 ;*** CLOCK WRITE ROUTINE STARTS HERE (ONLY BACKUPED RAM)***
0770 TWRITE  STX STORE ;SAVE X
0780         JSR VBWAIT ;DISABLE INTERRUPTS
0790         LDX #$3F     ;READ CLOCK
0800 REST    LDA BUFFER,X ;NO NEED
0810         STX CLADR    ;TO WAIT
0820         STA CLDATA   ;FOR END
0830         DEX          ;OF UPDATE
0840         CPX #$0F  ;STORE ONLY DATA
0850         BNE REST  ;ALL DONE ?
0860         LDX STORE ;RESTORE X
0870         JSR RVBL
0880         LDY #$01
0890         RTS
0900 ;*** THE STATUS COMMAND IS USED TO SET THE CLOCK (COPY $400 TO $409 TO IT ***
0910 ;*** AND SET REGISTERS FOR FREQ. AND 24 HOURS MODE (SEE DATASHEET) ***
0920 TSET    STX STORE ;SAVE X
0930         JSR VBWAIT ;DISABLE INTERRUPTS
0940         LDX #$0B   ;12 ADDRESSES
0950 SETCL   LDA BUFFER,X
0960         STX CLADR
0970         STA CLDATA
0980         DEX
0990         BPL SETCL
1000         LDX #$0A  ;CONFIGURE
1010         LDA #$20  ;CLOCK & RATE
1020         STX CLADR ;TO 32KC
1030         STA CLDATA ;SEE DATASHEET
1040         LDX #$0B
1050         LDA #$00  ;SET MODE
1060         STX CLADR ;AND START
1070         STA CLDATA;TIMING
1080         JSR RVBL  ;RESTORE INTERRUPTS
1090         JSR TREAD ;READ CLOCK DATA
1100         LDX STORE  ;RESTORE X
1110         LDY #$01
1120         RTS
1130 ;*** HANDLER TABLES ENTRY SETUP ***
1140 TINIT   LDY #0
1150 FIND    LDA HATABS,Y
1160         CMP #0     ;FREE ENTRY ?
1170         BEQ FOUND
1180         INY
1190         INY
1200         INY        ;POINT TO NEXT HATABS ENTRY
1210         CPY #34    ;AT END OF HATABS ?
1220         BNE FIND   ;NO .. CONT.
1230         SEC        ;INDICATE ERR
1240         RTS
1250 FOUND   LDA #'T    ;SET DEVICE NAME
1260         STA HATABS,Y
1270         INY
1280         LDA #TDRIVER&255
1290         STA HATABS,Y ;HANDLER ADR
1300         INY
1310         LDA #TDRIVER/256
1320         STA HATABS,Y
1330         JSR TREAD  ;READ CLOCK
1340         LDY #$01
1350         RTS
1360 ;*** SETUP DEVICE DATA AND READ THE CLOCK ***
1370 START   JSR TINIT
1380         RTS
1390 SRCEND  =*          ;LABEL FOR OBJECT END CALCULATION
1400 ;       *= $02E0
1410 ;       .WORD START ;START ADDRESS OF ROUTINE AT AUTORUN
1420         .END
1430 ;
1440 ;*** USE LINES 1400 AND 1410 TO MAKE AN AUTORUN.SYS THAT INITS ***
1450 ;*** THE CLOCK UPON BOOT                                       ***
1460 ;*** DON'T USE IT WITH SPECIAL AUTORUN.SYS PROVIDED IN ARTICLE ***
