;DSCLK.A65 ; ; REV 1.1 Written by Bob Sass 03/01/87 ; ;********************************************* ;Character device #14(30) "Other" Command #16 ;********************************************* ; ;***** Dallas Semiconductor DS1216E Clock Driver ******* ; ;GET EQUATES .NOLIST .INCLUDE DRVREQUS.A65 .LIST BASEP0: .QUERY "ENTER BASE OF PAGE 0: " CN00: .EQU BASEP0 ;WORD 0 OF PAG0 LENP0: .EQU 2 ;HEADER FOR RELOCATION TOP: .WORD 0 ;IF THIS WORD IS 0 THEN ; RELOCATABLE DRIVER ; AND A RELOCATING BIT MAP IS EXPECTED ;ELSE ; THE DRIVER STORED WHERE INDICATED .WORD ((BOTTOM-TOP)+0FFH) AND 0FF00H ;LENGTH OF THIS CODE ; TO NEXT PAGE BOUNDRY .BYTE LENP0 ;THIS IS THE NUMBER OF PAGE 0 BYTES ; REQUIRED. IF ITS NO ZERO THEN A RELOCATING ; BIT MAP IS EXPECTED FOR PAGE 0 .BYTE 0 ;TAG FIELD .WORD 1EH ;DEVICE NUMBER (1EH = CHARACTER DEVICE 14) .WORD 1 ;NUMBER OF DEVICES THIS DRIVER WILL SERVICE .WORD INITENTRY ;INIT ENTRY POINT .WORD INENTRY ;INPUT ENTRY POINT .WORD OUTENTRY ;OUTPUT ENTRY POINT .WORD OTHERENTRY ;OTHER ENTRY POINT .WORD POLLENTRY ;POLL ENTRY POINT ; 0 IF NO POLLING REQUIRED .WORD 2 ;VERSION NUMBER NAME: .BYTE 13,"DS Clock ",0,0 ;************************************* ;ROUTINE: INITENTRY ;PURP: INITIALIZE ;ENTRY: NONE ;USED: ALL ;************************************* INITENTRY: RTS ;*********************************** ;ROUTINE: INENTRY: ;PURP: INPUT A CHARACTER ;ENTRY: Y = n0 ; X = Cn ; WHERE n IS THE SLOT NUMBER ;EXIT: A = CHARACTER ;USED: ALL ;*********************************** INENTRY: RTS ;*********************************** ;ROUTINE: OUTENTRY ;PURP: OUTPUT A CHARACTER TO THE DEVICE ;ENTRY: A = CHARACTER ; Y = n0 ; X = Cn ; WHERE n IS THE SLOT NUMBER ;EXIT: NONE ;USED: ALL Š;************************************ OUTENTRY: RTS ;*********************************** ;ROUTINE: OTHERENTRY ;PURP: HANDLE OTHER COMMANDS ;ENTRY: A = OTHER COMMAND ; X = N0 ; Y = CN ;EXIT: A = ERROR CODE ;USED: ALL ;*********************************** OTHERENTRY: CMP #0 BEQ OUTSTAT ;BRANCH IF OUTPUT STATUS COMMAND CMP #1 BEQ INSTAT ;BRANCH IF INTPUT STATUS COMMAND CMP #2 BEQ VIDEOON ;BRANCH IF VIDEO ON COMMAND CMP #3 BEQ APLEON ;BRANCH IF APPLE ON COMMAND CMP #4 BEQ WIDTH ;BRANCH IF WIDTH COMMAND CMP #16 BEQ CLKREAD ;BRANCH IF CLOCK COMMAND CMP #SNDNAMECMD BEQ SENDNAME ;BRANCH IF SEND NAME COMMAND ;ERROR BAD COMMAND LDA #0FFH ;ELSE ERROR RTS CLKREAD: JMP CLOCKREAD SENDNAME: LDA NAME STA CNT JSR WR1Z80BYTE LDA #1 STA IDX LDA CNT BNE $LP CLC LDA #0 RTS $LP LDX IDX LDA NAME,X JSR WR1Z80BYTE INC IDX DEC CNT BNE $LP LDA #0 RTS OUTSTAT: ;TEST IF THE DEVICE IS READY TO SEND ANOTHER CHARACTER RTS INSTAT: RTS ;TEST IF THE DEVICE HAS A CHARCTER TO INPUT ;BEQ RDY ;BIF READY TO INPUT A CHARACTER ;BNE NOTRDY ;BIF NO CHARACTER IS THERE NOTRDY: LDA #0 RTS RDY: LDA #0FFH RTS VIDEOON: ;DO SOMETHING TO TURN ON YOUR VIDEO ; THIS IS PROBABLY NOTHING UNLESS THIS IS A CONSOLE DEVICE RTS APLEON: ;DO SOMETHING TO TURN ON THE APPLE VIDEO ON ; THIS IS PROBABLY NOTHING UNLESS THIS IS A CONSOLE DEVICE RTS WIDTH: ;RETURN THE WIDTH OF THIS DEVICE LDA #80 ;80 COLUMNS ? RTS ;--------------------------------------------------------------------- ;THIS IS THE MAIN CLOCK READING ROUTINE. THE VARIABLE "CLOCKTYPE" CONTAINS ;0=NO CLOCK FOUND, 1=CLOCK. CLOCKREAD: ; LDA CLOCKTYPE LDA #1 ; CMP #0 ; BEQ NOTFOUND CMP #1 BEQ DSCLOCK RTS ;SOME ERROR - NONE OF THE ABOVE ;-------------------------------- ;Dallas Semiconductor clock reading routine. PATRN: .BYTE 05CH,0A3H,03AH,0C5H,05CH,0A3H,03AH,0C5H DSCLOCK:LDA 0C015h ; Get present slot cx rom switch setting. PHA ; Save it. STA 0C007h ; LDA 0C804h ; LDY # 07 ; LOOP1: LDA PATRN,Y ; Beginning of send pattern loop. SEC ; ROR A ; LOOP2: PHA ; LDA # 0 ; ROL A ; TAX ; LDA 0C800h,X ; PLA ; LSR A ; BNE LOOP2 ; DEY ; BPL LOOP1 ; LDX # 07 ; Beginning of read clock loop. LOOP3: LDY # 07 ; LOOP4: LDA 0C804h ; ROR A ; ROR CLKOUT,X ; DEY ; BPL LOOP4 ; DEX ; BPL LOOP3 ; PLA ; Reset slot cx rom switch. ROL A ; BCS END ; STA 0C006h ; END: LDX #0 ; CKREAD: TXA ; PHA ; LDA CLKOUT,X ; JSR WR1Z80BYTE ; Send one bye to host. PLA ; TAX ; INX ; CPX #8 ; BNE CKREAD ; LDA #AAH ; Set high bit to signal end of time data. RTS ; ;*********************************** ;ROUTINE: POLLENTRY ;PURP: HANDLE POLLING, THIS ENTRY POINT ; IS CALLED PERIODICALY WHILE THE APPLE IS ; WAITING FOR A COMMAND FROM THE Z-80. THIS ; CODE SHOULD BE VERY SHORT AS THE Z-80 IS ; IGNORED WHILE THIS CODE IS BEING EXECUTED ;ENTRY: NONE ;EXIT: NONE ;USED: ALL ;*********************************** POLLENTRY: RTS ;TEMPORARY DATA CLKOUT: .BLOCK 8 IDX: .BLOCK 1 ;TEMPORARY CNT: .BLOCK 1 ;TEMPORARY CLOCKTYPE: .BLOCK 1 ;TEMPORARY - IDENTIFIED CARD TYPE (0-2) BOTTOM: .END .WIDTH 96