home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol008 / pascal.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  6.5 KB  |  352 lines

  1. ;
  2. ;
  3. ;    'PASCAL' FIRST READS IN AND SCANS THE DIRECTORY FOR THE 8080/
  4. ;    Z80 INTERPRETER (SYSTEM.MICRO).  THEN THE INTERPRETER IS
  5. ;    LOADED INTO MEMORY AND STARTED AT THE SYSTEM.PASCAL BOOT VECTOR.
  6. ;
  7. ;    THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC.
  8. ;
  9. ;
  10. ;MODIFIED
  11. ;   10/11/78 BY WINK SAVILLE TO READ IN ANY SIZE INTERPETER
  12. ;
  13. BOOT        EQU    0H        ;LOCATION OF CP/M BOOT VECTOR
  14. BDOS        EQU    5H        ;CP/M ENTRY VECTOR
  15. TPA        EQU    100H        ;START OF USER AREA
  16. ;
  17. RDCON        EQU    1
  18. WRBUF        EQU    9
  19. ;
  20. NBLOCKS        EQU    32        ;MAXIMUM # OF BLOCKS FOR THE
  21.                     ;INTERPETER. USED TO COMPUTE START
  22. START        EQU    TPA+NBLOCKS*512    ;LOCATION OF THIS PROGRAM
  23. INTERP$BASE    EQU    TPA        ;FIRST LOC USED BY THE INTERPRETER
  24. PBEGIN        EQU    INTERP$BASE+100H;ENTRY TO THE PASCAL BOOTER
  25. FIRSTSP        EQU    INTERP$BASE+103H;PASCAL INITIAL STACK POINTER
  26. DENTSZ        EQU    1AH        ;DIR ENTRY SIZE IN BYTES
  27. DTITLE        EQU    06H        ;OFFSET TO ENTRY TITLE
  28. DIRTOP        EQU    PBEGIN        ;TOP OF TEMP RAM DISK DIRECTORY
  29. ;
  30. CR    EQU    0DH
  31. LF    EQU    0AH
  32. EOM    EQU    '$'
  33. ;
  34. ;
  35. ;
  36.     ORG    TPA
  37. ;
  38. ;
  39.     JMP    START
  40. ;
  41. ;
  42. ;
  43.     ORG    START
  44. ;
  45. ;
  46.     LXI    SP,100H
  47. MAIN:                ;LET'S BOOT SYSTEM.MICRO
  48.     CALL    INIT$IO        ;RESET I/O SYSTEM
  49. ;
  50.     CALL    REQUEST$DISK    ;GET PASCAL DISK ON DRIVE A
  51.     MVI    C,0        ;  THEN SELECT THE DRIVE
  52.     CALL    SELDSK
  53. ;
  54.     LXI    B,DIRTOP    ;READ THE DIRECTORY INTO DIRTOP
  55.     CALL    READ$DIR
  56. ;
  57.     LXI    H,DIRTOP    ;SET THE DIRECTORY ENTRY POINTER
  58.     LXI    D,DENTSZ    ;  TO FIRST ENTRY AFTER THE VOLUME NAME
  59.     DAD    D
  60.     SHLD    DENTP
  61. ;
  62.     CALL    FIND$INTERP    ;THEN FIND THE INTERPRETER
  63.     CALL    SAY$LOADING    ;GOT IT SAY WHAT WE'RE UP TO
  64.     CALL    READ$INTERP    ;  AND READ IT IN
  65. ;
  66.     LHLD    BOOT+1        ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE
  67.     MVI    L,0        ;      FOR PROPER SYSTEM OPERATION
  68.     SHLD    FIRSTSP
  69. ;
  70.     JMP    PBEGIN        ;START BOOTING SYSTEM.PASCAL
  71. ;
  72. ;
  73. ;
  74. INIT$IO:            ;INITIALIZE SYSTEM
  75.     RET            ;THAT'S IT
  76. ;
  77. ;
  78. REQUEST$DISK:            ;ASK FOR PASCAL
  79.     MVI    C,WRBUF
  80.     LXI    D,DSKMSG
  81.     CALL    BDOS
  82. RD$LOOP:            ;THEN WAIT FOR A CR
  83.     MVI    C,RDCON
  84.     CALL    BDOS
  85.     CPI    CR
  86.     JNZ    RD$LOOP
  87.     RET
  88. ;
  89. DSKMSG:    DB    CR,LF,'INSERT PASAL DISK IN DRIVE A, THEN TYPE RETURN',EOM
  90. ;
  91. ;
  92. READ$DIR:            ;READ DIRECTORY'S 4 BLOCKS TO BUFFER
  93.                 ;BUFFER ADDRESS IS ALREADY IN BC-REG
  94.     MVI    E,4        ;DIR IS 4 BLOCKS LONG
  95.     LXI    H,2        ;AND STARTS AT BLOCK #2
  96.     CALL    SYSRD        ;GO GET IT
  97.     RET
  98. ;
  99. ;
  100. FIND$INTERP:            ;FIND 'SYSTEM.MICRO'
  101.     MVI    C,77        ;STOP AFTER THE 77'TH ENTRY
  102.     LHLD    DENTP        ;GET STARTING ENTRY
  103. FI$SCH$LP:
  104.     LXI    D,DTITLE    ;ADVANCE TO TITLE STRING
  105.     DAD    D
  106.     LXI    D,SYSTLE    ;SET DE-REG TO COMPARISON STRING
  107.     MVI    B,LENGTH+1    ;COMPARISON LENGTH
  108. FI$CMP$LP:            ;START COMPARING
  109.     LDAX    D
  110.     CMP    M
  111.     JNZ    FI$CONT        ;IT'S NOT THIS ONE
  112.     INX    D        ;HEY, WE'VE STILL GOT A CHANCE
  113.     INX    H
  114.     DCR    B        ;IS THIS THE END OF THE STRING
  115.     JNZ    FI$CMP$LP
  116.     JMP    FI$FOUND    ;I THINK WE FOUND IT
  117. FI$CONT:
  118.     LHLD    DENTP        ;ON TO THE NEXT ENTRY
  119.     LXI    D,DENTSZ
  120.     DAD    D
  121.     SHLD    DENTP
  122.     DCR    C        ;WAIT, IS THERE ANY DIR LEFT?
  123.     JNZ    FI$SCH$LP
  124. ;
  125.     MVI    C,WRBUF        ;NO INTERP THERE
  126.     LXI    D,NOTFNDMSG
  127.     CALL    BDOS
  128. ;
  129. ;
  130. REBOOT:
  131.     MVI    C,WRBUF        ;TRY TO REBOOT CP/M
  132.     LXI    D,REBOOTMSG
  133.     CALL    BDOS
  134.     MVI    C,RDCON
  135.     CALL    BDOS        ;WAIT FOR ANY CHAR
  136.     JMP    BOOT
  137. ;
  138. FI$FOUND:            ;WE'VE GOT IT
  139.     RET
  140. ;
  141. NOTFNDMSG:    DB    CR,LF,'INTERPRETER NOT FOUND',CR,LF,EOM
  142. REBOOTMSG:    DB    CR,LF,'REBOOTING CP/M',EOM
  143. ;
  144. LENGTH    EQU    12        ;TITLE LENGTH
  145. SYSTLE    DB    LENGTH,'SYSTEM.MICRO'
  146. ;
  147. ;
  148. SAY$LOADING:            ;WE'RE GOING TO LOAD THE INTERPRETER
  149.     MVI    C,WRBUF
  150.     LXI    D,LOADINGMSG
  151.     CALL    BDOS
  152.     RET
  153. ;
  154. LOADINGMSG:    DB    CR,LF,'LOADING...',EOM
  155. ;
  156. ;
  157. READ$INTERP:            ;PUT INTERP IN ITS PLACE
  158.     LHLD    DENTP        ;GET STARTING BLOCK
  159.     MOV    E,M        ;  INTO HL-REG
  160.     INX    H
  161.     MOV    D,M
  162. ;
  163. ;COMPUTE THE LENGTH OF THE INTERPETER
  164.     PUSH    D    ;SAVE FIRST BLOCK ON STACK
  165.             ;TAKE 2'S COMPLIMENT OF FIRST BLOCK
  166.     MOV    A,E
  167.     CMA
  168.     MOV    E,A
  169.     MOV    A,D
  170.     CMA
  171.     MOV    D,A
  172.     INX    D    ;DE=2'S COMP OF FIRST BLOCK
  173.  
  174.     PUSH    D    ;SAVE ON THE STACK
  175.  
  176. ;GET NEXT AVAIL BLOCK
  177.     INX    H
  178.     MOV    E,M
  179.     INX    H
  180.     MOV    D,M
  181.     XCHG
  182. ;
  183.     POP    D    ;HL=NXT BLOCK,DE=-(FIRST BLOCK)
  184.             ;SO HL+DE=LENGTH OF SYSTEM.MICRO
  185.     DAD    D    ;HL=LENGTH
  186.     XCHG        ;DE=LENGTH
  187.     POP    H    ;HL=FIRST BLOCK , DE=LENGTH
  188. ;
  189. ;CHECK THAT WE WON'T OVERWRITE OURSELVES
  190.     LXI    B,NBLOCKS
  191.     MOV    A,C
  192.     SUB    E
  193.     MOV    A,B
  194.     SBB    D
  195.     JNC    OK    ;JIF OK
  196.             ;ELSE TELL OPERATOR AND REBOOT
  197.     LXI    D,INTERP$TO$LARGE
  198.     MVI    C,WRBUF
  199.     CALL    BDOS    ;PRINT THE MESSAGE
  200.     JMP    REBOOT    ;REBOOT CPM
  201.  
  202. INTERP$TO$LARGE:
  203.     DB    CR,LF,'INTERPETER TO LARGE IT WILL OVER WRITE'
  204.     DB    CR,LF,'THIS PROGRAM. REASSEMBLE THIS PROGRAM'
  205.     DB    CR,LF,'WITH A HIGHER STARTING ADDRESS',CR,LF,EOM
  206.  
  207. ;
  208. OK:
  209.     LXI    B,INTERP$BASE    ;AND SET IT LOAD POINT
  210.     CALL    SYSRD        ;THEN READ IT
  211.     RET
  212. ;
  213. ;
  214. SYSRD:                ;READ BLOCKS FROM PASCAL DISKETTE
  215.     PUSH    D        ;SAVE BLOCK COUNT
  216.     PUSH    H        ;AND BLOCK NUMBER
  217.     CALL    READ$RX        ;BUFFER IS ADVANCED BY 512 BYTES
  218.     POP    H
  219.     POP    D
  220.     INX    H        ;ADVANCE TO NEXT BLOCK
  221.     DCR    E        ;BUT, BEFORE WE GO ON
  222.     JNZ    SYSRD        ;  SEE IF WE'RE DONE
  223.     RET
  224. ;
  225. ;
  226. READ$RX:            ;READ A PASCAL BLOCK
  227.     DAD    H        ;THERE ARE 4 IBM SECTORS TO A PASCAL BLOCK
  228.     DAD    H        ;  SO MULT LOGICAL BLOCK BY 4 TO GET 1ST SEC
  229.     MVI    E,4
  230. RR$LP:                ;THIS GETS CONFUSING
  231.     PUSH    B        ;SET BUFFER ADDRESS
  232.     PUSH    D
  233.     PUSH    H
  234.     CALL    SETDMA
  235.     POP    H        ;NOW COMPUTE PHYSICAL TRACK-SECTOR
  236.     PUSH    H
  237.     CALL    MAP        ;MAP CONVERTS LOGICAL SECTOR IN HL-REG
  238.     MOV    C,H        ;  INTO PHYSICAL TRACK, H-REG, SECTOR, L-REG
  239.     PUSH    H
  240.     CALL    SETTRK
  241.     POP    H
  242.     MOV    C,L
  243.     CALL    SETSEC
  244.     CALL    READ        ;AND READ THE DATA
  245.     POP    H
  246.     POP    D
  247.     POP    B
  248.     PUSH    H        ;ADVANCE THE BUFFER ADDRESS
  249.     LXI    H,128
  250.     DAD    B
  251.     MOV    B,H
  252.     MOV    C,L
  253.     POP    H
  254.     INX    H        ;ADVANCE BLOCK COUNT
  255.     DCR    E        ;THEN SEE IF WE CONTINUE
  256.     JNZ    RR$LP
  257.     RET            ;LEAVE, WHEN DONE
  258. ;
  259. ;
  260. DENTP    DS    2
  261. ;
  262. ;
  263. HOME:                ;HOME SELECTED DISK TO TRACK 00
  264.     LHLD    BOOT+1
  265.     MVI    L,18H
  266.     PCHL
  267. ;
  268. SELDSK:                ;SELECT DISK (C-REG)
  269.     LHLD    BOOT+1
  270.     MVI    L,1BH
  271.     PCHL
  272. ;
  273. SETTRK:                ;SET TRACK (C-REG)
  274.     LHLD    BOOT+1
  275.     MVI    L,1EH
  276.     PCHL
  277. ;
  278. SETSEC:                ;SET SECTOR (C-REG)
  279.     LHLD    BOOT+1
  280.     MVI    L,21H
  281.     PCHL
  282. ;
  283. SETDMA:                ;SET DATA TRANSFER ADDRESS (BC-REG)
  284.     LHLD    BOOT+1
  285.     MVI    L,24H
  286.     PCHL
  287. ;
  288. READ:                ;READ A SECTOR TO THE DATA AREA
  289.     LHLD    BOOT+1
  290.     MVI    L,27H
  291.     PCHL
  292. ;
  293. ;
  294. MAP:            ;TURN LSN INTO IBM TRACK-SECTOR
  295. ;
  296. ;    NOTE:    TRACK 00 IS NOT USED SO BLOCK 0
  297. ;        IS AT TRACK 01 SECTOR 1
  298. ;
  299. ;    ON ENTRY:    HL-REG HAS LOGICAL SECTOR NO.
  300. ;    ON EXIT:    H-REG HAS PHYSICAL TRACK
  301. ;            L-REG HAS PHYSICAL SECTOR
  302. ;
  303. ;
  304.     PUSH    B
  305.     PUSH    D
  306. ;
  307.     CALL    DIV26
  308.     MOV    A,L
  309.     ADD    A
  310.     MOV    B,A
  311.     MVI    A,12
  312.     CMP    L
  313.     JNC    MAPC
  314.     INR    B
  315. MAPC:
  316.     MOV    C,E
  317.     XRA    A
  318.     MOV    D,A
  319.     MOV    H,A
  320.     MOV    L,B
  321.     MVI    A,6
  322. MAP$LOOP:
  323.     DAD    D
  324.     DCR    A
  325.     JNZ    MAP$LOOP
  326.     PUSH    B
  327.     CALL    DIV26
  328.     POP    B
  329.     INR    L
  330.     MOV    H,C
  331.     INR    H
  332.     POP    D
  333.     POP    B
  334.     RET
  335. ;
  336. ;
  337. DIV26:
  338.     LXI    B,-26
  339.     MVI    E,0FFH
  340. DIVL:
  341.     INR    E
  342.     DAD    B
  343.     MOV    A,H
  344.     ORA    A
  345.     JP    DIVL
  346.     LXI    B,26
  347.     DAD    B
  348.     RET
  349. ;
  350. ;
  351.     END    START
  352.