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