; ************************* ; * C L O C K 8 0 * ; * By Robert Doerr * ; *-----------------------* ; * Blinking Clock * ; ************************* ; =6000 ORG 6000H ;Start address of program ; ; Initilize program ; 6000: F3 START DI ;Disable interrupts 6001: 31 FF 7F LD SP,7FFFH ;Set stack 6004: 3A 25 01 LD A,(0125H) ;Test for Model III 6007: FE 49 CP 49H ;Is Character an "I"? 6009: 28 51 JR Z,MODEL3 ;Jump if Model III 600B: 3E 61 LD A,'a' ;Get lower case "a" 600D: 32 00 3C LD (3C00H),A ;Save on screen 6010: 3A 00 3C LD A,(3C00H) ;Get back from screen 6013: FE 61 CP 'a' ;Is it still an "a"? 6015: 28 06 JR Z,OKL ;Jump if still "a" 6017: 21 00 00 LD HL,0 ;Op-Code for "NOP,NOP" 601A: 22 31 62 LD (PRSTR),HL ;Zero out Jump 601D: 3E 49 OKL LD A,49H ;Create Model I Version 601F: 32 FD 62 LD (WHAT+51),A ;Modify startup Message 6022: 21 00 00 LD HL,0 ;Op-code for "NOP,NOP" 6025: 22 F5 60 LD (ZAP1),HL ;Zero out instruction 6028: 22 F7 60 LD (ZAP2),HL ;Zero out instruction 602B: 22 F9 60 LD (ZAP3),HL ;Zero out instruction 602E: 22 06 61 LD (ZAP4),HL ;Zero out instruction 6031: 22 08 61 LD (ZAP5),HL ;Zero out instruction 6034: 22 BF 67 LD (ZAP6+2),HL ;Zero out instruction 6037: 3E 3A LD A,3AH ;Op-Code for "LD A,(???)" 6039: 32 FE 67 LD (XIT),A ;Change Op-Code 603C: 32 05 68 LD (FDC),A ;Change Op-Code 603F: 32 BD 67 LD (ZAP6),A ;Change Op-Code 6042: 3E 37 LD A,37H ;Msb of Interrupt address 6044: 32 00 68 LD (XIT+2),A ;Change Byte 6047: 32 07 68 LD (FDC+2),A ;Change Byte 604A: 32 BF 67 LD (ZAP6+2),A ;Change Byte 604D: 3E E0 LD A,0E0H ;Lsb of Interrupt address 604F: 32 BE 67 LD (ZAP6+1),A ;Set Lsb of address 6052: 3E 28 LD A,40 ;Model I has 40 ticks 6054: 32 CF 67 LD (TICKS+1),A ;Change ticks 6057: 3E 14 LD A,20 ;Half second 6059: 32 20 61 LD (HLFTIC+1),A ;Change half second ; ; Print startup Message ; and get the time ; 605C: CD 89 61 MODEL3 CALL CLS ;Clear the screen 605F: 21 CA 62 LD HL,WHAT ;Message to print 6062: 11 00 3C LD DE,3C00H ;1st line of screen 6065: CD 31 62 CALL PRSTR ;Print Message 6068: 21 0B 63 LD HL,TIME ;Message to print 606B: 11 80 3C LD DE,3C80H ;3rd line of screen 606E: CD 31 62 CALL PRSTR ;Print Message 6071: CD 4D 62 CALL INPUT ;Input the Time ; ; Do syntax check on input line ; 6074: 21 5D 63 LD HL,TIMEBF ;Start of Input buffer 6077: CD 0B 62 CALL CHECKT ;Check 2 digits 607A: 7E LD A,(HL) ;Get next Character 607B: FE 3A CP ':' ;Is it a colon? 607D: C2 1E 62 JP NZ,ERROR ;Error if no colon 6080: 23 INC HL ;Bump pointer 6081: CD 0B 62 CALL CHECKT ;Check 2 digits 6084: 7E LD A,(HL) ;Get next Character 6085: FE 3A CP ':' ;Is it a colon? 6087: C2 1E 62 JP NZ,ERROR ;Error if no colon 608A: 23 INC HL ;Bump pointer 608B: CD 0B 62 CALL CHECKT ;Check 2 digits 608E: 7E LD A,(HL) ;Get next Character 608F: FE 2D CP '-' ;Is it a dash? 6091: 28 09 JR Z,OKGET ;Jump if it is 6093: FE 20 CP ' ' ;Is it a space? 6095: 28 05 JR Z,OKGET ;Jump if it is 6097: FE 3A CP ':' ;Is it a colon? 6099: C2 1E 62 JP NZ,ERROR ;Error if it isn't 609C: 23 OKGET INC HL ;Bump pointer 609D: 7E LD A,(HL) ;Get next Character 609E: FE 41 CP 'A' ;Is it an "A"? 60A0: 28 04 JR Z,OKAM ;Jump if it is 60A2: FE 61 CP 'a' ;Is it an "a"? 60A4: 20 06 JR NZ,CHEKP ;If not check for "P" 60A6: AF OKAM XOR A ;Set flag for "AM" time 60A7: 32 69 63 LD (FLIP),A ;Save the flag 60AA: 18 0E JR CHEKM ;Continue 60AC: FE 50 CHEKP CP 'P' ;Is it a "P"? 60AE: 28 05 JR Z,OKPM ;Jump if it is 60B0: FE 70 CP 'p' ;Is it a "p"? 60B2: C2 1E 62 JP NZ,ERROR ;Error in time entry 60B5: 3E 01 OKPM LD A,1 ;Set flag for "PM" time 60B7: 32 69 63 LD (FLIP),A ;Save the flag 60BA: 23 CHEKM INC HL ;Bump pointer 60BB: 7E LD A,(HL) ;Get next Character 60BC: FE 4D CP 'M' ;Is it an "M"? 60BE: 28 05 JR Z,OKTIM ;Jump if it is 60C0: FE 6D CP 'm' ;Is it an "m"? 60C2: C2 1E 62 JP NZ,ERROR ;Error in time entry ; ; Convert the ASCII time to Binary ; 60C5: 21 5D 63 OKTIM LD HL,TIMEBF ;Start of input buffer 60C8: CD F8 61 CALL EVAL ;Evaluate number 60CB: FE 0D CP 13 ;Check for 0-12 60CD: D2 1E 62 JP NC,ERROR ;Value too big. Error 60D0: B7 OR A ;Check for zero 60D1: CA 1E 62 JP Z,ERROR ;Value too small. Error 60D4: 32 6D 63 LD (HOURS),A ;Save hours 60D7: 23 INC HL ;Bump pointer 60D8: CD F8 61 CALL EVAL ;Evaluate number 60DB: FE 3C CP 60 ;Check for 0-59 60DD: D2 1E 62 JP NC,ERROR ;Value too big. Error 60E0: 32 6C 63 LD (MINITE),A ;Save minutes 60E3: 23 INC HL ;Bump pointer 60E4: CD F8 61 CALL EVAL ;Evaluate number 60E7: FE 3C CP 60 ;Check for 0-59 60E9: D2 1E 62 JP NC,ERROR ;Value too big. Error 60EC: 32 6B 63 LD (SECOND),A ;Save seconds 60EF: AF XOR A ;Load A with zero 60F0: 32 6A 63 LD (CLK),A ;Zero out ticks ; ; Set up interrupt routine ; 60F3: ED 5E IM 1 ;Set interrupt mode 60F5: D3 E0 ZAP1 OUT (0E0H),A ;Reset Model III 60F7: 3E 38 ZAP2 LD A,38H ;Value to send 60F9: D3 EC ZAP3 OUT (0ECH),A ;Send value 60FB: 3E C3 LD A,0C3H ;Code for "JP ???" 60FD: 32 12 40 LD (4012H),A ;Route interrupt Vector 6100: 21 BB 67 LD HL,ISR ;Address for Vector 6103: 22 13 40 LD (4013H),HL ;Save address 6106: 3E 04 ZAP4 LD A,4 ;Value to send 6108: D3 E0 ZAP5 OUT (0E0H),A ;Send value 610A: FB EI ;Enable interrupts ; ; Main program loop ; 610B: 3A 40 38 LOOP LD A,(3840H) ;Keyboard row with BREAK 610E: CB 57 BIT 2,A ;Check BREAK key bit 6110: 28 0A JR Z,CONT ;Jump if not pressed 6112: 3A 40 38 RELES LD A,(3840H) ;Keyboard row with BREAK 6115: CB 57 BIT 2,A ;Check BREAK key bit 6117: 20 F9 JR NZ,RELES ;Jump if holding key 6119: C3 5C 60 JP MODEL3 ;Restart program 611C: 3A 6A 63 CONT LD A,(CLK) ;Get ticks 611F: FE 0F HLFTIC CP 15 ;Half second 6121: CC C3 61 CALL Z,BLKOUT ;Blank colons if half 6124: B7 OR A ;Check for zero 6125: 20 E4 JR NZ,LOOP ;Jump if no change ; ; Convert binary time to decimal ; 6127: FD 21 5D 63 CLOCK LD IY,TIMEBF ;Input buffer 612B: 3A 6D 63 LD A,(HOURS) ;Get the hour 612E: CD DE 61 CALL GETTWO ;Convert to ASCII 6131: 3A 6C 63 LD A,(MINITE) ;Get the minute 6134: CD DE 61 CALL GETTWO ;Convert to ASCII 6137: 3A 6B 63 LD A,(SECOND) ;Get the second 613A: CD DE 61 CALL GETTWO ;Convert to ASCII ; ; Clear screen buffer ; 613D: 21 BB 63 LD HL,BUFFER ;Start of buffer 6140: 11 BC 63 LD DE,BUFFER+1 ;2nd character in buffer 6143: 01 FF 03 LD BC,3FFH ;Number of bytes to move 6146: 36 80 LD (HL),80H ;Save blank in buffer 6148: ED B0 LDIR ;Clear the buffer ; ; Draw the Clock in the screen buffer ; 614A: FD 21 5D 63 LD IY,TIMEBF ;Point to time 614E: 21 83 64 LD HL,BUFFER+200 ;Location of 1st digit 6151: 11 06 00 LD DE,6 ;Offset for characters 6154: 06 08 LD B,8 ;Number of characters 6156: FD 7E 00 GETVAL LD A,(IY) ;Get digit 6159: D6 2F SUB 2FH ;Get number 1-11 615B: E5 PUSH HL ;Save HL register 615C: D5 PUSH DE ;Save DE register 615D: C5 PUSH BC ;Save BC register 615E: CD 97 61 CALL DISDIG ;Display a digit 6161: C1 POP BC ;Restore BC register 6162: D1 POP DE ;Restore DE register 6163: E1 POP HL ;Restore HL register 6164: 19 ADD HL,DE ;Add offset 6165: FD 23 INC IY ;Point to next character 6167: 10 ED DJNZ GETVAL ;Continue until done ; ; Print AM or PM in screen buffer ; 6169: 11 7E 64 LD DE,BUFFER+195 ;Location for AM and PM 616C: 21 57 63 LD HL,AM ;AM message 616F: 3A 69 63 LD A,(FLIP) ;Get flag 6172: B7 OR A ;AM or PM? 6173: 28 03 JR Z,PRINT ;Print it if AM time 6175: 23 INC HL ;Point to PM message 6176: 23 INC HL ;Bump pointer 6177: 23 INC HL ;Bump pointer 6178: CD 31 62 PRINT CALL PRSTR ;Print it ; ; Move screen buffer to screen ; 617B: 21 BB 63 LD HL,BUFFER ;Screen buffer 617E: 11 00 3C LD DE,3C00H ;Screen 6181: 01 FF 03 LD BC,3FFH ;Buffer length 6184: ED B0 LDIR ;Move it! 6186: C3 0B 61 JP LOOP ;Continue with program ; ; Clear screen routine ; 6189: 21 00 3C CLS LD HL,3C00H ;Start of screen 618C: 11 01 3C LD DE,3C01H ;2nd spot on screen 618F: 01 FF 03 LD BC,3FFH ;Length of screen minus 1 6192: 36 20 LD (HL),20H ;Put blank in first spot 6194: ED B0 LDIR ;Clear screen 6196: C9 RET ;And leave. ; ; Print digit in buffer ; 6197: E5 DISDIG PUSH HL ;Save HL register 6198: 21 67 63 LD HL,DATAB-7 ;Start of number data 619B: 11 07 00 LD DE,7 ;Offset for number data 619E: 47 LD B,A ;Get number 619F: 19 CALCST ADD HL,DE ;Add offset 61A0: 10 FD DJNZ CALCST ;Continue until done 61A2: E5 PUSH HL ;Save HL register 61A3: DD E1 POP IX ;Restore into IX register 61A5: E1 POP HL ;Restore HL register 61A6: 11 3B 00 LD DE,59 ;Line offset 61A9: 06 07 LD B,7 ;Number of Lines 61AB: C5 DISLOP PUSH BC ;Save BC register 61AC: DD 7E 00 LD A,(IX) ;Get row data 61AF: 07 RLCA ;Shift it 61B0: 07 RLCA ;Shift it again 61B1: 07 RLCA ;And again 61B2: 06 05 LD B,5 ;Number of bits to print 61B4: 07 DISROW RLCA ;Get bit in carry flag 61B5: 30 02 JR NC,CONTWT ;Skip if nothing there 61B7: 36 BF LD (HL),191 ;Turn on block in buffer 61B9: 23 CONTWT INC HL ;Update pointer 61BA: 10 F8 DJNZ DISROW ;Finish line 61BC: 19 ADD HL,DE ;Get next line 61BD: DD 23 INC IX ;Point to new data 61BF: C1 POP BC ;Restore BC register 61C0: 10 E9 DJNZ DISLOP ;Finish character 61C2: C9 RET ;Return ; ; Routine to erase both colons ; 61C3: 21 D4 3C BLKOUT LD HL,15572 ;Address of first colon 61C6: CD CC 61 CALL BLANK ;Erase first colon 61C9: 21 E6 3C LD HL,15590 ;Address of second colon 61CC: 06 07 BLANK LD B,7 ;Number of lines to erase 61CE: C5 BLKLP PUSH BC ;Save line count 61CF: 06 05 LD B,5 ;Number of bytes on line 61D1: 36 80 BLKLP2 LD (HL),128 ;Erase one character 61D3: 23 INC HL ;Point to next character 61D4: 10 FB DJNZ BLKLP2 ;Finish line 61D6: C1 POP BC ;Restore line count 61D7: 11 3B 00 LD DE,59 ;Offset for next line 61DA: 19 ADD HL,DE ;Add offset 61DB: 10 F1 DJNZ BLKLP ;Finish character 61DD: C9 RET ;And return ; ; Convert the binary number in A register ; into a two digit ASCII number and save ; 61DE: 06 FF GETTWO LD B,0FFH ;Load B with -1 61E0: 04 LOOPTW INC B ;Add one to tens counter 61E1: D6 0A SUB 10 ;Subtract ten 61E3: F2 E0 61 JP P,LOOPTW ;Jump if not below zero 61E6: C6 3A ADD A,3AH ;Least significant digit 61E8: FD 77 01 LD (IY+1),A ;Save it in buffer 61EB: 3E 30 LD A,30H ;offset for ASCII digit 61ED: 80 ADD A,B ;Most significant digit 61EE: FD 77 00 LD (IY),A ;Save it in buffer 61F1: FD 23 INC IY ;Bump pointer 61F3: FD 23 INC IY ;Bump pointer 61F5: FD 23 INC IY ;Bump pointer 61F7: C9 RET ;And return ; ; Evaluate 2-Digit number at (HL) ; 61F8: CD 06 62 EVAL CALL GETDID ;Get binary digit 61FB: 87 ADD A,A ;Digit times 2 61FC: 4F LD C,A ;Save in C register 61FD: 87 ADD A,A ;Digit times 4 61FE: 87 ADD A,A ;Digit times 8 61FF: 81 ADD A,C ;Now we have digit times 10 6200: 4F LD C,A ;Save in C register 6201: CD 06 62 CALL GETDID ;Get binary digit 6204: 81 ADD A,C ;Add to rest for number 6205: C9 RET ;Return result in A register 6206: 7E GETDID LD A,(HL) ;Get ASCII digit 6207: D6 30 SUB 30H ;Convert to binary digit 6209: 23 INC HL ;Bump pointer 620A: C9 RET ;Return binary digit ; ; Check two digits ; 620B: CD 14 62 CHECKT CALL CHECKO ;Check digit 620E: 23 INC HL ;Bump pointer 620F: CD 14 62 CALL CHECKO ;Check digit 6212: 23 INC HL ;Bump pointer 6213: C9 RET ;Return ; ; Check for legal digit ; 6214: 7E CHECKO LD A,(HL) ;Get character 6215: FE 30 CP '0' ;Check for zero 6217: 38 03 JR C,ERROR2 ;Jump if error 6219: FE 3A CP ':' ;Check for less than ":" 621B: D8 RET C ;All ok! ; ; Illegal time input ; 621C: E1 ERROR2 POP HL ;Restore stack 621D: E1 POP HL ;Restore stack 621E: 21 2B 63 ERROR LD HL,NOGOOD ;Error message 6221: 11 00 3D LD DE,3D00H ;5th line down 6224: CD 31 62 CALL PRSTR ;Print it 6227: CD 49 00 SCANEN CALL 0049H ;Wait for character 622A: FE 0D CP 0DH ;Is it ? 622C: 20 F9 JR NZ,SCANEN ;If not try again 622E: C3 5C 60 JP MODEL3 ;Get new input ; ; Print message routine ; 6231: 18 12 PRSTR JR SAME ;Jump to second routine 6233: 7E PRLOP LD A,(HL) ;Get character 6234: B7 OR A ;Check for end 6235: C8 RET Z ;Return if done 6236: FE 61 CP 'a' ;Check if less than "a" 6238: 38 06 JR C,OKPRT ;Jump if less 623A: FE 7B CP 7BH ;Check if less than 7BH 623C: 30 02 JR NC,OKPRT ;Jump if greater 623E: D6 20 SUB 20H ;Convert to UPPER CASE 6240: 12 OKPRT LD (DE),A ;Save character 6241: 13 INC DE ;Update Destination 6242: 23 INC HL ;Update source 6243: 18 EE JR PRLOP ;Continue printing 6245: 7E SAME LD A,(HL) ;Get character 6246: B7 OR A ;Check for end 6247: C8 RET Z ;Return if done 6248: 12 LD (DE),A ;Save character 6249: 13 INC DE ;Update destination 624A: 23 INC HL ;Update source 624B: 18 F8 JR SAME ;Continue printing ; ; Line input routine ; 624D: 06 0B INPUT LD B,11 ;Maximum input 624F: 21 A0 3C LD HL,3C80H+32 ;Screen location 6252: 11 5D 63 LD DE,TIMEBF ;Time buffer 6255: C5 PUSH BC ;Save BC register 6256: E5 PUSH HL ;Save HL register 6257: 36 2E INLOP1 LD (HL),2EH ;Print period on screen 6259: 23 INC HL ;Point to next place 625A: 10 FB DJNZ INLOP1 ;Continue until done 625C: E1 POP HL ;Restore HL register 625D: C1 POP BC ;Restore BC register 625E: D5 PUSH DE ;Save DE register 625F: 3E 20 LD A,20H ;Blank character 6261: 12 INLOP2 LD (DE),A ;Clear buffer 6262: 13 INC DE ;Point to next place 6263: 10 FC DJNZ INLOP2 ;Continue until done 6265: D1 POP DE ;Restore DE register 6266: 36 8F STATIN LD (HL),143 ;Print cursor 6268: D5 GETIHR PUSH DE ;Save DE register 6269: CD 49 00 CALL 0049H ;Wait for key press 626C: D1 POP DE ;Restore DE register 626D: FE 0D CP 13 ;Check for 626F: 28 2B JR Z,ENTERC ;Jump if 6271: FE 18 CP 24 ;Check for <-- 6273: 28 4C JR Z,INPLS ;Jump if it is 6275: FE 08 CP 8 ;Check for <-- 6277: 28 31 JR Z,BACKSP ;Jump if it is 6279: FE 20 CP 32 ;Check if less than 32 627B: 38 EB JR C,GETIHR ;Jump if Illegal 627D: FE 7B CP 123 ;Check if more than 122 627F: 30 E7 JR NC,GETIHR ;Jump if Illegal 6281: 4F LD C,A ;Save A register in C 6282: 78 LD A,B ;Get number of characters 6283: FE 0B CP 11 ;Check if full 6285: 28 E1 JR Z,GETIHR ;Jump if full 6287: 04 INC B ;Got one more 6288: 79 LD A,C ;Get A back from C 6289: 12 LD (DE),A ;Save in buffer 628A: 13 INC DE ;Point to next space 628B: 3A 31 62 LD A,(PRSTR) ;Get Upper/Lower flag 628E: B7 OR A ;Test for zero 628F: 79 LD A,C ;Get A back from C 6290: 20 06 JR NZ,OPRNT ;Jump if Upper/Lower case 6292: FE 61 CP 'a' ;Check if lower case 6294: 38 02 JR C,OPRNT ;Jump if not 6296: D6 20 SUB 20H ;Convert to UPPER CASE 6298: 77 OPRNT LD (HL),A ;Print on screen 6299: 23 INC HL ;Point to next space 629A: 18 CA JR STATIN ;Get next character 629C: 78 ENTERC LD A,B ;Get number of characters 629D: FE 0B CP 11 ;See if maximum 629F: 20 03 JR NZ,PEREXT ;Jump if no maximum 62A1: 36 20 LD (HL),20H ;Blank cursor 62A3: C9 RET ;And return 62A4: 36 2E PEREXT LD (HL),2EH ;Blank cursor 62A6: 3E 20 LD A,20H ;Get blank space 62A8: 12 LD (DE),A ;Put in buffer 62A9: C9 RET ;Return 62AA: 78 BACKSP LD A,B ;Get number of characters 62AB: B7 OR A ;Test for zero 62AC: 28 BA JR Z,GETIHR ;Jump if nothing there 62AE: FE 0B CP 11 ;Test for maximum 62B0: 20 05 JR NZ,PERD ;Jump if not maximum 62B2: 36 20 LD (HL),20H ;Blank out cursor 62B4: 2B DEC HL ;Backup pointer 62B5: 18 06 JR BACKAL ;Continue 62B7: 36 2E PERD LD (HL),2EH ;Print period 62B9: 2B DEC HL ;Backup pointer 62BA: 3E 20 LD A,20H ;Blank character 62BC: 12 LD (DE),A ;Put blank in buffer 62BD: 1B BACKAL DEC DE ;Backup pointer 62BE: 05 DEC B ;Backup character count 62BF: 18 A5 JR STATIN ;Continue 62C1: 78 INPLS LD A,B ;Get number of characters 62C2: B7 OR A ;Test for zero 62C3: 28 A1 JR Z,STATIN ;Jump if zero 62C5: 36 20 LD (HL),20H ;Blank cursor 62C7: C3 4D 62 JP INPUT ;Start over ; ; Messages and number data ; 62CA: 43 4C 4F 43 4B 20 38 30 WHAT DEFM "CLOCK 80 -- 01/06/83 1983 By Robert Doerr -- Model 3 Version 1.2" 62D2: 20 2D 2D 20 30 31 2F 30 62DA: 36 2F 38 33 20 31 39 38 62E2: 33 20 42 79 20 52 6F 62 62EA: 65 72 74 20 44 6F 65 72 62F2: 72 20 2D 2D 20 4D 6F 64 62FA: 65 6C 20 33 20 56 65 72 6302: 73 69 6F 6E 20 31 2E 32 630A: 00 DEFB 0 ;Terminator 630B: 45 6E 74 65 72 20 74 69 TIME DEFM "Enter time (HH:MM:SS-AM/PM) -->" 6313: 6D 65 20 28 48 48 3A 4D 631B: 4D 3A 53 53 2D 41 4D 2F 6323: 50 4D 29 20 2D 2D 3E 632A: 00 DEFB 0 ;Terminator 632B: 49 6C 6C 65 67 61 6C 20 NOGOOD DEFM "Illegal time specification. Press ." 6333: 74 69 6D 65 20 73 70 65 633B: 63 69 66 69 63 61 74 69 6343: 6F 6E 2E 20 20 50 72 65 634B: 73 73 20 3C 45 4E 54 45 6353: 52 3E 2E 6356: 00 DEFB 0 ;Terminator 6357: 41 4D AM DEFM "AM" 6359: 00 DEFB 0 635A: 50 4D DEFM "PM" 635C: 00 DEFB 0 ;Terminator 635D: 00 00 00 00 00 00 00 00 TIMEBF DEFS 12 ;Input buffer 6365: 00 00 00 00 6369: 00 FLIP DEFB 0 ;AM/PM flag 636A: 00 CLK DEFB 0 ;Ticks 636B: 00 SECOND DEFB 0 ;Seconds 636C: 00 MINITE DEFB 0 ;Minutes 636D: 00 HOURS DEFB 0 ;Hours 636E: 0E DATAB DEFB 14 ;data for zero 636F: 11 DEFB 17 6370: 13 DEFB 19 6371: 15 DEFB 21 6372: 19 DEFB 25 6373: 11 DEFB 17 6374: 0E DEFB 14 6375: 04 ONE DEFB 4 ;data for one 6376: 0C DEFB 12 6377: 04 DEFB 4 6378: 04 DEFB 4 6379: 04 DEFB 4 637A: 04 DEFB 4 637B: 0E DEFB 14 637C: 0E TWO DEFB 14 ;data for two 637D: 11 DEFB 17 637E: 01 DEFB 1 637F: 0E DEFB 14 6380: 10 DEFB 16 6381: 10 DEFB 16 6382: 1F DEFB 31 6383: 0E THREE DEFB 14 ;data for three 6384: 11 DEFB 17 6385: 01 DEFB 1 6386: 06 DEFB 6 6387: 01 DEFB 1 6388: 11 DEFB 17 6389: 0E DEFB 14 638A: 02 FOUR DEFB 2 ;data for four 638B: 06 DEFB 6 638C: 0A DEFB 10 638D: 12 DEFB 18 638E: 1F DEFB 31 638F: 02 DEFB 2 6390: 02 DEFB 2 6391: 1F FIVE DEFB 31 ;data for five 6392: 10 DEFB 16 6393: 1E DEFB 30 6394: 01 DEFB 1 6395: 01 DEFB 1 6396: 11 DEFB 17 6397: 0E DEFB 14 6398: 06 SIX DEFB 6 ;data for six 6399: 08 DEFB 8 639A: 10 DEFB 16 639B: 1E DEFB 30 639C: 11 DEFB 17 639D: 11 DEFB 17 639E: 0E DEFB 14 639F: 1F SEVEN DEFB 31 ;data for seven 63A0: 01 DEFB 1 63A1: 02 DEFB 2 63A2: 04 DEFB 4 63A3: 08 DEFB 8 63A4: 10 DEFB 16 63A5: 10 DEFB 16 63A6: 0E EIGHT DEFB 14 ;data for eight 63A7: 11 DEFB 17 63A8: 11 DEFB 17 63A9: 0E DEFB 14 63AA: 11 DEFB 17 63AB: 11 DEFB 17 63AC: 0E DEFB 14 63AD: 0E NINE DEFB 14 ;data for nine 63AE: 11 DEFB 17 63AF: 11 DEFB 17 63B0: 0F DEFB 15 63B1: 01 DEFB 1 63B2: 02 DEFB 2 63B3: 0C DEFB 12 63B4: 00 COLON DEFB 0 ;data for colon 63B5: 0E DEFB 14 63B6: 0E DEFB 14 63B7: 00 DEFB 0 63B8: 0E DEFB 14 63B9: 0E DEFB 14 63BA: 00 DEFB 0 63BB: 00 00 00 00 00 00 00 00 BUFFER DEFS 400H ;Buffer for screen 63C3: 00 00 00 00 00 00 00 00 63CB: 00 00 00 00 00 00 00 00 63D3: 00 00 00 00 00 00 00 00 63DB: 00 00 00 00 00 00 00 00 63E3: 00 00 00 00 00 00 00 00 63EB: 00 00 00 00 00 00 00 00 63F3: 00 00 00 00 00 00 00 00 63FB: 00 00 00 00 00 00 00 00 6403: 00 00 00 00 00 00 00 00 640B: 00 00 00 00 00 00 00 00 6413: 00 00 00 00 00 00 00 00 641B: 00 00 00 00 00 00 00 00 6423: 00 00 00 00 00 00 00 00 642B: 00 00 00 00 00 00 00 00 6433: 00 00 00 00 00 00 00 00 643B: 00 00 00 00 00 00 00 00 6443: 00 00 00 00 00 00 00 00 644B: 00 00 00 00 00 00 00 00 6453: 00 00 00 00 00 00 00 00 645B: 00 00 00 00 00 00 00 00 6463: 00 00 00 00 00 00 00 00 646B: 00 00 00 00 00 00 00 00 6473: 00 00 00 00 00 00 00 00 647B: 00 00 00 00 00 00 00 00 6483: 00 00 00 00 00 00 00 00 648B: 00 00 00 00 00 00 00 00 6493: 00 00 00 00 00 00 00 00 649B: 00 00 00 00 00 00 00 00 64A3: 00 00 00 00 00 00 00 00 64AB: 00 00 00 00 00 00 00 00 64B3: 00 00 00 00 00 00 00 00 64BB: 00 00 00 00 00 00 00 00 64C3: 00 00 00 00 00 00 00 00 64CB: 00 00 00 00 00 00 00 00 64D3: 00 00 00 00 00 00 00 00 64DB: 00 00 00 00 00 00 00 00 64E3: 00 00 00 00 00 00 00 00 64EB: 00 00 00 00 00 00 00 00 64F3: 00 00 00 00 00 00 00 00 64FB: 00 00 00 00 00 00 00 00 6503: 00 00 00 00 00 00 00 00 650B: 00 00 00 00 00 00 00 00 6513: 00 00 00 00 00 00 00 00 651B: 00 00 00 00 00 00 00 00 6523: 00 00 00 00 00 00 00 00 652B: 00 00 00 00 00 00 00 00 6533: 00 00 00 00 00 00 00 00 653B: 00 00 00 00 00 00 00 00 6543: 00 00 00 00 00 00 00 00 654B: 00 00 00 00 00 00 00 00 6553: 00 00 00 00 00 00 00 00 655B: 00 00 00 00 00 00 00 00 6563: 00 00 00 00 00 00 00 00 656B: 00 00 00 00 00 00 00 00 6573: 00 00 00 00 00 00 00 00 657B: 00 00 00 00 00 00 00 00 6583: 00 00 00 00 00 00 00 00 658B: 00 00 00 00 00 00 00 00 6593: 00 00 00 00 00 00 00 00 659B: 00 00 00 00 00 00 00 00 65A3: 00 00 00 00 00 00 00 00 65AB: 00 00 00 00 00 00 00 00 65B3: 00 00 00 00 00 00 00 00 65BB: 00 00 00 00 00 00 00 00 65C3: 00 00 00 00 00 00 00 00 65CB: 00 00 00 00 00 00 00 00 65D3: 00 00 00 00 00 00 00 00 65DB: 00 00 00 00 00 00 00 00 65E3: 00 00 00 00 00 00 00 00 65EB: 00 00 00 00 00 00 00 00 65F3: 00 00 00 00 00 00 00 00 65FB: 00 00 00 00 00 00 00 00 6603: 00 00 00 00 00 00 00 00 660B: 00 00 00 00 00 00 00 00 6613: 00 00 00 00 00 00 00 00 661B: 00 00 00 00 00 00 00 00 6623: 00 00 00 00 00 00 00 00 662B: 00 00 00 00 00 00 00 00 6633: 00 00 00 00 00 00 00 00 663B: 00 00 00 00 00 00 00 00 6643: 00 00 00 00 00 00 00 00 664B: 00 00 00 00 00 00 00 00 6653: 00 00 00 00 00 00 00 00 665B: 00 00 00 00 00 00 00 00 6663: 00 00 00 00 00 00 00 00 666B: 00 00 00 00 00 00 00 00 6673: 00 00 00 00 00 00 00 00 667B: 00 00 00 00 00 00 00 00 6683: 00 00 00 00 00 00 00 00 668B: 00 00 00 00 00 00 00 00 6693: 00 00 00 00 00 00 00 00 669B: 00 00 00 00 00 00 00 00 66A3: 00 00 00 00 00 00 00 00 66AB: 00 00 00 00 00 00 00 00 66B3: 00 00 00 00 00 00 00 00 66BB: 00 00 00 00 00 00 00 00 66C3: 00 00 00 00 00 00 00 00 66CB: 00 00 00 00 00 00 00 00 66D3: 00 00 00 00 00 00 00 00 66DB: 00 00 00 00 00 00 00 00 66E3: 00 00 00 00 00 00 00 00 66EB: 00 00 00 00 00 00 00 00 66F3: 00 00 00 00 00 00 00 00 66FB: 00 00 00 00 00 00 00 00 6703: 00 00 00 00 00 00 00 00 670B: 00 00 00 00 00 00 00 00 6713: 00 00 00 00 00 00 00 00 671B: 00 00 00 00 00 00 00 00 6723: 00 00 00 00 00 00 00 00 672B: 00 00 00 00 00 00 00 00 6733: 00 00 00 00 00 00 00 00 673B: 00 00 00 00 00 00 00 00 6743: 00 00 00 00 00 00 00 00 674B: 00 00 00 00 00 00 00 00 6753: 00 00 00 00 00 00 00 00 675B: 00 00 00 00 00 00 00 00 6763: 00 00 00 00 00 00 00 00 676B: 00 00 00 00 00 00 00 00 6773: 00 00 00 00 00 00 00 00 677B: 00 00 00 00 00 00 00 00 6783: 00 00 00 00 00 00 00 00 678B: 00 00 00 00 00 00 00 00 6793: 00 00 00 00 00 00 00 00 679B: 00 00 00 00 00 00 00 00 67A3: 00 00 00 00 00 00 00 00 67AB: 00 00 00 00 00 00 00 00 67B3: 00 00 00 00 00 00 00 00 ; ; Interrupt routine ; 67BB: E5 ISR PUSH HL ;Save HL register 67BC: F5 PUSH AF ;Save AF register 67BD: DB EC ZAP6 IN A,(0ECH) ;Clear interrupt 67BF: DB E0 IN A,(0E0H) ;Read interrupt status 67C1: CB 77 BIT 6,A ;Test request flag 67C3: 20 40 JR NZ,FDC ;Jump if FDC request 67C5: CB 7F BIT 7,A ;Test interrupt flag 67C7: 28 35 JR Z,XIT ;Exit if invalid 67C9: 21 6A 63 INTER LD HL,CLK ;Point to ticks 67CC: 34 INC (HL) ;Increment ticks 67CD: 7E LD A,(HL) ;Get ticks 67CE: FE 1E TICKS CP 30 ;30 Ticks (Model III) 67D0: 38 2C JR C,XIT ;Not there yet 67D2: AF XOR A ;Put Zero in A register 67D3: 77 LD (HL),A ;Reset ticks 67D4: 23 INC HL ;Point to seconds 67D5: 34 INC (HL) ;Increment seconds 67D6: 7E LD A,(HL) ;Get seconds 67D7: FE 3C CP 60 ;Increment minutes? 67D9: 38 23 JR C,XIT ;Nope. 67DB: AF XOR A ;Put zero in A register 67DC: 77 LD (HL),A ;Reset seconds 67DD: 23 INC HL ;Point to minutes 67DE: 34 INC (HL) ;Increment minutes 67DF: 7E LD A,(HL) ;Get minutes 67E0: FE 3C CP 60 ;Increment hours? 67E2: 38 1A JR C,XIT ;Nope. 67E4: AF XOR A ;Put zero in A register 67E5: 77 LD (HL),A ;Reset minutes 67E6: 23 INC HL ;Point to hours 67E7: 34 INC (HL) ;Increment hours 67E8: 7E LD A,(HL) ;Get hours 67E9: FE 0C CP 12 ;Check for swap 67EB: 28 09 JR Z,SWAP ;Swap AM and PM if 12 67ED: FE 0D CP 13 ;Flip counter? 67EF: 38 0D JR C,XIT ;Nope. 67F1: 3E 01 LD A,1 ;Set for 1 hour 67F3: 77 LD (HL),A ;Reset hours 67F4: 18 08 JR XIT ;Leave 67F6: 3A 69 63 SWAP LD A,(FLIP) ;Get AM and PM flag 67F9: EE 01 XOR 1 ;Reverse it 67FB: 32 69 63 LD (FLIP),A ;Save new flag 67FE: DB E0 XIT IN A,(0E0H) ;Reset latch 6800: 00 NOP ;No operation 6801: F1 POP AF ;Restore AF register 6802: E1 POP HL ;Restore HL register 6803: FB EI ;Enable interrupts 6804: C9 RET ;Leave 6805: DB EC FDC IN A,(0ECH) ;Reset FDC request 6807: 00 NOP ;No operation 6808: 18 BF JR INTER ;Continue