;*----------------------------------------------------------------------------* ;* * ;* * ;* AAAMM MM PPPPPPPPPPPPP RRRRRRRRRRRR OOOOOOOOOOOOOO * ;* AAAAAMMM MMM PPPPPPPPPPPPP RRRRRRRRRRRR OOOOOOOOOOOOOO * ;* AAA AAA MMM MMM PPP PPP RRR OOO OOO * ;* AAA AAA MMM MMM PPP PPPPPPPPP RRRRRRRRRRRR OOO OOO * ;* AAA AAA MMM MMM PPP PPPPPPPPP RRRRRRRRRRRR OOO OOO * ;* AAA AAA MMM PPP RRR OOO OOO * ;* AAA AAAAAAAAAA M PPP RRR OOOOOOOOOOOOOO * ;* AAA AAAAAAAAAAAA PPP RRR OOOOOOOOOOOOOO * ;* * ;* * ;* * ;* AMPRO COMPUTERS INCORPORATED * ;* 67 East Evelyn Avenue * ;* Mountain View, CA 94041 * ;* (415)962-0230 * ;* * ;* * ;* BIOSCLK.Z80 for the LITTLE BOARD/PLUS * ;* Copyright (C) 1987 AMPRO Computers, Inc. * ;* ALL RIGHTS RESERVED. * ;* * ;* This code was developed for use with AMPRO hardware only. * ;* All other use is prohibited without prior written consent from * ;* AMPRO Computers, Inc. * ;* * ;*----------------------------------------------------------------------------* ;* * ;* version date by description * ;* ------- ------- ---- ----------- * ;* 1.0 10 aug 87 jas add auto setting of bios clock/calendar * ;* * ;* derived from, and includes: * ;* 1.0 2 nov 86 fsw Released version * ;* * ;* and portions of: * ;* time.asm * ;* date.asm * ;* * ;* ---------------------------------------------------------------------------* ;* NOTE:The Dallas SmartWatch will only work with the AMPRO LITTLE BOARD/PLUS * ;* model 1B-1 or 1B-2. * ;* * ;* The following modifications must be made to operate. On the back side * ;* of the board cut the trace going to pin 20 on the 28 pin EPROM socket * ;* labled U13. Solder a jumper between the eprom socked U13 pin 20 and * ;* pin 21 of the microprocessor labled U4. The SmartWatch will now * ;* function. * ;* * ;* May be assembled with a Z-80 assembler such as ZAS by MYTEK * ;* use the hex option and create the com file with load from DR. * ;* * ;* available from: * ;* Echelon, Inc. * ;* 885 N. San Antonio Road * ;* Los Altos, CA. 94022 * ;* (415)948-3820 * ;* * ;*----------------------------------------------------------------------------* FALSE EQU 0 TRUE EQU NOT FALSE H19 EQU FALSE CONTROL EQU 0 ; Prom control port READ EQU 4 ; Smartwatch read WRT1 EQU 3 ; Smartwatch write a 1 WRT0 EQU 2 ; Smartwatch write a 0 CR EQU 0DH ; Carriage return LF EQU 0AH ; Line feed TPA EQU 100H ; Cpm tpa OFF EQU 8000H-TPA ; Offset for smartwatch interface CLS MACRO ; Clear the Z/H19 screen LD E,1BH ; Escape LD C,2 CALL 5 LD E,45H ; E LD C,2 CALL 5 ENDM PAGE ; ------------------------------------------------------------------------ ; begining of code ORG TPA ; All the code between this point ; And the label 'START' is moved JP START ; Above eprom memory space. ; ------------------------------------------------------------------------ ; this code interfaces with the smartwatch and must be moved above the ; eprom memory space (0 to 8000h) to operate. the interface code is ; located between the double lines of '*' ; ; NOTE: the wakeup routine turns on the eprom socket and the readclk ; and setclk routines turn it off. ; ; new time to write to smartwatch is in clkbuff ; ************************************************************************ ; ************** Start of SmartWatch interface code ********************** ; ************************************************************************ SETCLK: CALL WAKEUP+OFF ; Init smartwatch LD HL,CLKBUFF+OFF LD B,8 ; Number of bytes to write PUTBYTE:LD D,B ; Save byte count LD B,8 ; Nunber of bits to write LD A,(HL) ; Get byte to write PUTBIT: RRA LD C,A ; Save JR C,PUTONE LD A,(WRT0) ; Write a zero JR PB1 PUTONE: LD A,(WRT1) ; Writa a one PB1: LD A,C ; Get byte back DJNZ PUTBIT INC HL ; Next byte LD B,D ; Byte count DJNZ PUTBYTE LD A,41H ; Turn off eprom OUT (CONTROL),A RET ; ; Read the smartwatch registers, return with carry set if not sucessful ; READCLK:CALL WAKEUP+OFF ; Init smartwatch LD HL,CLKBUFF+OFF ; Save area for read LD B,8 ; Number of bytes to read GETBYTE:LD D,B ; Save byte count LD B,8 ; Set bit count to 8 XOR A,A ; Clear a LD C,A ; Clear c GETBIT: LD A,(READ) AND A,1 ; Mask lsb OR A,C ; Or in bits RRC A ; Move over for next bit LD C,A ; And save results DJNZ GETBIT LD (HL),A ; Put in buffer INC HL ; Next byte location LD B,D ; Restore byte count DJNZ GETBYTE LD A,41H ; OUT (CONTROL),A ; Turn off eprom LD A,(SW$REG4)+OFF AND A,A ; Set flags JR Z,RDERR ; Register should be non-zero INC A ; See if 0ffh JR Z,RDERR RET RDERR: SCF RET ; ; Initialize the smartclock ; NOTE: there is no stack when the prom socket is turned on. ; WAKEUP: POP IX ; Put ret address in 'ix' XOR A,A OUT (CONTROL),A ; Prom socket is now on LD HL,WAKEPAT+OFF LD B,8 ; Byte count LD A,(READ) ; Reset clock WAKEBYTE: LD D,B ; Save byte count in 'd' LD B,8 ; Bit count LD A,(HL) ; Get first char WAKEBIT:RRA LD C,A ; Save JR C,WRTONE LD A,(WRT0) ; Write zero JR WAKE1 WRTONE: LD A,(WRT1) ; Write one WAKE1: LD A,C ; Restore pattern DJNZ WAKEBIT ; Bit count LD B,D ; Get byte count back INC HL ; Next pattern location DJNZ WAKEBYTE JP (IX) ; Return WAKEPAT:DB 0C5H,03AH,0A3H,05CH,0C5H,03AH,0A3H,05CH CLKBUFF: ; 8 byte save area for smartclk reg SW$REG0:DB 0 ; Tenths, hundredths seconds (00-99) SW$REG1:DB 0 ; Seconds (00-59) SW$REG2:DB 0 ; Minutes (00-59) SW$REG3:DB 0 ; Hour (00-23) SW$REG4:DB 0 ; Day (01-07) SW$REG5:DB 0 ; Date (01-31) SW$REG6:DB 0 ; Month (01-12) SW$REG7:DB 0 ; Year (00-99) MOVLEN EQU $-TPA ; ************************************************************************ ; ************** End of SmartWatch interface code ************************ ; ************************************************************************ PAGE DS 24H ; Space for stack STACK EQU $ ; Use this area for stack OLDSTACK: DS 2 CMDLINE:DS 30H ; initialize memory space START: IF H19 CLS ENDIF JMPTBL: LD DE,WBOOT ; Build bios entry table LD HL,(1) ; Get bios start LD BC,51 ; Bytes to move LDIR ; Move it CALL GETTBL ; Get address of next jmp tbl CP 36 ; Must be bios vers 3.6 or higher JP C,BADVER ; Give message and exit LD DE,NXTTBL ; 'hl' has bios nxttbl address LD BC,15 ; LDIR ; Move the table LD HL,0 ; Make sure that clock is enabled CALL TOD ; Get clock base address LD A,L ; See if address of tick was returned OR H ; 'hl' has address of clock JP Z,NOCLK ; Exit clock not enabled ; 'hl' has address of clock LD DE,SEC ; Move time LD BC,6 ; LDIR ; Save time ; ; Everthing needed has been moved into program area ; And now move the SmartWatch code above the rom space ; LD HL,TPA ; Source LD DE,8000H ; Destination LD BC,MOVLEN ; Bytes to move LDIR ; Move program above rom space BEGIN: LD (OLDSTACK),SP ; Save stack pointer LD SP,STACK JP CONT ; Jump past help HELPMSG:DB 'BIOSCLK Ver 1.0, ref SMARTCLK.Z80, with Modifications by, Joe Silvia',CR,LF DB 'Copyright (c) 1987, AMPRO Computers, Inc.',CR,LF,LF DB 'Usage: BIOSCLK - display date and time',CR,LF DB ' SMARTWATCH and BIOS clock',CR,LF,LF DB ' BIOSCLK /S - set SmartWatch and',CR,LF DB ' then press any key',CR,LF DB ' to start the clock.',CR,LF,LF DB ' BIOSCLK /T - test SmartWatch',CR,LF DB ' any key to quit.'CR,LF,LF DB '$' CONT: CALL READCLK+OFF ; Read the smartwatch JP C,SWERROR ; Error reading smartwatch LD HL,80H ; Point to command line buffer LD A,(HL) ; See if entry OR A,A JP Z,SHOW$DT ; No, show date and time SPACE: INC HL LD A,(HL) CP ' ' ; Filter leading spaces JR Z,SPACE NONE: EX DE,HL ; 'de' to command line CALL COMPARE DB '/T',0 ; Test JP NC,TEST CALL COMPARE DB '/S',0 ; Set time JP NC,SETTIME LD DE,HELPMSG ; Give help JR COMM SWERROR:LD DE,ERRMSG JR COMM DATEERR:LD DE,DTERRMSG JR COMM TIMEERR:LD DE,TMERRMSG JR COMM BADVER: LD DE,BDVERMSG JR COMM NOCLK: LD DE,NCLKMSG COMM: CALL PRINT$STRING EXIT: LD SP,(OLDSTACK) ; And exit RET PAGE ; ; Show the date and time ; SHOW$DT:CALL SHW$DT ; Display date and time CALL MD2J CALL CHGDAT JR EXIT ; ; Test the smartwatch by reading until interrupted by console input ; TEST: CALL READCLK+OFF JR C,SWERROR CALL SHOWTIME LD C,11 ; Get console status CALL 5 OR A,A JR NZ,TESTEND ; If any char typed LD A,CR CALL PRINT$CHAR JR TEST TESTEND:LD C,1 ; Con input CALL 5 ; Get the character JR EXIT ; And throw away ; ; Set the date and time ; SETTIME:CALL PRINT DB CR,LF,'Enter day of week (Mon-Sun) ',0 CALL RDBUFF ; Get input LD DE,CMDLINE+1 ; See if input LD A,(DE) OR A,A JP Z,EXIT INC DE CALL COMPARE DB 'SUN',0 LD A,1 JP NC,STM1 CALL COMPARE DB 'MON',0 LD A,2 JP NC,STM1 CALL COMPARE DB 'TUE',0 LD A,3 JP NC,STM1 CALL COMPARE DB 'WED',0 LD A,4 JP NC,STM1 CALL COMPARE DB 'THU',0 LD A,5 JP NC,STM1 CALL COMPARE DB 'FRI',0 LD A,6 JP NC,STM1 CALL COMPARE DB 'SAT',0 LD A,7 JP NC,STM1 ERROR: CALL PRINT DB CR,LF,'Invalid entry',0 JP EXIT STM1: OR A,10H ; Set reset bit LD (SW$REG4)+OFF,A ; Day of week to smartwatch reg CALL PRINT DB CR,LF,'Enter date (mm-dd-yyyy) ',0 CALL RDBUFF LD HL,CMDLINE+1 LD A,(HL) OR A,A JP Z,ERROR CALL VALID ; Test for valid numeric entry CALL STRNG2BCD ; Convert cmdline to bcd OR A,A ; Valid month (01-12) JP Z,DATEERR CP 12H+1 JP NC,DATEERR LD (SW$REG6)+OFF,A ; Put month INC HL PUSH DE ; Save binary month CALL STRNG2BCD ; Get date POP DE ; Get binary month back PUSH HL ; Save pointer DEC DE ; Make month 0 to 11 LD HL,MNTHS ; Offset to number of days in month ADD HL,DE CP (HL) ; See if more than max days in month POP HL ; JP NC,DATEERR LD (SW$REG5)+OFF,A ; INC HL CALL STRNG2BCD ; Get year LD HL,1979 ; Make sure 4 digit century entered SBC HL,DE ; 'de'=binary century JP P,DATEERR CP 99H+1 ; More than 99 JP NC,DATEERR LD (SW$REG7)+OFF,A ; Store year CALL PRINT DB CR,LF,'Enter time (hh:mm:ss) ',0 CALL RDBUFF ; Get input LD HL,CMDLINE+1 LD A,(HL) ; Get number of characters typed OR A,A JP Z,ERROR ; No input CALL VALID ; Test for valid numeric asci CALL STRNG2BCD ; Get hour CP 24H+1 JP NC,TIMEERR ; LD (SW$REG3)+OFF,A ; Store hour INC HL CALL STRNG2BCD ; Get minute CP 59H+1 JP NC,TIMEERR LD (SW$REG2)+OFF,A ; Store minute INC HL LD A,(HL) OR A,A ; See if seconds entered JR Z,STM4 CALL STRNG2BCD ; Get seconds CP 59H+1 JP NC,TIMEERR STM4: LD (SW$REG1)+OFF,A XOR A,A LD (SW$REG0)+OFF,A ; Clear hundreths of seconds LD DE,SETMSG CALL PRINT$STRING SETTING:LD C,11 ; Get console status CALL 5 OR A JR NZ,SET$TIME LD A,CR CALL PRINT$CHAR JP SETTING SET$TIME: CALL SETCLK+OFF ; Set the time CALL READCLK+OFF ; Show the date and time CALL SHW$DT CALL MD2J CALL CHGDAT JP EXIT ; ; Show date and time ; SHW$DT: LD DE,CURMSG CALL PRINT$STRING LD A,(SW$REG4)+OFF ; Get day of week AND A,07H ; Mask off extra CALL BCD2BIN ; DEC A ; Make 0 to 6 SLA A ; X2 LD E,A LD D,0 LD HL,DAYOFWEEK ADD HL,DE LD E,(HL) INC HL LD D,(HL) ; Print day of week CALL PRINT$STRING LD A,(SW$REG6)+OFF ; Get month AND A,1FH ; Mask month (01 to 12) CALL BCD2BIN DEC A ; Make 0 to 11 SLA A ; X2 LD E,A LD D,0 LD HL,MONTH ADD HL,DE LD E,(HL) INC HL LD D,(HL) ; Month string in 'de' CALL PRINT$STRING LD A,(SW$REG5)+OFF ; Get date AND A,3FH ; Mask (01 to 31) LD HL,DATE CALL A2ASC LD DE,DATE CALL PRINT$STRING LD A,(SW$REG7)+OFF ; Get year CP 20H ; Less than 20 JR C, TWNTY LD HL,CEN21A SUB 20H ; Sub 21st century offset CALL A2ASC LD DE,CEN21 JR PRN$YR TWNTY: ADD 80H ; Add offset for 1980 LD HL,CEN20A CALL A2ASC LD DE,CEN20 PRN$YR: CALL PRINT$STRING SHOW$TIME$MSG: LD DE,TIMEMSG CALL PRINT$STRING SHOWTIME: LD A,(SW$REG3)+OFF ; Get hour LD HL,HRMSG CALL A2ASC LD A,(SW$REG2)+OFF ; Get minute LD HL,MINMSG CALL A2ASC LD A,(SW$REG1)+OFF ; Get second LD HL,SECMSG CALL A2ASC LD A,(SW$REG0)+OFF ; Get hundredth of second LD HL,HUNMSG CALL A2ASC LD DE,HRMSG ; Display the time CALL PRINT$STRING RET PAGE ; ; Convert decimal character string pointed to by 'hl'. ; Returns: 'a' equal to bcd value between 0 and 99. ; 'de' equals the binary value of string ; 'hl' points to delimiter ; STRNG2BCD: PUSH BC ; Save LD DE,0 STNG1: LD A,(HL) ; Get char CP '0' JR C,STNGEXT ; Less than ascii '0' CP '9'+1 JR NC,STNGEXT ; More than ascii '9' SUB '0' STNG10: PUSH HL ; Save pointer LD H,D ; Multiply de x10 LD L,E ADD HL,HL ; *2 ADD HL,HL ; *4 ADD HL,DE ; *5 ADD HL,HL ; *10 LD E,A LD D,0 ADD HL,DE EX DE,HL POP HL INC HL JR STNG1 ; ; Convert the binary value in 'de' to bcd value between 0 and 99 in 'a'. ; STNGEXT:PUSH DE ; Save bcd value PUSH HL ; Save pointer XOR A,A ; Clear flags EX DE,HL LD DE,1980 SBC HL,DE ; Sub 1980 JP P,CVT ; Ok if positive CCF ; Was set if here ADC HL,DE ; Add it back CVT: LD A,L ; 'a'= 0h to 63h LD C,0FFH ; LP10: INC C SUB 10 ; -10 loop JR NC,LP10 ADD 10 ; Make back positive LD B,A ; Save 1's LD A,C ; Get 10's SLA A SLA A SLA A SLA A ; 10's to upper nibble OR A,B ; Or in 1's POP HL POP DE POP BC RET ; ; Convert bcd number in 'a' to ascii and store number to 'hl' and 'hl'+1 ; A2ASC: PUSH AF AND A,0F0H ; Do upper nibble RRA RRA RRA RRA OR A,'0' LD (HL),A INC HL POP AF ; Do lower nibble AND A,0FH OR A,'0' LD (HL),A RET PAGE ; ; Print the char in 'a' ; PRINT$CHAR: PUSH BC PUSH DE PUSH HL LD E,A LD C,2 ; Print character CALL 5 ; Cp/m POP HL POP DE POP BC RET ; ; Cpm function 9h, print string terminated with '$'. ; "de" points to string address ; PRINT$STRING: PUSH AF PUSH BC PUSH HL LD C,9 CALL 5 ; Cpm entry POP HL POP BC POP AF RET PAGE ; ; Get command line input ; RDBUFF: LD HL,CMDLINE ; Point to command line PUSH HL LD A,40 LD (HL),A ; 40 character command line LD B,A ; Set up count for clear buffer XOR A ; Clear buffer CLRBUFF:INC HL LD (HL),A DJNZ CLRBUFF POP DE ; Get command line ptr back to 'de' LD C,10 CALL 5 RET ; ; Print a ascii string terminated with '0' contained in the code ; PRINT: POP HL ; String address is on stack LD A,(HL) OR A,A ; See if end JR Z,PRNEND CALL PRINT$CHAR ; Print the character INC HL JR PRINT+1 PRNEND: JP (HL) ; ; Scan the command line for valid entry ; Called with 'hl' pointing to command line count ; VALID: LD A,(HL) ; Get number of characters typed INC HL DEC A ; Make sure more than one char JR Z,NOTVALID+1 INC A ; Restore value CP ' ' JR Z,VALID ; Filter spaces PUSH HL ; Save pointer to first char VALID1: LD A,(HL) INC HL AND A,A JR Z,VALIDEXT CP '-' JR Z,VALID1 CP ':' JR Z,VALID1 CP '0' JR C,NOTVALID CP '9'+1 JR NC,NOTVALID JR VALID1 VALIDEXT: POP HL RET NOTVALID: POP HL JP ERROR PAGE ; ; Compare a string of characters addressed by 'de' to string ; Pointed to by stack address. ; COMPARE:EX (SP),HL ; PUSH DE ; Save source address CMPA: LD A,(HL) AND A,A ; Zero is end JR Z,SAME ; Yes, string was equal LD A,(DE) ; Get string char CP 'Z'+1 ; Less than 'Z' JR C,CMPB AND 5FH ; Make upper case CMPB: CP (HL) ; Compare JR NZ,NOTSAME ; Not the same INC HL ; Next characters INC DE JR CMPA ; Till through or not same NOTSAME:XOR A,A ; Keep going till end of string INC HL CP (HL) JR NZ,NOTSAME+1 SCF ; Show error SAME: POP DE ; Restore source address EX (SP),HL ; 'hl' has return address RET ; ; BCD to Binary ; 'A' = bcd number to convert, returns biniary number in 'A' ; BCD2BIN:PUSH BC LD C,A ; Save for a moment AND 0FH ; Make low nibble LD B,A ; Save it LD A,C ; Get bcd back AND 0F0H ; Upper nibble RRCA ; To low nibble RRCA RRCA RRCA ADD A,A ; X 2 LD C,A ; Save results ADD A,A ; X 4 ADD A,A ; X 8 ADD A,C ; X10 ADD A,B ; Have binary equivalent in 'a' POP BC RET PAGE ; ; Move the new date prameters to bios clock area ; CHGDAT: CALL TOD ; Get address of time counters LD DE,3 ; Offset to date ADD HL,DE ; Add offset to 'hl' EX DE,HL ; Bios date counter addresss to 'de' LD HL,JDAY ; LD BC,3 ; Date only, not time LDIR ; Move it to bios memory ; ; Move the new time prameters to bios clock area ; CHGTIM: CALL TOD ; Get address of time counters EX DE,HL ; Bios time counter addresss to "de" LD HL,SEC ; LD BC,3 ; Time only, not date LDIR ; Move it to bios memory RET ; **************************************************************** ; Convert month/day to julian ; **************************************************************** MD2J: LD DE,MTHS ; Init month pointer LD HL,0 LD A,(SW$REG6)+OFF ; Get binary month CALL BCD2BIN LD B,A ; Set count MD2J1: LD A,(DE) ; Get number of days in month ADD A,L LD L,A ; Update 'l' CALL C,MD2J3 ; Adjust 'h' if carry DEC B INC DE ; Next month JP NZ,MD2J1 MD2J2: LD A,(SW$REG5)+OFF ; Get binary day CALL BCD2BIN LD E,A ; LD D,0 ADD HL,DE ; Add the day DEC HL ; Adjust for ordinal 0 LD (JDAY),HL LD A,(SW$REG1)+OFF CALL BCD2BIN LD (SEC),A LD A,(SW$REG2)+OFF CALL BCD2BIN LD (MIN),A LD A,(SW$REG3)+OFF AND 03FH CALL BCD2BIN LD (HOUR),A LD A,(SW$REG7)+OFF CALL BCD2BIN ADD A,80 LD (YEAR),A RET MD2J3: LD A,1 ; If carry add 1 to 'h' ADD A,H LD H,A RET PAGE BDVERMSG: DB CR,LF,'Requires bios ver 3.6 or higher$' NCLKMSG:DB CR,LF,'BIOS clock not enabled$' DTERRMSG: DB CR,LF,'Invalid date$' TMERRMSG: DB CR,LF,'Invalid time$' ERRMSG: DB CR,LF DB 'Error: The Dallas SmartWatch will only work with the',CR,LF DB ' AMPRO LITTLE BOARD/PLUS model 1B-1 or 1B-2.',CR,LF,LF DB 'The following modifications must be made to operate.',CR,LF DB ' On the back side of the board cut the trace going to',CR,LF DB ' pin 20 on the 28 pin EPROM socket labled U13. Solder',CR,LF DB ' a jumper between the eprom socked U13 pin 20 and pin',CR,LF DB ' 21 of the microprocessor labled U4. The SmartWatch',CR,LF DB ' will now function.$' SETMSG: DB CR,LF,LF DB 'Press any key to start clock.....',CR,LF,LF,'$' CURMSG: DB CR,LF,'Todays date: $' DATE: DB ' ,$' CEN20: DB '19' CEN20A: DB ' $' CEN21: DB '20' CEN21A: DB ' $' TIMEMSG:DB ' at $' HRMSG: DB ' :' MINMSG: DB ' :' SECMSG: DB ' .' HUNMSG: DB ' ',CR,LF,LF DB 'The BIOS clock date and time have been set',CR,LF DB ' to the above date/time......',CR,LF,LF,'$' DAYOFWEEK: DW DAY1 DW DAY2 DW DAY3 DW DAY4 DW DAY5 DW DAY6 DW DAY7 MONTH: DW MON1 DW MON2 DW MON3 DW MON4 DW MON5 DW MON6 DW MON7 DW MON8 DW MON9 DW MON10 DW MON11 DW MON12 MON1: DB 'January $' MON2: DB 'February $' MON3: DB 'March $' MON4: DB 'April $' MON5: DB 'May $' MON6: DB 'June $' MON7: DB 'July $' MON8: DB 'August $' MON9: DB 'September $' MON10: DB 'October $' MON11: DB 'November $' MON12: DB 'December $' DAY1: DB 'Sunday, $' DAY2: DB 'Monday, $' DAY3: DB 'Tuesday, $' DAY4: DB 'Wednesday, $' DAY5: DB 'Thursday, $' DAY6: DB 'Friday, $' DAY7: DB 'Saturday, $' MTHS: DB 0,31,29,31,30,31,30,31,31,30,31,30,31 MNTHS: DB 31H+1,29H+1,31H+1,30H+1,31H+1,30H+1 DB 31H+1,31H+1,30H+1,31H+1,30H+1,31H+1 PAGE ; ; Bios jmp table, moved from the bios.... ; WBOOT: DS 3 ; Warm start CONST: DS 3 ; Console status CONIN: DS 3 ; Console character in CONOUT: DS 3 ; Console character out LIST: DS 3 ; List character out PUNCH: DS 3 ; Punch character out READER: DS 3 ; Reader character in HOME: DS 3 ; Seek to home position SELDSK: DS 3 ; Select disk SETTRK: DS 3 ; Set track number SETSEC: DS 3 ; Set sector number SETDMA: DS 3 ; Set dma address READDSK:DS 3 ; Read disk WRITE: DS 3 ; Write disk LISTST: DS 3 ; Return list status SECTRAN:DS 3 ; Sector translate GETTBL: DS 3 ; Point to more jumps, returns bios ; Version in 'a'. NXTTBL: SWAP: DS 3 ; Jmp swap HD$INF: DS 3 ; Get hd table info PHTBAC: DS 3 ; Get/set phytab acces PAGET: DS 3 ; Get phytab entry address TOD: DS 3 ; Get base address of clock tick ; ; Time/date counters from bios ; SEC: DS 1 MIN: DS 1 HOUR: DS 1 JDAY: DS 2 ; Julian day 0-366 for leap year YEAR: DS 1 ; PAGE END