;************************************************************************ ;* GENDRV.MAC - "GENEVA RELOCATABLE DRIVER MODULE" ;* DATE: 8/30/84 GSD (Designed to interface with GENDRV.BAS) ;************************************************************************ .Z80 ; Make certain that the internal RAM disk and USER BIOS are set to 0Kb ; to obtain maximum memory space and not conflict with the current ; .PHASE directive address. Otherwise change the address accordingly. ; This program relocates itself, loads in the BASIC Interpreter and ; the GENDRV.BAS program, and then allows BASIC programs to call the ; routines included here. ; This program is designed for further expansion by programmers who have ; specific application needs that can't be satisfied by the BASIC ; Interpreter. ; The two Call handling routines (BSOUND, BADCVRT) included in this ; original version were done so only to demonstrate a method ; of interfacing to the BASIC CALL instruction. These two demo routines ; can be replaced with any tailor made Calls that a programmer cares to ; invent. ; ;----------------------------------------------------------------------- ; STANDARD CP/M & PX-8 EQUATES ;----------------------------------------------------------------------- BIOS EQU 0001H BDOS EQU 0005H ;------------------------------------------------------------------------- ; RELOCATOR TO MOVE PROGRAM UP NEAR BDOS ;------------------------------------------------------------------------- LD DE,BASINT LD (6CH),DE ;SAVE BASIC I/F TABLE START ADDRESS HERE ; FOR USE BY GENDRV.BAS BASIC PROGRAM LD HL,SOURCE LD DE,DEST LD BC,LEN LDIR ;RELOCATE PROGRAM TO MEMORY TOP JP OPENB ;GO LOAD IN BASIC.COM ;---------------------------------------------------------------------------- ; MAIN PROGRAM STARTS HERE ;---------------------------------------------------------------------------- SOURCE: .PHASE 0DA00H ; BDOS AT E200H DEST: ;***************************************************************************** ;* * ;* SUBROUTINES TO INTERFACE BASIC PROGRAMS WITH GENDRV.MAC. * ;* REFER TO GENDRV.DOC DOCUMENT FOR THE DETAILS ON HOW TO USE * ;* THESE UTILITIES. * ;* * ;***************************************************************************** BASINT: ;BASIC INTERFACE TABLE DS 10 ;BUFFER FOR BIOS CALL RETURN PARAMETERS DW BSOUND ;ADDRESS OF BSOUND FOR BASIC PROGRAM DW BADCVRT ;ADCVRT ROUTINE ADDRESS DS 24 ;RESERVED FOR FUTURE ROUTINE LABELS ; LOAD THE BASIC INTERPRETER INTO MEMORY HERE OPENB: LD C,0FH ;SET OPEN FILE CODE LD DE,BFCB ;FCB FOR BASIC.COM CALL BDOS AND 0F0H JP NZ,00H ;DO WARM BOOT IF FILE NOT FOUND GETB: LD C,14H LD DE,BFCB CALL BDOS ;READ SEQUENTIAL BASIC.COM FILE AND 0FFH JP Z,MOVDMA ;IF NOT END OF FILE, MOVE DMA TO MEMORY CALL MOVR ;DO ONE LAST MOVE SINCE EOF HERE TAILMV: LD HL,BTAIL LD DE,80H LD BC,17 LDIR ;STORE BASIC.COM COMTAIL AT 80H LD HL,100H LD (OFF),HL ;RESTORE ORIGINAL OFF VALUE JP 100H ;JUMP TO START OF BASIC INTERPRETER MOVDMA: CALL MOVR JP GETB MOVR: LD HL,80H LD DE,(OFF) ;OFF CONTAINS CURRENT MEMORY POINTER LD BC,80H LDIR LD HL,(OFF) LD BC,80H ADD HL,BC ;ADD 80H TO HL LD (OFF),HL ;UPDATE OFF RET ; THE DRIVER SUBROUTINES THAT INTERFACE TO BASIC START HERE BSOUND: LD A,36H ;BIOS OFFSET CALL TEMPRT LD C,(HL) ;GET CONTENTS OF HL INTO REG C EX DE,HL ;PUT DE POINTER IN HL LD E,(HL) ;PUT LOW BYTE OF 2ND PARAMETER IN E INC HL ;POINT TO HIGH BYTE LD D,(HL) ;PLACE IN D PUSH DE CALL JMPRT ;SETUP ACTUAL BIOS ADDRESS POP DE ;ENTRY PARAMETER BACK INTO DE JP (IX) ;BIOS ROUTINE FOR BEEP, RETURNS TO BASIC ; THE A/D CONVERT ROUTINE BADCVRT: LD A,6FH CALL TEMPRT LD C,(HL) LD HL,RETAD PUSH HL ;PUT THE RETURN ADDRESS ON STACK CALL JMPRT JP (IX) ;JUMP TO BIOS, RETURN TO RETAD ; RETAD MUST START DIRECTLY UNDER THE JP (IX) INSTRUCTION RETAD: SRL A ;ONLY 6 MSBs ARE SIGNIF SRL A LD (BASINT),A ;SAVE THE RETURN PARAMETER IN BASINT RET ;BACK TO THE BASIC PROGRAM JMPRT: LD DE,(TEMP) ;SETUP BIOS CALL LD IX,(BIOS) ADD IX,DE ;IX POINTS TO BIOS CALL ADDRESS RET TEMPRT: LD (TEMP),A ;SAVE BIOS CALL OFFSET IN LOW BYTE LD A,0 LD (TEMP+1),A RET OFF: DW 100H BFCB: ;FILE CONTROL BLOCK FOR BASIC INTERPRETER BDSK: DB 0 ;DISK DESCRIPTOR FOR DEFAULT DRIVE. USE 2 FOR B: DRIVE BNAM: DB 'BASIC ' BTYP: DB 'COM' BEXT: DB 0 BREST: DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0 BTAIL: ; COMMAND TAIL FOR BASIC.COM DB 15 ;NUMBER OF CHARACTERS IN COMMAND TAIL STRING DB "GENDRV/M:&HDA00" DB 0 ;COMMAND TAIL TERMINATOR TEMP: DW 0 LEN EQU $-DEST END