; ; HOST REMAPPING ROUTINES FOR ZX65SYM ; ; 11-22-82 (RGF) ; UPDATED 12/17/82 (RGF) ; ; THIS MODULE IS LINKED TO THE MAIN MODULE (ZXSYM65.REL) TO ; PROVIDE MEMORY REMAPPING BETWEEN 6502 AND Z80 MEMORY SPACE. ; THIS MODULE CONTAINS AN INITIALIZATION ENTRY POINT THAT IS ; CURRENTLY USED TO LOAD AN OPTIONAL FILE FROM DISK VIA THE ; CP/M COMMAND LINE. SYNTAX IS: ; ; ZX65SYM [] [
] ; ; WHERE IS THE NAME OF A 6502 BINARY OBJECT FILE, ; AND
IS ITS LOAD LOCATION. IF
IS NOT ; SPECIFIED, IT DEFAULTS TO THE VALUE SET IN DFLADR (DEFAULT ; ADDRESS) SPECIFIED IN AN EQUATE BELOW. ; ; NOTE THAT THE LOADED BINARY FILE MUST NOT OVERWRITE BDOS, ; AND CURRENTLY NO TEST IS PERFORMED TO INSURE THIS (SORRY, ; BUT TIME IS PRECIOUS); HOWEVER, ONCE THE FILE IS LOADED, ; IT MAY FREELY OVERWRITE BDOS, SINCE BDOS IS NO LONGER USED ; ANYWHERE WITHIN THE SIMULATOR. IN NO CASE SHOULD BIOS BE ; OVERWRITTEN, SINCE IT IS USED FOR CONSOLE I/O -- UNLESS, OF ; COURSE, YOU HARD CODE YOUR CONSOLE DRIVERS INTO THE MAIN ; MODULE. ; ; RON FOWLER ; 12/17/82 ; ; ; PUBLIC AINIT,FETCHA,SENDA,$MEMRY,IFETCH ; CR EQU 13 LF EQU 10 ; DFLADR EQU 1000H ;DEFAULT RELATIVE LOAD ADRS OF 6502 BIN FILE DFCB EQU 5CH ;DFLT FILE CONTROL BLOCK BDOS EQU 5 PRINTF EQU 9 ;PRINT MSG FUNCTION OPENF EQU 15 ;OPEN FILE FUNCTION READF EQU 20 ;READ SEQUENTIAL SDMAF EQU 26 ;SET DMA ADRS CLOSEF EQU 16 ;CLOSE ; AINIT: LDA DFCB+1 ;CHECK FCB FOR FILE CPI ' ' RZ ;RETURN IF NONE LXI D,DFCB+16+1 ;POINT TO OPTIONAL LOAD ADRS LDAX D ;FETCH FIRST CHAR CPI ' ' ;LOAD ADRS SPECIFIED? JZ NOADR ;SKIP IF NOT LXI H,0 ;YEP, INIT ADRS VALUE ; ; LOOP HERE COLLECTING OPTIONAL LOAD ADDRESS ; ADRLP: LDAX D ;FETCH NEXT CHAR INX D ;KEEP POINTER AHEAD CPI ' ' ;DONE? JZ STOADR ;GO PUT ADRS AWAY IF SO ANI 0FH ;ZAP ASCII, (NOTE NO BOUNDS CHECK) DAD H ;SHIFT TO MAKE ROOM FOR NEW DIGIT DAD H DAD H DAD H ORA L ;OR LO NYBBLE WITH NEW DIGIT MOV L,A ;PUT BACK UPDATED ADRS JMP ADRLP ;MAYBE ANOTHER STOADR: SHLD LODADR ;PUT AWAY LOAD ADRS ; ; HERE TO OPEN AND LOAD THE 6502 BINARY FILE ; NOADR: MVI C,OPENF ;OPEN THE FILE LXI D,DFCB CALL BDOS INR A ;GOOD OPEN? JNZ OPENOK ;JUMP IF SO LXI D,NOFEMS ;ELSE PRINT ERROR MESSAGE MVI C,PRINTF CALL BDOS RET OPENOK: LHLD LODADR ;GET FILE LOAD ADRS XCHG LHLD $MEMRY ;GET BUFFER ADDRESS DAD D ;OFFSET INTO BUFFER XCHG ;ADRS TO DE JMP LP2 ;GO ENTER READ LOOP LP1: MVI A,1 ;FLAG FILE NOT EMPTY STA RFLAG LP2: LXI H,80H ;GET NEXT DMA DAD D PUSH H ;SAVE IT MVI C,SDMAF ;SET THIS DMA ADRS CALL BDOS MVI C,READF LXI D,DFCB CALL BDOS ;READ A SECTOR POP D ;RESTORE NEXT DMA ORA A ;GOOD READ? JZ LP1 ;THEN CONTINUE LXI D,80H ;RESET DMA MVI C,SDMAF CALL BDOS MVI C,CLOSEF ;CLOSE THE FILE LXI D,DFCB ;(IN CASE MP/M) CALL BDOS LDA RFLAG ;FOUND ANY RECORDS? ORA A RNZ ;RETURN IF SO LXI D,NODEMS ;ELSE PRINT EMPTY FILE MSG MVI C,PRINTF CALL BDOS RET ;DONE ; ; 6502-RELATIVE MEMORY ACCESS ROUTINES. FETCH AND SEND ; (FETCHA AND SENDA) ARE CALLED WHENEVER A FETCH OR STORE ; IS NECESSARY RELATIVE TO 6502 MEMORY; HL=6502 MEMORY ; ADRS. IN THIS IMPLEMENTATION, THE 6502 LOCATION IS OFF- ; SET BY THE BUFFER ADDRESS TO MAP 6502 MEMORY INTO Z80 ; MEMORY, ALLOWING FULL USE OF PAGE 0 INSTRUCTIONS. NOTE ; THAT NO MEMORY RANGE CHECKING IS PERFORMED, THUS A PROGRAM ; REFERENCING HIGH 6502 MEMORY MAY WELL OVERWRITE THE BIOS. ; ALSO, NOTE THAT THE CP/M BDOS IS NOT USED IN THE CURRENT ; VERSION OF THE SIMULATOR, AND CAN THUS BE OVERWRITTEN. ; ; ; FETCH BYTE TO ACCUMULATOR, HL=6502-RELATIVE LOCATION ; FETCHA: CALL POINT ;OFFSET BUFFER BY 6502 MEMORY MOV A,M ;FETCH BYTE FROM 6502 MEMORY LHLD HLSAVE ;RESTORE 6502 ADRS RET ; ; STORE BYTE IN ACCUMULATOR TO 6502-RELATIVE MEMORY LOC IN HL ; SENDA: CALL POINT ;OFFSET BUFFER BY 6502 MEMORY MOV M,A ;STORE LHLD HLSAVE ;RESTORE 6502 POINTER RET ; ; ENTRY TO ALLOW SETUP IF INSTRUCTION FETCH ; NOTE THAT THIS IS NOT CURRENTLY IMPLEMENTED; PLANS ARE ; TO USE THIS ENTRY POINT AT SOME TIME IN THE FUTURE TO ; ALLOW DISTINGUISHING BETWEEN ORDINARY MEMORY REFERENCES ; AND INSTRUCTION FETCHES. THIS WOULD ALLOW A FULL 6502 ; HARDWARE SIMULATOR TO BE CONTROLLED BY THIS PROGRAM. ; IFETCH: RET ;NO SETUP CURRENTLY NEEDED ; ; POINT TO TRUE LOCATION ; POINT: SHLD HLSAVE ;SAVE 6502 MEMORY PNTR FOR EXIT PUSH D ;DON'T MODIFY DE XCHG ;GET ADRS IN DE LHLD $MEMRY ;GET FREE MEMORY POINTER DAD D ;OFFSET INTO FREE MEMOORY POP D ;RESTORE AND RETURN RET ; ; FILE LOAD ERROR MESSAGES ; NOFEMS: DB CR,LF,'*** FILE NOT FOUND ***',CR,LF,'$' NODEMS: DB CR,LF,'*** FILE IS EMPTY ***',CR,LF,'$' ; RFLAG: DB 0 HLSAVE: DW 0 $MEMRY: DW 0 ;L80 STUFFS FIRST FREE MEM HERE LODADR: DW DFLADR ;LOAD ADRS OF 6502 BINARY FILE ; ; END