ROMCTL EQU 0F6H ;OUT (ROMCTL),A ;TURN ON ROM ;IN A,(ROMCTL) ;TURN OFF ROM ORG 0 L0000H EQU 0 JP INIT ;L001DH JP MSGRM ;L01BAH output the string that DE points to JP HMRM ;L0410H JP RDHSRM ;L01D3H JP WRHSRM ;L01E0H JP DISRM ;L0264H JP L0393H JP L03DDH JP BTERM ;L0196H CP/M sys disk err. push reset ROMDATX:DB D4 DB 05 INIT: IM 0 ;INTERRUPT MODE 0 LD B,(HL) LD SP,L0000H LD IY,L05F3H CALL L005BH ;initialize serial ports LD DE,L070FH ;rom revision-copyright notice CALL L01B1H ;clear screen and print rom revision-copyright notice CALL L0081H ;check ROM for memory error CALL L00ACH ;relocate some code to FC00h and fill above that with 0FFs CALL L0090H ;check RAM for memory error CALL LFC00H LD DE,L078AH ;'Insert CP/M system diskette in drive A and press [RETURN]' CALL MSGRM ;L01BAH L0041H CALL L0378H ;get a character from terminal CP 00DH ;is character from terminal a Carriage Return? JR NZ,L0041H ;loop until CR typed at terminal LD DE,CRLFMSG CALL MSGRM ;L01BAH JP L0176H L0051H CALL MSGRM ;L01BAH LD DE,L06F3H ; 'Push reset to try again' CALL MSGRM ;L01BAH HALT ************************************************************************* * * * INITIALIZE THE SERIAL PORTS * * * ************************************************************************* 005B' LD A,080H OUT (0FDH),A ;TERMINAL UART COMMAND OUT (0FFH),A ;PRINTER UART COMMAND OUT (0FDH),A ;TERMINAL UART COMMAND OUT (0FFH),A ;PRINTER UART COMMAND LD A,040H OUT (0FDH),A ;TERMINAL UART COMMAND OUT (0FFH),A ;PRINTER UART COMMAND LD A,0CEH OUT (0FDH),A ;TERMINAL UART COMMAND OUT (0FFH),A ;PRINTER UART COMMAND LD A,037H OUT (0FDH),A ;TERMINAL UART COMMAND OUT (0FFH),A ;PRINTER UART COMMAND RET 0078' CRLFMSG:DB 0D,0A,00 007B' DB ':',A0,00 007E' PUSH BC OR 004H ***************************************************************** * * * ROM MEMORY CHECK * * * ***************************************************************** 0081' LD HL,L0000H ;beginning location to check LD BC,L07FDH ;count CALL L009FH LD DE,L07D9H ;'ROM MEMORY ERROR' JR NZ,L0051H RET ***************************************************************** * * * RAM MEMORY CHECK * * check RAM memory from FC00 to FFF8 * * * ***************************************************************** 0090' LD HL,LFC00H ;beginning location to check LD BC,L03F8H ;count L0096H CALL L009FH LD DE,L07C6H ;'RAM MEMORY ERROR' JR NZ,L0051H RET 009F' XOR A ;ZERO THE ACCUMULATOR (SET ZERO FLAG) PUSH AF L00A1H POP AF XOR (HL) INC HL ;next RAM/ROM location DEC BC ;decrement count PUSH AF L00A6H LD A,B ;\ OR C ; >LOOP IF COUNT NOT ZERO YET JR NZ,L00A1H ;/ POP AF RET ***************************************************************** * * * RELOCATE SOME CODE * * * ***************************************************************** 00AC' LD HL,L00C4H ;Source LD DE,LFC00H ;Destination LD BC,L00B2H ;Count LDIR ;Relocate code so it can execute with ROM off LD BC,L0345H ;Count L00BAH PUSH DE POP HL ;0FCB2h (source) INC DE ;DE+1=0FCB3h (destination) LD (HL),0FFH ;fill 345h bytes (to 0FFF8h) with FF (0000 down is stack) LDIR ;ripple the FF through 345h bytes LD (HL),01FH +B2 L00C3H RET =37Fh ***************************************************************** * * * THE FOLLOWING CODE WILL BE RELOCATED TO FC00h * * * ***************************************************************** .phase 0FC00h FC00' IN A,(0F6H) ;Turn off ROM LD A,(L0000H) ;Check for Warm boot jump instruction CP 0C3H OUT (0F6H),A ;Turn on ROM JR NZ,LFCOEH JP L003BH ;'Insert CP/M system diskette and press [RETURN]' FC0E' LD DE,L0757H ;'Testing memory...' CALL MSGRM ;L01BAH IN A,(0F6H) ;Turn off ROM LD HL,L0000H LD BC,LFBFFH FC1C' CALL LFC31H OR A OUT (0F6H),A ;Turn on ROM LD DE,L07C6H JP NZ,L0051H ;'Push reset to try again.' LD DE,L077BH ;'Memory O.K.' CALL MSGRM ;L01BAH JP L003BH ;'Insert CP/M system diskette and press [RETURN]' FC31' LD (LFCB2H),HL LD HL,LFC84H FC37' LD D,(HL) INC HL BIT 07H,(HL) JR NZ,LFC55H LD E,(HL) BIT 06H,E RES 06H,E INC HL PUSH HL JR Z,LFC4BH CALL LFC57H JR LFC52H FC4B' LD IX,LFC77H CALL LFC5BH FC52' POP HL JR LFC37H FC55' XOR A RET FC57' LD IX,LFC79H LD HL,(LFCB2H) LD A,E ADD A,L LD L,A LD A,H ADC A,000H LD H,A FC65' CALL LFC75H INC HL INC HL INC HL LD A,B CP H RET C FC6E' JR NZ,LFC65H LD A,C CP L RET C JR LFC65H FC75' JP (IX) LD (HL),D RET FC79' LD A,(HL) CP D JR NZ,LFC7EH RET FC7E' L0142H POP AF POP AF POP AF LD A,0FFH FC83' RET FC84' DB FF 00 00 01 FF 02 00 41 FF 42 FF 40 FC90' DB 00 00 FF 01 00 02 00 42 00 40 FF 41 AA 00 55 02 FCA0' DB AA 01 AA 41 55 01 AA 40 55 00 55 42 55 41 55 40 FCB0' DB 00 80 FCB2' 0176' LD HL,L05D4H ;source LD DE,LFF00H ;destination LD BC,L0042H ;count LDIR LD IX,LFF00H LD IY,LFF1FH CALL L0433H CALL L0264H LD A,(IX+07H) OR A JP Z,LFE00H ***** END OF RELOCATED CODE ?? *********** LD DE,L06D3H ;'Error on CP/M system diskette' JP L0051H ;'Push reset to try again' ***************************************************************** * * * CHARACTER OUTPUT: Send the character in the C register * * out the terminal serial port. * * * ***************************************************************** 019C' IN A,(0FDH) ;Terminal UART status port BIT 00H,A ;Transmitter buffer empty ? JR Z,L019CH ;Loop until empty LD A,C ;Character to send in A OUT (0FCH),A ;Terminal UART data port RET ***************************************************************** * * * CHARACTER INPUT: Get a character from the terminal * * serial port. Return it in the A register * * * ***************************************************************** 01A6' IN A,(0FDH) ;Terminal UART status port BIT 01H,A ;Character ready ? JR Z,L01A6H ;Loop until character ready IN A,(0FCH) ;Terminal UART data port AND 07FH ;Zero the parity bit RET ***************************************************************** * * * CLEAR THE SCREEN * * * ***************************************************************** 01B1' LD B,032H ;do 50 line feeds (clear screen) L01B3H LD A,00AH ;line feed character CALL L01C3H ;send a line feed to terminal DJNZ L01B3H ;continue 'til done ***************************************************************** * * * OUTPUT A STRING TO TERMINAL. on entry DE points to null * * terminated string. * * * ***************************************************************** 01BA' MSGRM: LD A,(DE) ;ON ENTRY, DE POINTS TO START OF STRING OR A ;PRINT ALL STRING CHARACTERS UNTIL A NULL RET Z CALL L01C3H INC DE JR MSGRM ;L01BAH ***************************************************************** * * * SEND THE CHARACTER IN THE A REGISTER. * * DE and HL preserved. * * * ***************************************************************** L01C3H: LD C,A PUSH DE PUSH HL LD L,(IY+16H) ;\ L01C9H LD H,(IY+17H) ; HL = FF00 for unrelocated rom code CALL L01D2H POP HL POP DE RET L01D2H: JP (HL) ;for unrelocated code, JP 019C' ;output the character in C RDHSRM: LD HL,L0393H LD (IX+0AH),L LD (IX+0BH),H LD C,006H WRHSRM: JR L01EBH LD HL,L03DDH LD (IX+0AH),L LD (IX+0BH),H LD C,005H L01EBH LD A,(IX+00H) CALL L04B8H INC HL LD A,(HL) AND 040H OR C LD (IX+16H),A LD (IX+15H),009H L01FDH LD A,018H L01FFH AND (HL) L0200H RRCA RRCA RRCA LD (IX+1BH),A LD B,080H LD DE,L0080H CP 000H JR Z,L0220H LD B,0FFH LD DE,L0000H CP 001H JR Z,L0220H LD D,001H CP 002H JR Z,L0220H LD D,003H L0220H LD (IX+1EH),B BIT 07H,(IX+0DH) JR NZ,L022FH LD (IX+0CH),E LD (IX+0DH),D L022FH XOR A BIT 02H,(HL) LD B,(IX+01H) LD C,(IX+02H) JR Z,L023DH RR B RLA L023DH LD (IX+19H),A RLCA RLCA L0242H LD (IX+09H),A L0245H LD (IX+08H),B LD (IX+18H),B LD (IX+1AH),C LD A,003H AND (HL) OR (IX+09H) LD (IX+17H),A LD DE,L0005H ADD HL,DE LD A,(HL) LD (IX+1CH),A INC HL LD A,(HL) LD (IX+1DH),A 0264' LD B,(IX+04H) LD DE,L0300H L026AH PUSH BC PUSH DE LD A,008H CALL L0435H CALL L0309H PUSH IY CALL L02C9H CALL L02FDH POP IY LD B,007H PUSH IX POP HL LD DE,L000EH ADD HL,DE L0287H CALL L0521H INI JR NZ,L0287H POP DE POP BC LD A,(IX+0EH) L0293H AND 040H JR Z,L02C4H CALL L0583H LD A,001H CP C L029DH JR Z,L02B4H LD A,006H CP C CALL Z,L040AH LD A,002H CP C CALL Z,L0430H INC E LD A,00BH CP B CALL Z,L042CH DJNZ L036AH L02B4H LD A,(IX+07H) CP 0FFH JR Z,L02C5H CALL L0317H JR C,L02C5H OR A JP NZ,L0264H L02C4H LD C,A L02C5H LD (IX+07H),C RET LD C,0FBH PUSH IX POP HL LD DE,L0015H ADD HL,DE LD B,(HL) INC HL CALL L0511H L02D7H CALL L0518H OUTI JR NZ,L02D7H LD B,(IX+0CH) LD E,(IX+0DH) RES 07H,E LD D,(IX+03H) DEC D LD L,(IX+0AH) LD H,(IX+0BH) PUSH HL POP IY LD L,(IX+05H) LD H,(IX+06H) RET L02FAH BIT 07H,A RET NZ IN A,(0FAH) BIT 05H,A JR Z,L02FAH PUSH DE LD DE,L0000H JP (IY) LD HL,L05CFH PUSH DE LD D,000H SRA E ADD HL,DE POP DE LD A,(HL) OUT (0F7H),A RET LD A,C RLCA LD E,A LD D,000H LD HL,L0614H ADD HL,DE LD E,(HL) INC HL LD D,(HL) PUSH BC PUSH DE LD DE,L0688H ;'Disk error on drive' CALL MSGRM LD A,041H ADD A,(IX+00H) L0330H CALL L01C3H L0333H LD DE,L007BH ;send a ':' and A0? to terminal CALL MSGRM POP DE CALL MSGRM CALL L0352H POP BC RET CALL MSGRM L0345H CALL L0378H CP 00DH JR NZ,L0345H LD DE,CRLFMSG JP MSGRM LD DE,L069FH ;'Type R to try again...' CALL MSGRM L0358H CALL L0378H AND 0DFH LD E,A CP 041H SCF JR Z,L036BH CP 052H JR Z,L036BH SUB 049H JR NZ,L0358H L036BH PUSH AF LD A,E CALL L01C3H LD DE,CRLFMSG CALL MSGRM POP AF RET 0378' PUSH HL LD L,(IY+18H) ;\ LD H,(IY+19H) ; HL = 016Ah for unrelocated code CALL L01D2H ;CALL JP (HL) POP HL RET L0384H AND 020H JR Z,L03BEH IN A,(0FAH) CP 0F0H JR Z,L0399H DEC DE LD A,E OR D JR Z,L03C0H IN A,(0FAH) CP 0F0H JR NZ,L0384H L0399H INI POP DE PUSH DE LD A,E OR D JR NZ,L03A2H DEC B L03A2H EI HALT IN A,(0FAH) AND 020H JR Z,L03BEH INI JR NZ,L03A2H DEC E JP P,L039DH POP DE DEC D PUSH DE JP P,L039DH L03B8H EI HALT IN A,(0F8H) INI L03BEH POP DE RET L03C0H LD A,008H OUT (0F7H),A L03C4H IN A,(0F5H) IN A,(0FAH) BIT 05H,A JR NZ,L03C4H JR L03BEH L03CEH AND 020H JR Z,L03BEH IN A,(0FAH) CP 0B0H JR Z,L03E3H DEC DE LD A,E OR D JR Z,L03C0H IN A,(0FAH) CP 0B0H JR NZ,L03CEH L03E3H OUTI POP DE PUSH DE LD A,E OR D JR NZ,L03ECH DEC B L03ECH EI HALT IN A,(0FAH) AND 020H JR Z,L03BEH OUTI JR NZ,L03ECH DEC E JP P,L03E7H POP DE DEC D PUSH DE JP P,L03E7H EI L0403H HALT IN A,(0F8H) OUTI POP DE RET DEC E DEC D RET NZ LD B,001H RET HMRM: BIT 01H,(IY+0BH) JR NZ,L041AH RES 00H,(IY+0BH) L041AH LD A,(IX+00H) PUSH AF LD A,(IY+00H) L0421H LD (IX+00H),A CALL L0433H POP AF LD (IX+00H),A RET LD E,000H JR L0433H CALL L040AH L0433H LD A,000H PUSH BC PUSH DE LD C,A LD A,(IX+00H) PUSH AF CALL L04B8H LD A,(HL) AND 007H LD E,A INC HL POP AF CP (IY+11H) JR Z,L0465H LD (IY+11H),A L044DH BIT 07H,(HL) PUSH BC JR Z,L0461H CP (IY+13H) LD (IY+13H),A PUSH AF PUSH DE PUSH HL CALL NZ,L04A5H POP HL POP DE POP AF L0461H CALL L054DH L0464H POP BC L0465H BIT 06H,(HL) JR Z,L0478H LD A,013H BIT 05H,(HL) JR Z,L0471H LD A,027H L0471H CP (IX+08H) JR NC,L0478H L0476H SET 03H,E L0478H LD A,007H OUT (0F7H),A IN A,(0F5H) AND 007H LD D,A AND E PUSH AF L0483H LD A,D OR E OUT (0F8H),A LD (IY+12H),A CALL L04C9H LD A,(IX+08H) BIT 03H,C JR Z,L0497H CP D JR Z,L049DH L0497H CALL L052AH POP AF SCF PUSH AF L049DH POP AF INC HL CALL L04D1H POP DE POP BC RET INC A SET 06H,A LD E,(IY+0FH) LD D,(IY+10H) LD (DE),A LD E,(IY+0DH) LD D,(IY+0EH) JP L0342H PUSH IY POP HL LD DE,L001AH ADD HL,DE LD D,A RLCA RLCA RLCA ADD A,D LD E,A LD D,000H ADD HL,DE RET PUSH HL LD DE,L0007H ADD HL,DE LD D,(HL) L04CFH POP HL RET LD B,(IY+12H) L04D4H LD C,0F8H LD D,(HL) LD E,000H INC HL JR NC,L0504H IM 002H LD A,000H LD I,A JR NZ,L04F0H EI L04E5H DEC DE LD A,D OR E JR Z,L04F2H LD C,0F8H OUT (C),B JR L04E5H L04F0H LD D,(HL) EI L04F2H OUT (C),B JR L04F2H IM 000H INC SP INC SP CALL L0576H LD A,D CP (HL) JR NC,L0505H LD D,(HL) JR L0505H L0504H RET NZ L0505H OUT (C),B OUT (C),B NOP DEC DE LD A,D OR E JP NZ,L0505H RET L0511H IN A,(0FAH) BIT 04H,A JR NZ,L0511H RET L0518H IN A,(0FAH) AND 0C0H CP 080H JR NZ,L0518H RET L0521H IN A,(0FAH) AND 0C0H CP 0C0H JR NZ,L0521H RET CALL L0518H LD A,007H OR C OUT (0FBH),A CALL L0518H LD A,003H AND (HL) BIT 03H,C JR Z,L053FH OR (IX+09H) L053FH OUT (0FBH),A BIT 03H,C RET Z CALL L0518H LD A,(IX+08H) OUT (0FBH),A RET PUSH HL INC HL INC HL INC HL CALL L0518H LD A,003H OUT (0FBH),A LD BC,L02FBH L055BH CALL L0518H OUTI JR NZ,L055BH POP HL RET CALL L0518H LD A,008H OUT (0FBH),A CALL L0521H IN A,(0FBH) CALL L0521H IN A,(0FBH) RET CALL L0564H PUSH HL PUSH DE LD DE,L0005H ADD HL,DE LD (HL),A POP DE POP HL RET LD C,001H BIT 01H,(IX+0FH) RET NZ INC C BIT 01H,(IX+10H) RET NZ BIT 04H,(IX+10H) RET NZ INC C BIT 05H,(IX+10H) RET NZ INC C BIT 05H,(IX+0FH) RET NZ INC C BIT 07H,(IX+0FH) RET NZ BIT 02H,(IX+0FH) RET NZ BIT 00H,(IX+0FH) RET NZ BIT 06H,(IX+10H) RET NZ BIT 00H,(IX+10H) RET NZ INC C BIT 03H,(IX+0EH) RET NZ INC C BIT 04H,(IX+0FH) RET NZ INC C BIT 04H,(IX+0EH) RET NZ INC C RET EX AF,AF' ADD HL,BC RLCA LD A,(BC) L05D3H LD B,000H NOP LD BC,L1401H NOP CP 000H NOP NOP SUB E INC BC NOP NOP NOP NOP NOP NOP NOP NOP NOP ADD HL,BC LD B,(HL) NOP NOP NOP LD BC,L0503H INC E RST 038H L05F3H NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP RST 038H NOP NOP NOP NOP SBC A,H LD BC,L01A6H LD BC,L58D8H DEC B LD L,A INC BC DEC B INC E RST 038H DEC (HL) LD B,028H LD B,046H LD B,046H LD B,052H LD B,068H LD B,05DH LD B,068H LD B,079H LD B,057H LD (HL),D 0628: Wrong track AE 00 0635: Write protected AE 00 0646: Data error AE 00 0652: Not found AE 00 065D: Lost data AE 00 0668: Drive not ready AE 00 0679: Unknown error AE 00 0D 0A 068A: Disk error on drive A0 00 0D 0A 06A1: Type R to try again, A to abort, or I to ignore: A0 00 0A 06D4: Error on CP/M system diskette. 00 0D 0A A0 06F5: Push reset to try again. A0 00 0D 0710: Micro-Decision -- ROM Rev. 1.3 0D 0A Copyright 1982 Morrow Designs, Inc. 0D 0A 00 0757: Testing memory -- please stand by: 20 00 077B: Memory O.K. 0D 0A 0A 00 078A: Insert CP/M system diskette in Drive A and press [RETURN] 20 07 00 07 07 07C8: RAM MEMORY ERROR 00 07 07 07DB: ROM Memory error 00 RST 038H RST 038H L07EEH RST 038H RST 038H RST 038H L07F1H RST 038H RST 038H RST 038H RST 038H RST 038H RST 038H RST 038H RST 038H RST 038H RST 038H RST 038H ROMREV: DB 13h ;REVISION 1.3 ROM RST 038H RST 038H RST 038H