
   ; TODO LIST
   ;    - HARDWARE INTERRUPT SYSTEM FUNCTION THING
   ;    - LONG TERM BEEPER, ADD KEYDOWN NOISE
   ;    - KEYBOARD REPEAT
   ;    - GET TAPE DRIVE WORKING
   ;    - SERIAL PORT!
   ;        - ADD 8253
   ;        - ADD 2ND 8251
   ;        - ADD RS232 CONVERTER (?)
   ;    - WIRE UP REST OF KEYBOARD LEDS
   ;    - WIRE UP MODIFIER KEYS
   ;    - REWRITE INKEY TO ACCOUNT FOR MODIFIERS
   ;    - MOVE USER RAM TO 0X1000 AND UPGRADE ROM TO 32K
   ;    - 


   ; ---- MEMORY SPACE ----

   Stack      = 0x2D5F ; and  down
   
   ScreenBuff = 0x2D60 ; thru to 0x2DFF
   
   Vectors    = 0x2E00 ; thru to 0x2EFF   

   VECT_H     = 0x2E   
   
   Scratch    = 0x2F80 ; 0x2F00 thru 0x2FFF with 0x2FFF (127) being the magic interrupt feedback address 
   
   
 ; nothing        = -128
 
   SpaceChar_OFF  =  0
   RWMode_OFF     =  1
   NibHigh_OFF    =  2
   Temp8_OFF      =  3
   LastInkey_OFF  =  4
   CursorPos_OFF  =  5 ; cursor position 0-159
   BlitCtr_OFF    =  6
   
   MagicSys_OFF   =  127  ; night right address
 
;  MonitorRAM = 0x0800
   MonitorRAM = Scratch
   SpaceChar  = MonitorRAM + SpaceChar_OFF
   RWMode     = MonitorRAM + RWMode_OFF
   NibHigh    = MonitorRAM + NibHigh_OFF
   Temp8      = MonitorRAM + Temp8_OFF
   LastInkey  = MonitorRAM + LastInkey_OFF
   CursorPos  = MonitorRAM + CursorPos_OFF
   BlitCtr    = MonitorRAM + BlitCtr_OFF
   
   
   MagicSys   = MonitorRAM + MagicSys_OFF
   
   UserExec  = 0x0900     ; to be moved to 0x1000 later
   
  
   
   Eprom8255 = 0x3000
   EpromRA   = Eprom8255 + 0
   EpromRB   = Eprom8255 + 1
   EpromRC   = Eprom8255 + 2
   EpromCR   = Eprom8255 + 3

   ; --- IO SPACE ----
    
   UART         = 0x0000    ; tape uart
   ODDS8255     = 0x1000 
   TimerBase    = 0x2000
   Timer0       = TimerBase + 0
   Timer1       = TimerBase + 1
   Timer2       = TimerBase + 2
   TimerControl = TimerBase + 3
   Keyboard     = 0x3000
   LCDBot       = 0x4000    ; instruction reg
   ;              0x4001    ; data reg
   LCDTop       = 0x5000    ; instruction reg
   ;              0x5001    ; data reg
   ;            = 0x6000
   Beeper       = 0x7000
    

        .area _START (ABS)
	.ORG  0X00
         JR INIT
        
        .ORG  0X08
         CALL  DynFunc  ; call with 0xCF
         RETI
        
        .ORG  0X10      ; call with 0xD7
         LD 0x7F(IY), B  
         EI
         RETI
        
        .ORG  0X18      ; call with 0xDF
         JP INIT
        
        .ORG  0X20      ; call with 0xE7
         JP INIT
        
        .ORG  0X28      ; call with 0xEF
         JP INIT
        
        .ORG  0X30      ; call with 0xF7
         JP INIT
        
        .ORG  0X38      ; call with 0xFF
         JP INIT
                
        .ORG  0X66    ; NMI
         JP INIT
                       
        
        
