CLOK MODULE 0001 SUBTITLE 8 * * Stand-alone program to set the real time clock * from the handkeys * * Runs in real address mode * * Copyright (C) R.D. Eager University of Kent MCMLXXXI * CHAPTER SUBTITLE 1 * Image store addresses for 2960 &HANDKEYS EQU X'6006' * Hand keys (switches) &CLKX EQU X'600C' * Clock X register &CLKY EQU X'600D' * Clock Y register &CLKZ EQU X'600E' * Clock Z register SUBR CLOCK SUBTITLE 7 * * Bootstrap response area * * First eight words are controller pseudo comms * area, but are already present in the object file * as the standard Subsystem header * CODE COM0 WORD 0 * 08: Communication word 0 COM1 WORD 0 * 09: Communication word 1 TITLE 1 * Stack area CODE WORD(22) 0(22) SUBTITLE 1 * Local variables LAYOUT.L WORD(5) * Linkage area - not used DATE WORD * Date in hexadecimal TIME WORD * Time in hexadecimal YEAR WORD * Year in binary MONTH WORD * Month in binary DAY WORD * Day in binary CX WORD * Temp \__ Keep together CY WORD * Temp / TITLE 1 * Initial machine state CODE LNB WORD X'00000028' * 32: Initial LNB contents PSR WORD X'0004FF01' * 33: Initial PSR contents PC WORD X'000000D0' * 34: Initial PC contents SSR WORD X'40000FFF' * 35: Initial SSR contents SF WORD X'00000058' * 36: Initial SF contents IT WORD X'007FFFFF' * 37: Initial IT contents IC WORD X'007FFFFF' * 38: Initial IC contents CTB WORD 0 * 39: Initial CTB contents XNB WORD 0 * 40: Initial XNB contents B WORD 0 * 41: Initial B contents DR LWORD 0 * 42: Initial DR contents ACC0 WORD 0 * 44: Initial ACC contents ACC1 WORD 0 ACC2 WORD 0 ACC3 WORD 0 LSTL WORD 0 * 48: LSTL - not used LSTB WORD 0 * 49: LSTB - not used PSTL WORD 0 * 50: PSTL - not used PSTB WORD 0 * 51: PSTB - not used TITLE 1 * Main code SUBTITLE 1 * Input section CODE INPUT1 LSS.G &HANDKEYS * wait for MSB to be set JNN INPUT1 AND X'7FFFFFFF' * remove it ST DATE * store away INPUT2 LSS.G &HANDKEYS * wait for MSB to clear JN INPUT2 INPUT3 LSS.G &HANDKEYS * wait for MSB to be set JNN INPUT3 AND X'7FFFFFFF' * remove it ST TIME * store away INPUT4 LSS.G &HANDKEYS * wait for zero switches JNZ INPUT4 SUBTITLE 1 * Check date, and convert to minutes CODE LSS DATE * top byte should be zero USH -24 JZ DCONV1 * j if OK IDLE X'F001' DCONV1 LSS DATE * get year JLK CONVERT ICP 80 * check range JLE DCONV2 * j if wrong ICP 99 JLE DCONV3 * j if OK DCONV2 IDLE X'F002' DCONV3 ST YEAR LSS DATE * get month USH -8 JLK CONVERT JZ DCONV4 * check range ICP 12 JLE DCONV5 DCONV4 IDLE X'F003' DCONV5 ST MONTH LSS DATE * get day USH -16 JLK CONVERT JZ DCONV6 * check range ICP 31 JLE DCONV7 * j if OK DCONV6 IDLE X'F004' DCONV7 ST DAY LSS MONTH * convert to day number ICP 2 JLE DCONV8 ISB 3 J DCONV9 DCONV8 IAD 9 LB YEAR SBB 1 STB YEAR DCONV9 ST MONTH LSS YEAR IMY 1461 IDV 4 SLSS MONTH IMY 153 IAD 2 IDV 5 IAD.T IAD DAY IAD 58 ST DATE * save day number SUBTITLE 1 * Check time, and convert to seconds CODE LSS TIME USH -16 * top half should be zero JZ TCONV1 * j if OK IDLE X'F005' TCONV1 LSS TIME * get minutes JLK CONVERT ICP 60 * check range JL TCONV2 * j if OK IDLE X'F006' TCONV2 SLSS TIME * get hours USH -8 JLK CONVERT ICP 24 * check range JL TCONV3 * j if OK IDLE X'F007' TCONV3 IMY 60 IAD.T * minutes in today IMY 60 * seconds in today ST TIME SUBTITLE 1 * Combine date and time CODE LSS DATE IMYD 86400 * convert days to seconds SLSS TIME LUH 0 * make double length IAD.T IMY 0/1000000 * convert to microseconds ST CX * and CY LSS CX ST.G &CLKX * set clock X register LSD CX * and CY USH -1 * duplicate guard bit STUH.B * set ACS=1 ST.G &CLKY * set clock Y register LSS 0 ST.G &CLKZ * clear clock Z register IDLE X'CCCC' * Finished - OK TITLE 3 * Routine to convert 2 hex digits to decimal number * On entry, ACC contains digits in bits 24-31 * On exit, ACC contains result (ACS=1) CODE CONVERT AND X'FF' * remove spurious bits ST.T USH -4 * get tens IMY 10 SLSS.T * swop with copy AND X'F' * get units IAD.T * combine J.T END