home *** CD-ROM | disk | FTP | other *** search
- ;
- ; 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 [<FILENAME>] [<ADDRESS>]
- ;
- ; WHERE <FILENAME> IS THE NAME OF A 6502 BINARY OBJECT FILE,
- ; AND <ADDRESS> IS ITS LOAD LOCATION. IF <ADDRESS> 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
-