INIT:                                     ; INIT SYSTEM
	LD SP,#Stack                      ; SET UP STACK 
        LD HL,#INIT                       ; A BIT OF OVER-RETURN PROTECTION
        PUSH HL
                                
        LD   BC,#ODDS8255+3               ; turn on blue keyboard led (8255 @ IO0x1000)
        LD   A, #0x93                     ; JUST PORT C-high OUTPUT
        OUT  (C),A    
        LD   A, #0xBF                     ; only bit 8 low.
        DEC  BC                           ; now pointing at port C 
        OUT  (C), A   
                
        LD IY,#Scratch                    ; init function vector table
	CALL InitVectors                  ; this sets up the instruction LD, 0xFF(IY), nn  to trigger the function nn
        LD A, #0x2E
        LD I, A
        IM 2
        EI
        
    ;    LD  0x7F(IY), #9*2                ; LSB MUST BE 0
        
        LD   HL,#3000
        CALL LONGDELAY                    ; wait for power to come up                
                 
        LD   BC,#ODDS8255+2               ; port C
        LD   A, #0x7F                     ; only bit 7 low
        OUT  (C),A                   
                                
        CALL LCDINIT                      ; initialize lcd
        CALL ClearScrnBuff
                        
        LD HL,#InitString
	CALL PRINTSTRING       
        
  
        
        JR MEMREADMODE
        
NEWADDRESS:                               ; GET NEW MEMORY ADDRESS

	CALL LCDFLUSH
        CALL GETADDR	
DOADDRESS:                                ; PERFORM CURRENT OPERATION ON ADDRESS
        BIT 0,RWMode_OFF(IY)              ; STILL 5 CYCLES, BUT DOESN'T OVERWRITE A
	JP NZ,MEMWRITE
        
	CALL PRINTSPACE	

	LD A,(HL)	
	CALL PRINTBYTE
        CALL LCDFLUSH
GETCMD:                                   ; GET NEW COMMAND
	CALL INKEY	
        
        LD D, A
	LD A,#0x0A                        ; LINEFEED
	CALL PUTC                              
        LD A, D
        
	CP #'I'                           ; INCREMENT ADDRESS
	JR Z,INCHL
        CP #'D'                           ; DECREMENT ADDRESS
        JR Z,DECHL 
	CP #'R'                           ; READ MODE, NEW ADDRESS
	JR Z,MEMREADMODE
	CP #'W'                           ; WRITE MODE, NEW ADDRESS
	JR Z,MEMWRITEMODE
	CP #'P'                           ; PROGRAM 2716 EPROM
	JP Z,EPPROG
	CP #'G'                           ; GO TO USER CODE
	JR Z,GOUSER
        CP #'A'                           ; DO ADDRESS AGAIN
        JR Z,SAMEHL
        
	JR NEWADDRESS
        
GOUSER:
        CALL ClearScrnBuff      
        CALL LCDFLUSH 
        CALL #UserExec
        JR NEWADDRESS       
        
INCHL:                                     ; NEXT ADDRESS	
	INC HL	
SAMEHL:        
	CALL PRINTADDRESS
	JR DOADDRESS
        
DECHL:        
        DEC HL
        CALL PRINTADDRESS
	JR DOADDRESS  
        
MEMREADMODE:                                   ; CHANGE TO READ MODE
        LD RWMode_OFF(IY),#0      
        LD SpaceChar_OFF(IY),#'='
	JR NEWADDRESS
        
MEMWRITEMODE:                              ; CHANGE TO WRITE MODE
        LD RWMode_OFF(IY),#0xFF
        LD SpaceChar_OFF(IY),#':'
	JR NEWADDRESS
        
MEMWRITE:                                  ; DO MEMORY WRITE
	CALL PRINTSPACE  
        CALL LCDFLUSH      
	CALL INBYTE	
	LD (HL),A	
	JR GETCMD
        
        
        
        
        
        
        
        	
     ; ----------------------- 2716 EPROM PROGRAMMER -------------------------           
                
