home *** CD-ROM | disk | FTP | other *** search
- ;SMALL MONITOR TO INTERFACE LLLBASIC AND LLLFP TO
- ;CP/M. A.R.G 10/9/77
- ; JIF 12/24/77
- ;
- CPM EQU 5 ;CP/M ENTRY
- EOF EQU 1AH ;^Z
- IOJUMP EQU 1900H
- FREEMEM EQU 2000H ;BEGINNING OF FREE MEMORY
- INIT EQU 1920H ;ADDRESS OF JUMP TO INITIALIZATION ROUTINE
- FWAM EQU 1923H ;ADDRESS OF WORD CONTAINING ADDRESS OF FIRST
- ; BYTE OF FREE MEMORY
- M1 EQU 0103H ;NEW ENTRY PT FOR INTERP
- M1A EQU 0116H ;NEW INTERP RESTART ENTRY PT
- ;
-
- BOOT EQU 0000H ;REBOOT ENTRY POINT
- CPM EQU 0005H ;CPM ENTRY POINT
-
- TBUF EQU 0080H ;TRANSIENT PROGRAM BUFFER
- TFCB EQU 005CH ;TRANSIENT PROGRAM FCB
-
- OPEN EQU 15 ;OPEN FUNCTION CODE
- READ EQU 20 ;READ FUNCTION CODE
-
- ; IOJUMP TABLE. STACK ADDRESS FILLED IN BY INITR
- ORG IOJUMP
- SPNT: DW 0
- SUBAD: DW SUBS
- JMP CIN
- JMP COUT
- JMP STAT
- JMP RDR
- ;
- ; JUMP TO INITIALIZATION ROUTINE
- ORG INIT
- JMP INITR
- ;
- ; POINTER TO FIRST WORD FREE MEMORY
- ORG FWAM
- DW FREEMEM
- ;
- ; USER SUBROUTINE POINTERS. TERMINATED BY BYTE WITH VALUE 0FFH.
- SUBS:
- DB 1 ;SUBROUTINE #1
- DW SUB1 ;START ADDR SUBROUTINE #1
- DB 2 ;SUBROUTINE #2
- DW SUB2 ;START ADDR SUBROUTINE #2
- DB 0FFH ;END OF SUBROUTINE TABLE
- ;
- ;**********************************************************
- ; PUT SP ADDRESS TO SPACE BETWEEN VEND AND IOJUMP
- INITR: LHLD 6 ;LOAD FBASE ADDR. CCP WILL BE OVERLAID
- MOV A,H
- SBI 20H ;GET CBASE ADDRESS
- MOV H,A
- SHLD SPNT
-
- LXI D,TFCB ;OPEN PROGRAM FILE
- CALL FOPEN
- JC ERR
-
- JMP M1 ;LLL INITIALIZE ENTRY POINT
- ;CAN USE M1A FOR RE-ENTRY TO
- ;OLD PROGRAM
- ;************************************************************
- ;CP/M ENTRY ROUTINES
-
- ;
- ;CIN RETURNS CHARACTER WITH HIGH BIT SET
- ;IN B REGISTER. LLLFP SAVES B&C
- CIN: PUSH PSW
- PUSH H
- PUSH D
- MVI C,1
- CALL CPM
- ; CHECK FOR CONTROL-C AND RETURN TO CPM IF FOUND
- ANI 7FH
- CPI 03
- JNZ RTN
- JMP 0
- RTN:
- ORI 80H
- POP D
- POP H
- MOV B,A
- POP PSW
- RET
- ;
- ;COUT ACCEPTS CHARACTER IN A
- COUT: PUSH H
- PUSH D
- PUSH B
- ANI 7FH
- MOV E,A
- MVI C,2
- CALL CPM
- POP B
- POP D
- POP H
- RET
- ;
- ;STAT CHECKS LEAST SIGN. BIT OF A, SAME CONVENTION
- ;AS CP/M
- STAT: PUSH H
- PUSH D
- PUSH B
- MVI C,11
- CALL CPM
- POP B
- POP D
- POP H
- RET
- ;
- ; DISK READ INTERFACE. CONTROL TRANSFERRED HERE BY
- ; "PTAPE" CONSOLE COMMAND.
- RDR: PUSH H
- PUSH D
- PUSH B
- CALL GETBT
- ORI 80H
- POP B
- POP D
- POP H
- RET
-
- ERR: LXI D,ERMSG
- MVI C,09H ;WRITE MSG
- CALL CPM
- JMP BOOT
-
-
- ;********************************;
- ; F O P E N ;
- ; ROUTINE TO OPEN A DISK FILE ;
- ; ;
- ; INPUT: DE=A(FCB) ;
- ; OUTPUT: CARRY=ERROR ;
- ;********************************;
-
- FOPEN: MVI C,OPEN ;OPEN CODE
- CALL CPM ;ISSUE OPEN
- CPI 0FFH ;ERROR?
- JZ FOERR ;YES
- XRA A ;CLEAR CARRY
- RET
- FOERR: STC
- RET
-
-
- ;********************************;
- ; G E T B T ;
- ; ROUTINE TO READ A BYTE ;
- ; ;
- ; OUTPUTS: A=BYTE ;
- ; CARRY=ERROR ;
- ;********************************;
-
- GETBT: LXI H,TBUF+128
- XCHG ;BUFFER END ADDR. IN DE
- LHLD INPTR ;CURRENT POINTER IN HL
- CALL CPHL ;TEST FOR END OF BUFFER
- JZ GETB2 ;YES, READ
- GETB1: MOV A,M ;GET BYTE
- CPI EOF ;DONE?
- JZ M1A
- INX H ;BUMP POINTER
- SHLD INPTR ;SAVE POINTER
- ORA A ;RESET CARRY
- RET
- GETB2: MVI C,READ ;READ CODE
- LXI D,TFCB ;FCB ADDRESS
- CALL CPM ;ISSUE READ
- CPI 00 ;ERROR?
- JNZ IERR ;YES
- LXI H,TBUF ;RESET BUFFER POINTER
- SHLD INPTR
- JMP GETB1 ;CONTINUE
- IERR: STC
- RET
-
- ;********************************;
- ; MISCELLANEOUS SUBROUTINES ;
- ;********************************;
-
- ;********************************;
- ; C P H L ;
- ; ROUTINE TO COMPARE HL VS DE ;
- ;********************************;
-
- CPHL: MOV A,H
- CMP D
- RNZ
- MOV A,L
- CMP E
- RET
-
- ;********************************;
- ; D A T A ;
- ;********************************;
-
- ERMSG: DB 'ERROR',0DH,0AH,'$'
- DS 32
- INPTR: DW TBUF+128;INPUT POINTER
- DECWRK: DB '000'
- ;
- SUB1: ;RETURN TO CPM. TO CALL FROM BASIC PROGRAM, SAY CALL (1).
- JMP 0
- SUB2:
- ORG FREEMEM
-