; ; EDUCATOR 8080 ; ORG 100H ; CNTRL: LXI SP,STACK ;SET STACK POINTER TO PROGRAMMABLE MEMORY CALL INIT NOTZER: CALL DSPLY ;DISPLAY CONTENTS OF REGISTERS CALL CMDNT CALL FETCH ORA A JNZ NOTZER CALL XQTER JMP NOTZER ; ; THIS ROUTINE CONTROLS THE GENERATION OF THE DYNAMIC DISPLAY ; DSPLY: LXI H,TITLS CALL CHEDT LXI H,BLINE LDA BREG CALL DSPCV LXI H,CLINE LDA CREG CALL DSPCV LXI H,AFHDR CALL CHEDT LHLD PSWA MOV A,L ANI 00000100B CALL DSPFG MOV A,L ANI 01000000B CALL DSPFG MOV A,L ANI 10000000B CALL DSPFG MOV A,L ANI 00010000B CALL DSPFG MOV A,L ANI 00000001B CALL DSPFG MOV A,H CALL DSPCN RET ; ; THE DISPLAY CONVERSION ROUTINE PRINTS BINARY, OCTAL, AND HEX ; DSPCV: PUSH PSW CALL CHEDT POP PSW DSPCN: MVI E,10Q DSPBT: RLC PUSH PSW ANI 1 CALL DSPFG POP PSW DCR E JNZ DSPBT ORA A MVI E,3 DSPQT: RAL RAL RAL PUSH PSW ANI 7 ORI '0' CALL CHRPR POP PSW DCR E JNZ DSPQT CALL DSPSP MVI E,2 DSPHT: RLC RLC RLC RLC PUSH PSW ANI 00001111B ADI '0' CPI '9'+1 JC DSPHS ADI 7 DSPHS: CALL CHRPR POP PSW NOP DCR E JNZ DSPHT RET ; ; DISPLAY FLAG OR BINARY DIGIT FOLLOWED BY SPACE. ALTERNATE ENTRY ; IS USED TO DISPLAY A SPACE ; DSPFG: JZ DSPFZ MVI A,1 DSPFZ: ADI '0' CALL CHRPR DSPSP: PUSH PSW MVI A,' ' CALL CHRPR POP PSW RET ; ; THE CHARACTER STRING OUTPUT EDIT ROUTINE ; CHEDT: MOV A,M CPI 200Q RZ JNC CHSPA CALL CHRPR CHEND: INX H JMP CHEDT CHSPA: SUI 200Q MOV B,A CHSPL: MVI A,' ' CALL CHRPR DCR B JNZ CHSPL JMP CHEND ; ; THE COMMAND ENTRY ROUTINE ACCEPTS INPUT FROM THE KEYBOARD FOR COMMANDS ; CMDNT: LXI H,CMDMS CALL CHEDT LXI H,CMDAR MVI B,26Q CMDKB: CALL KEYBD CPI 14Q JZ CNTRL CPI 15Q JZ CMDND CPI 177Q JNZ CMDST MVI A,'_' CMDST: MOV M,A CALL CHRPR INX H DCR B JNZ CMDKB MVI A,1 CALL ERROR JMP CNTRL ; ; THE COMMAND COMPRESS ROUTINE ELIMINATES ALL BUT LETTERS AND NUMS ; CMDND: LXI H,CMDAR PUSH H POP D MVI A,26Q SUB B MOV B,A CMDNX: MOV A,M CPI '_' JNZ CMDCH MVI A,CMDAR AND 377Q CMP E JNC CMDNS DCX D JMP CMDNS CMDCH: CPI '0' JC CMDNS CPI '9'+1 JC CMDSV CPI 'A' JC CMDNS CPI 'Z'+1 JNC CMDNS CMDSV: STAX D INX D CMDNS: INX H DCR B JNZ CMDNX RET ; ; THE FETCH INSTRUCTION/COMMAND ROUTINE VALIDATES AND BUILDS OBJECT CODE ; FETCH: LXI H,OPTAB MVI E,37Q FLOOP: PUSH H LXI B,CMDAR MVI D,3 FCOMP: LDAX B CMP M JNZ FNXEL INX B INX H DCR D JNZ FCOMP XTHL POP H MOV E,M PUSH D INX H MOV E,M INX H MOV D,M XCHG POP D XRA A PCHL FNXEL: LXI B,6 POP H DAD B DCR E JNZ FLOOP MVI A,2 JMP ERROR NOP ; ; THE INSTRUCTION DECODER ROUTINES FOLLOW ; INSTRUCTIONS USING THE DIRCT ROUTINE REQUIRE NO DECODING,E.G. RAL,CMA ; DIRCT: RET ; ; THE MOVRT IS USED ONLY BY THE MOV COMMAND ; MOVRT: CALL RG543 ORA A RNZ ; ; INSTRUCTIONS USING THE RG210 ROUTINE REQUIRE A SOURCE REGISTER ; RG210: LDAX B INX B CALL REGAN JNC RGERR ADD E MOV E,A XRA A RET ; ; THE REGISTER ERROR ROUTINE IS USED TO INDICATE REGISTER DESIGNATION ERRORS ; RGERR: MVI A,3 JMP ERROR ; ; THE REGISTER ANALYSIS AND VALIDATION ROUTINE IS USED BY ; RG543, RG210, AND RG54B ; REGAN: SUI 'A' CPI 3 RNC DCR A ANI 7 STC RET ; ; THE MVIRT IS USED ONLY BY THE MVI COMMAND ; MVIRT: CALL RG543 ORA A RNZ ; ; INSTRUCTIONS REQUIRING AN IMMEDIATE OPERAND USE THE IMMED ROUTINE ; IMMED: LDAX B INX B CPI 'B' JZ BINRY CPI 'Q' JZ OCTAL CPI 'H' JZ HEX CPI '8' JC OCTAD MVI A,5 JMP ERROR ; ; INSTRUCTIONS USING THE RG543 ROUTINE REQUIRE A DESTINATION REG ; RG543: LDAX B INX B CALL REGAN JNC RGERR RLC RLC RLC ADD E MOV E,A XRA A RET ; ; INSTRUCTION USING THE RG54B ROUTINE ARE INX AND DCX ; RG54B: LDAX B INX B CALL REGAN CPI 0 RZ MVI A,4 JMP ERROR ; ; THE BINRY ROUTINE CONVERTS A BINARY IMMEDIATE VALUE INTO USABLE FORM ; BINRY: MVI H,8 BLOOP: LDAX B SUI '0' CPI 2 JNC IMMER PUSH H MOV L,D DAD H ADD L MOV D,A POP H INX B DCR H JNZ BLOOP XRA A RET ; ; THE IMMEDIATE ERROR ROUTINE IS USED TO INDICATE IMMEDIATE VALUE ERRORS ; IMMER: MVI A,6 JMP ERROR ; ; THE OCTAD ENTRY POINT TO THE OCTAL ROUTINE IS THE DEFAULT CONDITION ; OCTAD: DCX B ; ; THE OCTAL ROUTINE CONVERTS AN OCTAL IMMEDIATE VALUE TO USABLE FORM ; OCTAL: MVI H,3 OLOOP: LDAX B SUI '0' CPI 8 JNC IMMER PUSH H MOV L,D DAD H DAD H DAD H ADD L MOV D,A POP H INX B DCR H JNZ OLOOP XRA A RET ; ; THE HEX ROUTINE CONVERTS A HEXADECIMAL VALUE INTO USABLE FORM ; HEX: MVI H,2 HLOOP: LDAX B SUI '0' CPI 10 JC HCHOK SUI 7 CPI 16 JNC IMMER HCHOK: PUSH H MOV L,D DAD H DAD H DAD H DAD H ADD L MOV D,A POP H INX B DCR H JNZ HLOOP XRA A RET ; ; THE XQTER ROUTINE EXECUTES THE GENERATED OBJECT CODE ; XQTER: XCHG SHLD XQTOP LHLD PSWA PUSH H POP PSW LHLD BANDC PUSH H POP B XQTOP: NOP NOP PUSH B POP H SHLD BANDC PUSH PSW POP H SHLD PSWA RET ; ; THE ERROR ROUTINE IS USED TO DISPLAY ERROR MESSAGES ; ERROR: PUSH PSW LXI H,ERRSP CALL CHEDT POP PSW LXI H,ERTAB ADD L MOV L,A MOV L,M ; ; NOTE: HL NOW CONTAINS THE ADDRESS OF THE ERROR MESSAGE ; CALL CHEDT ERTIM: LXI D,0 DCR E JNZ ERTIM+1 ; ; THE ABOVE JMP GOES TO THE FIRST 000 IN THE LXI COMMAND WHICH IS A NOP ; DCR D JNZ ERTIM+1 MVI A,-1 RET ; ; OPCODE TABLE ; OPTAB: DB 'ACI',316Q DW IMMED DB 'ADC',210Q DW RG210 DB 'ADD',200Q DW RG210 DB 'ADI',306Q DW IMMED DB 'ANA',240Q DW RG210 DB 'ANI',346Q DW IMMED DB 'CMA',57Q DW DIRCT DB 'CMC',77Q DW DIRCT DB 'CMP',270Q DW RG210 DB 'CPI',376Q DW IMMED DB 'DAA',47Q DW DIRCT DB 'DCR',5 DW RG543 DB 'DCX',13Q DW RG54B DB 'INR',4 DW RG543 DB 'INX',3 DW RG54B DB 'MOV',100Q DW MOVRT DB 'MVI',6 DW MVIRT DB 'NOP',0 DW DIRCT DB 'ORA',260Q DW RG210 DB 'ORI',366Q DW IMMED DB 'RAL',27Q DW DIRCT DB 'RAR',37Q DW DIRCT DB 'RLC',7 DW DIRCT DB 'RRC',17Q DW DIRCT DB 'SBB',230Q DW RG210 DB 'SBI',336Q DW IMMED DB 'STC',67Q DW DIRCT DB 'SUB',220Q DW RG210 DB 'SUI',326Q DW IMMED DB 'XRA',250Q DW RG210 DB 'XRI',356Q DW IMMED ; ; ERROR MESSAGE TABLE ; ERTAB: DB ERRF,ERRA,ERRB,ERRC,ERRC,ERRD,ERRE,ERRF ERRA: DB 'INPUT TOO LONG',200Q ERRB: DB 'INVALID COMMAND',200Q ERRC: DB 'INVALID REGISTER',200Q ERRD: DB 'INVALID IMMED TYPE',200Q ERRE: DB 'INVALID IMMED VALUE',200Q ERRF: DB 'ERROR!',200Q ; ; THE FOLLOWING STRING IS GIVEN THE NAME ERRSP AND IS USED TO CLEAR ; THE SCREEN, THE SPACE DOWN TO THE CENTER PRIOR TO DISPLAYING AN ; ERROR MESSAGE ; ERRSP: DB 0CH,377Q,377Q,211Q,200Q ; ; ;THE CLEAR SCREEN CODE IS CHANGED FROM 177Q TO 0CH TITLS: DB 0CH,211Q,'EDUCATOR-8080',264Q,'____BINARY_____' DB ' OCT HX',212Q,'7 6 5 4 3 2 1 0',250Q,200Q BLINE: DB 'B-REG >> ',200Q CLINE: DB 241Q,'C-REG >> ',200Q AFHDR: DB 240Q,'FLAGS&ACC',227Q,'P Z S A C',227Q,200Q CMDMS: DB 240Q,'COMMAND ? ',200Q ; ; PSWA: DW 0 BANDC: CREG: DB 0 BREG: DB 0 CMDAR: DS 22 DS 50 STACK: DS 2 ; ;CI EQU 3803H ;CO EQU 3809H LINCNT: DB 0 CHRPR: PUSH B PUSH D PUSH H PUSH PSW CPI 177Q JZ CLEAR LDA LINCNT INR A CPI 33 JNC FEED STA LINCNT CHRC: POP PSW MOV C,A CALL CO CHRX: POP H POP D POP B RET FEED: MVI A,1 STA LINCNT MVI C,15Q CALL CO MVI C,12Q CALL CO JMP CHRC CLEAR: MVI C,14Q CALL CO XRA A STA LINCNT POP PSW JMP CHRX KEYBD: JMP CI ; ; ;SIMPLE CP/M CONSOLE I/O PATCH ; WBOOT EQU 1 ;ADDRESS OF WBOOT ADDRESS CO: PUSH B MOV C,A DB 0CDH ;CALL COADR: DW 0 ;ADDRESS POP B RET ; CI: DB 0CDH ;CALL CIADR: DW 0 ;ADDRESS RET ; INIT: LHLD WBOOT LXI B,6 ;CONIN OFFSET DAD B SHLD CIADR LXI B,3 ;CONOUT OFFSET FROM CONIN DAD B SHLD COADR RET ; END