EPPROG:
	CALL ClearScrnBuff
        CALL LCDFLUSH
	LD A,#'P'
	CALL PUTC
	LD A,#0x08                ; INIT 8255
	LD (EpromCR),A
	LD A,#0x80
	LD (EpromRC),A
	LD HL,#EndString
	CALL PRINTSTRING
        CALL LCDFLUSH
	CALL GETADDR
	EX DE,HL	
	LD HL,#StartString
	CALL PRINTSTRING
        CALL LCDFLUSH
	PUSH DE	
	CALL GETADDR
	POP DE	
	NOP	
EPNEXT:
	LD A,L	
	LD (EpromRB),A
	LD A,(HL)	
	LD (EpromRA),A
	LD A,H	
	AND #0x0F
	OR #0x80
	LD (EpromRC),A
	CALL DELAY
	OR #0x40
	LD (EpromRC),A
	CALL DELAY
	AND #0x8F
	LD (EpromRC),A
	CALL DELAY
	LD A,L	
	CP E	
	JP Z,EPLAST
	INC HL	
	JP EPNEXT
EPLAST:
	LD A,H	
	CP D	
	JP Z,EPLASTLAST
	INC HL	
	JP EPNEXT
EPLASTLAST:
	LD A,#0x80
	LD (EpromRC),A
	LD A,#'K'
	CALL PUTC
	RET
        
        	










       
        ;--------------------------- GET KEY -----------------------------
        ; REGS OK.
        
INKEY:
        CALL KEYUP
        
        PUSH BC
	LD BC,#0x3000                        
        JP KEYTEST
        
NOKEY:     
               
        XOR A                    ; A = 0
        CP C                     ; C = 0?
        JP Z, KEYTEST            ; if yes, don't decrement it.
           
        DEC C                      
        
KEYTEST:                         ; look for key down
	IN A,(C)                 ; get code
        
	OR A	                 ; test for zero
	JP Z, NOKEY
        
        CP #0xFF                 ; multistrike?
        JP Z, NOKEY
        
        INC C                    ; debounce counter
        JP NZ, KEYTEST           ; not charged yet.                  
        
        LD LastInkey_OFF(IY),A   ; SAVE FOR KEYUP            

        POP BC
	RET
        
      ; ----------------------- WAIT FOR KEYUP ---------------------------- 
      ;  REGS OK.
        	
KEYUP:
        PUSH AF
        PUSH BC

STILLKEY:
        LD BC,#0x3000
NOISEKEY:        
	IN A,(C)	
        CP LastInkey_OFF(IY)
	JP Z,STILLKEY
        
        INC C
        JP NZ, NOISEKEY
                
        POP BC
        POP AF
	RET
        
       ; ------------------------- INPUT BYTE -------------------------------
       ; REGS OK 	
INBYTE:
        PUSH HL
        
        LD HL, #NibHigh    
            
	CALL INKEY        
	CALL ALTER
        LD (HL),A	
	CALL PRINTLOW	 
             
	CALL INKEY
	CALL ALTER
        RLD
        LD A, (HL)
	CALL PRINTLOW	
	
        LD A, (HL)
        
        POP HL
	RET
        

          ;------------------------------- ADJUST ASCII FOR HEX --------------------
          ; REGS OK	
ALTER:	
	CP #0x3A
	JP M,ALT1
	SUB #0x07
ALT1:
	AND #0x0F
	RET        
        
        
        
        ;--------------------------------- GET 16 BIT ADDRESS ------------------------
        ; Result in HL
        ; REGS OK
GETADDR:
        PUSH AF
	CALL INBYTE
	;PUSH AF
        LD  H,A
	CALL INBYTE
	;POP HL
	LD  L,A
        POP AF	
	RET	                      
              
        ; ----------------------------- PRINT CURRENT DELIM --------------------------- 
        ; REGS OK	
