home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv008.ark / PINIT.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.2 KB  |  260 lines

  1. MSIZE    EQU    48            ;SYSTEM SIZE IN KILOBYTES
  2. BIOSSZ    EQU    512            ; BIOS SIZE IN BYTES
  3. ;
  4. ;
  5. ;    PINIT FIRST READS IN AND SCANS THE DIRECTORY FOR THE 8080/
  6. ;    Z80 INTERPRETER (SYSTEM.MICRO).  THEN THE INTERPRETER IS
  7. ;    LOADED INTO MEMORY, THE BIOS PAGE POINTER SET, AND EXECUTION
  8. ;    IS STARTED AT THE SYSTEM.PASCAL BOOT VECTOR.
  9. ;
  10. ;    THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC.
  11. ;
  12. ;MODIFIED
  13. ;   10/11/78 BY WINK SAVILLE OF SVA TO READ ANY SIZE INTERPETER
  14. ;
  15. ;
  16. BOOT        EQU    0H        ;LOCATION OF CP/M BOOT VECTOR
  17. BIOS$PAGE    EQU    2H        ;BIOS PAGE POINTER LOCATION
  18. BIOS    EQU    MSIZE*1024-BIOSSZ    ; LOCATION OF BIOS VECTOR TABLE
  19. IBASE    EQU    BIOS-1024        ; LOCATION OF THIS INIT ROUTINE
  20. INTERP$BASE    EQU    100H        ;FIRST LOC USED BY THE INTERPRETER
  21. PBEGIN        EQU    INTERP$BASE+100H;ENTRY TO THE PASCAL BOOTER
  22. FIRSTSP    EQU    INTERP$BASE+103H
  23. DENTSZ        EQU    1AH        ;DIR ENTRY SIZE IN BYTES
  24. DTITLE        EQU    06H        ;OFFSET TO ENTRY TITLE
  25. DIRTOP        EQU    IBASE-1000H    ;TOP OF TEMP RAM DISK DIRECTORY
  26. HOME        EQU    BIOS+18H    ;DISK HOME TO TRACK 00
  27. SELDSK        EQU    BIOS+1BH    ;DISK SELECT
  28. SETTRK        EQU    BIOS+1EH    ;SET TRACK
  29. SETSEC        EQU    BIOS+21H    ;SET SECTOR
  30. SETDMA        EQU    BIOS+24H    ;SET DATA TRANSFER AREA
  31. READ        EQU    BIOS+27H    ;READ SECTOR TO DATA AREA
  32. ;
  33. ;
  34. ;
  35.     ORG    IBASE
  36. ;
  37. ;
  38.     LXI    SP,100H
  39. MAIN:                ;LET'S BOOT SYSTEM.MICRO
  40.     CALL    INIT$IO        ;RESET I/O SYSTEM
  41. ;
  42.     LXI    B,DIRTOP    ;READ THE DIRECTORY INTO DIRTOP
  43.     CALL    READ$DIR
  44. ;
  45.     LXI    H,DIRTOP    ;SET THE DIRECTORY ENTRY POINTER
  46.     LXI    D,DENTSZ    ;  TO FIRST ENTRY AFTER THE VOLUME NAME
  47.     DAD    D
  48.     SHLD    DENTP
  49. ;
  50.     CALL    FIND$INTERP    ;THEN FIND THE INTERPRETER
  51.     CALL    READ$INTERP    ;  AND READ IT IN
  52. ;
  53.     MVI    A,JMP        ;SET VECTOR TO BIOS ENTRY FOR THE PASCAL
  54.     STA    BOOT        ;  SYSTEM 'H(ALT' COMMAND
  55.     LXI    H,BIOS+03H    ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE
  56.     SHLD    BOOT+1        ;      FOR PROPER SYSTEM OPERATION
  57.     MVI    L,0
  58.     SHLD    FIRSTSP
  59. ;
  60.     JMP    PBEGIN        ;START BOOTING SYSTEM.PASCAL
  61. ;
  62. ;
  63. ;
  64. INIT$IO:            ;INITIALIZE SYSTEM
  65.     MVI    C,1
  66.     CALL    SELDSK
  67.     CALL    HOME
  68.     MVI    C,0
  69.     CALL    SELDSK
  70.     CALL    HOME
  71.     RET            ;THAT'S IT
  72. ;
  73. ;
  74. READ$DIR:            ;READ DIRECTORY'S 4 BLOCKS TO BUFFER
  75.                 ;BUFFER ADDRESS IS ALREADY IN BC-REG
  76.     MVI    E,4        ;DIR IS 4 BLOCKS LONG
  77.     LXI    H,2        ;AND STARTS AT BLOCK #2
  78.     CALL    SYSRD        ;GO GET IT
  79.     RET
  80. ;
  81. ;
  82. FIND$INTERP:            ;FIND 'SYSTEM.MICRO'
  83.     MVI    C,77        ;STOP AFTER THE 77'TH ENTRY
  84.     LHLD    DENTP        ;GET STARTING ENTRY
  85. FI$SCH$LP:
  86.     LXI    D,DTITLE    ;ADVANCE TO TITLE STRING
  87.     DAD    D
  88.     LXI    D,SYSTLE    ;SET DE-REG TO COMPARISON STRING
  89.     MVI    B,LENGTH+1    ;COMPARISON LENGTH
  90. FI$CMP$LP:            ;START COMPARING
  91.     LDAX    D
  92.     CMP    M
  93.     JNZ    FI$CONT        ;IT'S NOT THIS ONE
  94.     INX    D        ;HEY, WE'VE STILL GOT A CHANCE
  95.     INX    H
  96.     DCR    B        ;IS THIS THE END OF THE STRING
  97.     JNZ    FI$CMP$LP
  98.     JMP    FI$FOUND    ;I THINK WE FOUND IT
  99. FI$CONT:
  100.     LHLD    DENTP        ;ON TO THE NEXT ENTRY
  101.     LXI    D,DENTSZ
  102.     DAD    D
  103.     SHLD    DENTP
  104.     DCR    C        ;WAIT, IS THERE ANY DIR LEFT?
  105.     JNZ    FI$SCH$LP
  106. FI$HANG:            ;INTERPRETER NOT THERE, GO DUMB
  107.     JMP    FI$HANG        ;ADD CODE TO SEND A MESSAGE TO CONOUT
  108.  
  109. FI$FOUND:            ;WE'VE GOT IT
  110.     RET
  111. ;
  112. LENGTH    EQU    12        ;TITLE LENGTH
  113. SYSTLE    DB    LENGTH,'SYSTEM.MICRO'
  114. ;
  115. ;
  116. READ$INTERP:            ;PUT INTERP IN ITS PLACE
  117.     LHLD    DENTP        ;GET STARTING BLOCK
  118.     MOV    E,M        ;  INTO HL-REG
  119.     INX    H
  120.     MOV    D,M
  121. ;
  122. ;  COMPUTE LENGTH OF INTERPETER
  123.     PUSH    D    ;SAVE FIRST BLOCK ON STACK
  124.             ;TAKE 2'S COMPLIMENT OF FIRST BLOCK
  125.     MOV    A,E
  126.     CMA
  127.     MOV    E,A
  128.     MOV    A,D
  129.     CMA
  130.     MOV    D,A
  131.     INX    D    ;DE=2'S COMP OF FIRST BLOCK
  132.  
  133.     PUSH    D    ;SAVE ON THE STACK
  134.  
  135. ;GET NEXT AVAIL BLOCK
  136.     INX    H
  137.     MOV    E,M
  138.     INX    H
  139.     MOV    D,M
  140.     XCHG
  141. ;
  142.     POP    D    ;HL=NXT BLOCK,DE=-(FIRST BLOCK)
  143.             ;SO HL+DE=LENGTH OF SYSTEM.MICRO
  144.     DAD    D    ;HL=LENGTH
  145.     XCHG        ;DE=LENGTH
  146.     POP    H    ;HL=FIRST BLOCK , DE=LENGTH
  147.     LXI    B,INTERP$BASE    ;AND SET IT LOAD POINT
  148.     CALL    SYSRD        ;THEN READ IT
  149.     RET
  150. ;
  151. ;
  152. ;
  153. SYSRD:                ;READ BLOCKS FROM PASCAL DISKETTE
  154.     PUSH    D        ;SAVE BLOCK COUNT
  155.     PUSH    H        ;AND BLOCK NUMBER
  156.     CALL    READ$RX        ;BUFFER IS ADVANCED BY 512 BYTES
  157.     POP    H
  158.     POP    D
  159.     INX    H        ;ADVANCE TO NEXT BLOCK
  160.     DCR    E        ;BUT, BEFORE WE GO ON
  161.     JNZ    SYSRD        ;  SEE IF WE'RE DONE
  162.     RET
  163. ;
  164. ;
  165. READ$RX:            ;READ A PASCAL BLOCK
  166.     DAD    H        ;THERE ARE 4 IBM SECTORS TO A PASCAL BLOCK
  167.     DAD    H        ;  SO MULT LOGICAL BLOCK BY 4 TO GET 1ST SEC
  168.     MVI    E,4
  169. RR$LP:                ;THIS GETS CONFUSING
  170.     PUSH    B        ;SET BUFFER ADDRESS
  171.     PUSH    D
  172.     PUSH    H
  173.     CALL    SETDMA
  174.     POP    H        ;NOW COMPUTE PHYSICAL TRACK-SECTOR
  175.     PUSH    H
  176.     CALL    MAP        ;MAP CONVERTS LOGICAL SECTOR IN HL-REG
  177.     MOV    C,H        ;  INTO PHYSICAL TRACK, H-REG, SECTOR, L-REG
  178.     PUSH    H
  179.     CALL    SETTRK
  180.     POP    H
  181.     MOV    C,L
  182.     CALL    SETSEC
  183.     CALL    READ        ;AND READ THE DATA
  184.     POP    H
  185.     POP    D
  186.     POP    B
  187.     PUSH    H        ;ADVANCE THE BUFFER ADDRESS
  188.     LXI    H,128
  189.     DAD    B
  190.     MOV    B,H
  191.     MOV    C,L
  192.     POP    H
  193.     INX    H        ;ADVANCE BLOCK COUNT
  194.     DCR    E        ;THEN SEE IF WE CONTINUE
  195.     JNZ    RR$LP
  196.     RET            ;LEAVE, WHEN DONE
  197. ;
  198. ;
  199. DENTP    DS    2
  200. ;
  201. ;
  202. MAP:            ;TURN LSN INTO IBM TRACK-SECTOR
  203. ;
  204. ;    NOTE:    TRACK 00 IS NOT USED SO BLOCK 0
  205. ;        IS AT TRACK 01 SECTOR 1
  206. ;
  207. ;    ON ENTRY:    HL-REG HAS LOGICAL SECTOR NO.
  208. ;    ON EXIT:    H-REG HAS PHYSICAL TRACK
  209. ;            L-REG HAS PHYSICAL SECTOR
  210. ;
  211. ;
  212.     PUSH    B
  213.     PUSH    D
  214. ;
  215.     CALL    DIV26
  216.     MOV    A,L
  217.     ADD    A
  218.     MOV    B,A
  219.     MVI    A,12
  220.     CMP    L
  221.     JNC    MAPC
  222.     INR    B
  223. MAPC:
  224.     MOV    C,E
  225.     XRA    A
  226.     MOV    D,A
  227.     MOV    H,A
  228.     MOV    L,B
  229.     MVI    A,6
  230. MAP$LOOP:
  231.     DAD    D
  232.     DCR    A
  233.     JNZ    MAP$LOOP
  234.     PUSH    B
  235.     CALL    DIV26
  236.     POP    B
  237.     INR    L
  238.     MOV    H,C
  239.     INR    H
  240.     POP    D
  241.     POP    B
  242.     RET
  243. ;
  244. ;
  245. DIV26:
  246.     LXI    B,-26
  247.     MVI    E,0FFH
  248. DIVL:
  249.     INR    E
  250.     DAD    B
  251.     MOV    A,H
  252.     ORA    A
  253.     JP    DIVL
  254.     LXI    B,26
  255.     DAD    B
  256.     RET
  257. ;
  258. ;
  259.     END    IBASE
  260.