home *** CD-ROM | disk | FTP | other *** search
- MSIZE EQU 48 ;SYSTEM SIZE IN KILOBYTES
- BIOSSZ EQU 512 ; BIOS SIZE IN BYTES
- ;
- ;
- ; PINIT FIRST READS IN AND SCANS THE DIRECTORY FOR THE 8080/
- ; Z80 INTERPRETER (SYSTEM.MICRO). THEN THE INTERPRETER IS
- ; LOADED INTO MEMORY, THE BIOS PAGE POINTER SET, AND EXECUTION
- ; IS STARTED AT THE SYSTEM.PASCAL BOOT VECTOR.
- ;
- ; THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC.
- ;
- ;MODIFIED
- ; 10/11/78 BY WINK SAVILLE OF SVA TO READ ANY SIZE INTERPETER
- ;
- ;
- BOOT EQU 0H ;LOCATION OF CP/M BOOT VECTOR
- BIOS$PAGE EQU 2H ;BIOS PAGE POINTER LOCATION
- BIOS EQU MSIZE*1024-BIOSSZ ; LOCATION OF BIOS VECTOR TABLE
- IBASE EQU BIOS-1024 ; LOCATION OF THIS INIT ROUTINE
- INTERP$BASE EQU 100H ;FIRST LOC USED BY THE INTERPRETER
- PBEGIN EQU INTERP$BASE+100H;ENTRY TO THE PASCAL BOOTER
- FIRSTSP EQU INTERP$BASE+103H
- DENTSZ EQU 1AH ;DIR ENTRY SIZE IN BYTES
- DTITLE EQU 06H ;OFFSET TO ENTRY TITLE
- DIRTOP EQU IBASE-1000H ;TOP OF TEMP RAM DISK DIRECTORY
- HOME EQU BIOS+18H ;DISK HOME TO TRACK 00
- SELDSK EQU BIOS+1BH ;DISK SELECT
- SETTRK EQU BIOS+1EH ;SET TRACK
- SETSEC EQU BIOS+21H ;SET SECTOR
- SETDMA EQU BIOS+24H ;SET DATA TRANSFER AREA
- READ EQU BIOS+27H ;READ SECTOR TO DATA AREA
- ;
- ;
- ;
- ORG IBASE
- ;
- ;
- LXI SP,100H
- MAIN: ;LET'S BOOT SYSTEM.MICRO
- CALL INIT$IO ;RESET I/O SYSTEM
- ;
- LXI B,DIRTOP ;READ THE DIRECTORY INTO DIRTOP
- CALL READ$DIR
- ;
- LXI H,DIRTOP ;SET THE DIRECTORY ENTRY POINTER
- LXI D,DENTSZ ; TO FIRST ENTRY AFTER THE VOLUME NAME
- DAD D
- SHLD DENTP
- ;
- CALL FIND$INTERP ;THEN FIND THE INTERPRETER
- CALL READ$INTERP ; AND READ IT IN
- ;
- MVI A,JMP ;SET VECTOR TO BIOS ENTRY FOR THE PASCAL
- STA BOOT ; SYSTEM 'H(ALT' COMMAND
- LXI H,BIOS+03H ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE
- SHLD BOOT+1 ; FOR PROPER SYSTEM OPERATION
- MVI L,0
- SHLD FIRSTSP
- ;
- JMP PBEGIN ;START BOOTING SYSTEM.PASCAL
- ;
- ;
- ;
- INIT$IO: ;INITIALIZE SYSTEM
- MVI C,1
- CALL SELDSK
- CALL HOME
- MVI C,0
- CALL SELDSK
- CALL HOME
- RET ;THAT'S IT
- ;
- ;
- READ$DIR: ;READ DIRECTORY'S 4 BLOCKS TO BUFFER
- ;BUFFER ADDRESS IS ALREADY IN BC-REG
- MVI E,4 ;DIR IS 4 BLOCKS LONG
- LXI H,2 ;AND STARTS AT BLOCK #2
- CALL SYSRD ;GO GET IT
- RET
- ;
- ;
- FIND$INTERP: ;FIND 'SYSTEM.MICRO'
- MVI C,77 ;STOP AFTER THE 77'TH ENTRY
- LHLD DENTP ;GET STARTING ENTRY
- FI$SCH$LP:
- LXI D,DTITLE ;ADVANCE TO TITLE STRING
- DAD D
- LXI D,SYSTLE ;SET DE-REG TO COMPARISON STRING
- MVI B,LENGTH+1 ;COMPARISON LENGTH
- FI$CMP$LP: ;START COMPARING
- LDAX D
- CMP M
- JNZ FI$CONT ;IT'S NOT THIS ONE
- INX D ;HEY, WE'VE STILL GOT A CHANCE
- INX H
- DCR B ;IS THIS THE END OF THE STRING
- JNZ FI$CMP$LP
- JMP FI$FOUND ;I THINK WE FOUND IT
- FI$CONT:
- LHLD DENTP ;ON TO THE NEXT ENTRY
- LXI D,DENTSZ
- DAD D
- SHLD DENTP
- DCR C ;WAIT, IS THERE ANY DIR LEFT?
- JNZ FI$SCH$LP
- FI$HANG: ;INTERPRETER NOT THERE, GO DUMB
- JMP FI$HANG ;ADD CODE TO SEND A MESSAGE TO CONOUT
-
- FI$FOUND: ;WE'VE GOT IT
- RET
- ;
- LENGTH EQU 12 ;TITLE LENGTH
- SYSTLE DB LENGTH,'SYSTEM.MICRO'
- ;
- ;
- READ$INTERP: ;PUT INTERP IN ITS PLACE
- LHLD DENTP ;GET STARTING BLOCK
- MOV E,M ; INTO HL-REG
- INX H
- MOV D,M
- ;
- ; COMPUTE LENGTH OF INTERPETER
- PUSH D ;SAVE FIRST BLOCK ON STACK
- ;TAKE 2'S COMPLIMENT OF FIRST BLOCK
- MOV A,E
- CMA
- MOV E,A
- MOV A,D
- CMA
- MOV D,A
- INX D ;DE=2'S COMP OF FIRST BLOCK
-
- PUSH D ;SAVE ON THE STACK
-
- ;GET NEXT AVAIL BLOCK
- INX H
- MOV E,M
- INX H
- MOV D,M
- XCHG
- ;
- POP D ;HL=NXT BLOCK,DE=-(FIRST BLOCK)
- ;SO HL+DE=LENGTH OF SYSTEM.MICRO
- DAD D ;HL=LENGTH
- XCHG ;DE=LENGTH
- POP H ;HL=FIRST BLOCK , DE=LENGTH
- LXI B,INTERP$BASE ;AND SET IT LOAD POINT
- CALL SYSRD ;THEN READ IT
- RET
- ;
- ;
- ;
- SYSRD: ;READ BLOCKS FROM PASCAL DISKETTE
- PUSH D ;SAVE BLOCK COUNT
- PUSH H ;AND BLOCK NUMBER
- CALL READ$RX ;BUFFER IS ADVANCED BY 512 BYTES
- POP H
- POP D
- INX H ;ADVANCE TO NEXT BLOCK
- DCR E ;BUT, BEFORE WE GO ON
- JNZ SYSRD ; SEE IF WE'RE DONE
- RET
- ;
- ;
- READ$RX: ;READ A PASCAL BLOCK
- DAD H ;THERE ARE 4 IBM SECTORS TO A PASCAL BLOCK
- DAD H ; SO MULT LOGICAL BLOCK BY 4 TO GET 1ST SEC
- MVI E,4
- RR$LP: ;THIS GETS CONFUSING
- PUSH B ;SET BUFFER ADDRESS
- PUSH D
- PUSH H
- CALL SETDMA
- POP H ;NOW COMPUTE PHYSICAL TRACK-SECTOR
- PUSH H
- CALL MAP ;MAP CONVERTS LOGICAL SECTOR IN HL-REG
- MOV C,H ; INTO PHYSICAL TRACK, H-REG, SECTOR, L-REG
- PUSH H
- CALL SETTRK
- POP H
- MOV C,L
- CALL SETSEC
- CALL READ ;AND READ THE DATA
- POP H
- POP D
- POP B
- PUSH H ;ADVANCE THE BUFFER ADDRESS
- LXI H,128
- DAD B
- MOV B,H
- MOV C,L
- POP H
- INX H ;ADVANCE BLOCK COUNT
- DCR E ;THEN SEE IF WE CONTINUE
- JNZ RR$LP
- RET ;LEAVE, WHEN DONE
- ;
- ;
- DENTP DS 2
- ;
- ;
- MAP: ;TURN LSN INTO IBM TRACK-SECTOR
- ;
- ; NOTE: TRACK 00 IS NOT USED SO BLOCK 0
- ; IS AT TRACK 01 SECTOR 1
- ;
- ; ON ENTRY: HL-REG HAS LOGICAL SECTOR NO.
- ; ON EXIT: H-REG HAS PHYSICAL TRACK
- ; L-REG HAS PHYSICAL SECTOR
- ;
- ;
- PUSH B
- PUSH D
- ;
- CALL DIV26
- MOV A,L
- ADD A
- MOV B,A
- MVI A,12
- CMP L
- JNC MAPC
- INR B
- MAPC:
- MOV C,E
- XRA A
- MOV D,A
- MOV H,A
- MOV L,B
- MVI A,6
- MAP$LOOP:
- DAD D
- DCR A
- JNZ MAP$LOOP
- PUSH B
- CALL DIV26
- POP B
- INR L
- MOV H,C
- INR H
- POP D
- POP B
- RET
- ;
- ;
- DIV26:
- LXI B,-26
- MVI E,0FFH
- DIVL:
- INR E
- DAD B
- MOV A,H
- ORA A
- JP DIVL
- LXI B,26
- DAD B
- RET
- ;
- ;
- END IBASE
-