home *** CD-ROM | disk | FTP | other *** search
- .TITLE "Initialization, bootstrap relocation,"
- .SBTTL "and multi-bank memory management program."
- .REMARK `
- Memory bank management program designed for
- a multi-bank memory system equipped with an
- IMSAI VIOC video board and an IMSAI MIO I/O
- board specially wired to turn memory on the
- VIOC board on and off. This program initia-
- lizes the computer and moves a bootstrap
- routine from a Cromemco 16-KPR ROM board in
- Bank 0 to an Industrial Micro Systems 32K
- RAM board in Bank 1. This bootstrap, then,
- boots in the CPM disk operating system from
- disk drive 0 to Bank 1 RAM memory. Console
- Status, STATUS (CONST); Console Input, KYBD
- (CONIN); Console Output, VIOC (CONOT) and
- Printer Output/Control, PRINT (LIST) sub-
- routines called by CPM's BIOS are also in-
- cluded in this program. A RUBOUT routine
- handles onscreen character deletion for the
- CPM and BASIC language environments (back-
- slashes generated by most BASICs to set off
- deleted blocks are supressed) and an ESCAPE
- routine provides large letter (ESC L) and
- inverse video (ESC V) switches for the VIOC
- vidoe board.
-
- COMPILED BY LEONARD GOGOL ON 8-13-1979.
- (Use TDL Z80 Relocating/Linking Assembler.)`
-
-
- .IDENT MBMBOT
- .INTERN .MAIN.
- .PREL
- .LINK
- .MAIN. = 8000H
-
-
- ;
- ; PROGRAM DATA TABLES.
- ;
-
- ;I/O EQUATES.
-
- ACBIT = 8 ;ACK CHARACTER READY BIT.
- CDATA = 2 ;CONSOLE DATA PORT.
- CKBR = 2 ;KEYBOARD READY BIT.
- CSTAT = 3 ;CONSOLE STATUS PORT.
- LDATA = 1 ;PRINTER DATA PORT.
- LRBIT = 1 ;PRINTER READY BIT.
- LSTAT = 3 ;PRINTER STATUS PORT.
- CHARC = 7 ;PRINTER CHARACTER COUNT.
- BUFFC = 30 ;PRINTER BUFFER COUNT.
- FRPN = 0FFH ;FRONT PANEL I/O PORT.
- DCOM = 0F8H ;TARBELL
- DDATA = 0FBH ;DISK
- DSTAT = 0F8H ;CONTROLLER
- SECT = 0FAH ;PORT
- WAIT = 0FCH ;ASSIGNMENTS.
-
-
- ;IOFLAG BUFFER, FLAGS.
-
- RUBFL = 7 ;RUBOUT FLAG.
- BSLFL = 6 ;BACKSLASH FLAG.
- BOLFL = 5 ;BEGINNING OF LINE FLAG.
- ESCFL = 4 ;ESCAPE FLAG.
-
-
- ;RESERVED MEMORY AREA.
-
- STACK = 0E3FFH;STACK LOCATION IN BANK 0.
- BEGSCR = 0E000H;SCRATCH AND STACK
- ENDSCR = 0EFFFH;SPACE IN BANK 0.
- SPSAVE = 0F63CH;SP STORAGE IN BANK 1.
-
-
- ;DEFINED ADDRESSES.
-
- CLEAR = 0F800H;VIOC INITIALIZATION ROUTINE.
- VIOC = 0F803H;VIOC CHAR. OUTPUT ROUTINE.
-
-
- ;SELECTIVE BANK-ON SWITCHES.
-
- B0A = 4 ;0000-3FFF ROM BANK 0.
- B0B = 2 ;4000-7FFF ROM BANK 0.
- B0C = 1 ;8000-BFFF ROM BANK 0.
- B0D = 8 ;C000-DFFF ROM BANK 0.
- B0E = 16 ;E000-EFFF RAM BANK 0.
- B0FON = 0 ;F000-FFFF VIOC BANK 0.
-
- BXA = 1 ;0000-0FFF RAM BANK 1A,
- ;8000-8FFF RAM BANK 1B.
- BXB = 2 ;1000-1FFF RAM BANK 1A,
- ;9000-9FFF RAM BANK 1B.
- BXC = 4 ;2000-2FFF RAM BANK 1A,
- ;A000-AFFF RAM BANK 1B.
- BXD = 8 ;3000-3FFF RAM BANK 1A,
- ;B000-BFFF RAM BANK 1B.
- BXE = 16 ;4000-4FFF RAM BANK 1A,
- ;C000-CFFF RAM BANK 1B.
- BXF = 32 ;5000-5FFF RAM BANK 1A,
- ;D000-DFFF RAM BANK 1B.
- BXG = 64 ;6000-6FFF RAM BANK 1A,
- ;E000-EFFF RAM BANK 1B.
- BXH = 128 ;7000-7FFF RAM BANK 1A,
- ;F000-FFFF RAM BANK 1B.
-
- BXI = 3 ;0000-1FFF RAM BANK 1A,
- ;8000-9FFF RAM BANK 1B.
- BXJ = 0CH ;2000-3FFF RAM BANK 1A,
- ;A000-BFFF RAM BANK 1B.
- BXK = 30H ;4000-5FFF RAM BANK 1A,
- ;C000-DFFF RAM BANK 1B.
- BXL = 0C0H ;6000-7FFF RAM BANK 1A,
- ;E000-FFFF RAM BANK 1B.
-
- BXM = 0FH ;0000-3FFF RAM BANK 1A,
- ;8000-BFFF RAM BANK 1B.
- BXN = 0F0H ;4000-7FFF RAM BANK 1A,
- ;C000-FFFF RAM BANK 1B.
-
- BXO = 0FFH ;0000-7FFF RAM BANK 1A,
- ;8000-FFFF RAM BANK 1B.
-
-
- ;BANK-OFF SWITCHES.
-
- BKOFF = 0 ;ALL BANKS EXCEPT VIOC.
- B0FOFF = 1 ;F000-FFFF VIOC OFF.
-
-
- ;BANK SELECT PORTS.
-
- B0PA = 40H ;BANK 0A (0000-EFFF).
- B0PB = 2 ;BANK 0B (F000-FFFF VIOC).
- B1PA = 41H ;BANK 1A (0000-7FFF).
- B1PB = 51H ;BANK 1B (8000-FFFF).
- B2PA = 42H ;BANK 2A (0000-7FFF).
- B2PB = 52H ;BANK 2B (8000-7FFF).
-
-
- ;
- ; JUMP TABLE.
- ;
-
- .LOC .MAIN.
-
- JMP START ;START OF MBMBOT.
- JMP STATUS ;STATUS ROUTINE.
- JMP KYBD ;KEYBORD. INPUT ROUTN.
- JMP VIDEO ;CONSOLE OUTPUT ROUTN.
- JMP PRINT ;PRINTER OUTPUT ROUTN.
-
-
- ;
- ;INITIALIZATION AND BOOTSTRAP ROUTINES.
- ;
-
- .LOC .MAIN.+30H
-
- ;INITIALIZE TU-ART.
- START: MVI A,01 ;RESET TU-ART
- OUT 62H
- OUT 72H
- MVI A,00 ;TURN OFF INTRRUPTS.
- OUT 63H
- OUT 73H
- MVI A,0C0H ;SET BAUD RATE TO 9600.
- OUT 60H
- OUT 70H
- ;CLEAR EC00-EFFF IN BANK 0 SCRATCH RAM.
- LXI B,ENDSCR-BEGSCR ;# BYTES TO CLEAR.
- LXI H,BEGSCR ;STARTING ADDRESS.
- LXI D,BEGSCR+1 ;+1.
- XRA A ;CLEAR WITH ZEROS.
- MOV M,A ;CLEAR FIRST BYTE.
- LDIR ;DO THE REST!
- ;INIT. STACK, CALL VIOC INIT. ROUTINE
- ;& SET UP VIOC FOR UPPER & LOWER CASE.
- LXI SP,STACK ;SET STACK POINTER.
- CALL CLEAR ;VIOC INIT. ROUTINE.
- MVI A,1BH ;SET UP
- CALL VIOC ;VIOC
- MVI A,55H ;FOR UPPER AND
- CALL VIOC ;LOWER CASE.
- ;MANAGE MEMORY.
- MVI A,B0C ;TURN OFF
- OUT B0PA ;RAM AT SCRATCH.
- ;MOVE BOOT.
- LXI B,EBOOT-SBOOT ;#OF BYTES TO MOVE.
- LXI H,RBOOT ;STARTING AT RBOOT.
- LXI D,SBOOT ;TO SBOOT.
- LDIR ;DO IT!
- JMP SBOOT ;RUN BOOTSTRAP.
- RBOOT:
-
- .LOC 3000H ;DESTINATION OF BOOT.
-
- ;CPM BOOTSTRAP LOADER.
- ;MANAGE MEMORY.
- SBOOT: MVI A,BKOFF ;TURN OFF ROM
- OUT B0PA ;AT 8000-BFFF.
- MVI A,B0FOFF ;TURN OFF
- OUT B0PB ;VIOC.
- MVI A,BXO ;TURN ON RAM
- OUT B1PB ;AT 8000-FFFF.
- ;BOOT CPM.
- IN WAIT ;WAIT FOR HOME.
- XRA A ;SET
- MOV L,A ;L=0,
- MOV H,A ;H=0,
- INR A ;A=1,
- OUT SECT ;SECTOR=1.
- MVI A,8CH ;SEND COMMAND TO
- OUT DCOM ;READ SECTOR TO 1771.
- RLOOP: IN WAIT ;WAIT FOR DRQ OR INTRQ.
- ORA A ;SET FLAGS.
- JP RDONE ;DONE IF INTRQ.
- IN DDATA ;READ DATA.
- MOV M,A ;PUT INTO MEMORY.
- INX H ;INCREMENT MEM POINTER.
- JMP RLOOP ;READ ANOTHER BYTE.
- RDONE: IN DSTAT ;READ DISK STATUS.
- ORA A ;SET FLAGS.
- JZ 0 ;GO TO CPM LOADER IF 0.
- HLT ;HALT IF ERROR.
- EBOOT:
-
-
- ;
- ;CP/M BIOS SUBROUTINES CALLED FROM BANK 1.
- ;
-
- .LOC RBOOT+EBOOT-3000H ;PLACE IN ROM.
-
- ;STATUS TEST ROUTINE.
- STATUS: IN CSTAT ;READ CONSOLE STATUS.
- ANI CKBR ;LOOK AT KB READY BIT.
- MVI A,0 ;SET A=0 FOR RETURN.
- RZ ;NOT READY WHEN LOW.
- IN LSTAT ;READ NEC ACK STATUS.
- ANI ACBIT ;LOOK AT ACK READY BIT.
- MVI A,0 ;SET A=0 FOR RETURN.
- RNZ ;NOT READY WHEN HIGH.
- CMA ;IF READY, A=0FFH.
- RET ;RETURN FROM STAT. TST.
-
- ;KEYBOARD INPUT ROUTINE.
- ;MANAGE STACK POINTERS AND MEMORY.
- KYBD: CALL IN ;INBOUND HOUSEKEEPING.
- ;LOOP UNTIL INPUT FROM KEYBD. OR PRNTR.
- ;MANAGE RUB AND BEG. OF LINE FLAGS.
- ;IVERT VIDEO IF ESC V, SET VIOC TO
- ;LARGE LETTERS IF ESC L.
- KYBD1: IN CSTAT ;READ CONSOLE STATUS.
- ANI CKBR ;IF NOT READY,
- JZ NEC ;TRY NEC.
- IN CDATA ;READ A CHARACTER.
- ANI 7FH ;MAKE MOST SIG. BIT=0.
- PUSH H ;SAVE H&L REGISTERS.
- LXI H,IOFLAG ;POINT TO IOFLAG.
- CPI 1BH ;IS IT AN ESCAPE?
- JZ KYBD4 ;IF SO,-->KB4.
- BIT ESCFL,M ;TEST IF ESC FLAG SET.
- JZ KYBD5 ;IF NOT,-->KB5. IF SO,
- ANI 0DFH ;LOWER TO UPPER CASE.
- CPI 56H ;IS IT A 'V'?
- JNZ KYBD2 ;IF NOT,-->KB2.
- MVI A,1BH ;IF SO, LOAD ESC.
- CALL VIOC ;SEND IT OUT.
- MVI A,56H ;LOAD 'V'.
- CALL VIOC ;SEND IT OUT.
- MVI A,0DH ;LOAD CR.
- JMP KYBD3 ;GO ON.
- KYBD2: CPI 4CH ;IS IT A 'L'?
- JNZ KYBD3 ;IF NOT,-->KB3.
- MVI A,1BH ;IF SO, LOAD ESC.
- CALL VIOC ;SEND IT OUT.
- MVI A,4CH ;LOAD 'L'.
- CALL VIOC ;SEND IT OUT.
- MVI A,1BH ;LOAD ESC.
- CALL VIOC ;SEND IT OUT.
- MVI A,43H ;LOAD 'C'.
- CALL VIOC ;SEND IT OUT.
- MVI A,0DH ;LOAD CR.
- KYBD3: RES ESCFL,M ;RESET ESC FLAG.
- JMP KYBD5 ;GO ON.
- KYBD4: SET ESCFL,M ;SET ESC FLAG.
- KYBD5: CPI 7FH ;IS IT A RUB?
- JNZ KYBD7 ;RETURN IF NOT.
- BIT BOLFL,M ;TEST BOL FLAG.
- JNZ KYBD6 ;IF SET,-->KB6.
- SET BOLFL,M ;IF NOT, SET BOL
- SET RUBFL,M ;AND RUB FLAG.
- JMP KYBD7 ;RETURN.
- KYBD6: RES RUBFL,M ;RESET RUB FLAG.
- KYBD7: POP H ;RESTORE H&L REGS.
- JMP RETURN ;RETURN FROM TYPE.
- NEC: IN LSTAT ;READ NEC ACK STATUS.
- ANI ACBIT ;IF ACK NOT READY,
- JZ KYBD1 ;TRY KYBD.
- IN LDATA ;INPUT NEC.
- ANI 7FH ;MAKE MOST SIG. BIT=0.
- ;SAVE CHARACTER. MANAGE MEMORY AND
- ;STACK POINTER. RETURN WITH
- ;CHARACTER IN A REGISTER.
- RETURN: MOV C,A ;SAVE CHAR. IN C REG.
- CALL OUT ;OUTBOUND HOUSEKEEPING.
- MOV A,C ;RESTORE CHAR. TO A.
- RET ;RETURN TO RAM.
-
- ;VIDEO OUTPUT ROUTINE.
- ;MANAGE STACK POINTERS AND MEMORY.
- VIDEO: CALL IN ;INBOUND HOUSEKEEPING.
- ;OUTPUT CHARACTER.
- CALL BACKSP ;CALL BKSP. & VIDEO.
- CALL FROPA ;ECHO AT PANEL.
- ;MANAGE MEMORY AND STACK POINTER.
- CALL OUT ;OUTBOUND HOUSEKEEPING.
- RET ;RETURN TO BANK 1 RAM.
- ;BACKSPACE AND VIDEO OUTPUT ROUTINES.
- BACKSP: PUSH H ;SAVE H&L REGS.
- LXI H,IOFLAG ;POINT TO FLAG BUFFER.
- BIT RUBFL,M ;TEST RUB FLAG.
- MOV A,C ;GET CHARACTER.
- JNZ BKSP1 ;IF RUB FLG SET-->BS1.
- BIT BSLFL,M ;IF NOT, TEST BSL FLAG.
- JZ BKSP4 ;NOT SET, OUTPUT CHAR.
- RES BSLFL,M ;IF SET, RESET BSL
- RES BOLFL,M ;AND BOL FLAGS.
- POP H ;RESTORE H&L REGS.
- RET ;RETURN FROM BACKSP.
- BKSP1: CPI 5CH ;IS CHARACTER A BSL?
- JNZ BKSP2 ;IF NOT, -->BS2.
- SET BSLFL,M ;IF SO, SET BSL FLAG
- RES BOLFL,M ;AND RESET BOL FLAG.
- POP H ;RESTORE H&L REGS.
- RET ;RETURN FROM BACKSP.
- BKSP2: CPI 7FH ;IS CHARACTER A RUB?
- JNZ BKSP3 ;IF NOT, -->BS3.
- POP H ;IF YES, DROP IT, RST
- RET ;H&L REGISTERS AND RET.
- BKSP3: MVI A,8 ;BACKSPACE,
- CALL VIOC
- MVI A,20H ;SPACE
- CALL VIOC
- MVI A,8 ;AND BACKSPACE AGAIN.
- BKSP4: CALL VIOC ;OUTPUT CHARACTER.
- RES RUBFL,M ;RESET RUB
- RES BOLFL,M ;AND BOL FLAGS.
- POP H ;RESTORE H&L REGS.
- RET ;RETURN FROM BACKSP.
- ;FRONT PANEL PROGRAMMED OUTPUT LIGHTS
- ;DRIVER ROUTINE.
- FROPA: CMA ;INVERT BYTE.
- OUT FRPN ;ECHO AT FRONT PANEL.
- RET ;RETURN FROM FROPA.
-
- ;PRINTER OUTPUT ROUTINE.
- ;MANAGE STACK POINTERS AND MEMORY.
- PRINT: CALL IN ;INBOUND HOUSEKEEPING.
- ;NEC SPINWRITER 1200 BAUD PRINT PROG.
- IN LSTAT ;READ PRINTER STATUS.
- ANI LRBIT ;LOOK AT READY BIT.
- JZ PRINT ;LOOP TILL HIGH.
- PUSH H ;SAVE H&L.
- LDA CCOUNT ;GET CHARACTER COUNT.
- CPI CHARC ;7 CHARACTERS YET?
- JC PRINT2 ;NOPE--PRINT ONE.
- MVI A,03 ;CTL. C TO A REGISTER,
- OUT LDATA ;SEND IT TO PRINTER.
- XRA A ;ZERO IN A REGISTER AND
- STA CCOUNT ;IN CHARACTER COUNTER.
- LXI H,BCOUNT ;LOCATION OF BUFFER.
- INR M ;INCREMENT IT!
- PRINT1: LDA BCOUNT ;GET COUNT FROM BUFFER.
- CPI BUFFC ;IS IT 30 YET?
- JC PRINT2 ;IF NOT, THEN PRINT.
- IN LSTAT ;READ PRINTER ACK STAT.
- ANI ACBIT ;LOOK AT ACK READY BIT.
- JZ PRINT1 ;LOOP TILL HIGH.
- IN LDATA ;READ INPUT.
- ANI 7FH ;MASK FOR ASCII.
- CPI 06 ;IS IT A CTL. F?
- JC PRINT1 ;IF NOT, TRY AGAIN.
- DCR M ;IF YES, DECR. BCOUNT.
- PRINT2: LDA CCOUNT ;GET CHARACTER COUNT.
- INR A ;INCREMENT IT AND
- STA CCOUNT ;PUT IT BACK.
- MOV A,C ;GET DATA.
- CPI 03 ;IS IT A CTL.C?
- JC PRINT3 ;RETURN IF IT IS.
- OUT LDATA ;OTHERWISE, PRINT IT!!!
- CALL FROPA ;DISPLAY AT PANEL.
- POP H ;RESTORE H&L.
- ;MANAGE MEMORY AND STACK POINTER.
- PRINT3: CALL OUT ;OUTBOUND HOUSEKEEPING.
- RET ;RETURN TO BANK 1 RAM.
-
-
- ;
- ; ENTRY AND EXIT HOUSEKEEPING ROUTINES.
- ;
-
- IN: POP H ;RET. ADDRESS IN H&L.
- SSPD SPSAVE ;SAVE BANK 1 SP.
- MVI A,BKOFF ;TURN OFF RAM AT
- OUT B1PB ;E000-FFFF IN BANK 1.
- MVI A,B0C+B0D+B0E ;TURN ON BANK 0
- OUT B0PA ;SCRATCH RAM.
- LXI SP,STACK ;INIT. BANK 0 SP.
- MVI A,B0FON ;TURN ON.
- OUT B0PB ;VIOC.
- PUSH H ;RET. ADDRESS ON STACK.
- RET ;RETURN TO CALLER.
- OUT: POP H ;RET. ADDRESS IN H&L.
- MVI A,B0FOFF ;TURN OFF
- OUT B0PB ;VIOC
- MVI A,B0C+B0D ;AND BANK 0
- OUT B0PA ;SCRATCH RAM.
- MVI A,BXL ;TURN ON RAM AT
- OUT B1PB ;E000-FFFF IN BANK 1.
- LSPD SPSAVE ;RESTORE BANK 1 SP.
- PUSH H ;RET. ADDRESS ON STACK.
- RET ;RETURN TO CALLER.
-
-
- ;
- ; RESERVED AREA IN BANK 0 SCRATCH RAM.
- ;
-
- .LOC 0EFFDH
-
- IOFLAG: .BLKB 1 ;RUB, BSL, BOL, ESC FL.
- BCOUNT: .BLKB 1 ;CHARACTER COUNTERS FOR
- CCOUNT: .BLKB 1 ;1200 BAUD I/O DRIVER.
- .END .MAIN.
-