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 >
Assembly Source File  |  2022-10-26  |  11KB  |  606 lines

  1. E
  2. _*********************************************************
  3. _*                                                       *
  4. _*       MODULE NAME : load.asm                          *
  5. _*                                                       *
  6. _*                mAINTENANCE LOG                        *
  7. _*                ---------------                        *
  8. _*                                                       *
  9. _*   DATE      TIME                     ACTION           *
  10. _*   ----      ----                     ------           *
  11. _* 25/02/89    02:00                 INITIAL CODING      *
  12. _* 29/03/89    19:20                 TIDY UP AND FIX     *
  13. _* 03/04/89    22:00               FURTHER TIDY UP       *
  14. _* 03/04/89    23:00      CHANGE BRACKETS, FIX ASS BUGS  *
  15. _* 05/04/89    19:00         FIXED THE PATCHEND BUG      *
  16. _* 06/04/89    23:30  MOVE ZERO DEFNS AND FIX INIT BUG   *
  17. _* 25/04/89    22:30  FIX BUGS, ADDED $FF05-$FFFF COPY   *
  18. _* 29/04/89     9:55  UPDATED PATCH TABLE + OTHER MODS   *
  19. _* 05/05/89    17:50     FIXED THE PAGE AREA BUGS        *
  20. _* 22/05/89    18:05  UPDATED FOR NEW OPTIONS ON LOCSTOR *
  21. _* 18/06/89    19:00  sYSTEM REGISTERS PLACED ON STACK   *
  22. _* 25/06/89    18:10  sAVE THE STACK POINTER MISSING     *
  23. _* 04/07/89    18:50  PAGE 0 AND 1 CAN BE IN ANY RAM     *
  24. _*********************************************************
  25.  
  26.  
  27. _*********************************************************
  28. _*                                                       *
  29. _*       ROUTINE : initload - INITIALISE THE LOADER      *
  30. _*                 BY COPYING IT THEN PATCHING IT        *
  31. _*                                                       *
  32. _*   ENTRY                                               *
  33. _*   -----                                               *
  34. _*   NONE                                                *
  35. _*.......................................................*
  36. _*   USED                                                *
  37. _*   ----                                                *
  38. _*   a,x,y                                               *
  39. _*.......................................................*
  40. _*   EXIT                                                *
  41. _*   ----                                                *
  42. _*   NONE                                                *
  43. _*********************************************************
  44.  
  45.  
  46.  
  47.  
  48. _ EQUATES USED                                         
  49.  
  50. COPYSTRT= $E000
  51. RAM0CONF= $3F
  52. FILENUM= 1
  53. DEVICE= 8
  54. SECONDAD= 1
  55. DEFPRI= 128
  56. LOADPRG= $F265
  57. ERRLOAD= $F5B5
  58.  
  59.  
  60. _ OTHER REQUIRED STORAGE
  61.  
  62. PRITEXTRES 3
  63. SAVECNTRES 1
  64. STKTEMPRES 1_ AREA TO SAVE STACK POINTER
  65.  
  66. _
  67. _   sTART OF THE CODE
  68. _
  69.  
  70. INITLOADEQU *
  71.  #ZEROADD
  72. {CBM-P} LDASET_ FOR ldafar
  73. {CBM-P} STASET_ FOR stafar
  74.  #>COPYSTRT
  75. {CBM-P} ZEROADD
  76.  #<COPYSTRT
  77. {CBM-P} ZEROADD+1
  78.  #0
  79.  
  80. _
  81. _ COPY THE CODE FROM $E000 TO $FEFF
  82. _ nOTE THAT AS THIS COULD RUN IN bank 15, IE WITH SYSTEM romS
  83. _ ENABLED, YOU CAN lda FROM KERNAL rom AND sta INTO ram WITHOUT
  84. _ HAVING TO CHANGE CONFIGURATIONS. wHEN YOU TRY TO WRITE TO rom
  85. _ IT ACTUALLY WRITES TO THE ram UNDERNEATH.
  86. _
  87.  
  88.  
  89. INITLOD1EQU *
  90.  #$00
  91.  LDAFAR
  92.  #RAM0CONF
  93.  STAFAR
  94.  ZEROADD
  95.  INITLOD1
  96.  ZEROADD+1
  97.  ZEROADD+1
  98.  #$FF
  99.  INITLOD1
  100.  
  101. _
  102. _ COPY THE CODE FROM $FF05 - $FFFF
  103. _
  104.  #5
  105. INITLOD9EQU *
  106.  #0
  107.  LDAFAR
  108.  #RAM0CONF
  109.  STAFAR
  110.  
  111.  INITLOD9
  112.  
  113.  
  114. _ CODE COPIED, NOW PATCH IT.
  115.  
  116.  #0
  117.  #0
  118. PATCHLOPEQU *
  119.  PATCHTAB,X
  120. {CBM-P} ZEROADD
  121.  PATCHTAB+1,X
  122. {CBM-P} ZEROADD+1
  123.  PATCHTAB+2,X
  124. {CBM-A} SAVECNT
  125.  #RAM0CONF
  126.  STAFAR
  127.  SAVECNT
  128.  
  129.  
  130.  
  131.  #PATCHEND
  132.  PATCHLOP
  133.  
  134. _ CODE NOW PATCHED SO RETURN TO CALLER
  135.  
  136. {CBM-N}
  137.  
  138. PATCHTABEQU *
  139. DB  $73,$E5,$EA_ REMOVE sei
  140. DB  $EE,$F3,$EA_ REMOVE sei
  141. DB  $BA,$E5,$EA_ REMOVE cli
  142. DB  $8F,$F4,$EA_ REMOVE cli
  143. DB  $54,$F4,$2C_ REMOVE TEST FOR RUN/STOP
  144. DB  $57,$F4,$4C_ JMP OVER CHECK FOR RUN/STOP FLAG
  145. DB  $58,$F4,$5C
  146. DB  $59,$F4,$F4
  147. DB  $D5,$F2,$4C_ JMP OVER CHECK FOR RUN/STOP FLAG
  148. DB  $D6,$F2,$DA
  149. DB  $D7,$F2,$F2
  150. DB  $21,$F4,$4C_ POINT TO NEW CODE
  151. DB  $22,$F4
  152. DB  >BURSTMOD
  153. DB  $23,$F4
  154. DB  <BURSTMOD
  155. DB  $B0,$F2,$4C_ POINT TO NEW CODE
  156. DB  $B1,$F2
  157. DB  >LOADMOD
  158. DB  $B2,$F2
  159. DB  <LOADMOD
  160. DB  $51,$F4,$F8_ FILE READ TO 248
  161.  
  162. PATCHEND  EQU * - PATCHTAB
  163.  
  164.  
  165. _*********************************************************
  166. _*                                                       *
  167. _*       ROUTINE : load - THE LOAD ROUTINE.              *     
  168. _*    CMD FORMAT : l PROGNAME,PRI                        *
  169. _*                                                       *
  170. _*   ENTRY                                               *
  171. _*   -----                                               *
  172. _*   charbuff - COMMAND LINE INPUT                       *
  173. _*   y        - POSITION IN THE COMMAND BUFFER           *
  174. _*.......................................................*
  175. _*   USED                                                *
  176. _*   ----                                                *
  177. _*   a,x,y                                               *
  178. _*.......................................................*
  179. _*   EXIT                                                *
  180. _*   ----                                                *
  181. _*   NONE                                                *
  182. _*********************************************************
  183.  
  184.  
  185. LOADEQU *
  186.  #PRGNORUN
  187. DB  $2C
  188. EXECUTEEQU *
  189.  #PRGRUN
  190. {CBM-P} OPTION
  191.  READLOAD          _ READ INFORMATION INTO PRGNAME AND GET PRI
  192.  NOSYNTAX
  193. {CBM-N}
  194.  
  195.  
  196. _ oK, WE ARE READY TO LOAD, wE NOW CALL THE PATCHED CODE FOR THE LOADER. fIRST
  197. _ BY SWITCHING THE BANK TO ram, THEN CALLING THE ROUTINE. tHIS METHOD 
  198. _ SAVES THE PROBLEM OF HAVING TO CODE A FULL LOADER WITH SERIAL ROUTINES
  199. _ WHICH WOULD HAVE TO BE DONE FOR A FULL OPERATING SYSTEM.           
  200.  
  201. NOSYNTAXEQU *
  202.  LOCFREE_ LOCATE A FREE ENTRY IN THE TABLE
  203.  ALLOK
  204.  #6
  205.  DISPMESS
  206.  
  207. ALLOKEQU *
  208.  #$3E_ ram BLOCK 0, BUT ALL i/o AVAILABLE 
  209. {CBM-P} CONFREG
  210.  
  211. _ SETUP FOR THE LOAD ROUTINE
  212.  
  213.  #FILENUM
  214. {CBM-P} LFN_ lfn
  215.  #DEVICE_ SERIAL DEVICE
  216. {CBM-P} DEV
  217.  #SECONDAD_ sa
  218. {CBM-P} SA
  219.  NAMELEN
  220. {CBM-P} PRGNLEN
  221.  #>PRGNAME
  222. {CBM-P} PRGNADD
  223.  #<PRGNAME
  224. {CBM-P} PRGNADD+1
  225.  #0_ BANK NUMBER 0, NOT CONFIGURATION NO.
  226. {CBM-P} NAMEBANK_ BANK WHERE NAME IS FOUND.
  227.  #$00
  228. {CBM-P} IOMODE_ STOP ALL OUTPUT FROM SYSTEM
  229.  
  230.  #11
  231.  DISPMESS
  232.  LOADPRG_ CALLS CODE WITHIN THIS SUBROUTINE BLOCK
  233.  NOLODERR
  234.  #9
  235.  DISPMESS
  236.  
  237. _ PROGRAM NOW IN MEMORY, SO RELOCATE, THEN SETUP TABLE ENTRY
  238. _ NOTE THE END ADDRESS IS IN x,y AND THE LOAD ROUTINE HAS ALREADY
  239. _ SET UP SOME PARAMETERS FOR THE RELOCATION.
  240.  
  241. NOLODERREQU *
  242. {CBM-A} NEWEND
  243. {CBM-E} NEWEND+1_ SAVE PROG END ADDRESS
  244.  
  245.  #12
  246.  DISPMESS
  247.  RELOC_ NEWEXEC PASSED BACK NY THIS ROUTINE
  248. _ AND NEWEND NOT ALTERED
  249.  
  250. _ TABLE ENTRY SETUP
  251.  
  252.  #FLAG
  253.  OPTION
  254. {CBM-P} [TABPNTR],Y_ SET MODE OF PROGRAM
  255.  
  256. _ PUT NAME INTO THE TABLE
  257.  
  258.  #0                        
  259.  #NAME
  260. LOADLOP2EQU *
  261.  PRGNAME,X
  262. {CBM-P} [TABPNTR],Y
  263.  
  264.  
  265.  NAMELEN
  266.  LOADLOP2
  267.  #SPACE
  268. LOADLOP8EQU *
  269. {CBM-P} [TABPNTR],Y
  270.  
  271.  
  272.  #MAXLEN
  273.  LOADLOP8
  274.  
  275. _ SAVE RAM, START AND END ADDRESSES
  276.  
  277.  RAMUSED
  278.  #RAMPRG
  279. {CBM-P} [TABPNTR],Y
  280.  STARTRAM
  281.  #STRTADD
  282. {CBM-P} [TABPNTR],Y
  283.  
  284.  STARTRAM+1
  285. {CBM-P} [TABPNTR],Y
  286.  #ENDADD
  287.  NEWEND_ RELYING ON RELOC NOT CHANGING THEM
  288. {CBM-P} [TABPNTR],Y
  289.  
  290.  NEWEND+1
  291. {CBM-P} [TABPNTR],Y
  292.  
  293. _ SET THE PRIORITY VALUE NOW
  294.  
  295.  PRITEMP
  296.  #PRIORITY
  297. {CBM-P} [TABPNTR],Y
  298.  
  299. _ SAVE THE ZERO AND PAGE ONE LOCATIONS
  300. _ AND PUT PAGE 1 OF NEW PROGRAM AVAILABLE
  301.  
  302.  #ZEROOFF
  303.  ZEROPAGE
  304. {CBM-P} [TABPNTR],Y
  305.  #RAMPRG
  306.  [TABPNTR],Y
  307. {CBM-P} PAGE1HI
  308.  #ONEOFF
  309.  PAGEONE
  310. {CBM-P} [TABPNTR],Y
  311. {CBM-P} PAGE1LOW
  312.  
  313.  
  314. _ SET UP THE REGISTER INFO. tHIS COULD BE PASSED BY THE USER OR
  315. _ AS AN EXPANSION ALLOW FILE SETUP TO DEFINE THE INFORMATION
  316. _ FIRST THOUGH, THE STACK NEEDS TO BE PRESERVED...
  317.  
  318. {CBM-H}
  319. {CBM-A} STKTEMP
  320.  
  321.  #$FF
  322. {CBM-L}
  323.  NEWEXEC+1
  324. {CBM-T}
  325.  NEWEXEC
  326. {CBM-T}
  327.  #0
  328. {CBM-T}_ STATUS REGISTER
  329. {CBM-T}_ a
  330. {CBM-T}_ x
  331. {CBM-T}_ y
  332.  #RAMPRG
  333.  [TABPNTR],Y
  334.  CONVRAM
  335. {CBM-T}
  336.  
  337. _ sAVE THE NEW STACK IN THE TABLE READY TO SIMULATE A RETURN OF INTERRUPT
  338.  
  339.  #REGSP
  340. {CBM-H}
  341. {CBM-J}
  342. {CBM-P} [TABPNTR],Y
  343.  
  344. _ RESTORE THE OLD PAGE 1
  345.  
  346.  #OSP1HI
  347. {CBM-P} PAGE1HI
  348.  #OSP1LOW
  349. {CBM-P} PAGE1LOW
  350.  STKTEMP
  351. {CBM-L}
  352.  
  353.  OPTION
  354.  #PRGNORUN
  355.  TRYRUN
  356. {CBM-N}
  357. TRYRUNEQU *
  358.  LOADRUN
  359.  
  360. _ READ NAME AND PRIORITY, CONVERT PRIORITY AND STORE IN THE TABLE
  361.  
  362. READLOADEQU *
  363.  #0
  364. NAMELOP1EQU *
  365.  
  366.  CHARBUFF,Y_ y POINTS TO NEXT CHAR
  367.  #SPACE
  368.  NAMELOP1
  369.  #COMMA
  370.  GETPRI
  371.  #CR
  372.  ONPRI
  373. {CBM-A} NAMELEN
  374.  #DEFPRI_ DEFAULT PRIORITY
  375. {CBM-P} PRITEMP
  376.  
  377. {CBM-N}
  378. ONPRIEQU *
  379. {CBM-P} PRGNAME,X
  380.  
  381.  #16
  382.  NAMELOP1
  383.  #7
  384.  DISPMESS
  385. {CBM-D}
  386. {CBM-N}
  387.  
  388.  
  389. GETPRIEQU *
  390. {CBM-A} NAMELEN
  391.  #0
  392. NAMELOP2EQU *
  393.  
  394.  CHARBUFF,Y
  395.  #CR
  396.  TRANSFER
  397. {CBM-P} PRITEXT,X
  398.  
  399.  #4
  400.  NAMELOP2
  401.  PRIERR
  402.  
  403. _ CONVERT PRIORITY NOW
  404.  
  405. TRANSFEREQU *
  406. {CBM-J}
  407.  #0
  408. {CBM-A} PRITEMP
  409.  #2
  410.  ONES
  411.  #3
  412.  TENS
  413.  PRITEXT
  414.  CONV
  415.  #3
  416.  PRIERR
  417.  MULT10
  418.  MULT10
  419. {CBM-P} PRITEMP
  420.  
  421. TENSEQU *
  422.  PRITEXT,X
  423.  CONV
  424.  MULT10
  425.  
  426.  PRITEMP
  427. {CBM-P} PRITEMP
  428.  
  429. ONESEQU *
  430.  PRITEXT,X
  431.  CONV
  432.  
  433.  PRITEMP
  434. {CBM-P} PRITEMP
  435.  
  436. {CBM-N}
  437. PRIERREQU *
  438.  #8
  439.  DISPMESS
  440. {CBM-D}
  441. {CBM-N}
  442.  
  443. _ ABOVE LOGIC COULD NOT COPE WITH 273 OR 259 FOR EXAMPLE.
  444.  
  445.  
  446.  
  447. _ nOW LOCATE THE MEMORY REQUIRED. (CHECK THE END ADDRESS IN SAVE AND
  448. _ GET THE CORRECT METHOD FOR CALCULATION OF LENGTH REQUIRED)
  449.  
  450. _
  451. _ tHE FOLLOWING CODE IS A MODIFICATION TO THE LOAD ROUTINE TO LOAD IN
  452. _ EXTRA INFORMATION AND THEN SET UP THE RELOCATION INFORMATION
  453. _ THE FINAL PART FOR RELOCATION SETUP IS COMPLETED WHEN LOAD IS DONE.
  454. _
  455.  
  456.  
  457. LOADMODEQU *
  458.  $E43E
  459. {CBM-P} OLDADD
  460.  $E43E
  461. {CBM-P} OLDADD+1_ SET UP FOR RELOCATION
  462.  $E43E
  463. {CBM-P} OLDEND
  464.  $E43E
  465. {CBM-P} OLDEND+1
  466.  $E43E
  467. {CBM-P} EXECADD
  468.  $E43E
  469. {CBM-P} EXECADD+1
  470.  PROCDATA
  471.  LODERROR
  472.  $F2BA
  473.  
  474. BURSTMODEQU *
  475.  $F503
  476.  $F4BA
  477. {CBM-P} OLDADD
  478.  $F503
  479.  $F4BA
  480. {CBM-P} OLDADD+1
  481.  $F503
  482.  $F4BA
  483. {CBM-P} OLDEND
  484.  $F503
  485.  $F4BA
  486. {CBM-P} OLDEND+1
  487.  $F503
  488.  $F4BA
  489. {CBM-P} EXECADD
  490.  $F503
  491.  $F4BA
  492. {CBM-P} EXECADD+1
  493. {CBM-G}
  494. {CBM-T}
  495.  #$1F
  496.  NOTLAST
  497.  $A5
  498. {CBM-D}
  499. {CBM-Q} #4
  500. {CBM-P} $A5
  501. NOTLASTEQU *
  502.  PROCDATA
  503.  LODERROR
  504.  $F434
  505. LODERROREQU *
  506. {CBM-N}_ RETURN TO THE CALLING LOADER WITH C=1
  507.  
  508.  
  509. _
  510. _ nOTE THAT END - START WILL GIVE THE CORRECT LENGTH AS THE END IS ONE
  511. _ MORE THAN IT SHOULD BE.
  512. _
  513.  
  514. PROCDATAEQU *
  515.  OLDEND
  516. {CBM-D}
  517. {CBM-Q} OLDADD
  518. {CBM-P} GIVELEN
  519.  OLDEND+1
  520. {CBM-Q} OLDADD+1
  521. {CBM-P} GIVELEN+1
  522.  #NOSTOPT_ NO OPTIONS REQUIRED
  523.  LOCSTOR_ STORAGE LOCATED FOR PROGRAM.
  524.  EXITLOAD
  525.  
  526. _ sTORAGE LOCATED OK, SO SET UP THE CORRECT LOAD INFORMATION
  527. _ IE NEW START ADDRESS AND BANK TO LOAD INTO
  528.  
  529.  STARTRAM
  530. {CBM-P} STARTLO_ SETUP FOR LOAD
  531. {CBM-P} NEWSTART_ SETUP FOR THE RELOCATION
  532.  STARTRAM+1
  533. {CBM-P} STARTHI
  534. {CBM-P} NEWSTART+1
  535.  RAMUSED
  536.  CONVRAM
  537. {CBM-P} PRGLODBK
  538. {CBM-P} NEWRAM
  539.  
  540. _
  541. _ FIND AREAS FOR PAGE 0 AND PAGE 1. dONE HERE BECAUSE IF YOU CAN'T LOCATE
  542. _ THE STORAGE, THERE ISN'T ANY POINT CONTINUING THE LOAD.
  543. _
  544.  
  545.  #0
  546. {CBM-P} GIVELEN
  547.  #1_ 1 PAGE REQUIRED.
  548. {CBM-P} GIVELEN+1
  549.  #PAGBOUND_ JUST LOCATE ANY OLD PAGE
  550.  LOCSTOR_ TO STORE THE RAM OF THE PAGES.
  551.  EXITLOAD
  552.  STARTRAM+1
  553. {CBM-P} ZEROPAGE
  554.  RAMUSED
  555. {CBM-P} ZERORAM
  556.  #0
  557. {CBM-P} GIVELEN
  558.  #1_ 1 PAGE REQUIRED.
  559. {CBM-P} GIVELEN+1
  560.  #PAGBOUND
  561.  LOCSTOR
  562.  EXITLOAD
  563.  STARTRAM+1
  564. {CBM-P} PAGEONE
  565.  RAMUSED
  566. {CBM-P} ONERAM
  567. {CBM-N}
  568.  
  569. EXITLOAD  EQU *
  570.  
  571. _
  572. _ cLOSE ALL THE FILES ETC., THIS ROUTINE WILL SET THE CARRY FLAG
  573. _ AND ISSUE A RETURN WHICH WILL THEN RETURN TO THE CALLER.
  574. _
  575.  
  576.  ERRLOAD
  577.  
  578. _
  579. _ CONVERT A CHARACTER TO A VALUE
  580. _
  581.  
  582. CONVEQU *
  583. {CBM-D}
  584. {CBM-Q} #50
  585. {CBM-N}
  586.  
  587. _
  588. _ MULTIPLY a BY 10 AND RETURN THE VALUE IN a
  589. _
  590.  
  591. mULT10EQU *
  592.  
  593. {CBM-P} TEMP
  594.  
  595.  
  596.  
  597.  
  598.  TEMP
  599. {CBM-N}
  600.  
  601. iend
  602.  
  603.  
  604.  
  605.  
  606.