PRINTSPACE:
	PUSH AF
	LD A,(SpaceChar)
	CALL PUTC
	POP AF	
	RET        
        
        ;------------------------- PRINT WORD ------------------------------
        ; REGS OK
PRINTADDRESS:
        PUSH AF
        LD A,H
        CALL PRINTBYTE
        LD A,L
        CALL PRINTBYTE
        POP AF
        RET             
     
        ;------------------------- PRINT BYTE ------------------------------     
        ; REGS OK
PRINTBYTE:
	PUSH AF
	RLCA	
	RLCA	
	RLCA	
	RLCA	
	CALL PRINTLOW
	POP AF
;	CALL PRINTLOW
;	RET	
        
        ;------------------------ PRINT LOW NIBBLE --------------------------
        ; REGS OK
PRINTLOW:
        PUSH AF
	;AND #0x0F
	;OR  #0x30
	;CP  #0x3A
	;JP M,PLNCORR
	;ADD A,#0x07
        AND     #0X0F
        CP      #0X0A
        SBC     #0X69
        DAA
        
PLNCORR:        
	CALL PUTC
        CALL LCDFLUSH
        POP AF
	RET
        
        
        
         ;--------------------------- WAIT FOR SCREEN ------------------------------
        
SCRNBUSYLOOP:
	IN A,(C)
	BIT 7,A
	JR NZ,SCRNBUSYLOOP
	RET	
        
                
         ; -------------------------------- PRINT A STRING ------------------------------
         ; A AND HL MODIFIED	
PRINTSTRING:
	LD A,(HL)	
	OR A         ; set flags, zero?
	RET Z	
	CALL PUTC
	INC HL	
	JR PRINTSTRING                
        
       
        
        ;--------------------------- TOTALLY CLEAR SCEEN ------------------------------
        ; REGS OK
TOTALCLEAR:
        PUSH BC
        
        LD BC,#LCDTop	
        
        CALL SCRNBUSYLOOP	
        LD A,#0x01        ; clear display	
	OUT (C),A   
             
	CALL SCRNBUSYLOOP        
        LD A,#0x0F        ; display on, cursor on, blinking on
	OUT (C),A        
                
        LD BC,#LCDBot   
        
        CALL SCRNBUSYLOOP      
	LD A,#0x01        ; clear display   	
	OUT (C),A
        
        CALL SCRNBUSYLOOP        
        LD A,#0x0C        ; display on, cursor off, blinking off
	OUT (C),A     
               
        POP BC
	RET	
        
        ;--------------------------- INITIALIZE SCREEN -------------------------------
        
LCDINIT:	
	LD A,#0x38        ; 8 bit mode
	LD BC,#LCDTop
	OUT (C),A
        
        CALL SCRNBUSYLOOP
        
	LD A,#0x0F        ; display on, cursor on, blinking on
	OUT (C),A
        
	LD B,#0x40        ; lcd top
        
	LD A,#0x38        ; 8 bit mode
	OUT (C),A         
        
        CALL SCRNBUSYLOOP
        
	LD A,#0x0C       ; display on, cursor off, blinking off
	OUT (C),A        
        
	JR TOTALCLEAR    ; FINISH BY CLEARNING THE SCREEN	
        
        
       ; --------------------------------- DELAY ---------------------------------- 
       ; REGS OK 
DELAY:
	PUSH BC	
	LD C,#0x04
DLYOL:
	LD B,#0x19
DLYIL:
	DEC B	
	JP NZ,DLYIL
	DEC C	
	JP NZ,DLYOL
        POP BC
	RET
        
        
 
       ; --------------------------------- Variable DELAY ---------------------------------- 
       ; HL (input value) will return 0x00 
       
;LONGDELAY:
;        PUSH BC
;        LD  BC,#0xFFFF    ; -1
;LDLY1:        
	;ADC HL,BC	                
	;JR NZ, LDLY1
       ; POP BC
       ; RET
        
        
       
