home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Commodore Disk User Volume 4 #2
/
Commodore_Disk_User_Vol.4_2_1990_-.d64
/
loadv2.4.asm
< prev
next >
Wrap
Assembly Source File
|
2022-10-26
|
11KB
|
606 lines
E
_*********************************************************
_* *
_* MODULE NAME : load.asm *
_* *
_* mAINTENANCE LOG *
_* --------------- *
_* *
_* DATE TIME ACTION *
_* ---- ---- ------ *
_* 25/02/89 02:00 INITIAL CODING *
_* 29/03/89 19:20 TIDY UP AND FIX *
_* 03/04/89 22:00 FURTHER TIDY UP *
_* 03/04/89 23:00 CHANGE BRACKETS, FIX ASS BUGS *
_* 05/04/89 19:00 FIXED THE PATCHEND BUG *
_* 06/04/89 23:30 MOVE ZERO DEFNS AND FIX INIT BUG *
_* 25/04/89 22:30 FIX BUGS, ADDED $FF05-$FFFF COPY *
_* 29/04/89 9:55 UPDATED PATCH TABLE + OTHER MODS *
_* 05/05/89 17:50 FIXED THE PAGE AREA BUGS *
_* 22/05/89 18:05 UPDATED FOR NEW OPTIONS ON LOCSTOR *
_* 18/06/89 19:00 sYSTEM REGISTERS PLACED ON STACK *
_* 25/06/89 18:10 sAVE THE STACK POINTER MISSING *
_* 04/07/89 18:50 PAGE 0 AND 1 CAN BE IN ANY RAM *
_*********************************************************
_*********************************************************
_* *
_* ROUTINE : initload - INITIALISE THE LOADER *
_* BY COPYING IT THEN PATCHING IT *
_* *
_* ENTRY *
_* ----- *
_* NONE *
_*.......................................................*
_* USED *
_* ---- *
_* a,x,y *
_*.......................................................*
_* EXIT *
_* ---- *
_* NONE *
_*********************************************************
_ EQUATES USED
COPYSTRT= $E000
RAM0CONF= $3F
FILENUM= 1
DEVICE= 8
SECONDAD= 1
DEFPRI= 128
LOADPRG= $F265
ERRLOAD= $F5B5
_ OTHER REQUIRED STORAGE
PRITEXTRES 3
SAVECNTRES 1
STKTEMPRES 1_ AREA TO SAVE STACK POINTER
_
_ sTART OF THE CODE
_
INITLOADEQU *
#ZEROADD
{CBM-P} LDASET_ FOR ldafar
{CBM-P} STASET_ FOR stafar
#>COPYSTRT
{CBM-P} ZEROADD
#<COPYSTRT
{CBM-P} ZEROADD+1
#0
_
_ COPY THE CODE FROM $E000 TO $FEFF
_ nOTE THAT AS THIS COULD RUN IN bank 15, IE WITH SYSTEM romS
_ ENABLED, YOU CAN lda FROM KERNAL rom AND sta INTO ram WITHOUT
_ HAVING TO CHANGE CONFIGURATIONS. wHEN YOU TRY TO WRITE TO rom
_ IT ACTUALLY WRITES TO THE ram UNDERNEATH.
_
INITLOD1EQU *
#$00
LDAFAR
#RAM0CONF
STAFAR
ZEROADD
INITLOD1
ZEROADD+1
ZEROADD+1
#$FF
INITLOD1
_
_ COPY THE CODE FROM $FF05 - $FFFF
_
#5
INITLOD9EQU *
#0
LDAFAR
#RAM0CONF
STAFAR
INITLOD9
_ CODE COPIED, NOW PATCH IT.
#0
#0
PATCHLOPEQU *
PATCHTAB,X
{CBM-P} ZEROADD
PATCHTAB+1,X
{CBM-P} ZEROADD+1
PATCHTAB+2,X
{CBM-A} SAVECNT
#RAM0CONF
STAFAR
SAVECNT
#PATCHEND
PATCHLOP
_ CODE NOW PATCHED SO RETURN TO CALLER
{CBM-N}
PATCHTABEQU *
DB $73,$E5,$EA_ REMOVE sei
DB $EE,$F3,$EA_ REMOVE sei
DB $BA,$E5,$EA_ REMOVE cli
DB $8F,$F4,$EA_ REMOVE cli
DB $54,$F4,$2C_ REMOVE TEST FOR RUN/STOP
DB $57,$F4,$4C_ JMP OVER CHECK FOR RUN/STOP FLAG
DB $58,$F4,$5C
DB $59,$F4,$F4
DB $D5,$F2,$4C_ JMP OVER CHECK FOR RUN/STOP FLAG
DB $D6,$F2,$DA
DB $D7,$F2,$F2
DB $21,$F4,$4C_ POINT TO NEW CODE
DB $22,$F4
DB >BURSTMOD
DB $23,$F4
DB <BURSTMOD
DB $B0,$F2,$4C_ POINT TO NEW CODE
DB $B1,$F2
DB >LOADMOD
DB $B2,$F2
DB <LOADMOD
DB $51,$F4,$F8_ FILE READ TO 248
PATCHEND EQU * - PATCHTAB
_*********************************************************
_* *
_* ROUTINE : load - THE LOAD ROUTINE. *
_* CMD FORMAT : l PROGNAME,PRI *
_* *
_* ENTRY *
_* ----- *
_* charbuff - COMMAND LINE INPUT *
_* y - POSITION IN THE COMMAND BUFFER *
_*.......................................................*
_* USED *
_* ---- *
_* a,x,y *
_*.......................................................*
_* EXIT *
_* ---- *
_* NONE *
_*********************************************************
LOADEQU *
#PRGNORUN
DB $2C
EXECUTEEQU *
#PRGRUN
{CBM-P} OPTION
READLOAD _ READ INFORMATION INTO PRGNAME AND GET PRI
NOSYNTAX
{CBM-N}
_ oK, WE ARE READY TO LOAD, wE NOW CALL THE PATCHED CODE FOR THE LOADER. fIRST
_ BY SWITCHING THE BANK TO ram, THEN CALLING THE ROUTINE. tHIS METHOD
_ SAVES THE PROBLEM OF HAVING TO CODE A FULL LOADER WITH SERIAL ROUTINES
_ WHICH WOULD HAVE TO BE DONE FOR A FULL OPERATING SYSTEM.
NOSYNTAXEQU *
LOCFREE_ LOCATE A FREE ENTRY IN THE TABLE
ALLOK
#6
DISPMESS
ALLOKEQU *
#$3E_ ram BLOCK 0, BUT ALL i/o AVAILABLE
{CBM-P} CONFREG
_ SETUP FOR THE LOAD ROUTINE
#FILENUM
{CBM-P} LFN_ lfn
#DEVICE_ SERIAL DEVICE
{CBM-P} DEV
#SECONDAD_ sa
{CBM-P} SA
NAMELEN
{CBM-P} PRGNLEN
#>PRGNAME
{CBM-P} PRGNADD
#<PRGNAME
{CBM-P} PRGNADD+1
#0_ BANK NUMBER 0, NOT CONFIGURATION NO.
{CBM-P} NAMEBANK_ BANK WHERE NAME IS FOUND.
#$00
{CBM-P} IOMODE_ STOP ALL OUTPUT FROM SYSTEM
#11
DISPMESS
LOADPRG_ CALLS CODE WITHIN THIS SUBROUTINE BLOCK
NOLODERR
#9
DISPMESS
_ PROGRAM NOW IN MEMORY, SO RELOCATE, THEN SETUP TABLE ENTRY
_ NOTE THE END ADDRESS IS IN x,y AND THE LOAD ROUTINE HAS ALREADY
_ SET UP SOME PARAMETERS FOR THE RELOCATION.
NOLODERREQU *
{CBM-A} NEWEND
{CBM-E} NEWEND+1_ SAVE PROG END ADDRESS
#12
DISPMESS
RELOC_ NEWEXEC PASSED BACK NY THIS ROUTINE
_ AND NEWEND NOT ALTERED
_ TABLE ENTRY SETUP
#FLAG
OPTION
{CBM-P} [TABPNTR],Y_ SET MODE OF PROGRAM
_ PUT NAME INTO THE TABLE
#0
#NAME
LOADLOP2EQU *
PRGNAME,X
{CBM-P} [TABPNTR],Y
NAMELEN
LOADLOP2
#SPACE
LOADLOP8EQU *
{CBM-P} [TABPNTR],Y
#MAXLEN
LOADLOP8
_ SAVE RAM, START AND END ADDRESSES
RAMUSED
#RAMPRG
{CBM-P} [TABPNTR],Y
STARTRAM
#STRTADD
{CBM-P} [TABPNTR],Y
STARTRAM+1
{CBM-P} [TABPNTR],Y
#ENDADD
NEWEND_ RELYING ON RELOC NOT CHANGING THEM
{CBM-P} [TABPNTR],Y
NEWEND+1
{CBM-P} [TABPNTR],Y
_ SET THE PRIORITY VALUE NOW
PRITEMP
#PRIORITY
{CBM-P} [TABPNTR],Y
_ SAVE THE ZERO AND PAGE ONE LOCATIONS
_ AND PUT PAGE 1 OF NEW PROGRAM AVAILABLE
#ZEROOFF
ZEROPAGE
{CBM-P} [TABPNTR],Y
#RAMPRG
[TABPNTR],Y
{CBM-P} PAGE1HI
#ONEOFF
PAGEONE
{CBM-P} [TABPNTR],Y
{CBM-P} PAGE1LOW
_ SET UP THE REGISTER INFO. tHIS COULD BE PASSED BY THE USER OR
_ AS AN EXPANSION ALLOW FILE SETUP TO DEFINE THE INFORMATION
_ FIRST THOUGH, THE STACK NEEDS TO BE PRESERVED...
{CBM-H}
{CBM-A} STKTEMP
#$FF
{CBM-L}
NEWEXEC+1
{CBM-T}
NEWEXEC
{CBM-T}
#0
{CBM-T}_ STATUS REGISTER
{CBM-T}_ a
{CBM-T}_ x
{CBM-T}_ y
#RAMPRG
[TABPNTR],Y
CONVRAM
{CBM-T}
_ sAVE THE NEW STACK IN THE TABLE READY TO SIMULATE A RETURN OF INTERRUPT
#REGSP
{CBM-H}
{CBM-J}
{CBM-P} [TABPNTR],Y
_ RESTORE THE OLD PAGE 1
#OSP1HI
{CBM-P} PAGE1HI
#OSP1LOW
{CBM-P} PAGE1LOW
STKTEMP
{CBM-L}
OPTION
#PRGNORUN
TRYRUN
{CBM-N}
TRYRUNEQU *
LOADRUN
_ READ NAME AND PRIORITY, CONVERT PRIORITY AND STORE IN THE TABLE
READLOADEQU *
#0
NAMELOP1EQU *
CHARBUFF,Y_ y POINTS TO NEXT CHAR
#SPACE
NAMELOP1
#COMMA
GETPRI
#CR
ONPRI
{CBM-A} NAMELEN
#DEFPRI_ DEFAULT PRIORITY
{CBM-P} PRITEMP
{CBM-N}
ONPRIEQU *
{CBM-P} PRGNAME,X
#16
NAMELOP1
#7
DISPMESS
{CBM-D}
{CBM-N}
GETPRIEQU *
{CBM-A} NAMELEN
#0
NAMELOP2EQU *
CHARBUFF,Y
#CR
TRANSFER
{CBM-P} PRITEXT,X
#4
NAMELOP2
PRIERR
_ CONVERT PRIORITY NOW
TRANSFEREQU *
{CBM-J}
#0
{CBM-A} PRITEMP
#2
ONES
#3
TENS
PRITEXT
CONV
#3
PRIERR
MULT10
MULT10
{CBM-P} PRITEMP
TENSEQU *
PRITEXT,X
CONV
MULT10
PRITEMP
{CBM-P} PRITEMP
ONESEQU *
PRITEXT,X
CONV
PRITEMP
{CBM-P} PRITEMP
{CBM-N}
PRIERREQU *
#8
DISPMESS
{CBM-D}
{CBM-N}
_ ABOVE LOGIC COULD NOT COPE WITH 273 OR 259 FOR EXAMPLE.
_ nOW LOCATE THE MEMORY REQUIRED. (CHECK THE END ADDRESS IN SAVE AND
_ GET THE CORRECT METHOD FOR CALCULATION OF LENGTH REQUIRED)
_
_ tHE FOLLOWING CODE IS A MODIFICATION TO THE LOAD ROUTINE TO LOAD IN
_ EXTRA INFORMATION AND THEN SET UP THE RELOCATION INFORMATION
_ THE FINAL PART FOR RELOCATION SETUP IS COMPLETED WHEN LOAD IS DONE.
_
LOADMODEQU *
$E43E
{CBM-P} OLDADD
$E43E
{CBM-P} OLDADD+1_ SET UP FOR RELOCATION
$E43E
{CBM-P} OLDEND
$E43E
{CBM-P} OLDEND+1
$E43E
{CBM-P} EXECADD
$E43E
{CBM-P} EXECADD+1
PROCDATA
LODERROR
$F2BA
BURSTMODEQU *
$F503
$F4BA
{CBM-P} OLDADD
$F503
$F4BA
{CBM-P} OLDADD+1
$F503
$F4BA
{CBM-P} OLDEND
$F503
$F4BA
{CBM-P} OLDEND+1
$F503
$F4BA
{CBM-P} EXECADD
$F503
$F4BA
{CBM-P} EXECADD+1
{CBM-G}
{CBM-T}
#$1F
NOTLAST
$A5
{CBM-D}
{CBM-Q} #4
{CBM-P} $A5
NOTLASTEQU *
PROCDATA
LODERROR
$F434
LODERROREQU *
{CBM-N}_ RETURN TO THE CALLING LOADER WITH C=1
_
_ nOTE THAT END - START WILL GIVE THE CORRECT LENGTH AS THE END IS ONE
_ MORE THAN IT SHOULD BE.
_
PROCDATAEQU *
OLDEND
{CBM-D}
{CBM-Q} OLDADD
{CBM-P} GIVELEN
OLDEND+1
{CBM-Q} OLDADD+1
{CBM-P} GIVELEN+1
#NOSTOPT_ NO OPTIONS REQUIRED
LOCSTOR_ STORAGE LOCATED FOR PROGRAM.
EXITLOAD
_ sTORAGE LOCATED OK, SO SET UP THE CORRECT LOAD INFORMATION
_ IE NEW START ADDRESS AND BANK TO LOAD INTO
STARTRAM
{CBM-P} STARTLO_ SETUP FOR LOAD
{CBM-P} NEWSTART_ SETUP FOR THE RELOCATION
STARTRAM+1
{CBM-P} STARTHI
{CBM-P} NEWSTART+1
RAMUSED
CONVRAM
{CBM-P} PRGLODBK
{CBM-P} NEWRAM
_
_ FIND AREAS FOR PAGE 0 AND PAGE 1. dONE HERE BECAUSE IF YOU CAN'T LOCATE
_ THE STORAGE, THERE ISN'T ANY POINT CONTINUING THE LOAD.
_
#0
{CBM-P} GIVELEN
#1_ 1 PAGE REQUIRED.
{CBM-P} GIVELEN+1
#PAGBOUND_ JUST LOCATE ANY OLD PAGE
LOCSTOR_ TO STORE THE RAM OF THE PAGES.
EXITLOAD
STARTRAM+1
{CBM-P} ZEROPAGE
RAMUSED
{CBM-P} ZERORAM
#0
{CBM-P} GIVELEN
#1_ 1 PAGE REQUIRED.
{CBM-P} GIVELEN+1
#PAGBOUND
LOCSTOR
EXITLOAD
STARTRAM+1
{CBM-P} PAGEONE
RAMUSED
{CBM-P} ONERAM
{CBM-N}
EXITLOAD EQU *
_
_ cLOSE ALL THE FILES ETC., THIS ROUTINE WILL SET THE CARRY FLAG
_ AND ISSUE A RETURN WHICH WILL THEN RETURN TO THE CALLER.
_
ERRLOAD
_
_ CONVERT A CHARACTER TO A VALUE
_
CONVEQU *
{CBM-D}
{CBM-Q} #50
{CBM-N}
_
_ MULTIPLY a BY 10 AND RETURN THE VALUE IN a
_
mULT10EQU *
{CBM-P} TEMP
TEMP
{CBM-N}
iend