CP/M MACRO ASSEM 2.0 #001 COLD BOOT LOADER FOR VISUAL 1050 TITLE 'COLD BOOT LOADER FOR VISUAL 1050' PAGE 55 ;*******************************************************; ; ; ; COLD BOOT LOADER ; ;*******************************************************; ; ; ; V1.2 L. LAMMI 03/27/84 ; ; ; ; V1.1 S. SHERMAN 1/24/84 ; ; ; ; V1.0 K. BAILEY 4/12/83 ; ; ; ;*******************************************************; ;*******************************************************; ; ; ; THE FOLLOWING CODE IS CONTAINED IN ; ; VISUAL PART NO. IC244-032, V1050 ; ; ZBOOT FIRMWARE. ; ; ; ;*******************************************************; MACLIB Z80 MACLIB PORTS DISOUT MACRO MESSAGE LOCAL LOOP,EXIT LXI H,&MESSAGE ;POINTER TO ERROR MESSAGE LOOP: IN P$DISP$C ;GET PIO STATUS RRC ;TEST READY JRNC LOOP ;BR IF NOT MOV A,M ;GET A CHARACTER CPI '$' ;TEST TERMINATION JRZ EXIT ;BR IF IT IS OUT P$DISP$OUT ;PUT IN THE DATA REG MVI A,0EH ;STROBE OUT P$DISP$CONTROL ;. . INR A ;STROBE OFF OUT P$DISP$CONTROL ;. . INX H ;BUMP ADDRESS POINTER JR LOOP ;AND LOOP EXIT: ENDM B ASEG 0000 ORG 0000H 0000 31D9FF LXI SP,STACK ;LOAD THE STACK POINTER 0003 C36C00 JMP PIOINT ;AND CONTINUE PAGE CP/M MACRO ASSEM 2.0 #002 COLD BOOT LOADER FOR VISUAL 1050 B ASEG ;*******************************************************; ; ; ; READ DATA INTERRUPT ; ; ; ;*******************************************************; 0066 ORG 0066H ;NMI LOCATION NMI: 0066 2100D0 LXI H,0D000H ;NEW ADDRESS 0069 E9 PCHL ;JUMP TO ADDRESS IN HL REGS RETN ;AND RETURN 006A+ED45 DB 0EDH,45H PAGE CP/M MACRO ASSEM 2.0 #003 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; INITIALIZE DISPLAY ; ; ; ;*******************************************************; PIOINT: 006C 3EB4 MVI A,0B4H ;INIT THE DISPLAY PIO 006E D387 OUT P$DISP$CONTROL ;. . 0070 3E05 MVI A,5 ;SET BIT 2 OF PORT C 0072 D387 OUT P$DISP$CONTROL ;. . 0074 3E09 MVI A,9 ;SET BIT 4 OF PORT C 0076 D387 OUT P$DISP$CONTROL ;. . 0078 3E0D MVI A,0DH ;SET BIT 6 OF PORT C 007A D387 OUT P$DISP$CONTROL ;. . 007C 3E0F MVI A,0FH ;SET BIT 7 OF PORT C 007E D387 OUT P$DISP$CONTROL ;. . 0080 3E91 MVI A,91H ;A=IN;B=OUT;CLO=OUT;CHI=IN;MODE 0 0082 D39F OUT P$CLK$CONTROL ;WRITE TO 8255A PAGE CP/M MACRO ASSEM 2.0 #004 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; HASH TOTAL TEST ; ; ; ;*******************************************************; ; ;NOTE: AT THIS POINT, THE BOOT PROM HAS NOT BEEN RELOCATED... ; IT IS AT ADDRESS 0000H - 1FFFH. ; PIOI10: 0084 AF XRA A ;A=0 0085 4F MOV C,A ;CLEAR REG C (HOLDS ACCUMULATING TOTAL) ; ;START SUMMING HERE... (ADDRESS 0000H - 1FFFH) ; 0086 210000 LXI H,0000H ;STARTING ADDRESS HASH: 0089 86 ADD M ;ADD PROM DATA 008A 4F MOV C,A ;STORE VALUE 008B 23 INX H ;INCREMENT ADDRESS 008C 7C MOV A,H ;GET UPPER BYTE OF ADDRESS 008D FE20 CPI 20H ;CHECK END ADDRESS + 1 (HI BYTE) JRZ HASH1 ;DONE, SO CHECK HASH TOTAL 008F+2803 DB 28H,HASH1-$-1 0091 79 MOV A,C ;RESTORE ACCUMULATING TOTAL JR HASH ;LOOP BACK FOR NEXT ADDRESS 0092+18F5 DB 18H,HASH-$-1 HASH1: 0094 79 MOV A,C ;GET FINAL HASH TOTAL 0095 FE00 CPI 00H ;HASH TOTAL VALUE (IS IT CORRECT ?) JRNZ HASH3 ;NO -- THERE WAS AN ERROR 0097+2012 DB 20H,HASH3-$-1 0099 C3C500 JMP HASH2 ;DONE -- CONTINUE WITH RAM TEST ; ; ; HASH$ERR: 009C 0C5A383020 DB 0CH,'Z80 PROM FAIL','$' HASH3: 00AB 219C00 LXI H,HASH$ERR ;POINT TO ERROR MESSAGE HASH$ERR1: 00AE DB86 IN P$DISP$C ;GET PIO STATUS 00B0 0F RRC ;TEST READY JRNC HASH$ERR1 ;LOOP UNTIL READY 00B1+30FB DB 30H,HASH$ERR1-$-1 00B3 7E MOV A,M ;GET CHAR 00B4 FE24 CPI '$' ;TEST TERMINATION JRZ HASH$ERR2 ;IF TERMINATOR, CONTINUE 00B6+280C DB 28H,HASH$ERR2-$-1 00B8 D385 OUT P$DISP$OUT ;PUT DATA 00BA 3E0E MVI A,0EH ;STROBE 00BC D387 OUT P$DISP$CONTROL ; 00BE 3C INR A ;STROBE OFF 00BF D387 OUT P$DISP$CONTROL ; CP/M MACRO ASSEM 2.0 #005 COLD BOOT LOADER FOR VISUAL 1050 00C1 23 INX H ;INCREMENT POINTER JR HASH$ERR1 ;GO LOOK FOR ANOTHER CHARACTER 00C2+18EA DB 18H,HASH$ERR1-$-1 ; ; ; HASH$ERR2: 00C4 76 HLT ;HALT PAGE CP/M MACRO ASSEM 2.0 #006 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; MEMORY TEST ; ; ; ;*******************************************************; ; ;LOAD RAM WITH FF'S... (4000H - 0FFFFH) [BANK 0] ; HASH2: 00C5 210040 LXI H,4000H ;START ADDRESS RAM00: 00C8 3EFF MVI A,0FFH ;A=FF (DATA TO WRITE TO RAM) 00CA 77 MOV M,A ;WRITE RAM 00CB 23 INX H ;INCREMENT ADDRESS 00CC AF XRA A ;HI BYTE OF (ADDRESS + 1) 00CD BC CMP H ;CHECK END ADDRESS + 1 (HI BYTE) JRNZ RAM00 ;NOT DONE, SO DO SOME MORE 00CE+20F8 DB 20H,RAM00-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... (4000H - 0FFFFH) [BANK 0] ; 00D0 210040 LXI H,4000H ;START ADDRESS RAM01: 00D3 3EFF MVI A,0FFH ;A=FF (DATA TO LOOK FOR) 00D5 BE CMP M ;COMPARE JRNZ ERROR ;MEMORY ERROR 00D6+201C DB 20H,ERROR-$-1 00D8 23 INX H ;INCREMENT ADDRESS 00D9 AF XRA A ;HI BYTE OF (ADDRESS + 1) 00DA BC CMP H ;CHECK END ADDRESS + 1 (HI BYTE) JRNZ RAM01 ;NOT DONE, SO DO SOME MORE 00DB+20F6 DB 20H,RAM01-$-1 ; ;LOAD RAM WITH 00'S... (4000H - 0FFFFH) [BANK 0] ; 00DD 210040 LXI H,4000H ;START ADDR 00E0 AF XRA A ;A=00 (DATA TO WRITE TO RAM) RAM02: 00E1 77 MOV M,A ;WRITE RAM 00E2 23 INX H ;INCREMENT ADDR 00E3 BC CMP H ;CHECK END ADDRESS + 1 (HI BYTE) JRNZ RAM02 ;NOT DONE, SO DO SOME MORE 00E4+20FB DB 20H,RAM02-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... (4000H - 0FFFFH) [BANK 0] ; 00E6 210040 LXI H,4000H ;START ADDR 00E9 AF XRA A ;A=00 (DATA TO LOOK FOR) RAM03: 00EA BE CMP M ;COMPARE JRNZ ERROR ;MEMORY ERROR 00EB+2007 DB 20H,ERROR-$-1 00ED 23 INX H ;INCREMENT ADDRESS 00EE BC CMP H ;CHECK END ADDRESS + 1 (HI BYTE) CP/M MACRO ASSEM 2.0 #007 COLD BOOT LOADER FOR VISUAL 1050 JRNZ RAM03 ;NOT DONE, SO DO SOME MORE 00EF+20F9 DB 20H,RAM03-$-1 ; ; ; 00F1 C30E01 JMP MOVE ;GO RELOCATE MEMORY ; ; ; ERROR: 00F4 212705 LXI H,ERRMES ;GO REPORT ERROR STATS: 00F7 DB86 IN P$DISP$C ;READ STATUS 00F9 0F RRC ;ROTATE BIT JRNC STATS ;IF NOT READY, LOOP 00FA+30FB DB 30H,STATS-$-1 00FC 7E MOV A,M ;GET MESSAGE CHARACTER 00FD FE24 CPI '$' ;LOOK FOR END JRZ RTLP70 ;IF TERMINATOR, CONTINUE 00FF+280C DB 28H,RTLP70-$-1 0101 D385 OUT P$DISP$OUT ;WRITE DISPLAY 0103 3E0E MVI A,0EH ; 0105 D387 OUT P$DISP$CONTROL ;STROBE PORT 0107 3C INR A ; 0108 D387 OUT P$DISP$CONTROL ;FINISH STROBING 010A 23 INX H ; JR STATS ;GO LOOK FOR ANOTHER MESSAGE CHARACTER 010B+18EA DB 18H,STATS-$-1 ; ; ; RTLP70: 010D 76 HLT ;HALT PAGE CP/M MACRO ASSEM 2.0 #008 COLD BOOT LOADER FOR VISUAL 1050 ; ;RELOCATE PROM BASED RAM TEST TO COMMON BANKED RAM (0C000H - 0FFFFH)... [BANK 0] ; MOVE: 010E 210000 LXI H,0000H ;PROM START ADDRESS 0111 1100C0 LXI D,0C000H ;RAM START ADDRESS 0114 013B02 LXI B,MRES ;BYTE COUNT (INCLUDES ALL OF RAM TEST) ; LDIR ;MOVE BOOT PROM 0117+EDB0 DB 0EDH,0B0H ; ;RUN RAM TEST... ; 0119 211DC1 LXI H,(MAGIC1+0C000H) ;NEW ADDRESS (IN RAM) 011C E9 PCHL ;JUMP ; ; ; MAGIC1: 011D 3E01 MVI A,01H ;CODE TO DISABLE PROM 011F D3D0 OUT P$BANK$SELECT ;DISABLE PROM -- ALL RAM ENABLED ; ;CHECK RAM WHERE PROM WAS LOCATED... (0000H - 3FFFH) [BANK 0] ; ;LOAD RAM WITH FF'S... ; 0121 210000 LXI H,0000H ;START ADDRESS RAM04: 0124 3EFF MVI A,0FFH ;A=FF 0126 77 MOV M,A ;WRITE RAM 0127 23 INX H ;INCREMENT ADDRESS 0128 3E40 MVI A,40H ;HIGH ADDR BYTE 012A BC CMP H ;COMPARE JRNZ RAM04 ;BACK 012B+20F7 DB 20H,RAM04-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... ; 012D 210000 LXI H,0000H ;START ADDRESS RAM05: 0130 3EFF MVI A,0FFH ;A=FF 0132 BE CMP M ;COMPARE JRNZ ERROR2 ;MEMORY ERROR 0133+2020 DB 20H,ERROR2-$-1 0135 23 INX H ;INCREMENT ADDRESS 0136 3E40 MVI A,40H ;HIGH ADDR BYTE 0138 BC CMP H ;COMPARE JRNZ RAM05 ;BACK 0139+20F5 DB 20H,RAM05-$-1 ; ;LOAD RAM WITH 00'S... (0000H - 3FFFH) [BANK 0] ; 013B 210000 LXI H,0000H ;START ADDRESS RAM06: CP/M MACRO ASSEM 2.0 #009 COLD BOOT LOADER FOR VISUAL 1050 013E AF XRA A ;A=00 013F 77 MOV M,A ;WRITE RAM 0140 23 INX H ;INCREMENT ADDRESS 0141 3E40 MVI A,40H ;HIGH ADDR BYTE 0143 BC CMP H ;COMPARE JRNZ RAM06 ;BACK 0144+20F8 DB 20H,RAM06-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... (0000H - 3FFFH) [BANK 0] ; 0146 210000 LXI H,0000H ;START ADDRESS RAM07: 0149 AF XRA A ;A=00 014A BE CMP M ;COMPARE JRNZ ERROR2 ;MEMORY ERROR 014B+2008 DB 20H,ERROR2-$-1 014D 23 INX H ;INCREMENT ADDRESS 014E 3E40 MVI A,40H ;HIGH ADDRESS BYTE 0150 BC CMP H ;COMPARE JRNZ RAM07 ;BACK 0151+20F6 DB 20H,RAM07-$-1 JR TEST1 ;GO TO PAGE 1 0153+1833 DB 18H,TEST1-$-1 ERROR2: 0155 AF XRA A ;SET PAGE 0 BIT 0156 D3D0 OUT P$BANK$SELECT ;WRITE PROM ENABLE 0158 C3F400 JMP ERROR ;GO REPORT ERROR ; ;CHECK BANK 1 RAM... ; ;...BUT FIRST CHECK BANK SWITCHING... ; ;CURRENTLY IN BANK 0... ; BNK$ERROR: 015B AF XRA A ;MASK FOR BANK 0 & SELECTING PROM 015C D3D0 OUT P$BANK$SELECT ;SELECT BANK 015E 216401 LXI H,BNKERR ;POINT TO ERROR MESSAGE 0161 C3F700 JMP STATS ;DISPLAY MESSAGE & HALT ; 0164 42414E4B20BNKERR: DB 'BANK SELECT ERROR. SYSTEM HALTED.',0DH,0AH,'$' ; ; ; TEST1: 0188 3E11 MVI A,11H ;PATTERN FOR BANK 0 018A 320000 STA 0 ;STORE AT LOCATION 0 ; 018D 3E03 MVI A,03H ;MASK FOR SELECTING BANK 1 018F D3D0 OUT P$BANK$SELECT ;SELECT BANK 0191 3E22 MVI A,22H ;PATTERN FOR BANK 1 0193 320000 STA 0 ;STORE AT LOCATION 0 ; 0196 3E01 MVI A,01H ;MASK FOR SELECTING BANK 0 0198 D3D0 OUT P$BANK$SELECT ;SELECT BANK CP/M MACRO ASSEM 2.0 #010 COLD BOOT LOADER FOR VISUAL 1050 019A 3A0000 LDA 0 ;READ PATTERN FROM LOCATION 0 019D FE11 CPI 11H ;SAME AS WAS ORIGINALLY STORED ? JRNZ BNK$ERROR ;NO, BANK SELECT ERROR 019F+20BA DB 20H,BNK$ERROR-$-1 ; 01A1 3E05 MVI A,05H ;MASK FOR SELECTING BANK 2 01A3 D3D0 OUT P$BANK$SELECT ;SELECT BANK 01A5 3E33 MVI A,33H ;PATTERN FOR BANK 2 01A7 320000 STA 0 ;STORE AT LOCATION 0 ; 01AA 3E01 MVI A,01H ;MASK FOR SELECTING BANK 0 01AC D3D0 OUT P$BANK$SELECT ;SELECT BANK 01AE 3A0000 LDA 0 ;READ PATTERN FROM LOCATION 0 01B1 FE11 CPI 11H ;SAME AS WAS ORIGINALLY STORED ? JRNZ BNK$ERROR ;NO, BANK SELECT ERROR 01B3+20A6 DB 20H,BNK$ERROR-$-1 ; 01B5 3E03 MVI A,03H ;MASK FOR SELECTING BANK 1 01B7 D3D0 OUT P$BANK$SELECT ;SELECT BANK 01B9 3A0000 LDA 0 ;READ PATTERN FROM LOCATION 0 01BC FE22 CPI 22H ;SAME AS ORIGINALLY STORED ? JRNZ BNK$ERROR ;NO, BANK SELECT ERROR 01BE+209B DB 20H,BNK$ERROR-$-1 JR TEST1A ;LINK ADDRESS 01C0+1802 DB 18H,TEST1A-$-1 ; ERROR$LINK: JR ERROR2 ;LINK ADDRESS 01C2+1891 DB 18H,ERROR2-$-1 ; TEST1A: ; ;LOAD RAM WITH FF'S... (0000H - 0BFFFH) [BANK 1] ; 01C4 210000 LXI H,0000H ;START ADDRESS RAM08: 01C7 3EFF MVI A,0FFH ;A=FF 01C9 77 MOV M,A ;WRITE RAM 01CA 23 INX H ;INCREMENT ADDRESS 01CB 3EC0 MVI A,0C0H ;HIGH ADDRESS BYTE 01CD BC CMP H ;COMPARE JRNZ RAM08 ;BACK 01CE+20F7 DB 20H,RAM08-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... (0000H - 0BFFFH) [BANK 1] ; 01D0 210000 LXI H,0000H ;START ADDRESS RAM09: 01D3 3EFF MVI A,0FFH ;A=FF 01D5 BE CMP M ;COMPARE JRNZ ERROR$LINK ;MEMORY ERROR 01D6+20EA DB 20H,ERROR$LINK-$-1 01D8 23 INX H ;INCREMENT ADDRESS 01D9 3EC0 MVI A,0C0H ;HIGH ADDRESS BYTE 01DB BC CMP H ;COMPARE CP/M MACRO ASSEM 2.0 #011 COLD BOOT LOADER FOR VISUAL 1050 JRNZ RAM09 ;BACK 01DC+20F5 DB 20H,RAM09-$-1 ; ;LOAD RAM WITH 00'S... (0000H - 0BFFFH) [BANK 1] ; 01DE 210000 LXI H,0000H ;START ADDRESS RAM10: 01E1 AF XRA A ;A=00 01E2 77 MOV M,A ;WRITE RAM 01E3 23 INX H ;INCREMENT ADDRESS 01E4 3EC0 MVI A,0C0H ;HIGH ADDRESS BYTE 01E6 BC CMP H ;COMPARE JRNZ RAM10 ;BACK 01E7+20F8 DB 20H,RAM10-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... (0000H - 0BFFFFH) [BANK 1] ; 01E9 210000 LXI H,0000H ;START ADDRESS RAM11: 01EC AF XRA A ;A=00 01ED BE CMP M ;COMPARE JRNZ ERROR$LINK ;MEMORY ERROR 01EE+20D2 DB 20H,ERROR$LINK-$-1 01F0 23 INX H ;INCREMENT ADDRESS 01F1 3EC0 MVI A,0C0H ;HIGH ADDRESS BYTE 01F3 BC CMP H ;COMPARE JRNZ RAM11 ;BACK 01F4+20F6 DB 20H,RAM11-$-1 ; ;CHECK BANK 2 RAM... ; 01F6 3E05 MVI A,05 ;MASK FOR BANK 2 01F8 D3D0 OUT P$BANK$SELECT ;SELECT BANK ; ;LOAD RAM WITH FF'S... (0000H - 3FFFH) [BANK 2] ; 01FA 210000 LXI H,0000H ;START ADDRESS RAM12: 01FD 3EFF MVI A,0FFH ;A=FF 01FF 77 MOV M,A ;WRITE RAM 0200 23 INX H ;INCREMENT ADDRESS 0201 3E40 MVI A,40H ;HIGH ADDRESS BYTE 0203 BC CMP H ;COMPARE JRNZ RAM12 ;BACK 0204+20F7 DB 20H,RAM12-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... (0000H - 3FFFH) [BANK 2] ; 0206 210000 LXI H,0000H ;STAR ADDRESS RAM13: 0209 3EFF MVI A,0FFH ;A=FF 020B BE CMP M ;COMPARE JRNZ ERROR3 ;MEMORY ERROR 020C+2021 DB 20H,ERROR3-$-1 020E 23 INX H ;INCREMENT ADDRESS CP/M MACRO ASSEM 2.0 #012 COLD BOOT LOADER FOR VISUAL 1050 020F 3E40 MVI A,40H ;HIGH ADDRESS BYTE 0211 BC CMP H ;COMPARE JRNZ RAM13 ;BACK 0212+20F5 DB 20H,RAM13-$-1 ; ;LOAD RAM WITH 00'S... (0000H - 3FFFH) [BANK 2] ; 0214 210000 LXI H,0000H ;START ADDRESS RAM14: 0217 AF XRA A ;A=00 0218 77 MOV M,A ;WRITE RAM 0219 23 INX H ;INCREMENT ADDRESS 021A 3E40 MVI A,40H ;HIGH BYTE ADDRESS 021C BC CMP H ;COMPARE JRNZ RAM14 ;BACK 021D+20F8 DB 20H,RAM14-$-1 ; ;CHECK TO SEE IF LOADED CORRECTLY... (000H - 3FFFH) [BANK 2] ; 021F 210000 LXI H,0000H ;START ADDRESS RAM15: 0222 AF XRA A ;A=00 0223 BE CMP M ;COMPARE JRNZ ERROR3 ;MEMORY ERROR 0224+2009 DB 20H,ERROR3-$-1 0226 23 INX H ;INCREMENT ADDRESS 0227 3E40 MVI A,40H ;HIGH BYTE ADDRESS 0229 BC CMP H ;COMPARE JRNZ RAM15 ;BACK 022A+20F6 DB 20H,RAM15-$-1 ; 022C C335C2 JMP (TEST3+0C000H) ;MEMORY OK ; ERROR3: 022F AF XRA A ;SELECT BANK 0 & PROM 0230 D3D0 OUT P$BANK$SELECT ;WRITE PROM ENABLE 0232 C3F400 JMP ERROR ;GO REPORT ERROR TEST3: 0235 AF XRA A ;SELECT BANK 0 & PROM 0236 D3D0 OUT P$BANK$SELECT ;WRITE PROM ENABLE 0238 C33B02 JMP MRES ;GO BACK TO PROM PAGE CP/M MACRO ASSEM 2.0 #013 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; INITIALIZE HARDWARE ; ; ; ;*******************************************************; MRES: 023B F3 DI ;INTERRUPTS OFF 023C 3ED0 MVI A,0D0H ;RESET THE FDC 023E D394 OUT P$DISK$CONTROL ;. . 0240 3E88 MVI A,88H ;INIT THE MISC. PIO 0242 D393 OUT P$8255$CONTROL ;. . 0244 3E4F MVI A,4FH ;DESELCT; DISABLE MOTOR (LEL0384) ; MVI A,0FH ;DESELECT THE DRIVES (LEL0384) 0246 D390 OUT P$DISK$BITS ;. . ; ; RESET THE SIO CHIPS TO STOP INTERRUPTS ; 0248 AF XRA A ;RESET THE SIOS 0249 D389 OUT P$KB$CONTROL ;FIRST 3 NULL COMMANDS 024B D38D OUT P$AUX1$CONTROL ;. . 024D D389 OUT P$KB$CONTROL ;. . 024F D38D OUT P$AUX1$CONTROL ;. . 0251 D389 OUT P$KB$CONTROL ;. . 0253 D38D OUT P$AUX1$CONTROL ;. . 0255 3E40 MVI A,40H ;THEN A RESET 0257 D389 OUT P$KB$CONTROL ;. . 0259 D38D OUT P$AUX1$CONTROL ;. . 025B 3E4E MVI A,4EH ;SET UP AN ASYNCH OPERATING MODE 025D D38D OUT P$AUX1$CONTROL ;. . 025F 3C INR A ;64X ON THE KEYBOARD 0260 D389 OUT P$KB$CONTROL ;. . 0262 3E10 MVI A,10H ;AND ISSUE A COMMAND 0264 D38D OUT P$AUX1$CONTROL ;. . 0266 3E14 MVI A,14H ; 0268 D389 OUT P$KB$CONTROL ;. . ; ; 026A DB8C IN P$AUX1$DATA ;DUMMY READ OF 8251-A 026C DB88 IN P$KB$DATA ;DUMMY READ OF 8251-A ; ;NOTE: THESE TWO READS ARE FOR 'SMC' AND SIMILIAR PARTS ;---> THEN REPEAT COMMAND SEQUENCE... ; 026E 3E10 MVI A,10H ;AND ISSUE A COMMAND 0270 D38D OUT P$AUX1$CONTROL ;. . 0272 3E14 MVI A,14H ; 0274 D389 OUT P$KB$CONTROL ;. . ; ; MUST INIT THE IPT CONTROLLER HERE ; 0276 CD681F CALL INTVECTS ;SET UP INTERRUPT VECTORS ; ; CP/M MACRO ASSEM 2.0 #014 COLD BOOT LOADER FOR VISUAL 1050 IM2 ;SET INTERRUPT MODE 2 0279+ED5E DB 0EDH,5EH 027B 3EEE MVI A,0EEH ;INTERRUPT MASK 027D D39D OUT P$CLK$PORTB ;OUTPUT TO 8214 BY WAY OF 8255A 027F 3E10 MVI A,INT$INITIAL ;GET PRIORITY MASK FOR 8214 0281 D3C0 OUT INT$PORT ;CLEAR 8214 INTERRUPT CONTROLLER 0283 3E15 MVI A,15H ; 0285 D389 OUT P$KB$CONTROL ; 0287 3E80 MVI A,80H ; 0289 D388 OUT P$KB$DATA ;SEND BEEP ; 028B FB EI ; PAGE CP/M MACRO ASSEM 2.0 #015 COLD BOOT LOADER FOR VISUAL 1050 IMES1: ; (LEL0284) IMES: 028C 11CA04 LXI D,BOOMES ;DISPLAY INSERTION MESSAGE 028F CDAC04 CALL DSPMSG ;. . PAGE CP/M MACRO ASSEM 2.0 #016 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; TRY TO READ LABEL FROM WINCHESTER ; ; ; ;*******************************************************; 0292 CDA204 CALL CRLF ; ; SET UP TO READ THE LABEL OFF OF THE WINCHESTER ; TRY$ALL: 0295 3E4F MVI A,04FH ; DESELECT DRIVES (LEL0384) 0297 D390 OUT P$DISK$BITS ; (LEL0384) 0299 3E07 MVI A,07 ;SIGNAL BOOT FROM G: (LEL0284) 029B 3200C0 STA BOOT$DRV ;STORE FOR CPMLDR (LEL0284) 029E 3E06 MVI A,6 ;USE DRIVE 6 ("G") (LEL0284) 02A0 321120 STA MDRV ; (LEL0284) 02A3 210000 LXI H,0 ;TRACK 0 (LEL0284) 02A6 221220 SHLD MTRK ; (LEL0284) 02A9 AF XRA A ;SET READ FLAG (LEL0284) 02AA 321820 STA MRWFLAG ; (LEL0284) 02AD 321520 STA MSEC ;SECTOR 0 (LEL0284) 02B0 3E02 MVI A,2 ;SET UP # HEADS (LEL0384) 02B2 321420 STA MHED ;(ASSUME 5 MEG) (LEL0384) 02B5 210080 LXI H,BUFFER ;SET DMA POINTER (LEL0284) 02B8 221620 SHLD MDMAA ; (LEL0284) 02BB 3E13 MVI A,19 ;SET INTERLEAVE (LEL0284) 02BD 321920 STA MFIXMOD+0 ; (LEL0284) ; ; READ FROM WINCHESTER ; 02C0 111120 LXI D,MATBL ;POINTER TO TABLE (LEL0284) 02C3 CD2108 CALL WINCH ;TRY READING WINCH (LEL0284) 02C6 B7 ORA A ;CHECK RESULT (LEL0284) JRNZ REDO ;IF ERROR, TRY DISK (LEL0284) 02C7+2058 DB 20H,REDO-$-1 02C9 CD0504 CALL LABEL$CHK ;IF OK, CHK LABEL (LEL0284) JRNZ REDO ;IF BAD LABEL, TRY DISK (LEL0284) 02CC+2053 DB 20H,REDO-$-1 PAGE CP/M MACRO ASSEM 2.0 #017 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; READ REST OF SYSTEM ; ; FROM WINCHESTER ; ; ; ;*******************************************************; 02CE 210780 LXI H,BUFFER+7 ; GET # HEADS FROM LBL (LEL0384) 02D1 7E MOV A,M ; (LEL0384) 02D2 17 RAL ;*2 (LEL0384) 02D3 321420 STA MHED ; STORE (LEL0384) 02D6 3E01 MVI A,1 JR W$RESTX ;FIRST TIME: FOR SECT:=1 02D8+1801 DB 18H,W$RESTX-$-1 ; ; READ A TRACK ; W$ATRACK: 02DA AF XRA A ;START NEW TRACK WITH SECTOR 0 W$RESTX: 02DB 321520 STA MSEC ;SET SECTOR W$RT0: 02DE 111120 LXI D,MATBL 02E1 CD2108 CALL WINCH ;READ A SECTOR 02E4 B7 ORA A ;TEST RESULTS 02E5 C22103 JNZ REDO ;BR IF ERROR 02E8 0E2A MVI C,'*' ;FLAG GOOD READ 02EA CDB904 CALL MDSPOT ;ON CONSOLE LDED BSECSIZ ;UPDATE DMA POINTER FOR NEXT READ 02ED+ED5B DB 0EDH,5BH 02EF+0480 DW BSECSIZ 02F1 2A1620 LHLD MDMAA ;DMAA+=SECSIZE 02F4 19 DAD D ;. . 02F5 221620 SHLD MDMAA ;. . 02F8 2A5620 LHLD GOTTEN ;GOTTEN+=SECSIZE 02FB 19 DAD D ;. . 02FC 225620 SHLD GOTTEN ;. . LDED BLDLN ;(IF GOTTEN>=LOADLENGTH THEN DONE) 02FF+ED5B DB 0EDH,5BH 0301+1680 DW BLDLN 0303 EB XCHG ;SWAP REGS 0304 AF XRA A ;RESET CARRY DSBC DE ;SUBTRACT 0305+ED52 DB 0EDH,DE*8+42H 0307 DA4504 JC BYE ;BR IF DONE 030A 3A1520 LDA MSEC ;BUMP THE SECTOR 030D 3C INR A ;. . 030E 321520 STA MSEC ;. . 0311 3D DCR A ;UNTIL FINISHED WITH THE TRACK 0312 210680 LXI H,BNSECS ;. . 0315 BE CMP M ;. . JRNZ W$RT0 ;BR IF MORE ON THIS TRACK 0316+20C6 DB 20H,W$RT0-$-1 0318 2A1220 LHLD MTRK ;THEN SWITCH TRACKS CP/M MACRO ASSEM 2.0 #018 COLD BOOT LOADER FOR VISUAL 1050 031B 23 INX H ;. . 031C 221220 SHLD MTRK ;TRACK+=1 JR W$ATRACK ;AND BACK INTO LOOP 031F+18B9 DB 18H,W$ATRACK-$-1 PAGE CP/M MACRO ASSEM 2.0 #019 COLD BOOT LOADER FOR VISUAL 1050 ; ; NOT ABLE TO READ WINCHESTER. TRY READING FROM DISK. ; REDO: 0321 3E01 MVI A,1 ;SIGNAL A: DRIVE (LEL0284) 0323 3200C0 STA BOOT$DRV ;STORE FOR CPMLDR (LEL0284) 0326 AF XRA A ;USE DRIVE 0 ("A") 0327 321120 STA MDRV 032A 210000 LXI H,0 ;TRACK 0 032D 221220 SHLD MTRK 0330 321420 STA MHED ;SIDE 0 0333 3C INR A ;SECTOR 1 0334 321520 STA MSEC 0337 210080 LXI H,BUFFER ;SET DMA POINTER 033A 221620 SHLD MDMAA 033D AF XRA A ;SET READ FLAG 033E 321820 STA MRWFLAG ;SET 5" DBL DENSITY 0341 321920 STA MFIXMOD+0 ;. . 0344 3EFF MVI A,0FFH ;SET PRECOM TRACK=255 0346 321A20 STA MFIXMOD+1 ;. . 0349 3E01 MVI A,01H ;SET STEP RATE=MAX 034B 321B20 STA MFIXMOD+2 ;. . 034E 111120 LXI D,MATBL ;POINTER TO TABLE COUNT: 0351 F3 DI ; 0352 3EEA MVI A,0EAH ; 0354 D39D OUT P$CLK$PORTB ; 0356 FB EI ; 0357 3E10 MVI A,INT$INITIAL ;MASK FOR 8214 0359 D3C0 OUT INT$PORT ; 035B AF XRA A ;CLEAR ACCUM 035C 210040 LXI H,4000H ;GET TIMEOUT VALUE 035F 7E MOV A,M ;READ COUNTER VALUE 0360 3D DCR A ;DECREMENT VALUE 0361 FE00 CPI 0 ;COMPARE WITH COUNT OF 0 JRZ TIME1 ;TIME OUT FINISHED 0363+2804 DB 28H,TIME1-$-1 0365 77 MOV M,A ;PUT BACK COUNT 0366 C39803 JMP LOOP0 ;CONTINUE NORMAL TIME1: 0369 3ED0 MVI A,0D0H ;RESET FDC 036B D394 OUT P$DISK$CONTROL ; 036D 3E88 MVI A,88H ;PORTC,BIT4,RESET 036F D393 OUT P$8255$CONTROL ; 0371 3E4F MVI A,4FH ;DESELECT DRIVE 0373 D390 OUT P$DISK$BITS ; ; 0375 215005 LXI H,KEYMES ;SET ADDRESS FOR '...KEY...' MESSAGE 0378 CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; LOOP1: 037B F3 DI ;DISABLE INTERRUPTS CP/M MACRO ASSEM 2.0 #020 COLD BOOT LOADER FOR VISUAL 1050 037C AF XRA A ; 037D D39D OUT P$CLK$PORTB ;OUTPUT TO 8214 037F FB EI ;ENABLE INTERRUPTS 0380 DB89 IN P$KB$CONTROL ;READ STATUS BIT 1,A ;TEST FOR ANY KEY 0382+CB4F DB 0CBH,1*8+A+40H JRZ LOOP1 ;BACK NO KEY 0384+28F5 DB 28H,LOOP1-$-1 0386 DB88 IN P$KB$DATA ;READ CODE 0388 FE21 CPI 21H ;TEST FOR SHIFT 1 JRNZ FINISH ;BRANCH IF NOT 038A+2003 DB 20H,FINISH-$-1 038C C3440A JMP DIAGS ;GO TO INTERACTIVE TEST ;IMES1: ; JMP IMES ;TEMP JUMP FINISH: 038F F3 DI ;DISABLE INTERRUPTS 0390 3EEE MVI A,0EEH ; 0392 D39D OUT P$CLK$PORTB ; 0394 FB EI ;ENABLE INTERRUPTS 0395 C33B02 JMP MRES ;BACK TO LOAD DISC LOOP0: 0398 CD7D06 CALL FLOPPY ;EXECUTE THE OPERATION 039B B7 ORA A ;TEST RESULTS 039C C29502 JNZ TRY$ALL ;BR IF ERROR 039F CD0504 CALL LABEL$CHK ;ELSE CHECK LABEL (LEL0284) 03A2 C29502 JNZ TRY$ALL ; JUMP IF ERROR (LEL0284) PAGE CP/M MACRO ASSEM 2.0 #021 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; READ REST OF SYSTEM ; ; AS SPECIFIED BY LABEL ; ; ; ;*******************************************************; 03A5 3E02 MVI A,2 03A7 C3AC03 JMP RESTX ;FIRST TIME: FOR SECT:=2 ; ; READ A TRACK ; ATRACK: 03AA 3E01 MVI A,1 ;START NEW TRACK WITH SECTOR 1 RESTX: 03AC 321520 STA MSEC ;SET SECTOR RT0: 03AF 111120 LXI D,MATBL 03B2 CD7D06 CALL FLOPPY ;READ A SECTOR 03B5 B7 ORA A ;TEST RESULTS 03B6 C22103 JNZ REDO ;BR IF ERROR 03B9 0E2A MVI C,'*' ;FLAG GOOD READ 03BB CDB904 CALL MDSPOT ;ON CONSOLE LDED BSECSIZ ;UPDATE DMA POINTER FOR NEXT READ 03BE+ED5B DB 0EDH,5BH 03C0+0480 DW BSECSIZ 03C2 2A1620 LHLD MDMAA ;DMAA+=SECSIZE 03C5 19 DAD D ;. . 03C6 221620 SHLD MDMAA ;. . 03C9 2A5620 LHLD GOTTEN ;GOTTEN+=SECSIZE 03CC 19 DAD D ;. . 03CD 225620 SHLD GOTTEN ;. . LDED BLDLN ;(IF GOTTEN>=LOADLENGTH THEN DONE) 03D0+ED5B DB 0EDH,5BH 03D2+1680 DW BLDLN 03D4 EB XCHG ;SWAP REGS 03D5 AF XRA A ;RESET CARRY DSBC DE ;SUBTRACT 03D6+ED52 DB 0EDH,DE*8+42H JRC BYE ;BR IF DONE 03D8+386B DB 38H,BYE-$-1 03DA 3A1520 LDA MSEC ;BUMP THE SECTOR 03DD 3C INR A ;. . 03DE 321520 STA MSEC ;. . 03E1 3D DCR A ;UNTIL FINISHED WITH THE TRACK 03E2 210680 LXI H,BNSECS ;. . 03E5 BE CMP M ;. . JRNZ RT0 ;BR IF MORE ON THIS TRACK 03E6+20C7 DB 20H,RT0-$-1 03E8 3A0780 LDA BNHEDS ;TEST NUMBER OF HEADS 03EB FE01 CPI 1 ;. . JRNZ MO0$0 ;IF TWO SIDED THEN 03ED+2009 DB 20H,MO0$0-$-1 03EF 2A1220 LHLD MTRK ;THEN SWITCH TRACKS 03F2 23 INX H ;. . CP/M MACRO ASSEM 2.0 #022 COLD BOOT LOADER FOR VISUAL 1050 03F3 221220 SHLD MTRK ;TRACK+=1 JR ATRACK ;AND BACK INTO LOOP 03F6+18B2 DB 18H,ATRACK-$-1 03F8 3A1420 MO0$0: LDA MHED ;DOUBLE SIDED THEREFORE 03FB 3C INR A ;WE MUST SWITCH HEADS 03FC 321420 STA MHED ;. . ; ;***HEAD ARITHMETIC NOT COMPLETE. ;***DOES NOT ADVANCE TRACK, ;***IF MORE THAN TW0 TRACKS NEEDED ; 03FF C3AA03 JMP ATRACK ;AND BACK INTO LOOP 0402 464D54 SIGNATURE DB 'FMT' ; (LEL0284) PAGE CP/M MACRO ASSEM 2.0 #023 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; TEST VALIDITY OF LABEL ; ; ; ;*******************************************************; LABEL$CHK: ; (LEL0284) 0405 210080 LXI H,BUFFER ;POINT TO BUFFER AREA 0408 010300 LXI B,3 ;LENGTH TO MATCH (LEL0284) 040B 110204 LXI D,SIGNATURE ;WHAT TO MATCH (LEL0284) LABEL$5: ; (LEL0284) 040E 1A LDAX D ;GET SIGNATURE CHAR (LEL0284) CCI ;COMPARE (LEL0284) 040F+EDA1 DB 0EDH,0A1H 0411 13 INX D ;INC POINTER (LEL0284) 0412 C24104 JNZ LABEL$ERROR ;JUMP IF NO MATCH (LEL0284) 0415 EA0E04 JPE LABEL$5 ;LOOP WHILE BC<>0 (LEL0284) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; COMMENTED OUT 02/23/84 ; ; ; ; MOV A,M ;GET A CHAR (LEL0284) ; CPI 'F' ;TEST FOR F (LEL0284) ; JRNZ IMES1 ;BR IF NOT (LEL0284) ; INX H ;NEXT CHAR (LEL0284) ; MOV A,M ;GET A CHAR (LEL0284) ; CPI 'M' ;TEST FOR F (LEL0284) ; JRNZ IMES1 ;BR IF NOT (LEL0284) ; INX H ;NEXT CHAR (LEL0284) ; MOV A,M ;GET A CHAR (LEL0284) ; CPI 'T' ;TEST FOR F (LEL0284) ; JRNZ IMES1 ;BR IF NOT (LEL0284) ; INX H ;NEXT CHAR (LEL0284) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0418 2A1620 LHLD MDMAA ;UPDATE DMA POINTER FOR FIRST READ LDED BSECSIZ ;BY ADDING IN SECTOR SIZE 041B+ED5B DB 0EDH,5BH 041D+0480 DW BSECSIZ 041F 19 DAD D ;. . 0420 221620 SHLD MDMAA ;DMAA<=LOAD ADDRESS SDED GOTTEN ;GOTTEN<=SECSIZE 0423+ED53 DB 0EDH,53H 0425+5620 DW GOTTEN 0427 3A3880 LDA BSTEPR ;UPDATE THE STEP RATE 042A 321B20 STA MFIXMOD+2 ;. . 042D 210080 LXI H,BUFFER ; POINT TO START OF BUF (LEL0284) 0430 111600 LXI D,22 ; ADD 22 (LEL0284) 0433 19 DAD D ; GET LOAD LENGTH (LEL0284) 0434 7E MOV A,M ; GET BYTE (LEL0284) 0435 23 INX H ; POINT TO NEXT ONE (LEL0284) 0436 B6 ORA M ; BOTH = 0? (LEL0284) CP/M MACRO ASSEM 2.0 #024 COLD BOOT LOADER FOR VISUAL 1050 0437 CA4104 JZ LABEL$ERROR ; IF YES => ERROR (LEL0284) 043A 0E2A MVI C,'*' ;FLAG GOOD READ 043C CDB904 CALL MDSPOT ;ON CONSOLE 043F AF XRA A ; A=0 IF NO ERROR (LEL0284) 0440 C9 RET ; (LEL0284) LABEL$ERROR: 0441 3EFF MVI A,0FFH ; A<>0 IF ERROR (LEL0284) 0443 B7 ORA A ; (LEL0284) 0444 C9 RET ; (LEL0284) PAGE CP/M MACRO ASSEM 2.0 #025 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; DONE READING ; ; MOVE SYSTEM AND EXIT ; ; AS SPECIFIED BY LABEL ; ; ; ;*******************************************************; 0445 CDA204 BYE: CALL CRLF ;CURSOR TO NEW LINE ; ;SET UP EXIT AREA ;SET UP THE FOLLOWING SEQUENCE OF CODE INTO THE EXIT AREA ; MVI A,01H ; OUT 00H,A ; RET ; ; 0448 3E3E MVI A,3EH ;OP CODE FOR 'MVI A,' 044A 32DAFF STA EXIT+0 ;STORE AT 'EXIT' 044D 3E01 MVI A,01H ;DATA TO LOAD INTO ACC 044F 32DBFF STA EXIT+1 ;STORE AT 'EXIT'+1 0452 3ED3 MVI A,(OUT) ;OP CODE FOR AN 'OUT' INSTRUCTION 0454 32DCFF STA EXIT+2 ;STORE AT 'EXIT'+2 0457 3E00 MVI A,00H ;PORT ADDRESS FOR 'OUT' INSTRUCTION 0459 32DDFF STA EXIT+3 ;STORE AT 'EXIT'+3 045C 3EC9 MVI A,(RET) ;OP CODE FOR A 'RETURN' INSTRUCTION 045E 32DEFF STA EXIT+4 ;STORE AT 'EXIT'+4 ; ; NOW MOVE THE DATA WE HAVE READ ; ; FROM ADDRESS = BUFFER+128 ; TO ADDRESS = BEGIN ADDRESS ; COUNT = LENGTH ; FIRST MUST TEST THE MOVE CONDITIONS LDED BLDBG ;GET THE DESTINATION ADDRESS 0461+ED5B DB 0EDH,5BH 0463+1480 DW BLDBG 0465 21FF1F LXI H,2000H-1 ;START OF AVAILABLE RAM 0468 AF XRA A ;RESET CARRY DSBC D ;SUBTRACT 0469+ED52 DB 0EDH,D*8+42H JRNC MOVERR ;BR IF ERROR : TOO LOW 046B+302D DB 30H,MOVERR-$-1 046D 218080 LXI H,BUFFER+128 ;TEST BETWEEN RAM AND BUFFER 0470 AF XRA A ;CARRY OFF DSBC D ;SUBTRACT 0471+ED52 DB 0EDH,D*8+42H JRZ MOVDON ;IF THE SAME : DONE 0473+2815 DB 28H,MOVDON-$-1 LBCD BLDLN ;GET THE LENGTH 0475+ED4B DB 0EDH,4BH 0477+1680 DW BLDLN JRNC MOVOK ;BR IF LESS : OK CP/M MACRO ASSEM 2.0 #026 COLD BOOT LOADER FOR VISUAL 1050 0479+300A DB 30H,MOVOK-$-1 047B 218080 LXI H,BUFFER+128 ;CALCULATE TOP OF DATA 047E 09 DAD B ;. . 047F 23 INX H ;BUMPT BY ONE 0480 AF XRA A ;RESET CARRY DSBC D ;SUBTRACT 0481+ED52 DB 0EDH,D*8+42H JRNC MOVERR ;BR IF LESS : ERROR 0483+3015 DB 30H,MOVERR-$-1 0485 218080 MOVOK: LXI H,BUFFER+128 ;GET BEGINNING ADDRESS LDIR ;AND MOVE THE DATA 0488+EDB0 DB 0EDH,0B0H ; SET UP STARTING ADDRESS AND EXIT 048A 2A1880 MOVDON: LHLD BJMPA 048D E5 PUSH H ;PUT JMP ADDRESS ON STACK 048E 3EEA MVI A,0EAH ;RESET MASK 0490 D39D OUT P$CLK$PORTB ; 0492 3E10 MVI A,INT$INITIAL ;MASK FOR 8214 0494 D3C0 OUT INT$PORT ; 0496 FB EI ; 0497 C3DAFF JMP EXIT 049A 110505 MOVERR: LXI D,MOVMES 049D CDAC04 CALL DSPMSG ;DISPLAY ERROR MESSAGE MOVLP: JR MOVLP ;AND HANG 04A0+18FE DB 18H,MOVLP-$-1 PAGE CP/M MACRO ASSEM 2.0 #027 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; DISPLAY ROUTINES ; ; ; ;*******************************************************; 04A2 0E0D CRLF: MVI C,0DH ;FIRST SEND A CR CODE 04A4 CDB904 CALL MDSPOT ;. . 04A7 0E0A MVI C,0AH ;THEN SEND A LINE FEED 04A9 C3B904 JMP MDSPOT ;. . 04AC 1A DSPMSG: LDAX DE ;GET A CHARACTER 04AD 13 INX DE ;BUMP THE POINTER 04AE FE24 CPI '$' ;TEST FOR TERMINATION 04B0 C8 RZ ;EXIT IF IT IS 04B1 4F MOV C,A ;ELSE DISPLAY THE CHARACTER 04B2 D5 PUSH DE ;SAVE POINTER 04B3 CDB904 CALL MDSPOT ;DISPLAY IT 04B6 D1 POP DE ;RESTORE THE POINTER JR DSPMSG ;LOOP 04B7+18F3 DB 18H,DSPMSG-$-1 04B9 DB86 MDSPOT: IN P$DISP$C ;GET STATUS 04BB E601 ANI 1 ;TEST BIT 0 JRZ MDSPOT ;WAIT IF IT IS 04BD+28FA DB 28H,MDSPOT-$-1 04BF 79 MOV A,C ;GET THE CHARACTER 04C0 D385 OUT P$DISP$OUT ;AND PUT IN THE REG 04C2 3E0E MVI A,0EH ;STROBE 04C4 D387 OUT P$DISP$CONTROL ;. . 04C6 3C INR A ;STROBE OFF 04C7 D387 OUT P$DISP$CONTROL ;. . 04C9 C9 RET ;AND EXIT ; ; ; 04CA 0C56313035BOOMES: DB 0CH,'V1050 BOOT Insert system diskette in left drive.' 04FB 0D0A566572 DB 0DH,0AH,'Ver:1.2','$' ; ; 0505 424F4F5420MOVMES: DB 'BOOT V1.2 Invalid Load Address.',0DH,0AH,'$' ; ; 0527 5A3830204DERRMES: DB 'Z80 MEMORY ERROR1. SYSTEM HALTED.',0DH,0AH,'$' ; ; 054B 001B630024INIMES: DB 0,1BH,'c',0,'$' ; ; 0550 0D54797065KEYMES: DB 13,'Type any key when ready.',0DH,0AH,'$' ; ; 056C 0C494E5445ACTMES: DB 0CH,'INTERACTIVE DIAGNOSTIC TEST',0DH,0AH,'Select one:' 0595 0D0A412E20 DB 0DH,0AH,'A. KEYBOARD TEST' 05A7 0D0A422E20 DB 0DH,0AH,'B. ALIGNMENT TEST' 05BA 0D0A432E20 DB 0DH,0AH,'C. RS232 PORT TEST' CP/M MACRO ASSEM 2.0 #028 COLD BOOT LOADER FOR VISUAL 1050 05CE 0D0A442E20 DB 0DH,0AH,'D. PRINTER WINCHESTER PORT TEST' 05EF 0D0A452E20 DB 0DH,0AH,'E. EXIT DIAGNOSTICS','$' ; ; NCTMES: 0605 0C4E4F4E49 DB 0CH,'NONINTERACTIVE DIAGNOSTIC TEST' 0624 0D0A524541 DB 0DH,0AH,'REAL TIME CLOCK' 0635 0D0A53656C DB 0DH,0AH,'Select one:' 0642 0D0A412E20 DB 0DH,0AH,'A. SET REAL TIME CLOCK' 065A 0D0A422E20 DB 0DH,0AH,'B. READ REAL TIME CLOCK' 0673 0D0A432E20 DB 0DH,0AH,'C. NEXT','$' PAGE CP/M MACRO ASSEM 2.0 #029 COLD BOOT LOADER FOR VISUAL 1050 ;***************************************************************; ; ; ; FLOPPY READ/WRITE/SEEK/FORMAT ; ; ; ;***************************************************************; FLOPPY: ; ; < < < RESET FDC > > > ; 067D 3ED0 MVI A,0D0H ;(ENDS CURRENT COMMAND) 067F D394 OUT P$DISK$CONTROL 0681 210108 LXI H,FIRQ 0684 22F2FF SHLD IVECT+2 ;CLEAR DESELECT INTERRUPT. ; ; < < < GET PARAMETERS > > > ; 0687 EB XCHG ;USING ADDRESS IN DE AS SOURCE... 0688 110620 LXI D,FADR 068B 010B00 LXI B,FADRLEN LDIR ;CLONE ADDRESS TABLE 068E+EDB0 DB 0EDH,0B0H 0690 3E03 MVI A,03H 0692 D393 OUT P$8255$CONTROL ;ENABLE FDC INTERRUPT ; ; < < < SELECT MODES, DRIVE, HEAD > > > ; 0694 3A0E20 LDA FPT+0 0697 E6C0 ANI 0C0H ;DD/SD AND 5"/8" BITS 0699 47 MOV B,A ;INTO B 069A 3A0620 LDA FDRV 069D 3C INR A ;0123->1234 069E FE03 CPI 3 06A0 FAA606 JM FSEL$0 ;12 DONE 06A3 E606 ANI 06H ;34->24 06A5 87 ADD A ;24->48 DONE FSEL$0: 06A6 EE0F XRI 0FH ;1 BIT OF 4 IS 0 (DECODED DRIVE SELECT) 06A8 B0 ORA B 06A9 47 MOV B,A ;INTO B 06AA 3A0920 LDA FHED 06AD B7 ORA A 06AE CAB506 JZ FSEL$1 ;IF HEAD 1 THEN 06B1 3E10 MVI A,10H 06B3 B0 ORA B 06B4 47 MOV B,A ;SET HEAD 1 BIT IN B FI FSEL$1: 06B5 3A0720 LDA FTRK 06B8 210F20 LXI H,FPT+1 06BB BE CMP M 06BC DAC306 JC FSEL$2 ;IF TRACK>=WPRECOMP TRACK THEN CP/M MACRO ASSEM 2.0 #030 COLD BOOT LOADER FOR VISUAL 1050 06BF 3E20 MVI A,20H 06C1 B0 ORA B 06C2 47 MOV B,A ;SET WPRECOMP BIT IN B FI FSEL$2: 06C3 78 MOV A,B 06C4 D390 OUT P$DISK$BITS ;MODES,DRIVE,HEAD SELECTED PAGE CP/M MACRO ASSEM 2.0 #031 COLD BOOT LOADER FOR VISUAL 1050 ; ; < < < ACTIVATE MOTORS > > > ; 06C6 DB94 IN P$DISK$CONTROL ;IF MOTORS NOT ON 06C8 07 RLC ;(READY LINE TELLS) 06C9 D2E306 JNC FM$99 ;BR IF MOTOR IS ON 06CC DB95 IN P$DISK$TRACK ;THEN TURN MOTOR ON 06CE D397 OUT P$DISK$DATA 06D0 3E18 MVI A,18H ;DO A DUMMY SEEK TO ACTIVATE HLD 06D2 CDDD07 CALL FDOIT ;HLD RUNS MOTORS 06D5 213002 LXI H,560 ;WAIT 500 MS FM$00: 06D8 AF XRA A FM$01: 06D9 3D DCR A 06DA C2D906 JNZ FM$01 ;896US 06DD 2B DCX H 06DE 7D MOV A,L 06DF B4 ORA H 06E0 C2D806 JNZ FM$00 ;560*896US=502MS ; ; < < < ACCESS TRACK > > > ; FM$99: 06E3 3A0720 LDA FTRK ;TRACK TO C REG 06E6 4F MOV C,A 06E7 210020 LXI H,FTRKA 06EA 3A0620 LDA FDRV 06ED 5F MOV E,A 06EE 1600 MVI D,0 06F0 19 DAD D 06F1 7E MOV A,M 06F2 D395 OUT P$DISK$TRACK ;P$DISK$TRACK:=FTRKA[DRV] ; ;IF FTRKA[DRV]<>TRACK THEN ; 06F4 B9 CMP C ; 06F5 CA1607 JZ FT$99 ;BR IF FTRKA[DRV]<>TRACK 06F8 3A0420 LDA FWF ;TEST LAST OPERATION 06FB B7 ORA A ;. . 06FC CA0C07 JZ FT$50 ;BR IF IT WAS A READ 06FF 3E1D MVI A,29 ;THEN WAIT 1 MS FT$X0: 0701 3D DCR A 0702 C20107 JNZ FT$X0 ;104 US FT$X1: 0705 3D DCR A 0706 C20507 JNZ FT$X1 ;+896 US=1 MS DELAY 0709 320420 STA FWF ;RESET "LAST WAS A WRITE" FLAG FT$50: 070C 7E MOV A,M ;IF FIRST ACCESS THEN HOME DISK 070D 3C INR A ;FLAG IS FF WHEN FIRST ACCESS 070E CCAD07 CZ FHOME ;HOME IF FIRST 0711 71 MOV M,C ;FTRKA[DRV]:=TRACK CP/M MACRO ASSEM 2.0 #032 COLD BOOT LOADER FOR VISUAL 1050 0712 79 MOV A,C ;P$DISK$DATA:=TRACK 0713 CDB907 CALL FSEEK ;SEEK CORRECT TRACK FT$99: 0716 3A0A20 LDA FSEC ;SELECT SECTOR 0719 D396 OUT P$DISK$SECTOR ;P$DISK$SECTOR:=FSEC PAGE CP/M MACRO ASSEM 2.0 #033 COLD BOOT LOADER FOR VISUAL 1050 ; ; < < < DO THE DATA TRANSFER (IF ANY) > > > ; 071B AF XRA A 071C 320520 STA FTRYCNT ;CLEAR THE RETRY COUNT FTRY: 071F 210420 LXI H,FWF ;RESET "LAST WAS A WRITE" FLAG 0722 3600 MVI M,0 ;. . 0724 3A0D20 LDA FRWF ;GET OPERATION FLAGS 0727 4F MOV C,A ;TO C REG 0728 3A0920 LDA FHED ;GET HEAD 072B E601 ANI 1 ;MASK 072D 07 RLC ;SHIFT 072E 07 RLC ;. . 072F 07 RLC ;SETUP HEAD BIT 0730 0D DCR C ;TEST OPERATION 0731 0C INR C JRZ FREAD ;0:FREAD 0732+2804 DB 28H,FREAD-$-1 0734 AF XRA A ;RETURN CODE ZERO FOR SEEK 0735 C39607 JMP FDONE ;4,(OTHER):NO DATA TRANSFER ("SEEK") FREAD: 0738 F682 ORI 82H ;SET READ FLAGS PAGE CP/M MACRO ASSEM 2.0 #034 COLD BOOT LOADER FOR VISUAL 1050 ;SETUP REGISTERS FOR NMI ; EXAF ;GO TO ALTERNATE BANK 073A+08 DB 08H EXX ;. . 073B+D9 DB 0D9H 073C E5 PUSH H ;SAVE HL 073D C5 PUSH B ;SAVE BC 073E F5 PUSH PSW ;SAVE A AND FLAGS 073F 2A0B20 LHLD FDMAA ;HL TO DMA ADDRESS 0742 0E97 MVI C,P$DISK$DATA ;FLOPPY DATA REG ADDRESS EXAF ;BACK TO NORMAL BANK 0744+08 DB 08H EXX ;. . 0745+D9 DB 0D9H 0746 CDDD07 CALL FDOIT ;DO THE OPERATION EXAF ;GO TO ALTERNATE BANK 0749+08 DB 08H EXX ;. . 074A+D9 DB 0D9H 074B F1 POP PSW ;RESTORE A AND FLAGS 074C C1 POP B ;RESTORE B AND C 074D E1 POP H ;RESTORE H AND L EXAF ;BACK TO NORMAL BANK 074E+08 DB 08H EXX ;. . 074F+D9 DB 0D9H ; ;DETERMINE ERROR CODE, RETRY IF DATA ERROR, ELSE EXIT WITH ERROR ; 0750 4F MOV C,A ;RETURN CODE TO C REG 0751 B7 ORA A ;TEST SUCCESSFUL 0752 CA9607 JZ FDONE ;EXIT IF SUCCESSFUL 0755 3C INR A ;TEST FOR FF ERROR CODE 0756 3E05 MVI A,5 ;ASSUME ERROR CODE 5 0758 CA9607 JZ FDONE ;EXIT CODE 5 IF TIMED OUT BIT 6,C ;TEST WRITE PROTECT 075B+CB71 DB 0CBH,6*8+C+40H 075D 3E04 MVI A,4 ;SET RETURN CODE FOR WRITE PROTECT 075F C29607 JNZ FDONE ;EXIT IF WRITE PROTECT VIOLATION BIT 2,C ;TEST LOST DATA 0762+CB51 DB 0CBH,2*8+C+40H 0764 3E07 MVI A,7 ;SET RETURN CODE FOR LOST DATA JRNZ FRETRY ;RETRY CODE 7 IF LOST DATA 0766+2008 DB 20H,FRETRY-$-1 BIT 4,C ;TEST NOT FOUND 0768+CB61 DB 0CBH,4*8+C+40H 076A 3E02 MVI A,2 ;RETURN CODE FOR NOT FOUND JRNZ FRETRY ;RETRY CODE 2 IF NOT FOUND 076C+2002 DB 20H,FRETRY-$-1 076E 3E01 MVI A,1 ;RETRY CODE 1 IF CRC ERROR PAGE CP/M MACRO ASSEM 2.0 #035 COLD BOOT LOADER FOR VISUAL 1050 FRETRY: 0770 4F MOV C,A ;SAVE THE RETURN CODE 0771 3A0520 LDA FTRYCNT ;GET THE RETRY COUNT 0774 3C INR A ;AND BUMP IT 0775 320520 STA FTRYCNT ;. . 0778 FE0A CPI 10 ;TEST 10 RETRIES 077A 79 MOV A,C ;RETURN CODE BACK TO A REG 077B D29607 JNC FDONE ;IF 10 FAILURES: EXIT 077E 3A0520 LDA FTRYCNT ;GET THE RETRY COUNT AGAIN 0781 FE04 CPI 4 ;TEST FOR 4 OR MORE 0783 DA1F07 JC FTRY ;IF LESS THEN JUST TRY AGAIN ; ;ELSE (4 OR MORE), DO A HEAD RESTORE TOO. ; ; WE SEEK TRACK 5 THEN RESTORE IN ORDER TO ASSURE HEAD TRAVEL. ; THIS SHOULD CURE 1): PERSISTENT LINT ON THE HEADS 2): SEEK ERRORS. ; 0786 AF XRA A ;ACC = 0 0787 CDB907 CALL FSEEK ;SEEK TRACK 5 078A CDAD07 CALL FHOME ;HOME 078D 3A0720 LDA FTRK 0790 CDB907 CALL FSEEK ;BACK TO CORRECT TRACK 0793 C31F07 JMP FTRY ;AND TRY AGAIN FDONE: 0796 F5 PUSH PSW ;SAVE THE RETURN CODE 0797 DB95 IN P$DISK$TRACK 0799 D397 OUT P$DISK$DATA 079B 3E10 MVI A,10H ;SEEK CODE 079D CDDD07 CALL FDOIT ;DUMMY SEEK TO SHUT OFF HLD 07A0 210B08 LXI H,FTIRQ ;SET UP DESELECT INTERRUPT 07A3 22F2FF SHLD IVECT+2 ;. . 07A6 3ED2 MVI A,0D2H ;IPT ON READY FALL 07A8 D394 OUT P$DISK$CONTROL ;. . 07AA F1 POP PSW ;GET THE RETURN CODE 07AB B7 ORA A ;SET Z FLAG IF NO ERROR 07AC C9 RET ;AND WE ARE DONE PAGE CP/M MACRO ASSEM 2.0 #036 COLD BOOT LOADER FOR VISUAL 1050 ; SUBROUTINES ; HOME DISK FHOME: ;NOTE: ; WE DO NOT RESTORE AT THE MAXIMUM STEP RATE (6 MS PER STEP) ; BECAUSE WE HAVE SOME EARLY VERSIONS OF THE SHUGART 455 ; DOUBLE-SIDED DRIVE IN THE FIELD WHICH CANNOT BE RESTORED ; THAT FAST. (THE TRACK 0 FLAG DOESN'T RESPOND FAST ENOUGH.) 07AD 3A1020 LDA FPT+2 ;STEP RATE 07B0 E603 ANI 3 ;TEST FOR RATE = 0 JRNZ FHOM$0 ;BR IF NOT 07B2+2001 DB 20H,FHOM$0-$-1 07B4 3C INR A ;BUMP RATE UP FHOM$0: 07B5 F608 ORI 08H ;HOME,HLD,NO VERIFY JR FDOSKH ;AND DO IT 07B7+1809 DB 18H,FDOSKH-$-1 ; ;SEEK TRACK GIVEN BY ACC AT STEP RATE ; FSEEK: 07B9 D397 OUT P$DISK$DATA ;SET DATA REG TO DESIRED TRACK 07BB 3A1020 LDA FPT+2 ;STEP RATE 07BE E603 ANI 3 ;MASK 07C0 F618 ORI 18H ;SEEK,HLD,NO VERIFY ;AND DO IT ;FLOPPY COMMAND ROUTINE FOR SEEK/HOME: ;STARTS CONTROLLER WITH COMMAND FROM A. ;RETURNS WITH STATUS BYTE FROM CONTROLLER. ;DOESN'T DO TIMEOUT. DOES 20 MS SETTLE WAIT AFTER COMPLETION. ; START CONTROLLER. ; FDOSKH: 07C2 D394 OUT P$DISK$CONTROL ;ISSUE COMMAND 07C4 3E12 MVI A,18 ;DELAY AT LEAST 56 USEC FDWAIT1: 07C6 3D DCR A 07C7 C2C607 JNZ FDWAIT1 ;63 USEC ; ;WAIT FOR COMPLETION ; FS$0: 07CA DB94 IN P$DISK$CONTROL 07CC 0F RRC JRC FS$0 07CD+38FB DB 38H,FS$0-$-1 07CF DB94 IN P$DISK$CONTROL ;RETURN WITH A==STATUS BYTE. ; ;ALLOW FOR SETTLING TIME. ; 07D1 11001A LXI D,1A00H ;DELAY AT LEAST 20 MS FS$X0: 07D4 1D DCR E CP/M MACRO ASSEM 2.0 #037 COLD BOOT LOADER FOR VISUAL 1050 07D5 C2D407 JNZ FS$X0 ;896US 07D8 15 DCR D 07D9 C2D407 JNZ FS$X0 ;26*896US=23.3MS 07DC C9 RET PAGE CP/M MACRO ASSEM 2.0 #038 COLD BOOT LOADER FOR VISUAL 1050 ;FLOPPY COMMAND ROUTINE: ;STARTS CONTROLLER WITH COMMAND FROM A. ;RETURNS WITH STATUS BYTE FROM CONTROLLER ELSE 0FFH IF TIMED OUT. ;(FF IS OK AS SIGNAL BECAUSE STATUS BYTE CANNOT BE FF. (BUSY BIT CANNOT BE ;HIGH AT COMPLETION.)) ; START CONTROLLER. ; FDOIT: 07DD D394 OUT P$DISK$CONTROL ;ISSUE COMMAND ; ;(CAN'T USE ALTERNATE REGISTERS UNTIL COMPLETION ;IN CASE OPERATION INVOLVES DATA TRANSFER.) ; DELAY AT LEAST 56 USEC AFTER COMMAND. ; 07DF 3E12 MVI A,18 FDWAIT: 07E1 3D DCR A 07E2 C2E107 JNZ FDWAIT ;63 USEC ; ;WAIT FOR COMPLETION, BUT TIME OUT AFTER 1.2 SEC ; 07E5 1161EA LXI D,60000+1 FD0: 07E8 DB94 IN P$DISK$CONTROL ;GET STATUS 07EA 0F RRC ;TEST COMPLETE 07EB D2FE07 JNC FD1 ;BR IF COMPLETE 07EE 13 INX D ;(WASTE TIME) 07EF 1B DCX D ;(WASTE TIME) 07F0 13 INX D ;(WASTE TIME) 07F1 1B DCX D ;(WASTE TIME) 07F2 1B DCX D ;NOW TEST FOR TIME OUT 07F3 7A MOV A,D ;TIME OUT IF DE=0 07F4 B3 ORA E ;. . JRNZ FD0 ;20 US*60000=1.2 SEC 07F5+20F1 DB 20H,FD0-$-1 ; ;TIMED OUT ; 07F7 3ED0 MVI A,0D0H 07F9 D394 OUT P$DISK$CONTROL ;RESET FDC 07FB 3EFF MVI A,0FFH ;RETURN WITH "TIMED-OUT" SIGNAL 07FD C9 RET ; ;COMPLETION ; FD1: 07FE DB94 IN P$DISK$CONTROL ;RETURN WITH A==STATUS BYTE. 0800 C9 RET PAGE CP/M MACRO ASSEM 2.0 #039 COLD BOOT LOADER FOR VISUAL 1050 ; INTERRUPTS ;FLOPPY COMPLETION INTERRUPT: DOES NOTHING. ; FIRQ: 0801 F5 PUSH PSW ;SAVE A AND FLAGS 0802 DB94 IN P$DISK$CONTROL ;RELIEVE INTERRUPT 0804 3E10 MVI A,INT$INITIAL ;LOAD A REG WITH PRIORITY MASK 0806 D3C0 OUT INT$PORT ;RESET 8214 INTERRUPT CONTROLLER 0808 F1 POP PSW ;RESTORE 0809 FB EI ;IPTS BACK ON 080A C9 RET ;AND EXIT ; ;FLOPPY POST-COMPLETION INTERRUPT: DESELECTS DRIVE AT MOTOR SHUTOFF. ; FTIRQ: 080B F5 PUSH PSW ;SAVE A AND FLAGS 080C 3ED0 MVI A,0D0H ;RESET FDC 080E D394 OUT P$DISK$CONTROL ;RESET FDC 0810 3E02 MVI A,02H ;DISABLE INTERRUPT 0812 D393 OUT P$8255$CONTROL ;. . 0814 DB90 IN P$DISK$BITS ;DESELECT THE DRIVE 0816 F60F ORI 0FH ;. . 0818 D390 OUT P$DISK$BITS ;. . 081A 3E10 MVI A,INT$INITIAL ;LOAD A REG WITH PRIORITY MASK 081C D3C0 OUT INT$PORT ;RESET 8214 INTERRUPT CONTROLLER 081E F1 POP PSW ;RESTORE A AND FLAGS 081F FB EI ;IPTS BACK ON 0820 C9 RET ;AND RETURN PAGE CP/M MACRO ASSEM 2.0 #040 COLD BOOT LOADER FOR VISUAL 1050 ;***************************************************************; ; ; ; WINCHESTER READ/WRITE/SEEK/FORMAT ; ; ; ;***************************************************************; ;TANDON TM501 DRIVE ON XEBEC CONTROLLER ON OUR OWN HOST ADAPTOR ;ON THE WINCHESTER/GENERAL-PURPOSE CONNECTOR PORT. ;SUPPORTS 32 256-BYTE SECTORS/TRK ONLY. ;SUPPORTS ONE DRIVE ONLY. 000A = MAXBAD EQU 10 0000 = X EQU 0 0132 = CYLS EQU 306 0080 = REDUCE EQU 128 ;REDUCE CYL 0000 = PRECOMP EQU 0 ;PRECOMP CYL 000B = MAXECC EQU 11 ;MAX ECC ;GET PARAMETERS. WINCH: 0821 EB XCHG ;USING ADDRESS IN DE AS SOURCE... 0822 112920 LXI D,WADR 0825 010900 LXI B,WADRLEN LDIR ;CLONE ADDRESS TABLE 0828+EDB0 DB 0EDH,0B0H 082A 3E04 MVI A,4 ; SET UP STEP (LEL0384) 082C 323720 STA STEPM ; STORE (LEL0384) 082F 3E0B MVI A,MAXECC ; GET MAX ECC (LEL0384) 0831 323F20 STA MAXIECC ; STORE (LEL0384) 0834 213201 LXI H,CYLS ; (LEL0384) 0837 7C MOV A,H ; (REVERSE BYTES) (LEL0384) 0838 323820 STA WCB1 ; (LEL0384) 083B 7D MOV A,L ; (LEL0384) 083C 323920 STA WCB1+1 ; STORE (LEL0384) 083F 218000 LXI H,REDUCE ; (LEL0384) 0842 7C MOV A,H ; (REVERSE BYTES) (LEL0384) 0843 323B20 STA STARTRED ; (LEL0384) 0846 7D MOV A,L ; (LEL0384) 0847 323C20 STA STARTRED+1 ; STORE (LEL0384) 084A 210000 LXI H,PRECOMP ; (LEL0384) 084D 7C MOV A,H ; (REVERSE BYTES) (LEL0384) 084E 323D20 STA STARTPRE ; (LEL0384) 0851 7D MOV A,L ; (LEL0384) 0852 323E20 STA STARTPRE+1 ; STORE (LEL0384) 0855 3A2C20 LDA WHED 0858 323A20 STA HEDS CP/M MACRO ASSEM 2.0 #041 COLD BOOT LOADER FOR VISUAL 1050 ;TOP LEVEL: FIRST ACCESS, RETRIES 085B 3A6020 LDA WACCF 085E B7 ORA A 085F C26B08 JNZ W$0 ;IF FIRST ACCESS ;THEN ;RESET AND CONFIGURE THE WINCHESTER 0862 CD7B09 CALL WINRES 0865 C0 RNZ ;(RETURN A=5 IF TIME OUT ERROR) ;MARK WINCHESTER ACCESSED 0866 3EFF MVI A,0FFH 0868 326020 STA WACCF ;FI W$0: 086B CD7308 CALL WINCH2 ;TRY ONCE. 086E C8 RZ ;(DONE IF NO ERROR) 086F CD7B09 CALL WINRES ;RESET AND CONFIGURE THE WINCHESTER 0872 C0 RNZ ;(RETURN A=5 IF TIME OUT ERROR) ;JMP WINCH2;=CALL WINCH2/RET ;TRY AGAIN, ERROR CODE PASSES TO CALLER ;SECOND LEVEL WINCH2: ;IF LOGICAL READ OF TRACK 0, SECTOR 0, (I.E. ASSIMILATE OF LABEL) 0873 3A3020 LDA WRWF 0876 B7 ORA A ;(LOGICAL READ IS 00) 0877 C2BD08 JNZ W$1 087A 3A2D20 LDA WSEC 087D 2A2A20 LHLD WTRK 0880 B4 ORA H 0881 B5 ORA L 0882 C2BD08 JNZ W$1 ;THEN RESET DRIVE 0885 CD7B09 CALL WINRES 0888 C0 RNZ ;(RETURN A=5 IF TIME OUT ERROR) ;ASSIMILATE THE BAD TRACK TABLE 0889 AF XRA A 088A 326620 STA BADTRACK-1 ;DEFAULT BAD TRACK COUNT TO 0 088D 210000 LXI H,0 0890 223320 SHLD ADH ;TRACK 0, SECTOR 0 0893 2601 MVI H,1 ;BLOCK COUNT OF 1 0895 223520 SHLD ADL ;XRA A 0898 CD0509 CALL WAZ ;READ ABSOLUTE TRACK 0, SECTOR 0 089B C0 RNZ ;(RETURN A=5 IF TIME OUT ERROR) 089C 2A2E20 LHLD WDMAA ;BAD TRACK TABLE FROM DISK IS SOURCE 089F 7E MOV A,M 08A0 FE57 CPI 'W' ;"SIGNATURE" SHOULD BE "WXYZ" 08A2 C2270A JNZ RETFF 08A5 23 INX H CP/M MACRO ASSEM 2.0 #042 COLD BOOT LOADER FOR VISUAL 1050 08A6 7E MOV A,M 08A7 FE58 CPI 'X' ; BUT CHECK ONLY THE FIRST 2 BYTES 08A9 C2270A JNZ RETFF 08AC 23 INX H 08AD 23 INX H 08AE 23 INX H ;SKIP OVER THE "SIGNATURE" 08AF 7E MOV A,M 08B0 FE0B CPI MAXBAD+1 08B2 D2270A JNC RETFF ;(ERROR FF IF MORE THAN (10) BAD) 08B5 116620 LXI D,BADTRACK-1;BAD TRACK TABLE IN MEMORY IS DESTINATION 08B8 011500 LXI B,(MAXBAD*2)+1 ;ROOM FOR BAD TRACK COUNT, (10) BAD TRACKS LDIR ;MOVE IT 08BB+EDB0 DB 0EDH,0B0H ;FI W$1: ;TRACK MAPPING: SKIP RESERVED TRACK 0, NUMBER AROUND BAD TRACKS (IF ANY) 08BD 2A2A20 LHLD WTRK 08C0 EB XCHG ;DE:=TRACK 08C1 3A3020 LDA WRWF 08C4 B7 ORA A 08C5 FAE508 JM MAPDONE ;(IDENTITY MAPPING IF "ABSOLUTE" FLAG SET) 08C8 13 INX D ;TRACK+=1 (TRACK 0 RESERVED) 08C9 216620 LXI H,BADTRACK-1 08CC 4E MOV C,M 08CD 23 INX H ;C:=# OF BAD TRACKS, HL:=POINTS TO BADTRACK LIST ;SCHEME: SCAN BAD TRACK LIST. BUMP TRACK FOR EACH BAD TRACK # THAT IS ; REACHED OR PASSED. 08CE 0C INR C 08CF 0D MAPMOR: DCR C 08D0 CAE508 JZ MAPDONE ;(DONE IF OUT OF BAD TRACKS) 08D3 23 INX H 08D4 7A MOV A,D 08D5 BE CMP M 08D6 2B DCX H 08D7 C2DC08 JNZ MAP$0 08DA 7B MOV A,E 08DB BE CMP M 08DC DAE508 MAP$0: JC MAPDONE ;(DONE IF BADTRACK>TRACK) 08DF 13 INX D ;TRACK+=1 (SKIPS BAD TRACK) 08E0 23 INX H 08E1 23 INX H ;POINT TO NEXT BAD TRACK 08E2 C3CF08 JMP MAPMOR CP/M MACRO ASSEM 2.0 #043 COLD BOOT LOADER FOR VISUAL 1050 MAPDONE: 08E5 EB XCHG ;(HL=TRACK) ;ASSEMBLE "LOGICAL ADDRESS" 08E6 AF XRA A 08E7 1605 MVI D,5 08E9 29 WWW: DAD H 08EA 17 RAL 08EB 15 DCR D 08EC C2E908 JNZ WWW ;AHL:=TRACK*32 08EF 323320 STA ADH ;(DRIVE ALWAYS 0) 08F2 7C MOV A,H 08F3 323420 STA ADM 08F6 3A2D20 LDA WSEC 08F9 85 ADD L 08FA 323520 STA ADL ;AD(HML):=WTRK*32+WSEC 08FD 3E01 MVI A,1 08FF 323620 STA INTL ;SELECT OPCODE,DIRECTION 0902 3A3020 LDA WRWF 0905 2A2E20 WAZ: LHLD WDMAA 0908 010000 LXI B,0 ;B=0(=256) BYTE COUNT FOR DATA TRANSFER ;C=0 INPUT DIRECTION UNLESS CHANGED 090B E60F ANI 00FH 090D CA2309 JZ WREAD ;0=READ 0910 3D DCR A 0911 CA2809 JZ WWRITE ;1=WRITE 0914 3D DCR A 0915 CA2D09 JZ WCHECK ;2=CHECK SEC 0918 D603 SUI 3 ;3,4=NO OP 091A CA3209 JZ WFORMAT ;5=FORMAT DRIVE 091D 3D DCR A 091E CA3F09 JZ WFMTBAD ;6=FORMAT BAD TRACK 0921 AF XRA A 0922 C9 RET ;OTHER=NO OP RETURN CODE 0 0923 3E08 WREAD: MVI A,8 0925 C34A09 JMP WACTR 0928 3E0A WWRITE: MVI A,10 092A C34909 JMP WACTW 092D 3E08 WCHECK: MVI A,8 ;READ 092F C34909 JMP WACTW ;WRITE DIRECTION TO IGNORE DATA 0932 3A3120 WFORMAT:LDA WPT 0935 E61F ANI 31 CP/M MACRO ASSEM 2.0 #044 COLD BOOT LOADER FOR VISUAL 1050 0937 323620 STA INTL 093A 3E04 MVI A,4 093C C34909 JMP WACTW ;WRITE DIRECTION TO IGNORE DATA JUST IN CASE 093F 3A3120 WFMTBAD:LDA WPT 0942 E61F ANI 31 0944 323620 STA INTL 0947 3E07 MVI A,7 ;JMP WACTW ;WRITE DIRECTION TO IGNORE DATA JUST IN CASE 0949 0C WACTW: INR C;=MVI C,1 ;SET WRITE DIRECTION 094A CD8709 WACTR: CALL WDOIT 094D C8 RZ ;(RETURN OK IF OK) 094E FEFE CPI 0FEH 0950 C0 RNZ ;(RETURN ERROR (5/7) IF ERROR NOT STATUS BYTE) 0951 3E03 MVI A,3 ;"REQUEST SENSE STATUS" 0953 216220 LXI H,LSTAT ;TO LSTAT 0956 010004 LXI B,256*4;=MVI B,4/MVI C,0 ;4 BYTES IN 0959 CD8709 CALL WDOIT 095C C0 RNZ ;(RETURN ERROR STATUS (5/7/FE)) 095D 3A3020 LDA WRWF 0960 FE85 CPI 085H 0962 C27109 JNZ WEXIT ;IF FORMAT DRIVE 0965 2A2E20 LHLD WDMAA 0968 EB XCHG 0969 216320 LXI H,LSTAT+1 096C 010300 LXI B,3 LDIR ;THEN DELIVER DISK ADDRESS TO DMA ADDRESS FI 096F+EDB0 DB 0EDH,0B0H WEXIT: 0971 3A6220 LDA LSTAT 0974 E63F ANI 03FH 0976 FE04 CPI 4 ;IF THE CONTROLLER RETURNS 4 (DRIVE NOT READY) 0978 C0 RNZ 0979 3C INR A;=MVI A,5/ORA A ; THEN CHANGE IT TO 5 097A C9 RET ;RETURN CONTROLLER'S ERROR CODE ;RESET AND CONFIGURE THE WINCHESTER WINRES: 097B 3E80 MVI A,080H ; 097D D3E1 OUT P$WINCH$CONTROL ;PULSE THE RESET LINE 097F 3E0C MVI A,12 ;SET DRIVE CHARS COMMAND CP/M MACRO ASSEM 2.0 #045 COLD BOOT LOADER FOR VISUAL 1050 0981 213820 LXI H,WCB1 ;FROM DRIVE CHARS DATA 0984 010108 LXI B,256*8+1;=MVI B,8/MVI C,1 ;8 BYTES OUT ;JMP WDOIT;=CALL WDOIT/RET ;RETURN A=ERROR STATUS WDOIT: ;LOWEST LEVEL COMMAND HANDLER. ;INPUT: DATA: C: DIRECTION (0=IN,1=OUT) ; B: HOW MANY ; HL: WHERE TO GET/PUT THEM ; ; CMD: A: COMMAND BYTE ; ; ;RETURN: A: STATUS BYTE ;SETUP OPCODE 0987 323220 STA OP 098A DBE1 IN P$WINCH$CONTROL 098C E602 ANI 2 098E 3E07 MVI A,7 0990 C0 RNZ ;(RETURN ERROR 7 IF BUSY) ;SELECT CONTROLLER 0991 3E01 MVI A,1 0993 D3E0 OUT P$WINCH$DATA ;P$WINCH$DATA:=DECODED CONTROLLER SELECTION (1) ;MVI A,1 0995 D3E1 OUT P$WINCH$CONTROL ;RAISE.. 0997 3D DCR A 0998 D3E1 OUT P$WINCH$CONTROL ;..THEN LOWER.. THE SELECT LINE 099A DBE1 IN P$WINCH$CONTROL 099C 2F CMA 099D E602 ANI 2 099F 3E07 MVI A,7 09A1 C0 RNZ ;(RETURN ERROR 7 IF NOT BUSY) ;WAIT FOR REQUEST 09A2 CD120A CALL WREQT 09A5 C0 RNZ ;(RETURN A=5 IF TIME OUT ERROR) 09A6 DBE1 IN P$WINCH$CONTROL 09A8 2F CMA 09A9 E608 ANI 8 09AB 3E07 MVI A,7 09AD C0 RNZ ;(RETURN ERROR 7 IF REQUEST IS NOT COMMAND) ;JAM OUT COMMAND 09AE E5 PUSH H CP/M MACRO ASSEM 2.0 #046 COLD BOOT LOADER FOR VISUAL 1050 09AF C5 PUSH B ;CALL WSND(WCB,6) 09B0 213220 LXI H,WCB 09B3 0606 MVI B,6 09B5 CDFF09 CALL WSND 09B8 C1 POP B 09B9 E1 POP H 09BA CD0B0A CALL WREQ ;IF REQ IS DATA 09BD DBE1 IN P$WINCH$CONTROL 09BF E608 ANI 8 09C1 C2D909 JNZ NODATA ;THEN GET/PUT DATA 09C4 79 MOV A,C 09C5 B7 ORA A 09C6 F5 PUSH PSW 09C7 CCF309 CZ WREC 09CA F1 POP PSW 09CB C4FF09 CNZ WSND ;WAIT FOR REQUEST 09CE CD0B0A CALL WREQ 09D1 DBE1 IN P$WINCH$CONTROL 09D3 2F CMA 09D4 E608 ANI 8 09D6 3E07 MVI A,7 09D8 C0 RNZ ;(RETURN ERROR 7 IF REQUEST IS NOT COMMAND) ;FI NODATA: ;GET STATUS BYTE 09D9 DBE0 IN P$WINCH$DATA 09DB 326120 STA STAT 09DE 3E02 MVI A,2 09E0 D3E1 OUT P$WINCH$CONTROL ;THROW AWAY NULL STATUS BYTE 09E2 CD120A CALL WREQT 09E5 C0 RNZ ;(RETURN A=5 IF TIME OUT ERROR) 09E6 3E02 MVI A,2 09E8 D3E1 OUT P$WINCH$CONTROL 09EA 3A6120 LDA STAT 09ED E602 ANI 2 09EF C8 RZ ;(RETURN ZERO IF STATUS BYTE ZERO) 09F0 3EFE MVI A,0FEH 09F2 C9 RET ;(RETURN 0FEH IF STATUS BYTE NOT OK) ;PROCEDURE WREC(HL,B) 'RECEIVE B BYTES FROM WINCH TO (HL) WREC: CP/M MACRO ASSEM 2.0 #047 COLD BOOT LOADER FOR VISUAL 1050 09F3 0EE0 MVI C,P$WINCH$DATA 09F5 3E02 MVI A,2 ;(ONLY WORKS UP TO 256 BYTES) ;REPEAT WREC1: ;(HL):=IN(C) *HL+=1 *B-=1 09F7 EDA2 DW 0A2EDH;"INI" ;[ACKNOWLEDGE] - (SHOULD BE AUTOMATIC WITH DATA) 09F9 D3E1 OUT P$WINCH$CONTROL ;UNTIL B=0 09FB C2F709 JNZ WREC1 ;END WREC 09FE C9 RET ;PROCEDURE WSND(HL,B) 'SEND B BYTES FROM (HL) TO WINCH WSND: 09FF 0EE0 MVI C,P$WINCH$DATA 0A01 3E02 MVI A,2 ;(ONLY WORKS UP TO 256 BYTES) ;REPEAT WSND1: ;OUT(C):=(HL) *HL+=1 *B-=1 0A03 EDA3 DW 0A3EDH;"OUTI" ;[ACKNOWLEDGE] - (SHOULD BE AUTOMATIC WITH DATA) 0A05 D3E1 OUT P$WINCH$CONTROL ;UNTIL B=0 0A07 C2030A JNZ WSND1 ;END WSND 0A0A C9 RET ;WAIT FOR WINCHESTER REQUEST 0A0B CD120A WREQ: CALL WREQT 0A0E C20B0A JNZ WREQ 0A11 C9 RET ;WAIT FOR "REQUEST", RETURN Z=1 ;WAIT FOR WINCHESTER REQUEST; TIME OUT IF TOO LONG. 0A12 D5 WREQT: PUSH D 0A13 110000 LXI D,0 0A16 DBE1 WREQT1: IN P$WINCH$CONTROL 0A18 E601 ANI 1 0A1A CA250A JZ WREQT1A ;DONE IF REQUEST, RETURN Z=1 0A1D 1B DCX D 0A1E 7A MOV A,D 0A1F B3 ORA E 0A20 C2160A JNZ WREQT1 ;XRA A 0A23 F605 ORI 5 ;DONE IF TIME OUT, RETURN A=5, Z=0 0A25 D1 WREQT1A:POP D CP/M MACRO ASSEM 2.0 #048 COLD BOOT LOADER FOR VISUAL 1050 0A26 C9 RET 0A27 F6FF RETFF: ORI 0FFH 0A29 C9 RET ;END OF WINCH PAGE CP/M MACRO ASSEM 2.0 #049 COLD BOOT LOADER FOR VISUAL 1050 ; ;===== NULL INTERRUPT HANDLERS ===== ; AINT: EXTINT: ZVINT: ZDINT: XINTB: XINTA: 0A2A F3 DI ;DISABLE FURTHER INTERRUPTS 0A2B F5 PUSH PSW ;SAVE CURRENT ACC U0A2C D300 OUT VID$VERT$INT ;CLEAR VIDEO VERT INTERRUPT U0A2E D300 OUT VID$DISP$INT ;CLEAR VIDEO DISP INTERRUPT 0A30 3E10 MVI A,INT$INITIAL ;PRIORITY MASK FOR 8214 0A32 D3C0 OUT INT$PORT ;SEND TO 8214 0A34 F1 POP PSW ;RESTORE SAVED ACC 0A35 FB EI ;ENABLE INTERRUPTS 0A36 C9 RET ;RETURN FROM INTERRUPT ; ; KINT: 0A37 F3 DI ;DISABLE FURTHER INTERRUPTS U0A38 D300 OUT VID$VERT$INT ;CLEAR VIDEO VERT INTERRUPT U0A3A D300 OUT VID$DISP$INT ;CLEAR VIDEO DISP INTERRUPT 0A3C 3E10 MVI A,INT$INITIAL ;PRIORITY MASK FOR 8214 0A3E D3C0 OUT INT$PORT ;SEND TO 8214 0A40 DB88 IN P$KB$DATA ;READ 8251 DATA 0A42 FB EI ;ENABLE INTERRUPTS 0A43 C9 RET ;RETURN FROM INTERRUPT PAGE CP/M MACRO ASSEM 2.0 #050 COLD BOOT LOADER FOR VISUAL 1050 ;############################################################################# ;# # ;# V 1 0 5 0 M I C R O - D I A G N O S T I C S # ;# # ;# BY D.BANKS / S.SHERMAN DEC. 7, 1983 # ;# # ;############################################################################# ; KEY DEFINITIONS 00D4 = F1 EQU 0D4H 00D8 = F2 EQU 0D8H 00DC = F3 EQU 0DCH 00E0 = F4 EQU 0E0H 00E4 = F5 EQU 0E4H 00E8 = F6 EQU 0E8H 00EC = F7 EQU 0ECH 00F0 = F8 EQU 0F0H 00FC = F9 EQU 0FCH 0090 = F10 EQU 90H 0094 = F13 EQU 94H ; 000D = CR EQU 0DH ;CARRIAGE RETURN CHARACTER 001B = ESC EQU 1BH ;ESCAPE CHARACTER 000C = FF EQU 0CH ;FORM FEED CHARACTER 000A = LF EQU 0AH ;LINE FEED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; MAIN DIAGNOSTIC MENU ; DIAGS: 0A44 3E4F MVI A,4FH ;TURN FLOPPY MOTORS OFF AND DESELECT DRIVES 0A46 D390 OUT P$DISK$BITS ; 0A48 210A0B LXI H,DIAGM1 ;POINT TO MAIN DIAG MENU 0A4B CD7617 CALL MESDPLY ;DISPLAY MENU 0A4E CDC80E CALL GETKEY ;GET KEYBOARD INPUT IN A REG 0A51 FED4 CPI F1 ;SET CLOCK? 0A53 CC1D12 CZ CLOCK0 ;GO SET CLOCK 0A56 FED8 CPI F2 ;AUTOMATIC TESTS? 0A58 CA7D0A JZ DOAUTO ;GO DO AUTOMATIC TESTS 0A5B FEDC CPI F3 ;AUTOMATIC WITH OUT FLOPPIES ? 0A5D CA920A JZ AUTOWOF ;GO DO AUTO WITH OUT FLOPPIES 0A60 FEE0 CPI F4 ;MANUAL TESTS? 0A62 CAA40A JZ DOMANUAL ;GO DO MANUAL TESTS 0A65 FE94 CPI F13 ;IS IT AN EXIT? 0A67 CA6D0A JZ DIAGEXIT ;REBOOT 0A6A C3440A JMP DIAGS ;START OVER ; DIAGEXIT: 0A6D 3E0C MVI A,0CH ;FORM FEED CHARACTER 0A6F CDDA0E CALL PUTKEY ;SEND TO SCREEN (6502) 0A72 3E00 MVI A,0 ;NULL CHARACTER 0A74 CDDA0E CALL PUTKEY ;SEND TO SCREEN (6502) ; 0A77 AF XRA A ;MASK FOR BANK SELECT CP/M MACRO ASSEM 2.0 #051 COLD BOOT LOADER FOR VISUAL 1050 0A78 D3D0 OUT P$BANK$SELECT ;SELECT BANK 0 ; 0A7A C30000 JMP 0 ;RE-BOOT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; AUTOMATIC DIAGNOSTIC PROCESS ; DOAUTO: 0A7D CDB10F CALL MICRO8 ;ALIGNMENT CHECK 0A80 CD2A10 CALL MICRO9 ;SERIAL TEST 0A83 CDB710 CALL MICROA ;WINY/PRINTER TEST 0A86 CDED0E CALL FLOPRDY ;FLOPPY READY CHECK ; LXIX -1 ;SET IX FLAG FOR FAST MEMORY DIAGNOSTIC 0A89+DD21 DB 0DDH,21H 0A8B+FFFF DW -1 0A8D CDC715 CALL GALPAT ;MEMORY TEST ; JR DOAUTO ;LOOP FOREVER 0A90+18EB DB 18H,DOAUTO-$-1 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; AUTOMATIC DIAGNOSTIC PROCESS WITH OUT FLOPPIES ; AUTOWOF: 0A92 CDB10F CALL MICRO8 ;ALIGNMENT CHECK 0A95 CD2A10 CALL MICRO9 ;SERIAL TEST 0A98 CDB710 CALL MICROA ;WINY/PRINTER TEST ; LXIX -1 ;SET IX FLAG FOR FAST MEMORY DIAGNOSTIC 0A9B+DD21 DB 0DDH,21H 0A9D+FFFF DW -1 0A9F CDC715 CALL GALPAT ;MEMORY TEST ; JR AUTOWOF ;LOOP FOREVER 0AA2+18EE DB 18H,AUTOWOF-$-1 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; MANUAL DIAGNOSTIC MENU ; DOMANUAL: 0AA4 CD681F CALL INTVECTS ;SET UP INTERRUPT VECTORS ; 0AA7 21E80B LXI H,DIAGM2 ;POINT TO MANUAL MENU 0AAA CD7617 CALL MESDPLY ;DISPLAY MENU 0AAD CDC80E CALL GETKEY ;GET KEYBOARD INPUT 0AB0 47 MOV B,A ;SAVE KEYBOARD INPUT 0AB1 21E80A LXI H,DIAGTABLE ;POINT TO DIAG CALL TABLE DOMAN1: 0AB4 7E MOV A,M ;GET CODE FROM TABLE 0AB5 FE00 CPI 0 ;END OF TABLE? 0AB7 CAA40A JZ DOMANUAL ;GO BACK IF END 0ABA B8 CMP B ;DOES KEY MATCH TABLE? CP/M MACRO ASSEM 2.0 #052 COLD BOOT LOADER FOR VISUAL 1050 JRZ FNDCALL ;JUMP IF MATCH 0ABB+2806 DB 28H,FNDCALL-$-1 0ABD 23 INX H ;POINT TO NEXT IN TABLE 0ABE 23 INX H ; 0ABF 23 INX H ; 0AC0 C3B40A JMP DOMAN1 ;LOOP UNTIL FOUND ; FNDCALL: 0AC3 FE94 CPI F13 ;EXIT CODE? 0AC5 CA440A JZ DIAGS ;REBOOT IF YES ; 0AC8 C5 PUSH B ;SAVE KEYBOARD INPUT ; 0AC9 23 INX H ;POINT TO CALL LSB 0ACA 5E MOV E,M ;GET LSB 0ACB 23 INX H ;POINT TO CALL MSB 0ACC 56 MOV D,M ;GET MSB 0ACD 21D30A LXI H,DIAGRET ;RETURN ADDRESS 0AD0 E5 PUSH H ;TO TOP OF STACK 0AD1 EB XCHG ;PUT CALL ADDRESS IN HL 0AD2 E9 PCHL ;MAGIC CALL OF THAT ROUTINE DIAGRET: ; 0AD3 C1 POP B ;RESTORE SAVED KEYBOARD INPUT 0AD4 78 MOV A,B ;MOVE TO ACC FOR CHECKS ; 0AD5 FED8 CPI F2 ;SCREEN ALIGNMENT TEST ? 0AD7 CAE20A JZ HOLD ;WAIT FOR KEYBOARD INPUT 0ADA FEE8 CPI F6 ;READ RTC ? 0ADC CAE20A JZ HOLD ;WAIT FOR KEYBOARD INPUT ; 0ADF C3A40A JMP DOMANUAL ;START OVER ; HOLD: 0AE2 CDC80E CALL GETKEY ;GET A KEYBOARD INPUT 0AE5 C3A40A JMP DOMANUAL ;START OVER ; DIAGTABLE: 0AE8 D4 DB F1 0AE9 5A0F DW MICRO7 0AEB D8 DB F2 0AEC B10F DW MICRO8 0AEE DC DB F3 0AEF 2A10 DW MICRO9 0AF1 E0 DB F4 0AF2 B710 DW MICROA 0AF4 E4 DB F5 0AF5 1D12 DW CLOCK0 0AF7 E8 DB F6 0AF8 6A13 DW TIME$20 0AFA EC DB F7 0AFB 590D DW GALPLINK 0AFD F0 DB F8 0AFE 7F19 DW FLOP 0B00 FC DB F9 CP/M MACRO ASSEM 2.0 #053 COLD BOOT LOADER FOR VISUAL 1050 0B01 660D DW ATTTEST 0B03 90 DB F10 0B04 5F0D DW FASTLINK 0B06 94 DB F13 0B07 0000 DW 0000 0B09 00 DB 0 ;TERMINATOR ; DIAGM1: 0B0A 0C1B5B376D DB FF,ESC,'[7m' 0B0F 2056313035 DB ' V1050 MICRO-DIAGNOSTICS ',CR,LF 0B2A 1B5B6D DB ESC,'[m' 0B2D 4631202D20 DB 'F1 - Set Real Time Clock',CR,LF 0B47 4632202D20 DB 'F2 - Run Automatic Diagnostics',CR,LF 0B67 4633202D20 DB 'F3 - Run Automatic Diagnostics w/o floppies',CR,LF 0B94 4634202D20 DB 'F4 - Run Manual Diagnostics',CR,LF 0BB1 463133202D DB 'F13 - Exit Diagnostics / Reboot',CR,LF 0BD2 0A DB LF 0BD3 456E746572 DB 'Enter Selection ... ','$' ; DIAGM2: 0BE8 0C1B5B376D DB FF,ESC,'[7m' 0BED 4D616E7561 DB 'Manual Diagnostics',CR,LF 0C01 1B5B6D DB ESC,'[m' 0C04 4631202D20 DB 'F1 - Keyboard Test',CR,LF 0C18 4632202D20 DB 'F2 - Display Alignment Test',CR,LF 0C35 4633202D20 DB 'F3 - Serial Interface Test',CR,LF 0C51 4634202D20 DB 'F4 - Winchester/Printer Interface Test',CR,LF 0C79 4635202D20 DB 'F5 - Set Real Time Clock',CR,LF 0C93 4636202D20 DB 'F6 - Read Real Time Clock',CR,LF 0CAE 4637202D20 DB 'F7 - Galpat Memory Diagnostic',CR,LF 0CCD 4638202D20 DB 'F8 - Floppy Read/Write Test',CR,LF 0CEA 4639202D20 DB 'F9 - Visual Attribute Test',CR,LF 0D06 463130202D DB 'F10 - Fast Memory Diagnostic',CR,LF 0D24 463133202D DB 'F13 - Exit Manual Diagnostics',CR,LF,LF 0D44 456E746572 DB 'Enter Selection ... ','$' ; GALPLINK: LXIX 0 ;INDICATE NORMAL GALPAT TEST 0D59+DD21 DB 0DDH,21H 0D5B+0000 DW 0 JR GLINK ;GO TO COMMON CODE 0D5D+1804 DB 18H,GLINK-$-1 FASTLINK: LXIX -1 ;INDICATE FAST TEST (MKBTST) 0D5F+DD21 DB 0DDH,21H 0D61+FFFF DW -1 GLINK: 0D63 C3C715 JMP GALPAT ;JUMP TO MEMORY TESTS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;VISUAL ATTRIBUTE TEST ; ATTTEST: 0D66 21820E LXI H,NORMSCRN ;SET SCREEN TO NORNAL CP/M MACRO ASSEM 2.0 #054 COLD BOOT LOADER FOR VISUAL 1050 0D69 CD7617 CALL MESDPLY ;SEND TO 6502 ; 0D6C 0602 MVI B,2 ;SET COUNTER MOREATTS: 0D6E 21B30D LXI H,ATTMES ;GET TITLE MESSAGE 0D71 CD7617 CALL MESDPLY ;DISPLAY IT ; 0D74 78 MOV A,B ;GET PASS COUNTER 0D75 FE01 CPI 1 ;ARE WE DOING THE SECOND PASS ? JRNZ NO$MSG ;NO, SO CONTINUE 0D77+2006 DB 20H,NO$MSG-$-1 0D79 21860E LXI H,INVS$MSG ;YES, SO POINT TO 'INVERSE' MESSAGE 0D7C CD7617 CALL MESDPLY ;...DISPLAY IT ; NO$MSG: 0D7F 21D50D LXI H,DIMMES ;TEST NORMAL INTENSITY ATTRIB. 0D82 CD7617 CALL MESDPLY ;DO TEST ; 0D85 21030E LXI H,BLINKMES ;TEST BLINK ATTRIB. 0D88 CD7617 CALL MESDPLY ;DO TEST ; 0D8B 212A0E LXI H,BOLDMES ;TEST BRIGHT ATTRIB. 0D8E CD7617 CALL MESDPLY ;DO TEST ; 0D91 214F0E LXI H,REVMES ;TEST REVERSE CHARACTER VIDEO ATTRIB. 0D94 CD7617 CALL MESDPLY ;DO TEST ; 0D97 219F0E LXI H,PRESSMES ;POINT TO 'PRESS...' MESSAGE 0D9A CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; CRCHECK: 0D9D CDC80E CALL GETKEY ;GET KEYBOARD INPUT 0DA0 FE0D CPI CR ;CARRIAGE RETURN ? JRNZ CRCHECK ;NO, CHECK AGAIN 0DA2+20F9 DB 20H,CRCHECK-$-1 ; 0DA4 217E0E LXI H,REVSCRN ;REVERSE WHOLE SCREEN 0DA7 CD7617 CALL MESDPLY ;CHANGE ATTRIBUTE ; DJNZ MOREATTS ;DO ATT TEST AGAIN 0DAA+10C2 DB 10H,MOREATTS-$-1 ; 0DAC 21820E LXI H,NORMSCRN ;CHANGE BACK TO NORMAL ATTRIBUTES 0DAF CD7617 CALL MESDPLY ;CHANGE ATTRIBUTE ; 0DB2 C9 RET ;RETURN FROM TEST ; ; ATTMES: 0DB3 0C1B5B376D DB FF,ESC,'[7m' 0DB8 5649535541 DB 'VISUAL ATTRIBUTE TEST' 0DCD 1B5B6D0D0A DB ESC,'[m',CR,LF,LF,LF,'$' DIMMES: 0DD5 1B3B50 DB ESC,';P' ;SET SCREEN TO NORMAL 0DD8 5468697320 DB 'This line should be NORMAL intensity' CP/M MACRO ASSEM 2.0 #055 COLD BOOT LOADER FOR VISUAL 1050 0DFC 1B5B6D0D0A DB ESC,'[m',CR,LF,LF,'$' BLINKMES: 0E03 1B5B356D DB ESC,'[5m' ;SET BLINK ATTRIBUTE 0E07 5468697320 DB 'This line should be BLINKING' 0E23 1B5B6D0D0A DB ESC,'[m',CR,LF,LF,'$' BOLDMES: 0E2A 1B5B316D DB ESC,'[1m' ;SET SCREEN TO BRIGHT 0E2E 5468697320 DB 'This line should be BRIGHT' 0E48 1B5B6D0D0A DB ESC,'[m',CR,LF,LF,'$' REVMES: 0E4F 1B5B376D DB ESC,'[7m' ;REVERSE INTENSITY ATTRIBUTE 0E53 5468697320 DB 'This line should be in REVERSE VIDEO' 0E77 1B5B6D0D0A DB ESC,'[m',CR,LF,LF,'$' REVSCRN: 0E7E 1B3B5924 DB ESC,';Y','$' ;REVERSE WHOLE SCREEN NORMSCRN: 0E82 1B3B5124 DB ESC,';Q','$' ;NORNAL SCREEN INVS$MSG: 0E86 0D0A DB CR,LF 0E88 494E564552 DB 'INVERSE SCREEN MODE' 0E9B 0D0A0A24 DB CR,LF,LF,'$' PRESSMES: 0E9F 5072657373 DB 'Press RETURN key when ready to continue.','$' ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; GET KEY FROM KEYBOARD INTO REGISTER A ; GETKEY: 0EC8 3E14 MVI A,14H ;RESET KEYBOARD ERRORS 0ECA D389 OUT P$KB$CONTROL ; 0ECC F3 DI ;DISABLE INTERRUPTS 0ECD AF XRA A ;CLEAR INTERRUPT MASK 0ECE D39D OUT P$CLK$PORTB ; 0ED0 FB EI ;ENABLE INTERRUPTS 0ED1 DB89 IN P$KB$CONTROL ;GET KEYBOARD STATUS BYTE BIT 1,A ;CHECK RECV BIT 0ED3+CB4F DB 0CBH,1*8+A+40H JRZ GETKEY ;LOOP UNTIL KEY PRESSED 0ED5+28F1 DB 28H,GETKEY-$-1 0ED7 DB88 IN P$KB$DATA ;GET KEYBOARD DATA 0ED9 C9 RET ;RETURN TO CALLER ; PUTKEY: 0EDA F5 PUSH PSW ;SAVE CHARACTER 0EDB F5 PUSH PSW ;SAVE CHARACTER AGAIN PUTKEY1: 0EDC DB86 IN P$DISP$C ;GET DISPLAY STATUS 0EDE 0F RRC ;GET BUSY BIT JRNC PUTKEY1 ;LOOP IF BUSY 0EDF+30FB DB 30H,PUTKEY1-$-1 0EE1 F1 POP PSW ;RESTORE CHARCATER 0EE2 D385 OUT P$DISP$OUT ;SEND CHARACTER OUT TO DISPLAY 0EE4 3E0E MVI A,0EH ;SET DISPLAY STROBE LOW CP/M MACRO ASSEM 2.0 #056 COLD BOOT LOADER FOR VISUAL 1050 0EE6 D387 OUT P$DISP$CONTROL ;BANG BIT 0EE8 3C INR A ;SET DISPLAY STROBE HIGH 0EE9 D387 OUT P$DISP$CONTROL ;BANG BIT 0EEB F1 POP PSW ;GET SAVED CHARACTER 0EEC C9 RET ;RETURN FROM SUBROUTINE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; CHECK FLOPPY READY FOR BOTH DRIVES WITHIN 850MS ; FLOPRDY: 0EED 212A0F LXI H,FLRDY ;POINT TO FLOPPY TEST MESSAGE 0EF0 CD7617 CALL MESDPLY ;DISPLAY MESSAGE 0EF3 3E0E MVI A,00001110B ;FLOPPY MOTORS ON, SELECT DRIVE 0 0EF5 CD080F CALL FLOPRDY1 ;CHECK DRIVE 0 0EF8 21500F LXI H,FLDR1 ;POINT TO DRIVE 1 MESSAGE 0EFB CD7617 CALL MESDPLY ;DISPLAY MESSAGE 0EFE 3E0D MVI A,00001101B ;FLOPPY MOTORS ON, SELECT DRIVE 1 0F00 CD080F CALL FLOPRDY1 ;CHECK DRIVE 1 0F03 3E4F MVI A,01001111B ;DESELECT ALL 0F05 D390 OUT P$DISK$BITS ; 0F07 C9 RET ;RETURN TO CALLER FLOPRDY1: 0F08 D390 OUT P$DISK$BITS ;SELECT DRIVE ; 0F0A CDAD07 CALL FHOME ;RECAL DRIVE ; 0F0D 3E18 MVI A,18H ;DUMMY SEEK 0F0F CDDA1A CALL FDOIT1 ; ; 0F12 F5 PUSH PSW ;SAVE STATE 0F13 C5 PUSH B ; 0F14 014903 LXI B,0349H ;850 MILLISECOND VALUE FLOPRDY2: 0F17 CD4C1A CALL DEL1MS ;WAIT 1 MILLISECOND 0F1A 0B DCX B ;DECREMENT MILLISECOND COUNTER 0F1B 78 MOV A,B ;GET UPPER BYTE 0F1C B1 ORA C ;COMBINE WITH LOWER BYTE JRNZ FLOPRDY2 ;LOOP IF NOT DONE 0F1D+20F8 DB 20H,FLOPRDY2-$-1 0F1F C1 POP B ;RESTORE STATE 0F20 F1 POP PSW ; ; 0F21 DB94 IN P$DISK$CONTROL ;READ CONTROLLER STATUS 0F23 E680 ANI 80H ;GET READY BIT 0F25 C8 RZ ;RETURN IF OK ; FLOPERR: 0F26 C1 POP B ;CHEAT STACK 0F27 C31811 JMP ERRORA ;TELL ERROR IF NOT READY 0F2A 0C1B5B376DFLRDY: DB FF,ESC,'[7m' 0F2F 466C6F7070 DB 'Floppy Ready Check',CR,LF 0F43 1B5B6D DB ESC,'[m' 0F46 4472697665 DB 'Drive 0',CR,LF,'$' CP/M MACRO ASSEM 2.0 #057 COLD BOOT LOADER FOR VISUAL 1050 0F50 4472697665FLDR1: DB 'Drive 1',CR,LF,'$' ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;***************************************************; ; ; ; TEST A ; ; KEY BOARD TEST ; ; ; ;***************************************************; MICRO7: ; 0F5A 21800F LXI H,KEYTEST ;POINT TO MESSAGE 0F5D CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; MIC7B: 0F60 3E14 MVI A,14H ; 0F62 D389 OUT P$KB$CONTROL ;RESET BIT 0F64 F3 DI ;DIABLE INTERRUPTS 0F65 AF XRA A ; 0F66 D39D OUT P$CLK$PORTB ; 0F68 FB EI ;ENABLE INTERRUPTS 0F69 0E61 MVI C,61H ;FIRST ASCII CHARACTER TO TEST 0F6B 1671 MVI D,71H ;LAST ASCII CHARACTER TO TEST MIC7BA: 0F6D 79 MOV A,C ;GET CURRENT CHARACTER 0F6E BA CMP D ;ARE WE DONE ? 0F6F C8 RZ ;IF WE ARE, RETRUN 0F70 CDC80E CALL GETKEY ;READ A CHARACTER FROM KEYBOARD 0F73 CDDA0E CALL PUTKEY ;ECHO CHARACTER TO SCREEN 0F76 B9 CMP C ;CHECK FOR CHARACTER LIMIT JRNZ LERRORA ;INDICATE ERROR 0F77+2004 DB 20H,LERRORA-$-1 0F79 0C INR C ;C REG HAS NEXT CHARACTER TO CHECK FOR JR MIC7BA ;GO BACK 0F7A+18F1 DB 18H,MIC7BA-$-1 0F7C C9 RET ;TEST OVER LERRORA: 0F7D C31811 JMP ERRORA ;LINK ADDRESS ; ; KEYTEST: 0F80 0C1B5B376D DB FF,ESC,'[7m' 0F85 4B4559424F DB 'KEYBOARD TEST, TYPE LOWER CASE a THRU p' 0FAD 1B5B6D24 DB ESC,'[m','$' PAGE CP/M MACRO ASSEM 2.0 #058 COLD BOOT LOADER FOR VISUAL 1050 ;***************************************************; ; ; ; TEST B ; ; GRAPHIC DISPLAY ; ; ; ;***************************************************; MICRO8: 0FB1 21DE0F LXI H,AUTONLOFF ;POINT TO AUTO NEW LINE OFF MESSAGE 0FB4 CD7617 CALL MESDPLY ;TURN AUTO N.L. OFF ; 0FB7 212310 LXI H,CLS ;POINT TO SCREEN CLEAR MESSAGE 0FBA CD7617 CALL MESDPLY ;CLEAR SCREEN ; 0FBD 061A MVI B,26 ;LOAD COUNTER FOR 25 LINES + 1 XTRA ALIGNM: ; 0FBF 212510 LXI H,CURPOS ;CR/LF 0FC2 CD7617 CALL MESDPLY ;DO A CARRIAGE RETURN/LINE FEED ; 0FC5 CDD10F CALL XESS ;DISPLAY A LINE OF X'S ; DJNZ ALIGNM ;IF NOT DONE, DO SOME MORE 0FC8+10F5 DB 10H,ALIGNM-$-1 ; 0FCA 21E20F LXI H,BOX ;FINISH WITH BORDER AND TITLE 0FCD CD7617 CALL MESDPLY ;DISPLAY THEM... ; 0FD0 C9 RET ;...TEST OVER... ; ; XESS: 0FD1 C5 PUSH B ;SAVE LINE COUNTER 0FD2 0650 MVI B,80 ;CHARACTER COUNTER MOREX: 0FD4 212810 LXI H,XMES ;POINT TO 'X' CHARACTER 0FD7 CD7617 CALL MESDPLY ;DISPLAY IT ON SCREEN ; DJNZ MOREX ;CONTINUE TILL 80 ON A LINE 0FDA+10F8 DB 10H,MOREX-$-1 ; 0FDC C1 POP B ;RESTORE LINE COUNTER ; 0FDD C9 RET ;RETURN FROM SUBROUTINE ; ; AUTONLOFF: 0FDE 1B3B4424 DB ESC,';D','$' ;AUTO NEW LINE OFF SEQUENCE BOX: 0FE2 1B3F303B30 DB ESC,'?0;0C' ;GRAPHIC HOME POSITION 0FE8 1B3F363339 DB ESC,'?639;0L' ;TOP LINE 0FF0 1B3F363339 DB ESC,'?639;299L' ;RIGHT SIDE LINE 0FFA 1B3F303B32 DB ESC,'?0;299L' ;BOTTOM LINE 1002 1B3F303B30 DB ESC,'?0;0L' ;LEFT SIDE LINE 1008 1B5B31313B DB ESC,'[11;31f' ;LINE 12, COLUMN 32 CP/M MACRO ASSEM 2.0 #059 COLD BOOT LOADER FOR VISUAL 1050 1010 2053637265 DB ' Screen Alignment ' ;TITLE 1022 24 DB '$' ;MESSAGE TERMINATOR CLS: 1023 0C24 DB FF,'$' ;FORM FEED CHARACTER CURPOS: 1025 0D0A24 DB CR,LF,'$' ;CR/LF SEQUENCE XMES: 1028 5824 DB 'X','$' ;'X' CHARACTER ; ; PAGE CP/M MACRO ASSEM 2.0 #060 COLD BOOT LOADER FOR VISUAL 1050 ;*************************************************; ; ; ; TEST C ; ; RS232 PORT TEST ; ; ; ;*************************************************; MICRO9: 102A 217A10 LXI H,SERIALTST ;POINT TO MESSAGE ; 102D CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; MIC9B: ; 1030 3E2E MVI A,2EH ; 1032 D39D OUT P$CLK$PORTB 1034 AF XRA A ; 1035 D38D OUT P$AUX1$CONTROL ; 1037 D38D OUT P$AUX1$CONTROL ; 1039 D38D OUT P$AUX1$CONTROL ; 103B 3E40 MVI A,40H ; 103D D38D OUT P$AUX1$CONTROL ; 103F 3E4D MVI A,4DH ; 1041 D38D OUT P$AUX1$CONTROL ; 1043 3E15 MVI A,15H ; 1045 D38D OUT P$AUX1$CONTROL ; MIC9D: 1047 DB8D IN P$AUX1$CONTROL ;TEST TRANSMIT READY BIT 0,A ; BIT TEST 1049+CB47 DB 0CBH,0*8+A+40H JRZ MIC9D ;NO BIT SET 104B+28FA DB 28H,MIC9D-$-1 104D 3E55 MVI A,55H ;DATA PATTERN 104F D38C OUT P$AUX1$DATA ;WRITE RS232 PORT 1051 CDA910 CALL DEL1SEC ;WAIT 1 SECOND MIC9E: 1054 DB8D IN P$AUX1$CONTROL ;RECEIVE READY BIT 1,A ;TEST BIT 1056+CB4F DB 0CBH,1*8+A+40H JRZ ERROR0 ;NO BIT SET 1058+284C DB 28H,ERROR0-$-1 105A DB8C IN P$AUX1$DATA ;READ RS232 PORT 105C FE55 CPI 55H ;COMPARE DATA JRNZ ERROR0 ;RS232 LOOPBACK ERROR 105E+2046 DB 20H,ERROR0-$-1 MIC9F: 1060 DB8D IN P$AUX1$CONTROL ;TEST TRANSMIT READY BIT 0,A ;BIT SET 1062+CB47 DB 0CBH,0*8+A+40H JRZ MIC9F ;NO BIT SET 1064+28FA DB 28H,MIC9F-$-1 1066 3EAA MVI A,0AAH ;DATA PATTERN 1068 D38C OUT P$AUX1$DATA ;WRITE RS232 PORT 106A CDA910 CALL DEL1SEC ;WAIT 1 SECOND MIC9G: CP/M MACRO ASSEM 2.0 #061 COLD BOOT LOADER FOR VISUAL 1050 106D DB8D IN P$AUX1$CONTROL ;RECEIVE READY BIT 1,A ;TEST BIT 106F+CB4F DB 0CBH,1*8+A+40H JRZ ERROR0 ;NO BIT SET 1071+2833 DB 28H,ERROR0-$-1 1073 DB8C IN P$AUX1$DATA ;READ RS232 PORT 1075 FEAA CPI 0AAH ;COMPARE DATA JRNZ ERROR0 ;RS232 LOOPBACK ERROR 1077+202D DB 20H,ERROR0-$-1 ; 1079 C9 RET ;TEST OVER TEMP JUMP ; SERIALTST: 107A 0C1B5B376D DB FF,ESC,'[7m' 107F 5345524941 DB 'SERIAL PORT TEST',CR,LF 1091 4C4F4F5042 DB 'LOOPBACK REQUIRED' 10A2 1B5B6D24 DB ESC,'[m','$' ; ERROR0: 10A6 C31811 JMP ERRORA ;GO TO ERROR DISPLAY ; ; DEL1SEC: ;DELAY 1 SECOND 10A9 C5 PUSH B ;SAVE BC REGISTER PAIR 10AA 01E803 LXI B,1000 ;1000 MSECS DEL1SECA: 10AD CD4C1A CALL DEL1MS ;DELAY 1 MILLISECOND 10B0 0B DCX B ;DECREMENT DELAY COUNT 10B1 78 MOV A,B ;GET UPPER BYTE OF DELAY COUNT 10B2 B1 ORA C ;COMBINE WITH LOWER BYTE JRNZ DEL1SECA ;IF NOT DONE, DO SOME MORE 10B3+20F8 DB 20H,DEL1SECA-$-1 10B5 C1 POP B ;RESTORE BC REGISTERS 10B6 C9 RET ;RETURN FROM SUBROUTINE PAGE CP/M MACRO ASSEM 2.0 #062 COLD BOOT LOADER FOR VISUAL 1050 ;******************************************************; ; ; ; TEST D ; ; PRINTER WINCHESTER PORT TEST ; ; ; ;******************************************************; MICROA: 10B7 21DE10 LXI H,WINYTST ;POINT TO MESSAGE ; 10BA CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; 10BD CDA910 CALL DEL1SEC ;WAIT 1 SECOND 10C0 CDA910 CALL DEL1SEC ;WAIT 1 SECOND ; 10C3 AF XRA A ;SET UP 10C4 D393 OUT P$8255$CONTROL ;SET UP 8255 10C6 3E55 MVI A,055H ;DATA PATTERN 10C8 D391 OUT P$PRINTER ;WRITE PRINTER PORT 10CA DBE0 IN P$WINCH$DATA ;READ WINCHESTER PORT 10CC FEAA CPI 0AAH ;CHECK DATA JRNZ ERRORE ;LOOPBACK ERROR 10CE+200B DB 20H,ERRORE-$-1 10D0 3EAA MVI A,0AAH ;FF DATA PATTERN 10D2 D391 OUT P$PRINTER ;WRITE PRINTER PORT 10D4 DBE0 IN P$WINCH$DATA ;READ WINCHESTER PORT 10D6 FE55 CPI 055H ;CHECK DATA JRNZ ERRORE ;LOOPBACK ERROR 10D8+2001 DB 20H,ERRORE-$-1 ; 10DA C9 RET ;TEST FINISHED -- BACK TO USER INTERACTIVES ERRORE: 10DB C31811 JMP ERRORA ;GO DISPLAY ERROR ; WINYTST: 10DE 0C1B5B376D DB FF,ESC,'[7m' 10E3 57494E4348 DB 'WINCHESTER / PRINTER PORT TEST',CR,LF 1103 4C4F4F5042 DB 'LOOPBACK REQUIRED' 1114 1B5B6D24 DB ESC,'[m','$' ; PAGE CP/M MACRO ASSEM 2.0 #063 COLD BOOT LOADER FOR VISUAL 1050 ERRORA: 1118 213011 LXI H,ERROR1 ; ; 111B CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; ERRORC: 111E F3 DI ; 111F AF XRA A ; 1120 D39D OUT P$CLK$PORTB ; 1122 FB EI ; 1123 DB89 IN P$KB$CONTROL ; BIT 1,A ; 1125+CB4F DB 0CBH,1*8+A+40H JRZ ERRORC ; 1127+28F5 DB 28H,ERRORC-$-1 ERRORC1: 1129 DB88 IN P$KB$DATA ;GET KEYBOARD DATA 112B FE0D CPI 0DH ;IS IT A CARRIAGE RETURN ? JRNZ ERRORC1 ;NO, WAIT FOR ONE 112D+20FA DB 20H,ERRORC1-$-1 112F C9 RET ; ERROR1: 1130 1B5B373B35 DB ESC,'[7;5m',CR,LF,LF 1139 4552524F52 DB 'ERROR IN TEST ',CR,LF 1152 5459504520 DB 'TYPE RETURN KEY TO EXIT' 1169 1B5B6D24 DB ESC,'[m','$' PAGE CP/M MACRO ASSEM 2.0 #064 COLD BOOT LOADER FOR VISUAL 1050 ;*******************************************************; ; ; ; SET REAL TIME CLOCK ; ; ; ;*******************************************************; TIME0: 116D 0C1B5B376D DB FF,ESC,'[7m' 1172 0D0A534554 DB CR,LF,'SET REAL TIME CLOCK',ESC,'[m' 118A 0D0A454E54 DB CR,LF,'ENTER TODAY''S DATE (MM/DD/YY):','$' TIMEA: 11AB 0D0A454E54 DB CR,LF,'ENTER THE TIME (HH:MM:SS):','$' BAD$DATE: ; (LEL0284) 11C8 0D0A0A4552 DB CR,LF,LF,'ERROR IN DATE',CR,LF,'$' ; (LEL0284) BAD$TIME: ; (LEL0284) 11DB 0D0A0A4552 DB CR,LF,LF,'ERROR IN TIME',CR,LF,'$' ; (LEL0284) CONT$MSG: ; (LEL0284) 11EE 0D0A545950 DB CR,LF,'TYPE RETURN KEY TO REENTER',CR ; (LEL0284) 120B 0A54595045 DB LF,'TYPE ESC TO EXIT' ; (LEL0284) 121C 24 DB '$' ; (LEL0284) ; ; BEGINNING OF ROUTINE TO SET TIME AND DATE. ; SET PASS$FLG = 1 TO INDICATE THAT YOU ARE GETTING TIME INFO. ; CLOCK$0: 121D 214F50 LXI H,PASS$FLG ;ADDRESS FOR FLAG (LEL0284) 1220 3E01 MVI A,01H ; 1222 77 MOV M,A ;SET PASS FLAG 1223 216D11 LXI H,TIME0 ;GET DATA FOR MESSAGE ; ; DISPLAY "ENTER..." MESSAGE ; CLOCK$1: 1226 CD7617 CALL MESDPLY ;DISPLAY MESSAGE 1229 214F50 LXI H,PASS$FLG ;FLAG ADDRESS (LEL0284) 122C 7E MOV A,M ;READ FLAG 122D FE02 CPI 02 ;SEE IF PASS 2 JRZ CLOCK$2 ;IF YES, THEN CONTINUE 122F+2807 DB 28H,CLOCK$2-$-1 ; ; IF FIRST PASS, ENTER THE DATE ; ; MVI B,08H ;BYTE COUNT (LEL0284) 1231 0609 MVI B,09H ;BYTE COUNT=9 (LEL0284) 1233 215050 LXI H,THE$DATE ;CODE ADDRESS (LEL0284) JR CLOCK$3 ; 1236+1805 DB 18H,CLOCK$3-$-1 ; CP/M MACRO ASSEM 2.0 #065 COLD BOOT LOADER FOR VISUAL 1050 ; IF SECOND PASS, ENTER THE TIME ; CLOCK$2: ; MVI B,08H ;BYTE COUNT (LEL0284) 1238 0609 MVI B,09H ;BYTE COUNT=9 (LEL0284) 123A 215850 LXI H,THE$TIME ;CODE ADDRESS (LEL0284) ; ; GET KEY FROM KEYBOARD ; CLOCK$3: 123D 3E14 MVI A,14H ; 123F D389 OUT P$KB$CONTROL ;RESET BIT 1241 F3 DI ; 1242 AF XRA A ;RESET ACC TO ZERO 1243 D39D OUT P$CLK$PORTB ; 1245 FB EI ; 1246 DB89 IN P$KB$CONTROL ;TEST BIT SET BIT 1,A ; 1248+CB4F DB 0CBH,1*8+A+40H JRZ CLOCK3 ;NO BIT SET 124A+28F1 DB 28H,CLOCK3-$-1 124C DB88 IN P$KB$DATA ;READ CODE ; ; EXAMINE INCOMING CODE. IF IT IS A BACKSPACE, BACK UP TWO ; CHARACTER POSITIONS (ONE FOR THE BACKSPACE AND ONE FOR THE ; PREVIOUS DATA). ; 124E FE08 CPI 08H ;BACKSPACE? (LEL0284) JRNZ CLOCK$4 ;JUMP IF NOT (LEL0284) 1250+200B DB 20H,CLOCK$4-$-1 1252 4F MOV C,A ;STORE BACKSPACE IN C (LEL0284) 1253 78 MOV A,B ;GET COUNT (LEL0284) 1254 FE09 CPI 9 ;ALREADY AT START? (LEL0284) JRZ CLOCK3 ;THEN DO NOT BACKSPACE (LEL0284) 1256+28E5 DB 28H,CLOCK3-$-1 1258 2B DCX H ;DEC MEMORY POINTER (LEL0284) 1259 04 INR B ;INC COUNT (LEL0284) 125A 04 INR B ;TWICE (LEL0284) JR CLOCK5 ;GO STORE IT (LEL0284) 125B+180B DB 18H,CLOCK5-$-1 ; ; CHECK TO SEE IF 8 CHARACTERS HAVE ALREADY BEEN RECEIVED. IF ; YES, THEN THE ONLY CHARACTERS THAT ARE ALLOWABLE AT THIS POINT ; ARE BACKSPACE (ALREADY HANDLED ABOVE) AND CARRIAGE RETURN. ; CLOCK$4: ; (LEL0284) 125D 4F MOV C,A ;SAVE KEY CODE (LEL0284) 125E 78 MOV A,B ;GET COUNT (LEL0284) CP/M MACRO ASSEM 2.0 #066 COLD BOOT LOADER FOR VISUAL 1050 125F FE01 CPI 01 ;LAST ONE? (LEL0284) JRNZ CLOCK$5 ;JUMP IF NOT (LEL0284) 1261+2005 DB 20H,CLOCK$5-$-1 1263 79 MOV A,C ;GET KEY CODE AGAIN (LEL0284) 1264 FE0D CPI CR ;CARRIAGE RETURN? (LEL0284) JRNZ CLOCK$3 ;NO. WAIT FOR ONE. (LEL0284) 1266+20D5 DB 20H,CLOCK$3-$-1 ; ; HAVE RECEIVED VALID KEYCODE. STORE IT. ; CLOCK$5: ; (LEL0284) 1268 71 MOV M,C ;STORE CODE (LEL0284) ; MOV M,A ;STORE CODE (LEL0284) ; ; SEND CHARACTER TO DISPLAY ; CLOCK$6: 1269 DB86 IN P$DISP$C ; 126B 0F RRC ; JRNC CLOCK6 ;LOOP UNTIL READY 126C+30FB DB 30H,CLOCK6-$-1 126E 7E MOV A,M ; 126F D385 OUT P$DISP$OUT ; 1271 3E0E MVI A,0EH ; 1273 D387 OUT P$DISP$CONTROL ; 1275 3C INR A ; 1276 D387 OUT P$DISP$CONTROL ; ; ; DECREMENT COUNT. IF IT IS 0, OR IF CHARACTER WAS A CR, WE ARE DONE. ; 1278 05 DCR B ;DECREMENT COUNTER 1279 78 MOV A,B ;GET COUNT 127A FE00 CPI 00H ;SEE IF DONE JRZ CLOCK7 ; 127C+280C DB 28H,CLOCK7-$-1 127E 7E MOV A,M ;WAS CHAR A CR? (LEL0284) 127F FE0D CPI CR ; (LEL0284) JRZ CLOCK7 ;JUMP IF YES (LEL0284) 1281+2807 DB 28H,CLOCK7-$-1 1283 FE08 CPI 08H ;WAS IT A BACKSPACE? (LEL0284) JRZ CLOCK3 ;IF YES DON'T INCREMENT (LEL0284) 1285+28B6 DB 28H,CLOCK3-$-1 1287 23 INX H ; JR CLOCK3 ; 1288+18B3 DB 18H,CLOCK3-$-1 ; ; CHECK TO SEE IF BOTH TIME AND DATE HAVE BEEN ENTERED. ; CP/M MACRO ASSEM 2.0 #067 COLD BOOT LOADER FOR VISUAL 1050 CLOCK$7: 128A 214F50 LXI H,PASS$FLG ;FLAG ADDRESS (LEL0284) 128D 7E MOV A,M ;READ 128E FE02 CPI 02 ;TEST 2ND PASS JRZ CLOCK$10 ;IF YES, CONTINUE 1290+2808 DB 28H,CLOCK$10-$-1 1292 3E02 MVI A,02H ;SET FLAG 1294 77 MOV M,A ;STORE 1295 21AB11 LXI H,TIMEA ;NEW LOGO JR CLOCK1 ;BACK TILL DONE 1298+188C DB 18H,CLOCK1-$-1 ; ; HAVE INPUT DATE AND TIME. DO A QUICK RUN THROUGH THE DATA TO ; MAKE SURE THAT NUMERIC DATA IS WHERE IT SHOULD BE. ; CLOCK$10: 129A 215050 LXI H,THE$DATE ;START WITH DATE (LEL0284) 129D CDAD12 CALL DIGIT$CHK ;CHECK DIGITS (LEL0284) JRNZ DATE$ERROR ;JUMP IF WRONG (LEL0284) 12A0+2029 DB 20H,DATE$ERROR-$-1 12A2 215850 LXI H,THE$TIME ;THEN CHECK THE TIME (LEL0284) 12A5 CDAD12 CALL DIGIT$CHK ;CHECK DIGITS (LEL0284) JRNZ TIME$ERROR ;JUMP IF ERROR (LEL0284) 12A8+2026 DB 20H,TIME$ERROR-$-1 12AA C32414 JMP TIME$XX ;TEMP JUMP PAGE CP/M MACRO ASSEM 2.0 #068 COLD BOOT LOADER FOR VISUAL 1050 ; ; SUBROUTINE TO CHECK THAT DIGITS ARE WHERE THE N'S ARE IN THE ; FOLLOWING: ; ; NN/NN/NN ; ; (OTHER POSITIONS ARE DON'T CARES) ; DIGIT$CHK: ; (LEL0284) 12AD 0603 MVI B,3 ; LOAD COUNT (LEL0284) 12AF 0E00 MVI C,0 ; LOAD FLAG (LEL0284) DIGIT$10: ; (LEL0284) 12B1 7E MOV A,M ; GET CHARACTER (LEL0284) 12B2 FE30 CPI 30H ; IS IT <0? (LEL0284) 12B4 FAC712 JM BAD$NUM ; IF YES => ERROR (LEL0284) 12B7 FE3A CPI 03AH ; IS IT >9? (LEL0284) 12B9 F2C712 JP BAD$NUM ; THAT IS BAD TOO (LEL0284) 12BC 23 INX H ; ELSE, POINT TO NEXT (LEL0284) 12BD 79 MOV A,C ; GET FLAG (LEL0284) 12BE EEFF XRI 0FFH ; FLIP IT (LEL0284) 12C0 4F MOV C,A ; STORE NEW VALUE (LEL0284) JRNZ DIGIT$10 ; DO TWICE (LEL0284) 12C1+20EE DB 20H,DIGIT$10-$-1 12C3 23 INX H ; THEN INC PAST DC (LEL0284) DJNZ DIGIT$10 ; LOOP TILL DONE (LEL0284) 12C4+10EB DB 10H,DIGIT$10-$-1 12C6 C9 RET ; RET W/Z FLAG IF GOOD (LEL0284) BAD$NUM: ; (LEL0284) 12C7 3EFF MVI A,0FFH ; MAKE Z-FLAG NOT TRUE (LEL0284) 12C9 B7 ORA A ; FOR ERROR (LEL0284) 12CA C9 RET ; RET (LEL0284) ; ; ERROR IN TIME OR DATE. ; DATE$ERROR: ; (LEL0284) 12CB 21C811 LXI H,BAD$DATE ; POINT TO MESSAGE (LEL0284) JR ERR$PATH ; (LEL0284) 12CE+1803 DB 18H,ERR$PATH-$-1 TIME$ERROR: ; (LEL0284) 12D0 21DB11 LXI H,BAD$TIME ; POINT TO MESSAGE (LEL0284) ERR$PATH: ; (LEL0284) 12D3 CD7617 CALL MESDPLY ; DISPLAY ERROR (LEL0284) 12D6 21EE11 LXI H,CONT$MSG ; PRINT CONTINUE MSG (LEL0284) 12D9 CD7617 CALL MESDPLY ; (LEL0284) ; ; WAIT FOR USER TO INDICATE ESC TO EXIT TEST OR CR TO REENTER DATA. ; ERR$P6: ; (LEL0284) 12DC 3E14 MVI A,14H ; (LEL0284) 12DE D389 OUT P$KB$CONTROL ;RESET BIT (LEL0284) 12E0 F3 DI ; (LEL0284) CP/M MACRO ASSEM 2.0 #069 COLD BOOT LOADER FOR VISUAL 1050 12E1 AF XRA A ;RESET ACC TO ZERO (LEL0284) 12E2 D39D OUT P$CLK$PORTB ; (LEL0284) 12E4 FB EI ; (LEL0284) 12E5 DB89 IN P$KB$CONTROL ;TEST BIT SET (LEL0284) BIT 1,A ; (LEL0284) 12E7+CB4F DB 0CBH,1*8+A+40H JRZ ERR$P6 ;NO BIT SET (LEL0284) 12E9+28F1 DB 28H,ERR$P6-$-1 12EB DB88 IN P$KB$DATA ;READ CODE (LEL0284) 12ED FE0D CPI CR ;CR? (LEL0284) 12EF CA1D12 JZ CLOCK$0 ;YES => TRY AGAIN (LEL0284) 12F2 FE1B CPI 01BH ;ESC? (LEL0284) 12F4 C8 RZ ;RET IF YES (LEL0284) 12F5 C3DC12 JMP ERR$P6 ;LOOP TILL ESC OR CR (LEL0284) PAGE CP/M MACRO ASSEM 2.0 #070 COLD BOOT LOADER FOR VISUAL 1050 ; ;ADD EXTRAS FOR DISPLAY ;FOR DATE ; TIME$AA: 12F8 217040 LXI H,4070H ;START ADDRESS 12FB 3E0D MVI A,0DH ; CR 12FD 77 MOV M,A ;STORE 12FE 23 INX H ;INCREMENT POINTER 12FF 3E0A MVI A,0AH ; LF 1301 77 MOV M,A ;STORE 1302 23 INX H ;INCREMENT POINTER 1303 3E44 MVI A,44H ; D 1305 77 MOV M,A ;STORE 1306 23 INX H ;INCREMENT POINTER 1307 3E41 MVI A,41H ; A 1309 77 MOV M,A ;STORE 130A 23 INX H ;INCREMENT POINTER 130B 3E54 MVI A,54H ; T 130D 77 MOV M,A ;STORE 130E 23 INX H ;INCREMENT POINTER 130F 3E45 MVI A,45H ; E 1311 77 MOV M,A ;STORE 1312 23 INX H ;INCREMENT POINTER 1313 3E3A MVI A,3AH ; : 1315 77 MOV M,A ;STORE 1316 23 INX H ;INCREMENT POINTER 1317 3E20 MVI A,20H ; SP 1319 77 MOV M,A ;STORE 131A 217A40 LXI H,407AH ;NEW POINTER 131D 3E2F MVI A,2FH ; / 131F 77 MOV M,A ;STORE 1320 217D40 LXI H,407DH ;NEW POINTER 1323 77 MOV M,A ;STORE ; ;FOR TIME ; 1324 218040 LXI H,4080H ;START ADDRESS 1327 3E0D MVI A,0DH ; CR 1329 77 MOV M,A ;STORE 132A 23 INX H ;INCREMENT POINTER 132B 3E0A MVI A,0AH ; LF 132D 77 MOV M,A ;STORE 132E 23 INX H ;INCREMENT POINTER 132F 3E54 MVI A,54H ; T 1331 77 MOV M,A ;STORE 1332 23 INX H ;INCREMENT POINTER 1333 3E49 MVI A,49H ; I 1335 77 MOV M,A ;STORE 1336 23 INX H ;INCREMENT POINTER 1337 3E4D MVI A,4DH ; M 1339 77 MOV M,A ;STORE 133A 23 INX H ;INCREMENT POINTER 133B 3E45 MVI A,45H ; E CP/M MACRO ASSEM 2.0 #071 COLD BOOT LOADER FOR VISUAL 1050 133D 77 MOV M,A ;STORE 133E 23 INX H ;INCREMENT POINTER 133F 3E3A MVI A,3AH ; : 1341 77 MOV M,A ;STORE 1342 23 INX H ;INCREMENT POINTER 1343 3E20 MVI A,20H ; SP 1345 77 MOV M,A ;STORE 1346 218A40 LXI H,408AH ;NEW POINTER 1349 3E3A MVI A,3AH ; : 134B 77 MOV M,A ;STORE 134C 218D40 LXI H,408DH ;NEW POINTER 134F 77 MOV M,A ;STORE 1350 219040 LXI H,4090H ;RAM POINTER 1353 116013 LXI D,RETURN ;PROM POINTER REST: 1356 1A LDAX D ;READ PROM 1357 77 MOV M,A ;STORE 1358 FE24 CPI '$' ;TEST TERMINATION JRZ TIME$LO ;IF TERMINATOR, CONTINUE 135A+2807 DB 28H,TIME$LO-$-1 135C 23 INX H ;INCREMENT RAM POINTER 135D 13 INX D ;INCREMENT PROM POINTER JR REST ;BACK TILL DONE 135E+18F6 DB 18H,REST-$-1 RETURN: 1360 0D0A24 DB 0DH,0AH,'$' ; TIME$LO: 1363 217040 LXI H,4070H ;RESTORE POINTER ; 1366 CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; ;#TIME$EE: ; MVI A,14H ; ; OUT P$KB$CONTROL ; ; DI ; ; XRA A ;RESET ACC TO ZERO ; OUT P$CLK$PORTB ; ; EI ; ; IN P$KB$CONTROL ; ; BIT 1,A ; ; JRZ TIME$EE ; ; 1369 C9 RET ;RETURN FROM SUBROUTINE PAGE CP/M MACRO ASSEM 2.0 #072 COLD BOOT LOADER FOR VISUAL 1050 ;*****************************************************; ; ; ; READ REAL TIME CLOCK ; ; ; ;*****************************************************; ; ;GET YEAR ; TIME$20: 136A 3E0B MVI A,0BH ;GET Y1 136C CD7315 CALL GET$DATA ; JRC TIME$20 ;IF CHANGE TRY AGAIN 136F+38F9 DB 38H,TIME$20-$-1 1371 79 MOV A,C ;MOVE TO A 1372 C630 ADI 30H ;MASK FOR DISPLAY 1374 217F40 LXI H,407FH ;ADDRESS 1377 77 MOV M,A ;STORE 1378 3E0C MVI A,0CH ;GET Y10 137A CD7315 CALL GET$DATA ; JRC TIME$20 ;IF CHANGED, DO AGAIN 137D+38EB DB 38H,TIME$20-$-1 137F 79 MOV A,C ; 1380 C630 ADI 30H ;MASK FOR DISPLAY 1382 217E40 LXI H,407EH ;ADDRESS 1385 77 MOV M,A ;STORE ; ;GET MONTH ; 1386 3E09 MVI A,09H ;GET M1 1388 CD7315 CALL GET$DATA ; JRC TIME$20 ;IF CHANGE TRY AGAIN 138B+38DD DB 38H,TIME$20-$-1 138D 79 MOV A,C ;MOVE TO A 138E C630 ADI 30H ;MASK FOR DISPLAY 1390 217940 LXI H,4079H ;ADDRESS 1393 77 MOV M,A ;STORE 1394 3E0A MVI A,0AH ;GET M10 1396 CD7315 CALL GET$DATA ; JRC TIME$20 ;IF CHANGE DO AGAIN 1399+38CF DB 38H,TIME$20-$-1 139B 79 MOV A,C ; 139C C630 ADI 30H ;MASK FOR DISPLAY 139E 217840 LXI H,4078H ;NEW ADDRESS 13A1 77 MOV M,A ;STORE ; ;GET DAY ; 13A2 3E07 MVI A,07H ;GET D1 13A4 CD7315 CALL GET$DATA ; JRC TIME$20 ;IF CHANGE TRY AGAIN 13A7+38C1 DB 38H,TIME$20-$-1 13A9 79 MOV A,C ;MOV TO A 13AA C630 ADI 30H ;MASK FOR DISPLAY 13AC 217C40 LXI H,407CH ;ADDRESS CP/M MACRO ASSEM 2.0 #073 COLD BOOT LOADER FOR VISUAL 1050 13AF 77 MOV M,A ;STORE 13B0 3E08 MVI A,08H ;GET D10 13B2 CD7315 CALL GET$DATA ; JRC TIME$20 ;IF CHANGED TRY AGAIN 13B5+38B3 DB 38H,TIME$20-$-1 13B7 79 MOV A,C ; ; ANI 03H ;MAKE SURE LEAP YEARS BITS LOW 13B8 C630 ADI 30H ;MASK FOR DISPLAY 13BA 217B40 LXI H,407BH ;NEW ADDRESS 13BD 77 MOV M,A ;STORE ; ;GET HOURS ; 13BE 3E04 MVI A,04H ;GET H1 13C0 CD7315 CALL GET$DATA ; JRC TIME$20 ;JUMP IF CHANGED 13C3+38A5 DB 38H,TIME$20-$-1 13C5 79 MOV A,C ;SAVE IN A 13C6 E60F ANI 0FH ;MASK HIGH BITS 13C8 C630 ADI 30H ;MASK FOR DISPLAY 13CA 218940 LXI H,4089H ;ADDRESS 13CD 77 MOV M,A ;STORE 13CE 3E05 MVI A,05H ;GET H10 13D0 CD7315 CALL GET$DATA ; JRC TIME$YY ;JUMP IF CHANGED 13D3+384C DB 38H,TIME$YY-$-1 13D5 79 MOV A,C ;GET H10 13D6 E601 ANI 01H ;MASK HIGH BITS 13D8 C630 ADI 30H ;MASK FOR DISPLAY 13DA 218840 LXI H,4088H ;NEW ADDRESS 13DD 77 MOV M,A ;STORE ; ;GET MINUTES ; 13DE 3E02 MVI A,02H ;GET M1 13E0 CD7315 CALL GET$DATA ;GET IT JRC TIME$YY ;BACK IF CHANGED 13E3+383C DB 38H,TIME$YY-$-1 13E5 79 MOV A,C ;SAVE IN A REG 13E6 E60F ANI 0FH ;MASK HIGH BITS 13E8 C630 ADI 30H ;MASK FOR DISPLAY 13EA 218C40 LXI H,408CH ;ADDRESS 13ED 77 MOV M,A ;STORE 13EE 3E03 MVI A,03H ;GET M10 13F0 CD7315 CALL GET$DATA ; JRC TIME$YY ;JUMP IF CHANGED 13F3+382C DB 38H,TIME$YY-$-1 13F5 79 MOV A,C ; 13F6 E607 ANI 07H ;MASK HIGH BITS 13F8 C630 ADI 30H ;MASK FOR DISPLAY 13FA 218B40 LXI H,408BH ;NEW ADDRESS 13FD 77 MOV M,A ;STORE ; ;GET SECONDS ; CP/M MACRO ASSEM 2.0 #074 COLD BOOT LOADER FOR VISUAL 1050 13FE AF XRA A ;GET S1 13FF CD7315 CALL GET$DATA ;GET IT JRC TIME$YY ;JUMP IF CHANGED 1402+381D DB 38H,TIME$YY-$-1 1404 79 MOV A,C ;SAVE IN A 1405 E60F ANI 0FH ;MASK HIGH BITS 1407 C630 ADI 30H ;MASK FOR DISPLAY 1409 218F40 LXI H,408FH ;ADDRESS 140C 77 MOV M,A ;STORE 140D 3E01 MVI A,01H ;GET S10 140F CD7315 CALL GET$DATA ; 1412 DA6A13 JC TIME$20 ;BACK IF CHANGED 1415 79 MOV A,C ; 1416 E607 ANI 07H ;MASK HIGH BITS 1418 C630 ADI 30H ;MASK FOR DISPLAY 141A 218E40 LXI H,408EH ;NEW ADDRESS 141D 77 MOV M,A ;STORE 141E C3F812 JMP TIME$AA ;GO DO CONVERSION TIME$YY: 1421 C36A13 JMP TIME$20 ;BACK ; ;CONVERSION FOR MONTH ; TIME$XX: 1424 215050 LXI H,5050H ;ADDRESS HIGH BYTE 1427 7E MOV A,M ;READ MONTH 1428 E60F ANI 0FH ;CLEAR HIGH BITS 142A 17 RAL ;ROTATE LEFT 142B 17 RAL ; 142C 17 RAL ; 142D 17 RAL ; 142E 47 MOV B,A ;SAVE REG B 142F 23 INX H ;INCREMENT HL 1430 7E MOV A,M ;READ LOW BYTE 1431 E60F ANI 0FH ;CLEAR HIGH BITS 1433 B0 ORA B ;COMBINE 1434 215120 LXI H,2051H ;NEW DESTINATION 1437 77 MOV M,A ;WRITE MONTH ; ;CONVERSION FOR DAY ; 1438 215350 LXI H,5053H ;ADDRESS HIGH BYTE 143B 7E MOV A,M ;READ DAY 143C E60F ANI 0FH ;CLEAR HIGH BITS 143E 17 RAL ;ROTATE LEFT 143F 17 RAL ; 1440 17 RAL ; 1441 17 RAL ; 1442 47 MOV B,A ;SAVE IN REG B 1443 23 INX H ;INCREMENT HL 1444 7E MOV A,M ;READ LOW BYTE 1445 E60F ANI 0FH ;CLEAR HIGH BITS 1447 B0 ORA B ;COMBINE 1448 215220 LXI H,2052H ;NEW DESTINATION 144B 77 MOV M,A ;WRITE DAY CP/M MACRO ASSEM 2.0 #075 COLD BOOT LOADER FOR VISUAL 1050 ; ;CONVERSION FOR YEAR ; 144C 215650 LXI H,5056H ;ADDRESS HIGH BYTE 144F 7E MOV A,M ;READ YEAR 1450 E60F ANI 0FH ;CLEAR HIGH BITS 1452 17 RAL ;ROTATE LEFT 1453 17 RAL ; 1454 17 RAL ; 1455 17 RAL ; 1456 47 MOV B,A ;SAVE REG B 1457 23 INX H ;INCREMENT HL 1458 7E MOV A,M ;READ LOW BYTE 1459 E60F ANI 0FH ;CLEAR HIGH BITS 145B B0 ORA B ;COMBINE 145C 215020 LXI H,2050H ;NEW DESTINATION 145F 77 MOV M,A ;WRITE YEAR ; ;CONVERSION FOR HOUR ; 1460 215850 LXI H,5058H ;ADDRESS HIGH BYTE 1463 7E MOV A,M ;READ HOUR 1464 E60F ANI 0FH ;CLEAR HIGH BITS 1466 17 RAL ;ROTATE LEFT 1467 17 RAL ; 1468 17 RAL ; 1469 17 RAL ; 146A 47 MOV B,A ;SAVE REG B 146B 23 INX H ;INCREMENT HL 146C 7E MOV A,M ;READ LOW BYTE 146D E60F ANI 0FH ;CLEAR HIGH BITS 146F B0 ORA B ;COMBINE 1470 215320 LXI H,2053H ;NEW DESTINATION 1473 77 MOV M,A ;WRITE HOUR ; ;CONVERSION FOR MIN ; 1474 215B50 LXI H,505BH ;ADDRESS HIGH BYTE 1477 7E MOV A,M ;READ MIN 1478 E60F ANI 0FH ;CLEAR HIGH BITS 147A 17 RAL ;ROTATE LEFT 147B 17 RAL ; 147C 17 RAL ; 147D 17 RAL ; 147E 47 MOV B,A ;SAVE REG B 147F 23 INX H ;INCREMENT HL 1480 7E MOV A,M ;READ LOW BYTE 1481 E60F ANI 0FH ;CLEAR HIGH BITS 1483 B0 ORA B ;COMBINE 1484 215420 LXI H,2054H ;NEW DESTINATION 1487 77 MOV M,A ;WRITE MIN ; ;CONVERSION FOR SEC ; 1488 215E50 LXI H,505EH ;ADDRESS HIGH BYTE CP/M MACRO ASSEM 2.0 #076 COLD BOOT LOADER FOR VISUAL 1050 148B 7E MOV A,M ;READ SEC 148C E60F ANI 0FH ;CLEAR HIGH BITS 148E 17 RAL ;ROTATE LEFT 148F 17 RAL ; 1490 17 RAL ; 1491 17 RAL ; 1492 47 MOV B,A ;SAVE REG B 1493 23 INX H ;INCREMENT HL 1494 7E MOV A,M ;READ LOW BYTE 1495 E60F ANI 0FH ;CLEAR HIGH BITS 1497 B0 ORA B ;COMBINE 1498 215520 LXI H,2055H ;NEW DESTINATION 149B 77 MOV M,A ;WRITE SEC ; ;SET HOUR ; 149C 3A5320 LDA HOUR ;GET HOUR 149F E60F ANI 0FH ;CLEAR HIGH BITS 14A1 4F MOV C,A ;MOVE TO REG C 14A2 3E04 MVI A,4 ;SEND H 1 14A4 CD3B15 CALL PUT$DATA ; 14A7 3A5320 LDA HOUR ;GET HOUR AGAIN 14AA 1F RAR ;ROTATE INTO LOW BYTE 14AB 1F RAR ; 14AC 1F RAR ; 14AD 1F RAR ; 14AE E60F ANI 0FH ;CLEAR HIGH BITS 14B0 F608 ORI 08H ;SET 24 HOUR CLOCK 14B2 4F MOV C,A ;MOVE TO REG C 14B3 3E05 MVI A,5 ;SEND H10 14B5 CD3B15 CALL PUT$DATA ; ; ;SET MINUTES ; 14B8 3A5420 LDA MIN ;GET MINUTES 14BB E60F ANI 0FH ;CLEAR HI BITS 14BD 4F MOV C,A ;MOVE TO REG C 14BE 3E02 MVI A,2 ;SEND M1 14C0 CD3B15 CALL PUT$DATA ; 14C3 3A5420 LDA MIN ;SEND MIN AGAIN 14C6 1F RAR ;ROTATE INTO LOW BYTE 14C7 1F RAR ; 14C8 1F RAR ; 14C9 1F RAR ; 14CA E60F ANI 0FH ;CLEAR HI BITS 14CC 4F MOV C,A ;MOVE TO REG C 14CD 3E03 MVI A,3 ;SEND M10 14CF CD3B15 CALL PUT$DATA ; ; ;SET SECONDS ; 14D2 3A5520 LDA SEC ;GET SECONDS 14D5 E60F ANI 0FH ;CLEAR HI BITS 14D7 4F MOV C,A ;MOVE TO REG C 14D8 3E00 MVI A,0 ;SEND S1 CP/M MACRO ASSEM 2.0 #077 COLD BOOT LOADER FOR VISUAL 1050 14DA CD3B15 CALL PUT$DATA ; 14DD 3A5520 LDA SEC ;GET SEC AGAIN 14E0 1F RAR ;ROTATE INTO LOW BYTE 14E1 1F RAR ; 14E2 1F RAR ; 14E3 1F RAR ; 14E4 E60F ANI 0FH ;CLEAR HI BITS 14E6 4F MOV C,A ;MOVE TO REG C 14E7 3E01 MVI A,01H ;SEND S10 14E9 CD3B15 CALL PUT$DATA ; ; ;SEND YEAR ; 14EC 3A5020 LDA YEAR ;GET YEAR 14EF E60F ANI 0FH ;CLEAR HI BITS 14F1 4F MOV C,A ;MOVE TO REG C 14F2 3E0B MVI A,11 ;SEND Y1 14F4 CD3B15 CALL PUT$DATA ; 14F7 3A5020 LDA YEAR ;GET YEAR AGAIN 14FA 1F RAR ;ROTATE INTO LOW BYTE 14FB 1F RAR ; 14FC 1F RAR ; 14FD 1F RAR ; 14FE E60F ANI 0FH ;CLEAR HIGH BITS 1500 4F MOV C,A ;MOV TO REG C 1501 3E0C MVI A,12 ;SEND Y10 1503 CD3B15 CALL PUT$DATA ; ; ;SEND MONTH ; 1506 3A5120 LDA MONTH ;GET MONTH 1509 E60F ANI 0FH ;CLEAR HIGH BITS 150B 4F MOV C,A ; 150C 3E09 MVI A,09 ;SEND M1 150E CD3B15 CALL PUT$DATA ; 1511 3A5120 LDA MONTH ;GET MONTH AGAIN 1514 1F RAR ;ROTATE INTO LOW BYTE 1515 1F RAR ; 1516 1F RAR ; 1517 1F RAR ; 1518 E60F ANI 0FH ;CLEAR HI BITS 151A 4F MOV C,A ; 151B 3E0A MVI A,10 ;SEND M10 151D CD3B15 CALL PUT$DATA ; ; ;SEND DAY ; 1520 3A5220 LDA DAY ;GET DAY 1523 E60F ANI 0FH ;CLEAR HI BITS 1525 4F MOV C,A ; 1526 3E07 MVI A,07 ; 1528 CD3B15 CALL PUT$DATA ; 152B 3A5220 LDA DAY ;GET DAY AGAIN 152E 1F RAR ;ROTATE INTO LOW BYTE 152F 1F RAR ; CP/M MACRO ASSEM 2.0 #078 COLD BOOT LOADER FOR VISUAL 1050 1530 1F RAR ; 1531 1F RAR ; 1532 E603 ANI 03H ;CLEAR HIGH BITS AND LEAP YEAR BITS 1534 4F MOV C,A ; 1535 3E08 MVI A,08 ; 1537 CD3B15 CALL PUT$DATA ; 153A C9 RET ; ; ; PAGE CP/M MACRO ASSEM 2.0 #079 COLD BOOT LOADER FOR VISUAL 1050 ; ;WRITE DATA TO REAL TIME CLOCK CHIP ; ;ENTER WITH: A REG = CLOCK REGISTER TO ADDRESS ; C REG = DATA TO WRITE TO CHIP ; PUT$DATA: 153B F5 PUSH PSW ;SAVE ADDRESS FOR WRITE 153C F3 DI ;DISABLE INTERRUPTS 153D 3E81 MVI A,RTC$WRITE ;WRITING 153F D39F OUT P$CLK$CONTROL ;SET PORT OUT 1541 3E0F MVI A,RTC$SELECT ; SELECT CHIP 1543 D39F OUT P$CLK$CONTROL ; 1545 F1 POP PSW ;RESTOTE WRITE AADDRESS 1546 D39C OUT P$CLK$PORTA ;SEND OUT ADDRESS 1548 3E09 MVI A,ADD$WRITE$HI ;SET UP ADDRESS WRITE 154A D39F OUT P$CLK$CONTROL ; 154C 3E08 MVI A,ADD$WRITE$LO ;CLEAR ADDRESS WRITE 154E D39F OUT P$CLK$CONTROL ; 1550 3E0B MVI A,WRITE$HI ;SET DATE WRITE HI 1552 D39F OUT P$CLK$CONTROL ; ; 1554 DB9E IN P$CLK$PORTC ;GET STATUS 1556 E608 ANI 08H ;BUSY ? JRZ $-5 ;LOOP TILL FREE 1558+28FA DB 28H,$-5-$-1 ; 155A 79 MOV A,C ;GET DATA 155B D39C OUT P$CLK$PORTA ;WRITE DATA 155D 3E0A MVI A,WRITE$LO ; 155F D39F OUT P$CLK$CONTROL ; 1561 3E91 MVI A,RTC$READ ;LEAVE PORT AS IS 1563 D39F OUT P$CLK$CONTROL ; ; 1565 3E0E MVI A,0EH ;DESELECT COMMAND 1567 D39F OUT P$CLK$CONTROL ; ; 1569 3EEE MVI A,0EEH ;SET UP INTERRUPT MASK 156B D39D OUT P$CLK$PORTB ; 156D 3E10 MVI A,INT$INITIAL ;REINIT INT PORTS 156F D3C0 OUT INT$PORT ; 1571 FB EI ;ENABLE INTERRUPTS 1572 C9 RET ; ; ; PAGE CP/M MACRO ASSEM 2.0 #080 COLD BOOT LOADER FOR VISUAL 1050 ; ;READ DATA FROM REAL TIME CLOCK CHIP ; ;ENTER WITH: A REG = CLOCK REGISTER TO ADDRESS ; C REG = DATA READ FROM CHIP ; (CARRY FLAG SET INDICATES ROLLOVER) ; GET$DATA: 1573 F5 PUSH PSW ;SAVE READ ADDRESS 1574 3E81 MVI A,RTC$WRITE ;A=OUT;B=OUT;CLO=IN;CHI=OUT 1576 F3 DI ;DISABLE EXTERNAL INTERRUPTS 1577 D39F OUT P$CLK$CONTROL ;SET PORT TO OUT 1579 3E0F MVI A,RTC$SELECT ;DEVICE SELECT 157B D39F OUT P$CLK$CONTROL ; 157D F1 POP PSW ;RESTORE READ ADDRESS 157E D39C OUT P$CLK$PORTA ;SEND OUT ADDRESS 1580 3E09 MVI A,ADD$WRITE$HI ;SET UP ADDRESS WRITE 1582 D39F OUT P$CLK$CONTROL ; 1584 3E08 MVI A,ADD$WRITE$LO ;CLEAR ADDRESS WRITE 1586 D39F OUT P$CLK$CONTROL ; ; 1588 3E0E MVI A,0EH ;DESELECT COMMAND 158A D39F OUT P$CLK$CONTROL ; ; 158C 3E91 MVI A,RTC$READ ;READING 158E D39F OUT P$CLK$CONTROL ;SET PORT TO IN 1590 3E0F MVI A,RTC$SELECT ;CHIP SELECT 1592 D39F OUT P$CLK$CONTROL ; 1594 3E0D MVI A,READ$HI ;SET DATA READ HIGH 1596 D39F OUT P$CLK$CONTROL ; ; 1598 DB9E IN P$CLK$PORTC ;GET STATUS 159A E608 ANI 08H ;BUSY ? JRZ $-5 ;LOOP TILL FREE 159C+28FA DB 28H,$-5-$-1 ; 159E DB9C IN P$CLK$PORTA ;GET DATA 15A0 E60F ANI 0FH ;CLEAR HI BITS 15A2 4F MOV C,A ;SAVE IN C-REG 15A3 3E0C MVI A,READ$LO ;SET DATA READ LOW 15A5 D39F OUT P$CLK$CONTROL ; 15A7 3E0D MVI A,READ$HI ;SET DATA READ HIGH 15A9 D39F OUT P$CLK$CONTROL ; ; 15AB DB9E IN P$CLK$PORTC ;GET STATUS 15AD E608 ANI 08H ;BUSY ? JRZ $-5 ;LOOP TILL FREE 15AF+28FA DB 28H,$-5-$-1 ; 15B1 DB9C IN P$CLK$PORTA ;GET DATA AGAIN 15B3 E60F ANI 0FH ;CLEAR HI BITS 15B5 B9 CMP C ;DATA SAME AS LAST ? JRZ GET$20 ;JUMP IF YES 15B6+2801 DB 28H,GET$20-$-1 CP/M MACRO ASSEM 2.0 #081 COLD BOOT LOADER FOR VISUAL 1050 15B8 37 STC ;ELSE, SET CARRY GET$20: 15B9 3E0C MVI A,READ$LO ;YES. SET DATA READ LOW 15BB D39F OUT P$CLK$CONTROL ; ; 15BD 3E0E MVI A,0EH ;DESELECT COMMAND 15BF D39F OUT P$CLK$CONTROL ; ; 15C1 3E10 MVI A,INT$INITIAL ;REINIT INT PORTS 15C3 D3C0 OUT INT$PORT ; 15C5 FB EI ;REENABLE EXTERNAL INTERRUPTS 15C6 C9 RET ; ; ; PAGE CP/M MACRO ASSEM 2.0 #082 COLD BOOT LOADER FOR VISUAL 1050 ;######################################################################### ;# ####### #### ## ######### #### ######### # ;# ######### ###### ## ########## ###### ######### # ;# ## ## ## ## ## ## ## ## ### # ;# ## ## ## ## ## ## ## ## ### # ;# ## #### ######## ## ########## ######## ### # ;# ## ### ######## ## ######### ######## ### # ;# ######### ## ## ######### ## ## ## ### # ;# ####### ## ## ######### ## ## ## ### # ;######################################################################### ; ; GALLOPING PATTERN (GALPAT) & FAST (MKBTST) MEMORY DIAGNOSTIC FOR VISUAL 1050 ; ; BY S.SHERMAN / D.BANKS 23 JAN 84 ; 17 JAN 84 ; 07 DEC 83 ; 05 DEC 83 ; 28 NOV 83 ; ; PROCEDURE GALPAT ; SET STACK TO 8000H ; SET PAGE = 0 ; SET ERROR NUMB =0 ; SET PROMPT TO 'T' ; SET RANGE = 0C000H TO 0FFFFH ; CALL TEST PROCEDURE (GALPAT OR MKBTST) ; ; RELOCATE GALPAT2 TO TOP 16K ; ; SET STACK TO 0000H ; SET PAGE = 0 ; SET PROMPT TO '0' ; SET ERROR NUMB =1 ; SET RANGE = 0000 TO 0BFFFH ; CALL TEST PROCEDURE (GALPAT OR MKBTST) ; SET PAGE = 1 ; SET PROMPT TO '1' ; SET ERROR NUM =2 ; SET RANGE = 0000 TO 0BFFFH ; CALL TEST PROCEDURE (GALPAT OR MKBTST) ; SET PAGE = 2 ; SET PROMPT TO '2' ; SET ERROR NUM =3 ; SET RANGE = 0000 TO 3FFFH ; CALL TEST PROCEDURE (GALPAT OR MKBTST) ; END PROCEDURE GALPAT ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 0080 = INCRMT EQU 0080H ;GALPAT INCREMENT ;PROVIDES TEST TIME OF 14.5 MIN. ; REF1: GALPAT: CP/M MACRO ASSEM 2.0 #083 COLD BOOT LOADER FOR VISUAL 1050 15C7 F3 DI ;DISABLE INTERRUPTS ; 15C8 D1 POP D ;GET RETURN ADDRESS FROM STACK 15C9 C1 POP B ;GET LAST KEYCODE FROM STACK 15CA 310080 LXI SP,8000H ;SET TEMP STACK 15CD C5 PUSH B ;PLACE LAST KEYCODE BACK ON STACK 15CE D5 PUSH D ;PLACE RETURN ADDRESS ON STACK ; 15CF AF XRA A ;MASK FOR BANK SELECT 15D0 D3D0 OUT P$BANK$SELECT ;SELECT BANK 0 ; PUSHIX ;PUT IX FLAG ON STACK 15D2+DDE5 DB 0DDH,0E5H 15D4 F1 POP PSW ;...AND COPY TO AF 15D5 B7 ORA A ;SET CONDITION FLAGS 15D6 213519 LXI H,LOGMSG ;POINT TO LOG MESSAGE JRZ SKIP2 ;IF GALPAT TEST, SKIP OVER 15D9+2803 DB 28H,SKIP2-$-1 15DB 215A19 LXI H,MKBMSG ;OTHERWISE, POINT TO 'FAST' MESSAGE SKIP2: 15DE CD7617 CALL MESDPLY ;DISPLAY LOG MESSAGE ; 15E1 CD6A13 CALL TIME$20 ;LOG CURRENT TIME ; 15E4 0E00 MVI C,0 ;SET RELOCATION FLAG TO 0 ; 15E6 2100C0 LXI H,0C000H ;START OF UPPER 16K RAM 15E9 110000 LXI D,0FFFFH+1 ;END+1 OF UPPER 16K RAM 15EC 0600 MVI B,0 ;SET ERROR NUMB = 0 15EE CD4E16 CALL CHKTST ;PERFORM GALPAT OR MKBTST ; ; RELOCATE GALPAT CODE TO TOP 16K OF RAM ; 15F1 21C715 LXI H,REF1 ;POINT TO START OF RELOC CODE 15F4 11C7D5 LXI D,REF1+0C000H ;POINT TO DEST OF RELOC CODE 15F7 016E03 LXI B,LOGMSG-REF1 ;LENGTH OF RELOC CODE LDIR ;RELOCATE GALPAT CODE 15FA+EDB0 DB 0EDH,0B0H 15FC 0EFF MVI C,0FFH ;SET RELOCATION FLAG TO FF 15FE 3E76 MVI A,76H ;HALT CODE 1600 328CD7 STA DPLYEXIT+OFFSET ;CHANGE DISPLAY EXIT ; 1603 C306D6 JMP GALPAT2+0C000H ;JUMP TO RELOCATED CODE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; THE FOLLOWING CODE GETS RELOCATED INTO RAM BEFORE EXECUTION ; C000 = OFFSET EQU 0C000H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GALPAT2: 1606 D1 POP D ;GET RETURN ADDRESS FROM STACK 1607 E1 POP H ;GET LAST KEYCODE FROM STACK 1608 31D9FF LXI SP,STACK ;SET STACK TO TOP OF RAM 160B E5 PUSH H ;PLACE LAST KEYCODE BACK ON STACK 160C D5 PUSH D ;PLACE RETURN ADDRESS BACK ON STACK ; CP/M MACRO ASSEM 2.0 #084 COLD BOOT LOADER FOR VISUAL 1050 160D 3E01 MVI A,01H ;MASK FOR PAGE 0, ROM OFF 160F D3D0 OUT P$BANK$SELECT ;SELECT BANK 0 1611 3E30 MVI A,'0' ;PROMPT CHARACTER 1613 327DD9 STA CHAR+OFFSET ;PROMPT STORE LOCATION 1616 210000 LXI H,0 ;START OF RANGE 1619 1100C0 LXI D,0BFFFH+1 ;END+1 OF RANGE 161C 0601 MVI B,1 ;SET ERROR NUMB = 1 161E CD4ED6 CALL CHKTST+OFFSET ;PERFORM GALPAT OR MKBTST ; 1621 3E03 MVI A,03H ;MASK FOR PAGE 1 1623 D3D0 OUT P$BANK$SELECT ;SELECT BANK 1 1625 3E31 MVI A,'1' ;PROMPT CHARACTER 1627 327DD9 STA CHAR+OFFSET ;PROMPT STORE LOCATION 162A 210000 LXI H,0 ;START OF RANGE 162D 1100C0 LXI D,0BFFFH+1 ;END+1 OF RANGE 1630 0602 MVI B,2 ;SET ERROR NUMB = 2 1632 CD4ED6 CALL CHKTST+OFFSET ;PERFORM GALPAT OR MKBTST ; 1635 3E05 MVI A,05H ;MASK FOR PAGE 2 1637 D3D0 OUT P$BANK$SELECT ;SELECT BANK 2 1639 3E32 MVI A,'2' ;PROMPT CHARACTER 163B 327DD9 STA CHAR+OFFSET ;PROMPT STORE LOCATION 163E 210000 LXI H,0 ;START OF RANGE 1641 110040 LXI D,3FFFH+1 ;END+1 OF RANGE 1644 0603 MVI B,3 ;SET ERROR NUMB = 3 1646 CD4ED6 CALL CHKTST+OFFSET ;PERFORM GALPAT OR MKBTST ; EXITG: 1649 3E00 MVI A,0 ;RESET ACC TO ZERO 164B D3D0 OUT P$BANK$SELECT ;SELECT BANK 0 AND PROM 164D C9 RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROCEDURE TEST ; DO UNTIL POINTER = END OF RANGE ; FILL RANGE WITH 00H ; SET TEST LOCATION TO 0FFH ; CHECK REST OF RANGE FOR 00H ; IF REST NOT 00H ; THEN ; DISPLAY ERROR MESSAGE + ERROR NUMB ; HALT ; FILL RANGE WITH FFH ; SET TEST LOCATION TO 00H ; CHECK REST OF RANGE FOR FFH ; IF REST NOT FFH ; THEN ; DISPLAY ERROR MESSAGE + ERROR NUMB ; HALT ; POINT TO NEXT TEST BYTE ; END ; END PROCEDURE TEST ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHKTST: CP/M MACRO ASSEM 2.0 #085 COLD BOOT LOADER FOR VISUAL 1050 PUSHIX ;SAVE IX REGISTER ON STACK 164E+DDE5 DB 0DDH,0E5H 1650 F1 POP PSW ;...AND XFER TO AF 1651 B7 ORA A ;SET CONDITION FLAGS JRNZ MKBTST ;FAST MEMORY TEST 1652+207A DB 20H,MKBTST-$-1 GTEST: 1654 E5 PUSH H ;SAVE ADDRESS FOR GTEST2 1655 E5 PUSH H ;SAVE STARTING ADDRESS GTEST0: ; ; BACKGROUND OF FF / TEST WITH 00 ; 1656 36FF MVI M,0FFH ;FILL RAM LOCATIONS 1658 23 INX H ;POINT TO NEXT LOCATION 1659 7A MOV A,D ;END OF RANGE / HIGH BYTE 165A BC CMP H ;AT END? JRNZ GTEST0 ;CONTINUE TILL DONE 165B+20F9 DB 20H,GTEST0-$-1 ; 165D E1 POP H ;RESTORE STARTING ADDRESS 165E 3600 MVI M,0 ;SET TEST LOCATION TO 00 1660 7E MOV A,M ;READ BYTE BACK 1661 FE00 CPI 00 ;STILL THERE? JRNZ BADCHIP1 ;ERROR IF NOT 1663+20AA DB 20H,BADCHIP1-$-1 1665 23 INX H ;NEXT LOCATION TO CHECK ; GTEST1: 1666 3EFF MVI A,0FFH ;DATA TO CHECK FOR 1668 BE CMP M ;HAS DATA CHANGED? JRNZ GALERROR ;JUMP IF ERROR 1669+20BE DB 20H,GALERROR-$-1 166B 23 INX H ;NEXT LOCATION TO CHECK 166C 7A MOV A,D ;GET END+1 OF RANGE / HIGH BYTE 166D BC CMP H ;AT END? JRNZ GTEST1 ;CONTINUE TILL DONE 166E+20F6 DB 20H,GTEST1-$-1 ; 1670 E1 POP H ;RESTORE ORIGINAL ADDRESS 1671 E5 PUSH H ;SAVE IT AGAIN 1672 E5 PUSH H ;SAVE STARTING ADDRESS GTEST2: ; ; BACKGROUND OF 00 / TEST WITH FF ; 1673 3600 MVI M,00 ;FILL RAM LOCATION WITH 00 1675 23 INX H ;POINT TO NEXT LOCATION 1676 7A MOV A,D ;END OF RANGE / HIGH BYTE 1677 BC CMP H ;AT END? JRNZ GTEST2 ;CONTINUE TILL DONE 1678+20F9 DB 20H,GTEST2-$-1 167A E1 POP H ;RESTORE STARTING ADDRESS ; 167B 36FF MVI M,0FFH ;SET TEST LOCATION TO FF CP/M MACRO ASSEM 2.0 #086 COLD BOOT LOADER FOR VISUAL 1050 167D 7E MOV A,M ;READ BYTE BACK 167E FEFF CPI 0FFH ;STILL THERE? JRNZ BADCHIP ;ERROR IF NOT 1680+208C DB 20H,BADCHIP-$-1 1682 23 INX H ;NEXT LOCATION TO CHECK ; GTEST3: 1683 3E00 MVI A,00 ;DATA TO CHECK FOR 1685 BE CMP M ;HAS DATA CHANGED? JRNZ GALERROR ;JUMP IF ERROR 1686+20A1 DB 20H,GALERROR-$-1 1688 23 INX H ;NEXT LOCATION TO CHECK 1689 7A MOV A,D ;GET END+1 OF RANGE / HIGH BYTE 168A BC CMP H ;AT END? JRNZ GTEST3 ;CONTINUE TILL DONE 168B+20F6 DB 20H,GTEST3-$-1 ; 168D E1 POP H ;RESTORE ORIGINAL ADDRESS 168E C5 PUSH B ;SAVE ERROR NUMBER PROMPT: 168F DB86 IN P$DISP$C ;GET DISPLAY STATUS 1691 0F RRC ;GET BUSY BIT JRNC PROMPT ;LOOP IF BUSY 1692+30FB DB 30H,PROMPT-$-1 1694 79 MOV A,C ;GET RELOCATION FLAG 1695 B7 ORA A ;CHECK FOR ZERO JRZ NOTREL ;JUMP,CODE NOT RELOCATED 1696+2805 DB 28H,NOTREL-$-1 1698 3A7DD9 LDA CHAR+OFFSET ;GET PROMPT CHARACTER JR PROMPT1 ;GO DISPLAY PROMPT 169B+1803 DB 18H,PROMPT1-$-1 NOTREL: 169D 3A7D19 LDA CHAR ;GET PROMPT CHARACTER PROMPT1: 16A0 D385 OUT P$DISP$OUT ;SEND TO DISPLAY 16A2 3E0E MVI A,0EH ;DISPLAY STROBE LOW 16A4 D387 OUT P$DISP$CONTROL ;SET STROBE LOW 16A6 3C INR A ;DISPLAY STROBE HIGH 16A7 D387 OUT P$DISP$CONTROL ;SET STROBE HIGH ; 16A9 F3 DI ;DISABLE EXTERNAL INTERRUPTS 16AA AF XRA A ;ZERO OUT ACC 16AB D39D OUT P$CLK$PORTB ;...OUTPUT TO INTERRUPT MASK PORT 16AD FB EI ;RE ENABLE EXTERNAL INTERRUPTS 16AE DB89 IN P$KB$CONTROL ;GET KEYBOARD STATUS BIT 1,A ;TEST BIT... 16B0+CB4F DB 0CBH,1*8+A+40H JRZ CONTIN ;NO KEY...CONTINUE 16B2+2810 DB 28H,CONTIN-$-1 ; 16B4 DB88 IN P$KB$DATA ;GET KEYSTROKE 16B6 FE1B CPI 1BH ;IS IT AN ESCAPE KEY ? JRNZ CONTIN ;NO, SO CONTINUE 16B8+200A DB 20H,CONTIN-$-1 ; CP/M MACRO ASSEM 2.0 #087 COLD BOOT LOADER FOR VISUAL 1050 16BA 31D9FF LXI SP,STACK ;YES, SET UP NEW STACK... ; 16BD 3E00 MVI A,0 ;RESET ACC TO ZERO 16BF D3D0 OUT P$BANK$SELECT ;... SELECT BANK 0 AND PROM ; 16C1 C3A40A JMP DOMANUAL ;START OVER, YOU'RE LOST . . . ; CONTIN: 16C4 018000 LXI B,INCRMT ;GET TEST INCREMENT 16C7 09 DAD B ;INCREMENT TEST POINTER 16C8 C1 POP B ;RESTORE ERROR NUMBER ; 16C9 7C MOV A,H ;GET CURRENT TEST POINTER 16CA BA CMP D ;AT END OF RANGE+1 ? JRNZ GTEST ;DO UNTIL COMPLETE 16CB+2087 DB 20H,GTEST-$-1 ; 16CD C9 RET ; ; PAGE CP/M MACRO ASSEM 2.0 #088 COLD BOOT LOADER FOR VISUAL 1050 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MKBTST: ;FAST MEMORY TEST 16CE E5 PUSH H ;SAVE START ADDRESS RTLP10: 16CF 7D MOV A,L ;START TO CALCULATE PATTERN 16D0 AC XRA H ;.. 16D1 EEFF XRI 0FFH ;PATTERN MODIFIER 16D3 77 MOV M,A ;STORE PATTERN IN RAM ; 16D4 2C INR L ;POINT TO NEXT ADDRESS JRNZ RTLP10 ;CONTINUE FOR 256 BYTES 16D5+20F8 DB 20H,RTLP10-$-1 ; 16D7 24 INR H ;POINT TO NEXT PAGE OF MEMORY 16D8 7C MOV A,H ;XFER PAGE NUMBER TO ACC 16D9 BA CMP D ;DONE WITH RANGE ? JRNZ RTLP10 ;NO, SO CONTINUE 16DA+20F3 DB 20H,RTLP10-$-1 ; 16DC E1 POP H ;RESTORE RANGE START ADDRESS 16DD E5 PUSH H ;SAVE ADDRESS AGAIN RTLP20: 16DE 7D MOV A,L ;START TO CALCULATE PATTERN 16DF AC XRA H ;.. 16E0 EEFF XRI 0FFH ;PATTERN MODIFIER 16E2 AE XRA M ;CHECK TO SEE IF STORED CORRECTLY JRNZ JTERR ;ERROR, SO REPORT IT 16E3+2026 DB 20H,JTERR-$-1 ; 16E5 2C INR L ;POINT TO NEXT ADDRESS JRNZ RTLP20 ;CONTINUE FOR 256 BYTES 16E6+20F6 DB 20H,RTLP20-$-1 ; 16E8 24 INR H ;POINT TO NEXT PAGE OF MEMORY 16E9 7C MOV A,H ;XFER PAGE NUMBER TO ACC 16EA BA CMP D ;DONE WITH RANGE ? JRNZ RTLP20 ;NO, SO CONTINUE 16EB+20F1 DB 20H,RTLP20-$-1 ; 16ED E1 POP H ;RESTORE RANGE START ADDRESS 16EE E5 PUSH H ;SAVE ADDRESS AGAIN RTLP30: 16EF 7D MOV A,L ;START TO CALCULATE PATTERN 16F0 AC XRA H ;.. 16F1 77 MOV M,A ;STORE IN RAM ; 16F2 2C INR L ;POINT TO NEXT ADDRESS JRNZ RTLP30 ;CONTINUE FOR 256 BYTES 16F3+20FA DB 20H,RTLP30-$-1 ; 16F5 24 INR H ;POINT TO NEXT PAGE OF MEMORY 16F6 7C MOV A,H ;XFER PAGE NUMBER TO ACC 16F7 BA CMP D ;DONE WITN RANGE ? JRNZ RTLP30 ;NO, SO CONTINUE CP/M MACRO ASSEM 2.0 #089 COLD BOOT LOADER FOR VISUAL 1050 16F8+20F5 DB 20H,RTLP30-$-1 ; 16FA E1 POP H ;RESTORE RANGE START ADDRESS 16FB E5 PUSH H ;SAVE ADDRESS AGAIN RTLP40: 16FC 7D MOV A,L ;START TO CALCULATE PATTERN 16FD AC XRA H ;.. 16FE AE XRA M ;CHECK TO SEE IF STORED CORRECTLY JRNZ JTERR ;ERROR, SO REPORT IT 16FF+200A DB 20H,JTERR-$-1 ; 1701 2C INR L ;POINT TO NEXT ADDRESS JRNZ RTLP40 ;CONTINUE FOR 256 BYTES 1702+20F8 DB 20H,RTLP40-$-1 ; 1704 24 INR H ;POINT TO NEXT PAGE OF MEMORY 1705 7C MOV A,H ;XFER PAGE NUMBER TO ACC 1706 BA CMP D ;DONE WITH RANGE ? JRNZ RTLP40 ;NO, SO CONTINUE 1707+20F3 DB 20H,RTLP40-$-1 ; 1709 E1 POP H ;ADJUST STACK... ; 170A C9 RET ;... & RETURN FROM SUBROUTINE ; ; JTERR: 170B E1 POP H ;ADJUST STACK JR BADCHIP1 ;...AND REPORT ERROR 170C+1801 DB 18H,BADCHIP1-$-1 ; ; PAGE CP/M MACRO ASSEM 2.0 #090 COLD BOOT LOADER FOR VISUAL 1050 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BADCHIP: 170E 2F CMA ;COMPLEMENT DATA RECEIVED BADCHIP1: 170F C5 PUSH B ;PUT RELOC FLAG ON STACK 1710 E6FF ANI 0FFH ;ISOLATE ERROR BIT 1712 0EFF MVI C,0FFH ;INITIALIZE BIT COUNTER BC1: 1714 0F RRC ;ROTATE BIT INTO CARRY 1715 0C INR C ;COUNT ONE BIT JRNC BC1 ;LOOP UNTIL BIT FOUND 1716+30FC DB 30H,BC1-$-1 ; 1718 78 MOV A,B ;GET TEST NUMBER 1719 E6FE ANI 0FEH ;MASK OFF TESTS 0 & 1 JRZ BC2 ;JUMP IF TEST 0 OR 1 171B+2805 DB 28H,BC2-$-1 171D 3E08 MVI A,08H ;MESSAGE OFFSET FOR TEST 2 & 3 171F 81 ADD C ;ADD BIT OFFSET JR COMN ;CONTINUE AT COMMON CODE 1720+1801 DB 18H,COMN-$-1 BC2: 1722 79 MOV A,C ;GET BIT OFFSET COMN: 1723 C604 ADI 04H ;CHIP TABLE OFFSET 1725 C1 POP B ;RESTORE RELOC FLAG 1726 47 MOV B,A ;SAVE MESSAGE OFFSET JR GALERROR ;REPORT ERROR 1727+1800 DB 18H,GALERROR-$-1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ERROR NUMBER PAGE/RANGE ; ; 0 PAGE 0 / RANGE C000 TO FFFF ; 1 PAGE 0 / RANGE 0000 TO BFFF ; 2 PAGE 1 / RANGE 0000 TO BFFF ; 3 PAGE 2 / RANGE 0000 TO 3FFF ; GALERROR: 1729 214E17 LXI H,JGALER0 ;POINT TO JUMP TABLE ERRREPORT: 172C 110000 LXI D,0 ;INITIAL OFFSET OF ZERO 172F 79 MOV A,C ;GET RELOCATION FLAG 1730 B7 ORA A ;SET FLAGS JRZ SKIP ;IF ERROR 0 THEN NOT RELOCATED 1731+2803 DB 28H,SKIP-$-1 1733 1100C0 LXI D,OFFSET ;RELOCATED,GET OFFSET SKIP: 1736 19 DAD D ;ADD IN RELOCATE OFFSET 1737 1600 MVI D,0 ;CLEAR TEMP STORAGE 1739 58 MOV E,B ;GET ERROR NUMBER 173A 19 DAD D ;MODIFY POINTER WITH ERROR NUMBER 173B 19 DAD D ;ADJUST FOR TWO BYTES 173C 5E MOV E,M ;GET LOWBYTE OF ERROR MESSAGE ADDR 173D 23 INX H ;POINT TO HIGH BYTE CP/M MACRO ASSEM 2.0 #091 COLD BOOT LOADER FOR VISUAL 1050 173E 56 MOV D,M ;GET HIGHBYTE OF ERROR MESSAGE ADDR 173F EB XCHG ;MOV ADDRESS TO HL 1740 110000 LXI D,0 ;INITIAL OFFSET OF ZERO 1743 79 MOV A,C ;GET RELOCATION FLAG 1744 B7 ORA A ;SET FLAGS JRZ SKIP1 ;IF ERROR 0 THEN NOT RELOCATED 1745+2803 DB 28H,SKIP1-$-1 1747 1100C0 LXI D,OFFSET ;RELOCATED,GET OFFSET SKIP1: 174A 19 DAD D ;ADD IN RELOCATE OFFSET JR MESDPLY ;DISPLAY MESSAGE 174B+1829 DB 18H,MESDPLY-$-1 174D 76 HLT ;STOP EVERYTHING ; JGALER0: 174E 8D17BB17E9 DW GALERR0,GALERR1,GALERR2,GALERR3 1756 4518541863 DW CHIP00,CHIP01,CHIP02,CHIP03 175E 811890189F DW CHIP04,CHIP05,CHIP06,CHIP07 1766 BD18CC18DB DW CHIP10,CHIP11,CHIP12,CHIP13 176E F918081917 DW CHIP14,CHIP15,CHIP16,CHIP17 ; ; > > > MESSAGE DISPLAY SUBROUTINE < < < ; MESDPLY: 1776 DB86 IN P$DISP$C ;GET PIO STATUS 1778 0F RRC ;TEST READY JRNC MESDPLY ;NOT READY, CHECK AGAIN 1779+30FB DB 30H,MESDPLY-$-1 177B 7E MOV A,M ;GET CHARATER 177C FE24 CPI '$' ;TEST TERMINATION JRZ DPLYEXIT ;MESSAGE DONE -- RETURN 177E+280C DB 28H,DPLYEXIT-$-1 1780 D385 OUT P$DISP$OUT ;PUT IN DATA 1782 3E0E MVI A,0EH ;STROBE 1784 D387 OUT P$DISP$CONTROL ; 1786 3C INR A ;STROBE OFF 1787 D387 OUT P$DISP$CONTROL ; 1789 23 INX H ;BUMP ADDRESS POINTER JR MESDPLY ;GO CHECK NEXT CHARACTER 178A+18EA DB 18H,MESDPLY-$-1 DPLYEXIT: 178C C9 RET ;RETURN TO CALLER ; GALERR0: 178D 1B5B353B37 DB ESC,'[5;7m' 1793 52616D2045 DB 'Ram Error Page 0 / Range C000 to FFFF',CR,LF,'$' GALERR1: 17BB 1B5B353B37 DB ESC,'[5;7m' 17C1 52616D2045 DB 'Ram Error Page 0 / Range 0000 to BFFF',CR,LF,'$' GALERR2: 17E9 1B5B353B37 DB ESC,'[5;7m' 17EF 52616D2045 DB 'Ram Error Page 1 / Range 0000 to BFFF',CR,LF,'$' GALERR3: 1817 1B5B353B37 DB ESC,'[5;7m' 181D 52616D2045 DB 'Ram Error Page 2 / Range 0000 to 3FFF',CR,LF,'$' CP/M MACRO ASSEM 2.0 #092 COLD BOOT LOADER FOR VISUAL 1050 CHIP00: 1845 52616D2045 DB 'Ram Error U105','$' CHIP01: 1854 52616D2045 DB 'Ram Error U104','$' CHIP02: 1863 52616D2045 DB 'Ram Error U103','$' CHIP03: 1872 52616D2045 DB 'Ram Error U110','$' CHIP04: 1881 52616D2045 DB 'Ram Error U109','$' CHIP05: 1890 52616D2045 DB 'Ram Error U108','$' CHIP06: 189F 52616D2045 DB 'Ram Error U107','$' CHIP07: 18AE 52616D2045 DB 'Ram Error U106','$' CHIP10: 18BD 52616D2045 DB 'Ram Error U128','$' CHIP11: 18CC 52616D2045 DB 'Ram Error U127','$' CHIP12: 18DB 52616D2045 DB 'Ram Error U126','$' CHIP13: 18EA 52616D2045 DB 'Ram Error U133','$' CHIP14: 18F9 52616D2045 DB 'Ram Error U132','$' CHIP15: 1908 52616D2045 DB 'Ram Error U131','$' CHIP16: 1917 52616D2045 DB 'Ram Error U130','$' CHIP17: 1926 52616D2045 DB 'Ram Error U129','$' LOGMSG: 1935 1B6300 DB ESC,'c',00H ;RESET SCREEN 1938 1B5B376D DB ESC,'[7m' ;REVERSE VIDEO 193C 47616C7061 DB 'Galpat Memory Diagnostic' 1954 1B5B6D0D0A DB ESC,'[m',CR,LF,'$' ; MKBMSG: 195A 1B6300 DB ESC,'c',0 ;RESET SCREEN 195D 1B5B376D DB ESC,'[7m' ;REVERSE VIDEO 1961 4661737420 DB 'Fast Memory Diagnostic' 1977 1B5B6D0D0A DB ESC,'[m',CR,LF,'$' ; 197D 54 CHAR DB 'T' ;PROMPT CHARACTER TO BE DISPLAYED 197E 00 RELOC DB 0 ;RELOCATION FLAG 0=NOT RELOCATED ; 1=RELOCATED PAGE CP/M MACRO ASSEM 2.0 #093 COLD BOOT LOADER FOR VISUAL 1050 ; ; FLOP: 197F 21AC19 LXI H,WRNMES ;PRINT WARNING MESSAGE 1982 C3591A JMP FLOP1 ;GO TO FLOPPY TEST FLPTST: 1985 0C1B5B376D DB FF,ESC,'[7m' 198A 0D0A464C4F DB CR,LF,'FLOPPY DISK TEST IN PROGRESS',ESC,'[m','$' WRNMES: 19AC 0C0A0A1B5B DB FF,LF,LF,ESC,'[7m' 19B3 202A2A2A2A DB ' **** WARNING **** ' 19C9 0D0A444154 DB CR,LF,'DATA WILL BE DESTROYED' 19E1 1B5B6D DB ESC,'[m' 19E4 0D0A0A494E DB CR,LF,LF,'INSERT FORMATTED' 19F7 204449534B DB ' DISKETTES INTO DRIVES.' 1A0E 0D0A0A5052 DB CR,LF,LF,'PRESS RETURN WHEN READY.','$' DELYERR: 1A2A 0D0A1B5B37 DB CR,LF,ESC,'[7m' 1A30 53454C4543 DB 'SELECTED DRIVE NOT READY',ESC,'[m','$' ; ; > > > WAIT 1 MILLISECOND < < < ; DEL1MS: 1A4C F5 PUSH PSW ;SAVE ACC AND STATUS FLAGS 1A4D C5 PUSH B ;SAVE BC REGISTERS 1A4E 019800 LXI B,0098H ;LOAD BC WITH PARAMETER FOR 1 MSEC DELAY: 1A51 0B DCX B ;DECREMENT COUNTER 1A52 78 MOV A,B ;GET UPPER BYTE OF COUNTER 1A53 B1 ORA C ;COMBINE WITH LOWER BYTE JRNZ DELAY ;IF NOT DONE, DO SOME MORE 1A54+20FB DB 20H,DELAY-$-1 1A56 C1 POP B ;RESTORE SAVED BC REGISTERS 1A57 F1 POP PSW ;RESTORE SAVED ACC AND STATUS 1A58 C9 RET ;RETURN FROM SUBROUTINE ; ; PAGE CP/M MACRO ASSEM 2.0 #094 COLD BOOT LOADER FOR VISUAL 1050 ;**********************************************************; ; ; ; FLOPPY DISK TEST ; ; ; ;**********************************************************; FLOP1: 1A59 CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; FLOP2: 1A5C F3 DI ;DISABLE INTERRUPTS 1A5D AF XRA A ;ZERO ACC 1A5E D39D OUT P$CLK$PORTB ;MASK INTERRUPTS 1A60 FB EI ;ENABLE INTERRUPTS 1A61 DB89 IN P$KB$CONTROL ;READ KEYBOARD PORT CONTROL BIT 1,A ;CHECK BIT 1 OF ACC 1A63+CB4F DB 0CBH,1*8+A+40H JRZ FLOP2 ;NO CHARACTER SO GO LOOK AGAIN 1A65+28F5 DB 28H,FLOP2-$-1 1A67 DB88 IN P$KB$DATA ;READ KEYBOARD DATA PORT 1A69 FE0D CPI 0DH ;IS IT A CARRIAGE RETURN ? JRNZ FLOP2 ;NO, SO GO LOOK AGAIN 1A6B+20EF DB 20H,FLOP2-$-1 ; ; 1A6D 218519 LXI H,FLPTST ;POINT TO IN PROGRSS MESSAGE 1A70 CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; ; 1A73 3E0E MVI A,0EH ;MOTORS ON, SELECT DRIVE 0 1A75 D390 OUT P$DISK$BITS ;DO IT 1A77 3E18 MVI A,18H ;DO DUMMY SEEK TO ACT HLD 1A79 CDDA1A CALL FDOIT1 ;HLD STARTS MOTORS ; ; > > > WAIT 850 MILLISECONDS < < < ; 1A7C F5 PUSH PSW ;SAVE ACC AND STATUS 1A7D C5 PUSH B ;SAVE BC REGISTERS 1A7E 014903 LXI B,0349H ;PARAMATER FOR 850 MILLISECONDS DEL850: 1A81 CD4C1A CALL DEL1MS ;WAIT 1 MILLISECOND 1A84 0B DCX B ;DECREMENT COUNT 1A85 78 MOV A,B ;GET UPPER COUNTER BYTE 1A86 B1 ORA C ;COMBINE WITH LOWER COUNT BYTE JRNZ DEL850 ;IF NOT DONE, DO SOME MORE 1A87+20F8 DB 20H,DEL850-$-1 1A89 C1 POP B ;RESTORE SAVDE BC REGISTERS 1A8A F1 POP PSW ;RESTORE SAVED ACC AND STATUS ; ; > > > CHECK TO SEE IF READY < < < ; 1A8B DB94 IN P$DISK$CONTROL ;READ READY BIT 1A8D E680 ANI 80H ;ISOLATE READY BIT JRZ FLOPCONT ;IF READY, CONTINUE WITH TEST 1A8F+2806 DB 28H,FLOPCONT-$-1 CP/M MACRO ASSEM 2.0 #095 COLD BOOT LOADER FOR VISUAL 1050 1A91 212A1A LXI H,DELYERR ;OTHERWISE, POINT TO ERROR MESSAGE 1A94 CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; ; FLOPCONT: 1A97 CDAD07 CALL FHOME ;RECAL DISK FIRST 1A9A 210082 LXI H,8200H ;START ADDRESS FLOP6: 1A9D 3E6D MVI A,6DH ;DATA 1A9F 77 MOV M,A ;WRITE MEM 1AA0 23 INX H ;INCREMENT POINTER 1AA1 3EB8 MVI A,0B8H ;DATA 1AA3 77 MOV M,A ;WRITE MEM 1AA4 23 INX H ;INCREMENT POINTER 1AA5 7C MOV A,H ;READ ADDRESS 1AA6 FE84 CPI 84H ;TEST FOR MAX ADDRESS JRNZ FLOP6 ;BACK TILL DONE 1AA8+20F3 DB 20H,FLOP6-$-1 1AAA AF XRA A ;USE DRIVE 0 1AAB 320620 STA FDRV ; 1AAE 210000 LXI H,0 ;TRACK 0 1AB1 220720 SHLD FTRK ; 1AB4 320920 STA FHED ;SIDE 0 1AB7 3C INR A ; 1AB8 320A20 STA FSEC ;SET SECTOR =1 1ABB 210082 LXI H,8200H ;SET DMA POINTER 1ABE 220B20 SHLD FDMAA ; 1AC1 3E01 MVI A,01H ;SET WRITE SECTOR FLAG 1AC3 320D20 STA FRWF ; 1AC6 AF XRA A ;SET 5" DBL DENSITY 1AC7 320E20 STA FPT+0 ; 1ACA 3EFF MVI A,0FFH ;SET PRECOMP TRK 255 1ACC 320F20 STA FPT+1 ; 1ACF 3E01 MVI A,01H ;SET STEP RATE 1AD1 321020 STA FPT+2 ; 1AD4 CDFE1A CALL FLOPPE ; 1AD7 C32E1C JMP FLOP7 ;NEXT TEST FDOIT1: 1ADA D394 OUT P$DISK$CONTROL ;COMMAND 1ADC 3E12 MVI A,18 ; FLOPB: 1ADE 3D DCR A ; 1ADF C2DE1A JNZ FLOPB ;63 USEC 1AE2 1161EA LXI D,60000+1 ; FLOPC: 1AE5 DB94 IN P$DISK$CONTROL ;READ STATUS 1AE7 0F RRC ;TEST COMPLETE 1AE8 D2FB1A JNC FLOPD ;BR IF DONE 1AEB 13 INX D ;WASTE TIME 1AEC 1B DCX D ; 1AED 13 INX D ; 1AEE 1B DCX D ; 1AEF 1B DCX D ;TEST FOR TIMEOUT 1AF0 7A MOV A,D ;TIME OUT IF D=0 1AF1 B3 ORA E ; CP/M MACRO ASSEM 2.0 #096 COLD BOOT LOADER FOR VISUAL 1050 JRNZ FLOPC ;1.2 SEC 1AF2+20F1 DB 20H,FLOPC-$-1 1AF4 3ED0 MVI A,0D0H ; 1AF6 D394 OUT P$DISK$CONTROL ;RESET FDC 1AF8 3EFF MVI A,0FFH ;RETURN CODE FOR TIMEOUT 1AFA C9 RET ; FLOPD: 1AFB DB94 IN P$DISK$CONTROL ;READ STATUS 1AFD C9 RET ; FLOPPE: 1AFE 3ED0 MVI A,0D0H ;END CURRENT COMMAND 1B00 D394 OUT P$DISK$CONTROL ; 1B02 210108 LXI H,FIRQ ; 1B05 22F2FF SHLD IVECT+2 ;CLEAR DESELECT INTERRUPT 1B08 EB XCHG ;DE IS ADDRESS SOURCE ; 1B09 3E03 MVI A,03H ; 1B0B D393 OUT P$8255$CONTROL ;FDC INTERRUPT ENABLE ; 1B0D 3A0E20 LDA FPT+0 ; 1B10 E6C0 ANI 0C0H ;DD/SD AND 5"/8" BITS 1B12 47 MOV B,A ;IN B 1B13 3A0620 LDA FDRV ; 1B16 3C INR A ;0123->1234 1B17 FE03 CPI 3 ; 1B19 FA1F1B JM FSEL$0A ;12 DONE 1B1C E606 ANI 06H ;34->24 1B1E 87 ADD A ;24->48 DONE FSEL$0A: 1B1F EE0F XRI 0FH ;DECODED DRIVE SELECT 1B21 B0 ORA B ; 1B22 47 MOV B,A ;INTO B 1B23 3A0920 LDA FHED ; 1B26 B7 ORA A ; 1B27 CA2E1B JZ FSEL$1A ;IF HEAD 1 THEN 1B2A 3E10 MVI A,10H ; 1B2C B0 ORA B ; 1B2D 47 MOV B,A ;SET HEAD 1 BIT IN B FSEL$1A: 1B2E 3A0720 LDA FTRK ; 1B31 210F20 LXI H,FPT+1 ; 1B34 BE CMP M ; 1B35 DA3C1B JC FSEL$2A ;IF TRACK>=WPRECOMP 1B38 3E20 MVI A,20H ; 1B3A B0 ORA B ; 1B3B 47 MOV B,A ;SET PRECOMP BIT FSEL$2A: 1B3C 78 MOV A,B ; 1B3D D390 OUT P$DISK$BITS ;MODES,DRIVE,HEAD SELECTED 1B3F DB94 IN P$DISK$CONTROL ;IF MOTORS ON 1B41 07 RLC ;READY LINE TELLS 1B42 D25C1B JNC FM$99A ;BR IF MOTOR IS ON 1B45 DB95 IN P$DISK$TRACK ;THEN TURN MOTOR ON 1B47 D397 OUT P$DISK$DATA ; 1B49 3E18 MVI A,18H ;DO DUMMY SEEK TO ACT HLD CP/M MACRO ASSEM 2.0 #097 COLD BOOT LOADER FOR VISUAL 1050 1B4B CDDA1A CALL FDOIT1 ;HLD STARTS MOTORS 1B4E 213002 LXI H,560 ;WAIT 500 MS FM$00A: 1B51 AF XRA A ; FM$01A: 1B52 3D DCR A ; 1B53 C2521B JNZ FM$01A ;896 US 1B56 2B DCX H ; 1B57 7D MOV A,L ; 1B58 B4 ORA H ; 1B59 C2511B JNZ FM$00A ;560*896US=502MS FM$99A: 1B5C 3A0720 LDA FTRK ;TRACK TO REG C 1B5F D395 OUT P$DISK$TRACK ;P$DISK$TRACK:=FTRKA[DRV] 1B61 3E1D MVI A,29 ;THEN WAIT 1 MS FT$X0A: 1B63 3D DCR A ; 1B64 C2631B JNZ FT$X0A ;104 US FT$X1A: 1B67 3D DCR A ; 1B68 C2671B JNZ FT$X1A ;+896 US=1 MS DELAY ; 1B6B 3A0720 LDA FTRK ;GET TRACK 1B6E CDB907 CALL FSEEK ;SEEK CORRECT TRACK ; 1B71 3A0A20 LDA FSEC ;SELECT SECTOR 1B74 D396 OUT P$DISK$SECTOR ; ; 1B76 210420 LXI H,FWF ;RESET LAST WRITE FLAG 1B79 3600 MVI M,0 ; 1B7B 3A0D20 LDA FRWF ;GET OPERATIONS FLAG 1B7E 4F MOV C,A ;TO REG C 1B7F 3A0920 LDA FHED ;GET HEAD 1B82 E601 ANI 1 ;MASK 1B84 07 RLC ;SHIFT 1B85 07 RLC ; 1B86 07 RLC ; 1B87 0D DCR C ;SET UP HEAD BIT 1B88 0C INR C ;TEST OPERATION 1B89 CA9C1B JZ FREAD$1 ;0=FREAD 1B8C 0D DCR C ; 1B8D CAA41B JZ FWRITE$1 ;1=WRITE 1B90 0D DCR C ; 1B91 CAB61B JZ FCHECK$1 ;2=CHECK SECTOR 1B94 0D DCR C ; 1B95 CAA91B JZ FFORMAT$1 ;3=FORMAT TRACK 1B98 AF XRA A ;RETURN CODE 0 FOR SEEK 1B99 C30F1C JMP FDONE1 ;NO DATA TRANSFER FREAD$1: 1B9C F682 ORI 82H ; 1B9E 21EDA2 LXI H,0A2EDH ;IN I 1BA1 C3BE1B JMP FOPER1 ;GO READ FWRITE$1: 1BA4 F6A2 ORI 0A2H ; 1BA6 C3AE1B JMP FW2 ;GO WRITE CP/M MACRO ASSEM 2.0 #098 COLD BOOT LOADER FOR VISUAL 1050 FFORMAT$1: 1BA9 3EF0 MVI A,0F0H ;GO WRITE TRACK 1BAB C3AE1B JMP FW2 ;GO WRITE FW2: 1BAE 36FF MVI M,0FFH ;SET LAST OPERATION FLAG 1BB0 21EDA3 LXI H,0A3EDH ;OUT I 1BB3 C3BE1B JMP FOPER1 ; FCHECK$1: 1BB6 F6C2 ORI 0C2H ; 1BB8 21ED40 LXI H,040EDH ;IN B,C 1BBB C3BE1B JMP FOPER1 ; FOPER1: 1BBE 2202D0 SHLD 0D002H ; EXAF ;GO TO ALT BANK 1BC1+08 DB 08H EXX ; 1BC2+D9 DB 0D9H 1BC3 E5 PUSH H ;SAVE HL 1BC4 C5 PUSH B ;SAVE BC 1BC5 F5 PUSH PSW ;SAVE A AND FLAGS 1BC6 2A0B20 LHLD FDMAA ;HL TO DMA ADDRESS 1BC9 0E97 MVI C,P$DISK$DATA ;DATA REG ADDRESS EXAF ;BACK TO NORMAL BANK 1BCB+08 DB 08H EXX ; 1BCC+D9 DB 0D9H 1BCD CDDA1A CALL FDOIT1 ;DO THE OPERATION EXAF ;GO TO ALT BANK 1BD0+08 DB 08H EXX ; 1BD1+D9 DB 0D9H 1BD2 F1 POP PSW ;RESTORE A,F 1BD3 C1 POP B ;BC 1BD4 E1 POP H ;HL EXAF ;BACK TO NORMAL BANK 1BD5+08 DB 08H EXX ; 1BD6+D9 DB 0D9H 1BD7 4F MOV C,A ;RETURN CODE TO REG C 1BD8 B7 ORA A ;TEST OK 1BD9 CA0F1C JZ FDONE1 ; 1BDC 3C INR A ;TEST FOR FF ERROR CODE 1BDD 3E05 MVI A,5 ;ASSUME ERROR CODE 5 1BDF 211A1F LXI H,DSK$OVR ;OVERRUN UNDERRUN ERROR 1BE2 CA061C JZ DSK$ERR ;EXIT CODE 5 IF TIMED OUT BIT 6,C ;TEST WRITE PROTECT 1BE5+CB71 DB 0CBH,6*8+C+40H 1BE7 3E04 MVI A,4 ;RETURN CODE FOR WRITE PROTECT 1BE9 21071E LXI H,DSK$WP ;POINT TO WRITE PROTECT ERROR 1BEC C2061C JNZ DSK$ERR ;WRITE PROTECT VIOLATION BIT 2,C ;TEST LOST DATA 1BEF+CB51 DB 0CBH,2*8+C+40H 1BF1 3E07 MVI A,7 ;SET RETURN CODE FOR LOST DATA 1BF3 21431E LXI H,DSK$LD ;POINT TO LOST DATA ERROR JRNZ DSK$ERR ;TEMP CODE 7 CP/M MACRO ASSEM 2.0 #099 COLD BOOT LOADER FOR VISUAL 1050 1BF6+200E DB 20H,DSK$ERR-$-1 BIT 4,C ;TEST NOT FOUND 1BF8+CB61 DB 0CBH,4*8+C+40H 1BFA 3E02 MVI A,2 ;RETURN CODE FOR NOT FOUND 1BFC 217B1E LXI H,DSK$ID ;POINT TO ID NOT FOUND ERROR JRNZ DSK$ERR ;TEMP CODE 2 1BFF+2005 DB 20H,DSK$ERR-$-1 1C01 21B01E LXI H,DSK$CRC ;POINT TO CRC ERROR 1C04 3E01 MVI A,1 ;CODE 1 FOR CRC ERROR DSK$ERR: 1C06 C3591F JMP FMTER0 ;GO REPORT ERROR DSK$ERR1: 1C09 21E21E LXI H,DSK$DTA ;GO REPORT DATA ERROR 1C0C C3591F JMP FMTER0 ; FDONE1: 1C0F DB95 IN P$DISK$TRACK ; 1C11 D397 OUT P$DISK$DATA ; 1C13 3E10 MVI A,10H ;SEEK CODE 1C15 CDDA1A CALL FDOIT1 ;DUMMY SEEK 1C18 116600 LXI D,NMI ; 1C1B 215820 LXI H,NMIBUF ; 1C1E 010800 LXI B,8 ; LDIR ;RESTORE NMI LOCS 1C21+EDB0 DB 0EDH,0B0H 1C23 210B08 LXI H,FTIRQ ;SET UP DESELT INTERRUPT 1C26 22F2FF SHLD IVECT+2 ; 1C29 3ED2 MVI A,0D2H ;IPT ON READY FALL 1C2B D394 OUT P$DISK$CONTROL ; 1C2D C9 RET ; FLOP7: 1C2E AF XRA A ;DRIVE 0 1C2F 320620 STA FDRV ; 1C32 210000 LXI H,0 ;TRACK 0 1C35 220720 SHLD FTRK ; 1C38 320920 STA FHED ;SIDE 0 1C3B 3C INR A ; 1C3C 320A20 STA FSEC ;SECTOR 1 1C3F 210085 LXI H,8500H ;DMA POINTER 1C42 220B20 SHLD FDMAA ; 1C45 AF XRA A ;READ FLAG 1C46 320D20 STA FRWF ; 1C49 320E20 STA FPT+0 ; 1C4C 3EFF MVI A,0FFH ;PRECOMP 1C4E 320F20 STA FPT+1 ; 1C51 3E01 MVI A,01H ;STEP RATE 1C53 321020 STA FPT+2 ; 1C56 CDFE1A CALL FLOPPE ;GO READ 1C59 210085 LXI H,8500H ; 1C5C 7E MOV A,M ; 1C5D FE6D CPI 6DH ;TEST DATA JRNZ DSK$ERR1 ;DATA ERROR 1C5F+20A8 DB 20H,DSK$ERR1-$-1 1C61 23 INX H ;INCREMENT POINTER 1C62 7E MOV A,M ; CP/M MACRO ASSEM 2.0 #100 COLD BOOT LOADER FOR VISUAL 1050 1C63 FEB8 CPI 0B8H ;TEST DATA JRNZ DSK$ERR1 ; 1C65+20A2 DB 20H,DSK$ERR1-$-1 ; 1C67 210082 LXI H,8200H ;RAM START ADDRESS FLOP8A: 1C6A 3E68 MVI A,68H ;DATA 1C6C 77 MOV M,A ; 1C6D 23 INX H ;INCREMENT POINTER 1C6E 3E6D MVI A,6DH ;DATA 1C70 77 MOV M,A ; 1C71 23 INX H ;INCREMENT POINTER 1C72 7C MOV A,H ; 1C73 FE84 CPI 84H ;MAX ADDRESS JRNZ FLOP8A ;BACK TILL DONE 1C75+20F3 DB 20H,FLOP8A-$-1 ; 1C77 AF XRA A ;DRIVE 0 1C78 320620 STA FDRV ; 1C7B 214000 LXI H,0040H ;TRACK XX 1C7E 220720 SHLD FTRK ; 1C81 AF XRA A ;SIDE 0 1C82 320920 STA FHED ; 1C85 3C INR A ; 1C86 320A20 STA FSEC ;SECTOR 1 1C89 210082 LXI H,8200H ;SET DMA POINTER 1C8C 220B20 SHLD FDMAA ; 1C8F 3E01 MVI A,01H ;SET WRITE DATA FLAG 1C91 320D20 STA FRWF ; 1C94 AF XRA A ;SET 5" DBL DENSITY 1C95 320E20 STA FPT+0 ; 1C98 3E2B MVI A,43 ;SET PRECOMP TRK 43 1C9A 320F20 STA FPT+1 ; 1C9D 3E01 MVI A,01H ;SET STEP RATE 1C9F 321020 STA FPT+2 ; 1CA2 3E40 MVI A,40H ;SET TRK 1CA4 CDB907 CALL FSEEK ;SEEK TO TRK XX 1CA7 CDFE1A CALL FLOPPE ; ; 1CAA AF XRA A ;DRIVE 0 1CAB 320620 STA FDRV ; 1CAE 214000 LXI H,0040H ;TRACK XX 1CB1 220720 SHLD FTRK ; 1CB4 AF XRA A ;SIDE 0 1CB5 320920 STA FHED ; 1CB8 3C INR A ; 1CB9 320A20 STA FSEC ;SECTOR 1 1CBC 210085 LXI H,8500H ;DMA POINTER 1CBF 220B20 SHLD FDMAA ; 1CC2 AF XRA A ;READ FLAG 1CC3 320D20 STA FRWF ; 1CC6 320E20 STA FPT+0 ;SET 5" DBL DENSITY 1CC9 3E43 MVI A,43H ;SET PRECOMP TRK 43 1CCB 320F20 STA FPT+1 ; CP/M MACRO ASSEM 2.0 #101 COLD BOOT LOADER FOR VISUAL 1050 1CCE 3E01 MVI A,01H ;SET STEP RATE 1CD0 321020 STA FPT+2 ; 1CD3 CDFE1A CALL FLOPPE ; 1CD6 210085 LXI H,8500H ;SET DMA POINTER 1CD9 7E MOV A,M ;READ DATA 1CDA FE68 CPI 68H ;COMPARE JRNZ DSK$ERR2 ;BAD DATA 1CDC+200C DB 20H,DSK$ERR2-$-1 1CDE 23 INX H ;INCREMENT POINTER 1CDF 7E MOV A,M ;READ DATA 1CE0 FE6D CPI 6DH ;COMPARE JRNZ DSK$ERR2 ;BAD DATA 1CE2+2006 DB 20H,DSK$ERR2-$-1 1CE4 CDAD07 CALL FHOME ;RECAL DISK 1CE7 C3F01C JMP FLOPAX ;NEXT TEST DSK$ERR2: 1CEA 21E21E LXI H,DSK$DTA ;GO REPORT DATA ERROR 1CED C3591F JMP FMTER0 ; ; FLOPAX: 1CF0 210082 LXI H,8200H ;START ADDRESS FLOPBX: 1CF3 3E6D MVI A,6DH ;DATA 1CF5 77 MOV M,A ;WRITE MEM 1CF6 23 INX H ;INCREMENT POINTER 1CF7 3EB8 MVI A,0B8H ;DATA 1CF9 77 MOV M,A ;WRITE MEM 1CFA 23 INX H ;INCREMENT POINTER 1CFB 7C MOV A,H ; 1CFC FE84 CPI 84H ;TEST FOR MAX ADDRESS JRNZ FLOPBX ;BACK TILL DONE 1CFE+20F3 DB 20H,FLOPBX-$-1 1D00 3E01 MVI A,01H ;USE DRIVE 01 1D02 320620 STA FDRV ; 1D05 210000 LXI H,0 ;TRACK 0 1D08 220720 SHLD FTRK ; 1D0B AF XRA A ; 1D0C 320920 STA FHED ;SIDE 0 1D0F 3C INR A ; 1D10 320A20 STA FSEC ;SET SECTOR =1 1D13 210082 LXI H,8200H ;SET DMA POINTER 1D16 220B20 SHLD FDMAA ; 1D19 3E01 MVI A,01H ;SET WRITE SECTOR FLAG 1D1B 320D20 STA FRWF ; 1D1E AF XRA A ;SET 5" DBL DENSITY 1D1F 320E20 STA FPT+0 ; 1D22 3EFF MVI A,0FFH ;SET PRECOMP TRK 255 1D24 320F20 STA FPT+1 ; 1D27 3E01 MVI A,01H ;SET STEP RATE 1D29 321020 STA FPT+2 ; ; 1D2C 3E0D MVI A,0DH ;SELECT DRIVE 1 (B:) 1D2E D390 OUT P$DISK$BITS ;DO IT ; 1D30 CDAD07 CALL FHOME ;RECAL DRIVE CP/M MACRO ASSEM 2.0 #102 COLD BOOT LOADER FOR VISUAL 1050 ; 1D33 CDFE1A CALL FLOPPE ; ; 1D36 3E01 MVI A,01H ;DRIVE 1 1D38 320620 STA FDRV ; 1D3B 210000 LXI H,0 ;TRACK 0 1D3E 220720 SHLD FTRK ; 1D41 AF XRA A ; 1D42 320920 STA FHED ;SIDE 0 1D45 3C INR A ; 1D46 320A20 STA FSEC ;SECTOR 1 1D49 210085 LXI H,8500H ;DMA POINTER 1D4C 220B20 SHLD FDMAA ; 1D4F AF XRA A ;READ FLAG 1D50 320D20 STA FRWF ; 1D53 320E20 STA FPT+0 ; 1D56 3EFF MVI A,0FFH ;PRECOMP 1D58 320F20 STA FPT+1 ; 1D5B 3E01 MVI A,01H ;STEP RATE 1D5D 321020 STA FPT+2 ; 1D60 CDFE1A CALL FLOPPE ;GO READ 1D63 210085 LXI H,8500H ; 1D66 7E MOV A,M ; 1D67 FE6D CPI 6DH ;COMPARE DATA JRNZ DSK$ERR3 ;GO REPORT ERROR 1D69+2009 DB 20H,DSK$ERR3-$-1 1D6B 23 INX H ; 1D6C 7E MOV A,M ; 1D6D FEB8 CPI 0B8H ;COMPARE DATA JRNZ DSK$ERR3 ;GO REPORT ERROR 1D6F+2003 DB 20H,DSK$ERR3-$-1 1D71 C37A1D JMP FLOPDX ;NEXT TEST DSK$ERR3: 1D74 21E21E LXI H,DSK$DTA ;POINTER FOR DATA ERROR 1D77 C3591F JMP FMTER0 ;GO REPORT ERROR FLOPDX: 1D7A 210082 LXI H,8200H ;RAM START ADDRESS FLOPEX: 1D7D 3EB8 MVI A,0B8H ;DATA 1D7F 77 MOV M,A ; 1D80 23 INX H ;INCREMENT POINTER 1D81 3E6D MVI A,6DH ; 1D83 77 MOV M,A ; 1D84 23 INX H ; 1D85 7C MOV A,H ; 1D86 FE84 CPI 84H ;MAX ADDRESS JRNZ FLOPEX ;BACK TILL DONE 1D88+20F3 DB 20H,FLOPEX-$-1 ; 1D8A 3E01 MVI A,01H ;DRIVE 1 1D8C 320620 STA FDRV ; 1D8F 214000 LXI H,0040H ;TRACK XX 1D92 220720 SHLD FTRK ; 1D95 AF XRA A ;SIDE 0 CP/M MACRO ASSEM 2.0 #103 COLD BOOT LOADER FOR VISUAL 1050 1D96 320920 STA FHED ; 1D99 3C INR A ; 1D9A 320A20 STA FSEC ;SECTOR 1 1D9D 210082 LXI H,8200H ;SET DMA POINTER 1DA0 220B20 SHLD FDMAA ; 1DA3 3E01 MVI A,01H ;SET WRITE DATA FLAG 1DA5 320D20 STA FRWF ; 1DA8 AF XRA A ;SET 5" DBL DENSITY 1DA9 320E20 STA FPT+0 ; 1DAC 3E2B MVI A,43 ;SET PRECOMP TRK 43 1DAE 320F20 STA FPT+1 ; 1DB1 3E01 MVI A,01H ;SET STEP RATE 1DB3 321020 STA FPT+2 ; 1DB6 3E40 MVI A,40H ;TRACK 1DB8 CDB907 CALL FSEEK ; 1DBB CDFE1A CALL FLOPPE ; ; 1DBE 3E01 MVI A,01H ;DRIVE 1 1DC0 320620 STA FDRV ; 1DC3 214000 LXI H,0040H ;TRACK XX 1DC6 220720 SHLD FTRK ; 1DC9 AF XRA A ;SIDE 0 1DCA 320920 STA FHED ; 1DCD 3C INR A ; 1DCE 320A20 STA FSEC ;SECTOR 1 1DD1 210085 LXI H,8500H ;DMA POINTER 1DD4 220B20 SHLD FDMAA ; 1DD7 AF XRA A ;READ FLAG 1DD8 320D20 STA FRWF ; 1DDB 320E20 STA FPT+0 ;SET 5" DBL DENSITY 1DDE 3E2B MVI A,43 ;SET PRECOMP 1DE0 320F20 STA FPT+1 ; 1DE3 3E01 MVI A,01H ;SET STEP RATE 1DE5 321020 STA FPT+2 ; 1DE8 CDFE1A CALL FLOPPE ;GO READ 1DEB CDAD07 CALL FHOME ;RECAL DISK 1DEE 210085 LXI H,8500H ; 1DF1 7E MOV A,M ; 1DF2 FEB8 CPI 0B8H ;COMPARE DATA JRNZ DSK$ERR4 ;DATA ERROR 1DF4+200B DB 20H,DSK$ERR4-$-1 1DF6 23 INX H ; 1DF7 7E MOV A,M ; 1DF8 FE6D CPI 6DH ;COMPARE DATA JRNZ DSK$ERR4 ;DATA ERROR 1DFA+2005 DB 20H,DSK$ERR4-$-1 1DFC 3E4F MVI A,4FH ;DESELECT DRIVES & TURN MOTORS OFF 1DFE D390 OUT P$DISK$BITS ;TELL FLOPPIES ABOUT IT 1E00 C9 RET ;DISK TEST DONE DSK$ERR4: 1E01 21E21E LXI H,DSK$DTA ;DATA ERROR 1E04 C3591F JMP FMTER0 ;GO REPORT ERROR DSK$WP: 1E07 0C464C4F50 DB FF,'FLOPPY DISK TEST' 1E18 0D0A575249 DB CR,LF,'WRITE PROTECT ERROR' CP/M MACRO ASSEM 2.0 #104 COLD BOOT LOADER FOR VISUAL 1050 1E2D 0D0A545950 DB CR,LF,'TYPE RETURN TO EXIT','$' DSK$LD: 1E43 0C464C4F50 DB FF,'FLOPPY DISK TEST' 1E54 0D0A4C4F53 DB CR,LF,'LOST DATA ERROR' 1E65 0D0A545950 DB CR,LF,'TYPE RETURN TO EXIT','$' DSK$ID: 1E7B 0C464C4F50 DB FF,'FLOPPY DISK TEST' 1E8C 0D0A494420 DB CR,LF,'ID NOT FOUND' 1E9A 0D0A545950 DB CR,LF,'TYPE RETURN TO EXIT','$' DSK$CRC: 1EB0 0C464C4F50 DB FF,'FLOPPY DISK TEST' 1EC1 0D0A435243 DB CR,LF,'CRC ERROR' 1ECC 0D0A545950 DB CR,LF,'TYPE RETURN TO EXIT','$' DSK$DTA: 1EE2 0C464C4F50 DB FF,'FLOPPY DISK TEST' 1EF3 0D0A524541 DB CR,LF,'READ DATA ERROR' 1F04 0D0A545950 DB CR,LF,'TYPE RETURN TO EXIT','$' DSK$OVR: 1F1A 0C464C4F50 DB FF,'FLOPPY DISK TEST' 1F2B 0D0A4F5645 DB CR,LF,'OVERRUN UNDERRUN ERROR' 1F43 0D0A545950 DB CR,LF,'TYPE RETURN TO EXIT','$' ; FMTER0: 1F59 CD7617 CALL MESDPLY ;DISPLAY MESSAGE ; FMTER1: 1F5C F3 DI ;DISABLE INTERRUPTS 1F5D AF XRA A ;RESET ACC TO ZERO 1F5E D39D OUT P$CLK$PORTB ;MASK INTERRUPTS 1F60 FB EI ;ENABLE INTERRUPTS 1F61 DB89 IN P$KB$CONTROL ;READ KEYBOARD BIT 1,A ;TEST FOR KEY 1F63+CB4F DB 0CBH,1*8+A+40H JRZ FMTER1 ;NO KEY 1F65+28F5 DB 28H,FMTER1-$-1 1F67 C9 RET ;BACK ; ; INTVECTS: ;>>> SET UP INTERRUPT VECTORS <<< 1F68 21FBC9 LXI H,(EI)+256*(RET) ;SET UP NULL INTERRUPT HANDLER 1F6B 22EEFF SHLD NINT ;. . 1F6E 212A0A LXI H,AINT ;LOAD HL WITH 1-ST INTERRUPT (I0) 1F71 22FEFF SHLD IVECT+14 ;...STORE IN TABLE 1F74 212A0A LXI H,EXTINT ;LOAD HL WITH 2-ND INTERRUPT (I1) 1F77 22FCFF SHLD IVECT+12 ;...STORE IN TABLE 1F7A 21370A LXI H,KINT ;LOAD HL WITH 3-RD INTERRUPT (I2) 1F7D 22FAFF SHLD IVECT+10 ;...STORE IN TABLE 1F80 210108 LXI H,FIRQ ;LOAD HL WITH 4-TH INTERRUPT (I3) 1F83 22F8FF SHLD IVECT+8 ;...STORE IN TABLE 1F86 212A0A LXI H,ZVINT ;LOAD HL WITH 5-TH INTERRUPT (I4) 1F89 22F6FF SHLD IVECT+6 ;...STORE IN TABLE 1F8C 212A0A LXI H,ZDINT ;LOAD HL WITH 6-TH INTERRUPT (I5) 1F8F 22F4FF SHLD IVECT+4 ;...STORE IN TABLE 1F92 212A0A LXI H,XINTB ;LOAD HL WITH 7-TH INTERRUPT (I6) 1F95 22F2FF SHLD IVECT+2 ;...STORE IN TABLE CP/M MACRO ASSEM 2.0 #105 COLD BOOT LOADER FOR VISUAL 1050 1F98 212A0A LXI H,XINTA ;LOAD HL WITH 8-TH INTERRUPT (I7) 1F9B 22F0FF SHLD IVECT ;...STORE IN TABLE 1F9E 3EFF MVI A,IVECT/256 ;SET UP I REGISTER STAI ;. . 1FA0+ED47 DB 0EDH,47H ; 1FA2 21FFFF LXI H,0FFFFH ;RESET CURRENT TRACK STATUS 1FA5 220020 SHLD FTRKA ;. . 1FA8 220220 SHLD FTRKA+2 ;. . 1FAB AF XRA A ;RESET LAST WAS WRITE 1FAC 320420 STA FWF ;. . 1FAF 3E07 MVI A,07H ;SET DISK TIMEOUT 1FB1 210040 LXI H,4000H ;SET ADDRESS 1FB4 77 MOV M,A ;STORE IT 1FB5 2100D0 LXI H,0D000H ;START ADDRESS FOR NMI 1FB8 3E08 MVI A,08H ;08 ('EX') 1FBA 77 MOV M,A ; 1FBB 23 INX H ; 1FBC 3ED9 MVI A,0D9H ;D9 ('EXX') 1FBE 77 MOV M,A ; 1FBF 23 INX H ; 1FC0 3EED MVI A,0EDH ;ED ('INI') 1FC2 77 MOV M,A ; 1FC3 23 INX H ; 1FC4 3EA2 MVI A,0A2H ;A2 1FC6 77 MOV M,A ; 1FC7 23 INX H ; 1FC8 3ED9 MVI A,0D9H ;D9 ('EXX') 1FCA 77 MOV M,A ; 1FCB 23 INX H ; 1FCC 3E08 MVI A,08H ;08 ('EX') 1FCE 77 MOV M,A ; 1FCF 23 INX H ; 1FD0 3E21 MVI A,21H ;21 ('LXI H,006AH') 1FD2 77 MOV M,A ; 1FD3 23 INX H ; 1FD4 3E6A MVI A,6AH ;6A 1FD6 77 MOV M,A ; 1FD7 23 INX H ; 1FD8 AF XRA A ;00 1FD9 77 MOV M,A ; 1FDA 23 INX H ; 1FDB 3EE9 MVI A,0E9H ;E9 ('PCHL') 1FDD 77 MOV M,A ; ; 1FDE C9 RET ;RETURN FROM SUBROUTINE ; ; 1FFF ORG 1FFFH ; ; 1FFF 00 DB 00H ;<<< CHECK SUM VALUE >>> ; ; 2000 ORG 2000H CP/M MACRO ASSEM 2.0 #106 COLD BOOT LOADER FOR VISUAL 1050 ; ; ;*** VARIABLES ;* FOR FLOPPY RW ; ; 2000 FTRKA: DS 4 ;FLOPPY TRACK TABLE 2004 FWF: DS 1 ;"LAST OPERATION WAS A WRITE" FLAG 2005 FTRYCNT:DS 1 ;TRY COUNTER WHEN RETRYING FADR: ;OPERATION TABLE 2006 FDRV: DS 1 ;DRIVE 2007 FTRK: DS 2 ;TRACK 2009 FHED: DS 1 ;HEAD 200A FSEC: DS 1 ;SECTOR 200B FDMAA: DS 2 ;DMA ADDRESS 200D FRWF: DS 1 ;READ/WRITE/CHECK/FORMAT FLAG 200E FPT: DS 1 ;(MODE PARAM) MODE BITS (8"/5",SD/DD) 200F DS 1 ;(HARD PARAM ) WPRECOMP IF >= THIS TRACK 2010 DS 1 ; STEP RATE 000B = FADRLEN EQU $-FADR ;* ADDRESSES FOR MONITOR OPERATIONS MATBL: 2011 MDRV: DS 1 ;DRIVE # 2012 MTRK: DS 2 ;TRACK # 2014 MHED: DS 1 ;HEAD # 2015 MSEC: DS 1 ;SECTOR # 2016 MDMAA: DS 2 ;BUFFER POINTER 2018 MRWFLAG:DS 1 ;READ WRITE FLAG 2019 MFIXMOD:DS 7 2020 MVARMOD:DS 9 WADR: 2029 WDRIVE: DS 1 202A WTRK: DS 2 202C WHED: DS 1 202D WSEC: DS 1 202E WDMAA: DS 2 2030 WRWF: DS 1 ;READ/WRITE/CHECK/FORMAT FLAG 2031 WPT: DS 1 0009 = WADRLEN EQU $-WADR WCB: 2032 OP: DS 1 2033 ADH: DS 1 2034 ADM: DS 1 2035 ADL: DS 1 2036 INTL: DS 1 ;BLOCK COUNT/INTERLEAVE 2037 STEPM DS 1 ;(STEP MODES) ;(EXTENTION OF WCB WHEN SETTING DRIVE CHARACTERISTICS ONLY) 2038 WCB1 DS 2 203A HEDS DS 1 CP/M MACRO ASSEM 2.0 #107 COLD BOOT LOADER FOR VISUAL 1050 203B START$RED DS 2 203D START$PRE DS 2 203F MAXIECC DS 1 ; MAX ECC DATA BURST LENGTH (LEL0384) 2050 ORG 2050H ; ; 2050 YEAR DS 1 2051 MONTH DS 1 2052 DAY DS 1 2053 HOUR DS 1 2054 MIN DS 1 2055 SEC DS 1 2056 GOTTEN: DS 2 ;AMOUNT OF SYSTEM ALREADY GOTTEN 2058 NMIBUF: DS 8 ;HOLDS NMI LOCS WHILE OVERLAYED 2060 WACCF: DS 1 ;FIRST ACCESS FLAG 2061 STAT: DS 1 ;COARSE STATUS BYTE (EVERYTIME) 2062 LSTAT: DS 4 ;FINE STATUS BYTES (FROM REQUEST SENSE STATUS COMMAND) 2066 DS 1 ;NUMBER OF BAD TRACKS 2067 BADTRACK:DS MAXBAD*2 ;ROOM FOR (10) BAD TRACKS ; ; DATA AREAS USED IN REAL TIME CLOCK OPERATIONS ; 504F ORG 504FH 504F PASS$FLG DS 1 ; FLAG USED TO TELL PASS THRU CODE (LEL0284) 5050 THE$DATE DS 8 ; DATE IN FORM XX/XX/XX (LEL0284) 5058 THE$TIME DS 8 ; TIME IN FORM XX:XX:XX (LEL0284) 5060 DS 1 ; (OVERFLOW AREA) (LEL0284) ; THESE TAGS PERTAIN TO THE LABEL RECORD ; ; 8000 ORG 8000H ; ; BUFFER: 8000 BSIG: DS 4 ;LABEL FLAG 8004 BSECSIZ:DS 2 ;SECTOR SIZE 8006 BNSECS: DS 1 ;# SECTORS/TRACK 8007 BNHEDS: DS 1 ;NUMBER OF HEADS 8008 BNTRKS: DS 2 ;# OF TRACKS 800A BTSKEW: DS 1 ;SKEW FACTOR 800B DS 9 ;DEAD SPACE 8014 BLDBG: DS 2 ;LOAD START ADDRESS 8016 BLDLN: DS 2 ;LOAD LENGTH 8018 BJMPA: DS 2 ;JUMP ADDRESS 801A DS 30 ;MORE DEAD SPACE 8038 BSTEPR: DS 1 ;STEP RATE 0 = FASTEST 8039 BORDR: DS 1 ;ORDER (0 = ALTERNATING HEADS) CP/M MACRO ASSEM 2.0 #108 COLD BOOT LOADER FOR VISUAL 1050 803A BFSEC: DS 1 ;FIRST SECTOR # ON A TRACK 803B BFTRK: DS 1 ;FIRST TRACK ON A SURFACE 803C BFHED: DS 1 ;FIRST HEAD ; C000 ORG 0C000H C000 BOOT$DRV DS 1 ;SIGNAL AS TO WHICH DRIVE BOOTING FROM (LEL0284)` ; FFDA ORG 0FFDAH ; ; FFDA = EXIT: EQU $ ;3-BYTE EXIT JUMP FFD9 = STACK: EQU EXIT-1 ;STACK AREA ; ; FFF0 ORG 0FFF0H ; ; FFF0 = IVECT EQU $ ;INTERRUPT VECTOR TABLE FFEE = NINT EQU IVECT-2 ;LOCATION FOR NULL HANDLER ; ; FFF0 END