;LONGDELAY:
;        PUSH AF
;LDLY1:        
;	DEC HL         
;        LD  A,H	        ; TEST HL         
;        OR  L
;	JR NZ, LDLY1
;        
;        POP AF
;        RET       
        

LONGDELAY:
  DEC HL
  INC H
  INC L
LDLY1:
  DEC L
  JR NZ,LDLY1
  DEC H
  JR NZ,LDLY1
  RET 
        ; ------------------------------------ CHORDED BEEP -----------------------
        
CSTMBELL:        	
	LD BC,#Beeper
	LD H,#0x40
	LD DE,#0xFEFE
L029FH:
	LD A,D	
	SUB #0x01
	JP NZ,L02ACH
	OUT (C),A
	NOP	
	DEC H	
	RET Z	
	LD A,#0xFE
L02ACH:
	LD D,A	
	LD A,E	
	SUB #0x03
	JP NZ,L02B8H
	OUT (C),A
	NOP	
	LD A,#0xFE
L02B8H:
	LD E,A	
	JP L029FH
        
    ; ------------------------------------ init dynamic vector table -----------------------
    ; DESTROYS BC,DE,HL
    
       
InitVectors:            
        LD BC,#50
        LD HL,#VectTable
        LD DE,#Vectors
        LDIR
DynReturn:       
        RET

        
    ; ------------------------------------ dynamic system function call -----------------------
    ; B IS THE DESIRED FUNCTION NUMBER 0-127
    ; VECT_H IS HIGH BYTE OF TABLE    
DynFunc2:        
         LD 0x7F(IY), B  ; THIS WILL REQUIRE HARDWARE THAT I'LL BUILD LATER
         EI
         RET
     
DynFunc:         
     ; but for now... (IX IS DESTROYED, BUT NOTHING ELSE USES IT)
        PUSH HL
        
        SLA B
        
       .BYTE 0xDD, 0x26, #VECT_H ; LD IXH, #VECT_H    OHHH WERE INTO CHEAT CODES NOW!!!!
       .BYTE 0xDD, 0X68          ; LD IXL, B
                 
        LD  L, 0x00(IX)          ; LD HL, (IX)
        LD  H, 0x01(IX)
        
        EX  (SP),HL              ; THE ORIG HL VALUE IS BACK IN HL, THE NEW ADDRESS IS ON STACK
        RET                      ; RETURNS TO ADDRESS ON STACK ;)
        
        
        
        
       ; ------------------------------------ blit from buffer to screen ----------------------- 
        
LCDFLUSH:   
        PUSH AF
        PUSH BC
        PUSH DE
        PUSH HL
             
        CALL TOTALCLEAR
        LD  HL,#0X2DB0            ; ** BOTTOM LSI DATA 
        LD  BlitCtr_OFF(IY),#80   ; loop counter
        LD  BC,#LCDTop
        LD  DE,#80                ; 16 bit maths

BLITLOOP:
        OR A                      ; clear carry flag
        SBC  HL,DE                ; TOP LSI DATA
        SET  4,B                  ; top display        
        CALL SCRNBUSYLOOP
        INC  C                    ; data
        LD   A,(HL)
        OUT  (C),A
        DEC  C                    ; command
        
        ADD  HL,DE                ; BOTTOM LSI DATA        
        RES  4,B                  ; BOTTOM DISPLAY
        CALL SCRNBUSYLOOP
        INC  C                    ; data
        LD   A,(HL)
        OUT  (C),A
        DEC  C                    ; command
        
        INC  L                    ; we dont have to increment HL casue the screen data doesn't cross a page.
        
        DEC  BlitCtr_OFF(IY)
        JP   NZ,BLITLOOP                
        
        POP HL
        POP DE
        POP BC
        POP AF
        
        ; CALL LCDCrsPos          ; LEAVE CURSOR IN THE RIGHT PLACE
        
     ;   RET


       ; ------------------------------------ position the cursor on the module ----------------------- 
       ; sets lcd cursor to position in CursorPos
