?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ; Product      : Gfx9000 library
  2. ; Version      : 0.7
  3. ; Main code by : Marcel delorme
  4. ; Support code : BiFi
  5. ; Bitbust      : Arjan Bakker
  6.        
  7.                 include "g9klib.inc"
  8.                 MODULE  G9k
  9.                  
  10. ;----------------------------------------------------------------------------;
  11. ; Gfx9000 general functions                                                  ;
  12. ;----------------------------------------------------------------------------;
  13.                
  14. Reset:
  15. ; Function :    Resets v9990, Deletes Palette, Sprites off,stops current blit operation, puts V9990 in correct RAM config and disables display
  16. ; Input    :    None
  17. ; Output   :    None
  18. ; Notes    :    Doesn't change current adjust
  19. ; Modifies :    A,B
  20.  
  21.                 G9kReadReg G9K_DISPLAY_ADJUST + G9K_DIS_INC_READ
  22.                 PUSH    AF      ; Save adjust value
  23.  
  24.                 ; Set reset state
  25.                 LD      A,G9K_SYS_CTRL_SRS
  26.                 OUT     (G9K_SYS_CTRL),A
  27.                 ; Clear reset state
  28.                 XOR     A,A
  29.                 OUT     (G9K_SYS_CTRL),A
  30.  
  31.                 POP     AF
  32.                 OUT     (G9K_REG_DATA),A                ; Restore adjust value
  33.  
  34.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_STOP
  35.                 G9kWriteReg G9K_CTRL,G9K_CTRL_DIS_SPD+G9K_CTRL_VRAM512
  36.  
  37.                 ; Clear current palette
  38.                 G9kWriteReg G9K_PALETTE_PTR,0       ; A becomes 0
  39.                 LD      B,64 * 3
  40.                       OUT     (G9K_PALETTE),A
  41.                       DJNZ    $-2
  42. ;                OUT (G9K_OUTPUT_CTRL),A           ; Set output GFX9000
  43.                 RET
  44.  
  45.  
  46. SetScreenMode:
  47. ; A = Mode
  48. ; B = Bit per dot
  49. ; C = Image size
  50. ; D = Interlace
  51. ; E = Palette control register
  52.  
  53.                 LD      L,A
  54.                 ADD     A,A
  55.                 ADD     A,L     ; A  = A * 3
  56.                 LD      HL,G9K_MODE_TABLE
  57.                 ADD_HL_A
  58.                 LD      A,G9K_SCREEN_MODE0
  59.                 OUT     (G9K_REG_SELECT),A
  60.                 LD      A,(HL)  ; Get fixed settings for mode reg 6
  61.                 INC     HL
  62.                 OR      A,B     ; Set bits per dot
  63.                 OR      A,C     ; Set image size
  64.                 OUT     (G9K_REG_DATA),A
  65.                 LD      A,(HL)  ; Get fixed settings for mode reg 7
  66.                 INC     HL
  67.                 DEC     D
  68.                 INC     D       ; Is d 0?
  69.                 JR      Z,$+4
  70.                      OR    A,G9K_SCR1_EO+G9K_SCR1_IL
  71.                 OUT     (G9K_REG_DATA),A
  72.                 LD      A,(HL)
  73.                 OUT     (G9K_SYS_CTRL),A
  74.                 G9kWriteReg G9K_PALETTE_CTRL,e
  75.                 RET
  76.  
  77. G9K_MODE_TABLE
  78.                 ; Pattern mode 1      (P1)
  79.                 DB      G9K_SCR0_P1+G9K_SCR0_DTCLK4
  80.                 DB      0
  81.                 DB      G9K_SYS_CTRL_XTAL
  82.                 ; Pattern mode 2      (P2)
  83.                 DB      G9K_SCR0_P2+G9K_SCR0_DTCLK4
  84.                 DB      0
  85.                 DB      G9K_SYS_CTRL_XTAL
  86.                 ; Bitmap 256 * 212    (B1)
  87.                 DB      G9K_SCR0_BITMAP+G9K_SCR0_DTCLK4
  88.                 DB      0
  89.                 DB      G9K_SYS_CTRL_XTAL
  90.                 ; Bitmap 384 * 240    (B2)
  91.                 DB      G9K_SCR0_BITMAP+G9K_SCR0_DTCLK2
  92.                 DB      0
  93.                 DB      G9K_SYS_CTRL_MCKIN
  94.                 ; Bitmap 512 * 212    (B3)
  95.                 DB      G9K_SCR0_BITMAP+G9K_SCR0_DTCLK2
  96.                 DB      0
  97.                 DB      G9K_SYS_CTRL_XTAL
  98.                 ; Bitmap 768 * 212    (B4)
  99.                 DB      G9K_SCR0_BITMAP+G9K_SCR0_DTCLK
  100.                 DB      0
  101.                 DB      G9K_SYS_CTRL_MCKIN
  102.                 ; Bitmap 640 * 400    (B5)
  103.                 DB      G9K_SCR0_BITMAP+G9K_SCR0_DTCLK
  104.                 DB      G9K_SCR1_HSCN
  105.                 DB      G9K_SYS_CTRL_XTAL
  106.                 ; Bitmap 640 * 480    (B6)
  107.                 DB      G9K_SCR0_BITMAP+G9K_SCR0_DTCLK
  108.                 DB      G9K_SCR1_HSCN+G9K_SCR1_C25M
  109.                 DB      G9K_SYS_CTRL_XTAL
  110.                 ; Bitmap 1024 * 212   (B7) (undocumented mode)
  111.                 DB      G9K_SCR0_BITMAP+G9K_SCR0_DTCLK
  112.                 DB      0
  113.                 DB      G9K_SYS_CTRL_XTAL
  114.  
  115.  
  116. SetAdjust:
  117. ; Function: Adjustment of Gfx9000 display
  118. ;                                                   L/T   C   R/B
  119. ; Input   :      BC =>   B -> Horizontal adjustment (-7 -> 0 -> 8)
  120. ;                        C -> Vertical adjustment   (-7 -> 0 -> 8)
  121. ; Modifies:      AF, BC
  122. ;
  123.                 LD      A,B
  124.                 ADD     A,7
  125.                 CP      16
  126.                 CCF
  127.                 RET     C       ; ERROR IN HORIZONTAL ADJUST
  128.                 SUB     7
  129.                 NEG
  130.                 AND     15
  131.                 LD      B,A
  132.                 LD      A,C
  133.                 ADD     A,7
  134.                 CP      16
  135.                 CCF
  136.                 RET     C       ; ERROR IN VERTICAL ADJUST
  137.                 SUB     7
  138.                 NEG
  139.                 AND     15
  140.                 RLCA
  141.                 RLCA
  142.                 RLCA
  143.                 RLCA
  144.                 OR      B
  145.                 LD      B,A
  146.                 G9kWriteReg G9K_DISPLAY_ADJUST,B
  147.                 RET
  148.  
  149. SetVramWrite:
  150. ; Function :    Sets Vram write address
  151. ; Input    :    E:HL VRAM address
  152. ; Output   :    none
  153. ; Modifies :    A,C
  154.  
  155.                  LD      A,G9K_WRITE_ADDR
  156.                  OUT     (G9K_REG_SELECT),A
  157.                  LD      C,G9K_REG_DATA
  158.                  OUT     (C),L
  159.                  OUT     (C),H
  160.                  OUT     (C),E
  161.                  RET
  162.  
  163. SetVramRead:
  164. ; Function :    Sets Vram read address
  165. ; Input    :    E:HL VRAM address
  166. ; Output   :    none
  167. ; Modifies :    A,C
  168.  
  169.                  LD      A,G9K_READ_ADDR
  170.                  OUT     (G9K_REG_SELECT),A
  171.                  LD      C,G9K_REG_DATA
  172.                  OUT     (C),L
  173.                  OUT     (C),H
  174.                  OUT     (C),E
  175.                  RET
  176.  
  177. Detect:
  178. ; Input    :    none
  179. ; Output   :    Z=detected , NZ=not detected
  180. ; Modifies :  A,C,E,H,L,F
  181. ; Works but could be saver
  182.                   LD      E,0
  183.                   LD      H,E
  184.                   LD      L,E
  185.                   CALL    SetVramWrite
  186.                   LD      A,0A2h
  187.                   OUT     (G9K_VRAM),A
  188.                   LD      E,0
  189.                   LD      H,E
  190.                   LD      L,E
  191.                   CALL    SetVramRead
  192.                   IN      A,(G9K_VRAM)
  193.                   CP      A,0A2h
  194.                   RET
  195.  
  196.  
  197. DisplayEnable:
  198. ; Modifies A
  199.                   G9kReadReg G9K_CTRL+G9K_DIS_INC_READ
  200.                   OR      A,G9K_CTRL_DISP
  201.                   OUT     (G9K_REG_DATA),A
  202.                   RET
  203.  
  204. DisplayDisable:
  205. ; Modifies A
  206.                   G9kReadReg G9K_CTRL+G9K_DIS_INC_READ
  207.                   AND     A,255-G9K_CTRL_DISP
  208.                   OUT     (G9K_REG_DATA),A
  209.                   RET
  210.  
  211. SpritesEnable:
  212. ; Modifies A
  213.                   G9kReadReg G9K_CTRL+G9K_DIS_INC_READ
  214.                   AND     A,255-G9K_CTRL_DIS_SPD
  215.                   OUT     (G9K_REG_DATA),A
  216.                   RET
  217.  
  218. SpritesDisable:
  219. ; Modifies A
  220.                   G9kReadReg G9K_CTRL+G9K_DIS_INC_READ
  221.                   OR      A,G9K_CTRL_DIS_SPD
  222.                   OUT     (G9K_REG_DATA),A
  223.                   RET        
  224.  
  225. SetScrollX:
  226. ; Set Horizontal scroll
  227. ; In:         HL =>        Left X-position
  228. ; Uses:       AF, HL
  229.                 PUSH    HL
  230.                 LD      A,G9K_SCROLL_LOW_X
  231.                 OUT     (G9K_REG_SELECT),a
  232.                 LD      A,L
  233.                 AND     A,7
  234.                 OUT     (G9K_REG_DATA),A
  235.                 LD      A,L
  236.                 SRL     H
  237.                 RRA
  238.                 SRL     H
  239.                 RRA
  240.                 SRL     H
  241.                 RRA
  242.                 OUT     (G9K_REG_DATA),A
  243.                 POP     HL
  244.                 RET
  245.  
  246. SetScrollY:
  247. ; Function :    Sets Scroll Y
  248. ; Input    :    HL = Y
  249. ; Output   :    none
  250. ; Modifies :    A
  251.                 G9kWriteReg G9K_SCROLL_LOW_Y,L
  252.                 LD      A,(SCROLL_MODE)
  253.                 OR      A,H
  254.                 OUT     (G9K_REG_DATA),A               
  255.                 RET
  256.  
  257.                 IFNDEF G9K_DISABLE_PATTERN
  258.  
  259. SetScrollXB:
  260. ; Set Horizontal scroll
  261. ; In:         HL =>        Left X-position
  262. ; Uses:       AF, BC, HL
  263.                 LD      A,G9K_SCROLL_LOW_X_B
  264.                 OUT     (G9K_REG_SELECT),a
  265.                 LD      A,L
  266.                 AND     A,7
  267.                 OUT     (G9K_REG_DATA),A
  268.                 LD      A,L
  269.                 SRL     H
  270.                 RRA
  271.                 SRL     H
  272.                 RRA
  273.                 SRL     H
  274.                 RRA
  275.                 OUT     (G9K_REG_DATA),A
  276.                 RET
  277.  
  278.                
  279. SetScrollYB:
  280. ; Function :    Sets Scroll Y Layer B
  281. ; Input    :    HL = Y
  282. ; Output   :    none
  283. ; Modifies :    A
  284.                 G9kWriteReg G9K_SCROLL_LOW_Y_B,L
  285.                 LD      A,H
  286.                 OUT     (G9K_REG_DATA),A               
  287.                 RET            
  288.                
  289.                 ENDIF
  290.  
  291. SetScrollMode:
  292. ; Vertical Scroll mode of Gfx9000
  293. ;
  294. ; In:         AF =>   A -> 0 = Roll by image space size
  295. ;                          1 = Roll by 256 lines
  296. ;                          2 = Roll by 512 lines
  297. ; Uses:       AF, B
  298.                 AND     A,3
  299.                 RRCA
  300.                 RRCA
  301.                 LD      (SCROLL_MODE),A
  302.                 RET
  303.                
  304. SCROLL_MODE     DB      0
  305.                
  306.                
  307.  
  308. SetBackDropColor:
  309. ; Change back drop color on Gfx9000
  310. ; In:         A =>   A -> Back drop color
  311. ; Uses:       AF
  312. ;
  313.                 PUSH    AF
  314.                 LD      A,G9K_BACK_DROP_COLOR
  315.                 OUT     (G9K_REG_SELECT),A
  316.                 POP     AF
  317.                 AND     A,63
  318.                 OUT     (G9K_REG_DATA),A
  319.                 RET
  320.                  
  321. ;----------------------------------------------------------------------------;
  322. ; Gfx9000 palette functions                                                  ;
  323. ;----------------------------------------------------------------------------;
  324. WritePalette:
  325.  ;  HL=pointer to palette data
  326.  ;   C=Palette pointer offset
  327.  ;   B=Number of bytes to write
  328.  ;  Modifies : AF,BC,HL
  329.                 G9kWriteReg G9K_PALETTE_PTR,C  
  330.                 LD      C,G9K_PALETTE    
  331.                 OTIR
  332.                 RET
  333.  
  334. ReadPalette:
  335.  ;  HL=pointer to buffer wherin palette data is stored
  336.  ;   C=Palette pointer offset
  337.  ;   B=Number of bytes to read
  338.  ;
  339.                 G9kWriteReg G9K_PALETTE_PTR,C    
  340.                 LD      C,G9K_PALETTE      
  341.                 INIR
  342.                 RET
  343.  
  344. ;----------------------------------------------------------------------------;
  345. ; Gfx9000 blitter functions                                                  ;
  346. ;----------------------------------------------------------------------------;
  347.  
  348. DrawFilledBox:
  349. ; HL = pointer to parameters (format: left,top,width,height)
  350. ; DE = Color
  351.                 LD      A,G9K_DS_X
  352.                 OUT     (G9K_REG_SELECT),A
  353.                 LD      BC,8*256+G9K_REG_DATA
  354.                 G9kCmdWait
  355.                 OTIR
  356.                 LD      A,G9K_FC
  357.                 OUT     (G9K_REG_SELECT),A
  358.                 OUT     (C),E
  359.                 OUT     (C),D   ; Set color
  360.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LMMV
  361.                 RET
  362.                
  363. DrawLine:      
  364. ; HL = pointer to parameters
  365. ; DE = Color   
  366.                 LD      A,G9K_DS_X
  367.                 OUT     (G9K_REG_SELECT),A
  368.                 LD      BC,8*256+G9K_REG_DATA
  369.                 G9kCmdWait
  370.                 OTIR
  371.                 LD      A,G9K_FC
  372.                 OUT     (G9K_REG_SELECT),A
  373.                 OUT     (C),E
  374.                 OUT     (C),D   ; Set color
  375.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LINE 
  376.                 RET    
  377. DrawBox:               
  378. ; HL = pointer to parameters (format: left,top,width,height)
  379.                 PUSH    HL
  380.                 LD      A,G9K_ARG
  381.                 OUT     (G9K_REG_SELECT),A
  382.                 LD      BC,6*256+G9K_REG_DATA
  383.                 G9kCmdWait
  384.                 XOR     A,A
  385.                 OUT     (G9K_REG_DATA),A  ; Clear argument register
  386.                
  387.                 LD      A,G9K_DS_X
  388.                 OUT     (G9K_REG_SELECT),A
  389.                 OTIR   
  390.                 XOR     A,A
  391.                 OUT     (G9K_REG_DATA),A
  392.                 OUT     (G9K_REG_DATA),A  ; Write MI
  393.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LINE  ; Draw upper line
  394.                 POP     HL
  395.                                
  396.                
  397.                 PUSH    HL
  398.                 LD      A,G9K_ARG
  399.                 OUT     (G9K_REG_SELECT),A
  400.                 LD      B,4    
  401.                 G9kCmdWait
  402.                 LD      A,G9K_ARG_MAJ
  403.                 OUT     (G9K_REG_DATA),A  
  404.  
  405.                 LD      A,G9K_DS_X
  406.                 OUT     (G9K_REG_SELECT),A
  407.                 OTIR
  408.                
  409.                 INC     HL
  410.                 INC     HL
  411.                 OUTI
  412.                 OUTI
  413.                 ; MI stays the same
  414.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LINE  ; Draw left line
  415.                 POP     HL
  416.                
  417.                
  418.                 PUSH    HL
  419.                 LD      A,G9K_ARG
  420.                 OUT     (G9K_REG_SELECT),A     
  421.                 G9kCmdWait
  422.                
  423.                 XOR     A,A
  424.                 OUT     (G9K_REG_DATA),A  ; Clear argument register
  425.                
  426.                 LD      A,G9K_DS_X
  427.                 OUT     (G9K_REG_SELECT),A  
  428.                
  429.                 OUTI
  430.                 OUTI    ; Write left
  431.                                        
  432.                 LD      C,(HL)
  433.                 INC     HL
  434.                 LD      B,(HL)
  435.                 INC     HL      ; top
  436.                
  437.                 LD      E,(HL)
  438.                 INC     HL
  439.                 LD      D,(HL)
  440.                 INC     HL      ; Width
  441.                                
  442.                 LD      A,(HL)
  443.                 INC     HL
  444.                 LD      H,(HL)  ; Height
  445.                 LD      L,A    
  446.                 ADD     HL,BC   ; Calc top+height
  447.                 LD      C,G9K_REG_DATA
  448.        
  449.                 OUT     (C),L
  450.                 OUT     (C),H   ; Write Y
  451.                
  452.                 OUT     (C),E
  453.                 OUT     (C),D   ; Write MJ
  454.                
  455.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LINE  ; Draw bottom line
  456.                 POP     HL  
  457.                
  458.                 LD      A,G9K_ARG
  459.                 OUT     (G9K_REG_SELECT),A             
  460.                 ;DE = width
  461.                 LD      A,(HL)
  462.                 INC     HL
  463.                 PUSH    HL
  464.                 LD      H,(HL)
  465.                 LD      L,A   ; Left
  466.                 ADD     HL,DE ; Left+width
  467.                 G9kCmdWait
  468.        
  469.                 LD      A,G9K_ARG_MAJ
  470.                 OUT     (G9K_REG_DATA),A  
  471.                
  472.                 LD      A,G9K_DS_X
  473.                 OUT     (G9K_REG_SELECT),A
  474.                
  475.                 OUT     (C),L
  476.                 OUT     (C),H   ; Write X
  477.                 POP     HL
  478.                 INC     HL
  479.                 OUTI
  480.                 OUTI            ; Write Y
  481.                 INC     HL
  482.                 INC     HL     
  483.                 OUTI
  484.                 OUTI            ; Height (MJ)  
  485.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LINE  ; Draw right line
  486.                 RET    
  487.                
  488.                
  489. SetupCopyRamToXY:
  490. ; Input   : HL = pointer to parameters (format: left,top,width,height)
  491. ; Modifies: A,BC,HL
  492.                 LD      A,G9K_DS_X
  493.                 OUT     (G9K_REG_SELECT),A
  494.                 LD      BC,8*256+G9K_REG_DATA
  495.                 G9kCmdWait
  496.                 OTIR
  497.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LMMC
  498.                 RET
  499.  
  500. CopyRamToXY:
  501. ; HL = Pointer to data
  502. ; BC = Bytes to copy
  503.                 LD      A,B
  504.                 LD      B,C
  505.                 INC     B
  506.                 DEC     B
  507.                 JR      Z,$+3
  508.                       INC    A
  509.                 LD      C,G9K_CMD_DATA
  510.                       OTIR
  511.                       DEC     A
  512.                       JP   NZ,$-3
  513.                 RET
  514.  
  515. SetupCopyXYToRam:
  516. ; HL = pointer to parameters (format: left,top,width,height)
  517.                 LD      A,G9K_SC_X
  518.                 OUT     (G9K_REG_SELECT),A
  519.                 LD      BC,4*256+G9K_REG_DATA
  520.                 G9kCmdWait
  521.                 OTIR
  522.                 LD      B,4
  523.                 LD      A,G9K_NX
  524.                 OUT     (G9K_REG_SELECT),A
  525.                 OTIR
  526.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LMCM
  527.                 RET
  528.  
  529. CopyXYToRam:
  530. ; HL = Pointer to data
  531. ; BC = Bytes to copy
  532.                 LD      A,B
  533.                 LD      B,C
  534.                 INC     B
  535.                 DEC     B
  536.                 JR      Z,$+3
  537.                   INC    A
  538.                 LD      C,G9K_CMD_DATA
  539.                   INIR
  540.                   DEC     A
  541.                   JP   NZ,$-3
  542.                 RET
  543.  
  544. CopyXYToXY:
  545. ; HL = Pointer to data  (format: SourceX,SourceY,DestX,DestY,Width,height) struct G9K_COPY_XY_XY
  546.                
  547.                 LD      A,G9K_SC_X
  548.                 OUT     (G9K_REG_SELECT),A
  549.                 LD      BC,12*256+G9K_REG_DATA
  550.                 G9kCmdWait
  551.                 OTIR
  552.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LMMM
  553.                 RET
  554.  
  555. CopyXYToRegisterXY
  556. ; HL = Pointer to G9B_BOX struct
  557. ; IX = Dest X
  558. ; IY = Dest Y
  559.                
  560.                 LD      A,G9K_SC_X
  561.                 OUT     (G9K_REG_SELECT),A
  562.                 LD      C,G9K_REG_DATA
  563.                 G9kCmdWait
  564.                
  565.                 OUTI
  566.                 OUTI    ; SourceX
  567.                 OUTI
  568.                 OUTI    ; SourceY
  569.                 LD      A,IXL
  570.                 OUT     (G9K_REG_DATA),A
  571.                 LD      A,IXH
  572.                 OUT     (G9K_REG_DATA),A; DestX
  573.                 LD      A,IYL
  574.                 OUT     (G9K_REG_DATA),A
  575.                 LD      A,IYH
  576.                 OUT     (G9K_REG_DATA),A; DestY
  577.                 OUTI
  578.                 OUTI    ; Width
  579.                 OUTI
  580.                 OUTI    ; Height
  581.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_LMMM
  582.                 RET
  583.  
  584. CopyVramToXY:
  585. ; HL = Pointer to data  (format: SourceAddress,DestX,DestY,Width,height)
  586.  
  587.                 LD      A,G9K_SC_X
  588.                 OUT     (G9K_REG_SELECT),A
  589.                 LD      BC,11*256+G9K_REG_DATA
  590.                 G9kCmdWait
  591.                 OUTI
  592.                 OUT     (G9K_REG_DATA),A    ; dummy write
  593.                 OTIR
  594.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_BMXL
  595.                 RET
  596.  
  597. CopyXYToVram:
  598. ; HL = Pointer to data  (format: SourceX,SourceY,DestAddress,Width,height)
  599. ; Modifies AF,HL,BC
  600.                 LD      A,G9K_SC_X
  601.                 OUT     (G9K_REG_SELECT),A
  602.                 LD      BC,5*256+G9K_REG_DATA
  603.                 G9kCmdWait
  604.                 OTIR
  605.                 OUT     (G9K_REG_DATA),A    ; dummy write
  606.                 LD      B,6
  607.                 OTIR
  608.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_BMLX
  609.                 RET
  610.  
  611. CopyVramToVram:
  612. ; HL = Pointer to data  (format: SrcAddress,DestAddress,NrBytes)
  613. ; Modifies AF,HL,BC
  614.                 LD      A,G9K_SC_X
  615.                 OUT     (G9K_REG_SELECT),A
  616.                 LD      C,G9K_REG_DATA
  617.                 G9kCmdWait
  618.                
  619.                 OUTI                        ; Source Low
  620.                 OUT     (G9K_REG_DATA),A    ; dummy write
  621.                 OUTI                        ; Source mid
  622.                 OUTI                        ; Source high
  623.                
  624.                 OUTI                        ; Destination Low
  625.                 OUT     (G9K_REG_DATA),A    ; dummy write
  626.                 OUTI                        ; Destination mid
  627.                 OUTI                        ; Destination High
  628.                                
  629.                 OUTI                        ; Number of bytes Low
  630.                 OUT     (G9K_REG_DATA),A    ; dummy write
  631.                 OUTI                        ; Number of bytes mid
  632.                 OUTI                        ; Number of bytes High
  633.  
  634.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_BMLL
  635.                 RET
  636.  
  637. SetPoint:
  638. ; HL = X
  639. ; DE = Y
  640. ; Under Construction
  641.                 LD      A,G9K_SC_X
  642.                 OUT     (G9K_REG_SELECT),A
  643.                 LD      C,G9K_REG_DATA
  644.                 OUT     (C),L
  645.                 OUT     (C),H
  646.                 OUT     (C),E
  647.                 OUT     (C),D
  648.                
  649.                 G9kCmdWait
  650.                 RET
  651.  
  652.  
  653. SetCmdWriteMask:
  654. ; HL = mask value
  655.                 G9kWriteReg G9K_WRITE_MASK,L
  656.                 LD      A,H
  657.                 OUT     (G9K_REG_DATA),A
  658.                 RET
  659. SetCmdColor:
  660. ; HL = color value
  661.                 G9kWriteReg G9K_FC,L
  662.                 LD      A,H
  663.                 OUT     (G9K_REG_DATA),A
  664.                 RET
  665.                
  666. SetCmdBackColor:               
  667. ; HL = color value
  668.                 G9kWriteReg G9K_BC,L
  669.                 LD      A,H
  670.                 OUT     (G9K_REG_DATA),A
  671.                 RET
  672.                
  673.  
  674. CopyRamToVram:
  675. ; Function :    Data transfer from CPU to VRAM
  676. ; Input    :    HL = pointer to buffer, BC=number of bytes to send
  677. ; Output   :    none
  678. ; Modifies :    A,B,C,HL
  679.                 LD      A,B
  680.                 LD      B,C
  681.                 LD      C,G9K_VRAM
  682.                 INC     B
  683.                 DEC     B
  684.                 JR      Z,.a
  685.                 INC     A
  686. .a
  687.                 OTIR
  688.                 DEC     A
  689.                 JP      NZ,.a            
  690.                 RET
  691.                
  692.  
  693. ;----------------------------------------------------------------------------;
  694. ; Gfx9000 font functions                                                     ;
  695. ;----------------------------------------------------------------------------;
  696.                 IFNDEF G9K_DISABLE_VFF
  697. OpenVff:
  698. ; Input           A = ram or vram.  0 = load data in vram, 1 = load font data in ram
  699. ;                DE = Pointer to Font file name
  700. ;                IX = Pointer to VFF object
  701.                
  702.                 LD      (IX+VFF_OBJECT.ramFont),A
  703.                 PUSH    IX
  704.                 XOR     A,A    
  705.                 CALL    File.FileOpen
  706.                 POP     IX
  707.                 RET     NZ              ; Error opening
  708.                
  709.                 PUSH    IX
  710.                 LD      HL,3            ; ID
  711.                 LD      DE,VFF_DATA_ID
  712.                 CALL    File.FileRead     ; Load Id
  713.                 POP     IX
  714.                 RET     NZ              ; Error reading
  715.  
  716.                 PUSH    IX             
  717.                 PUSH    BC              ; Save file handle
  718.                 LD      B,3
  719.                 LD      HL,VFF_DATA_ID
  720.                 LD      DE,VFF_ID
  721.                 CALL    String.StringCompare
  722.                 LD      A,_NOVFF
  723.                 POP     BC
  724.                 POP     IX
  725.                 RET     NZ              ; Not a VFF file
  726.                 LD      (IX),B          ; Save file handle
  727.                 LD      DE,IX
  728.                 INC     DE
  729.                 INC     DE
  730.                 LD      HL,21           ; Load header
  731.                 JP      File.FileRead
  732.                
  733. VFF_ID          DB      "VFF"
  734. VFF_DATA_ID     DS      3,0
  735.                
  736. LoadFont:
  737. ; Function      : Loads VFF font data
  738. ; Input         : IX = Pointer to VFF object
  739. ;               : IY = Pointer to font offset table, if it's zero it's not loaded
  740. ;               : HL = Pointer to buffer for loading, or if it's a ram font the destination address
  741. ;               : BC = Vram low word font data offset. If it's a ram font the pointer for buffer loading is used as font data offset  
  742. ; Output        : Z = succeded NZ= not succeded, A = error number
  743.                
  744.                 LD      A,(IX+VFF_OBJECT.ramFont)      
  745.                 OR      A,A
  746.                 JR      Z,.noRamFont
  747.                 LD      BC,HL  
  748. .noRamFont             
  749.                 PUSH    IX
  750.                 PUSH    HL
  751.                 LD      (IX+VFF_OBJECT.vramOffset),BC     ; Store Vram font offset
  752.                 LD      HL,512                            ; Font offset table size
  753.                 LD      B,(IX + VFF_OBJECT.fileHandle)    ; File hanlde
  754.                 LD      DE,IY                             ; Pointer to offset table
  755.                 LD      (IX+VFF_OBJECT.ptrOffsetTable),DE ; Store pointer to font character offset table
  756.                 CALL    File.FileRead                     ; Load font offset table
  757.                 POP     DE                                ; Pointer to buffer
  758.                 POP     IX
  759.                 RET     NZ                                ; Return if loading failed
  760.                
  761.                 LD      HL,(IX+VFF_OBJECT.dataSize)
  762.                 PUSH    HL
  763.                 PUSH    DE           ; Pointer to buffer
  764.                 CALL    File.FileRead
  765.                 POP     DE
  766.                 POP     HL
  767.                 RET     NZ           ; Loading failed
  768.                
  769.                 ; If it is ram font then copy to vram is skipped
  770.                 LD      A,(IX+VFF_OBJECT.ramFont)
  771.                 DEC     A
  772.                 RET     Z
  773.                
  774.                 PUSH    DE           ; Pointer to buffer
  775.                 PUSH    HL           ; data size    
  776.                 LD      HL,(IX+VFF_OBJECT.vramOffset)
  777.                 LD      E,7          ; High byte font address always 7
  778.                 CALL    SetVramWrite
  779.                 POP     BC           ; data size
  780.                 POP     HL           ; Pointer to buffer
  781.                 CALL    CopyRamToVram
  782.                 XOR     A,A
  783.                 RET            
  784.  
  785. SetFont:
  786. ; Input IX = Pointer to VFF object
  787.                 PUSH    AF
  788.                 PUSH    HL
  789.                 PUSH    DE
  790.                
  791.                 LD      A,(IX + VFF_OBJECT.width)
  792.                 LD      (currentFont.width),A
  793.                 LD      A,(IX + VFF_OBJECT.height)
  794.                 LD      (currentFont.height),A
  795.  
  796.                 ; Copy pointer to font offset table in print functions
  797.                 LD      HL,(IX + VFF_OBJECT.ptrOffsetTable)
  798.                 IFNDEF G9K_DISABLE_VFF_VRAM
  799.                 LD      (PrintStringVram.fontTablePtr+1),HL
  800.                 LD      (PutCharVram.fontTablePtr+1),HL
  801.                 ENDIF
  802.                
  803.                 IFNDEF G9K_DISABLE_VFF_RAM
  804.                 LD      (PrintStringRam.fontTablePtr+1),HL     
  805.                 LD      (PutCharRam.fontTablePtr+1),HL
  806.                 ENDIF
  807.                
  808.                 INC     HL
  809.                 INC     HL
  810.                 LD      A,(HL)  ; offset to second char is also the character size
  811.                 LD      (currentFont.charSize),A
  812.                        
  813.                 LD      A,(IX+VFF_OBJECT.vramOffset+0)
  814.                 IFNDEF G9K_DISABLE_VFF_VRAM
  815.                 LD      (PrintStringVram.fontVramOffset+1),A
  816.                 LD      (PutCharVram.fontVramOffset+1),A
  817.                 ENDIF
  818.                
  819.                 IFNDEF G9K_DISABLE_VFF_RAM
  820.                 LD      (PrintStringRam.fontRamOffset+1),A     
  821.                 LD      (PutCharRam.fontRamOffset+1),A
  822.                 ENDIF
  823.                
  824.                 LD      A,(IX+VFF_OBJECT.vramOffset+1)
  825.                 IFNDEF G9K_DISABLE_VFF_VRAM
  826.                 LD      (PrintStringVram.fontVramOffset+2),A
  827.                 LD      (PutCharVram.fontVramOffset+2),A
  828.                 ENDIF  
  829.                
  830.                 IFNDEF G9K_DISABLE_VFF_RAM
  831.                 LD      (PrintStringRam.fontRamOffset+2),A
  832.                 LD      (PutCharRam.fontRamOffset+2),A
  833.                 ENDIF
  834.                
  835.                 LD      A,(IX+VFF_OBJECT.ramFont)
  836.                 IFNDEF G9K_DISABLE_VFF_VRAM
  837.                 LD      HL,PrintStringVram
  838.                 LD      DE,PutCharVram
  839.                 ENDIF
  840.                
  841.                 OR      A,A
  842.                 JR      Z,.end
  843.                
  844.                 IFNDEF G9K_DISABLE_VFF_RAM
  845.                 LD      HL,PrintStringRam
  846.                 LD      DE,PutCharRam
  847.                 ENDIF
  848. .end:                          
  849.                 LD      (PrintString+1),HL
  850.                 LD      (PutChar+1),DE
  851.                
  852.                 POP     DE
  853.                 POP     HL
  854.                 POP     AF
  855.                 RET
  856.                
  857. PrintString:   
  858.                 JP      0
  859. PutChar:       
  860.                 JP      0      
  861.        
  862.                 IFNDEF G9K_DISABLE_VFF_VRAM
  863. PrintStringVram:       
  864. ; Function      : Print ASCIIZ String
  865. ; Input         : IX = X
  866. ;               : IY = Y
  867. ;               ; DE = Pointer to txt
  868. ; Output        : DE = Pointer to byte after term char
  869. ;               : IX = modified to x after printed string
  870. ; Modifies      ; AF,BC,DE,HL,IX
  871.                 LD      (currentFont.x),IX
  872.                 LD      (currentFont.y),IY
  873.                    
  874. .loop
  875.                 LD      A,G9K_SC_X
  876.                 OUT     (G9K_REG_SELECT),A
  877.                 LD      A,(DE)
  878.                 INC     DE
  879.                 OR      A,A     ; End of ASCIIZ string
  880.                 RET     Z      
  881.                  
  882. .fontTablePtr   LD      BC,0    ;VFF.FONT_TABLE
  883.                 LD      L,A
  884.                 LD      H,0
  885.                 ADD     HL,HL
  886.                 ADD     HL,BC
  887.  
  888.                 LD      A,(currentFont.width)   ; Next Char
  889.                 LD      C,A
  890.                 LD      B,0
  891.                 ADD     IX,BC           ; Precalculation
  892.                
  893.                 LD      C,(HL)
  894.                 INC     HL
  895.                 LD      B,(HL)  ; vram offset of character  
  896. .fontVramOffset LD      HL,0    ; vram font base address offset low word
  897.                 ADD     HL,BC  
  898.                
  899.                 LD      C,G9K_REG_DATA
  900.                 G9kCmdWait
  901.  
  902.                 OUT     (C),L   ; Vram address Low byte  
  903.                 LD      A,0
  904.                 OUT     (C),A   ; Looks stuppid but else it doens't work on turbo r            
  905.                 OUT     (C),H   ; Vram addres Mid byte  
  906.                 LD      HL,currentFont.vramAddress
  907.                 OUTI            ; Vram high address
  908.                 OUTI            ; X low byte
  909.                 OUTI            ; X high byte
  910.                 OUTI            ; Y low byte
  911.                 OUTI            ; Y high byte
  912.                 OUTI            ; Width
  913.                 LD      A,0
  914.                 OUT     (C),A   ; Width High byte always 0
  915.                 OUTI            ; Height
  916.                 LD      A,0     ; Height High byte always 0
  917.                 OUT     (C),A   ; Looks stuppid but else it doens't work in turbo r  
  918.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_CMMM
  919.                 LD      (currentFont.x),IX
  920.                 JP      .loop
  921.  
  922. PutCharVram:   
  923. ; Function      : Print a character
  924. ; Input         : E  = Character
  925. ; Output        ; IX = modified to x after printed character
  926. ; Modifies      ; AF,BC,DE,HL,IX
  927.                                
  928.                                  
  929. .fontTablePtr   LD      BC,0   
  930.                 LD      L,A
  931.                 LD      H,0
  932.                 ADD     HL,HL
  933.                 ADD     HL,BC
  934.                
  935.                 LD      A,G9K_SC_X
  936.                 OUT     (G9K_REG_SELECT),A
  937.  
  938.                 LD      A,(currentFont.width)   ; Next Char
  939.                 LD      C,A
  940.                 LD      B,0
  941.                 ADD     IX,BC           ; Precalculation
  942.                
  943.                 LD      C,(HL)
  944.                 INC     HL
  945.                 LD      B,(HL)  ; vram offset of character  
  946. .fontVramOffset LD      HL,0    ; vram font base address offset low word
  947.                 ADD     HL,BC  
  948.                
  949.                 LD      C,G9K_REG_DATA
  950.                 G9kCmdWait
  951.  
  952.                 OUT     (C),L    ; Vram address Low byte  
  953.                 LD      A,0
  954.                 OUT     (C),A   ; Looks stuppid but else it doens't work on turbo r            
  955.                 OUT     (C),H   ; Vram addres Mid byte  
  956.                 LD      HL,currentFont.vramAddress
  957.                 OUTI            ; Vram high address
  958.                 OUTI            ; X low byte
  959.                 OUTI            ; X high byte
  960.                 OUTI            ; Y low byte
  961.                 OUTI            ; Y high byte
  962.                 OUTI            ; Width
  963.                 LD      A,0
  964.                 OUT     (C),A   ; Width High byte always 0
  965.                 OUTI            ; Height
  966.                 LD      A,0     ; Height High byte always 0
  967.                 OUT     (C),A   ; Looks stuppid but else it doens't work in turbo r  
  968.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_CMMM
  969.                 LD      (currentFont.x),IX
  970.                 RET
  971.                 ENDIF
  972.                
  973.                 IFNDEF G9K_DISABLE_VFF_RAM
  974. PrintStringRam:
  975. ; Function      : Print ASCIIZ String
  976. ; Input         : IX = X
  977. ;               : IY = Y
  978. ;               ; DE = Pointer to txt
  979. ; Output        : DE = Pointer to byte after term char
  980. ;               : IX = modified to x after printed string
  981. ; Modifies      ; AF,BC,DE,HL,IX
  982.  
  983.                 LD      (currentFont.x),IX
  984.                 LD      (currentFont.y),IY
  985.  
  986. .loop
  987.                 LD      A,G9K_DS_X
  988.                 OUT     (G9K_REG_SELECT),A
  989.                 LD      A,(DE)
  990.                 INC     DE
  991.                 OR      A,A     ; End of ASCIIZ string
  992.                 RET     Z      
  993.                  
  994.                 ; Calculate the font data pointer address in ram
  995. .fontTablePtr   LD      BC,0
  996.                 LD      L,A
  997.                 LD      H,0
  998.                 ADD     HL,HL
  999.                 ADD     HL,BC
  1000.  
  1001.                 ; Precalculate next character offset
  1002.                 ; This is done here to minimize wasted time on waiting for the v9990 to finish
  1003.                 LD      A,(currentFont.width)   ; Next Char
  1004.                 LD      C,A
  1005.                 LD      B,0
  1006.                 ADD     IX,BC           ; Precalculation
  1007.  
  1008.                 ; Get the address of the character data in ram
  1009.                 LD      C,(HL)
  1010.                 INC     HL
  1011.                 LD      B,(HL)  ; ram offset of character  
  1012. .fontRamOffset  LD      HL,0    ; ram font base address offset low word
  1013.                 ADD     HL,BC  
  1014.                 PUSH    HL     
  1015.                 LD      C,G9K_REG_DATA
  1016.                 G9kCmdWait
  1017.                 LD      HL,currentFont.x
  1018.                 OUTI            ; X low byte
  1019.                 OUTI            ; X high byte
  1020.                 OUTI            ; Y low byte
  1021.                 OUTI            ; Y high byte
  1022.                 OUTI            ; Width
  1023.                 LD      A,0
  1024.                 OUT     (C),A   ; Width High byte always 0
  1025.                 OUTI            ; Height
  1026.                 LD      A,0     ; Height High byte always 0
  1027.                 OUT     (C),A   ; Looks stuppid but else it doens't work in turbo r  
  1028.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_CMMC
  1029.                 ; Store addres of next X position
  1030.                 LD      (currentFont.x),IX
  1031.                
  1032.                 ; Wait for v9990 to recieve data
  1033.                 G9kWaitComReady
  1034.                
  1035.                 ; Send character data to vdp
  1036.                 POP     HL      ; Pointer to font data in ram
  1037.                 LD      A,(currentFont.charSize)
  1038.                 LD      B,A
  1039.                 LD      C,G9K_CMD_DATA
  1040.                 OTIR
  1041.                 JP      .loop
  1042.                
  1043. PutCharRam:
  1044. ; Function      : Print a character
  1045. ; Input         : A  = Character
  1046. ; Output        ; IX = modified to x after printed character
  1047. ; Modifies      ; AF,BC,DE,HL,IX               
  1048.                 ; Calculate the font data pointer address in ram
  1049. .fontTablePtr   LD      BC,0
  1050.                 LD      L,A
  1051.                 LD      H,0
  1052.                 ADD     HL,HL
  1053.                 ADD     HL,BC
  1054.  
  1055.                 LD      A,G9K_DS_X
  1056.                 OUT     (G9K_REG_SELECT),A
  1057.                  
  1058.                 ; Precalculate next character offset
  1059.                 ; This is done here to minimize wasted time on waiting for the v9990 to finish
  1060.                 LD      A,(currentFont.width)   ; Next Char
  1061.                 LD      C,A
  1062.                 LD      B,0
  1063.                 ADD     IX,BC           ; Precalculation
  1064.  
  1065.                 ; Get the address of the character data in ram
  1066.                 LD      C,(HL)
  1067.                 INC     HL
  1068.                 LD      B,(HL)  ; ram offset of character  
  1069. .fontRamOffset  LD      HL,0    ; ram font base address offset low word
  1070.                 ADD     HL,BC  
  1071.                 PUSH    HL     
  1072.                 LD      C,G9K_REG_DATA
  1073.                 G9kCmdWait
  1074.                 LD      HL,currentFont.x
  1075.                 OUTI            ; X low byte
  1076.                 OUTI            ; X high byte
  1077.                 OUTI            ; Y low byte
  1078.                 OUTI            ; Y high byte
  1079.                 OUTI            ; Width
  1080.                 LD      A,0
  1081.                 OUT     (C),A   ; Width High byte always 0
  1082.                 OUTI            ; Height
  1083.                 LD      A,0     ; Height High byte always 0
  1084.                 OUT     (C),A   ; Looks stuppid but else it doens't work in turbo r  
  1085.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_CMMC
  1086.                 ; Store addres of next X position
  1087.                 LD      (currentFont.x),IX
  1088.                
  1089.                 ; Wait for v9990 to recieve data
  1090.                 G9kWaitComReady
  1091.                
  1092.                 ; Send character data to vdp
  1093.                 POP     HL      ; Pointer to font data in ram
  1094.                 LD      A,(currentFont.charSize)
  1095.                 LD      B,A
  1096.                 LD      C,G9K_CMD_DATA
  1097.                 OTIR
  1098.                 RET
  1099.                 ENDIF
  1100.                
  1101. Locate:        
  1102. ; Set X and Y position for putchar
  1103. ; Value in IX is also needed for the putchar so don't overwrite it
  1104.                 LD      (currentFont.x),IX
  1105.                 LD      (currentFont.y),IY     
  1106.                 RET
  1107.                
  1108.                
  1109. currentFont
  1110. .vramAddress    DB      7               ; High Byte
  1111. .x              DW      0
  1112. .y              DW      0
  1113. .width          DB      8               ; Font Size
  1114. .height         DB      8               ;      
  1115. .charSize       DB      0               ; Char size in bytes.
  1116.  
  1117.                 ENDIF
  1118.        
  1119. ;----------------------------------------------------------------------------;
  1120. ; Gfx9000 bitmap functions                                                   ;
  1121. ;----------------------------------------------------------------------------;
  1122.                 IFNDEF G9K_DISABLE_G9B 
  1123.                        
  1124. OpenG9B:
  1125. ; Input  : DE = Pointer to file name asciiz
  1126. ; Output : HL = Pointer to G9B header data, NZ = error , Error code in A
  1127. ; Modifies:            
  1128.                 PUSH    HL
  1129.                 XOR     A,A    
  1130.                 CALL    File.FileOpen
  1131.                 POP     HL
  1132.                 RET     NZ              ; Error opening
  1133.                
  1134.                 PUSH    HL
  1135.                 LD      HL,5            ; ID + HEADER LENGTH
  1136.                 LD      DE,G9B_DATA_ID
  1137.                 CALL    File.FileRead
  1138.                 POP     HL
  1139.                 RET     NZ              ; Error reading
  1140.                
  1141.                 PUSH    HL             
  1142.                 PUSH    BC              ; Save file handle
  1143.                 LD      B,3
  1144.                 LD      HL,G9B_DATA_ID
  1145.                 LD      DE,G9B_ID
  1146.                 CALL    String.StringCompare
  1147.                 LD      A,_NOG9B
  1148.                 POP     BC
  1149.                 POP     HL
  1150.                 RET     NZ              ; Not a G9B file
  1151.                
  1152.                 LD      (HL),B          ; Save handle in G9B struct
  1153.                 INC     HL
  1154.                 INC     HL
  1155.                 EX      DE,HL
  1156.                 LD      HL,(G9B_HEADER_SIZE)
  1157.                 JP      File.FileRead
  1158.  
  1159. ReadG9B:
  1160. ; IX = Pointer to G9B object struct
  1161. ; DE = Pointer to load buffer
  1162. ; BC = Size of load buffer
  1163. ; HL = Destination X
  1164. ; IY = Destination Y
  1165. ;  A = Palette offset in bytes. Only valid with palette modes. If a = 255 palette not loaded   
  1166.                
  1167.                 PUSH    AF      ; Palette pointer
  1168.                 LD      (G9B_COPY_PARMS),HL    
  1169.                 LD      (G9B_COPY_PARMS+2),IY  
  1170.                
  1171.                 LD      A,(IX+G9B_OBJECT.width+0)
  1172.                 LD      (G9B_COPY_PARMS+4),A
  1173.                 LD      A,(IX+G9B_OBJECT.width+1)              
  1174.                 LD      (G9B_COPY_PARMS+5),A            ; Copy X
  1175.                
  1176.                 LD      A,(IX+G9B_OBJECT.height+0)
  1177.                 LD      (G9B_COPY_PARMS+6),A
  1178.                 LD      A,(IX+G9B_OBJECT.height+1)             
  1179.                 LD      (G9B_COPY_PARMS+7),A            ; Copy Y       
  1180.                
  1181.                 LD      HL,G9B_COPY_PARMS
  1182.                 POP     AF    ; Palette pointer
  1183.                 PUSH    BC
  1184.                 PUSH    DE
  1185.                
  1186.                 PUSH    AF     ; Palette pointer
  1187.                 CALL    SetupCopyRamToXY       
  1188.                 POP     BC
  1189.                                
  1190.                 LD      C,B    ; C = palette pointer   
  1191.                 CALL    NZ,ReadG9BPalette
  1192.  
  1193.                 POP     DE             
  1194.                 POP     BC
  1195.                 RET     NZ            ; Error Loading palette
  1196.        
  1197.                 LD      HL,CopyRamToXY
  1198.                 LD      (ReadToG9K.copyMode+1),HL ; Set copy mode
  1199.                
  1200.                 IFNDEF G9K_DISABLE_BITBUST
  1201.                   LD      A,(IX + G9B_OBJECT.compression)
  1202.                   AND     A,07FH
  1203.                   CP      A,G9B_COMPRESSION_BITBUST
  1204.                   JP      Z,G9kBitBustXY
  1205.                 ENDIF
  1206.                
  1207. ReadG9B.Load           
  1208.                 LD      A, (IX+G9B_OBJECT.dataSize+2)
  1209.                 LD      HL,(IX+G9B_OBJECT.dataSize)
  1210. ReadG9B.0      
  1211.                 PUSH    HL
  1212.                 POP     IY             ; Save low word, because this is the last block
  1213.                 OR      A,A
  1214.                 SBC     HL,BC
  1215.                 SBC     A,0            ; Calculate block size
  1216.                 JR      C,ReadG9B.1    ; Jumps when last block is reached
  1217.                 PUSH    AF             ; Size still to read high byte
  1218.                 PUSH    HL             ; Size still to read low word   
  1219.                 PUSH    BC             ; buffer size   
  1220.                 LD      HL,BC          ; Block size is buffer size    
  1221.                 LD      B,(IX + G9B_OBJECT.fileHandle) ; Get file handle
  1222.                 CALL    ReadToG9K
  1223.                 POP     BC             ; buffer size
  1224.                 POP     HL             ; Size still to read low word
  1225.                 POP     AF             ; Size still to read high byte  
  1226.                 JP      ReadG9B.0
  1227.                
  1228. ReadG9B.1      
  1229.                 PUSH    IY
  1230.                 POP     HL
  1231.                 LD      B,(IX)  ; Get file handle      
  1232.                 JP      ReadToG9K
  1233.                
  1234.  
  1235. CalcG9BVramSize:
  1236. ; Input IX    = Pointer to G9B header data
  1237. ; Output E:HL = data size
  1238.                         LD      DE,(IX + G9B_OBJECT.width)
  1239.                         LD      BC,(IX + G9B_OBJECT.height)
  1240.                         ; Calculate number of pixels
  1241.                         CALL    Math.BCMulDE32 ; Result BC:HL
  1242.                         LD      E,C
  1243.                         LD      A,(IX + G9B_OBJECT.bitDepth)
  1244.                         JP      CalcDataSize
  1245.  
  1246. CalcDataSize
  1247. ;input E:HL=number of pixels  
  1248. ;       A=bits per dot 
  1249.                         CP      A,16
  1250.                         JR      Z,.calc16bit
  1251.                         CP      A,8
  1252.                         RET     Z
  1253.                         LD      B,1
  1254.                         CP      A,4
  1255.                         JR      Z,.shiftLoop
  1256.                         LD      B,2
  1257. .shiftLoop
  1258.                         SRL     E
  1259.                         RR      H
  1260.                         RR      L
  1261.                         DJNZ    .shiftLoop
  1262.                         RET
  1263. .calc16bit
  1264.                         ADD     HL,HL
  1265.                         RL      E      
  1266.                         RET
  1267.  
  1268. ReadG9BLinear:
  1269. ; IX   = Pointer to G9B header data
  1270. ; DE   = Pointer to load buffer
  1271. ; BC   = Size of load buffer
  1272. ; IYL:HL = Vram destination address
  1273. ;    A = Palette offset in bytes. Only valid with in palette modes, A = 255 palette not loaded 
  1274.                
  1275.                 PUSH    AF
  1276.                 PUSH    BC
  1277.                 PUSH    DE ; Pointer to buffer
  1278.                 LD      E,IYL
  1279.                 CALL    SetVramWrite
  1280.                 POP     DE
  1281.                 POP     BC
  1282.                 POP     AF
  1283.  
  1284.                 PUSH    DE
  1285.                 PUSH    BC
  1286.                 LD      C,A    ; C = palette pointer   
  1287.                 CALL    NZ,ReadG9BPalette
  1288.                 POP     BC
  1289.                 POP     DE             
  1290.                 RET     NZ            ; Error Loading palette
  1291.                        
  1292.                 LD      HL,CopyRamToVram
  1293.                 LD      (ReadToG9K.copyMode+1),HL
  1294.                
  1295.                 IFNDEF G9K_DISABLE_BITBUST
  1296.                   LD      A,(IX + G9B_OBJECT.compression)
  1297.                   AND     A,07FH
  1298.                   CP      A,G9B_COMPRESSION_BITBUST
  1299.                   JP      Z,G9kBitBustLinear
  1300.                 ENDIF
  1301.                 JP      ReadG9B.Load   
  1302.                
  1303. ReadToG9K:     
  1304. ; Input B = FileHandle 
  1305. ;      DE = Pointer to buffer
  1306. ;      HL = Bytes to read              
  1307.                
  1308.                 PUSH    DE
  1309.                 PUSH    IX
  1310.                
  1311.                 PUSH    DE  ; Pointer to buffer
  1312.                 PUSH    HL  ; Bytes to read
  1313.                 CALL    File.FileRead
  1314.                 POP     BC  ; Bytes to read
  1315.                 POP     HL  ; Pointer to buffer
  1316.                
  1317. .copyMode       CALL    CopyRamToXY
  1318.  
  1319.                 POP     IX
  1320.                 POP     DE
  1321.                 RET    
  1322.                
  1323. ReadG9BPalette:
  1324. ; IX = Pointer to G9B object struct
  1325. ;  C = Palette pointer  (max 192), if 255 skip loading palette
  1326. ; DE = Pointer to buffer
  1327.                
  1328.                 INC     C
  1329.                 RET     Z       ; C = 255 skip loading
  1330.                 DEC     C
  1331.                
  1332.                 LD      A,(IX+G9B_OBJECT.nrColors)
  1333.                 OR      A,A                    
  1334.                 RET     Z               ; Nothing to load      
  1335.  
  1336.                 LD      B,A
  1337.                 ADD     A,A
  1338.                 ADD     A,B     ; Number of colors * 3 = size on disk
  1339.                 LD      H,0
  1340.                 LD      L,A
  1341.                 PUSH    HL      ; Bytes to read
  1342.                 PUSH    DE      ; Pointer to buffer
  1343.                 LD      B,(IX + G9B_OBJECT.fileHandle)
  1344.                 CALL    File.FileRead ; Saves BC
  1345.                 POP     HL      ; Pointer to buffer
  1346.                 POP     DE      ; Bytes to read
  1347.                 RET     NZ      ; Error reading palette
  1348.                 LD      B,E
  1349.                 JP      WritePalette
  1350.                
  1351.                
  1352. G9B_ID          DB      "G9B"  
  1353. G9B_DATA_ID     DS      3,0
  1354. G9B_HEADER_SIZE DW      0      
  1355. G9B_COPY_PARMS  DW      0
  1356.                 DW      0
  1357.                 DW      0
  1358.                 DW      0
  1359.  
  1360.                 IFNDEF G9K_DISABLE_BITBUST
  1361.  
  1362. G9kBitBustXY:
  1363.                 LD      HL,CopyRamToXY 
  1364.                 JR      G9kBitBust
  1365.                        
  1366. G9kBitBustLinear:
  1367.                 LD      HL,CopyRamToVram
  1368.                
  1369. G9kBitBust:            
  1370.                 LD      (.copyFunction+1),HL
  1371.                
  1372.                 PUSH    DE
  1373.                 LD      B,(IX + G9B_OBJECT.fileHandle) ; Get file handle
  1374.                 LD      DE,.BLOCKS
  1375.                 LD      HL,1
  1376.                 CALL    File.FileRead
  1377.                 POP     DE
  1378.                 RET     NZ      ; Read error           
  1379. .loop          
  1380.                 PUSH    DE
  1381.                 LD      DE,.BLOCK_SIZE
  1382.                 LD      HL,2
  1383.                 CALL    File.FileRead
  1384.                 POP     DE      ; pointer to buffer
  1385.                 RET     NZ      ; Read error
  1386.                
  1387.                 PUSH    DE      ; pointer to buffer
  1388.                 LD      HL,(.BLOCK_SIZE)
  1389.                 CALL    File.FileRead  
  1390.                 POP     DE      ; pointer to buffer
  1391.                 RET     NZ      ; Read error
  1392.                                
  1393.                 PUSH    BC
  1394.                 LD      HL,(.BLOCK_SIZE) ; bytes
  1395.                 ADD     HL,DE    ; Calculate Address to depack to
  1396.                 PUSH    DE       ; pointer to buffer
  1397.                
  1398.                 PUSH    HL       ; Pointer to decompress to    
  1399.                 EX      DE,HL    ; HL =  Address of packed data
  1400.                 CALL    bitbuster.depack_raw
  1401.                 ; DE = Address of first byte after decompressed data
  1402.                 POP     HL       ; Pointer to decompressed data
  1403.                                
  1404.                 PUSH    HL
  1405.                 EX      DE,HL
  1406.                 OR      A,A            
  1407.                 SBC     HL,DE    ; Calculate bytes to send to the vdp
  1408.                 LD      BC,HL    ; Bytes to send
  1409.                 POP     HL       ; Pointer to decompressed data
  1410.                
  1411. .copyFunction   CALL    CopyRamToVram
  1412.                 POP     DE       ; pointer to buffer
  1413.                 POP     BC
  1414.                
  1415.                 LD      A,(.BLOCKS)
  1416.                 DEC     A
  1417.                 LD      (.BLOCKS),A
  1418.                 JP      NZ,.loop
  1419.                 RET
  1420.        
  1421.                
  1422. .BLOCKS         DB      0
  1423. .BLOCK_SIZE     DW      0
  1424.  
  1425.                 ENDIF
  1426.  
  1427.                 ENDIF
  1428.  
  1429. Close:
  1430. ; HL = Pointer to G9B/VFF header object
  1431. ; Modifies: B
  1432.                 LD      B,(IX)
  1433.                 PUSH    IX
  1434.                 CALL    File.FileClose
  1435.                 POP     IX
  1436.                 LD      (IX),0 ; clear handle
  1437.                 RET
  1438.                
  1439. ;----------------------------------------------------------------------------;
  1440. ; Gfx9000 Mouse cursor functions                                             ;
  1441. ;----------------------------------------------------------------------------;
  1442.  
  1443.                 IFNDEF G9K_DISABLE_CURSOR
  1444.  
  1445. SetCursorXY:
  1446. ; Both cursors are set at the same,because the data is 1 bit. So both cursors
  1447. ; are needed to make a good cursor.
  1448. ; input    : HL=X
  1449. ;          : DE=Y
  1450. ; Modifies : A,C
  1451.  
  1452.                 ; Set V9990 address = #7FE00
  1453.                 XOR     A,A
  1454.                 OUT     (G9K_REG_SELECT),A
  1455.                 OUT     (G9K_REG_DATA),A
  1456.                 LD      A,0FEh
  1457.                 OUT     (G9K_REG_DATA),A
  1458.                 LD      A,7
  1459.                 OUT     (G9K_REG_DATA),A
  1460.                
  1461.                 ; "First" cursor
  1462.                 LD      C,G9K_VRAM
  1463.                 OUT     (C),E        ; Y cordinate low byte
  1464.                 OUT     (C),E        ; Dummy                   
  1465.                 OUT     (C),D        ; Y cordinate high byte
  1466.                 OUT     (C),D        ; Dummy
  1467.                
  1468.                 OUT     (C),L        ; X cordinate low byte
  1469.                 OUT     (C),L        ; Dummy
  1470.                 LD      A,(CURSOR0_ATTRIB)
  1471.                 OR      A,H          ; Set color atributes
  1472.                 OUT     (G9K_VRAM),A ; X cordinate High byte and color
  1473.                 OUT     (G9K_VRAM),A ; Dummy   
  1474.                      
  1475.                 ; "Second" cursor
  1476.                 OUT     (C),E        ; Y cordinate low byte
  1477.                 OUT     (C),E        ; Dummy
  1478.                 OUT     (C),D        ; Y cordinate high byte
  1479.                 OUT     (C),D        ; Dummy
  1480.                 OUT     (C),L        ; X cordinate low byte
  1481.                 OUT     (C),L        ; Dummy
  1482.                 LD      A,(CURSOR1_ATTRIB)
  1483.                 OR      A,H
  1484.                 OUT     (G9K_VRAM),A ; X cordinate High byte and color
  1485.                 RET
  1486.  
  1487. SetCursorPattern:
  1488.                
  1489.  
  1490.                 RET
  1491.  
  1492. SetCursorAttrib:
  1493. ; Input A = Cursor Number ( 0 or 1)            
  1494.                 LD      HL,CURSOR0_ATTRIB
  1495.                 OR      A,A
  1496.                 JR      Z,$+3
  1497.                  INC    HL
  1498.                 LD      (HL),A
  1499.                 RET
  1500.                
  1501. CURSOR0_ATTRIB   DB     0
  1502. CURSOR1_ATTRIB   DB     0
  1503.  
  1504.                 ENDIF
  1505.  
  1506. ;----------------------------------------------------------------------------;
  1507. ; Gfx9000 Pattern mode functions                                             ;
  1508. ;----------------------------------------------------------------------------;
  1509.  
  1510.                 IFNDEF G9K_DISABLE_PATTERN
  1511. SetPatternData:
  1512. ; DE = Ptr to pattern data
  1513. ; HL = Pattern number
  1514. ;  A = Layer number (0=A,1=B)
  1515. ; Modifies: A,BC,HL
  1516.                 PUSH    DE
  1517.                 ADD     A,A
  1518.                 LD      (PAT.LAYER_SEL_SC),A
  1519.                 LD      (PAT.LAYER_SEL_DS),A           
  1520.                 ADD     HL,HL
  1521.                 ADD     HL,HL
  1522.                 ADD     HL,HL
  1523.                 LD      A,L
  1524.                 LD      (PAT.X),A
  1525.                 LD      A,H
  1526.                 ADD     A,A
  1527.                 ADD     A,A
  1528.                 ADD     A,A
  1529.                 LD      (PAT.Y),A
  1530.                 LD      HL,PAT.X               
  1531.                 CALL    SetupCopyRamToXY
  1532.                 POP     HL
  1533.                 LD      BC,8*8
  1534.                 JP      CopyRamToXY
  1535.                  
  1536.                  
  1537.  
  1538. GetPatternData:
  1539. ; DE = Ptr to buffer to write pattern data in
  1540. ; HL = Pattern number
  1541. ;  A = Layer number (0=A,1=B)
  1542. ; Modifies: A,BC,HL
  1543.                 PUSH    DE
  1544.                 ADD     A,A
  1545.                 LD      (PAT.LAYER_SEL_SC),A
  1546.                 LD      (PAT.LAYER_SEL_DS),A           
  1547.                 ADD     HL,HL
  1548.                 ADD     HL,HL
  1549.                 ADD     HL,HL
  1550.                 LD      A,L
  1551.                 LD      (PAT.X),A
  1552.                 LD      A,H
  1553.                 ADD     A,A
  1554.                 ADD     A,A
  1555.                 ADD     A,A
  1556.                 LD      (PAT.Y),A
  1557.                 LD      HL,PAT.X               
  1558.                 CALL    SetupCopyXYToRam
  1559.                 POP     HL
  1560.                 LD      BC,8*8
  1561.                 JP      CopyXYToRam
  1562.                  
  1563.                  
  1564. PAT.X                   DB      0
  1565. PAT.LAYER_SEL_SC        DB      0
  1566. PAT.Y                   DB      0,0
  1567. PAT.WIDTH               DB      8
  1568. PAT.LAYER_SEL_DS        DB      0
  1569. PAT.HEIGHT              DB      8,0
  1570.        
  1571. SetPattern:
  1572. ; HL = Pattern number in generator table (on screen patterns 0 to A=8159,B=7679)
  1573. ; DE = Pattern number in name table (on screen patterns 0 to 4095)
  1574. ;  A = Layer number (0=A,1=B)                  
  1575.                 PUSH    DE
  1576.                 ADD     HL,HL
  1577.                 LD      DE,0C000h
  1578.                 OR      A,A
  1579.                 JR      Z,$+5
  1580.                   LD      DE,0E000h
  1581.                 ADD     HL,DE
  1582.                 LD      E,7            
  1583.                 CALL    SetVramWrite
  1584.                 POP     DE
  1585.                 LD      A,E
  1586.                 OUT     (G9K_VRAM),A
  1587.                 LD      A,D
  1588.                 OUT     (G9K_VRAM),A
  1589.                 RET    
  1590.                
  1591. GetPattern:
  1592. ; Input  DE = Pattern number in name table (on screen patterns 0 to 4095)
  1593. ; Output HL = Pattern number in generator table (on screen patterns 0 to A=8159,B=7679)
  1594. ;  A = Layer number (0=A,1=B)          
  1595.                 PUSH    DE
  1596.                 ADD     HL,HL
  1597.                 LD      DE,0C000h
  1598.                 OR      A,A
  1599.                 JR      Z,$+5
  1600.                   LD      DE,0E000h
  1601.                 ADD     HL,DE
  1602.                 LD      E,7            
  1603.                 CALL    SetVramRead
  1604.                 POP     DE
  1605.                 IN      A,(G9K_VRAM)
  1606.                 LD      L,A
  1607.                 IN      A,(G9K_VRAM)
  1608.                 LD      H,A
  1609.                 RET        
  1610.                
  1611. PCopyVramToVram:
  1612. ; NOTE: Not finished yet
  1613. ; HL = Pointer to data  (format: SrcAddress,DestAddress,NrBytes)
  1614. ; Modifies AF,HL,BC
  1615.                 LD      A,G9K_SC_X
  1616.                 OUT     (G9K_REG_SELECT),A
  1617.                 LD      C,G9K_REG_DATA
  1618.                 G9kCmdWait
  1619.                 ; DestAddress address <40000h layer A
  1620.                 ; DestAddress address >40000h layer B
  1621.                 ; Addresses need to be shifted to the left
  1622.                 LD      A,(HL)             
  1623.                 INC     HL
  1624.                 ADD     A,A
  1625.                 OUT     (G9K_REG_DATA),A     ; Source low      
  1626.                 OUT     (G9K_REG_DATA),A     ; dummy write
  1627.                 LD      A,(HL)
  1628.                 INC     HL
  1629.                 RLA    
  1630.                 OUT     (G9K_REG_DATA),A     ; Source mid              
  1631.                 LD      A,(HL)
  1632.                 INC     HL
  1633.                 RLA                    
  1634.                 OUT     (G9K_REG_DATA),A     ; Source high                                         
  1635.  
  1636.  
  1637.                
  1638.                 ;OUTI                       ; Destination Low
  1639.                 ;OUT     (G9K_REG_DATA),A    ; dummy write
  1640.                 ;OUTI                       ; Destination mid
  1641.                 ;OUTI                       ; Destination High
  1642.                                
  1643.                 ;OUTI                       ; Number of bytes Low
  1644.                 ;OUT     (G9K_REG_DATA),A    ; dummy write
  1645.                 ;OUTI                       ; Number of bytes mid
  1646.                 ;OUTI                       ; Number of bytes High
  1647.  
  1648.                 G9kWriteReg G9K_OPCODE,G9K_OPCODE_BMLL
  1649.                
  1650.                 RET            
  1651.  
  1652.  
  1653. PCopyVramToVramARegister:
  1654. ; NOTE: Not finished yet
  1655. ; Function: Copy vram to vram where destination is in layer A
  1656. ; address value 00000h to 7FFFFh
  1657.  
  1658. ; IYL:HL = start address
  1659. ; IYH:DE = destination address
  1660. ; IXL:BC = nr of bytes
  1661.                 LD      A,G9K_SC_X
  1662.                 OUT     (G9K_REG_SELECT),A
  1663.                
  1664.                 ; Prepare the addresses
  1665.                
  1666.        
  1667.        
  1668.                 G9kCmdWait
  1669.        
  1670.                  
  1671.        
  1672.        
  1673.                  
  1674.                                    
  1675.                 ENDIF
  1676.  
  1677.  
  1678. ;----------------------------------------------------------------------------;
  1679. ; Gfx9000 Pattern mode sprite functions                                      ;
  1680. ;----------------------------------------------------------------------------;
  1681.  
  1682.                 IFNDEF G9K_DISABLE_SPRITES
  1683. SetSprite:
  1684. ; B = Sprite Number (0 to 124)
  1685.                 ; Set V9990 address = base 03FE00h + sprite number*4
  1686.                 XOR     A,A
  1687.                 OUT     (G9K_REG_SELECT),A
  1688.                 LD      A,B
  1689.                 LD      B,0
  1690.                 ADD     A,A
  1691.                 ADD     A,A
  1692.                 OUT     (G9K_REG_DATA),A  ; Low address
  1693.                 RL      B
  1694.                 LD      A,0FEh
  1695.                 ADD     A,B              
  1696.                 OUT     (G9K_REG_DATA),A  ; Mid
  1697.                 LD      A,03h
  1698.                 OUT     (G9K_REG_DATA),A  ; High
  1699.                 RET
  1700.                      
  1701.                
  1702.                 ENDIF
  1703.                
  1704. ;----------------------------------------------------------------------------;
  1705. ; Gfx9000 Interrupt functions                                                ;
  1706. ;----------------------------------------------------------------------------;
  1707.        
  1708. SetIntLine:            
  1709. ; HL = int line
  1710.                 G9kWriteReg G9K_INT_V_LINE_LO,L
  1711.                 LD      A,H
  1712.                 OUT     (G9K_REG_DATA),A
  1713.                 RET
  1714.                
  1715.                 ENDMODULE
  1716.