LCDCrsPos:
         PUSH AF
         PUSH BC
         
         LD BC,#LCDTop             ; ASSUME TOP
         
         LD  A, CursorPos_OFF(IY)
         CP  #80                  ; IS IT ON THE FIRST OR SECOND LSE?  80 IS THE FIRST POS OF THE BOTTOM
         JR  C,DOPOSCRS1          ; jump if value is less than value

         SUB #80                  ; ADJUST FOR BOTTOM LSI
         LD  BC,#LCDBot
         
DOPOSCRS1:         
         CP  #40                  ; IS IT BEFORE OR AFTER THE STUPID ADDRESSING GAP?
         JR  C, DOPOSCRS2
         ADD #24
                  
DOPOSCRS2:                        ; send 'on' to whoever were talking to.
          
         OR #0x80                 ; POSITION COMMAND
         PUSH AF       
         CALL SCRNBUSYLOOP 
         POP AF 
         
         OUT (C),A                ; send command.     
                               
         CALL SCRNBUSYLOOP         
         LD A,#0x0F               ; display on, cursor on, blinking on     
         OUT (C),A
        
         LD A, #0x10               ; other lsi
         XOR B
         LD B, A
         LD A,#0x0C               ; display on, cursor off, blinking off     
         OUT (C),A    

         POP BC
         POP AF
         RET


         ; --------------------------------- Position cursor in buffer ------------------------
         ; ok, its stupid but this does make it easier.
BuffCrsPos:
        LD CursorPos_OFF(IY), A
        RET


        ; ------------------------------------ blit buffer clear ----------------------- 
ClearScrnBuff:
        PUSH AF
        PUSH BC
        PUSH HL
        
        LD   B,#160
        LD   HL,#0x2D60
        LD   A,#' '
        
CLEARLOOP:        
        LD  (HL),A
        INC  HL      
        DJNZ CLEARLOOP            ;    DEC  B,     JR   NZ,CLEARLOOP  
            
        LD   CursorPos_OFF(IY), #0
        
        POP HL
        POP BC
        POP AF
        RET
        
        
        
       ; ------------------------------------ mapped lcd putchar -----------------------  
PUTC:
        PUSH HL
    	CP #0x0A                  ; LINEFEED?
	JP Z,PUTCLF        
        
        PUSH AF                
	LD  HL,#0x2D60            ; POINTER TO BUFFER LOC
        LD  A,CursorPos_OFF(IY)   ; GET INSERT POSITION
        ADD A,L
        LD  L,A        
        POP  AF
        
	LD  (HL),A                ; PUT CHAR  
        
        INC  CursorPos_OFF(IY)    ; ADJUST POINTER
        
        LD  A,#159
	CP  CursorPos_OFF(IY)     ; WAS CURSOR AT LAST LOCATION?
	JP  NZ, PUTCDONE
        
        LD  CursorPos_OFF(IY), #120    ; position reset
SCROLL1:
        PUSH BC
        PUSH DE
        LD  BC,#120               ; MOVE 120 BYTES
        LD  HL,#0x2D60+40         ; FROM 2nd line
        LD  DE,#0x2D60            ; TO first line
        LDIR
        
        LD  B, #40
        LD  A, #' '
CLRLINE:
        LD  (DE), A
        INC DE      
        DJNZ CLRLINE              ;  DEC B ,  JR NZ, CLRLINE
        
        POP DE
        POP BC
                                                       
PUTCDONE:
        POP HL
	RET	

PUTCLF:                            ; WHERE IS THE CURSOR?
        LD  A, CursorPos_OFF(IY)   ; GET INSERT POSITION 
        
        CP  A, #40                 ; FRIST LINE?
        JP  M, PUTCGOL2            ; THEN GO TO LINE 2
        
        CP  A, #80
        JP  M, PUTCGOL3            ; THEN GO TO LINE 3
        
        CP  A, #120
        JP  M, PUTCGOL4            ; THEN GO TO LINE 4
        
        LD  CursorPos_OFF(IY), #120    ; position reset 
        JR  SCROLL1
                          
PUTCGOL2:
        LD  CursorPos_OFF(IY), #40
        JR  PUTCDONE 
        
PUTCGOL3:
        LD  CursorPos_OFF(IY), #80
        JR  PUTCDONE                     
        
PUTCGOL4:
        LD  CursorPos_OFF(IY), #120
        JR  PUTCDONE
        
    
        ;------------------------------------------ Timer Init ---------------------------------    
        ; channel 0 will be the baud for the comm uart (CLK INPUT IS 9.21MHz)
        ;    MODE 2, BINARY, divide by 5 (1.8MHz FOR 115200)
        ; channel 1 will be the baud for the tape uart (CLK INPUT IS 4MHz)
        ;    MODE 2, BINARY, divide by 255 (15KHz FOR 244 BAUD)
        ; channel 2 will be the tape counter.  (CLK INPUT IS TAPE SENSOR)
        ;    MODE 0, BINARY, preset to 0xFFFF
    
TimerInit:
        PUSH AF
        PUSH BC
        LD   BC, #TimerControl
        LD   A,  #0x3A  ; 0011.1010  Channel 0, write both, mode 5 in binary    
        OUT (C), A
        LD   A,  #0x7A  ; 0111.1010  Channel 1, write both, mode 5 in binary    
        OUT (C), A
        LD   A,  #0xB0  ; 1011.0000  Channel 2, write both, mode 0 in binary    
        OUT (C), A
        
        DEC  BC      ; NOW POINTING TO COUNTER 2, PRELOAD WITH 0XFFFF
        LD   A,#0xFF
        OUT (C), A
        OUT (C), A
        
        DEC  BC      ; NOW POINTING TO COUNTER 1, PRELOAD WITH 255
        OUT (C), A
        XOR  A
        OUT (C), A
        
        DEC  BC      ; NOW POINTING TO COUNTER 0, PRELOAD WITH 5
        LD   A,#5
        OUT (C), A
        XOR  A
        OUT (C), A
        POP BC
        POP AF
        
        RET
    
        
        ;------------------------------------------ STRINGS AND TABLES ---------------------------------
        
InitString:
       .ASCII "                      A-3 Monitor V3.4 \n"
       .BYTE 00        
        
                                   
StartString:
       .ASCII " RAM START "
       .BYTE 00
        
EndString:
       .ASCII " RAM END "
       .BYTE 00  
       .BYTE 00      
   

VectTable:   
       .WORD DynFunc             ; 0  2E00 THE DYNAMIC FUNCTION CALL ROUTINE
       .WORD TOTALCLEAR          ; 1  2E02 HARDWARE LEVEL CLEAR SCREEN
       .WORD PUTC                ; 2  2E04 BUFFER PUT CHAR
       .WORD PRINTBYTE           ; 3       BUFFER PRINT HEX BYTE
       .WORD PRINTADDRESS        ; 4       BUFFER PRINT HEX WORD
       .WORD PRINTSTRING         ; 5       BUFFER PRINT STRING
       .WORD INKEY               ; 6       GET KEYSTROKE, BLOCKING
       .WORD KEYUP               ; 7       WAIT FOR RELEASE OF LAST PRESSED KEY, BLOCKING
       .WORD INBYTE              ; 8       INPUT HEX BYTE
       .WORD GETADDR             ; 9       INPUT HEX WORD
       .WORD ClearScrnBuff       ; A       CLEAR SCREEN BUFFER
       .WORD LCDFLUSH            ; B       PUSH BUFFER TO SCREEN
       .WORD LCDCrsPos           ; C       HARDWARE LEVEL LCD CURSOR POSITION
       .WORD BuffCrsPos          ; D       SCREEN BUFFER CURSOR POSITION
       .WORD INIT
       .WORD INIT
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
